diff --git a/docs/uml/app/lib/screens/study/report/uml.svg b/docs/uml/app/lib/screens/study/report/uml.svg index af2c76816..2ee1e5358 100644 --- a/docs/uml/app/lib/screens/study/report/uml.svg +++ b/docs/uml/app/lib/screens/study/report/uml.svg @@ -1,22 +1,5 @@ - - [DisclaimerSection - | - +Widget buildContent() - ] - - [<abstract>GenericSection]<:-[DisclaimerSection] - - [ReportDetailsScreen - | - +subject: StudySubject - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() - ] - - [ReportDetailsScreen]o-[StudySubject] - - [LinearRegressionSectionWidget + + [LinearRegressionSectionWidget | +section: LinearRegressionSection | @@ -53,19 +36,15 @@ +intervention: String ] - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem + [ReportDetailsScreen | +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportHistoryItem]o-[StudySubject] + [ReportDetailsScreen]o-[StudySubject] [<abstract>GenericSection | @@ -86,30 +65,26 @@ [<abstract>GenericSection]<:-[GeneralDetailsSection] - [<abstract>ReportSectionWidget + [PerformanceSection | - +subject: StudySubject + +minimumRatio: double; + +maximum: double + | + +Widget buildContent(); + +String getPowerLevelDescription(); + +int getCountableObservationAmount() ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [<abstract>GenericSection]<:-[PerformanceSection] - [ReportSectionContainer + [PerformanceBar | - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? + +progress: double; + +minimum: double? | - +ReportSectionWidget buildContents(); - +List<Widget> buildPrimaryHeader(); +Widget build() ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - [PerformanceDetailsScreen | +reportSubject: StudySubject? @@ -153,209 +128,152 @@ [PerformanceBar]o-[<abstract>Task] - [PerformanceSection + [ReportHistoryScreen | - +minimumRatio: double; - +maximum: double + +Widget build() + ] + + [ReportHistoryItem | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() + +subject: StudySubject + | + +Widget build() ] - [<abstract>GenericSection]<:-[PerformanceSection] + [ReportHistoryItem]o-[StudySubject] - [PerformanceBar + [<abstract>ReportSectionWidget | - +progress: double; - +minimum: double? + +subject: StudySubject + ] + + [<abstract>ReportSectionWidget]o-[StudySubject] + + [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() ] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] + + [DisclaimerSection + | + +Widget buildContent() + ] + + [<abstract>GenericSection]<:-[DisclaimerSection] + - + - - - + - + - + + + - + - - - + + + - + - - - + - + - + - + - + + + + + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - DisclaimerSection - - - - - - +Widget buildContent() - - - - - - - - - - - - - GenericSection - - - - - - +subject: StudySubject? - +onTap: void Function()? - - - - - - +Widget buildContent() - +Widget build() - - - - - - - - - - - - - ReportDetailsScreen - - - - - - +subject: StudySubject - - - - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() - - - - - - - - - - - StudySubject - - - + + + - - - + + + - + LinearRegressionSectionWidget - + +section: LinearRegressionSection - + +Widget build() @@ -364,9 +282,9 @@ - + - + LinearRegressionSection @@ -375,16 +293,16 @@ - - + + - + ReportSectionWidget - + +subject: StudySubject @@ -393,17 +311,17 @@ - - - + + + - + AverageSectionWidget - + +section: AverageSection +titlePos: List<int> @@ -411,7 +329,7 @@ - + +Widget build() +Widget getDiagram() @@ -427,9 +345,9 @@ - + - + AverageSection @@ -438,16 +356,16 @@ - - + + - + DiagramDatum - + +x: num +value: num @@ -457,54 +375,75 @@ - - - - + + + + + - - - ReportHistoryScreen + + + ReportDetailsScreen - - - +Widget build() + + + +subject: StudySubject + + + + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - - + + + - - - ReportHistoryItem + + + StudySubject - - - +subject: StudySubject + + + + + + + + + + GenericSection - - - +Widget build() + + + +subject: StudySubject? + +onTap: void Function()? + + + + + + +Widget buildContent() + +Widget build() - + - + void Function()? @@ -513,83 +452,95 @@ - - + + - + GeneralDetailsSection - + +Widget buildContent() - - - - - + + + + + - - - ReportSectionContainer + + + PerformanceSection - - - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + +minimumRatio: double + +maximum: double - - - +ReportSectionWidget buildContents() - +List<Widget> buildPrimaryHeader() - +Widget build() + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - + + + + + - - - ReportSection + + + PerformanceBar + + + + + + +progress: double + +minimum: double? + + + + + + +Widget build() - - - + + + - + PerformanceDetailsScreen - + +reportSubject: StudySubject? - + <static>+MaterialPageRoute<dynamic> routeFor() +Widget build() @@ -599,24 +550,24 @@ - - - + + + - + InterventionPerformanceBar - + +intervention: Intervention +subject: StudySubject? - + +Widget build() @@ -625,9 +576,9 @@ - + - + Intervention @@ -636,24 +587,24 @@ - - - + + + - + ObservationPerformanceBar - + +observation: Observation +subject: StudySubject? - + +Widget build() @@ -662,77 +613,125 @@ - + - + Observation - - - - - + + + - - - PerformanceBar + + + Task - - - +task: Task - +completed: int - +total: int + + + + + + + + + ReportHistoryScreen - - - +Widget build() + + + +Widget build() - - - + + + + + - - - Task + + + ReportHistoryItem + + + + + + +subject: StudySubject + + + + + + +Widget build() - - - - - + + + + + - - - PerformanceSection + + + ReportSectionContainer - - - +minimumRatio: double - +maximum: double + + + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +ReportSectionWidget buildContents() + +List<Widget> buildPrimaryHeader() + +Widget build() + + + + + + + + + + + ReportSection + + + + + + + + + + + + DisclaimerSection + + + + + + +Widget buildContent() diff --git a/docs/uml/app/lib/screens/study/uml.svg b/docs/uml/app/lib/screens/study/uml.svg index 06e804733..95019b4c5 100644 --- a/docs/uml/app/lib/screens/study/uml.svg +++ b/docs/uml/app/lib/screens/study/uml.svg @@ -1,20 +1,156 @@ - - [DisclaimerSection + + [DashboardScreen | - +Widget buildContent() + +error: String? ] - [<abstract>GenericSection]<:-[DisclaimerSection] + [OverflowMenuItem + | + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? + ] - [ReportDetailsScreen + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] + + [StudyFinishedPlaceholder | - +subject: StudySubject + <static>+space: SizedBox | - <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] + [StudyFinishedPlaceholder]o-[SizedBox] + + [TaskBox + | + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() + ] + + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] + + [ProgressRow + | + +subject: StudySubject? + ] + + [ProgressRow]o-[StudySubject] + + [InterventionSegment + | + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int + | + +List<Widget> buildSeparators(); + +Widget build() + ] + + [InterventionSegment]o-[Intervention] + + [TaskOverview + | + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? + ] + + [TaskOverview]o-[StudySubject] + + [Settings + ] + + [OptOutAlertDialog + | + +subject: StudySubject? + | + +Widget build() + ] + + [OptOutAlertDialog]o-[StudySubject] + + [DeleteAlertDialog + | + +subject: StudySubject? + | + +Widget build() + ] + + [DeleteAlertDialog]o-[StudySubject] + + [FAQ + | + +Widget build() + ] + + [Entry + | + +title: String; + +children: List<Entry> + ] + + [EntryItem + | + +entry: Entry + | + -Widget _buildTiles(); + +Widget build() + ] + + [EntryItem]o-[Entry] + + [ContactScreen + ] + + [ContactWidget + | + +contact: Contact?; + +title: String; + +subtitle: String?; + +color: Color + | + +Widget build() + ] + + [ContactWidget]o-[Contact] + [ContactWidget]o-[Color] + + [ContactItem + | + +iconData: IconData; + +itemName: String; + +itemValue: String?; + +type: ContactItemType?; + +iconColor: Color? + | + +dynamic launchContact(); + +Widget build() + ] + + [ContactItem]o-[IconData] + [ContactItem]o-[ContactItemType] + [ContactItem]o-[Color] + + [ContactItemType + | + +index: int; + <static>+values: List<ContactItemType>; + <static>+website: ContactItemType; + <static>+email: ContactItemType; + <static>+phone: ContactItemType + ] + + [ContactItemType]o-[ContactItemType] + [Enum]<:--[ContactItemType] [LinearRegressionSectionWidget | @@ -53,19 +189,15 @@ +intervention: String ] - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem + [ReportDetailsScreen | +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportHistoryItem]o-[StudySubject] + [ReportDetailsScreen]o-[StudySubject] [<abstract>GenericSection | @@ -86,30 +218,26 @@ [<abstract>GenericSection]<:-[GeneralDetailsSection] - [<abstract>ReportSectionWidget + [PerformanceSection | - +subject: StudySubject + +minimumRatio: double; + +maximum: double + | + +Widget buildContent(); + +String getPowerLevelDescription(); + +int getCountableObservationAmount() ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [<abstract>GenericSection]<:-[PerformanceSection] - [ReportSectionContainer + [PerformanceBar | - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? + +progress: double; + +minimum: double? | - +ReportSectionWidget buildContents(); - +List<Widget> buildPrimaryHeader(); +Widget build() ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - [PerformanceDetailsScreen | +reportSubject: StudySubject? @@ -153,43 +281,50 @@ [PerformanceBar]o-[<abstract>Task] - [PerformanceSection - | - +minimumRatio: double; - +maximum: double + [ReportHistoryScreen | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() + +Widget build() ] - [<abstract>GenericSection]<:-[PerformanceSection] - - [PerformanceBar + [ReportHistoryItem | - +progress: double; - +minimum: double? + +subject: StudySubject | +Widget build() ] - [TaskScreen + [ReportHistoryItem]o-[StudySubject] + + [<abstract>ReportSectionWidget | - +taskInstance: TaskInstance + +subject: StudySubject + ] + + [<abstract>ReportSectionWidget]o-[StudySubject] + + [ReportSectionContainer | - <static>+MaterialPageRoute<bool> routeFor() + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; + +section: ReportSection; + +subject: StudySubject; + +primary: bool; + +onTap: void Function()? + | + +ReportSectionWidget buildContents(); + +List<Widget> buildPrimaryHeader(); + +Widget build() ] - [TaskScreen]o-[TaskInstance] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] - [QuestionnaireTaskWidget + [DisclaimerSection | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod + +Widget buildContent() ] - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] + [<abstract>GenericSection]<:-[DisclaimerSection] [CheckmarkTaskWidget | @@ -200,40 +335,23 @@ [CheckmarkTaskWidget]o-[CheckmarkTask] [CheckmarkTaskWidget]o-[CompletionPeriod] - [StudyOverviewScreen - ] - - [_StudyOverviewScreen + [TaskScreen | - +study: Study? + +taskInstance: TaskInstance | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() + <static>+MaterialPageRoute<bool> routeFor() ] - [_StudyOverviewScreen]o-[Study] + [TaskScreen]o-[TaskInstance] - [StudyDetailsView - | - +study: Study?; - +iconSize: double + [QuestionnaireTaskWidget | - +Widget build() + +task: QuestionnaireTask; + +completionPeriod: CompletionPeriod ] - [StudyDetailsView]o-[Study] - - [StudySelectionScreen - | - +Widget build() - ] - - [InviteCodeDialog - ] - - [InterventionSelectionScreen - ] + [QuestionnaireTaskWidget]o-[QuestionnaireTask] + [QuestionnaireTaskWidget]o-[CompletionPeriod] [KickoffScreen ] @@ -251,6 +369,23 @@ [_KickoffScreen]o-[StudySubject] + [EligibilityResult + | + +eligible: bool; + +firstFailed: EligibilityCriterion? + ] + + [EligibilityResult]o-[EligibilityCriterion] + + [EligibilityScreen + | + +study: Study? + | + <static>+MaterialPageRoute<EligibilityResult> routeFor() + ] + + [EligibilityScreen]o-[Study] + [JourneyOverviewScreen ] @@ -306,6 +441,15 @@ [TimelineChild]o-[<abstract>Widget] + [OnboardingProgress + | + +stage: int; + +progress: double + | + -double _getProgressForStage(); + +Widget build() + ] + [ConsentScreen ] @@ -332,1429 +476,1367 @@ [ConsentElement]o-[IconData] - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [OnboardingProgress - | - +stage: int; - +progress: double - | - -double _getProgressForStage(); - +Widget build() - ] - - [TaskOverview - | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? - ] - - [TaskOverview]o-[StudySubject] - - [ProgressRow - | - +subject: StudySubject? - ] - - [ProgressRow]o-[StudySubject] - - [InterventionSegment - | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int - | - +List<Widget> buildSeparators(); - +Widget build() - ] - - [InterventionSegment]o-[Intervention] - - [TaskBox - | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() - ] - - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] - - [Settings - ] - - [OptOutAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [OptOutAlertDialog]o-[StudySubject] - - [DeleteAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [DeleteAlertDialog]o-[StudySubject] - - [ContactScreen + [InterventionSelectionScreen ] - [ContactWidget - | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color - | - +Widget build() + [StudyOverviewScreen ] - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] - - [ContactItem + [_StudyOverviewScreen | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? + +study: Study? | - +dynamic launchContact(); + +dynamic navigateToJourney(); + +dynamic navigateToEligibilityCheck(); +Widget build() ] - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] + [_StudyOverviewScreen]o-[Study] - [ContactItemType + [StudyDetailsView | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType - ] - - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] - - [FAQ + +study: Study?; + +iconSize: double | +Widget build() ] - [Entry - | - +title: String; - +children: List<Entry> - ] + [StudyDetailsView]o-[Study] - [EntryItem - | - +entry: Entry + [StudySelectionScreen | - -Widget _buildTiles(); +Widget build() ] - [EntryItem]o-[Entry] - - [DashboardScreen - | - +error: String? - ] - - [OverflowMenuItem - | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? - ] - - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] - - [StudyFinishedPlaceholder - | - <static>+space: SizedBox - | - +Widget build() + [InviteCodeDialog ] - [StudyFinishedPlaceholder]o-[SizedBox] - - + - - - + - + - + - + - - - + - + - - - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - - - + + - + + - + - + + + - + - + + + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - - - - + + + + - - - DisclaimerSection + + + DashboardScreen - - - +Widget buildContent() + + + +error: String? - - - - - + + + + - - - GenericSection + + + OverflowMenuItem - - - +subject: StudySubject? - +onTap: void Function()? + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - +Widget buildContent() - +Widget build() + + + + + + + + IconData - - - - - + + + - - - ReportDetailsScreen + + + dynamic Function()? - - - +subject: StudySubject + + + + + + + + + + StudyFinishedPlaceholder - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + <static>+space: SizedBox + + + + + + +Widget build() - - - + + + - - - StudySubject + + + SizedBox - - - - - + + + + - - - LinearRegressionSectionWidget + + + TaskBox - - - +section: LinearRegressionSection + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - +Widget build() + + + + + + + + TaskInstance - - - + + + - - - LinearRegressionSection + + + Icon - - - - + + + - - - ReportSectionWidget + + + dynamic Function() - - - +subject: StudySubject + + + + + + + + + ProgressRow + + + + + + +subject: StudySubject? - - - - - + + + - - - AverageSectionWidget + + + StudySubject - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + + + + + + + + InterventionSegment - - - +Widget build() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +MaterialColor getColor() - +Iterable<DiagramDatum> getAggregatedData() + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int + + + + + + +List<Widget> buildSeparators() + +Widget build() - - - + + + - - - AverageSection + + + Intervention - - - - + + + + - - - DiagramDatum + + + TaskOverview - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - - + + + - - - ReportHistoryScreen + + + Settings - - - +Widget build() + + + + + + + + + + OptOutAlertDialog + + + + + + +subject: StudySubject? + + + + + + +Widget build() - - - - - + + + + + - - - ReportHistoryItem + + + DeleteAlertDialog - - - +subject: StudySubject + + + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - + + + + - - - void Function()? + + + FAQ + + + + + + +Widget build() - - - - + + + + - - - GeneralDetailsSection + + + Entry - - - +Widget buildContent() + + + +title: String + +children: List<Entry> - - - - - + + + + + - - - ReportSectionContainer + + + EntryItem - - - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + +entry: Entry - - - +ReportSectionWidget buildContents() - +List<Widget> buildPrimaryHeader() - +Widget build() + + + -Widget _buildTiles() + +Widget build() - - - + + + - - - ReportSection + + + ContactScreen - - - - - + + + + + - - - PerformanceDetailsScreen + + + ContactWidget - - - +reportSubject: StudySubject? + + + +contact: Contact? + +title: String + +subtitle: String? + +color: Color - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + +Widget build() - - - - - + + + - - - InterventionPerformanceBar + + + Contact - - - +intervention: Intervention - +subject: StudySubject? - - + + + + - - - +Widget build() + + + Color - - - + + + + + - - - Intervention + + + ContactItem - - - - - - + + + +iconData: IconData + +itemName: String + +itemValue: String? + +type: ContactItemType? + +iconColor: Color? + + - - - ObservationPerformanceBar + + + +dynamic launchContact() + +Widget build() - - - +observation: Observation - +subject: StudySubject? + + + + + + + + + ContactItemType - - - +Widget build() + + + +index: int + <static>+values: List<ContactItemType> + <static>+website: ContactItemType + <static>+email: ContactItemType + <static>+phone: ContactItemType - - - + + + - - - Observation + + + Enum - - - - - + + + + + - - - PerformanceBar + + + LinearRegressionSectionWidget - - - +task: Task - +completed: int - +total: int + + + +section: LinearRegressionSection - - - +Widget build() + + + +Widget build() - - - + + + - - - Task + + + LinearRegressionSection - - - - - - - - - PerformanceSection - - + + + + - - - +minimumRatio: double - +maximum: double + + + ReportSectionWidget - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +subject: StudySubject - - - - - - + + + + + + - - - TaskScreen + + + AverageSectionWidget - - - +taskInstance: TaskInstance + + + +section: AverageSection + +titlePos: List<int> + +phasePos: List<int> - - - <static>+MaterialPageRoute<bool> routeFor() + + + +Widget build() + +Widget getDiagram() + +BarChartData getChartData() + +Widget getTitles() + +Widget getValues() + +List<BarChartGroupData> getBarGroups() + +MaterialColor getColor() + +Iterable<DiagramDatum> getAggregatedData() - - - + + + - - - TaskInstance + + + AverageSection - - - - + + + + - - - QuestionnaireTaskWidget + + + DiagramDatum - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String - - - + + + + + - - - QuestionnaireTask + + + ReportDetailsScreen - - - - + + + +subject: StudySubject + + - - - CompletionPeriod + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - + + + + + - - - CheckmarkTaskWidget + + + GenericSection - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + +subject: StudySubject? + +onTap: void Function()? - - - - - - - - CheckmarkTask + + + +Widget buildContent() + +Widget build() - - - + + + - - - StudyOverviewScreen + + + void Function()? - - - - - + + + + - - - _StudyOverviewScreen + + + GeneralDetailsSection - - - +study: Study? + + + +Widget buildContent() - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + + + + + + + + PerformanceSection - - - - + + + +minimumRatio: double + +maximum: double + + - - - Study + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - - - + + + + + - - - StudyDetailsView + + + PerformanceBar - - - +study: Study? - +iconSize: double + + + +progress: double + +minimum: double? - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudySelectionScreen + + + PerformanceDetailsScreen - - - +Widget build() + + + +reportSubject: StudySubject? - - - - - - - - InviteCodeDialog + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - + + + + + - - - InterventionSelectionScreen + + + InterventionPerformanceBar - - - - + + + +intervention: Intervention + +subject: StudySubject? + + - - - KickoffScreen + + + +Widget build() - - - - - + + + + + - - - _KickoffScreen + + + ObservationPerformanceBar - - - +subject: StudySubject? - +ready: bool + + + +observation: Observation + +subject: StudySubject? - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() + + + +Widget build() - - - + + + - - - JourneyOverviewScreen + + + Observation - - - - - + + + - - - _JourneyOverviewScreen + + + Task - - - +subject: StudySubject? + + + + + + + + + ReportHistoryScreen - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() + + + +Widget build() - - - - - + + + + + - - - Timeline + + + ReportHistoryItem - - - +subject: StudySubject? + + + +subject: StudySubject - - - - +Widget build() + + + + +Widget build() - - - - - + + + + + - - - InterventionTile + + + ReportSectionContainer - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool + + + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? - - - +Widget build() + + + +ReportSectionWidget buildContents() + +List<Widget> buildPrimaryHeader() + +Widget build() - - - + + + - - - Color + + + ReportSection - - - - - - - - - IconIndicator - - + + + + - - - +iconName: String - +color: Color? + + + DisclaimerSection - - - +Widget build() + + + +Widget buildContent() - - - - - + + + + - - - TimelineChild + + + CheckmarkTaskWidget - - - +child: Widget? + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - +Widget build() + + + + + + + + CheckmarkTask - - - + + + - - - Widget + + + CompletionPeriod - - - + + + + + - - - ConsentScreen + + + TaskScreen - - - - - - + + + +taskInstance: TaskInstance + + - - - ConsentCard + + + <static>+MaterialPageRoute<bool> routeFor() - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? + + + + + + + + + QuestionnaireTaskWidget - - - +Widget build() + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - + + + - - - ConsentItem + + + QuestionnaireTask - - - + + + - - - dynamic Function(int) + + + KickoffScreen - - - - + + + + + - - - ConsentElement + + + _KickoffScreen - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData + + + +subject: StudySubject? + +ready: bool - - - - - - - - IconData + + + -dynamic _storeUserStudy() + -Widget _constructStatusIcon() + -String _getStatusText() + +Widget build() - - + + - + EligibilityResult - + +eligible: bool +firstFailed: EligibilityCriterion? @@ -1764,9 +1846,9 @@ - + - + EligibilityCriterion @@ -1775,486 +1857,403 @@ - - - + + + - + EligibilityScreen - + +study: Study? - + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - - - - - OnboardingProgress - - - - - - +stage: int - +progress: double - - - - - - -double _getProgressForStage() - +Widget build() - - - - - - - - - - - - TaskOverview - - + + + - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + Study - - - - - - - - ProgressRow - - + + + - - - +subject: StudySubject? + + + JourneyOverviewScreen - - - - - + + + + + - - - InterventionSegment + + + _JourneyOverviewScreen - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int + + + +subject: StudySubject? - - - +List<Widget> buildSeparators() - +Widget build() + + + +dynamic getConsentAndNavigateToDashboard() + +Widget build() - - - - + + + + + - - - TaskBox + + + Timeline - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + +subject: StudySubject? - - - - - - - - Icon + + + +Widget build() - - - + + + + + - - - dynamic Function() + + + 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() - - - + + + - - - ContactScreen + + + Widget - - - - - + + + + + - - - ContactWidget + + + OnboardingProgress - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color + + + +stage: int + +progress: double - - - +Widget build() + + + -double _getProgressForStage() + +Widget build() - - - + + + - - - Contact + + + ConsentScreen - - - - - + + + + + - - - ContactItem + + + ConsentCard - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? + + + +consent: ConsentItem? + +index: int? + +onTapped: dynamic Function(int) + +isChecked: bool? - - - +dynamic launchContact() - +Widget build() + + + +Widget build() - - - - - - - - ContactItemType - - + + + - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType + + + ConsentItem - - - + + + - - - Enum + + + dynamic Function(int) - - - - + + + + - - - FAQ + + + ConsentElement - - - +Widget build() + + + +title: String + +descriptionText: String + +acknowledgmentText: String + +icon: IconData - - - - - - - - Entry - - + + + - - - +title: String - +children: List<Entry> + + + InterventionSelectionScreen - - - - - + + + - - - EntryItem + + + StudyOverviewScreen - - - +entry: Entry - - + + + + + + - - - -Widget _buildTiles() - +Widget build() + + + _StudyOverviewScreen - - - - - - - - - DashboardScreen + + + +study: Study? - - - +error: String? + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() - - - - + + + + + - - - OverflowMenuItem + + + StudyDetailsView - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +study: Study? + +iconSize: double - - - - - - - - dynamic Function()? + + + +Widget build() - - - - - - - - - StudyFinishedPlaceholder - - + + + + - - - <static>+space: SizedBox + + + StudySelectionScreen - - - +Widget build() + + + +Widget build() - - - + + + - - - SizedBox + + + InviteCodeDialog diff --git a/docs/uml/app/lib/screens/uml.svg b/docs/uml/app/lib/screens/uml.svg index 86ba73797..36f78b9e2 100644 --- a/docs/uml/app/lib/screens/uml.svg +++ b/docs/uml/app/lib/screens/uml.svg @@ -1,5 +1,10 @@ - - [Preview + + [AboutScreen + | + +Widget build() + ] + + [Preview | +queryParameters: Map<String, String>?; +appLanguage: AppLanguage; @@ -26,9 +31,10 @@ [Preview]o-[Study] [Preview]o-[StudySubject] - [WelcomeScreen + [IFrameHelper | - +Widget build() + +void postRouteFinished(); + +void listen() ] [TermsScreen @@ -51,39 +57,169 @@ [LegalSection]o-[Icon] [LegalSection]o-[void Function(bool?)?] - [IFrameHelper + [LoadingScreen | - +void postRouteFinished(); - +void listen() + +sessionString: String?; + +queryParameters: Map<String, String>? ] - [AboutScreen + [WelcomeScreen | +Widget build() ] - [LoadingScreen + [DashboardScreen | - +sessionString: String?; - +queryParameters: Map<String, String>? + +error: String? ] - [DisclaimerSection + [OverflowMenuItem | - +Widget buildContent() + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? ] - [<abstract>GenericSection]<:-[DisclaimerSection] + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] - [ReportDetailsScreen + [StudyFinishedPlaceholder | - +subject: StudySubject + <static>+space: SizedBox | - <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] + [StudyFinishedPlaceholder]o-[SizedBox] + + [TaskBox + | + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() + ] + + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] + + [ProgressRow + | + +subject: StudySubject? + ] + + [ProgressRow]o-[StudySubject] + + [InterventionSegment + | + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int + | + +List<Widget> buildSeparators(); + +Widget build() + ] + + [InterventionSegment]o-[Intervention] + + [TaskOverview + | + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? + ] + + [TaskOverview]o-[StudySubject] + + [Settings + ] + + [OptOutAlertDialog + | + +subject: StudySubject? + | + +Widget build() + ] + + [OptOutAlertDialog]o-[StudySubject] + + [DeleteAlertDialog + | + +subject: StudySubject? + | + +Widget build() + ] + + [DeleteAlertDialog]o-[StudySubject] + + [FAQ + | + +Widget build() + ] + + [Entry + | + +title: String; + +children: List<Entry> + ] + + [EntryItem + | + +entry: Entry + | + -Widget _buildTiles(); + +Widget build() + ] + + [EntryItem]o-[Entry] + + [ContactScreen + ] + + [ContactWidget + | + +contact: Contact?; + +title: String; + +subtitle: String?; + +color: Color + | + +Widget build() + ] + + [ContactWidget]o-[Contact] + [ContactWidget]o-[Color] + + [ContactItem + | + +iconData: IconData; + +itemName: String; + +itemValue: String?; + +type: ContactItemType?; + +iconColor: Color? + | + +dynamic launchContact(); + +Widget build() + ] + + [ContactItem]o-[IconData] + [ContactItem]o-[ContactItemType] + [ContactItem]o-[Color] + + [ContactItemType + | + +index: int; + <static>+values: List<ContactItemType>; + <static>+website: ContactItemType; + <static>+email: ContactItemType; + <static>+phone: ContactItemType + ] + + [ContactItemType]o-[ContactItemType] + [Enum]<:--[ContactItemType] [LinearRegressionSectionWidget | @@ -122,19 +258,15 @@ +intervention: String ] - [ReportHistoryScreen - | - +Widget build() - ] - - [ReportHistoryItem + [ReportDetailsScreen | +subject: StudySubject | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [ReportHistoryItem]o-[StudySubject] + [ReportDetailsScreen]o-[StudySubject] [<abstract>GenericSection | @@ -155,30 +287,26 @@ [<abstract>GenericSection]<:-[GeneralDetailsSection] - [<abstract>ReportSectionWidget + [PerformanceSection | - +subject: StudySubject + +minimumRatio: double; + +maximum: double + | + +Widget buildContent(); + +String getPowerLevelDescription(); + +int getCountableObservationAmount() ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [<abstract>GenericSection]<:-[PerformanceSection] - [ReportSectionContainer + [PerformanceBar | - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; - +section: ReportSection; - +subject: StudySubject; - +primary: bool; - +onTap: void Function()? + +progress: double; + +minimum: double? | - +ReportSectionWidget buildContents(); - +List<Widget> buildPrimaryHeader(); +Widget build() ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - [PerformanceDetailsScreen | +reportSubject: StudySubject? @@ -222,26 +350,60 @@ [PerformanceBar]o-[<abstract>Task] - [PerformanceSection + [ReportHistoryScreen | - +minimumRatio: double; - +maximum: double + +Widget build() + ] + + [ReportHistoryItem | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() + +subject: StudySubject + | + +Widget build() ] - [<abstract>GenericSection]<:-[PerformanceSection] + [ReportHistoryItem]o-[StudySubject] - [PerformanceBar + [<abstract>ReportSectionWidget | - +progress: double; - +minimum: double? + +subject: StudySubject + ] + + [<abstract>ReportSectionWidget]o-[StudySubject] + + [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() ] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] + + [DisclaimerSection + | + +Widget buildContent() + ] + + [<abstract>GenericSection]<:-[DisclaimerSection] + + [CheckmarkTaskWidget + | + +task: CheckmarkTask?; + +completionPeriod: CompletionPeriod? + ] + + [CheckmarkTaskWidget]o-[CheckmarkTask] + [CheckmarkTaskWidget]o-[CompletionPeriod] + [TaskScreen | +taskInstance: TaskInstance @@ -260,65 +422,38 @@ [QuestionnaireTaskWidget]o-[QuestionnaireTask] [QuestionnaireTaskWidget]o-[CompletionPeriod] - [CheckmarkTaskWidget - | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? - ] - - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - - [StudyOverviewScreen - ] - - [_StudyOverviewScreen - | - +study: Study? - | - +dynamic navigateToJourney(); - +dynamic navigateToEligibilityCheck(); - +Widget build() + [KickoffScreen ] - [_StudyOverviewScreen]o-[Study] - - [StudyDetailsView + [_KickoffScreen | - +study: Study?; - +iconSize: double + +subject: StudySubject?; + +ready: bool | + -dynamic _storeUserStudy(); + -Widget _constructStatusIcon(); + -String _getStatusText(); +Widget build() ] - [StudyDetailsView]o-[Study] + [_KickoffScreen]o-[StudySubject] - [StudySelectionScreen + [EligibilityResult | - +Widget build() - ] - - [InviteCodeDialog - ] - - [InterventionSelectionScreen + +eligible: bool; + +firstFailed: EligibilityCriterion? ] - [KickoffScreen - ] + [EligibilityResult]o-[EligibilityCriterion] - [_KickoffScreen + [EligibilityScreen | - +subject: StudySubject?; - +ready: bool + +study: Study? | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); - +Widget build() + <static>+MaterialPageRoute<EligibilityResult> routeFor() ] - [_KickoffScreen]o-[StudySubject] + [EligibilityScreen]o-[Study] [JourneyOverviewScreen ] @@ -375,6 +510,15 @@ [TimelineChild]o-[<abstract>Widget] + [OnboardingProgress + | + +stage: int; + +progress: double + | + -double _getProgressForStage(); + +Widget build() + ] + [ConsentScreen ] @@ -401,448 +545,322 @@ [ConsentElement]o-[IconData] - [EligibilityResult - | - +eligible: bool; - +firstFailed: EligibilityCriterion? - ] - - [EligibilityResult]o-[EligibilityCriterion] - - [EligibilityScreen - | - +study: Study? - | - <static>+MaterialPageRoute<EligibilityResult> routeFor() - ] - - [EligibilityScreen]o-[Study] - - [OnboardingProgress - | - +stage: int; - +progress: double - | - -double _getProgressForStage(); - +Widget build() - ] - - [TaskOverview - | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? - ] - - [TaskOverview]o-[StudySubject] - - [ProgressRow - | - +subject: StudySubject? - ] - - [ProgressRow]o-[StudySubject] - - [InterventionSegment - | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int - | - +List<Widget> buildSeparators(); - +Widget build() - ] - - [InterventionSegment]o-[Intervention] - - [TaskBox - | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() - ] - - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] - - [Settings - ] - - [OptOutAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [OptOutAlertDialog]o-[StudySubject] - - [DeleteAlertDialog - | - +subject: StudySubject? - | - +Widget build() - ] - - [DeleteAlertDialog]o-[StudySubject] - - [ContactScreen + [InterventionSelectionScreen ] - [ContactWidget - | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color - | - +Widget build() + [StudyOverviewScreen ] - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] - - [ContactItem + [_StudyOverviewScreen | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? + +study: Study? | - +dynamic launchContact(); + +dynamic navigateToJourney(); + +dynamic navigateToEligibilityCheck(); +Widget build() ] - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] + [_StudyOverviewScreen]o-[Study] - [ContactItemType + [StudyDetailsView | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType - ] - - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] - - [FAQ + +study: Study?; + +iconSize: double | +Widget build() ] - [Entry - | - +title: String; - +children: List<Entry> - ] + [StudyDetailsView]o-[Study] - [EntryItem - | - +entry: Entry + [StudySelectionScreen | - -Widget _buildTiles(); +Widget build() ] - [EntryItem]o-[Entry] - - [DashboardScreen - | - +error: String? - ] - - [OverflowMenuItem - | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? - ] - - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] - - [StudyFinishedPlaceholder - | - <static>+space: SizedBox - | - +Widget build() + [InviteCodeDialog ] - [StudyFinishedPlaceholder]o-[SizedBox] - - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - - - + - + - - - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - - - + + - + + - + - + + + - + - + + + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + + + + + + + + + + AboutScreen + + + + + + +Widget build() + + + - - - + + + - + Preview - + +queryParameters: Map<String, String>? +appLanguage: AppLanguage @@ -854,7 +872,7 @@ - + +bool hasRoute() +void handleQueries() @@ -873,9 +891,9 @@ - + - + AppLanguage @@ -884,9 +902,9 @@ - + - + Study @@ -895,38 +913,39 @@ - + - + StudySubject - - - - + + + + - - - WelcomeScreen + + + IFrameHelper - - - +Widget build() + + + +void postRouteFinished() + +void listen() - + - + TermsScreen @@ -935,17 +954,17 @@ - - - + + + - + LegalSection - + +title: String? +description: String? @@ -958,7 +977,7 @@ - + +Widget build() @@ -967,9 +986,9 @@ - + - + Icon @@ -978,1063 +997,1126 @@ - + - + void Function(bool?)? - - - - + + + + - - - IFrameHelper + + + LoadingScreen - - - +void postRouteFinished() - +void listen() + + + +sessionString: String? + +queryParameters: Map<String, String>? - - - - + + + + - - - AboutScreen + + + WelcomeScreen - - - +Widget build() + + + +Widget build() - - - - + + + + - - - LoadingScreen + + + DashboardScreen - - - +sessionString: String? - +queryParameters: Map<String, String>? + + + +error: String? - - - - + + + + - - - DisclaimerSection + + + OverflowMenuItem - - - +Widget buildContent() + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - - - + + + - - - GenericSection + + + IconData - - - +subject: StudySubject? - +onTap: void Function()? - - + + + + - - - +Widget buildContent() - +Widget build() + + + dynamic Function()? - - - - - + + + + + - - - ReportDetailsScreen + + + StudyFinishedPlaceholder - - - +subject: StudySubject + + + <static>+space: SizedBox - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + +Widget build() - - - - - + + + - - - LinearRegressionSectionWidget + + + SizedBox - - - +section: LinearRegressionSection + + + + + + + + + TaskBox - - - +Widget build() + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - + + + - - - LinearRegressionSection + + + TaskInstance - - - - + + + - - - ReportSectionWidget + + + dynamic Function() - - - +subject: StudySubject + + + + + + + + + ProgressRow + + + + + + +subject: StudySubject? - - - - - + + + + + - - - AverageSectionWidget + + + InterventionSegment - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int - - - +Widget build() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +MaterialColor getColor() - +Iterable<DiagramDatum> getAggregatedData() + + + +List<Widget> buildSeparators() + +Widget build() - - - + + + - - - AverageSection + + + Intervention - - - - + + + + - - - DiagramDatum + + + TaskOverview - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - - - - - - ReportHistoryScreen - - + + + - - - +Widget build() + + + Settings - - - - - + + + + + - - - ReportHistoryItem + + + OptOutAlertDialog - - - +subject: StudySubject + + + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - + + + + + - - - void Function()? + + + DeleteAlertDialog - - - - - + + + +subject: StudySubject? + + - - - GeneralDetailsSection + + + +Widget build() - - - +Widget buildContent() + + + + + + + + + FAQ - - - - - - - - - - ReportSectionContainer + + + +Widget build() - - - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + + + + + + + Entry - - - +ReportSectionWidget buildContents() - +List<Widget> buildPrimaryHeader() - +Widget build() + + + +title: String + +children: List<Entry> - - - + + + + + - - - ReportSection + + + EntryItem - - - - - - - - - - PerformanceDetailsScreen + + + +entry: Entry - - - +reportSubject: StudySubject? + + + -Widget _buildTiles() + +Widget build() - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + + + + + + ContactScreen - - - - - + + + + + - - - InterventionPerformanceBar + + + ContactWidget - - - +intervention: Intervention - +subject: StudySubject? + + + +contact: Contact? + +title: String + +subtitle: String? + +color: Color - - - +Widget build() + + + +Widget build() - - - + + + - - - Intervention + + + Contact - - - - - + + + - - - ObservationPerformanceBar + + + Color - - - +observation: Observation - +subject: StudySubject? + + + + + + + + + + ContactItem - - - +Widget build() + + + +iconData: IconData + +itemName: String + +itemValue: String? + +type: ContactItemType? + +iconColor: Color? - - - - - - - - Observation + + + +dynamic launchContact() + +Widget build() - - - - - + + + + - - - PerformanceBar + + + ContactItemType - - - +task: Task - +completed: int - +total: int + + + +index: int + <static>+values: List<ContactItemType> + <static>+website: ContactItemType + <static>+email: ContactItemType + <static>+phone: ContactItemType - - - +Widget build() + + + + + + + + Enum - - - + + + + + - - - Task + + + LinearRegressionSectionWidget + + + + + + +section: LinearRegressionSection + + + + + + +Widget build() - - - - - + + + - - - PerformanceSection + + + LinearRegressionSection - - - +minimumRatio: double - +maximum: double + + + + + + + + + ReportSectionWidget - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +subject: StudySubject - - - - - + + + + + - - - TaskScreen + + + AverageSectionWidget - - - +taskInstance: TaskInstance + + + +section: AverageSection + +titlePos: List<int> + +phasePos: List<int> - - - <static>+MaterialPageRoute<bool> routeFor() + + + +Widget build() + +Widget getDiagram() + +BarChartData getChartData() + +Widget getTitles() + +Widget getValues() + +List<BarChartGroupData> getBarGroups() + +MaterialColor getColor() + +Iterable<DiagramDatum> getAggregatedData() - - - + + + - - - TaskInstance + + + AverageSection - - - - + + + + - - - QuestionnaireTaskWidget + + + DiagramDatum - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String - - - + + + + + - - - QuestionnaireTask + + + ReportDetailsScreen - - - - + + + +subject: StudySubject + + - - - CompletionPeriod + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - + + + + + - - - CheckmarkTaskWidget + + + GenericSection - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + +subject: StudySubject? + +onTap: void Function()? + + + + + + +Widget buildContent() + +Widget build() - - - + + + - - - CheckmarkTask + + + void Function()? - - - + + + + - - - StudyOverviewScreen + + + GeneralDetailsSection + + + + + + +Widget buildContent() - - - - - + + + + + - - - _StudyOverviewScreen + + + PerformanceSection - - - +study: Study? + + + +minimumRatio: double + +maximum: double - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - - - + + + + + - - - StudyDetailsView + + + PerformanceBar - - - +study: Study? - +iconSize: double + + + +progress: double + +minimum: double? - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudySelectionScreen + + + PerformanceDetailsScreen - - - +Widget build() + + + +reportSubject: StudySubject? - - - - - - - - InviteCodeDialog + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - + + + + + - - - InterventionSelectionScreen + + + InterventionPerformanceBar - - - - + + + +intervention: Intervention + +subject: StudySubject? + + - - - KickoffScreen + + + +Widget build() - - - - - + + + + + - - - _KickoffScreen + + + ObservationPerformanceBar - - - +subject: StudySubject? - +ready: bool + + + +observation: Observation + +subject: StudySubject? - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() + + + +Widget build() - - - + + + - - - JourneyOverviewScreen + + + Observation - - - - - + + + - - - _JourneyOverviewScreen + + + Task - - - +subject: StudySubject? + + + + + + + + + ReportHistoryScreen - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() + + + +Widget build() - - - - - - - - - Timeline + + + + + + + + + ReportHistoryItem - - - +subject: StudySubject? + + + +subject: StudySubject - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - InterventionTile + + + ReportSectionContainer - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool + + + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? - - - +Widget build() + + + +ReportSectionWidget buildContents() + +List<Widget> buildPrimaryHeader() + +Widget build() - - - + + + - - - Color + + + ReportSection - - - - - - - - - IconIndicator - - + + + + - - - +iconName: String - +color: Color? + + + DisclaimerSection - - - +Widget build() + + + +Widget buildContent() - - - - - + + + + - - - TimelineChild + + + CheckmarkTaskWidget - - - +child: Widget? + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - +Widget build() + + + + + + + + CheckmarkTask - - - + + + - - - Widget + + + CompletionPeriod - - - + + + + + - - - ConsentScreen + + + TaskScreen - - - - - - + + + +taskInstance: TaskInstance + + - - - ConsentCard + + + <static>+MaterialPageRoute<bool> routeFor() - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? + + + + + + + + + QuestionnaireTaskWidget - - - +Widget build() + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - + + + - - - ConsentItem + + + QuestionnaireTask - - - + + + - - - dynamic Function(int) + + + KickoffScreen - - - - + + + + + - - - ConsentElement + + + _KickoffScreen - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData + + + +subject: StudySubject? + +ready: bool - - - - - - - - IconData + + + -dynamic _storeUserStudy() + -Widget _constructStatusIcon() + -String _getStatusText() + +Widget build() - - + + - + EligibilityResult - + +eligible: bool +firstFailed: EligibilityCriterion? @@ -2044,9 +2126,9 @@ - + - + EligibilityCriterion @@ -2055,475 +2137,392 @@ - - - + + + - + EligibilityScreen - + +study: Study? - + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - - - - - - - OnboardingProgress - - - - - - +stage: int - +progress: double - - + + + - - - -double _getProgressForStage() - +Widget build() + + + JourneyOverviewScreen - - - - - - - - TaskOverview - - + + + + + - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + _JourneyOverviewScreen - - - - - - - - - ProgressRow + + + +subject: StudySubject? - - - +subject: StudySubject? + + + +dynamic getConsentAndNavigateToDashboard() + +Widget build() - - - - - - - - - InterventionSegment - - - - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int - - + + + + + - - - +List<Widget> buildSeparators() - +Widget build() + + + Timeline - - - - - - - - - TaskBox + + + +subject: StudySubject? - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + +Widget build() - - - + + + + + - - - dynamic Function() + + + 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() - - - + + + - - - ContactScreen + + + Widget - - - - - + + + + + - - - ContactWidget + + + OnboardingProgress - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color + + + +stage: int + +progress: double - - - +Widget build() + + + -double _getProgressForStage() + +Widget build() - - - + + + - - - Contact + + + ConsentScreen - - - - - + + + + + - - - ContactItem + + + ConsentCard - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? + + + +consent: ConsentItem? + +index: int? + +onTapped: dynamic Function(int) + +isChecked: bool? - - - +dynamic launchContact() - +Widget build() + + + +Widget build() - - - - - - - - ContactItemType - - + + + - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType + + + ConsentItem - - - + + + - - - Enum + + + dynamic Function(int) - - - - + + + + - - - FAQ + + + ConsentElement - - - +Widget build() + + + +title: String + +descriptionText: String + +acknowledgmentText: String + +icon: IconData - - - - - - - - Entry - - + + + - - - +title: String - +children: List<Entry> + + + InterventionSelectionScreen - - - - - + + + - - - EntryItem + + + StudyOverviewScreen - - - +entry: Entry - - + + + + + + - - - -Widget _buildTiles() - +Widget build() + + + _StudyOverviewScreen - - - - - - - - - DashboardScreen + + + +study: Study? - - - +error: String? + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() - - - - + + + + + - - - OverflowMenuItem + + + StudyDetailsView - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +study: Study? + +iconSize: double - - - - - - - - dynamic Function()? + + + +Widget build() - - - - - - - - - StudyFinishedPlaceholder - - + + + + - - - <static>+space: SizedBox + + + StudySelectionScreen - - - +Widget build() + + + +Widget build() - - - + + + - - - SizedBox + + + InviteCodeDialog diff --git a/docs/uml/app/lib/uml.svg b/docs/uml/app/lib/uml.svg index 16e6e384e..f5e066800 100644 --- a/docs/uml/app/lib/uml.svg +++ b/docs/uml/app/lib/uml.svg @@ -1,634 +1,561 @@ - - [ThemeConfig + + [MyApp | - <static>+SliderThemeData coloredSliderTheme() + +queryParameters: Map<String, String>; + +appConfig: AppConfig? ] - [Routes - | - <static>+loading: String; - <static>+preview: String; - <static>+dashboard: String; - <static>+welcome: String; - <static>+about: String; - <static>+terms: String; - <static>+studySelection: String; - <static>+studyOverview: String; - <static>+interventionSelection: String; - <static>+journey: String; - <static>+consent: String; - <static>+kickoff: String; - <static>+contact: String; - <static>+faq: String; - <static>+appSettings: String; - <static>+questionnaire: String; - <static>+reportHistory: String; - <static>+reportDetails: String; - <static>+performanceDetails: String + [MyApp]o-[AppConfig] + + [AboutScreen | - <static>+Route<dynamic> unknownRoute(); - <static>+Route<dynamic>? generateRoute() + +Widget build() ] - [InterventionCard + [Preview | - +intervention: Intervention; - +selected: bool; - +showCheckbox: bool; - +showTasks: bool; - +showDescription: bool; - +onTap: dynamic Function()? + +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() ] - [InterventionCard]o-[Intervention] - [InterventionCard]o-[dynamic Function()?] + [Preview]o-[AppLanguage] + [Preview]o-[Study] + [Preview]o-[StudySubject] - [InterventionCardTitle - | - +intervention: Intervention?; - +selected: bool; - +showCheckbox: bool; - +showDescriptionButton: bool; - +onTap: dynamic Function()? + [IFrameHelper | - +Widget build() + +void postRouteFinished(); + +void listen() ] - [InterventionCardTitle]o-[Intervention] - [InterventionCardTitle]o-[dynamic Function()?] + [TermsScreen + ] - [InterventionCardDescription + [LegalSection | - +intervention: Intervention + +title: String?; + +description: String?; + +icon: Icon?; + +pdfUrl: String?; + +pdfUrlLabel: String?; + +acknowledgment: String?; + +isChecked: bool?; + +onChange: void Function(bool?)? | +Widget build() ] - [InterventionCardDescription]o-[Intervention] + [LegalSection]o-[Icon] + [LegalSection]o-[void Function(bool?)?] - [_TaskList - | - +tasks: List<InterventionTask> + [LoadingScreen | - +String scheduleString(); - +Widget build() + +sessionString: String?; + +queryParameters: Map<String, String>? ] - [RoundCheckbox - | - +onChanged: dynamic Function(bool)?; - +value: bool? + [WelcomeScreen | +Widget build() ] - [RoundCheckbox]o-[dynamic Function(bool)?] - - [VisualAnalogueQuestionWidget + [DashboardScreen | - +question: VisualAnalogueQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +error: String? ] - [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] - [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - - [QuestionHeader - | - +prompt: String?; - +subtitle: String?; - +rationale: String? + [OverflowMenuItem | - -List<Widget> _buildSubtitle(); - -List<Widget> _buildRationaleButton(); - +Widget build() + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? ] - [QuestionnaireWidget - | - +title: String?; - +header: String?; - +footer: String?; - +questions: List<Question<dynamic>> - ] + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] - [HtmlTextBox + [StudyFinishedPlaceholder | - +text: String? + <static>+space: SizedBox | +Widget build() ] - [AnnotatedScaleQuestionWidget + [StudyFinishedPlaceholder]o-[SizedBox] + + [TaskBox | - +question: AnnotatedScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +taskInstance: TaskInstance; + +icon: Icon; + +onCompleted: dynamic Function() ] - [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] - [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] + [TaskBox]o-[TaskInstance] + [TaskBox]o-[Icon] + [TaskBox]o-[dynamic Function()] - [BooleanQuestionWidget + [ProgressRow | - +question: BooleanQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +subject: StudySubject? ] - [BooleanQuestionWidget]o-[BooleanQuestion] - [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] + [ProgressRow]o-[StudySubject] - [<abstract>QuestionWidget + [InterventionSegment | - +subtitle: String? - ] - - [ChoiceQuestionWidget + +intervention: Intervention; + +percentCompleted: double; + +percentMissed: double; + +isCurrent: bool; + +isFuture: bool; + +phaseDuration: int | - +question: ChoiceQuestion; - +onDone: dynamic Function(Answer<dynamic>); - +multiSelectionText: String; - +subtitle: String? + +List<Widget> buildSeparators(); + +Widget build() ] - [ChoiceQuestionWidget]o-[ChoiceQuestion] - [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] - [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] + [InterventionSegment]o-[Intervention] - [ScaleQuestionWidget + [TaskOverview | - +question: ScaleQuestion; - +onDone: dynamic Function(Answer<dynamic>)? + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? ] - [ScaleQuestionWidget]o-[ScaleQuestion] - [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] - [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] + [TaskOverview]o-[StudySubject] - [QuestionContainer + [Settings + ] + + [OptOutAlertDialog | - +onDone: dynamic Function(Answer<dynamic>, int); - +question: Question<dynamic>; - +index: int + +subject: StudySubject? + | + +Widget build() ] - [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] - [QuestionContainer]o-[<abstract>Question] + [OptOutAlertDialog]o-[StudySubject] - [CustomSlider + [DeleteAlertDialog | - +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? + +subject: StudySubject? | +Widget build() ] - [CustomSlider]o-[dynamic Function(double)?] - [CustomSlider]o-[Color] - [CustomSlider]o-[AnnotatedScaleQuestion] + [DeleteAlertDialog]o-[StudySubject] - [CustomTrackShape + [FAQ | - +Rect getPreferredRect() + +Widget build() ] - [RoundedRectSliderTrackShape]<:-[CustomTrackShape] + [Entry + | + +title: String; + +children: List<Entry> + ] - [HtmlText + [EntryItem | - +text: String?; - +style: TextStyle? + +entry: Entry | + -Widget _buildTiles(); +Widget build() ] - [HtmlText]o-[TextStyle] + [EntryItem]o-[Entry] - [StudyTile + [ContactScreen + ] + + [ContactWidget | - +title: String?; - +description: String?; - +iconName: String; - +onTap: dynamic Function()?; - +contentPadding: EdgeInsetsGeometry + +contact: Contact?; + +title: String; + +subtitle: String?; + +color: Color | +Widget build() ] - [StudyTile]o-[dynamic Function()?] - [StudyTile]o-[<abstract>EdgeInsetsGeometry] + [ContactWidget]o-[Contact] + [ContactWidget]o-[Color] - [SelectableButton + [ContactItem | - +child: Widget; - +selected: bool; - +onTap: dynamic Function()? + +iconData: IconData; + +itemName: String; + +itemValue: String?; + +type: ContactItemType?; + +iconColor: Color? | - -Color _getFillColor(); - -Color _getTextColor(); + +dynamic launchContact(); +Widget build() ] - [SelectableButton]o-[<abstract>Widget] - [SelectableButton]o-[dynamic Function()?] + [ContactItem]o-[IconData] + [ContactItem]o-[ContactItemType] + [ContactItem]o-[Color] - [BottomOnboardingNavigation + [ContactItemType | - +onBack: void Function()?; - +onNext: void Function()?; - +backLabel: String?; - +nextLabel: String?; - +hideNext: bool; - +nextIcon: Icon?; - +backIcon: Icon?; - +progress: Widget? + +index: int; + <static>+values: List<ContactItemType>; + <static>+website: ContactItemType; + <static>+email: ContactItemType; + <static>+phone: ContactItemType + ] + + [ContactItemType]o-[ContactItemType] + [Enum]<:--[ContactItemType] + + [LinearRegressionSectionWidget + | + +section: LinearRegressionSection | +Widget build() ] - [BottomOnboardingNavigation]o-[void Function()?] - [BottomOnboardingNavigation]o-[Icon] - [BottomOnboardingNavigation]o-[<abstract>Widget] + [LinearRegressionSectionWidget]o-[LinearRegressionSection] + [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] - [AppAnalytics + [AverageSectionWidget | - <static>-_userEnabled: bool?; - <static>+keyAnalyticsUserEnable: String; - +context: BuildContext; - +subject: StudySubject?; - <static>+isUserEnabled: dynamic + +section: AverageSection; + +titlePos: List<int>; + +phasePos: List<int> | - <static>+dynamic init(); - <static>+dynamic start(); - <static>+void setEnabled(); - +dynamic initBasic(); - +void initAdvanced() + +Widget build(); + +Widget getDiagram(); + +BarChartData getChartData(); + +Widget getTitles(); + +Widget getValues(); + +List<BarChartGroupData> getBarGroups(); + +MaterialColor getColor(); + +Iterable<DiagramDatum> getAggregatedData() ] - [AppAnalytics]o-[<abstract>BuildContext] - [AppAnalytics]o-[StudySubject] + [AverageSectionWidget]o-[AverageSection] + [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] - [StudyNotification + [DiagramDatum | - +taskInstance: TaskInstance; - +date: DateTime + +x: num; + +value: num; + +timestamp: DateTime?; + +intervention: String ] - [StudyNotification]o-[TaskInstance] - - [GroupedIterable + [ReportDetailsScreen | - +data: Map<K, Iterable<V>>; - +iterator: Iterator<MapEntry<K, Iterable<V>>> + +subject: StudySubject | - +Iterable<MapEntry<K, R>> aggregate(); - +Iterable<MapEntry<K, R>> aggregateWithKey() + <static>+MaterialPageRoute<dynamic> routeFor(); + +Widget build() ] - [Iterable]<:-[GroupedIterable] - - [NotificationValidators - | - +didNotificationLaunchApp: bool; - +wasNotificationActionHandled: bool; - +wasNotificationActionCompleted: bool - ] + [ReportDetailsScreen]o-[StudySubject] - [StudyNotifications + [<abstract>GenericSection | +subject: StudySubject?; - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin; - +context: BuildContext; - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification>; - +selectNotificationStream: StreamController<String?>; - <static>+validator: NotificationValidators; - <static>+debug: bool; - <static>+scheduledNotificationsDebug: String? + +onTap: void Function()? | - <static>+dynamic create(); - -dynamic _isAndroidPermissionGranted(); - -dynamic _requestPermissions(); - -void _configureDidReceiveLocalNotificationSubject(); - -void _configureSelectNotificationSubject(); - -void _initNotificationsPlugin(); - +dynamic handleNotificationResponse() + +Widget buildContent(); + +Widget build() ] - [StudyNotifications]o-[StudySubject] - [StudyNotifications]o-[FlutterLocalNotificationsPlugin] - [StudyNotifications]o-[<abstract>BuildContext] - [StudyNotifications]o-[StreamController] - [StudyNotifications]o-[NotificationValidators] + [<abstract>GenericSection]o-[StudySubject] + [<abstract>GenericSection]o-[void Function()?] - [ReceivedNotification + [GeneralDetailsSection | - +id: int?; - +title: String?; - +body: String?; - +payload: String? + +Widget buildContent() ] - [Cache + [<abstract>GenericSection]<:-[GeneralDetailsSection] + + [PerformanceSection | - <static>+isSynchronizing: bool; - <static>+sharedPrefs: dynamic + +minimumRatio: double; + +maximum: double | - <static>+dynamic storeSubject(); - <static>+dynamic loadSubject(); - <static>+dynamic storeAnalytics(); - <static>+dynamic loadAnalytics(); - <static>+dynamic delete(); - <static>+dynamic synchronize() + +Widget buildContent(); + +String getPowerLevelDescription(); + +int getCountableObservationAmount() ] - [Preview + [<abstract>GenericSection]<:-[PerformanceSection] + + [PerformanceBar | - +queryParameters: Map<String, String>?; - +appLanguage: AppLanguage; - +selectedRoute: String?; - +extra: String?; - +study: Study?; - +selectedStudyObjectId: String?; - +subject: StudySubject? + +progress: double; + +minimum: double? | - +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 + [PerformanceDetailsScreen + | + +reportSubject: StudySubject? | + <static>+MaterialPageRoute<dynamic> routeFor(); +Widget build() ] - [TermsScreen - ] + [PerformanceDetailsScreen]o-[StudySubject] - [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() ] - [LegalSection]o-[Icon] - [LegalSection]o-[void Function(bool?)?] + [InterventionPerformanceBar]o-[Intervention] + [InterventionPerformanceBar]o-[StudySubject] - [IFrameHelper + [ObservationPerformanceBar | - +void postRouteFinished(); - +void listen() + +observation: Observation; + +subject: StudySubject? + | + +Widget build() ] - [AboutScreen + [ObservationPerformanceBar]o-[<abstract>Observation] + [ObservationPerformanceBar]o-[StudySubject] + + [PerformanceBar + | + +task: Task; + +completed: int; + +total: int | +Widget build() ] - [LoadingScreen + [PerformanceBar]o-[<abstract>Task] + + [ReportHistoryScreen | - +sessionString: String?; - +queryParameters: Map<String, String>? + +Widget build() ] - [DisclaimerSection + [ReportHistoryItem | - +Widget buildContent() + +subject: StudySubject + | + +Widget build() ] - [<abstract>GenericSection]<:-[DisclaimerSection] + [ReportHistoryItem]o-[StudySubject] - [ReportDetailsScreen + [<abstract>ReportSectionWidget | +subject: StudySubject - | - <static>+MaterialPageRoute<dynamic> routeFor(); - +Widget build() ] - [ReportDetailsScreen]o-[StudySubject] + [<abstract>ReportSectionWidget]o-[StudySubject] - [LinearRegressionSectionWidget + [ReportSectionContainer | - +section: LinearRegressionSection + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)>; + +section: ReportSection; + +subject: StudySubject; + +primary: bool; + +onTap: void Function()? | + +ReportSectionWidget buildContents(); + +List<Widget> buildPrimaryHeader(); +Widget build() ] - [LinearRegressionSectionWidget]o-[LinearRegressionSection] - [<abstract>ReportSectionWidget]<:-[LinearRegressionSectionWidget] + [ReportSectionContainer]o-[<abstract>ReportSection] + [ReportSectionContainer]o-[StudySubject] + [ReportSectionContainer]o-[void Function()?] - [AverageSectionWidget - | - +section: AverageSection; - +titlePos: List<int>; - +phasePos: List<int> + [DisclaimerSection | - +Widget build(); - +Widget getDiagram(); - +BarChartData getChartData(); - +Widget getTitles(); - +Widget getValues(); - +List<BarChartGroupData> getBarGroups(); - +MaterialColor getColor(); - +Iterable<DiagramDatum> getAggregatedData() + +Widget buildContent() ] - [AverageSectionWidget]o-[AverageSection] - [<abstract>ReportSectionWidget]<:-[AverageSectionWidget] + [<abstract>GenericSection]<:-[DisclaimerSection] - [DiagramDatum + [CheckmarkTaskWidget | - +x: num; - +value: num; - +timestamp: DateTime?; - +intervention: String + +task: CheckmarkTask?; + +completionPeriod: CompletionPeriod? ] - [ReportHistoryScreen + [CheckmarkTaskWidget]o-[CheckmarkTask] + [CheckmarkTaskWidget]o-[CompletionPeriod] + + [TaskScreen | - +Widget build() + +taskInstance: TaskInstance + | + <static>+MaterialPageRoute<bool> routeFor() ] - [ReportHistoryItem - | - +subject: StudySubject + [TaskScreen]o-[TaskInstance] + + [QuestionnaireTaskWidget | - +Widget build() + +task: QuestionnaireTask; + +completionPeriod: CompletionPeriod ] - [ReportHistoryItem]o-[StudySubject] + [QuestionnaireTaskWidget]o-[QuestionnaireTask] + [QuestionnaireTaskWidget]o-[CompletionPeriod] - [<abstract>GenericSection + [KickoffScreen + ] + + [_KickoffScreen | +subject: StudySubject?; - +onTap: void Function()? + +ready: bool | - +Widget buildContent(); + -dynamic _storeUserStudy(); + -Widget _constructStatusIcon(); + -String _getStatusText(); +Widget build() ] - [<abstract>GenericSection]o-[StudySubject] - [<abstract>GenericSection]o-[void Function()?] + [_KickoffScreen]o-[StudySubject] - [GeneralDetailsSection + [EligibilityResult | - +Widget buildContent() + +eligible: bool; + +firstFailed: EligibilityCriterion? ] - [<abstract>GenericSection]<:-[GeneralDetailsSection] + [EligibilityResult]o-[EligibilityCriterion] - [<abstract>ReportSectionWidget + [EligibilityScreen | - +subject: StudySubject + +study: Study? + | + <static>+MaterialPageRoute<EligibilityResult> routeFor() ] - [<abstract>ReportSectionWidget]o-[StudySubject] + [EligibilityScreen]o-[Study] - [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() + [JourneyOverviewScreen ] - [ReportSectionContainer]o-[<abstract>ReportSection] - [ReportSectionContainer]o-[StudySubject] - [ReportSectionContainer]o-[void Function()?] - - [PerformanceDetailsScreen + [_JourneyOverviewScreen | - +reportSubject: StudySubject? + +subject: StudySubject? | - <static>+MaterialPageRoute<dynamic> routeFor(); + +dynamic getConsentAndNavigateToDashboard(); +Widget build() ] - [PerformanceDetailsScreen]o-[StudySubject] + [_JourneyOverviewScreen]o-[StudySubject] - [InterventionPerformanceBar + [Timeline | - +intervention: Intervention; +subject: StudySubject? | +Widget build() ] - [InterventionPerformanceBar]o-[Intervention] - [InterventionPerformanceBar]o-[StudySubject] + [Timeline]o-[StudySubject] - [ObservationPerformanceBar + [InterventionTile | - +observation: Observation; - +subject: StudySubject? + +title: String?; + +iconName: String; + +date: DateTime; + +color: Color?; + +isFirst: bool; + +isLast: bool | +Widget build() ] - [ObservationPerformanceBar]o-[<abstract>Observation] - [ObservationPerformanceBar]o-[StudySubject] + [InterventionTile]o-[Color] - [PerformanceBar + [IconIndicator | - +task: Task; - +completed: int; - +total: int + +iconName: String; + +color: Color? | +Widget build() ] - [PerformanceBar]o-[<abstract>Task] + [IconIndicator]o-[Color] - [PerformanceSection + [TimelineChild | - +minimumRatio: double; - +maximum: double + +child: Widget? | - +Widget buildContent(); - +String getPowerLevelDescription(); - +int getCountableObservationAmount() + +Widget build() ] - [<abstract>GenericSection]<:-[PerformanceSection] + [TimelineChild]o-[<abstract>Widget] - [PerformanceBar + [OnboardingProgress | - +progress: double; - +minimum: double? + +stage: int; + +progress: double | + -double _getProgressForStage(); +Widget build() ] - [TaskScreen + [ConsentScreen + ] + + [ConsentCard | - +taskInstance: TaskInstance + +consent: ConsentItem?; + +index: int?; + +onTapped: dynamic Function(int); + +isChecked: bool? | - <static>+MaterialPageRoute<bool> routeFor() + +Widget build() ] - [TaskScreen]o-[TaskInstance] + [ConsentCard]o-[ConsentItem] + [ConsentCard]o-[dynamic Function(int)] - [QuestionnaireTaskWidget + [ConsentElement | - +task: QuestionnaireTask; - +completionPeriod: CompletionPeriod + +title: String; + +descriptionText: String; + +acknowledgmentText: String; + +icon: IconData ] - [QuestionnaireTaskWidget]o-[QuestionnaireTask] - [QuestionnaireTaskWidget]o-[CompletionPeriod] + [ConsentElement]o-[IconData] - [CheckmarkTaskWidget - | - +task: CheckmarkTask?; - +completionPeriod: CompletionPeriod? + [InterventionSelectionScreen ] - [CheckmarkTaskWidget]o-[CheckmarkTask] - [CheckmarkTaskWidget]o-[CompletionPeriod] - [StudyOverviewScreen ] @@ -661,3402 +588,3474 @@ [InviteCodeDialog ] - [InterventionSelectionScreen - ] - - [KickoffScreen + [Routes + | + <static>+loading: String; + <static>+preview: String; + <static>+dashboard: String; + <static>+welcome: String; + <static>+about: String; + <static>+terms: String; + <static>+studySelection: String; + <static>+studyOverview: String; + <static>+interventionSelection: String; + <static>+journey: String; + <static>+consent: String; + <static>+kickoff: String; + <static>+contact: String; + <static>+faq: String; + <static>+appSettings: String; + <static>+questionnaire: String; + <static>+reportHistory: String; + <static>+reportDetails: String; + <static>+performanceDetails: String + | + <static>+Route<dynamic> unknownRoute(); + <static>+Route<dynamic>? generateRoute() ] - [_KickoffScreen + [GroupedIterable | - +subject: StudySubject?; - +ready: bool + +data: Map<K, Iterable<V>>; + +iterator: Iterator<MapEntry<K, Iterable<V>>> | - -dynamic _storeUserStudy(); - -Widget _constructStatusIcon(); - -String _getStatusText(); - +Widget build() + +Iterable<MapEntry<K, R>> aggregate(); + +Iterable<MapEntry<K, R>> aggregateWithKey() ] - [_KickoffScreen]o-[StudySubject] + [Iterable]<:-[GroupedIterable] - [JourneyOverviewScreen + [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() ] - [_JourneyOverviewScreen - | - +subject: StudySubject? + [StudyNotification | - +dynamic getConsentAndNavigateToDashboard(); - +Widget build() + +taskInstance: TaskInstance; + +date: DateTime ] - [_JourneyOverviewScreen]o-[StudySubject] + [StudyNotification]o-[TaskInstance] - [Timeline + [NotificationValidators | - +subject: StudySubject? + +didNotificationLaunchApp: bool; + +wasNotificationActionHandled: bool; + +wasNotificationActionCompleted: bool + ] + + [StudyNotifications | - +Widget build() + +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() ] - [Timeline]o-[StudySubject] + [StudyNotifications]o-[StudySubject] + [StudyNotifications]o-[FlutterLocalNotificationsPlugin] + [StudyNotifications]o-[<abstract>BuildContext] + [StudyNotifications]o-[StreamController] + [StudyNotifications]o-[NotificationValidators] - [InterventionTile + [ReceivedNotification | + +id: int?; +title: String?; - +iconName: String; - +date: DateTime; - +color: Color?; - +isFirst: bool; - +isLast: bool + +body: String?; + +payload: String? + ] + + [AppAnalytics + | + <static>-_userEnabled: bool?; + <static>+keyAnalyticsUserEnable: String; + +context: BuildContext; + +subject: StudySubject?; + <static>+isUserEnabled: dynamic | - +Widget build() + <static>+dynamic init(); + <static>+dynamic start(); + <static>+void setEnabled(); + +dynamic initBasic(); + +void initAdvanced() ] - [InterventionTile]o-[Color] + [AppAnalytics]o-[<abstract>BuildContext] + [AppAnalytics]o-[StudySubject] - [IconIndicator + [HtmlText | - +iconName: String; - +color: Color? + +text: String?; + +style: TextStyle? | +Widget build() ] - [IconIndicator]o-[Color] + [HtmlText]o-[TextStyle] - [TimelineChild - | - +child: Widget? + [ChoiceQuestionWidget | - +Widget build() + +question: ChoiceQuestion; + +onDone: dynamic Function(Answer<dynamic>); + +multiSelectionText: String; + +subtitle: String? ] - [TimelineChild]o-[<abstract>Widget] + [ChoiceQuestionWidget]o-[ChoiceQuestion] + [ChoiceQuestionWidget]o-[dynamic Function(Answer<dynamic>)] + [<abstract>QuestionWidget]<:-[ChoiceQuestionWidget] - [ConsentScreen + [AnnotatedScaleQuestionWidget + | + +question: AnnotatedScaleQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [ConsentCard - | - +consent: ConsentItem?; - +index: int?; - +onTapped: dynamic Function(int); - +isChecked: bool? + [AnnotatedScaleQuestionWidget]o-[AnnotatedScaleQuestion] + [AnnotatedScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[AnnotatedScaleQuestionWidget] + + [<abstract>QuestionWidget | - +Widget build() + +subtitle: String? ] - [ConsentCard]o-[ConsentItem] - [ConsentCard]o-[dynamic Function(int)] - - [ConsentElement + [ScaleQuestionWidget | - +title: String; - +descriptionText: String; - +acknowledgmentText: String; - +icon: IconData + +question: ScaleQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [ConsentElement]o-[IconData] + [ScaleQuestionWidget]o-[ScaleQuestion] + [ScaleQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[ScaleQuestionWidget] - [EligibilityResult + [VisualAnalogueQuestionWidget | - +eligible: bool; - +firstFailed: EligibilityCriterion? + +question: VisualAnalogueQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [EligibilityResult]o-[EligibilityCriterion] + [VisualAnalogueQuestionWidget]o-[VisualAnalogueQuestion] + [VisualAnalogueQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[VisualAnalogueQuestionWidget] - [EligibilityScreen - | - +study: Study? + [QuestionnaireWidget | - <static>+MaterialPageRoute<EligibilityResult> routeFor() + +title: String?; + +header: String?; + +footer: String?; + +questions: List<Question<dynamic>> ] - [EligibilityScreen]o-[Study] - - [OnboardingProgress + [HtmlTextBox | - +stage: int; - +progress: double + +text: String? | - -double _getProgressForStage(); +Widget build() ] - [TaskOverview + [BooleanQuestionWidget | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? + +question: BooleanQuestion; + +onDone: dynamic Function(Answer<dynamic>)? ] - [TaskOverview]o-[StudySubject] + [BooleanQuestionWidget]o-[BooleanQuestion] + [BooleanQuestionWidget]o-[dynamic Function(Answer<dynamic>)?] + [<abstract>QuestionWidget]<:-[BooleanQuestionWidget] - [ProgressRow + [QuestionContainer | - +subject: StudySubject? + +onDone: dynamic Function(Answer<dynamic>, int); + +question: Question<dynamic>; + +index: int ] - [ProgressRow]o-[StudySubject] + [QuestionContainer]o-[dynamic Function(Answer<dynamic>, int)] + [QuestionContainer]o-[<abstract>Question] - [InterventionSegment + [QuestionHeader | - +intervention: Intervention; - +percentCompleted: double; - +percentMissed: double; - +isCurrent: bool; - +isFuture: bool; - +phaseDuration: int + +prompt: String?; + +subtitle: String?; + +rationale: String? | - +List<Widget> buildSeparators(); + -List<Widget> _buildSubtitle(); + -List<Widget> _buildRationaleButton(); +Widget build() ] - [InterventionSegment]o-[Intervention] - - [TaskBox + [CustomSlider | - +taskInstance: TaskInstance; - +icon: Icon; - +onCompleted: dynamic Function() + +value: double?; + +minValue: double?; + +maxValue: double?; + +minorTick: int?; + +onChanged: dynamic Function(double)?; + +onChangeEnd: dynamic Function(double)?; + +activeColor: Color?; + +inactiveColor: Color?; + +minColor: Color?; + +maxColor: Color?; + +thumbColor: Color?; + +isColored: bool; + +labelValuePrecision: int; + +tickValuePrecision: int; + +linearStep: bool; + +steps: AnnotatedScaleQuestion? + | + +Widget build() ] - [TaskBox]o-[TaskInstance] - [TaskBox]o-[Icon] - [TaskBox]o-[dynamic Function()] + [CustomSlider]o-[dynamic Function(double)?] + [CustomSlider]o-[Color] + [CustomSlider]o-[AnnotatedScaleQuestion] - [Settings + [CustomTrackShape + | + +Rect getPreferredRect() ] - [OptOutAlertDialog + [RoundedRectSliderTrackShape]<:-[CustomTrackShape] + + [StudyTile | - +subject: StudySubject? + +title: String?; + +description: String?; + +iconName: String; + +onTap: dynamic Function()?; + +contentPadding: EdgeInsetsGeometry | +Widget build() ] - [OptOutAlertDialog]o-[StudySubject] + [StudyTile]o-[dynamic Function()?] + [StudyTile]o-[<abstract>EdgeInsetsGeometry] - [DeleteAlertDialog + [SelectableButton | - +subject: StudySubject? + +child: Widget; + +selected: bool; + +onTap: dynamic Function()? | + -Color _getFillColor(); + -Color _getTextColor(); +Widget build() ] - [DeleteAlertDialog]o-[StudySubject] - - [ContactScreen - ] + [SelectableButton]o-[<abstract>Widget] + [SelectableButton]o-[dynamic Function()?] - [ContactWidget + [RoundCheckbox | - +contact: Contact?; - +title: String; - +subtitle: String?; - +color: Color + +onChanged: dynamic Function(bool)?; + +value: bool? | +Widget build() ] - [ContactWidget]o-[Contact] - [ContactWidget]o-[Color] + [RoundCheckbox]o-[dynamic Function(bool)?] - [ContactItem + [InterventionCard | - +iconData: IconData; - +itemName: String; - +itemValue: String?; - +type: ContactItemType?; - +iconColor: Color? + +intervention: Intervention; + +selected: bool; + +showCheckbox: bool; + +showTasks: bool; + +showDescription: bool; + +onTap: dynamic Function()? | - +dynamic launchContact(); +Widget build() ] - [ContactItem]o-[IconData] - [ContactItem]o-[ContactItemType] - [ContactItem]o-[Color] + [InterventionCard]o-[Intervention] + [InterventionCard]o-[dynamic Function()?] - [ContactItemType + [InterventionCardTitle | - +index: int; - <static>+values: List<ContactItemType>; - <static>+website: ContactItemType; - <static>+email: ContactItemType; - <static>+phone: ContactItemType - ] - - [ContactItemType]o-[ContactItemType] - [Enum]<:--[ContactItemType] - - [FAQ + +intervention: Intervention?; + +selected: bool; + +showCheckbox: bool; + +showDescriptionButton: bool; + +onTap: dynamic Function()? | +Widget build() ] - [Entry - | - +title: String; - +children: List<Entry> - ] + [InterventionCardTitle]o-[Intervention] + [InterventionCardTitle]o-[dynamic Function()?] - [EntryItem + [InterventionCardDescription | - +entry: Entry + +intervention: Intervention | - -Widget _buildTiles(); +Widget build() ] - [EntryItem]o-[Entry] + [InterventionCardDescription]o-[Intervention] - [DashboardScreen + [_TaskList | - +error: String? - ] - - [OverflowMenuItem + +tasks: List<InterventionTask> | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? + +String scheduleString(); + +Widget build() ] - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] - - [StudyFinishedPlaceholder + [BottomOnboardingNavigation | - <static>+space: SizedBox + +onBack: void Function()?; + +onNext: void Function()?; + +backLabel: String?; + +nextLabel: String?; + +hideNext: bool; + +nextIcon: Icon?; + +backIcon: Icon?; + +progress: Widget? | +Widget build() ] - [StudyFinishedPlaceholder]o-[SizedBox] + [BottomOnboardingNavigation]o-[void Function()?] + [BottomOnboardingNavigation]o-[Icon] + [BottomOnboardingNavigation]o-[<abstract>Widget] - [MyApp + [ThemeConfig | - +queryParameters: Map<String, String>; - +appConfig: AppConfig? + <static>+SliderThemeData coloredSliderTheme() ] - [MyApp]o-[AppConfig] - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - - - + - + - + - + - - - + - + - + - + - - - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - - - + + - + + - + - + + + - + - + + + - + - + - + - + - + - + + + + + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - - - + - + - + - + - - - + - + - - - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - - - - + + + + - - - ThemeConfig + + + MyApp - - - <static>+SliderThemeData coloredSliderTheme() + + + +queryParameters: Map<String, String> + +appConfig: AppConfig? - - - - - - - - - Routes - - - - - - <static>+loading: String - <static>+preview: String - <static>+dashboard: String - <static>+welcome: String - <static>+about: String - <static>+terms: String - <static>+studySelection: String - <static>+studyOverview: String - <static>+interventionSelection: String - <static>+journey: String - <static>+consent: String - <static>+kickoff: String - <static>+contact: String - <static>+faq: String - <static>+appSettings: String - <static>+questionnaire: String - <static>+reportHistory: String - <static>+reportDetails: String - <static>+performanceDetails: String - - + + + - - - <static>+Route<dynamic> unknownRoute() - <static>+Route<dynamic>? generateRoute() + + + AppConfig - - - - - - - - - InterventionCard - - + + + + - - - +intervention: Intervention - +selected: bool - +showCheckbox: bool - +showTasks: bool - +showDescription: bool - +onTap: dynamic Function()? + + + AboutScreen - - - +Widget build() + + + +Widget build() - - - + + + + + - - - Intervention + + + Preview - - - - - - - - dynamic Function()? + + + +queryParameters: Map<String, String>? + +appLanguage: AppLanguage + +selectedRoute: String? + +extra: String? + +study: Study? + +selectedStudyObjectId: String? + +subject: StudySubject? - - - - - - - - - - InterventionCardTitle + + + +bool hasRoute() + +void handleQueries() + +dynamic init() + +dynamic handleAuthorization() + +dynamic runCommands() + +String? getSelectedRoute() + +bool containsQuery() + +bool containsQueryPair() + +dynamic getStudySubject() + -dynamic _createFakeSubject() + +List<String> getInterventionIds() - - - +intervention: Intervention? - +selected: bool - +showCheckbox: bool - +showDescriptionButton: bool - +onTap: dynamic Function()? - - + + + + - - - +Widget build() + + + AppLanguage - - - - - + + + - - - InterventionCardDescription + + + Study - - - +intervention: Intervention - - + + + + - - - +Widget build() + + + StudySubject - - - - - - - - - _TaskList - - + + + + - - - +tasks: List<InterventionTask> + + + IFrameHelper - - - +String scheduleString() - +Widget build() + + + +void postRouteFinished() + +void listen() - - - - - - - - - RoundCheckbox - - - - - - +onChanged: dynamic Function(bool)? - +value: bool? - - + + + - - - +Widget build() + + + TermsScreen - - - + + + + + - - - dynamic Function(bool)? + + + LegalSection - - - - - - - - - VisualAnalogueQuestionWidget + + + +title: String? + +description: String? + +icon: Icon? + +pdfUrl: String? + +pdfUrlLabel: String? + +acknowledgment: String? + +isChecked: bool? + +onChange: void Function(bool?)? - - - +question: VisualAnalogueQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + +Widget build() - - - + + + - - - VisualAnalogueQuestion + + + Icon - - - + + + - - - dynamic Function(Answer<dynamic>)? + + + void Function(bool?)? - - - - + + + + - - - QuestionWidget + + + LoadingScreen - - - +subtitle: String? + + + +sessionString: String? + +queryParameters: Map<String, String>? - - - - - - - - - QuestionHeader - - + + + + - - - +prompt: String? - +subtitle: String? - +rationale: String? + + + WelcomeScreen - - - -List<Widget> _buildSubtitle() - -List<Widget> _buildRationaleButton() - +Widget build() + + + +Widget build() - - - - + + + + - - - QuestionnaireWidget + + + DashboardScreen - - - +title: String? - +header: String? - +footer: String? - +questions: List<Question<dynamic>> + + + +error: String? - - - - - - - - - HtmlTextBox - - + + + + - - - +text: String? + + + OverflowMenuItem - - - +Widget build() + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? - - - - + + + - - - AnnotatedScaleQuestionWidget + + + IconData - - - +question: AnnotatedScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + + + + + + dynamic Function()? - - - + + + + + - - - AnnotatedScaleQuestion + + + StudyFinishedPlaceholder - - - - - - - - - BooleanQuestionWidget + + + <static>+space: SizedBox - - - +question: BooleanQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + +Widget build() - - - + + + - - - BooleanQuestion + + + SizedBox - - - - + + + + - - - ChoiceQuestionWidget + + + TaskBox - - - +question: ChoiceQuestion - +onDone: dynamic Function(Answer<dynamic>) - +multiSelectionText: String - +subtitle: String? + + + +taskInstance: TaskInstance + +icon: Icon + +onCompleted: dynamic Function() - - - + + + - - - ChoiceQuestion + + + TaskInstance - - - + + + - - - dynamic Function(Answer<dynamic>) + + + dynamic Function() - - - - + + + + - - - ScaleQuestionWidget + + + ProgressRow - - - +question: ScaleQuestion - +onDone: dynamic Function(Answer<dynamic>)? + + + +subject: StudySubject? - - - + + + + + - - - ScaleQuestion + + + InterventionSegment - - - - - + + + +intervention: Intervention + +percentCompleted: double + +percentMissed: double + +isCurrent: bool + +isFuture: bool + +phaseDuration: int + + - - - QuestionContainer + + + +List<Widget> buildSeparators() + +Widget build() - - - +onDone: dynamic Function(Answer<dynamic>, int) - +question: Question<dynamic> - +index: int + + + + + + + + Intervention - - - + + + + - - - dynamic Function(Answer<dynamic>, int) + + + TaskOverview + + + + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - + + + - - - Question + + + Settings - - - - - + + + + + - - - CustomSlider + + + OptOutAlertDialog - - - +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? + + + +subject: StudySubject? - - - +Widget build() + + + +Widget build() - - - + + + + + - - - dynamic Function(double)? + + + DeleteAlertDialog - - - - + + + +subject: StudySubject? + + - - - Color + + + +Widget build() - - - - + + + + - - - CustomTrackShape + + + FAQ - - - +Rect getPreferredRect() + + + +Widget build() - - - + + + + - - - RoundedRectSliderTrackShape + + + Entry + + + + + + +title: String + +children: List<Entry> - - - - - + + + + + - - - HtmlText + + + EntryItem - - - +text: String? - +style: TextStyle? + + + +entry: Entry - - - +Widget build() + + + -Widget _buildTiles() + +Widget build() - - - + + + - - - TextStyle + + + ContactScreen - - - - - + + + + + - - - StudyTile + + + ContactWidget - - - +title: String? - +description: String? - +iconName: String - +onTap: dynamic Function()? - +contentPadding: EdgeInsetsGeometry + + + +contact: Contact? + +title: String + +subtitle: String? + +color: Color - - - +Widget build() + + + +Widget build() - - - + + + - - - EdgeInsetsGeometry + + + Contact - - - - - + + + - - - SelectableButton + + + Color - - - +child: Widget - +selected: bool - +onTap: dynamic Function()? + + + + + + + + + + ContactItem - - - -Color _getFillColor() - -Color _getTextColor() - +Widget build() + + + +iconData: IconData + +itemName: String + +itemValue: String? + +type: ContactItemType? + +iconColor: Color? + + + + + + +dynamic launchContact() + +Widget build() - - - + + + + - - - Widget + + + ContactItemType + + + + + + +index: int + <static>+values: List<ContactItemType> + <static>+website: ContactItemType + <static>+email: ContactItemType + <static>+phone: ContactItemType - - - - - + + + - - - BottomOnboardingNavigation + + + Enum - - - +onBack: void Function()? - +onNext: void Function()? - +backLabel: String? - +nextLabel: String? - +hideNext: bool - +nextIcon: Icon? - +backIcon: Icon? - +progress: Widget? + + + + + + + + + + LinearRegressionSectionWidget - - - +Widget build() + + + +section: LinearRegressionSection + + + + + + +Widget build() - - - + + + - - - void Function()? + + + LinearRegressionSection - - - + + + + - - - Icon + + + ReportSectionWidget + + + + + + +subject: StudySubject - - - - - + + + + + - - - AppAnalytics + + + AverageSectionWidget - - - <static>-_userEnabled: bool? - <static>+keyAnalyticsUserEnable: String - +context: BuildContext - +subject: StudySubject? - <static>+isUserEnabled: dynamic + + + +section: AverageSection + +titlePos: List<int> + +phasePos: List<int> - - - <static>+dynamic init() - <static>+dynamic start() - <static>+void setEnabled() - +dynamic initBasic() - +void initAdvanced() + + + +Widget build() + +Widget getDiagram() + +BarChartData getChartData() + +Widget getTitles() + +Widget getValues() + +List<BarChartGroupData> getBarGroups() + +MaterialColor getColor() + +Iterable<DiagramDatum> getAggregatedData() - - - + + + - - - BuildContext + + + AverageSection - - - + + + + + + + + DiagramDatum + + - - - StudySubject + + + +x: num + +value: num + +timestamp: DateTime? + +intervention: String - - - - + + + + + - - - StudyNotification + + + ReportDetailsScreen - - - +taskInstance: TaskInstance - +date: DateTime + + + +subject: StudySubject - - - - - - - - TaskInstance + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - - + + + + + - - - GroupedIterable + + + GenericSection - - - +data: Map<K, Iterable<V>> - +iterator: Iterator<MapEntry<K, Iterable<V>>> + + + +subject: StudySubject? + +onTap: void Function()? - - - +Iterable<MapEntry<K, R>> aggregate() - +Iterable<MapEntry<K, R>> aggregateWithKey() + + + +Widget buildContent() + +Widget build() - - - + + + - - - Iterable + + + void Function()? - - - - + + + + - - - NotificationValidators + + + GeneralDetailsSection - - - +didNotificationLaunchApp: bool - +wasNotificationActionHandled: bool - +wasNotificationActionCompleted: bool + + + +Widget buildContent() - - - - - + + + + + - - - StudyNotifications + + + PerformanceSection - - - +subject: StudySubject? - +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin - +context: BuildContext - +didReceiveLocalNotificationStream: StreamController<ReceivedNotification> - +selectNotificationStream: StreamController<String?> - <static>+validator: NotificationValidators - <static>+debug: bool - <static>+scheduledNotificationsDebug: String? + + + +minimumRatio: double + +maximum: double - - - <static>+dynamic create() - -dynamic _isAndroidPermissionGranted() - -dynamic _requestPermissions() - -void _configureDidReceiveLocalNotificationSubject() - -void _configureSelectNotificationSubject() - -void _initNotificationsPlugin() - +dynamic handleNotificationResponse() + + + +Widget buildContent() + +String getPowerLevelDescription() + +int getCountableObservationAmount() - - - + + + + + - - - FlutterLocalNotificationsPlugin + + + PerformanceBar - - - - + + + +progress: double + +minimum: double? + + - - - StreamController + + + +Widget build() - - - - + + + + + - - - ReceivedNotification + + + PerformanceDetailsScreen - - - +id: int? - +title: String? - +body: String? - +payload: String? + + + +reportSubject: StudySubject? + + + + + + <static>+MaterialPageRoute<dynamic> routeFor() + +Widget build() - - - - - + + + + + - - - Cache + + + InterventionPerformanceBar - - - <static>+isSynchronizing: bool - <static>+sharedPrefs: dynamic + + + +intervention: Intervention + +subject: StudySubject? - - - <static>+dynamic storeSubject() - <static>+dynamic loadSubject() - <static>+dynamic storeAnalytics() - <static>+dynamic loadAnalytics() - <static>+dynamic delete() - <static>+dynamic synchronize() + + + +Widget build() - - - - - + + + + + - - - Preview + + + ObservationPerformanceBar - - - +queryParameters: Map<String, String>? - +appLanguage: AppLanguage - +selectedRoute: String? - +extra: String? - +study: Study? - +selectedStudyObjectId: String? - +subject: StudySubject? + + + +observation: Observation + +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() - - - + + + - - - AppLanguage + + + Observation - - - + + + - - - Study + + + Task - - - - + + + + - - - WelcomeScreen + + + ReportHistoryScreen - - - +Widget build() + + + +Widget build() - - - + + + + + - - - TermsScreen + + + ReportHistoryItem - - - - - - + + + +subject: StudySubject + + - - - LegalSection + + + +Widget build() - - - +title: String? - +description: String? - +icon: Icon? - +pdfUrl: String? - +pdfUrlLabel: String? - +acknowledgment: String? - +isChecked: bool? - +onChange: void Function(bool?)? + + + + + + + + + + ReportSectionContainer - - - +Widget build() + + + <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> + +section: ReportSection + +subject: StudySubject + +primary: bool + +onTap: void Function()? + + + + + + +ReportSectionWidget buildContents() + +List<Widget> buildPrimaryHeader() + +Widget build() - - - + + + - - - void Function(bool?)? + + + ReportSection - - - - + + + + - - - IFrameHelper + + + DisclaimerSection - - - +void postRouteFinished() - +void listen() + + + +Widget buildContent() - - - - + + + + - - - AboutScreen + + + CheckmarkTaskWidget - - - +Widget build() + + + +task: CheckmarkTask? + +completionPeriod: CompletionPeriod? - - - - + + + - - - LoadingScreen + + + CheckmarkTask - - - +sessionString: String? - +queryParameters: Map<String, String>? + + + + + + + + CompletionPeriod - - - - + + + + + - - - DisclaimerSection + + + TaskScreen - - - +Widget buildContent() + + + +taskInstance: TaskInstance - - - - - - - - - - GenericSection + + + <static>+MaterialPageRoute<bool> routeFor() - - - +subject: StudySubject? - +onTap: void Function()? + + + + + + + + + QuestionnaireTaskWidget - - - +Widget buildContent() - +Widget build() + + + +task: QuestionnaireTask + +completionPeriod: CompletionPeriod - - - - - + + + - - - ReportDetailsScreen + + + QuestionnaireTask - - - +subject: StudySubject - - + + + + - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + KickoffScreen - - - - - + + + + + - - - LinearRegressionSectionWidget + + + _KickoffScreen - - - +section: LinearRegressionSection + + + +subject: StudySubject? + +ready: bool - - - +Widget build() + + + -dynamic _storeUserStudy() + -Widget _constructStatusIcon() + -String _getStatusText() + +Widget build() - - - + + + + - - - LinearRegressionSection + + + EligibilityResult - - - - - - - - - ReportSectionWidget + + + +eligible: bool + +firstFailed: EligibilityCriterion? - - - +subject: StudySubject + + + + + + + + EligibilityCriterion - - - - - + + + + + - - - AverageSectionWidget + + + EligibilityScreen - - - +section: AverageSection - +titlePos: List<int> - +phasePos: List<int> + + + +study: Study? - - - +Widget build() - +Widget getDiagram() - +BarChartData getChartData() - +Widget getTitles() - +Widget getValues() - +List<BarChartGroupData> getBarGroups() - +MaterialColor getColor() - +Iterable<DiagramDatum> getAggregatedData() + + + <static>+MaterialPageRoute<EligibilityResult> routeFor() - - - + + + - - - AverageSection + + + JourneyOverviewScreen - - - - + + + + + - - - DiagramDatum + + + _JourneyOverviewScreen - - - +x: num - +value: num - +timestamp: DateTime? - +intervention: String + + + +subject: StudySubject? + + + + + + +dynamic getConsentAndNavigateToDashboard() + +Widget build() - - - - + + + + + - - - ReportHistoryScreen + + + Timeline - - - +Widget build() + + + +subject: StudySubject? + + + + + + +Widget build() - - - - - + + + + + - - - ReportHistoryItem + + + InterventionTile - - - +subject: StudySubject + + + +title: String? + +iconName: String + +date: DateTime + +color: Color? + +isFirst: bool + +isLast: bool - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - GeneralDetailsSection + + + IconIndicator - - - +Widget buildContent() + + + +iconName: String + +color: Color? + + + + + + +Widget build() - - - - - + + + + + - - - ReportSectionContainer + + + TimelineChild - - - <static>+sectionTypes: Map<Type, ReportSectionWidget Function(ReportSection, StudySubject)> - +section: ReportSection - +subject: StudySubject - +primary: bool - +onTap: void Function()? + + + +child: Widget? - - - +ReportSectionWidget buildContents() - +List<Widget> buildPrimaryHeader() - +Widget build() + + + +Widget build() - - - + + + - - - ReportSection + + + Widget - - - - - + + + + + - - - PerformanceDetailsScreen + + + OnboardingProgress - - - +reportSubject: StudySubject? + + + +stage: int + +progress: double - - - <static>+MaterialPageRoute<dynamic> routeFor() - +Widget build() + + + -double _getProgressForStage() + +Widget build() - - - - - + + + - - - InterventionPerformanceBar + + + ConsentScreen - - - +intervention: Intervention - +subject: StudySubject? - - + + + + + + - - - +Widget build() + + + ConsentCard - - - - - - - - - - ObservationPerformanceBar + + + +consent: ConsentItem? + +index: int? + +onTapped: dynamic Function(int) + +isChecked: bool? - - - +observation: Observation - +subject: StudySubject? + + + +Widget build() - - - +Widget build() + + + + + + + + ConsentItem - - - + + + - - - Observation + + + dynamic Function(int) - - - - - + + + + - - - PerformanceBar + + + ConsentElement - - - +task: Task - +completed: int - +total: int + + + +title: String + +descriptionText: String + +acknowledgmentText: String + +icon: IconData - - - +Widget build() + + + + + + + + InterventionSelectionScreen - - - + + + - - - Task + + + StudyOverviewScreen - - - - - + + + + + - - - PerformanceSection + + + _StudyOverviewScreen - - - +minimumRatio: double - +maximum: double + + + +study: Study? - - - +Widget buildContent() - +String getPowerLevelDescription() - +int getCountableObservationAmount() + + + +dynamic navigateToJourney() + +dynamic navigateToEligibilityCheck() + +Widget build() - - - - - + + + + + - - - TaskScreen + + + StudyDetailsView - - - +taskInstance: TaskInstance + + + +study: Study? + +iconSize: double - - - <static>+MaterialPageRoute<bool> routeFor() + + + +Widget build() - - - - - - - - QuestionnaireTaskWidget - - + + + + - - - +task: QuestionnaireTask - +completionPeriod: CompletionPeriod + + + StudySelectionScreen - - - - - - - - QuestionnaireTask + + + +Widget build() - - - + + + - - - CompletionPeriod + + + InviteCodeDialog - - - - + + + + + - - - CheckmarkTaskWidget + + + Routes - - - +task: CheckmarkTask? - +completionPeriod: CompletionPeriod? + + + <static>+loading: String + <static>+preview: String + <static>+dashboard: String + <static>+welcome: String + <static>+about: String + <static>+terms: String + <static>+studySelection: String + <static>+studyOverview: String + <static>+interventionSelection: String + <static>+journey: String + <static>+consent: String + <static>+kickoff: String + <static>+contact: String + <static>+faq: String + <static>+appSettings: String + <static>+questionnaire: String + <static>+reportHistory: String + <static>+reportDetails: String + <static>+performanceDetails: String - - - - - - - - CheckmarkTask + + + <static>+Route<dynamic> unknownRoute() + <static>+Route<dynamic>? generateRoute() - - - + + + + + - - - StudyOverviewScreen + + + GroupedIterable - - - - - - - - - - _StudyOverviewScreen + + + +data: Map<K, Iterable<V>> + +iterator: Iterator<MapEntry<K, Iterable<V>>> - - - +study: Study? + + + +Iterable<MapEntry<K, R>> aggregate() + +Iterable<MapEntry<K, R>> aggregateWithKey() - - - +dynamic navigateToJourney() - +dynamic navigateToEligibilityCheck() - +Widget build() + + + + + + + + Iterable - - - - - + + + + + - - - StudyDetailsView + + + Cache - - - +study: Study? - +iconSize: double + + + <static>+isSynchronizing: bool + <static>+sharedPrefs: dynamic - - - +Widget build() + + + <static>+dynamic storeSubject() + <static>+dynamic loadSubject() + <static>+dynamic storeAnalytics() + <static>+dynamic loadAnalytics() + <static>+dynamic delete() + <static>+dynamic synchronize() - - - - + + + + - - - StudySelectionScreen + + + StudyNotification - - - +Widget build() + + + +taskInstance: TaskInstance + +date: DateTime - - - + + + + - - - InviteCodeDialog + + + NotificationValidators - - - - - - - - InterventionSelectionScreen + + + +didNotificationLaunchApp: bool + +wasNotificationActionHandled: bool + +wasNotificationActionCompleted: bool - - - + + + + + - - - KickoffScreen + + + StudyNotifications - - - - - - - - - - _KickoffScreen + + + +subject: StudySubject? + +flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin + +context: BuildContext + +didReceiveLocalNotificationStream: StreamController<ReceivedNotification> + +selectNotificationStream: StreamController<String?> + <static>+validator: NotificationValidators + <static>+debug: bool + <static>+scheduledNotificationsDebug: String? - - - +subject: StudySubject? - +ready: bool + + + <static>+dynamic create() + -dynamic _isAndroidPermissionGranted() + -dynamic _requestPermissions() + -void _configureDidReceiveLocalNotificationSubject() + -void _configureSelectNotificationSubject() + -void _initNotificationsPlugin() + +dynamic handleNotificationResponse() - - - -dynamic _storeUserStudy() - -Widget _constructStatusIcon() - -String _getStatusText() - +Widget build() + + + + + + + + FlutterLocalNotificationsPlugin - - - + + + - - - JourneyOverviewScreen + + + BuildContext - - - - - + + + - - - _JourneyOverviewScreen + + + StreamController - - - +subject: StudySubject? + + + + + + + + + ReceivedNotification - - - +dynamic getConsentAndNavigateToDashboard() - +Widget build() + + + +id: int? + +title: String? + +body: String? + +payload: String? - - - - - + + + + + - - - Timeline + + + AppAnalytics - - - +subject: StudySubject? + + + <static>-_userEnabled: bool? + <static>+keyAnalyticsUserEnable: String + +context: BuildContext + +subject: StudySubject? + <static>+isUserEnabled: dynamic - - - +Widget build() + + + <static>+dynamic init() + <static>+dynamic start() + <static>+void setEnabled() + +dynamic initBasic() + +void initAdvanced() - - - - - + + + + + - - - InterventionTile + + + HtmlText - - - +title: String? - +iconName: String - +date: DateTime - +color: Color? - +isFirst: bool - +isLast: bool + + + +text: String? + +style: TextStyle? - - - +Widget build() + + + +Widget build() - - - - - - - - - IconIndicator - - - - - - +iconName: String - +color: Color? - - + + + - - - +Widget build() + + + TextStyle - - - - - + + + + - - - TimelineChild + + + ChoiceQuestionWidget - - - +child: Widget? + + + +question: ChoiceQuestion + +onDone: dynamic Function(Answer<dynamic>) + +multiSelectionText: String + +subtitle: String? - - - +Widget build() + + + + + + + + ChoiceQuestion - - - + + + - - - ConsentScreen + + + dynamic Function(Answer<dynamic>) - - - - - + + + + - - - ConsentCard + + + QuestionWidget - - - +consent: ConsentItem? - +index: int? - +onTapped: dynamic Function(int) - +isChecked: bool? + + + +subtitle: String? - - - +Widget build() + + + + + + + + + AnnotatedScaleQuestionWidget + + + + + + +question: AnnotatedScaleQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - + + + - - - ConsentItem + + + AnnotatedScaleQuestion - - - + + + - - - dynamic Function(int) + + + dynamic Function(Answer<dynamic>)? - - - - + + + + - - - ConsentElement + + + ScaleQuestionWidget - - - +title: String - +descriptionText: String - +acknowledgmentText: String - +icon: IconData + + + +question: ScaleQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - + + + - - - IconData + + + ScaleQuestion - - - - + + + + - - - EligibilityResult + + + VisualAnalogueQuestionWidget - - - +eligible: bool - +firstFailed: EligibilityCriterion? + + + +question: VisualAnalogueQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - + + + - - - EligibilityCriterion + + + VisualAnalogueQuestion - - - - - - - - - EligibilityScreen - - + + + + - - - +study: Study? + + + QuestionnaireWidget - - - <static>+MaterialPageRoute<EligibilityResult> routeFor() + + + +title: String? + +header: String? + +footer: String? + +questions: List<Question<dynamic>> - - - - - + + + + + - - - OnboardingProgress + + + HtmlTextBox - - - +stage: int - +progress: double + + + +text: String? - - - -double _getProgressForStage() - +Widget build() + + + +Widget build() - - - - + + + + - - - TaskOverview + + + BooleanQuestionWidget - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + +question: BooleanQuestion + +onDone: dynamic Function(Answer<dynamic>)? - - - - - - - - ProgressRow - - + + + - - - +subject: StudySubject? + + + BooleanQuestion - - - - - - - - - InterventionSegment - - + + + + - - - +intervention: Intervention - +percentCompleted: double - +percentMissed: double - +isCurrent: bool - +isFuture: bool - +phaseDuration: int + + + QuestionContainer - - - +List<Widget> buildSeparators() - +Widget build() + + + +onDone: dynamic Function(Answer<dynamic>, int) + +question: Question<dynamic> + +index: int - - - - + + + - - - TaskBox + + + dynamic Function(Answer<dynamic>, int) - - - +taskInstance: TaskInstance - +icon: Icon - +onCompleted: dynamic Function() + + + + + + + + Question - - - + + + + + - - - dynamic Function() + + + QuestionHeader - - - - + + + +prompt: String? + +subtitle: String? + +rationale: String? + + - - - Settings + + + -List<Widget> _buildSubtitle() + -List<Widget> _buildRationaleButton() + +Widget build() - - - - - + + + + + - - - OptOutAlertDialog + + + CustomSlider - - - +subject: StudySubject? + + + +value: double? + +minValue: double? + +maxValue: double? + +minorTick: int? + +onChanged: dynamic Function(double)? + +onChangeEnd: dynamic Function(double)? + +activeColor: Color? + +inactiveColor: Color? + +minColor: Color? + +maxColor: Color? + +thumbColor: Color? + +isColored: bool + +labelValuePrecision: int + +tickValuePrecision: int + +linearStep: bool + +steps: AnnotatedScaleQuestion? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - DeleteAlertDialog + + + dynamic Function(double)? - - - +subject: StudySubject? + + + + + + + + + CustomTrackShape - - - +Widget build() + + + +Rect getPreferredRect() - - - + + + - - - ContactScreen + + + RoundedRectSliderTrackShape - - - - - + + + + + - - - ContactWidget + + + StudyTile - - - +contact: Contact? - +title: String - +subtitle: String? - +color: Color + + + +title: String? + +description: String? + +iconName: String + +onTap: dynamic Function()? + +contentPadding: EdgeInsetsGeometry - - - +Widget build() + + + +Widget build() - - - + + + - - - Contact + + + EdgeInsetsGeometry - - - - - + + + + + - - - ContactItem + + + SelectableButton - - - +iconData: IconData - +itemName: String - +itemValue: String? - +type: ContactItemType? - +iconColor: Color? + + + +child: Widget + +selected: bool + +onTap: dynamic Function()? - - - +dynamic launchContact() - +Widget build() + + + -Color _getFillColor() + -Color _getTextColor() + +Widget build() - - - - + + + + + - - - ContactItemType + + + RoundCheckbox - - - +index: int - <static>+values: List<ContactItemType> - <static>+website: ContactItemType - <static>+email: ContactItemType - <static>+phone: ContactItemType + + + +onChanged: dynamic Function(bool)? + +value: bool? - - - - - - - - Enum + + + +Widget build() - - - - + + + - - - FAQ + + + dynamic Function(bool)? - - - +Widget build() + + + + + + + + + + InterventionCard - - - - - - - - - Entry + + + +intervention: Intervention + +selected: bool + +showCheckbox: bool + +showTasks: bool + +showDescription: bool + +onTap: dynamic Function()? - - - +title: String - +children: List<Entry> + + + +Widget build() - - - - - + + + + + - - - EntryItem + + + InterventionCardTitle - - - +entry: Entry + + + +intervention: Intervention? + +selected: bool + +showCheckbox: bool + +showDescriptionButton: bool + +onTap: dynamic Function()? - - - -Widget _buildTiles() - +Widget build() + + + +Widget build() - - - - - - - - DashboardScreen - - + + + + + - - - +error: String? + + + InterventionCardDescription - - - - - - - - - OverflowMenuItem + + + +intervention: Intervention - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +Widget build() - - - - - + + + + + - - - StudyFinishedPlaceholder + + + _TaskList - - - <static>+space: SizedBox + + + +tasks: List<InterventionTask> - - - +Widget build() + + + +String scheduleString() + +Widget build() - - - + + + + + - - - SizedBox + + + BottomOnboardingNavigation - - - - - - - - - MyApp + + + +onBack: void Function()? + +onNext: void Function()? + +backLabel: String? + +nextLabel: String? + +hideNext: bool + +nextIcon: Icon? + +backIcon: Icon? + +progress: Widget? - - - +queryParameters: Map<String, String> - +appConfig: AppConfig? + + + +Widget build() - - - + + + + - - - AppConfig + + + ThemeConfig + + + + + + <static>+SliderThemeData coloredSliderTheme() diff --git a/docs/uml/core/lib/src/models/tables/uml.svg b/docs/uml/core/lib/src/models/tables/uml.svg index b9ec232b4..b88c99600 100644 --- a/docs/uml/core/lib/src/models/tables/uml.svg +++ b/docs/uml/core/lib/src/models/tables/uml.svg @@ -1,148 +1,5 @@ - - [StudyInvite - | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> - | - +Map<String, dynamic> toJson() - ] - - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - - [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] - - [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] - - [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] - - [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] - - [Study + + [Study | <static>+tableName: String; <static>+baselineID: String; @@ -192,7 +49,8 @@ +bool canEdit(); <static>+dynamic fetchResultsCSVTable(); +bool isReadonly(); - +String toString() + +String toString(); + +int compareTo() ] [Study]o-[Participation] @@ -204,6 +62,7 @@ [Study]o-[Repo] [Study]o-[StudyStatus] [<abstract>SupabaseObjectFunctions]<:-[Study] + [Comparable]<:--[Study] [StudyStatus | @@ -240,302 +99,306 @@ [ResultSharing]o-[ResultSharing] [Enum]<:--[ResultSharing] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - StudyInvite - - - - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> - - - - - - +Map<String, dynamic> toJson() - - - - - - - - - - - SupabaseObjectFunctions - - - - - - - - - - - - - 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 - - - + [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] + + + + + + + + + + + + - - - - - - - - - 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 - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - + Study - + <static>+tableName: String <static>+baselineID: String @@ -579,45 +442,209 @@ - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() + + + +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() - - - + + + + - - - Stream + + + 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 @@ -632,7 +659,7 @@ - + +Map<String, dynamic> toJson() <static>+dynamic getAppConfig() @@ -641,185 +668,259 @@ - - - - - - - Contact - - - - - + - + StudyUAnalytics - - - - - + + + + + - - - Repo + + + SubjectProgress - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String - +gitUrl: String - +primaryKeys: Map<String, dynamic> + + + <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() + + + +Map<String, dynamic> toJson() + +SubjectProgress setStartDateBackBy() + +bool ==() - - - - + + + - - - GitProvider + + + Result - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider + + + + + + + + + + StudyInvite - - - - + + + <static>+tableName: String + +code: String + +studyId: String + +preselectedInterventionIds: List<String>? + +primaryKeys: Map<String, dynamic> + + - - - Enum + + + +Map<String, dynamic> toJson() - - - - + + + + + - - - Participation + + + StudyUUser - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation + + + <static>+tableName: String + +id: String + +email: String + +preferences: Preferences + +primaryKeys: Map<String, dynamic> + + + + + + +Map<String, dynamic> toJson() - - - - + + + + + - - - ResultSharing + + + Preferences - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing + + + +language: String + +pinnedStudies: Set<String> + + + + + + +Map<String, dynamic> toJson() - - - + + + + - - - StudyUQuestionnaire + + + GitProvider + + + + + + +index: int + <static>+values: List<GitProvider> + <static>+gitlab: GitProvider - - - + + + + + - - - StudySchedule + + + 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 + + - - - ReportSpecification + + + +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() - - - - + + + - - - StudyStatus + + + StreamController - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus + + + + + + + + Stream diff --git a/docs/uml/core/lib/src/models/uml.svg b/docs/uml/core/lib/src/models/uml.svg index ff4393eef..095b3594d 100644 --- a/docs/uml/core/lib/src/models/uml.svg +++ b/docs/uml/core/lib/src/models/uml.svg @@ -1,82 +1,99 @@ - - [<abstract>StudyResult + + [DataReference | - <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; - +id: String; - +filename: String + +task: String; + +property: String | +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +String toString(); + +Map<DateTime, T> retrieveFromResults() ] - [NumericResult + [AverageSection | - <static>+studyResultType: String; - +resultProperty: DataReference<num> + <static>+sectionType: String; + +aggregate: TemporalAggregation?; + +resultProperty: DataReference<num>? | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +Map<String, dynamic> toJson() ] - [NumericResult]o-[DataReference] - [<abstract>StudyResult]<:-[NumericResult] + [AverageSection]o-[TemporalAggregation] + [AverageSection]o-[DataReference] + [<abstract>ReportSection]<:-[AverageSection] - [InterventionResult + [LinearRegressionSection | - <static>+studyResultType: String + <static>+sectionType: String; + +resultProperty: DataReference<num>?; + +alpha: double; + +improvement: ImprovementDirection? | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +Map<String, dynamic> toJson() ] - [<abstract>StudyResult]<:-[InterventionResult] + [LinearRegressionSection]o-[DataReference] + [LinearRegressionSection]o-[ImprovementDirection] + [<abstract>ReportSection]<:-[LinearRegressionSection] - [<abstract>InterventionTask + [ImprovementDirection | - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> + +index: int; + <static>+values: List<ImprovementDirection>; + <static>+positive: ImprovementDirection; + <static>+negative: ImprovementDirection ] - [<abstract>Task]<:-[<abstract>InterventionTask] + [ImprovementDirection]o-[ImprovementDirection] + [Enum]<:--[ImprovementDirection] - [Intervention + [TemporalAggregation | - +id: String; - +name: String?; - +description: String?; - +icon: String; - +tasks: List<InterventionTask> + +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(); - +bool isBaseline() + +String toString() ] - [CheckmarkTask + [ReportSpecification]o-[<abstract>ReportSection] + + [<abstract>ReportSection | - <static>+taskType: String + <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +title: String?; + +description: String? | +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() + +String toString() ] - [<abstract>InterventionTask]<:-[CheckmarkTask] - - [<abstract>ValueExpression + [NotExpression | <static>+expressionType: String; - +target: String? + +expression: Expression | - +bool checkValue(); + +Map<String, dynamic> toJson(); +bool? evaluate() ] - [<abstract>Expression]<:-[<abstract>ValueExpression] + [NotExpression]o-[<abstract>Expression] + [<abstract>Expression]<:-[NotExpression] [BooleanExpression | @@ -88,28 +105,27 @@ [<abstract>ValueExpression]<:-[BooleanExpression] - [ChoiceExpression + [<abstract>ValueExpression | <static>+expressionType: String; - +choices: Set<dynamic> + +target: String? | - +Map<String, dynamic> toJson(); - +bool checkValue() + +bool checkValue(); + +bool? evaluate() ] - [<abstract>ValueExpression]<:-[ChoiceExpression] + [<abstract>Expression]<:-[<abstract>ValueExpression] - [NotExpression + [ChoiceExpression | <static>+expressionType: String; - +expression: Expression + +choices: Set<dynamic> | +Map<String, dynamic> toJson(); - +bool? evaluate() + +bool checkValue() ] - [NotExpression]o-[<abstract>Expression] - [<abstract>Expression]<:-[NotExpression] + [<abstract>ValueExpression]<:-[ChoiceExpression] [<abstract>Expression | @@ -122,354 +138,288 @@ +bool? evaluate() ] - [DataReference + [<abstract>StudyResult | - +task: String; - +property: String + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +filename: String | +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> retrieveFromResults() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [StudyInvite + [InterventionResult | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> + <static>+studyResultType: String | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] + [<abstract>StudyResult]<:-[InterventionResult] - [SubjectProgress + [NumericResult | - <static>+tableName: String; - +completedAt: DateTime?; - +subjectId: String; - +interventionId: String; - +taskId: String; - +resultType: String; - +result: Result<dynamic>; - +startedAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hashCode: int + <static>+studyResultType: String; + +resultProperty: DataReference<num> | +Map<String, dynamic> toJson(); - +SubjectProgress setStartDateBackBy(); - +bool ==() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [SubjectProgress]o-[Result] - [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + [NumericResult]o-[DataReference] + [<abstract>StudyResult]<:-[NumericResult] - [StudySubject + [ConsentItem | - <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 + +title: String?; + +description: String?; + +iconName: String | +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] - - [AppConfig + [QuestionConditional | - <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> + <static>+keyDefaultValue: String; + +defaultValue: V?; + +condition: Expression | - +Map<String, dynamic> toJson(); - <static>+dynamic getAppConfig(); - <static>+dynamic getAppContact() + <static>-QuestionConditional<V> _fromJson(); + +Map<String, dynamic> toJson() ] - [AppConfig]o-[Contact] - [AppConfig]o-[StudyUAnalytics] - [<abstract>SupabaseObjectFunctions]<:-[AppConfig] + [QuestionConditional]o-[<abstract>Expression] - [Repo + [<abstract>Question | - <static>+tableName: String; - +projectId: String; - +userId: String; - +studyId: String; - +provider: GitProvider; - +webUrl: String; - +gitUrl: String; - +primaryKeys: Map<String, dynamic> + <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() + +Map<String, dynamic> toJson(); + +bool shouldBeShown(); + +Answer<V>? getDefaultAnswer(); + +Type getAnswerType(); + +String toString() ] - [Repo]o-[GitProvider] - [<abstract>SupabaseObjectFunctions]<:-[Repo] + [<abstract>Question]o-[QuestionConditional] - [GitProvider + [ChoiceQuestion | - +index: int; - <static>+values: List<GitProvider>; - <static>+gitlab: GitProvider + <static>+questionType: String; + +multiple: bool; + +choices: List<Choice> + | + +Map<String, dynamic> toJson(); + +Answer<List<String>> constructAnswer() ] - [GitProvider]o-[GitProvider] - [Enum]<:--[GitProvider] + [<abstract>Question]<:-[ChoiceQuestion] - [Study + [Choice | - <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 + +text: String | +Map<String, dynamic> toJson(); - <static>+dynamic getResearcherDashboardStudies(); - <static>+dynamic publishedPublicStudies(); - +bool isOwner(); - +bool isEditor(); - +bool canEdit(); - <static>+dynamic fetchResultsCSVTable(); - +bool isReadonly(); +String toString() ] - [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] - - [StudyStatus + [BooleanQuestion | - +index: int; - <static>+values: List<StudyStatus>; - <static>+draft: StudyStatus; - <static>+running: StudyStatus; - <static>+closed: StudyStatus - ] - - [StudyStatus]o-[StudyStatus] - [Enum]<:--[StudyStatus] - - [Participation + <static>+questionType: String | - +index: int; - <static>+values: List<Participation>; - <static>+open: Participation; - <static>+invite: Participation + +Map<String, dynamic> toJson(); + +Answer<bool> constructAnswer() ] - [Participation]o-[Participation] - [Enum]<:--[Participation] + [<abstract>Question]<:-[BooleanQuestion] - [ResultSharing + [<abstract>SliderQuestion | - +index: int; - <static>+values: List<ResultSharing>; - <static>+public: ResultSharing; - <static>+private: ResultSharing; - <static>+organization: ResultSharing + +minimum: double; + +maximum: double; + -_initial: double; + +step: double; + +initial: double + | + +Answer<num> constructAnswer() ] - [ResultSharing]o-[ResultSharing] - [Enum]<:--[ResultSharing] + [<abstract>Question]<:-[<abstract>SliderQuestion] - [LinearRegressionSection + [ScaleQuestion | - <static>+sectionType: String; - +resultProperty: DataReference<num>?; - +alpha: double; - +improvement: ImprovementDirection? + <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() + +Map<String, dynamic> toJson(); + +Annotation addAnnotation(); + -void _setAnnotationLabel(); + <static>+int getAutostepSize(); + <static>+List<int> generateMidValues() ] - [LinearRegressionSection]o-[DataReference] - [LinearRegressionSection]o-[ImprovementDirection] - [<abstract>ReportSection]<:-[LinearRegressionSection] + [ScaleQuestion]o-[Annotation] + [<abstract>SliderQuestion]<:-[ScaleQuestion] + [AnnotatedScaleQuestion]<:--[ScaleQuestion] + [VisualAnalogueQuestion]<:--[ScaleQuestion] - [ImprovementDirection + [AnnotatedScaleQuestion | - +index: int; - <static>+values: List<ImprovementDirection>; - <static>+positive: ImprovementDirection; - <static>+negative: ImprovementDirection + <static>+questionType: String; + +annotations: List<Annotation> + | + +Map<String, dynamic> toJson() ] - [ImprovementDirection]o-[ImprovementDirection] - [Enum]<:--[ImprovementDirection] + [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] - [AverageSection + [Annotation | - <static>+sectionType: String; - +aggregate: TemporalAggregation?; - +resultProperty: DataReference<num>? + +value: int; + +annotation: String | +Map<String, dynamic> toJson() ] - [AverageSection]o-[TemporalAggregation] - [AverageSection]o-[DataReference] - [<abstract>ReportSection]<:-[AverageSection] - - [TemporalAggregation + [VisualAnalogueQuestion | - +index: int; - <static>+values: List<TemporalAggregation>; - <static>+day: TemporalAggregation; - <static>+phase: TemporalAggregation; - <static>+intervention: TemporalAggregation + <static>+questionType: String; + +minimumColor: int; + +maximumColor: int; + +minimumAnnotation: String; + +maximumAnnotation: String + | + +Map<String, dynamic> toJson() ] - [TemporalAggregation]o-[TemporalAggregation] - [Enum]<:--[TemporalAggregation] + [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] - [ReportSpecification + [Answer | - +primary: ReportSection?; - +secondary: List<ReportSection> + +question: String; + +timestamp: DateTime; + <static>+keyResponse: String; + +response: V | +Map<String, dynamic> toJson(); + <static>+Answer<dynamic> fromJson(); +String toString() ] - [ReportSpecification]o-[<abstract>ReportSection] + [StudyUQuestionnaire + | + +questions: List<Question<dynamic>> + | + +List<dynamic> toJson() + ] - [<abstract>ReportSection + [EligibilityCriterion | - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; +id: String; - +title: String?; - +description: String? + +reason: String?; + +condition: Expression | +Map<String, dynamic> toJson(); - +String toString() + +bool isSatisfied(); + +bool isViolated() ] - [ConsentItem + [EligibilityCriterion]o-[<abstract>Expression] + + [StudySchedule | - +id: String; - +title: String?; - +description: String?; - +iconName: String + <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() ] - [Result + [StudySchedule]o-[PhaseSequence] + + [PhaseSequence | - <static>+keyType: String; - +type: String; - +periodId: String?; - <static>+keyResult: String; - +result: T + +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(); - <static>-Result<dynamic> _fromJson() + +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>; @@ -535,200 +485,305 @@ [<abstract>Task]o-[Schedule] - [Contact + [Result | - +organization: String; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String; - +website: String; - +phone: String; - +additionalInfo: String? + <static>+keyType: String; + +type: String; + +periodId: String?; + <static>+keyResult: String; + +result: T | +Map<String, dynamic> toJson(); - +String toString() + <static>-Result<dynamic> _fromJson() ] - [Answer + [Study | - +question: String; - +timestamp: DateTime; - <static>+keyResponse: String; - +response: V + <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>+Answer<dynamic> fromJson(); - +String toString() + <static>+dynamic getResearcherDashboardStudies(); + <static>+dynamic publishedPublicStudies(); + +bool isOwner(); + +bool isEditor(); + +bool canEdit(); + <static>+dynamic fetchResultsCSVTable(); + +bool isReadonly(); + +String toString(); + +int compareTo() ] - [QuestionConditional - | - <static>+keyDefaultValue: String; - +defaultValue: V?; - +condition: Expression + [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 | - <static>-QuestionConditional<V> _fromJson(); - +Map<String, dynamic> toJson() + +index: int; + <static>+values: List<StudyStatus>; + <static>+draft: StudyStatus; + <static>+running: StudyStatus; + <static>+closed: StudyStatus ] - [QuestionConditional]o-[<abstract>Expression] + [StudyStatus]o-[StudyStatus] + [Enum]<:--[StudyStatus] - [StudyUQuestionnaire + [Participation | - +questions: List<Question<dynamic>> + +index: int; + <static>+values: List<Participation>; + <static>+open: Participation; + <static>+invite: Participation + ] + + [Participation]o-[Participation] + [Enum]<:--[Participation] + + [ResultSharing | - +List<dynamic> toJson() + +index: int; + <static>+values: List<ResultSharing>; + <static>+public: ResultSharing; + <static>+private: ResultSharing; + <static>+organization: ResultSharing ] - [ChoiceQuestion + [ResultSharing]o-[ResultSharing] + [Enum]<:--[ResultSharing] + + [AppConfig | - <static>+questionType: String; - +multiple: bool; - +choices: List<Choice> + <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(); - +Answer<List<String>> constructAnswer() + <static>+dynamic getAppConfig(); + <static>+dynamic getAppContact() ] - [<abstract>Question]<:-[ChoiceQuestion] + [AppConfig]o-[Contact] + [AppConfig]o-[StudyUAnalytics] + [<abstract>SupabaseObjectFunctions]<:-[AppConfig] - [Choice + [SubjectProgress | - +id: String; - +text: String + <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(); - +String toString() + +SubjectProgress setStartDateBackBy(); + +bool ==() ] - [<abstract>SliderQuestion + [SubjectProgress]o-[Result] + [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + + [StudyInvite | - +minimum: double; - +maximum: double; - -_initial: double; - +step: double; - +initial: double + <static>+tableName: String; + +code: String; + +studyId: String; + +preselectedInterventionIds: List<String>?; + +primaryKeys: Map<String, dynamic> | - +Answer<num> constructAnswer() + +Map<String, dynamic> toJson() ] - [<abstract>Question]<:-[<abstract>SliderQuestion] + [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - [AnnotatedScaleQuestion + [StudyUUser | - <static>+questionType: String; - +annotations: List<Annotation> + <static>+tableName: String; + +id: String; + +email: String; + +preferences: Preferences; + +primaryKeys: Map<String, dynamic> | +Map<String, dynamic> toJson() ] - [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] + [StudyUUser]o-[Preferences] + [<abstract>SupabaseObjectFunctions]<:-[StudyUUser] - [Annotation + [Preferences | - +value: int; - +annotation: String + +language: String; + +pinnedStudies: Set<String> | +Map<String, dynamic> toJson() ] - [ScaleQuestion + [Repo | - <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 + <static>+tableName: String; + +projectId: String; + +userId: String; + +studyId: String; + +provider: GitProvider; + +webUrl: String?; + +gitUrl: String?; + +primaryKeys: Map<String, dynamic> | - +Map<String, dynamic> toJson(); - +Annotation addAnnotation(); - -void _setAnnotationLabel(); - <static>+int getAutostepSize(); - <static>+List<int> generateMidValues() + +Map<String, dynamic> toJson() ] - [ScaleQuestion]o-[Annotation] - [<abstract>SliderQuestion]<:-[ScaleQuestion] - [AnnotatedScaleQuestion]<:--[ScaleQuestion] - [VisualAnalogueQuestion]<:--[ScaleQuestion] + [Repo]o-[GitProvider] + [<abstract>SupabaseObjectFunctions]<:-[Repo] - [VisualAnalogueQuestion - | - <static>+questionType: String; - +minimumColor: int; - +maximumColor: int; - +minimumAnnotation: String; - +maximumAnnotation: String + [GitProvider | - +Map<String, dynamic> toJson() + +index: int; + <static>+values: List<GitProvider>; + <static>+gitlab: GitProvider ] - [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] + [GitProvider]o-[GitProvider] + [Enum]<:--[GitProvider] - [BooleanQuestion + [StudySubject | - <static>+questionType: String + <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(); - +Answer<bool> constructAnswer() + +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() ] - [<abstract>Question]<:-[BooleanQuestion] + [StudySubject]o-[StreamController] + [StudySubject]o-[Study] + [StudySubject]o-[Stream] + [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - [<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>? + [<abstract>InterventionTask | - +Map<String, dynamic> toJson(); - +bool shouldBeShown(); - +Answer<V>? getDefaultAnswer(); - +Type getAnswerType(); - +String toString() + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> ] - [<abstract>Question]o-[QuestionConditional] + [<abstract>Task]<:-[<abstract>InterventionTask] - [EligibilityCriterion + [Intervention | +id: String; - +reason: String?; - +condition: Expression + +name: String?; + +description: String?; + +icon: String; + +tasks: List<InterventionTask> | +Map<String, dynamic> toJson(); - +bool isSatisfied(); - +bool isViolated() + +bool isBaseline() ] - [EligibilityCriterion]o-[<abstract>Expression] - - [QuestionnaireTask + [CheckmarkTask | - <static>+taskType: String; - +questions: StudyUQuestionnaire + <static>+taskType: String | +Map<String, dynamic> toJson(); +Map<DateTime, T> extractPropertyResults(); @@ -736,381 +791,301 @@ +String? getHumanReadablePropertyName() ] - [QuestionnaireTask]o-[StudyUQuestionnaire] - [<abstract>Observation]<:-[QuestionnaireTask] - - [<abstract>Observation - | - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - ] - - [<abstract>Task]<:-[<abstract>Observation] + [<abstract>InterventionTask]<:-[CheckmarkTask] - [StudySchedule + [Contact | - <static>+numberOfInterventions: int; - +numberOfCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +sequence: PhaseSequence; - +sequenceCustom: String; - +length: int; - +nameOfSequence: String + +organization: String; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String; + +website: String; + +phone: String; + +additionalInfo: 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 + +String toString() ] - [PhaseSequence]o-[PhaseSequence] - [Enum]<:--[PhaseSequence] - - + - + - - - - - - - - - - - - - - - - - + + + - + - - - - - + + + - + - - - + - + - + + + - + + + + - + + - + + + + - - - + + - + - + + + + + + + + + + + + + + + - + - - - + + + - + - - - + - + + + + + + + + + + + + + - + - - + + + + + + + + + + - + - + - + - + - + - - - + + - + + - + - + + + + + - + - + - + - + - + - - - + - - - - + - - + - + - - - - - + - - - - + - - + - + - + - + - - - + - + - - - - - + - + - + - + - - - + - + + + - - - - - - + - + + - + - - - + + - + + - + - - - + + - + + - - - - - - - - - - - + - - - + - - - - - - - - - - + + + + + + - + - + + + - + - + + + + + - + - - - - - + + + - + - + + + - + - + - - - - - - - - - - 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() - - - + + + + - - - - - - - - - NumericResult - - - - - - <static>+studyResultType: String - +resultProperty: DataReference<num> - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - + + + + + + + + + + + + + - - - + + + - + DataReference - + +task: String +property: String - + +Map<String, dynamic> toJson() +String toString() @@ -1119,184 +1094,213 @@ - - - - - + + + + + - - - InterventionResult + + + AverageSection - - - <static>+studyResultType: String + + + <static>+sectionType: String + +aggregate: TemporalAggregation? + +resultProperty: DataReference<num>? - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() + + + +Map<String, dynamic> toJson() - - - - + + + + - - - InterventionTask + + + TemporalAggregation - - - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> + + + +index: int + <static>+values: List<TemporalAggregation> + <static>+day: TemporalAggregation + <static>+phase: TemporalAggregation + <static>+intervention: TemporalAggregation - - - - - + + + + + - - - Task + + + ReportSection - - - <static>+keyType: String - +type: String - +id: String - +title: String? - +header: String? - +footer: String? - +schedule: Schedule + + + <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() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - Intervention + + + LinearRegressionSection - - - +id: String - +name: String? - +description: String? - +icon: String - +tasks: List<InterventionTask> + + + <static>+sectionType: String + +resultProperty: DataReference<num>? + +alpha: double + +improvement: ImprovementDirection? - - - +Map<String, dynamic> toJson() - +bool isBaseline() + + + +Map<String, dynamic> toJson() - - - - - + + + + - - - CheckmarkTask + + + ImprovementDirection - - - <static>+taskType: String + + + +index: int + <static>+values: List<ImprovementDirection> + <static>+positive: ImprovementDirection + <static>+negative: ImprovementDirection - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + + + + + + Enum - - - - - + + + + + - - - ValueExpression + + + ReportSpecification - - - <static>+expressionType: String - +target: String? + + + +primary: ReportSection? + +secondary: List<ReportSection> - - - +bool checkValue() - +bool? evaluate() + + + +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 @@ -1304,7 +1308,7 @@ - + +Map<String, dynamic> toJson() +String toString() @@ -1315,50 +1319,77 @@ - - - + + + - + BooleanExpression - + <static>+expressionType: String - - - +Map<String, dynamic> toJson() - +bool checkValue() + + + +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() @@ -1366,529 +1397,522 @@ - - - - - + + + + + - - - NotExpression + + + StudyResult - - - <static>+expressionType: String - +expression: Expression + + + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String + +id: String + +filename: String - - - +Map<String, dynamic> toJson() - +bool? evaluate() + + + +Map<String, dynamic> toJson() + +List<String> getHeaders() + +List<dynamic> getValues() - - - - - - - - - StudyInvite - - + + + + + - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> + + + InterventionResult - - - +Map<String, dynamic> toJson() + + + <static>+studyResultType: String - - - - - - - - SupabaseObjectFunctions + + + +Map<String, dynamic> toJson() + +List<String> getHeaders() + +List<dynamic> getValues() - - - - - + + + + + - - - SubjectProgress + + + NumericResult - - - <static>+tableName: String - +completedAt: DateTime? - +subjectId: String - +interventionId: String - +taskId: String - +resultType: String - +result: Result<dynamic> - +startedAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hashCode: int + + + <static>+studyResultType: String + +resultProperty: DataReference<num> - - - +Map<String, dynamic> toJson() - +SubjectProgress setStartDateBackBy() - +bool ==() + + + +Map<String, dynamic> toJson() + +List<String> getHeaders() + +List<dynamic> getValues() - - - - - + + + + + - - - Result + + + ConsentItem - - - <static>+keyType: String - +type: String - +periodId: String? - <static>+keyResult: String - +result: T + + + +id: String + +title: String? + +description: String? + +iconName: String - - - +Map<String, dynamic> toJson() - <static>-Result<dynamic> _fromJson() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - StudySubject + + + QuestionConditional - - - <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 + + + <static>+keyDefaultValue: String + +defaultValue: V? + +condition: Expression - - - +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() + + + <static>-QuestionConditional<V> _fromJson() + +Map<String, dynamic> toJson() - - - + + + + + - - - StreamController + + + Question - - - - - - - - - - Study + + + <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>? - - - <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() + +bool shouldBeShown() + +Answer<V>? getDefaultAnswer() + +Type getAnswerType() + +String toString() - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() + + + + + + + + + + ChoiceQuestion - - - - + + + <static>+questionType: String + +multiple: bool + +choices: List<Choice> + + - - - Stream + + + +Map<String, dynamic> toJson() + +Answer<List<String>> constructAnswer() - - - - - + + + + + - - - AppConfig + + + Choice - - - <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> + + + +id: String + +text: String - - - +Map<String, dynamic> toJson() - <static>+dynamic getAppConfig() - <static>+dynamic getAppContact() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - Contact + + + BooleanQuestion - - - +organization: String - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String - +website: String - +phone: String - +additionalInfo: String? + + + <static>+questionType: String - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + +Answer<bool> constructAnswer() - - - + + + + + - - - StudyUAnalytics + + + SliderQuestion + + + + + + +minimum: double + +maximum: double + -_initial: double + +step: double + +initial: double + + + + + + +Answer<num> constructAnswer() - - - - - + + + + + - - - Repo + + + ScaleQuestion - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String - +gitUrl: String - +primaryKeys: Map<String, dynamic> + + + <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() + + + +Map<String, dynamic> toJson() + +Annotation addAnnotation() + -void _setAnnotationLabel() + <static>+int getAutostepSize() + <static>+List<int> generateMidValues() - - - - + + + + + - - - GitProvider + + + Annotation - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider + + + +value: int + +annotation: String + + + + + + +Map<String, dynamic> toJson() - - - + + + + + - - - Enum + + + AnnotatedScaleQuestion + + + + + + <static>+questionType: String + +annotations: List<Annotation> + + + + + + +Map<String, dynamic> toJson() - - - - + + + + + - - - Participation + + + VisualAnalogueQuestion - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation + + + <static>+questionType: String + +minimumColor: int + +maximumColor: int + +minimumAnnotation: String + +maximumAnnotation: String + + + + + + +Map<String, dynamic> toJson() - - - - + + + + + - - - ResultSharing + + + Answer - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing + + + +question: String + +timestamp: DateTime + <static>+keyResponse: String + +response: V + + + + + + +Map<String, dynamic> toJson() + <static>+Answer<dynamic> fromJson() + +String toString() - - - + + + - + StudyUQuestionnaire - - - +questions: List<Question<dynamic>> + + + +questions: List<Question<dynamic>> + + + + + + +List<dynamic> toJson() + + + + + + + + + + + + + EligibilityCriterion + + + + + + +id: String + +reason: String? + +condition: Expression - - - +List<dynamic> toJson() + + + +Map<String, dynamic> toJson() + +bool isSatisfied() + +bool isViolated() - - - + + + - + StudySchedule - + <static>+numberOfInterventions: int +numberOfCycles: int @@ -1901,7 +1925,7 @@ - + +Map<String, dynamic> toJson() +int getNumberOfPhases() @@ -1917,755 +1941,832 @@ - - - - - + + + + - - - ReportSpecification + + + PhaseSequence - - - +primary: ReportSection? - +secondary: List<ReportSection> + + + +index: int + <static>+values: List<PhaseSequence> + <static>+alternating: PhaseSequence + <static>+counterBalanced: PhaseSequence + <static>+randomized: PhaseSequence + <static>+customized: PhaseSequence - - - +Map<String, dynamic> toJson() - +String toString() + + + + + + + + + + QuestionnaireTask + + + + + + <static>+taskType: String + +questions: StudyUQuestionnaire + + + + + + +Map<String, dynamic> toJson() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - + + + + - - - StudyStatus + + + Observation - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus + + + <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - - - - - + + + + + - - - LinearRegressionSection + + + Task - - - <static>+sectionType: String - +resultProperty: DataReference<num>? - +alpha: double - +improvement: ImprovementDirection? + + + <static>+keyType: String + +type: String + +id: String + +title: String? + +header: String? + +footer: String? + +schedule: Schedule - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +String toString() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - + + + + + - - - ImprovementDirection + + + Schedule - - - +index: int - <static>+values: List<ImprovementDirection> - <static>+positive: ImprovementDirection - <static>+negative: ImprovementDirection + + + +completionPeriods: List<CompletionPeriod> + +reminders: List<StudyUTimeOfDay> + + + + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - ReportSection + + + CompletionPeriod - - - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +title: String? - +description: String? + + + +id: String + +unlockTime: StudyUTimeOfDay + +lockTime: StudyUTimeOfDay - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + +String formatted() + +String toString() + +bool contains() - - - - - + + + + + - - - AverageSection + + + StudyUTimeOfDay - - - <static>+sectionType: String - +aggregate: TemporalAggregation? - +resultProperty: DataReference<num>? + + + +hour: int + +minute: int - - - +Map<String, dynamic> toJson() + + + +String toJson() + +String toString() + +bool earlierThan() - - - - + + + + + - - - TemporalAggregation + + + TaskInstance - - - +index: int - <static>+values: List<TemporalAggregation> - <static>+day: TemporalAggregation - <static>+phase: TemporalAggregation - <static>+intervention: TemporalAggregation + + + +task: Task + +id: String + +completionPeriod: CompletionPeriod + + + + + + <static>-Task _taskFromStudy() + <static>-Task _taskFromSubject() - - - - - + + + + + - - - ConsentItem + + + Result - - - +id: String - +title: String? - +description: String? - +iconName: String + + + <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() - +String toString() + + + +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() - - - - - - - - - Schedule - - + + + + - - - +completionPeriods: List<CompletionPeriod> - +reminders: List<StudyUTimeOfDay> + + + Participation - - - +Map<String, dynamic> toJson() - +String toString() + + + +index: int + <static>+values: List<Participation> + <static>+open: Participation + <static>+invite: Participation - - - - - - - - - CompletionPeriod - - + + + + - - - +id: String - +unlockTime: StudyUTimeOfDay - +lockTime: StudyUTimeOfDay + + + ResultSharing - - - +Map<String, dynamic> toJson() - +String formatted() - +String toString() - +bool contains() + + + +index: int + <static>+values: List<ResultSharing> + <static>+public: ResultSharing + <static>+private: ResultSharing + <static>+organization: ResultSharing - - - - - + + + + + - - - StudyUTimeOfDay + + + Contact - - - +hour: int - +minute: int + + + +organization: String + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String + +website: String + +phone: String + +additionalInfo: String? - - - +String toJson() - +String toString() - +bool earlierThan() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - TaskInstance + + + Repo - - - +task: Task - +id: String - +completionPeriod: CompletionPeriod + + + <static>+tableName: String + +projectId: String + +userId: String + +studyId: String + +provider: GitProvider + +webUrl: String? + +gitUrl: String? + +primaryKeys: Map<String, dynamic> - - - <static>-Task _taskFromStudy() - <static>-Task _taskFromSubject() + + + +Map<String, dynamic> toJson() - - - - - - - - - Answer - - + + + + - - - +question: String - +timestamp: DateTime - <static>+keyResponse: String - +response: V + + + StudyStatus - - - +Map<String, dynamic> toJson() - <static>+Answer<dynamic> fromJson() - +String toString() + + + +index: int + <static>+values: List<StudyStatus> + <static>+draft: StudyStatus + <static>+running: StudyStatus + <static>+closed: StudyStatus - - - - - + + + - - - QuestionConditional + + + SupabaseObjectFunctions - - - <static>+keyDefaultValue: String - +defaultValue: V? - +condition: Expression - - + + + + - - - <static>-QuestionConditional<V> _fromJson() - +Map<String, dynamic> toJson() + + + Comparable - - - - - + + + + + - - - ChoiceQuestion + + + AppConfig - - - <static>+questionType: String - +multiple: bool - +choices: List<Choice> + + + <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() - +Answer<List<String>> constructAnswer() + + + +Map<String, dynamic> toJson() + <static>+dynamic getAppConfig() + <static>+dynamic getAppContact() - - - - - - - - - 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() + + + StudyUAnalytics - - - - - + + + + + - - - Choice + + + SubjectProgress - - - +id: String - +text: String + + + <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() - +String toString() + + + +Map<String, dynamic> toJson() + +SubjectProgress setStartDateBackBy() + +bool ==() - - - - - + + + + + - - - SliderQuestion + + + StudyInvite - - - +minimum: double - +maximum: double - -_initial: double - +step: double - +initial: double + + + <static>+tableName: String + +code: String + +studyId: String + +preselectedInterventionIds: List<String>? + +primaryKeys: Map<String, dynamic> - - - +Answer<num> constructAnswer() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - AnnotatedScaleQuestion + + + StudyUUser - - - <static>+questionType: String - +annotations: List<Annotation> + + + <static>+tableName: String + +id: String + +email: String + +preferences: Preferences + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Annotation + + + Preferences - - - +value: int - +annotation: String + + + +language: String + +pinnedStudies: Set<String> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() - - - - - - - - - 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 + + + GitProvider - - - +Map<String, dynamic> toJson() - +Annotation addAnnotation() - -void _setAnnotationLabel() - <static>+int getAutostepSize() - <static>+List<int> generateMidValues() + + + +index: int + <static>+values: List<GitProvider> + <static>+gitlab: GitProvider - - - - - + + + + + - - - VisualAnalogueQuestion + + + StudySubject - - - <static>+questionType: String - +minimumColor: int - +maximumColor: int - +minimumAnnotation: String - +maximumAnnotation: String + + + <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() + + + +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() - - - - - + + + - - - BooleanQuestion + + + StreamController - - - <static>+questionType: String - - + + + + - - - +Map<String, dynamic> toJson() - +Answer<bool> constructAnswer() + + + Stream - - - - - - - - - EligibilityCriterion - - + + + + - - - +id: String - +reason: String? - +condition: Expression + + + InterventionTask - - - +Map<String, dynamic> toJson() - +bool isSatisfied() - +bool isViolated() + + + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - + + + + + - - - QuestionnaireTask + + + Intervention - - - <static>+taskType: String - +questions: StudyUQuestionnaire + + + +id: String + +name: String? + +description: String? + +icon: String + +tasks: List<InterventionTask> - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + +Map<String, dynamic> toJson() + +bool isBaseline() - - - - - - - - Observation - - + + + + + - - - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> + + + CheckmarkTask - - - - - - - - - PhaseSequence + + + <static>+taskType: String - - - +index: int - <static>+values: List<PhaseSequence> - <static>+alternating: PhaseSequence - <static>+counterBalanced: PhaseSequence - <static>+randomized: PhaseSequence - <static>+customized: PhaseSequence + + + +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 dba4d6ea2..2e673cef6 100644 --- a/docs/uml/core/lib/src/uml.svg +++ b/docs/uml/core/lib/src/uml.svg @@ -1,134 +1,99 @@ - - [<abstract>SupabaseObject + + [DataReference | - +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> + +task: String; + +property: String | - <static>+void init(); - <static>+void dispose(); - <static>+dynamic captureEvent(); - <static>+dynamic captureException(); - <static>+dynamic captureMessage(); - <static>+void addBreadcrumb() + +Map<String, dynamic> toJson(); + +String toString(); + +Map<DateTime, T> retrieveFromResults() ] - [Analytics]o-[Logger] - [Analytics]o-[StreamSubscription] - - [StudyUAnalytics + [AverageSection | - +enabled: bool; - +dsn: String; - +samplingRate: double?; - <static>+keyStudyUAnalytics: String + <static>+sectionType: String; + +aggregate: TemporalAggregation?; + +resultProperty: DataReference<num>? | +Map<String, dynamic> toJson() ] - [<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() - ] + [AverageSection]o-[TemporalAggregation] + [AverageSection]o-[DataReference] + [<abstract>ReportSection]<:-[AverageSection] - [NumericResult + [LinearRegressionSection | - <static>+studyResultType: String; - +resultProperty: DataReference<num> + <static>+sectionType: String; + +resultProperty: DataReference<num>?; + +alpha: double; + +improvement: ImprovementDirection? | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +Map<String, dynamic> toJson() ] - [NumericResult]o-[DataReference] - [<abstract>StudyResult]<:-[NumericResult] + [LinearRegressionSection]o-[DataReference] + [LinearRegressionSection]o-[ImprovementDirection] + [<abstract>ReportSection]<:-[LinearRegressionSection] - [InterventionResult - | - <static>+studyResultType: String + [ImprovementDirection | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +index: int; + <static>+values: List<ImprovementDirection>; + <static>+positive: ImprovementDirection; + <static>+negative: ImprovementDirection ] - [<abstract>StudyResult]<:-[InterventionResult] + [ImprovementDirection]o-[ImprovementDirection] + [Enum]<:--[ImprovementDirection] - [<abstract>InterventionTask + [TemporalAggregation | - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> + +index: int; + <static>+values: List<TemporalAggregation>; + <static>+day: TemporalAggregation; + <static>+phase: TemporalAggregation; + <static>+intervention: TemporalAggregation ] - [<abstract>Task]<:-[<abstract>InterventionTask] + [TemporalAggregation]o-[TemporalAggregation] + [Enum]<:--[TemporalAggregation] - [Intervention + [ReportSpecification | - +id: String; - +name: String?; - +description: String?; - +icon: String; - +tasks: List<InterventionTask> + +primary: ReportSection?; + +secondary: List<ReportSection> | +Map<String, dynamic> toJson(); - +bool isBaseline() + +String toString() ] - [CheckmarkTask + [ReportSpecification]o-[<abstract>ReportSection] + + [<abstract>ReportSection | - <static>+taskType: String + <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +title: String?; + +description: String? | +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() + +String toString() ] - [<abstract>InterventionTask]<:-[CheckmarkTask] - - [<abstract>ValueExpression + [NotExpression | <static>+expressionType: String; - +target: String? + +expression: Expression | - +bool checkValue(); + +Map<String, dynamic> toJson(); +bool? evaluate() ] - [<abstract>Expression]<:-[<abstract>ValueExpression] + [NotExpression]o-[<abstract>Expression] + [<abstract>Expression]<:-[NotExpression] [BooleanExpression | @@ -140,28 +105,27 @@ [<abstract>ValueExpression]<:-[BooleanExpression] - [ChoiceExpression + [<abstract>ValueExpression | <static>+expressionType: String; - +choices: Set<dynamic> + +target: String? | - +Map<String, dynamic> toJson(); - +bool checkValue() + +bool checkValue(); + +bool? evaluate() ] - [<abstract>ValueExpression]<:-[ChoiceExpression] + [<abstract>Expression]<:-[<abstract>ValueExpression] - [NotExpression + [ChoiceExpression | <static>+expressionType: String; - +expression: Expression + +choices: Set<dynamic> | +Map<String, dynamic> toJson(); - +bool? evaluate() + +bool checkValue() ] - [NotExpression]o-[<abstract>Expression] - [<abstract>Expression]<:-[NotExpression] + [<abstract>ValueExpression]<:-[ChoiceExpression] [<abstract>Expression | @@ -174,354 +138,288 @@ +bool? evaluate() ] - [DataReference + [<abstract>StudyResult | - +task: String; - +property: String + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +filename: String | +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> retrieveFromResults() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [StudyInvite + [InterventionResult | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> + <static>+studyResultType: String | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] + [<abstract>StudyResult]<:-[InterventionResult] - [SubjectProgress + [NumericResult | - <static>+tableName: String; - +completedAt: DateTime?; - +subjectId: String; - +interventionId: String; - +taskId: String; - +resultType: String; - +result: Result<dynamic>; - +startedAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hashCode: int + <static>+studyResultType: String; + +resultProperty: DataReference<num> | +Map<String, dynamic> toJson(); - +SubjectProgress setStartDateBackBy(); - +bool ==() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [SubjectProgress]o-[Result] - [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + [NumericResult]o-[DataReference] + [<abstract>StudyResult]<:-[NumericResult] - [StudySubject + [ConsentItem | - <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 + +title: String?; + +description: String?; + +iconName: String | +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] - - [AppConfig + [QuestionConditional | - <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> + <static>+keyDefaultValue: String; + +defaultValue: V?; + +condition: Expression | - +Map<String, dynamic> toJson(); - <static>+dynamic getAppConfig(); - <static>+dynamic getAppContact() + <static>-QuestionConditional<V> _fromJson(); + +Map<String, dynamic> toJson() ] - [AppConfig]o-[Contact] - [AppConfig]o-[StudyUAnalytics] - [<abstract>SupabaseObjectFunctions]<:-[AppConfig] + [QuestionConditional]o-[<abstract>Expression] - [Repo + [<abstract>Question | - <static>+tableName: String; - +projectId: String; - +userId: String; - +studyId: String; - +provider: GitProvider; - +webUrl: String; - +gitUrl: String; - +primaryKeys: Map<String, dynamic> + <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() + +Map<String, dynamic> toJson(); + +bool shouldBeShown(); + +Answer<V>? getDefaultAnswer(); + +Type getAnswerType(); + +String toString() ] - [Repo]o-[GitProvider] - [<abstract>SupabaseObjectFunctions]<:-[Repo] + [<abstract>Question]o-[QuestionConditional] - [GitProvider + [ChoiceQuestion | - +index: int; - <static>+values: List<GitProvider>; - <static>+gitlab: GitProvider + <static>+questionType: String; + +multiple: bool; + +choices: List<Choice> + | + +Map<String, dynamic> toJson(); + +Answer<List<String>> constructAnswer() ] - [GitProvider]o-[GitProvider] - [Enum]<:--[GitProvider] + [<abstract>Question]<:-[ChoiceQuestion] - [Study + [Choice | - <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 + +text: String | +Map<String, dynamic> toJson(); - <static>+dynamic getResearcherDashboardStudies(); - <static>+dynamic publishedPublicStudies(); - +bool isOwner(); - +bool isEditor(); - +bool canEdit(); - <static>+dynamic fetchResultsCSVTable(); - +bool isReadonly(); +String toString() ] - [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] - - [StudyStatus + [BooleanQuestion | - +index: int; - <static>+values: List<StudyStatus>; - <static>+draft: StudyStatus; - <static>+running: StudyStatus; - <static>+closed: StudyStatus - ] - - [StudyStatus]o-[StudyStatus] - [Enum]<:--[StudyStatus] - - [Participation + <static>+questionType: String | - +index: int; - <static>+values: List<Participation>; - <static>+open: Participation; - <static>+invite: Participation + +Map<String, dynamic> toJson(); + +Answer<bool> constructAnswer() ] - [Participation]o-[Participation] - [Enum]<:--[Participation] + [<abstract>Question]<:-[BooleanQuestion] - [ResultSharing + [<abstract>SliderQuestion | - +index: int; - <static>+values: List<ResultSharing>; - <static>+public: ResultSharing; - <static>+private: ResultSharing; - <static>+organization: ResultSharing + +minimum: double; + +maximum: double; + -_initial: double; + +step: double; + +initial: double + | + +Answer<num> constructAnswer() ] - [ResultSharing]o-[ResultSharing] - [Enum]<:--[ResultSharing] + [<abstract>Question]<:-[<abstract>SliderQuestion] - [LinearRegressionSection + [ScaleQuestion | - <static>+sectionType: String; - +resultProperty: DataReference<num>?; - +alpha: double; - +improvement: ImprovementDirection? + <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() + +Map<String, dynamic> toJson(); + +Annotation addAnnotation(); + -void _setAnnotationLabel(); + <static>+int getAutostepSize(); + <static>+List<int> generateMidValues() ] - [LinearRegressionSection]o-[DataReference] - [LinearRegressionSection]o-[ImprovementDirection] - [<abstract>ReportSection]<:-[LinearRegressionSection] + [ScaleQuestion]o-[Annotation] + [<abstract>SliderQuestion]<:-[ScaleQuestion] + [AnnotatedScaleQuestion]<:--[ScaleQuestion] + [VisualAnalogueQuestion]<:--[ScaleQuestion] - [ImprovementDirection + [AnnotatedScaleQuestion | - +index: int; - <static>+values: List<ImprovementDirection>; - <static>+positive: ImprovementDirection; - <static>+negative: ImprovementDirection + <static>+questionType: String; + +annotations: List<Annotation> + | + +Map<String, dynamic> toJson() ] - [ImprovementDirection]o-[ImprovementDirection] - [Enum]<:--[ImprovementDirection] + [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] - [AverageSection + [Annotation | - <static>+sectionType: String; - +aggregate: TemporalAggregation?; - +resultProperty: DataReference<num>? + +value: int; + +annotation: String | +Map<String, dynamic> toJson() ] - [AverageSection]o-[TemporalAggregation] - [AverageSection]o-[DataReference] - [<abstract>ReportSection]<:-[AverageSection] - - [TemporalAggregation + [VisualAnalogueQuestion | - +index: int; - <static>+values: List<TemporalAggregation>; - <static>+day: TemporalAggregation; - <static>+phase: TemporalAggregation; - <static>+intervention: TemporalAggregation + <static>+questionType: String; + +minimumColor: int; + +maximumColor: int; + +minimumAnnotation: String; + +maximumAnnotation: String + | + +Map<String, dynamic> toJson() ] - [TemporalAggregation]o-[TemporalAggregation] - [Enum]<:--[TemporalAggregation] + [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] - [ReportSpecification + [Answer | - +primary: ReportSection?; - +secondary: List<ReportSection> + +question: String; + +timestamp: DateTime; + <static>+keyResponse: String; + +response: V | +Map<String, dynamic> toJson(); + <static>+Answer<dynamic> fromJson(); +String toString() ] - [ReportSpecification]o-[<abstract>ReportSection] + [StudyUQuestionnaire + | + +questions: List<Question<dynamic>> + | + +List<dynamic> toJson() + ] - [<abstract>ReportSection + [EligibilityCriterion | - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; +id: String; - +title: String?; - +description: String? + +reason: String?; + +condition: Expression | +Map<String, dynamic> toJson(); - +String toString() + +bool isSatisfied(); + +bool isViolated() ] - [ConsentItem + [EligibilityCriterion]o-[<abstract>Expression] + + [StudySchedule | - +id: String; - +title: String?; - +description: String?; - +iconName: String + <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() ] - [Result + [StudySchedule]o-[PhaseSequence] + + [PhaseSequence | - <static>+keyType: String; - +type: String; - +periodId: String?; - <static>+keyResult: String; - +result: T + +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(); - <static>-Result<dynamic> _fromJson() + +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>; @@ -587,677 +485,995 @@ [<abstract>Task]o-[Schedule] - [Contact + [Result | - +organization: String; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String; - +website: String; - +phone: String; - +additionalInfo: String? + <static>+keyType: String; + +type: String; + +periodId: String?; + <static>+keyResult: String; + +result: T | +Map<String, dynamic> toJson(); - +String toString() + <static>-Result<dynamic> _fromJson() ] - [Answer + [Study | - +question: String; - +timestamp: DateTime; - <static>+keyResponse: String; - +response: V + <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>+Answer<dynamic> fromJson(); - +String toString() + <static>+dynamic getResearcherDashboardStudies(); + <static>+dynamic publishedPublicStudies(); + +bool isOwner(); + +bool isEditor(); + +bool canEdit(); + <static>+dynamic fetchResultsCSVTable(); + +bool isReadonly(); + +String toString(); + +int compareTo() ] - [QuestionConditional + [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>+keyDefaultValue: String; - +defaultValue: V?; - +condition: Expression + <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> | - <static>-QuestionConditional<V> _fromJson(); - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + <static>+dynamic getAppConfig(); + <static>+dynamic getAppContact() ] - [QuestionConditional]o-[<abstract>Expression] + [AppConfig]o-[Contact] + [AppConfig]o-[StudyUAnalytics] + [<abstract>SupabaseObjectFunctions]<:-[AppConfig] - [StudyUQuestionnaire + [SubjectProgress | - +questions: List<Question<dynamic>> + <static>+tableName: String; + +completedAt: DateTime?; + +subjectId: String; + +interventionId: String; + +taskId: String; + +resultType: String; + +result: Result<dynamic>; + +startedAt: DateTime?; + +primaryKeys: Map<String, dynamic>; + +hashCode: int | - +List<dynamic> toJson() + +Map<String, dynamic> toJson(); + +SubjectProgress setStartDateBackBy(); + +bool ==() ] - [ChoiceQuestion + [SubjectProgress]o-[Result] + [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + + [StudyInvite | - <static>+questionType: String; - +multiple: bool; - +choices: List<Choice> + <static>+tableName: String; + +code: String; + +studyId: String; + +preselectedInterventionIds: List<String>?; + +primaryKeys: Map<String, dynamic> | - +Map<String, dynamic> toJson(); - +Answer<List<String>> constructAnswer() + +Map<String, dynamic> toJson() ] - [<abstract>Question]<:-[ChoiceQuestion] + [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - [Choice + [StudyUUser | + <static>+tableName: String; +id: String; - +text: String + +email: String; + +preferences: Preferences; + +primaryKeys: Map<String, dynamic> | - +Map<String, dynamic> toJson(); - +String toString() + +Map<String, dynamic> toJson() ] - [<abstract>SliderQuestion + [StudyUUser]o-[Preferences] + [<abstract>SupabaseObjectFunctions]<:-[StudyUUser] + + [Preferences | - +minimum: double; - +maximum: double; - -_initial: double; - +step: double; - +initial: double + +language: String; + +pinnedStudies: Set<String> | - +Answer<num> constructAnswer() + +Map<String, dynamic> toJson() ] - [<abstract>Question]<:-[<abstract>SliderQuestion] - - [AnnotatedScaleQuestion + [Repo | - <static>+questionType: String; - +annotations: List<Annotation> + <static>+tableName: String; + +projectId: String; + +userId: String; + +studyId: String; + +provider: GitProvider; + +webUrl: String?; + +gitUrl: String?; + +primaryKeys: Map<String, dynamic> | +Map<String, dynamic> toJson() ] - [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] + [Repo]o-[GitProvider] + [<abstract>SupabaseObjectFunctions]<:-[Repo] - [Annotation - | - +value: int; - +annotation: String + [GitProvider | - +Map<String, dynamic> toJson() + +index: int; + <static>+values: List<GitProvider>; + <static>+gitlab: GitProvider ] - [ScaleQuestion + [GitProvider]o-[GitProvider] + [Enum]<:--[GitProvider] + + [StudySubject | - <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 + <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(); - +Annotation addAnnotation(); - -void _setAnnotationLabel(); - <static>+int getAutostepSize(); - <static>+List<int> generateMidValues() + +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() ] - [ScaleQuestion]o-[Annotation] - [<abstract>SliderQuestion]<:-[ScaleQuestion] - [AnnotatedScaleQuestion]<:--[ScaleQuestion] - [VisualAnalogueQuestion]<:--[ScaleQuestion] + [StudySubject]o-[StreamController] + [StudySubject]o-[Study] + [StudySubject]o-[Stream] + [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - [VisualAnalogueQuestion - | - <static>+questionType: String; - +minimumColor: int; - +maximumColor: int; - +minimumAnnotation: String; - +maximumAnnotation: String + [<abstract>InterventionTask | - +Map<String, dynamic> toJson() + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> ] - [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] + [<abstract>Task]<:-[<abstract>InterventionTask] - [BooleanQuestion + [Intervention | - <static>+questionType: String + +id: String; + +name: String?; + +description: String?; + +icon: String; + +tasks: List<InterventionTask> | +Map<String, dynamic> toJson(); - +Answer<bool> constructAnswer() + +bool isBaseline() ] - [<abstract>Question]<:-[BooleanQuestion] - - [<abstract>Question + [CheckmarkTask | - <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>? + <static>+taskType: String | +Map<String, dynamic> toJson(); - +bool shouldBeShown(); - +Answer<V>? getDefaultAnswer(); - +Type getAnswerType(); - +String toString() + +Map<DateTime, T> extractPropertyResults(); + +Map<String, Type> getAvailableProperties(); + +String? getHumanReadablePropertyName() ] - [<abstract>Question]o-[QuestionConditional] + [<abstract>InterventionTask]<:-[CheckmarkTask] - [EligibilityCriterion + [Contact | - +id: String; - +reason: String?; - +condition: Expression + +organization: String; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String; + +website: String; + +phone: String; + +additionalInfo: String? | +Map<String, dynamic> toJson(); - +bool isSatisfied(); - +bool isViolated() + +String toString() ] - [EligibilityCriterion]o-[<abstract>Expression] - - [QuestionnaireTask + [<abstract>SupabaseObject | - <static>+taskType: String; - +questions: StudyUQuestionnaire + +primaryKeys: Map<String, dynamic> + | + +Map<String, dynamic> toJson() + ] + + [<abstract>SupabaseObjectFunctions | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() + <static>+T fromJson(); + +dynamic delete(); + +dynamic save() ] - [QuestionnaireTask]o-[StudyUQuestionnaire] - [<abstract>Observation]<:-[QuestionnaireTask] + [<abstract>SupabaseObject]<:--[<abstract>SupabaseObjectFunctions] - [<abstract>Observation + [SupabaseQuery | - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> + <static>+dynamic getAll(); + <static>+dynamic getById(); + <static>+dynamic batchUpsert(); + <static>+List<T> extractSupabaseList(); + <static>+T extractSupabaseSingleRow(); + <static>+void catchSupabaseException() ] - [<abstract>Task]<:-[<abstract>Observation] - - [StudySchedule + [Analytics | - <static>+numberOfInterventions: int; - +numberOfCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +sequence: PhaseSequence; - +sequenceCustom: String; - +length: int; - +nameOfSequence: String + <static>+logger: Logger; + <static>+onLog: StreamSubscription<LogRecord> | - +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() + <static>+void init(); + <static>+void dispose(); + <static>+dynamic captureEvent(); + <static>+dynamic captureException(); + <static>+dynamic captureMessage(); + <static>+void addBreadcrumb() ] - [StudySchedule]o-[PhaseSequence] + [Analytics]o-[Logger] + [Analytics]o-[StreamSubscription] - [PhaseSequence + [StudyUAnalytics | - +index: int; - <static>+values: List<PhaseSequence>; - <static>+alternating: PhaseSequence; - <static>+counterBalanced: PhaseSequence; - <static>+randomized: PhaseSequence; - <static>+customized: PhaseSequence + +enabled: bool; + +dsn: String; + +samplingRate: double?; + <static>+keyStudyUAnalytics: String + | + +Map<String, dynamic> toJson() ] - [PhaseSequence]o-[PhaseSequence] - [Enum]<:--[PhaseSequence] - - + - + - - - - - - + + - + - + - + - + + + - - - - - - - - - - - - - - - - - - - + - - - - - + - + - - - + + + - + - - - + + - + + - + + + + - - - + + - + - + + + + + + + + + + + + + + + - + - - - + + + - + - - - + - + + + + + + + + + + + + + - + - - + + + + + + + + + + - + - + - + - + - + - - - + + - + + - + - + + + + + - + - + - + - + - + - - - + - + - - + + + - - + - + - - + + + - - + - + - - + + + - - + - + - + - + - - - + - + + + - + - - + + - + - - - + + - - - + + - + - + - - + + - + - + + + + + - + - + - + - + + + - + - + + + + + - + - + + + - - - - - - - - - + + + + + - + - - - + - - - - - - - - - - + + - + - + - + - + - + + + + + + + + + + - - - - - + + - + - + - + - - + + + + + + + + + DataReference + + + + + + +task: String + +property: String + + + + + + +Map<String, dynamic> toJson() + +String toString() + +Map<DateTime, T> retrieveFromResults() + + + - - - - - - + + + + + - - - SupabaseObject + + + AverageSection - - - +primaryKeys: Map<String, dynamic> + + + <static>+sectionType: String + +aggregate: TemporalAggregation? + +resultProperty: DataReference<num>? - - - +Map<String, dynamic> toJson() + + + +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 + + - - - SupabaseObjectFunctions + + + <static>+expressionType: String + +expression: Expression - - - <static>+T fromJson() - +dynamic delete() - +dynamic save() + + + +Map<String, dynamic> toJson() + +bool? evaluate() - - - - + + + + + - - - SupabaseQuery + + + Expression - - - <static>+dynamic getAll() - <static>+dynamic getById() - <static>+dynamic batchUpsert() - <static>+List<T> extractSupabaseList() - <static>+T extractSupabaseSingleRow() - <static>+void catchSupabaseException() + + + <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String? + + + + + + +Map<String, dynamic> toJson() + +String toString() + +bool? evaluate() - - - - - + + + + + - - - Analytics + + + BooleanExpression - - - <static>+logger: Logger - <static>+onLog: StreamSubscription<LogRecord> + + + <static>+expressionType: String - - - <static>+void init() - <static>+void dispose() - <static>+dynamic captureEvent() - <static>+dynamic captureException() - <static>+dynamic captureMessage() - <static>+void addBreadcrumb() + + + +Map<String, dynamic> toJson() + +bool checkValue() - - - + + + + + - - - Logger + + + ValueExpression - - - - + + + <static>+expressionType: String + +target: String? + + - - - StreamSubscription + + + +bool checkValue() + +bool? evaluate() - - - - - + + + + + - - - StudyUAnalytics + + + ChoiceExpression - - - +enabled: bool - +dsn: String - +samplingRate: double? - <static>+keyStudyUAnalytics: String + + + <static>+expressionType: String + +choices: Set<dynamic> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +bool checkValue() - - - + + + - + StudyResult - + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)> <static>+keyType: String @@ -1267,7 +1483,7 @@ - + +Map<String, dynamic> toJson() +List<String> getHeaders() @@ -1276,81 +1492,25 @@ - - - - - - - - - NumericResult - - - - - - <static>+studyResultType: String - +resultProperty: DataReference<num> - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - DataReference - - - - - - +task: String - +property: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> retrieveFromResults() - - - - - - - + + + - + InterventionResult - + <static>+studyResultType: String - + +Map<String, dynamic> toJson() +List<String> getHeaders() @@ -1359,1504 +1519,1445 @@ - - - - - - - - InterventionTask - - - - - - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - - - - - + + + + + - - - Task + + + NumericResult - - - <static>+keyType: String - +type: String - +id: String - +title: String? - +header: String? - +footer: String? - +schedule: Schedule + + + <static>+studyResultType: String + +resultProperty: DataReference<num> - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + +Map<String, dynamic> toJson() + +List<String> getHeaders() + +List<dynamic> getValues() - - - - - + + + + + - - - Intervention + + + ConsentItem - - - +id: String - +name: String? - +description: String? - +icon: String - +tasks: List<InterventionTask> + + + +id: String + +title: String? + +description: String? + +iconName: String - - - +Map<String, dynamic> toJson() - +bool isBaseline() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - CheckmarkTask + + + QuestionConditional - - - <static>+taskType: String + + + <static>+keyDefaultValue: String + +defaultValue: V? + +condition: Expression - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + <static>-QuestionConditional<V> _fromJson() + +Map<String, dynamic> toJson() - - - - - + + + + + - - - ValueExpression + + + Question - - - <static>+expressionType: String - +target: String? + + + <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>? - - - +bool checkValue() - +bool? evaluate() + + + +Map<String, dynamic> toJson() + +bool shouldBeShown() + +Answer<V>? getDefaultAnswer() + +Type getAnswerType() + +String toString() - - - - - + + + + + - - - Expression + + + ChoiceQuestion - - - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String? + + + <static>+questionType: String + +multiple: bool + +choices: List<Choice> - - - +Map<String, dynamic> toJson() - +String toString() - +bool? evaluate() + + + +Map<String, dynamic> toJson() + +Answer<List<String>> constructAnswer() - - - - - + + + + + - - - BooleanExpression + + + Choice - - - <static>+expressionType: String + + + +id: String + +text: String - - - +Map<String, dynamic> toJson() - +bool checkValue() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - ChoiceExpression + + + BooleanQuestion - - - <static>+expressionType: String - +choices: Set<dynamic> + + + <static>+questionType: String - - - +Map<String, dynamic> toJson() - +bool checkValue() + + + +Map<String, dynamic> toJson() + +Answer<bool> constructAnswer() - - - - - + + + + + - - - NotExpression + + + SliderQuestion - - - <static>+expressionType: String - +expression: Expression + + + +minimum: double + +maximum: double + -_initial: double + +step: double + +initial: double - - - +Map<String, dynamic> toJson() - +bool? evaluate() + + + +Answer<num> constructAnswer() - - - - - + + + + + - - - StudyInvite + + + ScaleQuestion - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> + + + <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() + + + +Map<String, dynamic> toJson() + +Annotation addAnnotation() + -void _setAnnotationLabel() + <static>+int getAutostepSize() + <static>+List<int> generateMidValues() - - - - - + + + + + - - - SubjectProgress + + + Annotation - - - <static>+tableName: String - +completedAt: DateTime? - +subjectId: String - +interventionId: String - +taskId: String - +resultType: String - +result: Result<dynamic> - +startedAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hashCode: int + + + +value: int + +annotation: String - - - +Map<String, dynamic> toJson() - +SubjectProgress setStartDateBackBy() - +bool ==() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Result + + + AnnotatedScaleQuestion - - - <static>+keyType: String - +type: String - +periodId: String? - <static>+keyResult: String - +result: T + + + <static>+questionType: String + +annotations: List<Annotation> - - - +Map<String, dynamic> toJson() - <static>-Result<dynamic> _fromJson() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - StudySubject + + + VisualAnalogueQuestion - - - <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 + + + <static>+questionType: String + +minimumColor: int + +maximumColor: int + +minimumAnnotation: String + +maximumAnnotation: String - - - +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() + + + +Map<String, dynamic> toJson() - - - + + + + + - - - StreamController + + + Answer - - - - - - - - - - Study + + + +question: String + +timestamp: DateTime + <static>+keyResponse: String + +response: V - - - <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>+Answer<dynamic> fromJson() + +String toString() - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() + + + + + + + + + + StudyUQuestionnaire - - - - + + + +questions: List<Question<dynamic>> + + - - - Stream + + + +List<dynamic> toJson() - - - - - + + + + + - - - AppConfig + + + EligibilityCriterion - - - <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> + + + +id: String + +reason: String? + +condition: Expression - - - +Map<String, dynamic> toJson() - <static>+dynamic getAppConfig() - <static>+dynamic getAppContact() + + + +Map<String, dynamic> toJson() + +bool isSatisfied() + +bool isViolated() - - - - - + + + + + - - - Contact + + + StudySchedule - - - +organization: String - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String - +website: String - +phone: String - +additionalInfo: String? + + + <static>+numberOfInterventions: int + +numberOfCycles: int + +phaseDuration: int + +includeBaseline: bool + +sequence: PhaseSequence + +sequenceCustom: String + +length: int + +nameOfSequence: String - - - +Map<String, dynamic> toJson() - +String toString() + + + +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() - - - - - - - - - Repo - - + + + + - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String - +gitUrl: String - +primaryKeys: Map<String, dynamic> + + + PhaseSequence - - - +Map<String, dynamic> toJson() + + + +index: int + <static>+values: List<PhaseSequence> + <static>+alternating: PhaseSequence + <static>+counterBalanced: PhaseSequence + <static>+randomized: PhaseSequence + <static>+customized: PhaseSequence - - - - + + + + + - - - GitProvider + + + QuestionnaireTask - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider + + + <static>+taskType: String + +questions: StudyUQuestionnaire - - - - - - - - Enum + + + +Map<String, dynamic> toJson() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - + + + + - - - Participation + + + Observation - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation + + + <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - - - - + + + + + - - - ResultSharing + + + Task - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing + + + <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() - - - - - + + + + + - - - StudyUQuestionnaire + + + Schedule - - - +questions: List<Question<dynamic>> + + + +completionPeriods: List<CompletionPeriod> + +reminders: List<StudyUTimeOfDay> - - - +List<dynamic> toJson() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - StudySchedule + + + CompletionPeriod - - - <static>+numberOfInterventions: int - +numberOfCycles: int - +phaseDuration: int - +includeBaseline: bool - +sequence: PhaseSequence - +sequenceCustom: String - +length: int - +nameOfSequence: String + + + +id: String + +unlockTime: StudyUTimeOfDay + +lockTime: StudyUTimeOfDay - - - +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() + + + +Map<String, dynamic> toJson() + +String formatted() + +String toString() + +bool contains() - - - - - + + + + + - - - ReportSpecification + + + StudyUTimeOfDay - - - +primary: ReportSection? - +secondary: List<ReportSection> + + + +hour: int + +minute: int - - - +Map<String, dynamic> toJson() - +String toString() + + + +String toJson() + +String toString() + +bool earlierThan() - - - - + + + + + - - - StudyStatus + + + TaskInstance - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus + + + +task: Task + +id: String + +completionPeriod: CompletionPeriod - - - - - - - - - - LinearRegressionSection + + + <static>-Task _taskFromStudy() + <static>-Task _taskFromSubject() - - - <static>+sectionType: String - +resultProperty: DataReference<num>? - +alpha: double - +improvement: ImprovementDirection? - - + + + + + + - - - +Map<String, dynamic> toJson() + + + Result - - - - - - - - - ImprovementDirection + + + <static>+keyType: String + +type: String + +periodId: String? + <static>+keyResult: String + +result: T - - - +index: int - <static>+values: List<ImprovementDirection> - <static>+positive: ImprovementDirection - <static>+negative: ImprovementDirection + + + +Map<String, dynamic> toJson() + <static>-Result<dynamic> _fromJson() - - - - - + + + + + - - - ReportSection + + + Study - - - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +title: String? - +description: String? + + + <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() - +String toString() + + + +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() - - - - - - - - - AverageSection - - + + + + - - - <static>+sectionType: String - +aggregate: TemporalAggregation? - +resultProperty: DataReference<num>? + + + Participation - - - +Map<String, dynamic> toJson() + + + +index: int + <static>+values: List<Participation> + <static>+open: Participation + <static>+invite: Participation - - - - + + + + - - - TemporalAggregation + + + ResultSharing - - - +index: int - <static>+values: List<TemporalAggregation> - <static>+day: TemporalAggregation - <static>+phase: TemporalAggregation - <static>+intervention: TemporalAggregation + + + +index: int + <static>+values: List<ResultSharing> + <static>+public: ResultSharing + <static>+private: ResultSharing + <static>+organization: ResultSharing - - - - - + + + + + - - - ConsentItem + + + Contact - - - +id: String - +title: String? - +description: String? - +iconName: String + + + +organization: String + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String + +website: String + +phone: String + +additionalInfo: String? - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - Schedule + + + Repo - - - +completionPeriods: List<CompletionPeriod> - +reminders: List<StudyUTimeOfDay> + + + <static>+tableName: String + +projectId: String + +userId: String + +studyId: String + +provider: GitProvider + +webUrl: String? + +gitUrl: String? + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - - - - - CompletionPeriod - - + + + + - - - +id: String - +unlockTime: StudyUTimeOfDay - +lockTime: StudyUTimeOfDay + + + StudyStatus - - - +Map<String, dynamic> toJson() - +String formatted() - +String toString() - +bool contains() + + + +index: int + <static>+values: List<StudyStatus> + <static>+draft: StudyStatus + <static>+running: StudyStatus + <static>+closed: StudyStatus - - - - - + + + + - - - StudyUTimeOfDay + + + SupabaseObjectFunctions - - - +hour: int - +minute: int + + + <static>+T fromJson() + +dynamic delete() + +dynamic save() - - - +String toJson() - +String toString() - +bool earlierThan() + + + + + + + + Comparable - - - - - + + + + + - - - TaskInstance + + + AppConfig - - - +task: Task - +id: String - +completionPeriod: CompletionPeriod + + + <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> - - - <static>-Task _taskFromStudy() - <static>-Task _taskFromSubject() + + + +Map<String, dynamic> toJson() + <static>+dynamic getAppConfig() + <static>+dynamic getAppContact() - - - - - + + + + + - - - Answer + + + StudyUAnalytics - - - +question: String - +timestamp: DateTime - <static>+keyResponse: String - +response: V + + + +enabled: bool + +dsn: String + +samplingRate: double? + <static>+keyStudyUAnalytics: String - - - +Map<String, dynamic> toJson() - <static>+Answer<dynamic> fromJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - QuestionConditional + + + SubjectProgress - - - <static>+keyDefaultValue: String - +defaultValue: V? - +condition: Expression + + + <static>+tableName: String + +completedAt: DateTime? + +subjectId: String + +interventionId: String + +taskId: String + +resultType: String + +result: Result<dynamic> + +startedAt: DateTime? + +primaryKeys: Map<String, dynamic> + +hashCode: int - - - <static>-QuestionConditional<V> _fromJson() - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +SubjectProgress setStartDateBackBy() + +bool ==() - - - - - + + + + + - - - ChoiceQuestion + + + StudyInvite - - - <static>+questionType: String - +multiple: bool - +choices: List<Choice> + + + <static>+tableName: String + +code: String + +studyId: String + +preselectedInterventionIds: List<String>? + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +Answer<List<String>> constructAnswer() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Question + + + StudyUUser - - - <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>? + + + <static>+tableName: String + +id: String + +email: String + +preferences: Preferences + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +bool shouldBeShown() - +Answer<V>? getDefaultAnswer() - +Type getAnswerType() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Choice + + + Preferences - - - +id: String - +text: String + + + +language: String + +pinnedStudies: Set<String> - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - - - - - SliderQuestion - - + + + + - - - +minimum: double - +maximum: double - -_initial: double - +step: double - +initial: double + + + GitProvider - - - +Answer<num> constructAnswer() + + + +index: int + <static>+values: List<GitProvider> + <static>+gitlab: GitProvider - - - - - + + + + + - - - AnnotatedScaleQuestion + + + StudySubject - - - <static>+questionType: String - +annotations: List<Annotation> + + + <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() + + + +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() - - - - - + + + - - - Annotation + + + StreamController - - - +value: int - +annotation: String - - + + + + - - - +Map<String, dynamic> toJson() + + + Stream - - - - - - - - - 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 + + + InterventionTask - - - +Map<String, dynamic> toJson() - +Annotation addAnnotation() - -void _setAnnotationLabel() - <static>+int getAutostepSize() - <static>+List<int> generateMidValues() + + + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - + + + + + - - - VisualAnalogueQuestion + + + Intervention - - - <static>+questionType: String - +minimumColor: int - +maximumColor: int - +minimumAnnotation: String - +maximumAnnotation: String + + + +id: String + +name: String? + +description: String? + +icon: String + +tasks: List<InterventionTask> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +bool isBaseline() - - - - - + + + + + - - - BooleanQuestion + + + CheckmarkTask - - - <static>+questionType: String + + + <static>+taskType: String - - - +Map<String, dynamic> toJson() - +Answer<bool> constructAnswer() + + + +Map<String, dynamic> toJson() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - - + + + + + - - - EligibilityCriterion + + + SupabaseObject - - - +id: String - +reason: String? - +condition: Expression + + + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +bool isSatisfied() - +bool isViolated() + + + +Map<String, dynamic> toJson() - - - - - + + + + - - - QuestionnaireTask + + + SupabaseQuery - - - <static>+taskType: String - +questions: StudyUQuestionnaire + + + <static>+dynamic getAll() + <static>+dynamic getById() + <static>+dynamic batchUpsert() + <static>+List<T> extractSupabaseList() + <static>+T extractSupabaseSingleRow() + <static>+void catchSupabaseException() - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + + + + + + + + Analytics - - - - - - - - - Observation + + + <static>+logger: Logger + <static>+onLog: StreamSubscription<LogRecord> - - - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> + + + <static>+void init() + <static>+void dispose() + <static>+dynamic captureEvent() + <static>+dynamic captureException() + <static>+dynamic captureMessage() + <static>+void addBreadcrumb() - - - - + + + - - - PhaseSequence + + + Logger - - - +index: int - <static>+values: List<PhaseSequence> - <static>+alternating: PhaseSequence - <static>+counterBalanced: PhaseSequence - <static>+randomized: PhaseSequence - <static>+customized: PhaseSequence + + + + + + + + StreamSubscription diff --git a/docs/uml/core/lib/uml.svg b/docs/uml/core/lib/uml.svg index dba4d6ea2..2e673cef6 100644 --- a/docs/uml/core/lib/uml.svg +++ b/docs/uml/core/lib/uml.svg @@ -1,134 +1,99 @@ - - [<abstract>SupabaseObject + + [DataReference | - +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> + +task: String; + +property: String | - <static>+void init(); - <static>+void dispose(); - <static>+dynamic captureEvent(); - <static>+dynamic captureException(); - <static>+dynamic captureMessage(); - <static>+void addBreadcrumb() + +Map<String, dynamic> toJson(); + +String toString(); + +Map<DateTime, T> retrieveFromResults() ] - [Analytics]o-[Logger] - [Analytics]o-[StreamSubscription] - - [StudyUAnalytics + [AverageSection | - +enabled: bool; - +dsn: String; - +samplingRate: double?; - <static>+keyStudyUAnalytics: String + <static>+sectionType: String; + +aggregate: TemporalAggregation?; + +resultProperty: DataReference<num>? | +Map<String, dynamic> toJson() ] - [<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() - ] + [AverageSection]o-[TemporalAggregation] + [AverageSection]o-[DataReference] + [<abstract>ReportSection]<:-[AverageSection] - [NumericResult + [LinearRegressionSection | - <static>+studyResultType: String; - +resultProperty: DataReference<num> + <static>+sectionType: String; + +resultProperty: DataReference<num>?; + +alpha: double; + +improvement: ImprovementDirection? | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +Map<String, dynamic> toJson() ] - [NumericResult]o-[DataReference] - [<abstract>StudyResult]<:-[NumericResult] + [LinearRegressionSection]o-[DataReference] + [LinearRegressionSection]o-[ImprovementDirection] + [<abstract>ReportSection]<:-[LinearRegressionSection] - [InterventionResult - | - <static>+studyResultType: String + [ImprovementDirection | - +Map<String, dynamic> toJson(); - +List<String> getHeaders(); - +List<dynamic> getValues() + +index: int; + <static>+values: List<ImprovementDirection>; + <static>+positive: ImprovementDirection; + <static>+negative: ImprovementDirection ] - [<abstract>StudyResult]<:-[InterventionResult] + [ImprovementDirection]o-[ImprovementDirection] + [Enum]<:--[ImprovementDirection] - [<abstract>InterventionTask + [TemporalAggregation | - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> + +index: int; + <static>+values: List<TemporalAggregation>; + <static>+day: TemporalAggregation; + <static>+phase: TemporalAggregation; + <static>+intervention: TemporalAggregation ] - [<abstract>Task]<:-[<abstract>InterventionTask] + [TemporalAggregation]o-[TemporalAggregation] + [Enum]<:--[TemporalAggregation] - [Intervention + [ReportSpecification | - +id: String; - +name: String?; - +description: String?; - +icon: String; - +tasks: List<InterventionTask> + +primary: ReportSection?; + +secondary: List<ReportSection> | +Map<String, dynamic> toJson(); - +bool isBaseline() + +String toString() ] - [CheckmarkTask + [ReportSpecification]o-[<abstract>ReportSection] + + [<abstract>ReportSection | - <static>+taskType: String + <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +title: String?; + +description: String? | +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() + +String toString() ] - [<abstract>InterventionTask]<:-[CheckmarkTask] - - [<abstract>ValueExpression + [NotExpression | <static>+expressionType: String; - +target: String? + +expression: Expression | - +bool checkValue(); + +Map<String, dynamic> toJson(); +bool? evaluate() ] - [<abstract>Expression]<:-[<abstract>ValueExpression] + [NotExpression]o-[<abstract>Expression] + [<abstract>Expression]<:-[NotExpression] [BooleanExpression | @@ -140,28 +105,27 @@ [<abstract>ValueExpression]<:-[BooleanExpression] - [ChoiceExpression + [<abstract>ValueExpression | <static>+expressionType: String; - +choices: Set<dynamic> + +target: String? | - +Map<String, dynamic> toJson(); - +bool checkValue() + +bool checkValue(); + +bool? evaluate() ] - [<abstract>ValueExpression]<:-[ChoiceExpression] + [<abstract>Expression]<:-[<abstract>ValueExpression] - [NotExpression + [ChoiceExpression | <static>+expressionType: String; - +expression: Expression + +choices: Set<dynamic> | +Map<String, dynamic> toJson(); - +bool? evaluate() + +bool checkValue() ] - [NotExpression]o-[<abstract>Expression] - [<abstract>Expression]<:-[NotExpression] + [<abstract>ValueExpression]<:-[ChoiceExpression] [<abstract>Expression | @@ -174,354 +138,288 @@ +bool? evaluate() ] - [DataReference + [<abstract>StudyResult | - +task: String; - +property: String + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)>; + <static>+keyType: String; + +type: String; + +id: String; + +filename: String | +Map<String, dynamic> toJson(); - +String toString(); - +Map<DateTime, T> retrieveFromResults() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [StudyInvite + [InterventionResult | - <static>+tableName: String; - +code: String; - +studyId: String; - +preselectedInterventionIds: List<String>?; - +primaryKeys: Map<String, dynamic> + <static>+studyResultType: String | - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] + [<abstract>StudyResult]<:-[InterventionResult] - [SubjectProgress + [NumericResult | - <static>+tableName: String; - +completedAt: DateTime?; - +subjectId: String; - +interventionId: String; - +taskId: String; - +resultType: String; - +result: Result<dynamic>; - +startedAt: DateTime?; - +primaryKeys: Map<String, dynamic>; - +hashCode: int + <static>+studyResultType: String; + +resultProperty: DataReference<num> | +Map<String, dynamic> toJson(); - +SubjectProgress setStartDateBackBy(); - +bool ==() + +List<String> getHeaders(); + +List<dynamic> getValues() ] - [SubjectProgress]o-[Result] - [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + [NumericResult]o-[DataReference] + [<abstract>StudyResult]<:-[NumericResult] - [StudySubject + [ConsentItem | - <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 + +title: String?; + +description: String?; + +iconName: String | +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] - - [AppConfig + [QuestionConditional | - <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> + <static>+keyDefaultValue: String; + +defaultValue: V?; + +condition: Expression | - +Map<String, dynamic> toJson(); - <static>+dynamic getAppConfig(); - <static>+dynamic getAppContact() + <static>-QuestionConditional<V> _fromJson(); + +Map<String, dynamic> toJson() ] - [AppConfig]o-[Contact] - [AppConfig]o-[StudyUAnalytics] - [<abstract>SupabaseObjectFunctions]<:-[AppConfig] + [QuestionConditional]o-[<abstract>Expression] - [Repo + [<abstract>Question | - <static>+tableName: String; - +projectId: String; - +userId: String; - +studyId: String; - +provider: GitProvider; - +webUrl: String; - +gitUrl: String; - +primaryKeys: Map<String, dynamic> + <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() + +Map<String, dynamic> toJson(); + +bool shouldBeShown(); + +Answer<V>? getDefaultAnswer(); + +Type getAnswerType(); + +String toString() ] - [Repo]o-[GitProvider] - [<abstract>SupabaseObjectFunctions]<:-[Repo] + [<abstract>Question]o-[QuestionConditional] - [GitProvider + [ChoiceQuestion | - +index: int; - <static>+values: List<GitProvider>; - <static>+gitlab: GitProvider + <static>+questionType: String; + +multiple: bool; + +choices: List<Choice> + | + +Map<String, dynamic> toJson(); + +Answer<List<String>> constructAnswer() ] - [GitProvider]o-[GitProvider] - [Enum]<:--[GitProvider] + [<abstract>Question]<:-[ChoiceQuestion] - [Study + [Choice | - <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 + +text: String | +Map<String, dynamic> toJson(); - <static>+dynamic getResearcherDashboardStudies(); - <static>+dynamic publishedPublicStudies(); - +bool isOwner(); - +bool isEditor(); - +bool canEdit(); - <static>+dynamic fetchResultsCSVTable(); - +bool isReadonly(); +String toString() ] - [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] - - [StudyStatus + [BooleanQuestion | - +index: int; - <static>+values: List<StudyStatus>; - <static>+draft: StudyStatus; - <static>+running: StudyStatus; - <static>+closed: StudyStatus - ] - - [StudyStatus]o-[StudyStatus] - [Enum]<:--[StudyStatus] - - [Participation + <static>+questionType: String | - +index: int; - <static>+values: List<Participation>; - <static>+open: Participation; - <static>+invite: Participation + +Map<String, dynamic> toJson(); + +Answer<bool> constructAnswer() ] - [Participation]o-[Participation] - [Enum]<:--[Participation] + [<abstract>Question]<:-[BooleanQuestion] - [ResultSharing + [<abstract>SliderQuestion | - +index: int; - <static>+values: List<ResultSharing>; - <static>+public: ResultSharing; - <static>+private: ResultSharing; - <static>+organization: ResultSharing + +minimum: double; + +maximum: double; + -_initial: double; + +step: double; + +initial: double + | + +Answer<num> constructAnswer() ] - [ResultSharing]o-[ResultSharing] - [Enum]<:--[ResultSharing] + [<abstract>Question]<:-[<abstract>SliderQuestion] - [LinearRegressionSection + [ScaleQuestion | - <static>+sectionType: String; - +resultProperty: DataReference<num>?; - +alpha: double; - +improvement: ImprovementDirection? + <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() + +Map<String, dynamic> toJson(); + +Annotation addAnnotation(); + -void _setAnnotationLabel(); + <static>+int getAutostepSize(); + <static>+List<int> generateMidValues() ] - [LinearRegressionSection]o-[DataReference] - [LinearRegressionSection]o-[ImprovementDirection] - [<abstract>ReportSection]<:-[LinearRegressionSection] + [ScaleQuestion]o-[Annotation] + [<abstract>SliderQuestion]<:-[ScaleQuestion] + [AnnotatedScaleQuestion]<:--[ScaleQuestion] + [VisualAnalogueQuestion]<:--[ScaleQuestion] - [ImprovementDirection + [AnnotatedScaleQuestion | - +index: int; - <static>+values: List<ImprovementDirection>; - <static>+positive: ImprovementDirection; - <static>+negative: ImprovementDirection + <static>+questionType: String; + +annotations: List<Annotation> + | + +Map<String, dynamic> toJson() ] - [ImprovementDirection]o-[ImprovementDirection] - [Enum]<:--[ImprovementDirection] + [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] - [AverageSection + [Annotation | - <static>+sectionType: String; - +aggregate: TemporalAggregation?; - +resultProperty: DataReference<num>? + +value: int; + +annotation: String | +Map<String, dynamic> toJson() ] - [AverageSection]o-[TemporalAggregation] - [AverageSection]o-[DataReference] - [<abstract>ReportSection]<:-[AverageSection] - - [TemporalAggregation + [VisualAnalogueQuestion | - +index: int; - <static>+values: List<TemporalAggregation>; - <static>+day: TemporalAggregation; - <static>+phase: TemporalAggregation; - <static>+intervention: TemporalAggregation + <static>+questionType: String; + +minimumColor: int; + +maximumColor: int; + +minimumAnnotation: String; + +maximumAnnotation: String + | + +Map<String, dynamic> toJson() ] - [TemporalAggregation]o-[TemporalAggregation] - [Enum]<:--[TemporalAggregation] + [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] - [ReportSpecification + [Answer | - +primary: ReportSection?; - +secondary: List<ReportSection> + +question: String; + +timestamp: DateTime; + <static>+keyResponse: String; + +response: V | +Map<String, dynamic> toJson(); + <static>+Answer<dynamic> fromJson(); +String toString() ] - [ReportSpecification]o-[<abstract>ReportSection] + [StudyUQuestionnaire + | + +questions: List<Question<dynamic>> + | + +List<dynamic> toJson() + ] - [<abstract>ReportSection + [EligibilityCriterion | - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)>; - <static>+keyType: String; - +type: String; +id: String; - +title: String?; - +description: String? + +reason: String?; + +condition: Expression | +Map<String, dynamic> toJson(); - +String toString() + +bool isSatisfied(); + +bool isViolated() ] - [ConsentItem + [EligibilityCriterion]o-[<abstract>Expression] + + [StudySchedule | - +id: String; - +title: String?; - +description: String?; - +iconName: String + <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() ] - [Result + [StudySchedule]o-[PhaseSequence] + + [PhaseSequence | - <static>+keyType: String; - +type: String; - +periodId: String?; - <static>+keyResult: String; - +result: T + +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(); - <static>-Result<dynamic> _fromJson() + +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>; @@ -587,677 +485,995 @@ [<abstract>Task]o-[Schedule] - [Contact + [Result | - +organization: String; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String; - +website: String; - +phone: String; - +additionalInfo: String? + <static>+keyType: String; + +type: String; + +periodId: String?; + <static>+keyResult: String; + +result: T | +Map<String, dynamic> toJson(); - +String toString() + <static>-Result<dynamic> _fromJson() ] - [Answer + [Study | - +question: String; - +timestamp: DateTime; - <static>+keyResponse: String; - +response: V + <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>+Answer<dynamic> fromJson(); - +String toString() + <static>+dynamic getResearcherDashboardStudies(); + <static>+dynamic publishedPublicStudies(); + +bool isOwner(); + +bool isEditor(); + +bool canEdit(); + <static>+dynamic fetchResultsCSVTable(); + +bool isReadonly(); + +String toString(); + +int compareTo() ] - [QuestionConditional + [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>+keyDefaultValue: String; - +defaultValue: V?; - +condition: Expression + <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> | - <static>-QuestionConditional<V> _fromJson(); - +Map<String, dynamic> toJson() + +Map<String, dynamic> toJson(); + <static>+dynamic getAppConfig(); + <static>+dynamic getAppContact() ] - [QuestionConditional]o-[<abstract>Expression] + [AppConfig]o-[Contact] + [AppConfig]o-[StudyUAnalytics] + [<abstract>SupabaseObjectFunctions]<:-[AppConfig] - [StudyUQuestionnaire + [SubjectProgress | - +questions: List<Question<dynamic>> + <static>+tableName: String; + +completedAt: DateTime?; + +subjectId: String; + +interventionId: String; + +taskId: String; + +resultType: String; + +result: Result<dynamic>; + +startedAt: DateTime?; + +primaryKeys: Map<String, dynamic>; + +hashCode: int | - +List<dynamic> toJson() + +Map<String, dynamic> toJson(); + +SubjectProgress setStartDateBackBy(); + +bool ==() ] - [ChoiceQuestion + [SubjectProgress]o-[Result] + [<abstract>SupabaseObjectFunctions]<:-[SubjectProgress] + + [StudyInvite | - <static>+questionType: String; - +multiple: bool; - +choices: List<Choice> + <static>+tableName: String; + +code: String; + +studyId: String; + +preselectedInterventionIds: List<String>?; + +primaryKeys: Map<String, dynamic> | - +Map<String, dynamic> toJson(); - +Answer<List<String>> constructAnswer() + +Map<String, dynamic> toJson() ] - [<abstract>Question]<:-[ChoiceQuestion] + [<abstract>SupabaseObjectFunctions]<:-[StudyInvite] - [Choice + [StudyUUser | + <static>+tableName: String; +id: String; - +text: String + +email: String; + +preferences: Preferences; + +primaryKeys: Map<String, dynamic> | - +Map<String, dynamic> toJson(); - +String toString() + +Map<String, dynamic> toJson() ] - [<abstract>SliderQuestion + [StudyUUser]o-[Preferences] + [<abstract>SupabaseObjectFunctions]<:-[StudyUUser] + + [Preferences | - +minimum: double; - +maximum: double; - -_initial: double; - +step: double; - +initial: double + +language: String; + +pinnedStudies: Set<String> | - +Answer<num> constructAnswer() + +Map<String, dynamic> toJson() ] - [<abstract>Question]<:-[<abstract>SliderQuestion] - - [AnnotatedScaleQuestion + [Repo | - <static>+questionType: String; - +annotations: List<Annotation> + <static>+tableName: String; + +projectId: String; + +userId: String; + +studyId: String; + +provider: GitProvider; + +webUrl: String?; + +gitUrl: String?; + +primaryKeys: Map<String, dynamic> | +Map<String, dynamic> toJson() ] - [<abstract>SliderQuestion]<:-[AnnotatedScaleQuestion] + [Repo]o-[GitProvider] + [<abstract>SupabaseObjectFunctions]<:-[Repo] - [Annotation - | - +value: int; - +annotation: String + [GitProvider | - +Map<String, dynamic> toJson() + +index: int; + <static>+values: List<GitProvider>; + <static>+gitlab: GitProvider ] - [ScaleQuestion + [GitProvider]o-[GitProvider] + [Enum]<:--[GitProvider] + + [StudySubject | - <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 + <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(); - +Annotation addAnnotation(); - -void _setAnnotationLabel(); - <static>+int getAutostepSize(); - <static>+List<int> generateMidValues() + +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() ] - [ScaleQuestion]o-[Annotation] - [<abstract>SliderQuestion]<:-[ScaleQuestion] - [AnnotatedScaleQuestion]<:--[ScaleQuestion] - [VisualAnalogueQuestion]<:--[ScaleQuestion] + [StudySubject]o-[StreamController] + [StudySubject]o-[Study] + [StudySubject]o-[Stream] + [<abstract>SupabaseObjectFunctions]<:-[StudySubject] - [VisualAnalogueQuestion - | - <static>+questionType: String; - +minimumColor: int; - +maximumColor: int; - +minimumAnnotation: String; - +maximumAnnotation: String + [<abstract>InterventionTask | - +Map<String, dynamic> toJson() + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> ] - [<abstract>SliderQuestion]<:-[VisualAnalogueQuestion] + [<abstract>Task]<:-[<abstract>InterventionTask] - [BooleanQuestion + [Intervention | - <static>+questionType: String + +id: String; + +name: String?; + +description: String?; + +icon: String; + +tasks: List<InterventionTask> | +Map<String, dynamic> toJson(); - +Answer<bool> constructAnswer() + +bool isBaseline() ] - [<abstract>Question]<:-[BooleanQuestion] - - [<abstract>Question + [CheckmarkTask | - <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>? + <static>+taskType: String | +Map<String, dynamic> toJson(); - +bool shouldBeShown(); - +Answer<V>? getDefaultAnswer(); - +Type getAnswerType(); - +String toString() + +Map<DateTime, T> extractPropertyResults(); + +Map<String, Type> getAvailableProperties(); + +String? getHumanReadablePropertyName() ] - [<abstract>Question]o-[QuestionConditional] + [<abstract>InterventionTask]<:-[CheckmarkTask] - [EligibilityCriterion + [Contact | - +id: String; - +reason: String?; - +condition: Expression + +organization: String; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String; + +website: String; + +phone: String; + +additionalInfo: String? | +Map<String, dynamic> toJson(); - +bool isSatisfied(); - +bool isViolated() + +String toString() ] - [EligibilityCriterion]o-[<abstract>Expression] - - [QuestionnaireTask + [<abstract>SupabaseObject | - <static>+taskType: String; - +questions: StudyUQuestionnaire + +primaryKeys: Map<String, dynamic> + | + +Map<String, dynamic> toJson() + ] + + [<abstract>SupabaseObjectFunctions | - +Map<String, dynamic> toJson(); - +Map<DateTime, T> extractPropertyResults(); - +Map<String, Type> getAvailableProperties(); - +String? getHumanReadablePropertyName() + <static>+T fromJson(); + +dynamic delete(); + +dynamic save() ] - [QuestionnaireTask]o-[StudyUQuestionnaire] - [<abstract>Observation]<:-[QuestionnaireTask] + [<abstract>SupabaseObject]<:--[<abstract>SupabaseObjectFunctions] - [<abstract>Observation + [SupabaseQuery | - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> + <static>+dynamic getAll(); + <static>+dynamic getById(); + <static>+dynamic batchUpsert(); + <static>+List<T> extractSupabaseList(); + <static>+T extractSupabaseSingleRow(); + <static>+void catchSupabaseException() ] - [<abstract>Task]<:-[<abstract>Observation] - - [StudySchedule + [Analytics | - <static>+numberOfInterventions: int; - +numberOfCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +sequence: PhaseSequence; - +sequenceCustom: String; - +length: int; - +nameOfSequence: String + <static>+logger: Logger; + <static>+onLog: StreamSubscription<LogRecord> | - +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() + <static>+void init(); + <static>+void dispose(); + <static>+dynamic captureEvent(); + <static>+dynamic captureException(); + <static>+dynamic captureMessage(); + <static>+void addBreadcrumb() ] - [StudySchedule]o-[PhaseSequence] + [Analytics]o-[Logger] + [Analytics]o-[StreamSubscription] - [PhaseSequence + [StudyUAnalytics | - +index: int; - <static>+values: List<PhaseSequence>; - <static>+alternating: PhaseSequence; - <static>+counterBalanced: PhaseSequence; - <static>+randomized: PhaseSequence; - <static>+customized: PhaseSequence + +enabled: bool; + +dsn: String; + +samplingRate: double?; + <static>+keyStudyUAnalytics: String + | + +Map<String, dynamic> toJson() ] - [PhaseSequence]o-[PhaseSequence] - [Enum]<:--[PhaseSequence] - - + - + - - - - - - + + - + - + - + - + + + - - - - - - - - - - - - - - - - - - - + - - - - - + - + - - - + + + - + - - - + + - + + - + + + + - - - + + - + - + + + + + + + + + + + + + + + - + - - - + + + - + - - - + - + + + + + + + + + + + + + - + - - + + + + + + + + + + - + - + - + - + - + - - - + + - + + - + - + + + + + - + - + - + - + - + - - - + - + - - + + + - - + - + - - + + + - - + - + - - + + + - - + - + - + - + - - - + - + + + - + - - + + - + - - - + + - - - + + - + - + - - + + - + - + + + + + - + - + - + - + + + - + - + + + + + - + - + + + - - - - - - - - - + + + + + - + - - - + - - - - - - - - - - + + - + - + - + - + - + + + + + + + + + + - - - - - + + - + - + - + - - + + + + + + + + + DataReference + + + + + + +task: String + +property: String + + + + + + +Map<String, dynamic> toJson() + +String toString() + +Map<DateTime, T> retrieveFromResults() + + + - - - - - - + + + + + - - - SupabaseObject + + + AverageSection - - - +primaryKeys: Map<String, dynamic> + + + <static>+sectionType: String + +aggregate: TemporalAggregation? + +resultProperty: DataReference<num>? - - - +Map<String, dynamic> toJson() + + + +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 + + - - - SupabaseObjectFunctions + + + <static>+expressionType: String + +expression: Expression - - - <static>+T fromJson() - +dynamic delete() - +dynamic save() + + + +Map<String, dynamic> toJson() + +bool? evaluate() - - - - + + + + + - - - SupabaseQuery + + + Expression - - - <static>+dynamic getAll() - <static>+dynamic getById() - <static>+dynamic batchUpsert() - <static>+List<T> extractSupabaseList() - <static>+T extractSupabaseSingleRow() - <static>+void catchSupabaseException() + + + <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> + <static>+keyType: String + +type: String? + + + + + + +Map<String, dynamic> toJson() + +String toString() + +bool? evaluate() - - - - - + + + + + - - - Analytics + + + BooleanExpression - - - <static>+logger: Logger - <static>+onLog: StreamSubscription<LogRecord> + + + <static>+expressionType: String - - - <static>+void init() - <static>+void dispose() - <static>+dynamic captureEvent() - <static>+dynamic captureException() - <static>+dynamic captureMessage() - <static>+void addBreadcrumb() + + + +Map<String, dynamic> toJson() + +bool checkValue() - - - + + + + + - - - Logger + + + ValueExpression - - - - + + + <static>+expressionType: String + +target: String? + + - - - StreamSubscription + + + +bool checkValue() + +bool? evaluate() - - - - - + + + + + - - - StudyUAnalytics + + + ChoiceExpression - - - +enabled: bool - +dsn: String - +samplingRate: double? - <static>+keyStudyUAnalytics: String + + + <static>+expressionType: String + +choices: Set<dynamic> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +bool checkValue() - - - + + + - + StudyResult - + <static>+studyResultTypes: Map<String, StudyResult Function(Map<String, dynamic>)> <static>+keyType: String @@ -1267,7 +1483,7 @@ - + +Map<String, dynamic> toJson() +List<String> getHeaders() @@ -1276,81 +1492,25 @@ - - - - - - - - - NumericResult - - - - - - <static>+studyResultType: String - +resultProperty: DataReference<num> - - - - - - +Map<String, dynamic> toJson() - +List<String> getHeaders() - +List<dynamic> getValues() - - - - - - - - - - - - - DataReference - - - - - - +task: String - +property: String - - - - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> retrieveFromResults() - - - - - - - + + + - + InterventionResult - + <static>+studyResultType: String - + +Map<String, dynamic> toJson() +List<String> getHeaders() @@ -1359,1504 +1519,1445 @@ - - - - - - - - InterventionTask - - - - - - <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - - - - - + + + + + - - - Task + + + NumericResult - - - <static>+keyType: String - +type: String - +id: String - +title: String? - +header: String? - +footer: String? - +schedule: Schedule + + + <static>+studyResultType: String + +resultProperty: DataReference<num> - - - +Map<String, dynamic> toJson() - +String toString() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + +Map<String, dynamic> toJson() + +List<String> getHeaders() + +List<dynamic> getValues() - - - - - + + + + + - - - Intervention + + + ConsentItem - - - +id: String - +name: String? - +description: String? - +icon: String - +tasks: List<InterventionTask> + + + +id: String + +title: String? + +description: String? + +iconName: String - - - +Map<String, dynamic> toJson() - +bool isBaseline() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - CheckmarkTask + + + QuestionConditional - - - <static>+taskType: String + + + <static>+keyDefaultValue: String + +defaultValue: V? + +condition: Expression - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + <static>-QuestionConditional<V> _fromJson() + +Map<String, dynamic> toJson() - - - - - + + + + + - - - ValueExpression + + + Question - - - <static>+expressionType: String - +target: String? + + + <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>? - - - +bool checkValue() - +bool? evaluate() + + + +Map<String, dynamic> toJson() + +bool shouldBeShown() + +Answer<V>? getDefaultAnswer() + +Type getAnswerType() + +String toString() - - - - - + + + + + - - - Expression + + + ChoiceQuestion - - - <static>+expressionTypes: Map<String, Expression Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String? + + + <static>+questionType: String + +multiple: bool + +choices: List<Choice> - - - +Map<String, dynamic> toJson() - +String toString() - +bool? evaluate() + + + +Map<String, dynamic> toJson() + +Answer<List<String>> constructAnswer() - - - - - + + + + + - - - BooleanExpression + + + Choice - - - <static>+expressionType: String + + + +id: String + +text: String - - - +Map<String, dynamic> toJson() - +bool checkValue() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - ChoiceExpression + + + BooleanQuestion - - - <static>+expressionType: String - +choices: Set<dynamic> + + + <static>+questionType: String - - - +Map<String, dynamic> toJson() - +bool checkValue() + + + +Map<String, dynamic> toJson() + +Answer<bool> constructAnswer() - - - - - + + + + + - - - NotExpression + + + SliderQuestion - - - <static>+expressionType: String - +expression: Expression + + + +minimum: double + +maximum: double + -_initial: double + +step: double + +initial: double - - - +Map<String, dynamic> toJson() - +bool? evaluate() + + + +Answer<num> constructAnswer() - - - - - + + + + + - - - StudyInvite + + + ScaleQuestion - - - <static>+tableName: String - +code: String - +studyId: String - +preselectedInterventionIds: List<String>? - +primaryKeys: Map<String, dynamic> + + + <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() + + + +Map<String, dynamic> toJson() + +Annotation addAnnotation() + -void _setAnnotationLabel() + <static>+int getAutostepSize() + <static>+List<int> generateMidValues() - - - - - + + + + + - - - SubjectProgress + + + Annotation - - - <static>+tableName: String - +completedAt: DateTime? - +subjectId: String - +interventionId: String - +taskId: String - +resultType: String - +result: Result<dynamic> - +startedAt: DateTime? - +primaryKeys: Map<String, dynamic> - +hashCode: int + + + +value: int + +annotation: String - - - +Map<String, dynamic> toJson() - +SubjectProgress setStartDateBackBy() - +bool ==() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Result + + + AnnotatedScaleQuestion - - - <static>+keyType: String - +type: String - +periodId: String? - <static>+keyResult: String - +result: T + + + <static>+questionType: String + +annotations: List<Annotation> - - - +Map<String, dynamic> toJson() - <static>-Result<dynamic> _fromJson() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - StudySubject + + + VisualAnalogueQuestion - - - <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 + + + <static>+questionType: String + +minimumColor: int + +maximumColor: int + +minimumAnnotation: String + +maximumAnnotation: String - - - +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() + + + +Map<String, dynamic> toJson() - - - + + + + + - - - StreamController + + + Answer - - - - - - - - - - Study + + + +question: String + +timestamp: DateTime + <static>+keyResponse: String + +response: V - - - <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>+Answer<dynamic> fromJson() + +String toString() - - - +Map<String, dynamic> toJson() - <static>+dynamic getResearcherDashboardStudies() - <static>+dynamic publishedPublicStudies() - +bool isOwner() - +bool isEditor() - +bool canEdit() - <static>+dynamic fetchResultsCSVTable() - +bool isReadonly() - +String toString() + + + + + + + + + + StudyUQuestionnaire - - - - + + + +questions: List<Question<dynamic>> + + - - - Stream + + + +List<dynamic> toJson() - - - - - + + + + + - - - AppConfig + + + EligibilityCriterion - - - <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> + + + +id: String + +reason: String? + +condition: Expression - - - +Map<String, dynamic> toJson() - <static>+dynamic getAppConfig() - <static>+dynamic getAppContact() + + + +Map<String, dynamic> toJson() + +bool isSatisfied() + +bool isViolated() - - - - - + + + + + - - - Contact + + + StudySchedule - - - +organization: String - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String - +website: String - +phone: String - +additionalInfo: String? + + + <static>+numberOfInterventions: int + +numberOfCycles: int + +phaseDuration: int + +includeBaseline: bool + +sequence: PhaseSequence + +sequenceCustom: String + +length: int + +nameOfSequence: String - - - +Map<String, dynamic> toJson() - +String toString() + + + +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() - - - - - - - - - Repo - - + + + + - - - <static>+tableName: String - +projectId: String - +userId: String - +studyId: String - +provider: GitProvider - +webUrl: String - +gitUrl: String - +primaryKeys: Map<String, dynamic> + + + PhaseSequence - - - +Map<String, dynamic> toJson() + + + +index: int + <static>+values: List<PhaseSequence> + <static>+alternating: PhaseSequence + <static>+counterBalanced: PhaseSequence + <static>+randomized: PhaseSequence + <static>+customized: PhaseSequence - - - - + + + + + - - - GitProvider + + + QuestionnaireTask - - - +index: int - <static>+values: List<GitProvider> - <static>+gitlab: GitProvider + + + <static>+taskType: String + +questions: StudyUQuestionnaire - - - - - - - - Enum + + + +Map<String, dynamic> toJson() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - + + + + - - - Participation + + + Observation - - - +index: int - <static>+values: List<Participation> - <static>+open: Participation - <static>+invite: Participation + + + <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> - - - - + + + + + - - - ResultSharing + + + Task - - - +index: int - <static>+values: List<ResultSharing> - <static>+public: ResultSharing - <static>+private: ResultSharing - <static>+organization: ResultSharing + + + <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() - - - - - + + + + + - - - StudyUQuestionnaire + + + Schedule - - - +questions: List<Question<dynamic>> + + + +completionPeriods: List<CompletionPeriod> + +reminders: List<StudyUTimeOfDay> - - - +List<dynamic> toJson() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - StudySchedule + + + CompletionPeriod - - - <static>+numberOfInterventions: int - +numberOfCycles: int - +phaseDuration: int - +includeBaseline: bool - +sequence: PhaseSequence - +sequenceCustom: String - +length: int - +nameOfSequence: String + + + +id: String + +unlockTime: StudyUTimeOfDay + +lockTime: StudyUTimeOfDay - - - +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() + + + +Map<String, dynamic> toJson() + +String formatted() + +String toString() + +bool contains() - - - - - + + + + + - - - ReportSpecification + + + StudyUTimeOfDay - - - +primary: ReportSection? - +secondary: List<ReportSection> + + + +hour: int + +minute: int - - - +Map<String, dynamic> toJson() - +String toString() + + + +String toJson() + +String toString() + +bool earlierThan() - - - - + + + + + - - - StudyStatus + + + TaskInstance - - - +index: int - <static>+values: List<StudyStatus> - <static>+draft: StudyStatus - <static>+running: StudyStatus - <static>+closed: StudyStatus + + + +task: Task + +id: String + +completionPeriod: CompletionPeriod - - - - - - - - - - LinearRegressionSection + + + <static>-Task _taskFromStudy() + <static>-Task _taskFromSubject() - - - <static>+sectionType: String - +resultProperty: DataReference<num>? - +alpha: double - +improvement: ImprovementDirection? - - + + + + + + - - - +Map<String, dynamic> toJson() + + + Result - - - - - - - - - ImprovementDirection + + + <static>+keyType: String + +type: String + +periodId: String? + <static>+keyResult: String + +result: T - - - +index: int - <static>+values: List<ImprovementDirection> - <static>+positive: ImprovementDirection - <static>+negative: ImprovementDirection + + + +Map<String, dynamic> toJson() + <static>-Result<dynamic> _fromJson() - - - - - + + + + + - - - ReportSection + + + Study - - - <static>+sectionTypes: Map<String, ReportSection Function(Map<String, dynamic>)> - <static>+keyType: String - +type: String - +id: String - +title: String? - +description: String? + + + <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() - +String toString() + + + +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() - - - - - - - - - AverageSection - - + + + + - - - <static>+sectionType: String - +aggregate: TemporalAggregation? - +resultProperty: DataReference<num>? + + + Participation - - - +Map<String, dynamic> toJson() + + + +index: int + <static>+values: List<Participation> + <static>+open: Participation + <static>+invite: Participation - - - - + + + + - - - TemporalAggregation + + + ResultSharing - - - +index: int - <static>+values: List<TemporalAggregation> - <static>+day: TemporalAggregation - <static>+phase: TemporalAggregation - <static>+intervention: TemporalAggregation + + + +index: int + <static>+values: List<ResultSharing> + <static>+public: ResultSharing + <static>+private: ResultSharing + <static>+organization: ResultSharing - - - - - + + + + + - - - ConsentItem + + + Contact - - - +id: String - +title: String? - +description: String? - +iconName: String + + + +organization: String + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String + +website: String + +phone: String + +additionalInfo: String? - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() + +String toString() - - - - - + + + + + - - - Schedule + + + Repo - - - +completionPeriods: List<CompletionPeriod> - +reminders: List<StudyUTimeOfDay> + + + <static>+tableName: String + +projectId: String + +userId: String + +studyId: String + +provider: GitProvider + +webUrl: String? + +gitUrl: String? + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - - - - - CompletionPeriod - - + + + + - - - +id: String - +unlockTime: StudyUTimeOfDay - +lockTime: StudyUTimeOfDay + + + StudyStatus - - - +Map<String, dynamic> toJson() - +String formatted() - +String toString() - +bool contains() + + + +index: int + <static>+values: List<StudyStatus> + <static>+draft: StudyStatus + <static>+running: StudyStatus + <static>+closed: StudyStatus - - - - - + + + + - - - StudyUTimeOfDay + + + SupabaseObjectFunctions - - - +hour: int - +minute: int + + + <static>+T fromJson() + +dynamic delete() + +dynamic save() - - - +String toJson() - +String toString() - +bool earlierThan() + + + + + + + + Comparable - - - - - + + + + + - - - TaskInstance + + + AppConfig - - - +task: Task - +id: String - +completionPeriod: CompletionPeriod + + + <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> - - - <static>-Task _taskFromStudy() - <static>-Task _taskFromSubject() + + + +Map<String, dynamic> toJson() + <static>+dynamic getAppConfig() + <static>+dynamic getAppContact() - - - - - + + + + + - - - Answer + + + StudyUAnalytics - - - +question: String - +timestamp: DateTime - <static>+keyResponse: String - +response: V + + + +enabled: bool + +dsn: String + +samplingRate: double? + <static>+keyStudyUAnalytics: String - - - +Map<String, dynamic> toJson() - <static>+Answer<dynamic> fromJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - QuestionConditional + + + SubjectProgress - - - <static>+keyDefaultValue: String - +defaultValue: V? - +condition: Expression + + + <static>+tableName: String + +completedAt: DateTime? + +subjectId: String + +interventionId: String + +taskId: String + +resultType: String + +result: Result<dynamic> + +startedAt: DateTime? + +primaryKeys: Map<String, dynamic> + +hashCode: int - - - <static>-QuestionConditional<V> _fromJson() - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +SubjectProgress setStartDateBackBy() + +bool ==() - - - - - + + + + + - - - ChoiceQuestion + + + StudyInvite - - - <static>+questionType: String - +multiple: bool - +choices: List<Choice> + + + <static>+tableName: String + +code: String + +studyId: String + +preselectedInterventionIds: List<String>? + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +Answer<List<String>> constructAnswer() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Question + + + StudyUUser - - - <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>? + + + <static>+tableName: String + +id: String + +email: String + +preferences: Preferences + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +bool shouldBeShown() - +Answer<V>? getDefaultAnswer() - +Type getAnswerType() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - + + + + + - - - Choice + + + Preferences - - - +id: String - +text: String + + + +language: String + +pinnedStudies: Set<String> - - - +Map<String, dynamic> toJson() - +String toString() + + + +Map<String, dynamic> toJson() - - - - - - - - - SliderQuestion - - + + + + - - - +minimum: double - +maximum: double - -_initial: double - +step: double - +initial: double + + + GitProvider - - - +Answer<num> constructAnswer() + + + +index: int + <static>+values: List<GitProvider> + <static>+gitlab: GitProvider - - - - - + + + + + - - - AnnotatedScaleQuestion + + + StudySubject - - - <static>+questionType: String - +annotations: List<Annotation> + + + <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() + + + +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() - - - - - + + + - - - Annotation + + + StreamController - - - +value: int - +annotation: String - - + + + + - - - +Map<String, dynamic> toJson() + + + Stream - - - - - - - - - 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 + + + InterventionTask - - - +Map<String, dynamic> toJson() - +Annotation addAnnotation() - -void _setAnnotationLabel() - <static>+int getAutostepSize() - <static>+List<int> generateMidValues() + + + <static>+taskTypes: Map<String, InterventionTask Function(Map<String, dynamic>)> - - - - - + + + + + - - - VisualAnalogueQuestion + + + Intervention - - - <static>+questionType: String - +minimumColor: int - +maximumColor: int - +minimumAnnotation: String - +maximumAnnotation: String + + + +id: String + +name: String? + +description: String? + +icon: String + +tasks: List<InterventionTask> - - - +Map<String, dynamic> toJson() + + + +Map<String, dynamic> toJson() + +bool isBaseline() - - - - - + + + + + - - - BooleanQuestion + + + CheckmarkTask - - - <static>+questionType: String + + + <static>+taskType: String - - - +Map<String, dynamic> toJson() - +Answer<bool> constructAnswer() + + + +Map<String, dynamic> toJson() + +Map<DateTime, T> extractPropertyResults() + +Map<String, Type> getAvailableProperties() + +String? getHumanReadablePropertyName() - - - - - + + + + + - - - EligibilityCriterion + + + SupabaseObject - - - +id: String - +reason: String? - +condition: Expression + + + +primaryKeys: Map<String, dynamic> - - - +Map<String, dynamic> toJson() - +bool isSatisfied() - +bool isViolated() + + + +Map<String, dynamic> toJson() - - - - - + + + + - - - QuestionnaireTask + + + SupabaseQuery - - - <static>+taskType: String - +questions: StudyUQuestionnaire + + + <static>+dynamic getAll() + <static>+dynamic getById() + <static>+dynamic batchUpsert() + <static>+List<T> extractSupabaseList() + <static>+T extractSupabaseSingleRow() + <static>+void catchSupabaseException() - - - +Map<String, dynamic> toJson() - +Map<DateTime, T> extractPropertyResults() - +Map<String, Type> getAvailableProperties() - +String? getHumanReadablePropertyName() + + + + + + + + + + Analytics - - - - - - - - - Observation + + + <static>+logger: Logger + <static>+onLog: StreamSubscription<LogRecord> - - - <static>+taskTypes: Map<String, Observation Function(Map<String, dynamic>)> + + + <static>+void init() + <static>+void dispose() + <static>+dynamic captureEvent() + <static>+dynamic captureException() + <static>+dynamic captureMessage() + <static>+void addBreadcrumb() - - - - + + + - - - PhaseSequence + + + Logger - - - +index: int - <static>+values: List<PhaseSequence> - <static>+alternating: PhaseSequence - <static>+counterBalanced: PhaseSequence - <static>+randomized: PhaseSequence - <static>+customized: PhaseSequence + + + + + + + + StreamSubscription diff --git a/docs/uml/designer_v2/lib/common_views/uml.svg b/docs/uml/designer_v2/lib/common_views/uml.svg index 5692bcf89..edb4e81fa 100644 --- a/docs/uml/designer_v2/lib/common_views/uml.svg +++ b/docs/uml/designer_v2/lib/common_views/uml.svg @@ -1,8 +1,38 @@ - - [NullHelperDecoration + + [FormSideSheetTab + | + +formViewBuilder: Widget Function(T) ] - [InputDecoration]<:-[NullHelperDecoration] + [FormSideSheetTab]o-[Widget Function(T)] + [NavbarTab]<:-[FormSideSheetTab] + + [SidesheetTab + | + +builder: Widget Function(BuildContext) + ] + + [SidesheetTab]o-[Widget Function(BuildContext)] + [NavbarTab]<:-[SidesheetTab] + + [Sidesheet + | + <static>+kDefaultWidth: double; + +titleText: String; + +body: Widget?; + +tabs: List<SidesheetTab>?; + +actionButtons: List<Widget>?; + +width: double?; + +withCloseButton: bool; + +ignoreAppBar: bool; + +collapseSingleTab: bool; + +bodyPadding: EdgeInsets?; + +wrapContent: Widget Function(Widget)? + ] + + [Sidesheet]o-[<abstract>Widget] + [Sidesheet]o-[EdgeInsets] + [Sidesheet]o-[Widget Function(Widget)?] [MouseEventsRegion | @@ -22,89 +52,76 @@ [MouseEventsRegion]o-[void Function(PointerExitEvent)?] [MouseEventsRegion]o-[SystemMouseCursor] - [ActionMenuInline - | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? + [ReactiveCustomColorPicker + ] + + [ReactiveFormField]<:-[ReactiveCustomColorPicker] + + [SplashPage | +Widget build() ] - [IconPack + [ErrorPage | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> + +error: Exception? | - <static>+IconOption? resolveIconByName() + +Widget build() ] - [IconOption + [<abstract>ConsumerWidget]<:-[ErrorPage] + + [AsyncValueWidget | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> + +value: AsyncValue<T>; + +data: Widget Function(T); + +error: Widget Function(Object, StackTrace?)?; + +loading: Widget Function()?; + +empty: Widget Function()? | - +String toJson(); - <static>+IconOption fromJson() + +Widget build(); + -Widget _buildDataOrEmptyWidget(); + -Widget _defaultError(); + -Widget _defaultLoad() ] - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] + [AsyncValueWidget]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[Widget Function(T)] + [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] + [AsyncValueWidget]o-[Widget Function()?] - [ReactiveIconPicker + [Search + | + +onQueryChanged: dynamic Function(String); + +searchController: SearchController?; + +hintText: String?; + +initialText: String? ] - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + [Search]o-[dynamic Function(String)] + [Search]o-[SearchController] - [IconPicker - | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool + [SearchController | - +Widget build() + +setText: void Function(String) ] - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] + [SearchController]o-[void Function(String)] - [IconPickerField + [HtmlStylingBanner | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool + +isDismissed: bool; + +onDismissed: dynamic Function()? | +Widget build() ] - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] + [HtmlStylingBanner]o-[dynamic Function()?] - [IconPickerGallery - | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double - | - +Widget build() + [NullHelperDecoration ] - [IconPickerGallery]o-[void Function(IconOption)?] + [InputDecoration]<:-[NullHelperDecoration] [<abstract>IWithBanner | @@ -141,42 +158,6 @@ [BannerStyle]o-[BannerStyle] [Enum]<:--[BannerStyle] - [Badge - | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle? - | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() - ] - - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] - - [BadgeType - | - +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType - ] - - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] - [ConstrainedWidthFlexible | +minWidth: double; @@ -193,62 +174,57 @@ [ConstrainedWidthFlexible]o-[<abstract>Widget] [ConstrainedWidthFlexible]o-[BoxConstraints] - [SecondaryButton + [ActionPopUpMenuButton | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? + +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() ] - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] + [ActionPopUpMenuButton]o-[Color] + [ActionPopUpMenuButton]o-[Axis] + [ActionPopUpMenuButton]o-[PopupMenuPosition] - [HtmlStylingBanner + [FormControlLabel | - +isDismissed: bool; - +onDismissed: dynamic Function()? + +formControl: AbstractControl<dynamic>; + +text: String; + +isClickable: bool; + +textStyle: TextStyle?; + +onClick: void Function(AbstractControl<dynamic>)? | +Widget build() ] - [HtmlStylingBanner]o-[dynamic Function()?] + [FormControlLabel]o-[<abstract>AbstractControl] + [FormControlLabel]o-[TextStyle] + [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - [NavbarTab + [EmptyBody | - +title: String; - +intent: RoutingIntent?; - +index: int; - +enabled: bool - ] - - [NavbarTab]o-[RoutingIntent] - - [TabbedNavbar + +icon: IconData?; + +leading: Widget?; + +leadingSpacing: double?; + +title: String?; + +description: String?; + +button: Widget? | - +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? + +Widget build() ] - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] + [EmptyBody]o-[IconData] + [EmptyBody]o-[<abstract>Widget] [ActionMenuType | @@ -261,51 +237,23 @@ [ActionMenuType]o-[ActionMenuType] [Enum]<:--[ActionMenuType] - [FormScaffold + [HelpIcon | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double - ] - - [FormScaffold]o-[<abstract>Widget] - - [<abstract>FormConsumerWidget + +tooltipText: String? | +Widget build() ] - [<abstract>FormConsumerRefWidget + [StudyULogo + | + +onTap: void Function()? | +Widget build() ] - [PrimaryButton - | - +text: String; - +icon: IconData?; - +isLoading: bool; - +showLoadingEarliestAfterMs: int; - +onPressed: void Function()?; - +tooltip: String; - +tooltipDisabled: String; - +enabled: bool; - +onPressedFuture: dynamic Function()?; - +innerPadding: EdgeInsets; - +minimumSize: Size?; - +isDisabled: bool - ] - - [PrimaryButton]o-[IconData] - [PrimaryButton]o-[void Function()?] - [PrimaryButton]o-[dynamic Function()?] - [PrimaryButton]o-[EdgeInsets] - [PrimaryButton]o-[Size] - - [SingleColumnLayout + [StudyULogo]o-[void Function()?] + + [SingleColumnLayout | <static>+defaultConstraints: BoxConstraints; <static>+defaultConstraintsNarrow: BoxConstraints; @@ -336,292 +284,306 @@ [SingleColumnLayoutType]o-[SingleColumnLayoutType] [Enum]<:--[SingleColumnLayoutType] - [FormTableRow + [<abstract>ISyncIndicatorViewModel | - +label: String?; - +labelBuilder: Widget Function(BuildContext)?; - +labelStyle: TextStyle?; - +labelHelpText: String?; - +input: Widget; - +control: AbstractControl<dynamic>?; - +layout: FormTableRowLayout? + +isDirty: bool; + +lastSynced: DateTime? ] - [FormTableRow]o-[Widget Function(BuildContext)?] - [FormTableRow]o-[TextStyle] - [FormTableRow]o-[<abstract>Widget] - [FormTableRow]o-[<abstract>AbstractControl] - [FormTableRow]o-[FormTableRowLayout] + [SyncIndicator + | + +state: AsyncValue<T>; + +lastSynced: DateTime?; + +isDirty: bool; + +animationDuration: int; + +iconSize: double + ] - [FormTableLayout + [SyncIndicator]o-[<abstract>AsyncValue] + + [TextParagraph | - +rows: List<FormTableRow>; - +columnWidths: Map<int, TableColumnWidth>; - +rowDivider: Widget?; - +rowLayout: FormTableRowLayout?; - +rowLabelStyle: TextStyle? + +text: String?; + +style: TextStyle?; + +selectable: bool; + +span: List<TextSpan>? | +Widget build() ] - [FormTableLayout]o-[<abstract>Widget] - [FormTableLayout]o-[FormTableRowLayout] - [FormTableLayout]o-[TextStyle] + [TextParagraph]o-[TextStyle] - [FormSectionHeader + [DismissButton | - +title: String; - +titleTextStyle: TextStyle?; - +helpText: String?; - +divider: bool; - +helpTextDisabled: bool + +onPressed: void Function()?; + +text: String? | +Widget build() ] - [FormSectionHeader]o-[TextStyle] + [DismissButton]o-[void Function()?] - [FormLabel + [Badge | - +labelText: String?; - +helpText: String?; - +labelTextStyle: TextStyle?; - +layout: FormTableRowLayout? + +icon: IconData?; + +color: Color?; + +borderRadius: double; + +label: String; + +type: BadgeType; + +padding: EdgeInsets; + +iconSize: double?; + +labelStyle: TextStyle? | - +Widget build() + +Widget build(); + -Color? _getBackgroundColor(); + -Color _getBorderColor(); + -Color? _getLabelColor() ] - [FormLabel]o-[TextStyle] - [FormLabel]o-[FormTableRowLayout] + [Badge]o-[IconData] + [Badge]o-[Color] + [Badge]o-[BadgeType] + [Badge]o-[EdgeInsets] + [Badge]o-[TextStyle] - [FormTableRowLayout + [BadgeType | +index: int; - <static>+values: List<FormTableRowLayout>; - <static>+vertical: FormTableRowLayout; - <static>+horizontal: FormTableRowLayout + <static>+values: List<BadgeType>; + <static>+filled: BadgeType; + <static>+outlined: BadgeType; + <static>+outlineFill: BadgeType; + <static>+plain: BadgeType ] - [FormTableRowLayout]o-[FormTableRowLayout] - [Enum]<:--[FormTableRowLayout] + [BadgeType]o-[BadgeType] + [Enum]<:--[BadgeType] - [FormSideSheetTab + [Hyperlink | - +formViewBuilder: Widget Function(T) + +text: String; + +url: String?; + +onClick: void Function()?; + +linkColor: Color; + +hoverColor: Color?; + +visitedColor: Color?; + +style: TextStyle?; + +hoverStyle: TextStyle?; + +visitedStyle: TextStyle?; + +icon: IconData?; + +iconSize: double? ] - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] + [Hyperlink]o-[void Function()?] + [Hyperlink]o-[Color] + [Hyperlink]o-[TextStyle] + [Hyperlink]o-[IconData] - [SidesheetTab + [FormScaffold | - +builder: Widget Function(BuildContext) + +formViewModel: T; + +actions: List<Widget>?; + +body: Widget; + +drawer: Widget?; + +actionsSpacing: double; + +actionsPadding: double ] - [SidesheetTab]o-[Widget Function(BuildContext)] - [NavbarTab]<:-[SidesheetTab] + [FormScaffold]o-[<abstract>Widget] - [Sidesheet + [PrimaryButton | - <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)? + +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 ] - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] + [PrimaryButton]o-[IconData] + [PrimaryButton]o-[void Function()?] + [PrimaryButton]o-[dynamic Function()?] + [PrimaryButton]o-[EdgeInsets] + [PrimaryButton]o-[Size] [UnderConstruction | +Widget build() ] - [DismissButton + [ActionMenuInline | - +onPressed: void Function()?; - +text: String? + +actions: List<ModelAction<dynamic>>; + +iconSize: double?; + +visible: bool; + +splashRadius: double?; + +paddingVertical: double?; + +paddingHorizontal: double? | +Widget build() ] - [DismissButton]o-[void Function()?] - - [TwoColumnLayout + [IconPack | - <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 + <static>+defaultPack: List<IconOption>; + <static>+material: List<IconOption> + | + <static>+IconOption? resolveIconByName() ] - [TwoColumnLayout]o-[VerticalDivider] - [TwoColumnLayout]o-[EdgeInsets] - [TwoColumnLayout]o-[<abstract>Widget] - [TwoColumnLayout]o-[BoxConstraints] - [TwoColumnLayout]o-[Color] - - [ErrorPage + [IconOption | - +error: Exception? + +name: String; + +icon: IconData?; + +isEmpty: bool; + +props: List<Object?> | - +Widget build() + +String toJson(); + <static>+IconOption fromJson() ] - [<abstract>ConsumerWidget]<:-[ErrorPage] + [IconOption]o-[IconData] + [<abstract>Equatable]<:-[IconOption] - [SplashPage - | - +Widget build() + [ReactiveIconPicker ] - [Hyperlink + [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + + [IconPicker | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +onSelect: void Function(IconOption)?; + +galleryIconSize: double?; + +selectedIconSize: double?; + +focusNode: FocusNode?; + +isDisabled: bool + | + +Widget build() ] - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] + [IconPicker]o-[IconOption] + [IconPicker]o-[void Function(IconOption)?] + [IconPicker]o-[FocusNode] - [StandardDialog + [IconPickerField | - +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 + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +selectedIconSize: double?; + +galleryIconSize: double?; + +onSelect: void Function(IconOption)?; + +focusNode: FocusNode?; + +isDisabled: bool | +Widget build() ] - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] + [IconPickerField]o-[IconOption] + [IconPickerField]o-[void Function(IconOption)?] + [IconPickerField]o-[FocusNode] - [StudyULogo + [IconPickerGallery | - +onTap: void Function()? + +iconOptions: List<IconOption>; + +onSelect: void Function(IconOption)?; + +iconSize: double | +Widget build() ] - [StudyULogo]o-[void Function()?] + [IconPickerGallery]o-[void Function(IconOption)?] - [HelpIcon - | - +tooltipText: String? + [<abstract>FormConsumerWidget | +Widget build() ] - [EmptyBody - | - +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? + [<abstract>FormConsumerRefWidget | +Widget build() ] - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] - - [ReactiveCustomColorPicker + [Collapsible + | + +contentBuilder: Widget Function(BuildContext, bool); + +headerBuilder: Widget Function(BuildContext, bool)?; + +title: String?; + +isCollapsed: bool ] - [ReactiveFormField]<:-[ReactiveCustomColorPicker] + [Collapsible]o-[Widget Function(BuildContext, bool)] + [Collapsible]o-[Widget Function(BuildContext, bool)?] - [TextParagraph + [StandardDialog | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? + +title: Widget?; + +titleText: String?; + +body: Widget; + +actionButtons: List<Widget>; + +backgroundColor: Color?; + +borderRadius: double?; + +width: double?; + +height: double?; + +minWidth: double; + +minHeight: double; + +maxWidth: double?; + +maxHeight: double?; + +padding: EdgeInsets | +Widget build() ] - [TextParagraph]o-[TextStyle] + [StandardDialog]o-[<abstract>Widget] + [StandardDialog]o-[Color] + [StandardDialog]o-[EdgeInsets] - [FormControlLabel + [SecondaryButton | - +formControl: AbstractControl<dynamic>; +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? + +icon: IconData?; + +isLoading: bool; + +onPressed: void Function()? | +Widget build() ] - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + [SecondaryButton]o-[IconData] + [SecondaryButton]o-[void Function()?] [StandardTableColumn | +label: String; +tooltip: String?; - +columnWidth: TableColumnWidth + +columnWidth: TableColumnWidth; + +sortable: bool; + +sortAscending: bool?; + +sortableIcon: Widget? ] [StandardTableColumn]o-[<abstract>TableColumnWidth] + [StandardTableColumn]o-[<abstract>Widget] [StandardTable | +items: List<T>; - +columns: List<StandardTableColumn>; + +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>)?; - +trailingActionsColumn: StandardTableColumn; + +inputTrailingActionsColumn: StandardTableColumn; +tableWrapper: Widget Function(Widget)?; +cellSpacing: double; +rowSpacing: double; @@ -640,6 +602,7 @@ [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)?] @@ -654,570 +617,770 @@ <static>+material: StandardTableStyle ] - [StandardTableStyle]o-[StandardTableStyle] - [Enum]<:--[StandardTableStyle] + [StandardTableStyle]o-[StandardTableStyle] + [Enum]<:--[StandardTableStyle] + + [TwoColumnLayout + | + <static>+defaultDivider: VerticalDivider; + <static>+defaultContentPadding: EdgeInsets; + <static>+slimContentPadding: EdgeInsets; + +leftWidget: Widget; + +rightWidget: Widget; + +dividerWidget: Widget?; + +headerWidget: Widget?; + +flexLeft: int?; + +flexRight: int?; + +constraintsLeft: BoxConstraints?; + +constraintsRight: BoxConstraints?; + +scrollLeft: bool; + +scrollRight: bool; + +paddingLeft: EdgeInsets?; + +paddingRight: EdgeInsets?; + +backgroundColorLeft: Color?; + +backgroundColorRight: Color?; + +stretchHeight: bool + ] + + [TwoColumnLayout]o-[VerticalDivider] + [TwoColumnLayout]o-[EdgeInsets] + [TwoColumnLayout]o-[<abstract>Widget] + [TwoColumnLayout]o-[BoxConstraints] + [TwoColumnLayout]o-[Color] + + [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] + + [FormTableRow + | + +label: String?; + +labelBuilder: Widget Function(BuildContext)?; + +labelStyle: TextStyle?; + +labelHelpText: String?; + +input: Widget; + +control: AbstractControl<dynamic>?; + +layout: FormTableRowLayout? + ] + + [FormTableRow]o-[Widget Function(BuildContext)?] + [FormTableRow]o-[TextStyle] + [FormTableRow]o-[<abstract>Widget] + [FormTableRow]o-[<abstract>AbstractControl] + [FormTableRow]o-[FormTableRowLayout] - [Collapsible + [FormTableLayout | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool + +rows: List<FormTableRow>; + +columnWidths: Map<int, TableColumnWidth>; + +rowDivider: Widget?; + +rowLayout: FormTableRowLayout?; + +rowLabelStyle: TextStyle? + | + +Widget build() ] - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] + [FormTableLayout]o-[<abstract>Widget] + [FormTableLayout]o-[FormTableRowLayout] + [FormTableLayout]o-[TextStyle] - [<abstract>ISyncIndicatorViewModel + [FormSectionHeader | - +isDirty: bool; - +lastSynced: DateTime? - ] - - [SyncIndicator + +title: String; + +titleTextStyle: TextStyle?; + +helpText: String?; + +divider: bool; + +helpTextDisabled: bool | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double + +Widget build() ] - [SyncIndicator]o-[<abstract>AsyncValue] + [FormSectionHeader]o-[TextStyle] - [ActionPopUpMenuButton + [FormLabel | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition + +labelText: String?; + +helpText: String?; + +labelTextStyle: TextStyle?; + +layout: FormTableRowLayout? | - +Widget build(); - -Widget _buildPopupMenu() + +Widget build() ] - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] + [FormLabel]o-[TextStyle] + [FormLabel]o-[FormTableRowLayout] - [AsyncValueWidget - | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? + [FormTableRowLayout | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() + +index: int; + <static>+values: List<FormTableRowLayout>; + <static>+vertical: FormTableRowLayout; + <static>+horizontal: FormTableRowLayout ] - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] + [FormTableRowLayout]o-[FormTableRowLayout] + [Enum]<:--[FormTableRowLayout] - + - + - - - - + + - + - + + + - + - + + + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - + + + - + - + - + - + - + - + - + - + - + + + + - + + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + + - + - + - + - + - + - - + + + - - + - + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - - + + + - - + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + + + + + + + + + + - - - NullHelperDecoration + + + FormSideSheetTab + + + + + + +formViewBuilder: Widget Function(T) - - - + + + - - - InputDecoration + + + Widget Function(T) + + + + + + + + + + + + NavbarTab + + + + + + +title: String + +intent: RoutingIntent? + +index: int + +enabled: bool + + + + + + + + + + + + SidesheetTab + + + + + + +builder: Widget Function(BuildContext) + + + + + + + + + + + Widget Function(BuildContext) + + + + + + + + + + + + Sidesheet + + + + + + <static>+kDefaultWidth: double + +titleText: String + +body: Widget? + +tabs: List<SidesheetTab>? + +actionButtons: List<Widget>? + +width: double? + +withCloseButton: bool + +ignoreAppBar: bool + +collapseSingleTab: bool + +bodyPadding: EdgeInsets? + +wrapContent: Widget Function(Widget)? + + + + + + + + + + + Widget + + + + + + + + + + + EdgeInsets + + + + + + + + + + + Widget Function(Widget)? - - + + - + MouseEventsRegion - + +onTap: void Function()? +onHover: void Function(PointerHoverEvent)? @@ -1233,9 +1396,9 @@ - + - + void Function()? @@ -1244,9 +1407,9 @@ - + - + void Function(PointerHoverEvent)? @@ -1255,9 +1418,9 @@ - + - + void Function(PointerEnterEvent)? @@ -1266,9 +1429,9 @@ - + - + void Function(PointerExitEvent)? @@ -1277,267 +1440,288 @@ - + - + SystemMouseCursor - - - - - + + + - - - ActionMenuInline + + + ReactiveCustomColorPicker - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? + + + + + + + + ReactiveFormField + + + + + + + + + + + + SplashPage - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - IconPack + + + ErrorPage - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> + + + +error: Exception? - - - <static>+IconOption? resolveIconByName() + + + +Widget build() - - - - - + + + - - - IconOption + + + ConsumerWidget - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> + + + + + + + + + + AsyncValueWidget - - - +String toJson() - <static>+IconOption fromJson() + + + +value: AsyncValue<T> + +data: Widget Function(T) + +error: Widget Function(Object, StackTrace?)? + +loading: Widget Function()? + +empty: Widget Function()? - - - - - - - - IconData + + + +Widget build() + -Widget _buildDataOrEmptyWidget() + -Widget _defaultError() + -Widget _defaultLoad() - - - + + + - - - Equatable + + + AsyncValue - - - + + + - - - ReactiveIconPicker + + + Widget Function(Object, StackTrace?)? - - - + + + - - - ReactiveFocusableFormField + + + Widget Function()? - - - - - + + + + - - - IconPicker + + + Search - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool + + + +onQueryChanged: dynamic Function(String) + +searchController: SearchController? + +hintText: String? + +initialText: String? - - - +Widget build() + + + + + + + + dynamic Function(String) - - - + + + + - - - void Function(IconOption)? + + + SearchController + + + + + + +setText: void Function(String) - - - + + + - - - FocusNode + + + void Function(String) - - - - - + + + + + - - - IconPickerField + + + HtmlStylingBanner - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool + + + +isDismissed: bool + +onDismissed: dynamic Function()? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - IconPickerGallery + + + dynamic Function()? - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double + + + + + + + + NullHelperDecoration - - - +Widget build() + + + + + + + + InputDecoration - - + + - + IWithBanner - + +Widget? banner() @@ -1546,16 +1730,16 @@ - - + + - + BannerBox - + +prefixIcon: Widget? +body: Widget @@ -1570,29 +1754,18 @@ - - - - - - - Widget - - - - - - + + - + BannerStyle - + +index: int <static>+values: List<BannerStyle> @@ -1603,132 +1776,30 @@ - - - - - - - EdgeInsets - - - - - - - - - - - dynamic Function()? - - - - - + - + Enum - - - - - - - - - Badge - - - - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? - - - - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() - - - - - - - - - - - Color - - - - - - - - - - - - BadgeType - - - - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType - - - - - - - - - - - TextStyle - - - - - - - + + + - + ConstrainedWidthFlexible - + +minWidth: double +maxWidth: double @@ -1739,7 +1810,7 @@ - + +Widget build() -double _getWidth() @@ -1749,177 +1820,199 @@ - + - + BoxConstraints - - - - - + + + + + - - - SecondaryButton + + + ActionPopUpMenuButton - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? + + + +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() - - - - - + + + - - - HtmlStylingBanner + + + Color - - - +isDismissed: bool - +onDismissed: dynamic Function()? + + + + + + + + Axis - - - +Widget build() + + + + + + + + PopupMenuPosition - - - - + + + + + - - - NavbarTab + + + FormControlLabel - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool + + + +formControl: AbstractControl<dynamic> + +text: String + +isClickable: bool + +textStyle: TextStyle? + +onClick: void Function(AbstractControl<dynamic>)? + + + + + + +Widget build() - - - + + + - - - RoutingIntent + + + AbstractControl - - - - + + + - - - TabbedNavbar + + + TextStyle - - - +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? + + + + + + + + void Function(AbstractControl<dynamic>)? - - - + + + + + - - - BoxDecoration + + + EmptyBody - - - - + + + +icon: IconData? + +leading: Widget? + +leadingSpacing: double? + +title: String? + +description: String? + +button: Widget? + + - - - void Function(int, T)? + + + +Widget build() - - - + + + - - - TabBarIndicatorSize + + + IconData - - + + - + ActionMenuType - + +index: int <static>+values: List<ActionMenuType> @@ -1929,118 +2022,69 @@ - - - - - - - - FormScaffold - - - - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double - - - - - - - - - - - - FormConsumerWidget - - + + + + + - - - +Widget build() + + + HelpIcon - - - - - - - - - FormConsumerRefWidget + + + +tooltipText: String? - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - PrimaryButton + + + StudyULogo - - - +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 + + + +onTap: void Function()? - - - - - - - - Size + + + +Widget build() - - - + + + - + SingleColumnLayout - + <static>+defaultConstraints: BoxConstraints <static>+defaultConstraintsNarrow: BoxConstraints @@ -2053,7 +2097,7 @@ - + <static>+dynamic fromType() @@ -2062,16 +2106,16 @@ - - + + - + SingleColumnLayoutType - + +index: int <static>+values: List<SingleColumnLayoutType> @@ -2083,660 +2127,669 @@ - - - - - - - - FormTableRow - - - - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? - - - - - - - - - - - Widget Function(BuildContext)? - - + + + + - - - - + + + ISyncIndicatorViewModel + + - - - AbstractControl + + + +isDirty: bool + +lastSynced: DateTime? - - - - + + + + - - - FormTableRowLayout + + + SyncIndicator - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout + + + +state: AsyncValue<T> + +lastSynced: DateTime? + +isDirty: bool + +animationDuration: int + +iconSize: double - - - - - + + + + + - - - FormTableLayout + + + TextParagraph - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? + + + +text: String? + +style: TextStyle? + +selectable: bool + +span: List<TextSpan>? - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - FormSectionHeader + + + DismissButton - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool + + + +onPressed: void Function()? + +text: String? - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - FormLabel + + + Badge - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? + + + +icon: IconData? + +color: Color? + +borderRadius: double + +label: String + +type: BadgeType + +padding: EdgeInsets + +iconSize: double? + +labelStyle: TextStyle? - - - +Widget build() + + + +Widget build() + -Color? _getBackgroundColor() + -Color _getBorderColor() + -Color? _getLabelColor() - - - - + + + + - - - FormSideSheetTab + + + BadgeType - - - +formViewBuilder: Widget Function(T) + + + +index: int + <static>+values: List<BadgeType> + <static>+filled: BadgeType + <static>+outlined: BadgeType + <static>+outlineFill: BadgeType + <static>+plain: BadgeType - - - + + + + - - - Widget Function(T) + + + Hyperlink - - - - - - - - - SidesheetTab + + + +text: String + +url: String? + +onClick: void Function()? + +linkColor: Color + +hoverColor: Color? + +visitedColor: Color? + +style: TextStyle? + +hoverStyle: TextStyle? + +visitedStyle: TextStyle? + +icon: IconData? + +iconSize: double? - - - +builder: Widget Function(BuildContext) + + + + + + + + + FormScaffold - - - - - - - - Widget Function(BuildContext) + + + +formViewModel: T + +actions: List<Widget>? + +body: Widget + +drawer: Widget? + +actionsSpacing: double + +actionsPadding: double - - - - + + + + - - - Sidesheet + + + PrimaryButton - - - <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)? + + + +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 - - - + + + - - - Widget Function(Widget)? + + + Size - - + + - + UnderConstruction - + +Widget build() - - - - - + + + + + - - - DismissButton + + + ActionMenuInline - - - +onPressed: void Function()? - +text: String? + + + +actions: List<ModelAction<dynamic>> + +iconSize: double? + +visible: bool + +splashRadius: double? + +paddingVertical: double? + +paddingHorizontal: double? - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - TwoColumnLayout + + + IconPack - - - <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 + + + <static>+defaultPack: List<IconOption> + <static>+material: List<IconOption> - - - - - - - - VerticalDivider + + + <static>+IconOption? resolveIconByName() - - - - - + + + + + - - - ErrorPage + + + IconOption - - - +error: Exception? + + + +name: String + +icon: IconData? + +isEmpty: bool + +props: List<Object?> - - - +Widget build() + + + +String toJson() + <static>+IconOption fromJson() - - - + + + - - - ConsumerWidget + + + Equatable - - - - + + + - - - SplashPage + + + ReactiveIconPicker - - - +Widget build() + + + + + + + + ReactiveFocusableFormField - - - - + + + + + - - - Hyperlink + + + IconPicker - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +onSelect: void Function(IconOption)? + +galleryIconSize: double? + +selectedIconSize: double? + +focusNode: FocusNode? + +isDisabled: bool - - - - - - - - - - StandardDialog + + + +Widget build() - - - +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 + + + + + + + + void Function(IconOption)? - - - +Widget build() + + + + + + + + FocusNode - - - - - + + + + + - - - StudyULogo + + + IconPickerField - - - +onTap: void Function()? + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +selectedIconSize: double? + +galleryIconSize: double? + +onSelect: void Function(IconOption)? + +focusNode: FocusNode? + +isDisabled: bool - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - HelpIcon + + + IconPickerGallery - - - +tooltipText: String? + + + +iconOptions: List<IconOption> + +onSelect: void Function(IconOption)? + +iconSize: double - - - +Widget build() + + + +Widget build() - - - - - + + + + - - - EmptyBody + + + FormConsumerWidget - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? + + + +Widget build() - - - +Widget build() + + + + + + + + + FormConsumerRefWidget - - - - - - - - ReactiveCustomColorPicker + + + +Widget build() - - - + + + + - - - ReactiveFormField + + + Collapsible - - - - - - - - - - TextParagraph + + + +contentBuilder: Widget Function(BuildContext, bool) + +headerBuilder: Widget Function(BuildContext, bool)? + +title: String? + +isCollapsed: bool - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? + + + + + + + + Widget Function(BuildContext, bool) - - - +Widget build() + + + + + + + + Widget Function(BuildContext, bool)? - - - - - + + + + + - - - FormControlLabel + + + StandardDialog - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? + + + +title: Widget? + +titleText: String? + +body: Widget + +actionButtons: List<Widget> + +backgroundColor: Color? + +borderRadius: double? + +width: double? + +height: double? + +minWidth: double + +minHeight: double + +maxWidth: double? + +maxHeight: double? + +padding: EdgeInsets - - - +Widget build() + + + +Widget build() - - - + + + + + - - - void Function(AbstractControl<dynamic>)? + + + SecondaryButton + + + + + + +text: String + +icon: IconData? + +isLoading: bool + +onPressed: void Function()? + + + + + + +Widget build() - - + + - + StandardTableColumn - + +label: String +tooltip: String? +columnWidth: TableColumnWidth + +sortable: bool + +sortAscending: bool? + +sortableIcon: Widget? - + - + TableColumnWidth @@ -2745,47 +2798,49 @@ - - + + - + StandardTable - + +items: List<T> - +columns: List<StandardTableColumn> + +inputColumns: List<StandardTableColumn> +onSelectItem: void Function(T) +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? +trailingActionsMenuType: ActionMenuType? - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +trailingActionsColumn: 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 + +sortColumnPredicates: List<int Function(T, T)?>? + +pinnedPredicates: int Function(T, T)? + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? + +inputTrailingActionsColumn: StandardTableColumn + +tableWrapper: Widget Function(Widget)? + +cellSpacing: double + +rowSpacing: double + +minRowHeight: double? + +showTableHeader: bool + +hideLeadingTrailingWhenEmpty: bool + +leadingWidget: Widget? + +trailingWidget: Widget? + +leadingWidgetSpacing: double? + +trailingWidgetSpacing: double? + +emptyWidget: Widget? + +rowStyle: StandardTableStyle + +disableRowInteractions: bool - + - + void Function(T) @@ -2794,20 +2849,31 @@ - + - + List<ModelAction<dynamic>> Function(T, int)? + + + + + + + int Function(T, T)? + + + + - + - + TableRow Function(BuildContext, List<StandardTableColumn>)? @@ -2816,16 +2882,16 @@ - - + + - + StandardTableStyle - + +index: int <static>+values: List<StandardTableStyle> @@ -2835,209 +2901,265 @@ - - - - + + + + - - - Collapsible + + + TwoColumnLayout - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool + + + <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 Function(BuildContext, bool) + + + VerticalDivider - - - + + + - - - Widget Function(BuildContext, bool)? + + + RoutingIntent - - - - + + + + - - - ISyncIndicatorViewModel + + + TabbedNavbar - - - +isDirty: bool - +lastSynced: DateTime? + + + +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? - - - - + + + - - - SyncIndicator + + + BoxDecoration - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double + + + + + + + + void Function(int, T)? - - - + + + - - - AsyncValue + + + TabBarIndicatorSize - - - - - + + + + - - - ActionPopUpMenuButton + + + FormTableRow - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition + + + +label: String? + +labelBuilder: Widget Function(BuildContext)? + +labelStyle: TextStyle? + +labelHelpText: String? + +input: Widget + +control: AbstractControl<dynamic>? + +layout: FormTableRowLayout? - - - +Widget build() - -Widget _buildPopupMenu() + + + + + + + + Widget Function(BuildContext)? - - - + + + + - - - Axis + + + FormTableRowLayout + + + + + + +index: int + <static>+values: List<FormTableRowLayout> + <static>+vertical: FormTableRowLayout + <static>+horizontal: FormTableRowLayout - - - + + + + + - - - PopupMenuPosition + + + FormTableLayout + + + + + + +rows: List<FormTableRow> + +columnWidths: Map<int, TableColumnWidth> + +rowDivider: Widget? + +rowLayout: FormTableRowLayout? + +rowLabelStyle: TextStyle? + + + + + + +Widget build() - - - - - + + + + + - - - AsyncValueWidget + + + FormSectionHeader - - - +value: AsyncValue<T> - +data: Widget Function(T) - +error: Widget Function(Object, StackTrace?)? - +loading: Widget Function()? - +empty: Widget Function()? + + + +title: String + +titleTextStyle: TextStyle? + +helpText: String? + +divider: bool + +helpTextDisabled: bool - - - +Widget build() - -Widget _buildDataOrEmptyWidget() - -Widget _defaultError() - -Widget _defaultLoad() + + + +Widget build() - - - + + + + + - - - Widget Function(Object, StackTrace?)? + + + FormLabel - - - - + + + +labelText: String? + +helpText: String? + +labelTextStyle: TextStyle? + +layout: FormTableRowLayout? + + - - - Widget Function()? + + + +Widget build() diff --git a/docs/uml/designer_v2/lib/domain/uml.svg b/docs/uml/designer_v2/lib/domain/uml.svg index 7347d0e77..f805ecdb6 100644 --- a/docs/uml/designer_v2/lib/domain/uml.svg +++ b/docs/uml/designer_v2/lib/domain/uml.svg @@ -1,5 +1,29 @@ - - [<abstract>ResultTypes + + [StudyTemplates + | + <static>+kUnnamedStudyTitle: String + | + <static>+Study emptyDraft() + ] + + [StudyActionType + | + +index: int; + <static>+values: List<StudyActionType>; + <static>+pin: StudyActionType; + <static>+pinoff: StudyActionType; + <static>+edit: StudyActionType; + <static>+duplicate: StudyActionType; + <static>+duplicateDraft: StudyActionType; + <static>+addCollaborator: StudyActionType; + <static>+export: StudyActionType; + <static>+delete: StudyActionType + ] + + [StudyActionType]o-[StudyActionType] + [Enum]<:--[StudyActionType] + + [<abstract>ResultTypes ] [MeasurementResultTypes @@ -28,57 +52,98 @@ [StudyExportData]o-[Study] - [StudyTemplates - | - <static>+kUnnamedStudyTitle: String - | - <static>+Study emptyDraft() - ] - - [StudyActionType - | - +index: int; - <static>+values: List<StudyActionType>; - <static>+edit: StudyActionType; - <static>+duplicate: StudyActionType; - <static>+duplicateDraft: StudyActionType; - <static>+addCollaborator: StudyActionType; - <static>+export: StudyActionType; - <static>+delete: StudyActionType - ] - - [StudyActionType]o-[StudyActionType] - [Enum]<:--[StudyActionType] - - + - - - - - - + + - + + + + - + + + + + + - + - - + + + + + + + + + StudyTemplates + + + + + + <static>+kUnnamedStudyTitle: String + + + + + + <static>+Study emptyDraft() + + + + + + + + + + + + StudyActionType + + + + + + +index: int + <static>+values: List<StudyActionType> + <static>+pin: StudyActionType + <static>+pinoff: StudyActionType + <static>+edit: StudyActionType + <static>+duplicate: StudyActionType + <static>+duplicateDraft: StudyActionType + <static>+addCollaborator: StudyActionType + <static>+export: StudyActionType + <static>+delete: StudyActionType + + + + + + + + + + + Enum + + + - - + - + ResultTypes @@ -87,16 +152,16 @@ - - + + - + MeasurementResultTypes - + <static>+questionnaire: String <static>+values: List<String> @@ -106,16 +171,16 @@ - - + + - + InterventionResultTypes - + <static>+checkmarkTask: String <static>+values: List<String> @@ -125,16 +190,16 @@ - - + + - + StudyExportData - + +study: Study +measurementsData: List<Map<String, dynamic>> @@ -146,76 +211,15 @@ - + - + Study - - - - - - - - - StudyTemplates - - - - - - <static>+kUnnamedStudyTitle: String - - - - - - <static>+Study emptyDraft() - - - - - - - - - - - - StudyActionType - - - - - - +index: int - <static>+values: List<StudyActionType> - <static>+edit: StudyActionType - <static>+duplicate: StudyActionType - <static>+duplicateDraft: StudyActionType - <static>+addCollaborator: StudyActionType - <static>+export: StudyActionType - <static>+delete: StudyActionType - - - - - - - - - - - Enum - - - - diff --git a/docs/uml/designer_v2/lib/features/auth/uml.svg b/docs/uml/designer_v2/lib/features/auth/uml.svg index d78167a48..1774ab483 100644 --- a/docs/uml/designer_v2/lib/features/auth/uml.svg +++ b/docs/uml/designer_v2/lib/features/auth/uml.svg @@ -1,4 +1,4 @@ - + [AuthScaffold | +body: Widget; @@ -12,26 +12,6 @@ [AuthScaffold]o-[AuthFormKey] [AuthScaffold]o-[EdgeInsets] - [PasswordRecoveryForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - - [LoginForm - | - +formKey: AuthFormKey - | - +Widget build() - ] - - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [SignupForm | +formKey: AuthFormKey @@ -44,21 +24,26 @@ [SignupForm]o-[AuthFormKey] [<abstract>FormConsumerRefWidget]<:-[SignupForm] - [PasswordForgotForm + [PasswordRecoveryForm | +formKey: AuthFormKey | +Widget build() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [StudyUJobsToBeDone + [PasswordForgotForm + | + +formKey: AuthFormKey | +Widget build() ] + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [AuthFormController | +authRepository: IAuthRepository; @@ -142,110 +127,125 @@ [PasswordTextField]o-[FormControl] + [StudyUJobsToBeDone + | + +Widget build() + ] + + [LoginForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] + - + - - + + - + - + - + - + - + - + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - - + + - + - + + + + + + - - + - + - + - + + + - - + + - + AuthScaffold - + +body: Widget +formKey: AuthFormKey @@ -258,9 +258,9 @@ - + - + Widget @@ -269,16 +269,16 @@ - - + + - + AuthFormKey - + +index: int <static>+values: List<AuthFormKey> @@ -294,159 +294,116 @@ - + - + EdgeInsets - - - - - + + + + + - - - PasswordRecoveryForm + + + SignupForm - - - +formKey: AuthFormKey + + + +formKey: AuthFormKey - - - +Widget build() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - + - + FormConsumerRefWidget - - - - - - - - - LoginForm - - - - - - +formKey: AuthFormKey - - - - - - +Widget build() - - - - - - - - - + + + + + - - - SignupForm + + + PasswordRecoveryForm - - - +formKey: AuthFormKey + + + +formKey: AuthFormKey - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + +Widget build() - - - + + + - + PasswordForgotForm - + +formKey: AuthFormKey - + +Widget build() - - - - - - - - StudyUJobsToBeDone - - - - - - +Widget build() - - - - - - - + + + - + AuthFormController - + +authRepository: IAuthRepository +sharedPreferences: SharedPreferences @@ -470,7 +427,7 @@ - + -dynamic _onChangeFormKey() +dynamic resetControlsFor() @@ -493,9 +450,9 @@ - + - + IAuthRepository @@ -504,9 +461,9 @@ - + - + SharedPreferences @@ -515,9 +472,9 @@ - + - + INotificationService @@ -526,9 +483,9 @@ - + - + GoRouter @@ -537,9 +494,9 @@ - + - + FormControl @@ -548,9 +505,9 @@ - + - + FormGroup @@ -559,9 +516,9 @@ - + - + IFormGroupController @@ -570,9 +527,9 @@ - + - + Enum @@ -581,16 +538,16 @@ - - + + - + EmailTextField - + +labelText: String +hintText: String? @@ -602,16 +559,16 @@ - - + + - + PasswordTextField - + +labelText: String +hintText: String? @@ -621,6 +578,49 @@ + + + + + + + + StudyUJobsToBeDone + + + + + + +Widget build() + + + + + + + + + + + + + LoginForm + + + + + + +formKey: AuthFormKey + + + + + + +Widget build() + + + + diff --git a/docs/uml/designer_v2/lib/features/dashboard/uml.svg b/docs/uml/designer_v2/lib/features/dashboard/uml.svg index 8ef8d1491..ccec9ae80 100644 --- a/docs/uml/designer_v2/lib/features/dashboard/uml.svg +++ b/docs/uml/designer_v2/lib/features/dashboard/uml.svg @@ -1,27 +1,45 @@ - - [StudiesFilter + + [DashboardController | - +index: int; - <static>+values: List<StudiesFilter> - ] - - [Enum]<:--[StudiesFilter] - - [DashboardScaffold - | - +body: Widget + +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() ] - [DashboardScaffold]o-[<abstract>Widget] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] [StudiesTable | +studies: List<Study>; +onSelect: void Function(Study); +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController; + +pinnedPredicates: int Function(Study, Study); + -_sortColumns: List<int Function(Study, Study)?> | +Widget build(); -List<Widget> _buildRow() @@ -30,175 +48,245 @@ [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 + [DashboardScaffold | - +filter: StudiesFilter? + +body: Widget + | + +Widget build() ] - [DashboardScreen]o-[StudiesFilter] + [DashboardScaffold]o-[<abstract>Widget] - [DashboardController + [StudiesFilter | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +index: int; + <static>+values: List<StudiesFilter> + ] + + [Enum]<:--[StudiesFilter] + + [DashboardScreen | - -dynamic _subscribeStudies(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + +filter: StudiesFilter? ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [<abstract>IModelActionProvider]<:--[DashboardController] + [DashboardScreen]o-[StudiesFilter] - + - + - - - + + + + - - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + - + - + - + - + - + - + - + + + + + - + - - - - - + + + + + + + + + + - - - StudiesFilter + + + DashboardController - - - +index: int - <static>+values: List<StudiesFilter> + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + + + + + + -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() - - - + + + - - - Enum + + + IStudyRepository - - - - - + + + - - - DashboardScaffold + + + IAuthRepository - - - +body: Widget + + + + + + + + IUserRepository - - - +Widget build() + + + + + + + + GoRouter - - - + + + - - - Widget + + + StreamSubscription + + + + + + + + + + + SearchController + + + + + + + + + + + IModelActionProvider - - - + + + - + 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() @@ -208,9 +296,9 @@ - + - + void Function(Study) @@ -219,117 +307,106 @@ - + - + List<ModelAction<dynamic>> Function(Study) - - - - + + + - - - DashboardScreen + + + Widget - - - +filter: StudiesFilter? + + + + + + + + int Function(Study, Study) - - - - - + + + + + - - - DashboardController + + + DashboardScaffold - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + + + +body: Widget - - - -dynamic _subscribeStudies() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +Widget build() - - - + + + + - - - IStudyRepository + + + StudiesFilter - - - - - - - - IAuthRepository + + + +index: int + <static>+values: List<StudiesFilter> - - - + + + - - - GoRouter + + + Enum - - - + + + + - - - StreamSubscription + + + DashboardScreen - - - - - - - - IModelActionProvider + + + +filter: StudiesFilter? diff --git a/docs/uml/designer_v2/lib/features/design/enrollment/uml.svg b/docs/uml/designer_v2/lib/features/design/enrollment/uml.svg index 71bc20025..955c6ad8f 100644 --- a/docs/uml/designer_v2/lib/features/design/enrollment/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/enrollment/uml.svg @@ -1,10 +1,26 @@ - - [ConsentItemFormView + + [StudyDesignEnrollmentFormView | - +formViewModel: ConsentItemFormViewModel + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + + [ConsentItemFormData + | + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String + | + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() + ] + + [<abstract>IFormData]<:-[ConsentItemFormData] [EnrollmentFormData | @@ -22,15 +38,6 @@ [EnrollmentFormData]o-[QuestionnaireFormData] [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [StudyDesignEnrollmentFormView - | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [ConsentItemFormViewModel | +consentIdControl: FormControl<String>; @@ -166,205 +173,216 @@ [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [ConsentItemFormData + [ConsentItemFormView | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +formViewModel: ConsentItemFormViewModel ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - + - + - - + + + + + + - + - + - - - - - + - + - - - - + + - + - + - + - - - + + + - + - - - + + + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - - - - - - - + + + + + + + + + - - - ConsentItemFormView + + + StudyDesignEnrollmentFormView - - - +formViewModel: ConsentItemFormViewModel + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - - + + + - - - ConsentItemFormViewModel + + + StudyDesignPageWidget - - - +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> + + + + + + + + + + ConsentItemFormData - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String + + + + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() + + + + + + + + + + + IFormData - - - + + + - + EnrollmentFormData - + <static>+kDefaultEnrollmentType: Participation +enrollmentType: Participation @@ -374,7 +392,7 @@ - + +Study apply() +EnrollmentFormData copy() @@ -384,9 +402,9 @@ - + - + Participation @@ -395,9 +413,9 @@ - + - + QuestionnaireFormData @@ -406,51 +424,56 @@ - + - + IStudyFormData - - - - + + + + + - - - StudyDesignEnrollmentFormView + + + ConsentItemFormViewModel - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + +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> - - - - - - - - StudyDesignPageWidget + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - + - + FormControl @@ -459,9 +482,9 @@ - + - + FormGroup @@ -470,9 +493,9 @@ - + - + ManagedFormViewModel @@ -481,16 +504,16 @@ - - + + - + IScreenerQuestionLogicFormViewModel - + +isDirtyOptionsBannerVisible: bool @@ -499,23 +522,23 @@ - - - + + + - + ScreenerQuestionLogicFormView - + +formViewModel: ScreenerQuestionFormViewModel - + +Widget build() -dynamic _buildInfoBanner() @@ -527,17 +550,17 @@ - - - + + + - + ScreenerQuestionFormViewModel - + <static>+defaultResponseOptionValidity: bool +responseOptionsDisabledArray: FormArray<dynamic> @@ -553,7 +576,7 @@ - + +dynamic onResponseOptionsChanged() +void setControlsFrom() @@ -568,9 +591,9 @@ - + - + FormConsumerWidget @@ -579,9 +602,9 @@ - + - + FormArray @@ -590,9 +613,9 @@ - + - + QuestionFormViewModel @@ -601,17 +624,17 @@ - - - + + + - + EnrollmentFormViewModel - + +study: Study +router: GoRouter @@ -630,7 +653,7 @@ - + +void setControlsFrom() +EnrollmentFormData buildFormData() @@ -653,9 +676,9 @@ - + - + Study @@ -664,9 +687,9 @@ - + - + GoRouter @@ -675,17 +698,17 @@ - - - + + + - + EnrollmentFormConsentItemDelegate - + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> +owner: EnrollmentFormViewModel @@ -694,7 +717,7 @@ - + +void onCancel() +dynamic onSave() @@ -708,9 +731,9 @@ - + - + FormViewModelCollection @@ -719,9 +742,9 @@ - + - + FormViewModel @@ -730,9 +753,9 @@ - + - + WithQuestionnaireControls @@ -741,9 +764,9 @@ - + - + IFormViewModelDelegate @@ -752,9 +775,9 @@ - + - + IListActionProvider @@ -763,52 +786,29 @@ - + - + IProviderArgsResolver - - - - - - - - - ConsentItemFormData - - - - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String - - + + + + - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + ConsentItemFormView - - - - - - - - IFormData + + + +formViewModel: ConsentItemFormViewModel diff --git a/docs/uml/designer_v2/lib/features/design/info/uml.svg b/docs/uml/designer_v2/lib/features/design/info/uml.svg index 73fec0c28..580464fbd 100644 --- a/docs/uml/designer_v2/lib/features/design/info/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/info/uml.svg @@ -1,38 +1,5 @@ - - [StudyInfoFormData - | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] - - [StudyContactInfoFormData - | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - - [StudyDesignInfoFormView + + [StudyDesignInfoFormView | +Widget build() ] @@ -77,129 +44,87 @@ [StudyInfoFormViewModel]o-[FormGroup] [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [StudyInfoFormData + | + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() + ] + + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] + + [StudyContactInfoFormData + | + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() + ] + + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + - + - + + + - - - - + - - - - - - - - + - + - + - + - + + + - + - - - - - - - - - - - StudyInfoFormData - - - - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - - - - - - - - - - - StudyContactInfoFormData - - - - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String - - - - - - +Study apply() - +StudyInfoFormData copy() - - - + + - - - - - - - IStudyFormData - - - + + + + - - + + - + StudyDesignInfoFormView - + +Widget build() @@ -208,9 +133,9 @@ - + - + StudyDesignPageWidget @@ -219,17 +144,17 @@ - - - + + + - + StudyInfoFormViewModel - + +study: Study +titleControl: FormControl<String> @@ -260,7 +185,7 @@ - + +void setControlsFrom() +StudyInfoFormData buildFormData() @@ -270,9 +195,9 @@ - + - + Study @@ -281,9 +206,9 @@ - + - + FormControl @@ -292,9 +217,9 @@ - + - + FormGroup @@ -303,15 +228,90 @@ - + - + FormViewModel + + + + + + + + + StudyInfoFormData + + + + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + + + StudyContactInfoFormData + + + + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + IStudyFormData + + + + diff --git a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg index 26f2ca3d1..5cb20f421 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/types/uml.svg @@ -1,17 +1,5 @@ - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType + [SurveyQuestionType | +index: int; <static>+values: List<SurveyQuestionType>; @@ -23,6 +11,16 @@ [SurveyQuestionType]o-[SurveyQuestionType] [Enum]<:--[SurveyQuestionType] + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [BoolQuestionFormView | +formViewModel: QuestionFormViewModel @@ -33,15 +31,17 @@ [BoolQuestionFormView]o-[QuestionFormViewModel] [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [ChoiceQuestionFormView + [<abstract>IScaleQuestionFormViewModel | - +formViewModel: QuestionFormViewModel + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView | - +Widget build() + +formViewModel: QuestionFormViewModel ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [ScaleQuestionFormView]o-[QuestionFormViewModel] @@ -50,63 +50,85 @@ - - - - - - + + - + - + + + + + + - + + - - - + + + - + - - - - - - + + + + - - - IScaleQuestionFormViewModel + + + SurveyQuestionType - - - +isMidValuesClearedInfoVisible: bool + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType - - - - + + + - - - ScaleQuestionFormView + + + Enum - - - +formViewModel: QuestionFormViewModel + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() @@ -122,35 +144,13 @@ - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - - - - - - - + + + - - - Enum + + + ConsumerWidget @@ -180,38 +180,38 @@ - - - + + + + - - - ConsumerWidget + + + IScaleQuestionFormViewModel - - - - - - - - - - ChoiceQuestionFormView + + + +isMidValuesClearedInfoVisible: bool - - - +formViewModel: QuestionFormViewModel + + + + + + + + + ScaleQuestionFormView - - - +Widget build() + + + +formViewModel: QuestionFormViewModel diff --git a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg index f2b9959ba..546c7e447 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/question/uml.svg @@ -1,80 +1,47 @@ - - [QuestionFormViewModel + + [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 | - <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 + ] + + [ScaleQuestionFormView | - +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() + +formViewModel: QuestionFormViewModel ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [ScaleQuestionFormView]o-[QuestionFormViewModel] [<abstract>QuestionFormData | @@ -146,49 +113,82 @@ [ScaleQuestionFormData]o-[Color] [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [<abstract>IScaleQuestionFormViewModel + [QuestionFormViewModel | + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_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 - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() + +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() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] [SurveyQuestionFormView | @@ -202,91 +202,149 @@ - + - + + + + + + + + + - + - + + + - + - + + + - + - + - + - - - + + + + + + + + + + - - + + + - + - - - - - - - - - + - + - - - + - + - + - + + + - + - - + + - + - - - - - + + + + + + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + + + - - - - - + + + + + + + Enum + + + + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -341,7 +399,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -362,96 +420,91 @@ - - - - + + + - - - SurveyQuestionType + + + ConsumerWidget - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType + + + + + + + + + + BoolQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - FormControl + + + +Widget build() - - - + + + + - - - FormArray + + + IScaleQuestionFormViewModel - - - - - - - - FormGroup + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - ManagedFormViewModel + + + ScaleQuestionFormView - - - - - - - - IListActionProvider + + + +formViewModel: QuestionFormViewModel - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -464,7 +517,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -477,9 +530,9 @@ - + - + IFormData @@ -488,17 +541,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -506,7 +559,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -518,24 +571,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -546,17 +599,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -573,7 +626,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -584,135 +637,82 @@ - + - + Color - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - + + + - - - +formViewModel: QuestionFormViewModel + + + FormControl - - - + + + - - - Enum + + + FormArray - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + FormGroup - - - + + + - - - ConsumerWidget + + + ManagedFormViewModel - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + IListActionProvider - - + + - + SurveyQuestionFormView - + +formViewModel: QuestionFormViewModel +isHtmlStyleable: bool diff --git a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg index 032c61e39..3de3c6555 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/questionnaire/uml.svg @@ -1,80 +1,47 @@ - - [QuestionFormViewModel + + [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 | - <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 + ] + + [ScaleQuestionFormView | - +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() + +formViewModel: QuestionFormViewModel ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [ScaleQuestionFormView]o-[QuestionFormViewModel] [<abstract>QuestionFormData | @@ -146,49 +113,82 @@ [ScaleQuestionFormData]o-[Color] [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [<abstract>IScaleQuestionFormViewModel + [QuestionFormViewModel | + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_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 - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() + +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() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] [SurveyQuestionFormView | @@ -198,18 +198,6 @@ [SurveyQuestionFormView]o-[QuestionFormViewModel] - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - [<abstract>WithQuestionnaireControls | +questionsArray: FormArray<dynamic>; @@ -233,115 +221,185 @@ [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [QuestionnaireFormData + | + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() + ] + + [<abstract>IFormData]<:--[QuestionnaireFormData] + - + - + - + + + + + + + + + - + - + + + - + - + + + - + - + - + - - - + + + + + + + + + + - - + + + - + - - - - - - - - - + - + - - - + - + - + - + + + - + - - + + - + - - - + - + - - - + - + - - - - - - - - - - + + - + - + - + + + + + + + + + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + + + + + + + + + + + Enum + + + + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + - - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -396,7 +454,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -417,96 +475,91 @@ - - - - + + + - - - SurveyQuestionType + + + ConsumerWidget - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType + + + + + + + + + + BoolQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - FormControl + + + +Widget build() - - - + + + + - - - FormArray + + + IScaleQuestionFormViewModel - - - - - - - - FormGroup + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - ManagedFormViewModel + + + ScaleQuestionFormView - - - - - - - - IListActionProvider + + + +formViewModel: QuestionFormViewModel - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -519,7 +572,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -532,9 +585,9 @@ - + - + IFormData @@ -543,17 +596,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -561,7 +614,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -573,24 +626,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -601,17 +654,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -628,7 +681,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -639,135 +692,82 @@ - + - + Color - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - + + + - - - +formViewModel: QuestionFormViewModel + + + FormControl - - - + + + - - - Enum + + + FormArray - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + FormGroup - - - + + + - - - ConsumerWidget + + + ManagedFormViewModel - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + IListActionProvider - - + + - + SurveyQuestionFormView - + +formViewModel: QuestionFormViewModel +isHtmlStyleable: bool @@ -775,47 +775,19 @@ - - - - - - - - - QuestionnaireFormData - - - - - - +questionsData: List<QuestionFormData>? - +id: String - - - - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() - - - - - - - + + + - + WithQuestionnaireControls - + +questionsArray: FormArray<dynamic> +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> @@ -826,7 +798,7 @@ - + +void setQuestionnaireControlsFrom() +QuestionnaireFormData buildQuestionnaireFormData() @@ -841,9 +813,9 @@ - + - + FormViewModelCollection @@ -852,9 +824,9 @@ - + - + IFormViewModelDelegate @@ -863,15 +835,43 @@ - + - + IProviderArgsResolver + + + + + + + + + QuestionnaireFormData + + + + + + +questionsData: List<QuestionFormData>? + +id: String + + + + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() + + + + diff --git a/docs/uml/designer_v2/lib/features/design/shared/uml.svg b/docs/uml/designer_v2/lib/features/design/shared/uml.svg index 200cb1c2f..2551dbdd2 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/uml.svg @@ -1,4 +1,4 @@ - + [<abstract>WithScheduleControls | +isTimeRestrictedControl: FormControl<bool>; @@ -49,82 +49,49 @@ [ScheduleControls]o-[<abstract>WithScheduleControls] [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [QuestionFormViewModel + [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 | - <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 + ] + + [ScaleQuestionFormView | - +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() + +formViewModel: QuestionFormViewModel ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [ScaleQuestionFormView]o-[QuestionFormViewModel] [<abstract>QuestionFormData | @@ -196,49 +163,82 @@ [ScaleQuestionFormData]o-[Color] [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [<abstract>IScaleQuestionFormViewModel + [QuestionFormViewModel | + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_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 - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [BoolQuestionFormView | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() + +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() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] [SurveyQuestionFormView | @@ -248,18 +248,6 @@ [SurveyQuestionFormView]o-[QuestionFormViewModel] - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - [<abstract>WithQuestionnaireControls | +questionsArray: FormArray<dynamic>; @@ -283,21 +271,33 @@ [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [QuestionnaireFormData + | + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() + ] + + [<abstract>IFormData]<:--[QuestionnaireFormData] + - + - + - + - + - + - + @@ -307,35 +307,37 @@ - + - + - - - + + + - + - - - + + - + + - + - + + + - + - - - - + + + + + - - + @@ -343,77 +345,75 @@ - - - - + + + + - - - + + + - - - - - - - - + - - + - + - - - + - + - - - + - + + + - + - - + + - + - + - + + + + + + + + + - + - + - + - + - - - + + + - + WithScheduleControls - + +isTimeRestrictedControl: FormControl<bool> +instanceID: FormControl<String> @@ -432,7 +432,7 @@ - + +void setScheduleControlsFrom() -dynamic _initReminderControl() @@ -442,9 +442,9 @@ - + - + FormControl @@ -453,9 +453,9 @@ - + - + StreamSubscription @@ -516,23 +516,23 @@ - - - + + + - + ScheduleControls - + +formViewModel: WithScheduleControls - + +Widget build() -List<FormTableRow> _conditionalTimeRestrictions() @@ -542,28 +542,86 @@ - + - + FormConsumerWidget + + + + + + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + + + + + + + + + + + Enum + + + + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -618,7 +676,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -639,68 +697,74 @@ - - - - + + + - - - SurveyQuestionType + + + ConsumerWidget - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType + + + + + + + + + + BoolQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - FormArray + + + +Widget build() - - - + + + + - - - FormGroup + + + IScaleQuestionFormViewModel - - - - - - - - ManagedFormViewModel + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - IListActionProvider + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel @@ -848,126 +912,62 @@ - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - + + + - - - Enum + + + FormArray - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + FormGroup - - - + + + - - - ConsumerWidget + + + ManagedFormViewModel - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + IListActionProvider - - + + - + SurveyQuestionFormView - + +formViewModel: QuestionFormViewModel +isHtmlStyleable: bool @@ -975,47 +975,19 @@ - - - - - - - - - QuestionnaireFormData - - - - - - +questionsData: List<QuestionFormData>? - +id: String - - - - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() - - - - - - - + + + - + WithQuestionnaireControls - + +questionsArray: FormArray<dynamic> +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> @@ -1026,7 +998,7 @@ - + +void setQuestionnaireControlsFrom() +QuestionnaireFormData buildQuestionnaireFormData() @@ -1041,9 +1013,9 @@ - + - + FormViewModelCollection @@ -1052,9 +1024,9 @@ - + - + IFormViewModelDelegate @@ -1063,15 +1035,43 @@ - + - + IProviderArgsResolver + + + + + + + + + QuestionnaireFormData + + + + + + +questionsData: List<QuestionFormData>? + +id: String + + + + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() + + + + diff --git a/docs/uml/designer_v2/lib/features/design/uml.svg b/docs/uml/designer_v2/lib/features/design/uml.svg index c6a94b685..91b4cb16e 100644 --- a/docs/uml/designer_v2/lib/features/design/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/uml.svg @@ -1,696 +1,679 @@ - - [StudyFormViewModel + + [StudyDesignInfoFormView | - +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() + +Widget build() ] - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [ConsentItemFormView + [StudyInfoFormViewModel | - +formViewModel: ConsentItemFormViewModel + +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() ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [EnrollmentFormData + [StudyInfoFormData | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; +id: String | +Study apply(); - +EnrollmentFormData copy() + +StudyInfoFormData copy() ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [StudyDesignEnrollmentFormView + [StudyContactInfoFormData | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [ConsentItemFormViewModel + [StudyFormScaffold | - +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> + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +Widget build() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - - [<abstract>IScreenerQuestionLogicFormViewModel - | - +isDirtyOptionsBannerVisible: bool - ] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [ScreenerQuestionLogicFormView - | - +formViewModel: ScreenerQuestionFormViewModel + [StudyFormValidationSet | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [Enum]<:--[StudyFormValidationSet] - [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 + [StudyDesignMeasurementsFormView | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +Widget build() ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [EnrollmentFormViewModel + [MeasurementsFormViewModel | +study: Study; +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + +measurementRequired: dynamic; + +titles: Map<FormMode, String> | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); +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() + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [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] + [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] - [EnrollmentFormConsentItemDelegate + [MeasurementsFormData | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +Study apply(); + +MeasurementsFormData copy() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [ConsentItemFormData + [MeasurementSurveyFormViewModel | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() - ] - - [<abstract>IFormData]<:-[ConsentItemFormData] - - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String - | - +Study apply(); - +InterventionsFormData copy() - ] - - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionTaskFormViewModel - | - +taskIdControl: FormControl<String>; + +study: Study; + +measurementIdControl: FormControl<String>; +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; +form: FormGroup; - +taskId: String; + +measurementId: String; +instanceId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; +titles: Map<FormMode, String> | +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +MeasurementSurveyFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [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] - [InterventionTaskFormView + [MeasurementSurveyFormData | - +formViewModel: InterventionTaskFormViewModel + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String + | + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [StudyScheduleFormData + [SurveyPreview | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String + +routeArgs: MeasurementFormRouteArgs | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + +Widget build() ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [InterventionFormView + [MeasurementSurveyFormView | - +formViewModel: InterventionFormViewModel + +formViewModel: MeasurementSurveyFormViewModel ] - [InterventionFormView]o-[InterventionFormViewModel] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [InterventionsFormViewModel + [<abstract>IStudyFormData + | + +Study apply() + ] + + [<abstract>IFormData]<:--[<abstract>IStudyFormData] + + [ReportsFormViewModel | +study: Study; +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +reportItemDelegate: ReportFormItemDelegate; + +reportItemArray: FormArray<dynamic>; + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; +form: FormGroup; + +reportItemModels: List<ReportItemFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + +canTestConsent: bool | +void setControlsFrom(); - +InterventionsFormData buildFormData(); + +ReportsFormData buildFormData(); +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); + +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); + +dynamic testReport(); +void onCancel(); +dynamic onSave(); - +dynamic testStudySchedule() + +ReportItemFormViewModel provide() ] - [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] + [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] - [InterventionFormData + [ReportFormItemDelegate | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +Intervention toIntervention(); - +InterventionFormData copy() + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>IFormData]<:-[InterventionFormData] + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [StudyScheduleFormView + [ReportItemFormView | - +formViewModel: StudyScheduleControls + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) + | + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() + ] + + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] + + [LinearRegressionSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - -FormTableRow _renderCustomSequence(); +Widget build() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [InterventionFormViewModel + [DataReferenceIdentifier | - +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> + +hashCode: int | - +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() + +bool ==() ] - [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] + [DataReference]<:-[DataReferenceIdentifier] - [<abstract>StudyScheduleControls + [DataReferenceEditor | - <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 + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + | + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + ] + + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] + + [TemporalAggregationFormatted + | + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int + | + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() + ] + + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] + + [ImprovementDirectionFormatted + | + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int + | + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() + ] + + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] + + [ReportSectionType + | + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType + ] + + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] + + [AverageSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> + | + +Widget build() + ] + + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + + [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 | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [StudyDesignInterventionsFormView + [ReportItemFormData | - +Widget build() + +isPrimary: bool; + +section: ReportSection; + +id: String + | + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [InterventionTaskFormData + [ReportsFormData | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; + +reportItems: List<ReportItemFormData>; +id: String | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +Study apply(); + +ReportsFormData copy() ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [InterventionPreview + [ReportStatus | - +routeArgs: InterventionFormRouteArgs + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus + ] + + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] + + [StudyDesignReportsFormView + | + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + + [ReportBadge + | + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | +Widget build() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [StudyFormValidationSet + [StudyDesignEnrollmentFormView | - +index: int; - <static>+values: List<StudyFormValidationSet> + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [Enum]<:--[StudyFormValidationSet] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [StudyInfoFormData + [ConsentItemFormData | + +consentId: String; +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; + +description: String; + +iconName: String?; +id: String | - +Study apply(); - +StudyInfoFormData copy() + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [<abstract>IFormData]<:-[ConsentItemFormData] - [StudyContactInfoFormData + [EnrollmentFormData | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; +id: String | +Study apply(); - +StudyInfoFormData copy() - ] - - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - - [StudyDesignInfoFormView - | - +Widget build() + +EnrollmentFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [StudyInfoFormViewModel + [ConsentItemFormViewModel | - +study: Study; + +consentIdControl: FormControl<String>; +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>; + +iconControl: FormControl<IconOption>; +form: FormGroup; - +titles: Map<FormMode, String>; + +consentId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic - | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() - ] - - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - - [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() + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [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] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [StudyDesignMeasurementsFormView + [<abstract>IScreenerQuestionLogicFormViewModel | - +Widget build() + +isDirtyOptionsBannerVisible: bool ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - - [SurveyPreview + [ScreenerQuestionLogicFormView | - +routeArgs: MeasurementFormRouteArgs + +formViewModel: ScreenerQuestionFormViewModel | - +Widget build() + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [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] - [MeasurementSurveyFormViewModel + [EnrollmentFormViewModel | +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; +form: FormGroup; - +measurementId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +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(); - +MeasurementSurveyFormData buildFormData(); + +EnrollmentFormData buildFormData(); + +void read(); +List<ModelAction<dynamic>> availableActions(); +List<ModelAction<dynamic>> availablePopupActions(); +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() - ] - - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - - [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] - - [MeasurementsFormData - | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String - | - +Study apply(); - +MeasurementsFormData copy() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [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>IStudyFormData + [EnrollmentFormConsentItemDelegate | - +Study apply() - ] - - [<abstract>IFormData]<:--[<abstract>IStudyFormData] - - [<abstract>StudyDesignPageWidget + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +Widget? banner() + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [StudyFormScaffold - | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + [ConsentItemFormView | - +Widget build() + +formViewModel: ConsentItemFormViewModel ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [ConsentItemFormView]o-[ConsentItemFormViewModel] [<abstract>WithScheduleControls | @@ -742,82 +725,49 @@ [ScheduleControls]o-[<abstract>WithScheduleControls] [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [QuestionFormViewModel + [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 | - <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 + ] + + [ScaleQuestionFormView | - +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() + +formViewModel: QuestionFormViewModel ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [ScaleQuestionFormView]o-[QuestionFormViewModel] [<abstract>QuestionFormData | @@ -889,49 +839,82 @@ [ScaleQuestionFormData]o-[Color] [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [<abstract>IScaleQuestionFormViewModel + [QuestionFormViewModel | + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + -_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 - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel | - +Widget build() + +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() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] [SurveyQuestionFormView | @@ -941,18 +924,6 @@ [SurveyQuestionFormView]o-[QuestionFormViewModel] - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - [<abstract>WithQuestionnaireControls | +questionsArray: FormArray<dynamic>; @@ -976,1162 +947,1322 @@ [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [StudyDesignReportsFormView + [QuestionnaireFormData | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [ReportsFormViewModel + [<abstract>StudyDesignPageWidget | - +study: Study; + +Widget? banner() + ] + + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + + [StudyFormViewModel + | + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; + +isStudyReadonly: bool; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestConsent: bool + +titles: Map<FormMode, String> | - +void setControlsFrom(); - +ReportsFormData buildFormData(); +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); + +void setControlsFrom(); + +Study buildFormData(); + +void dispose(); +void onCancel(); +dynamic onSave(); - +ReportItemFormViewModel provide() + -dynamic _applyAndSaveSubform() ] - [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] + [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] - [ReportFormItemDelegate + [<abstract>StudyScheduleControls | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + <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 onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [ReportItemFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + [StudyDesignInterventionsFormView | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +Widget build() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [TemporalAggregationFormatted + [InterventionFormViewModel | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + +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> | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +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 + | + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [ImprovementDirectionFormatted + [StudyScheduleFormData | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [ReportSectionType + [InterventionFormView | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +formViewModel: InterventionFormViewModel ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [InterventionFormView]o-[InterventionFormViewModel] - [DataReferenceIdentifier + [InterventionsFormViewModel | - +hashCode: 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 | - +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() ] - [DataReference]<:-[DataReferenceIdentifier] + [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] - [DataReferenceEditor + [InterventionTaskFormData | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [AverageSectionFormView + [InterventionPreview | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +routeArgs: InterventionFormRouteArgs | +Widget build() ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [InterventionTaskFormView | - +Widget build() + +formViewModel: InterventionTaskFormViewModel ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [ReportItemFormData + [InterventionsFormData | - +isPrimary: bool; - +section: ReportSection; + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; +id: String | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +Study apply(); + +InterventionsFormData copy() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [ReportItemFormViewModel + [InterventionTaskFormViewModel | - <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>>; + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; +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>; + +taskId: String; + +instanceId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + +titles: Map<FormMode, String> | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [ReportsFormData + [InterventionFormData | - +reportItems: List<ReportItemFormData>; + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; +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() + +Intervention toIntervention(); + +InterventionFormData copy() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [<abstract>IFormData]<:-[InterventionFormData] - + - + - - - - - - - - - - - + + + + + - + - + - + - + - + - + + + - + - - - + + - - - + + + - + + - + - + - + - - + + - - - - - - - - - - + - + + + + - - - - + - - - - + - + - + - + - - - + - + - - - + - + - - + + - - - - - - + - - - + + + - - - + + + - - - + + + - + + - + - + - + - + - - - - - - + + + + + + + + - + - + - + - + - + - - + + - + - + + + - - - - - - - - + - - - - - - - - + + + - + - + - - + + - + - + - + - - - - - + - + - + - - - - + - - + - + - + - + - - - + + + + - - - + + + - + + - + - + - + - - - - - + - + - + - + - + - - - - + + - + - - - + - + - + - + - + + + + + - + - + - + - + - + - - - - + + + - - - + + + + + + + + + + + - - + - - + + - + - + + + - + - - - - - + - + - - - - + + + - - + + + - + + + - + + + + + + - - + - - - - + + + + - + - + - + - + + + + + - + - - - + - + - + + + + + - + - + - + - + + + - + - + + + - + - - + + - + - - - + + + + - - - + + + - - - - + - + - - - + - + - + - + - + - + - + - - - - - - - - + + + + + + - + - + - + - + - + + + + + + - - + - + - - - + - + - + - - - - - - + + + - + + - + - - - + - + - + - + - + - + - + + + + + + - - + + + - + + + + - - - + + - + - + + + - + - + + + - + - + - + - - - + + + + + + + + + + - - + + + - + - - - - - - - - - + - + - - - + - + - + - + + + - + - - + + - + - - - + - + - - - + - + - - - - - - - - - - + + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - + - - + - + - + - + - - + + + - - - + + + - + + - + - - + + - + - + - + - + + + - + - + - + - + - + - + - + - + - + + + + + + + + + + + - + - - - - + + - + - + + + - + + + + - + + - + - - - + - + - - - + - + - - - + - + - + - + - + - + + + + + + + + + + + + - - + - + + + + + + + + + + + + + + - - + - + - + - - + + - + - + - + + + + + + + + + + + + + + + + StudyDesignInfoFormView + + + + + + +Widget build() + + + - - - - - + + + + - - - StudyFormViewModel + + + StudyDesignPageWidget - - - +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> + + + +Widget? banner() - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + + + + + + + + StudyInfoFormViewModel + + + + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic + + + + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - + - + Study - - - + + + + + + + FormControl + + + + + + + + + + + FormGroup + + + + + + + + + + + FormViewModel + + + + + + + + + + + + + StudyInfoFormData + + + + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + + + StudyContactInfoFormData + + + + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + + IStudyFormData + + + + + + +Study apply() + + + + + + + + + + + + + StudyFormScaffold + + + + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) + + + + + + +Widget build() + + + + + + + - - - IStudyRepository + + + T Function(WidgetRef) - - - + + + - - - IAuthRepository + + + Widget Function(T) - - - + + + - - - GoRouter + + + ConsumerWidget - - - - - - - - - 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 + + + StudyFormValidationSet - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + - - - EnrollmentFormViewModel + + + Enum - - - +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()> + + + + + + + + + StudyDesignMeasurementsFormView - - - +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() - - - + + + - + MeasurementsFormViewModel - + +study: Study +router: GoRouter @@ -2145,7 +2276,7 @@ - + +void read() +void setControlsFrom() @@ -2162,1482 +2293,1375 @@ - - - - - - - - - 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() - - - - - - - - - - - - - InterventionsFormViewModel - - - - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool - - - - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - IFormViewModelDelegate - - - - - - - - - - - - ConsentItemFormView - - + + + - - - +formViewModel: ConsentItemFormViewModel + + + GoRouter - - - - - - - - - ConsentItemFormViewModel - - - - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> - - + + + - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + FormArray - - - - - + + + - - - EnrollmentFormData + + + FormViewModelCollection - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + + + + + + IFormViewModelDelegate - - - +Study apply() - +EnrollmentFormData copy() + + + + + + + + IListActionProvider - - - + + + - - - Participation + + + IProviderArgsResolver - - - - - + + + + + - - - QuestionnaireFormData + + + MeasurementsFormData - - - +questionsData: List<QuestionFormData>? - +id: String + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +Study apply() + +MeasurementsFormData copy() - - - - + + + + + - - - IStudyFormData + + + MeasurementSurveyFormViewModel - - - +Study apply() + + + +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> - - - - - - - - - StudyDesignEnrollmentFormView + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + + + + + + ManagedFormViewModel - - - - + + + + + - - - StudyDesignPageWidget + + + WithQuestionnaireControls - - - +Widget? banner() + + + +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() - - - + + + + + - - - FormControl + + + 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>? + + - - - ManagedFormViewModel + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - - + + + + + - - - IScreenerQuestionLogicFormViewModel + + + MeasurementSurveyFormData - - - +isDirtyOptionsBannerVisible: bool + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String + + + + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - + + + + + - - - ScreenerQuestionLogicFormView + + + QuestionnaireFormData - - - +formViewModel: ScreenerQuestionFormViewModel + + + +questionsData: List<QuestionFormData>? + +id: String - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - ScreenerQuestionFormViewModel + + + IFormDataWithSchedule - - - <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 + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + + + +Schedule toSchedule() - - - + + + + + - - - FormConsumerWidget + + + SurveyPreview - - - - + + + +routeArgs: MeasurementFormRouteArgs + + - - - FormArray + + + +Widget build() - - - - - + + + - - - QuestionFormViewModel + + + MeasurementFormRouteArgs - - - <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 + + + + + + + + + MeasurementSurveyFormView - - - +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() + + + +formViewModel: MeasurementSurveyFormViewModel - - - - - + + + - - - EnrollmentFormConsentItemDelegate + + + IFormData - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + + + + + + + + ReportsFormViewModel - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +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 - - - - - - - - FormViewModelCollection + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - - - + + + + + - - - WithQuestionnaireControls + + + ReportFormItemDelegate - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - + + + + + - - - IListActionProvider + + + ReportItemFormView - - - - + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) + + - - - IProviderArgsResolver + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - - - + + + + + - - - ConsentItemFormData + + + ReportItemFormViewModel - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: 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 - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - + + + - - - IFormData + + + Widget Function(BuildContext) - - - - - + + + + + - - - InterventionsFormData + + + LinearRegressionSectionFormView - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +Study apply() - +InterventionsFormData copy() + + + +Widget build() - - - - - + + + + + - - - StudyScheduleFormData + + + DataReferenceIdentifier - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + +hashCode: int - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +bool ==() - - - - - - - - - InterventionTaskFormViewModel - - - - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> - - + + + - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + DataReference - - - - - + + + + + - - - WithScheduleControls + + + DataReferenceEditor - - - +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>? + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - InterventionTaskFormView - - + + + - - - +formViewModel: InterventionTaskFormViewModel + + + ReactiveDropdownField - - - + + + + + - - - PhaseSequence + + + TemporalAggregationFormatted - - - - - - - - - InterventionFormView + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - +formViewModel: InterventionFormViewModel + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - - - + + + - - - InterventionFormViewModel + + + TemporalAggregation - - - +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() + + + IconData - - - - - + + + + + - - - StudyScheduleControls + + + ImprovementDirectionFormatted - - - <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 + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int - - - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - - - + + + - - - InterventionFormData + + + ImprovementDirection - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + + + + + + + ReportSectionType - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - StudyScheduleFormView + + + AverageSectionFormView - - - +formViewModel: StudyScheduleControls + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudyDesignInterventionsFormView + + + ReportItemFormData - - - +Widget build() + + + +isPrimary: bool + +section: ReportSection + +id: String - - - - - - - - - - InterventionTaskFormData + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String - - + + + + - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + ReportSection - - - - - + + + + + - - - IFormDataWithSchedule + + + ReportsFormData - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + +reportItems: List<ReportItemFormData> + +id: String - - - +Schedule toSchedule() + + + +Study apply() + +ReportsFormData copy() - - - - - - - - - InterventionPreview - - + + + + - - - +routeArgs: InterventionFormRouteArgs + + + ReportStatus - - - +Widget build() + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - + + + + - - - InterventionFormRouteArgs + + + StudyDesignReportsFormView - - - - - - - - ConsumerWidget + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - - + + + + + - - - StudyFormValidationSet + + + ReportBadge - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - - - - - - Enum + + + +Widget build() - - - - - + + + - - - StudyInfoFormData + + + BadgeType - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + + + + + + + StudyDesignEnrollmentFormView - - - +Study apply() - +StudyInfoFormData copy() + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - - + + + + + - - - StudyContactInfoFormData + + + ConsentItemFormData - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - +Study apply() - +StudyInfoFormData copy() + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - + + + + + - - - StudyDesignInfoFormView + + + EnrollmentFormData + + + + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String + + + + + + +Study apply() + +EnrollmentFormData copy() - - - +Widget build() + + + + + + + + Participation - - - - + + + + + - - - StudyDesignMeasurementsFormView + + + ConsentItemFormViewModel - - - +Widget build() + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - - - - - - - - SurveyPreview + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - +routeArgs: MeasurementFormRouteArgs + + + + + + + + + IScreenerQuestionLogicFormViewModel - - - +Widget build() + + + +isDirtyOptionsBannerVisible: bool - - - + + + + + - - - MeasurementFormRouteArgs + + + ScreenerQuestionLogicFormView - - - - - - - - - MeasurementSurveyFormView + + + +formViewModel: ScreenerQuestionFormViewModel - - - +formViewModel: MeasurementSurveyFormViewModel + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - - + + + + + - - - MeasurementSurveyFormViewModel + + + ScreenerQuestionFormViewModel - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + <static>+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 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() + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - + + + - - - MeasurementSurveyFormData + + + FormConsumerWidget - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + + + + + + + + QuestionFormViewModel - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + <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 - - - - - - - - - - MeasurementsFormData + + + +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() - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + + + + + + + + EnrollmentFormViewModel - - - +Study apply() - +MeasurementsFormData copy() + + + +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()> - - - - - - - - StudyPageWidget + + + +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() - - - - - + + + + + - - - StudyFormScaffold + + + EnrollmentFormConsentItemDelegate - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + +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() - - - + + + + - - - T Function(WidgetRef) + + + ConsentItemFormView - - - - - - - - Widget Function(T) + + + +formViewModel: ConsentItemFormViewModel - + - + StreamSubscription @@ -3646,9 +3670,9 @@ - + - + StudyUTimeOfDay @@ -3657,23 +3681,23 @@ - - - + + + - + ScheduleControls - + +formViewModel: WithScheduleControls - + +Widget build() -List<FormTableRow> _conditionalTimeRestrictions() @@ -3683,16 +3707,16 @@ - - + + - + SurveyQuestionType - + +index: int <static>+values: List<SurveyQuestionType> @@ -3703,19 +3727,105 @@ + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + + BoolQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + IScaleQuestionFormViewModel + + + + + + +isMidValuesClearedInfoVisible: bool + + + + + + + + + + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -3728,7 +3838,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -3741,17 +3851,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -3759,7 +3869,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -3771,24 +3881,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -3799,17 +3909,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -3818,660 +3928,550 @@ +midValues: List<double?> +midLabels: List<String?> +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> - - - - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() - - - - - - - - - - - Color - - - - - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - - - - - - - - - - StudyDesignReportsFormView - - - - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() - - - - - - - - - - - - - ReportFormItemDelegate + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + + + + + + Color - - - - - + + + + - - - ReportItemFormView + + + SurveyQuestionFormView - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + + + + + + StudyPageWidget - - - - - + + + + + - - - ReportItemFormViewModel + + + StudyFormViewModel - - - <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 + + + +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> - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - + + + - - - Widget Function(BuildContext) + + + IStudyRepository - - - - - + + + - - - TemporalAggregationFormatted + + + IAuthRepository - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int - - + + + + + + - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + InterventionsFormViewModel - - - - - - - - TemporalAggregation + + + +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 - - - - - - - - IconData + + + +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() - - - - - + + + + + - - - 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 + + + PhaseSequence - - - - + + + + - - - ReportSectionType + + + StudyDesignInterventionsFormView - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +Widget build() - - - - - - - - - DataReferenceIdentifier - - + + + + + - - - +hashCode: int + + + InterventionFormViewModel - - - +bool ==() + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - - - - - - DataReference + + + +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() - - - - - + + + + + - - - DataReferenceEditor + + + StudyScheduleFormView - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + +formViewModel: StudyScheduleControls - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - + + + + + - - - ReactiveDropdownField + + + StudyScheduleFormData - - - - - - + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String + + - - - AverageSectionFormView + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + + + + InterventionFormView - - - +Widget build() + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - LinearRegressionSectionFormView + + + InterventionTaskFormData - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +Widget build() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - - + + + + + - - - ReportItemFormData + + + InterventionPreview - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +routeArgs: InterventionFormRouteArgs - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + +Widget build() - - - + + + - - - ReportSection + + + InterventionFormRouteArgs - - - - - + + + + - - - ReportsFormData + + + InterventionTaskFormView - - - +reportItems: List<ReportItemFormData> - +id: String + + + +formViewModel: InterventionTaskFormViewModel - - - +Study apply() - +ReportsFormData copy() + + + + + + + + + + InterventionTaskFormViewModel - - - - - - - - - ReportStatus + + + +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<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - - + + + + + - - - ReportBadge + + + InterventionsFormData - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +Widget build() + + + +Study apply() + +InterventionsFormData copy() - - - + + + + + - - - BadgeType + + + InterventionFormData + + + + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String + + + + + + +Intervention toIntervention() + +InterventionFormData copy() diff --git a/docs/uml/designer_v2/lib/features/forms/uml.svg b/docs/uml/designer_v2/lib/features/forms/uml.svg index 1e0a34df9..82e6d2cab 100644 --- a/docs/uml/designer_v2/lib/features/forms/uml.svg +++ b/docs/uml/designer_v2/lib/features/forms/uml.svg @@ -1,97 +1,5 @@ - - [<abstract>FormValidationSetEnum - ] - - [FormControlValidation - | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> - | - +FormControlValidation merge() - ] - - [FormControlValidation]o-[<abstract>AbstractControl] - - [<abstract>ManagedFormViewModel - | - +ManagedFormViewModel<T> createDuplicate() - ] - - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - - [FormViewModelNotFoundException - ] - - [Exception]<:--[FormViewModelNotFoundException] - - [FormViewModelCollection - | - +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>; - +items: List<T>; - +onSelectItem: void Function(T); - +getActionsAt: List<ModelAction<dynamic>> Function(T, int); - +onNewItem: void Function()?; - +rowTitle: String Function(T); - +onNewItemLabel: String; - +sectionTitle: String?; - +sectionDescription: String?; - +emptyIcon: IconData?; - +emptyTitle: String?; - +emptyDescription: String?; - +sectionTitleDivider: bool?; - +rowPrefix: Widget Function(BuildContext, T, int)?; - +rowSuffix: Widget Function(BuildContext, T, int)?; - +leadingWidget: Widget?; - +itemsSectionPadding: EdgeInsets?; - +hideLeadingTrailingWhenEmpty: bool; - <static>+columns: List<StandardTableColumn> - | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() - ] - - [FormArrayTable]o-[<abstract>AbstractControl] - [FormArrayTable]o-[void Function(T)] - [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] - [FormArrayTable]o-[void Function()?] - [FormArrayTable]o-[String Function(T)] - [FormArrayTable]o-[IconData] - [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] - [FormArrayTable]o-[<abstract>Widget] - [FormArrayTable]o-[EdgeInsets] - - [<abstract>IFormData - | - +id: String - | - +IFormData copy() - ] - - [CustomFormControl + + [CustomFormControl | -_onValueChangedDebouncer: Debouncer?; -_onStatusChangedDebouncer: Debouncer?; @@ -205,210 +113,428 @@ [FormMode]o-[FormMode] [Enum]<:--[FormMode] + [<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] + [UnsavedChangesDialog | +Widget build() ] + [<abstract>IFormData + | + +id: String + | + +IFormData copy() + ] + + [FormArrayTable + | + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> + | + +Widget build(); + -List<Widget> _buildRow(); + -Widget _newItemButton() + ] + + [FormArrayTable]o-[<abstract>AbstractControl] + [FormArrayTable]o-[void Function(T)] + [FormArrayTable]o-[List<ModelAction<dynamic>> Function(T, int)] + [FormArrayTable]o-[void Function()?] + [FormArrayTable]o-[String Function(T)] + [FormArrayTable]o-[IconData] + [FormArrayTable]o-[Widget Function(BuildContext, T, int)?] + [FormArrayTable]o-[<abstract>Widget] + [FormArrayTable]o-[EdgeInsets] + + [<abstract>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] + - + - - - - - - - - - - - - + + - + - + - + - + - + - - - + + + + - - - + + + - + + - + - + + + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - - - + - + + + - + - - + + - + - - - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - - + + + - - - - - - - - FormValidationSetEnum - - - + + + - - - - - + + + + + + + + + - - - FormControlValidation + + + CustomFormControl - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +FormControlValidation merge() + + + +void dispose() - - - + + + - - - AbstractControl + + + Debouncer - - - - + + + - - - ManagedFormViewModel + + + void Function(T?)? - - - +ManagedFormViewModel<T> createDuplicate() + + + + + + + + void Function(ControlStatus)? - + + + + + + + FormControl + + + + + + + + + + + FormInvalidException + + + + + + + + + + + Exception + + + + + + + + + + + + FormConfigException + + + + + + +message: String? + + + + + + + + + + + + IFormViewModelDelegate + + + + + + +dynamic onSave() + +void onCancel() + + + + + + + + + + + + IFormGroupController + + + + + + +form: FormGroup + + + + + + + + + + + FormGroup + + + + + + + + + + + + FormControlOption + + + + + + +value: T + +label: String + +description: String? + +props: List<Object?> + + + + + + + + + + + Equatable + + + + + - - - + + + - + FormViewModel - + -_formData: T? -_formMode: FormMode @@ -433,7 +559,7 @@ - + -dynamic _setFormData() -dynamic _rememberDefaultControlValidators() @@ -457,41 +583,103 @@ - - - + + + + - - - FormViewModelNotFoundException + + + FormMode + + + + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - + + + - - - Exception + + + FormValidationSetEnum + + + + + + + + + + + CancelableOperation + + + + + + + + + + + Enum + + + + + + + + + + + + ManagedFormViewModel + + + + + + +ManagedFormViewModel<T> createDuplicate() + + + + + + + + + + + FormViewModelNotFoundException - - - + + + - + FormViewModelCollection - + +formViewModels: List<T> +formArray: FormArray<dynamic> @@ -501,7 +689,7 @@ - + +void add() +T remove() @@ -518,28 +706,71 @@ - + - + FormArray + + + + + + + + UnsavedChangesDialog + + + + + + +Widget build() + + + + + + + + + + + + + IFormData + + + + + + +id: String + + + + + + +IFormData copy() + + + + - - - + + + - + FormArrayTable - + +control: AbstractControl<dynamic> +items: List<T> @@ -563,7 +794,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -572,11 +803,22 @@ + + + + + + + AbstractControl + + + + - + - + void Function(T) @@ -585,9 +827,9 @@ - + - + List<ModelAction<dynamic>> Function(T, int) @@ -596,9 +838,9 @@ - + - + void Function()? @@ -607,9 +849,9 @@ - + - + String Function(T) @@ -618,9 +860,9 @@ - + - + IconData @@ -629,9 +871,9 @@ - + - + Widget Function(BuildContext, T, int)? @@ -640,9 +882,9 @@ - + - + Widget @@ -651,281 +893,39 @@ - + - + EdgeInsets - - - - - - - - - IFormData - - - - - - +id: String - - - - - - +IFormData copy() - - - - - - - - - - - - - CustomFormControl - - - - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? - - - - - - +void dispose() - - - - - - - - - - - Debouncer - - - - - - - - - - - void Function(T?)? - - - - - - - - - - - void Function(ControlStatus)? - - - - - - - - - - - FormControl - - - - - - - - - - - FormInvalidException - - - - - - - - - - - - FormConfigException - - - - - - +message: String? - - - - - - - - - - - - IFormViewModelDelegate - - - - - - +dynamic onSave() - +void onCancel() - - - - - - - - - - - - IFormGroupController - - - - - - +form: FormGroup - - - - - - - - - - - FormGroup - - - - - - - - - - - - FormControlOption - - - - - - +value: T - +label: String - +description: String? - +props: List<Object?> - - - - - - - - - - - Equatable - - - - - - - - - - - - FormMode - - - - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode - - - - - - - - - - - CancelableOperation - - - - - - - + + + + + - - - Enum + + + FormControlValidation - - - - - - - - - UnsavedChangesDialog + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> - - - +Widget build() + + + +FormControlValidation merge() diff --git a/docs/uml/designer_v2/lib/features/recruit/uml.svg b/docs/uml/designer_v2/lib/features/recruit/uml.svg index 320b76562..faed1ffd7 100644 --- a/docs/uml/designer_v2/lib/features/recruit/uml.svg +++ b/docs/uml/designer_v2/lib/features/recruit/uml.svg @@ -1,44 +1,5 @@ - - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel - | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() - ] - - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - - [StudyRecruitScreen - | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() - ] - - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] - - [InviteCodeFormViewModel + + [InviteCodeFormViewModel | +study: Study; +inviteCodeRepository: IInviteCodeRepository; @@ -77,6 +38,45 @@ +Widget build() ] + [InviteCodeFormView + | + +formViewModel: InviteCodeFormViewModel + | + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() + ] + + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + + [StudyRecruitScreen + | + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() + ] + + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + + [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] + [StudyInvitesTable | +invites: List<StudyInvite>; @@ -99,105 +99,79 @@ - + - + - + - - - - - + - + - + - - - - - - + - - + - + - + + + - + - + + + + + - + - + - + - - - - - + + + + - + + - + - + - + - + - + - - - - - - - - - InviteCodeFormView - - - - - - +formViewModel: InviteCodeFormViewModel - - - - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() - - - + + + - - - + + + - + InviteCodeFormViewModel - + +study: Study +inviteCodeRepository: IInviteCodeRepository @@ -216,7 +190,7 @@ - + +void initControls() -dynamic _uniqueInviteCode() @@ -229,11 +203,117 @@ + + + + + + + Study + + + + + + + + + + + IInviteCodeRepository + + + + + + + + + + + FormControl + + + + + + + + + + + FormGroup + + + + + + + + + + + FormViewModel + + + + + + + + + + + + + EnrolledBadge + + + + + + +enrolledCount: int + + + + + + +Widget build() + + + + + + + + + + + + + InviteCodeFormView + + + + + + +formViewModel: InviteCodeFormViewModel + + + + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() + + + + - + - + FormConsumerWidget @@ -242,16 +322,16 @@ - - + + - + StudyRecruitScreen - + +Widget build() -Widget _inviteCodesSectionHeader() @@ -263,9 +343,9 @@ - + - + StudyPageWidget @@ -274,24 +354,24 @@ - - - + + + - + StudyRecruitController - + +inviteCodeRepository: IInviteCodeRepository -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - + -dynamic _subscribeInvites() +Intervention? getIntervention() @@ -303,22 +383,11 @@ - - - - - - - IInviteCodeRepository - - - - - + - + StreamSubscription @@ -327,9 +396,9 @@ - + - + StudyBaseController @@ -338,97 +407,28 @@ - + - + IModelActionProvider - - - - - - - Study - - - - - - - - - - - FormControl - - - - - - - - - - - FormGroup - - - - - - - - - - - FormViewModel - - - - - - - - - - - - - EnrolledBadge - - - - - - +enrolledCount: int - - - - - - +Widget build() - - - - - - - + + + - + StudyInvitesTable - + +invites: List<StudyInvite> +onSelect: void Function(StudyInvite) @@ -439,7 +439,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -449,9 +449,9 @@ - + - + void Function(StudyInvite) @@ -460,9 +460,9 @@ - + - + List<ModelAction<dynamic>> Function(StudyInvite) @@ -471,9 +471,9 @@ - + - + Intervention? Function(String) @@ -482,9 +482,9 @@ - + - + int Function(StudyInvite) diff --git a/docs/uml/designer_v2/lib/features/study/uml.svg b/docs/uml/designer_v2/lib/features/study/uml.svg index f06cdfa0d..b9c58a8cc 100644 --- a/docs/uml/designer_v2/lib/features/study/uml.svg +++ b/docs/uml/designer_v2/lib/features/study/uml.svg @@ -1,96 +1,5 @@ - - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? - | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() - ] - - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] - - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool - | - +Widget build() - ] - - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] - - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? - | - +String toString() - ] - - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() - ] - - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] - - [WebController - | - +iFrameElement: IFrameElement - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() - ] - - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] - - [MobileController - | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() - ] - - [<abstract>PlatformController]<:-[MobileController] - - [<abstract>IStudyAppBarViewModel + + [<abstract>IStudyAppBarViewModel | +isSyncIndicatorVisible: bool; +isStatusBadgeVisible: bool; @@ -122,25 +31,36 @@ [StudyScaffold]o-[<abstract>Widget] [StudyScaffold]o-[SingleColumnLayoutType] - [StudyController + [PreviewFrame | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? + ] + + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + + [StudyParticipationBadge | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool + | + +Widget build() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] + + [<abstract>StudyPageWidget + | + +studyId: String + | + +Widget? banner() + ] + + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] [<abstract>IStudyStatusBadgeViewModel | @@ -166,25 +86,31 @@ [StudyStatusBadge]o-[StudyStatus] [StudyStatusBadge]o-[BadgeType] - [StudyTestController + [FrameControlsWidget | - +authRepository: IAuthRepository; - +languageCode: String + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool + | + +Widget build() ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [TestAppRoutes + [StudyTestScreen | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String + +previewRoute: String? + | + +Widget build(); + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [<abstract>IStudyNavViewModel | +isEditTabEnabled: bool; @@ -215,12 +141,67 @@ <static>+dynamic reports() ] - [StudySettingsDialog + [RouteInformation | - +Widget build() + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? + | + +String toString() ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [<abstract>PlatformController + | + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() + ] + + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] + + [WebController + | + +iFrameElement: IFrameElement + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() + ] + + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] + + [MobileController + | + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() + ] + + [<abstract>PlatformController]<:-[MobileController] [StudySettingsFormViewModel | @@ -246,49 +227,29 @@ [StudySettingsFormViewModel]o-[FormGroup] [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [<abstract>StudyPageWidget - | - +studyId: String - | - +Widget? banner() - ] - - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - - [StudyTestScreen - | - +previewRoute: String? - | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() - ] - - [<abstract>StudyPageWidget]<:-[StudyTestScreen] - - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + [StudySettingsDialog | +Widget build() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [PreviewFrame + [StudyBaseController | +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? + | + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] [WebFrame | @@ -331,424 +292,207 @@ +Widget build() ] + [StudyTestController + | + +authRepository: IAuthRepository; + +languageCode: String + ] + + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] + + [StudyController + | + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> + | + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() + ] + + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] + + [TestAppRoutes + | + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String + ] + - + - - - - + + + - - - + + + - + + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - + - - + - + - - - + + + + - + + - + - + - + - + - + - + - + - - - + - + - + - + - + + + + + - + - + - + - + - + - + + + + + - + - - - - - + - + - + - + - + - + - + + + + + - - - - - - - - + - - - - + - + - - - + - + - + - + - + - - - - - - - - - - - StudyBaseController - - - - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() - - - + - - - - - - - IStudyRepository - - - - - - - - - - - GoRouter - - - - - - - - - - - StreamSubscription - - - - - - - - - - - - - StudyParticipationBadge - - - - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - - - - - - +Widget build() - - - - - - - - - - - Participation - - - - - - - - - - - BadgeType - - - - - - - - - - - - - RouteInformation - - - - - - +route: String? - +extra: String? - +cmd: String? - +data: String? - - - - - - +String toString() - - - - - - - - - - - - - PlatformController - - - - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget - - - - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() - - - - - - - - - - - Widget - - - - - - - - - - - - - WebController - - - - - - +iFrameElement: IFrameElement - - - - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() - - - - - - - - - - - IFrameElement - - - + + + - - - - - - - - MobileController - - - - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() - - - + + + + + + + + + + + - - + + - + IStudyAppBarViewModel - + +isSyncIndicatorVisible: bool +isStatusBadgeVisible: bool @@ -759,16 +503,16 @@ - - + + - + IStudyStatusBadgeViewModel - + +studyParticipation: Participation? +studyStatus: StudyStatus? @@ -778,16 +522,16 @@ - - + + - + IStudyNavViewModel - + +isEditTabEnabled: bool +isTestTabEnabled: bool @@ -801,16 +545,16 @@ - - + + - + StudyScaffold - + +studyId: String +tabs: List<NavbarTab>? @@ -831,9 +575,9 @@ - + - + NavbarTab @@ -842,90 +586,158 @@ - - - + + + - + StudyPageWidget - + +studyId: String - + +Widget? banner() + + + + + + + Widget + + + + - + - + SingleColumnLayoutType - - - - - + + + + - - - StudyController + + + PreviewFrame - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + + + + + + StudyFormRouteArgs - - - + + + + + - - - INotificationService + + + StudyParticipationBadge + + + + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + + + + + + +Widget build() + + + + + + + + + + + Participation + + + + + + + + + + + BadgeType + + + + + + + + + + + ConsumerWidget + + + + + + + + + + + IWithBanner - + - + StudyStatus @@ -934,17 +746,17 @@ - - - + + + - + StudyStatusBadge - + +participation: Participation? +status: StudyStatus? @@ -954,143 +766,271 @@ - + +Widget build() - - - - + + + + + - - - StudyTestController + + + FrameControlsWidget - - - +authRepository: IAuthRepository - +languageCode: String + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool + + + + + + +Widget build() - - - + + + - - - IAuthRepository + + + void Function()? - - - - + + + + + - - - TestAppRoutes + + + StudyTestScreen - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + +previewRoute: String? + + + + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() + + + + + + + + + + + + StudyNav + + + + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() + + + + + + + + + + + + StudyDesignNav + + + + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() + + + + + + + + + + + + + RouteInformation + + + + + + +route: String? + +extra: String? + +cmd: String? + +data: String? + + + + + + +String toString() + + + + + + + + + + + + + PlatformController + + + + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget + + + + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - - + + + + + - - - StudyNav + + + WebController - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + +iFrameElement: IFrameElement - - - - - - - - - StudyDesignNav + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + + + + + + IFrameElement - - - - + + + + - - - StudySettingsDialog + + + MobileController - - - +Widget build() + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - + + + - + StudySettingsFormViewModel - + +study: AsyncValue<Study> +studyRepository: IStudyRepository @@ -1103,7 +1043,7 @@ - + +void setControlsFrom() +Study buildFormData() @@ -1116,20 +1056,31 @@ - + - + AsyncValue + + + + + + + IStudyRepository + + + + - + - + FormControl @@ -1138,9 +1089,9 @@ - + - + FormGroup @@ -1149,155 +1100,106 @@ - + - + FormViewModel - - - - - - - ConsumerWidget - - - - - - - - - - - IWithBanner - - - - - - - - - - - - - StudyTestScreen - - + + + + - - - +previewRoute: String? + + + StudySettingsDialog - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +Widget build() - - - - - - - - - FrameControlsWidget - - + + + + + - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + StudyBaseController - - - +Widget build() + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - - - - - - void Function()? + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - - - - - PreviewFrame - - + + + - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + GoRouter - - - + + + - - - StudyFormRouteArgs + + + StreamSubscription - - - + + + - + WebFrame - + +previewSrc: String +studyId: String - + +Widget build() @@ -1306,16 +1208,16 @@ - - + + - + DisabledFrame - + +Widget build() @@ -1324,17 +1226,17 @@ - - - + + + - + PhoneContainer - + <static>+defaultWidth: double <static>+defaultHeight: double @@ -1348,7 +1250,7 @@ - + +Widget build() @@ -1357,9 +1259,9 @@ - + - + Color @@ -1368,16 +1270,16 @@ - - + + - + MobileFrame - + +Widget build() @@ -1386,22 +1288,120 @@ - - + + - + DesktopFrame - + +Widget build() + + + + + + + + StudyTestController + + + + + + +authRepository: IAuthRepository + +languageCode: String + + + + + + + + + + + IAuthRepository + + + + + + + + + + + + + StudyController + + + + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> + + + + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() + + + + + + + + + + + INotificationService + + + + + + + + + + + + TestAppRoutes + + + + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String + + + + diff --git a/docs/uml/designer_v2/lib/features/uml.svg b/docs/uml/designer_v2/lib/features/uml.svg index a38d2dddf..9147976a1 100644 --- a/docs/uml/designer_v2/lib/features/uml.svg +++ b/docs/uml/designer_v2/lib/features/uml.svg @@ -1,96 +1,127 @@ - - [<abstract>FormValidationSetEnum + + [DrawerEntry + | + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +title: String; + +helpText: String? + | + +void onClick() ] - [FormControlValidation + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + + [GoRouterDrawerEntry | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + +intent: RoutingIntent | - +FormControlValidation merge() + +void onClick() ] - [FormControlValidation]o-[<abstract>AbstractControl] + [GoRouterDrawerEntry]o-[RoutingIntent] + [DrawerEntry]<:-[GoRouterDrawerEntry] - [<abstract>ManagedFormViewModel + [AppDrawer | - +ManagedFormViewModel<T> createDuplicate() + +title: String; + +width: int; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - - [FormViewModelNotFoundException + [DashboardController + | + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController + | + -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() ] - [Exception]<:--[FormViewModelNotFoundException] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] - [FormViewModelCollection + [StudiesTable | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + +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)?> | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() + +Widget build(); + -List<Widget> _buildRow() ] - [FormViewModelCollection]o-[FormArray] + [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)] - [FormArrayTable + [DashboardScaffold | - +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> + +body: Widget | - +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] + [DashboardScaffold]o-[<abstract>Widget] - [<abstract>IFormData + [StudiesFilter | - +id: String + +index: int; + <static>+values: List<StudiesFilter> + ] + + [Enum]<:--[StudiesFilter] + + [DashboardScreen | - +IFormData copy() + +filter: StudiesFilter? + ] + + [DashboardScreen]o-[StudiesFilter] + + [StudyMonitorScreen + | + +Widget build() ] + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [CustomFormControl | -_onValueChangedDebouncer: Debouncer?; @@ -205,111 +236,244 @@ [FormMode]o-[FormMode] [Enum]<:--[FormMode] - [UnsavedChangesDialog - | - +Widget build() - ] - - [DrawerEntry - | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +title: String; - +helpText: String? + [<abstract>ManagedFormViewModel | - +void onClick() + +ManagedFormViewModel<T> createDuplicate() ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - [GoRouterDrawerEntry - | - +intent: RoutingIntent - | - +void onClick() + [FormViewModelNotFoundException ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [DrawerEntry]<:-[GoRouterDrawerEntry] + [Exception]<:--[FormViewModelNotFoundException] - [AppDrawer + [FormViewModelCollection | - +title: String; - +width: int; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double - ] - - [AuthScaffold + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [FormViewModelCollection]o-[FormArray] - [PasswordRecoveryForm - | - +formKey: AuthFormKey + [UnsavedChangesDialog | +Widget build() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - - [LoginForm + [<abstract>IFormData | - +formKey: AuthFormKey + +id: String | - +Widget build() + +IFormData copy() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] - - [SignupForm + [FormArrayTable | - +formKey: AuthFormKey + +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(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + -List<Widget> _buildRow(); + -Widget _newItemButton() ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] - - [PasswordForgotForm - | - +formKey: AuthFormKey - | + [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] + + [InviteCodeFormViewModel + | + +study: Study; + +inviteCodeRepository: IInviteCodeRepository; + +codeControl: FormControl<String>; + +codeControlValidationMessages: Map<String, String Function(dynamic)>; + +isPreconfiguredScheduleControl: FormControl<bool>; + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; + +interventionAControl: FormControl<String>; + +interventionBControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? + | + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() + ] + + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + + [EnrolledBadge + | + +enrolledCount: int + | +Widget build() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [InviteCodeFormView + | + +formViewModel: InviteCodeFormViewModel + | + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() + ] - [StudyUJobsToBeDone + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + + [StudyRecruitScreen + | + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() + ] + + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + + [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] + + [StudyInvitesTable + | + +invites: List<StudyInvite>; + +onSelect: void Function(StudyInvite); + +getActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getIntervention: Intervention? Function(String); + +getParticipantCountForInvite: int Function(StudyInvite) + | + +Widget build(); + -List<Widget> _buildRow() + ] + + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] + + [AuthScaffold + | + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets + ] + + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] + + [SignupForm + | + +formKey: AuthFormKey + | + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() + ] + + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] + + [PasswordRecoveryForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + + [PasswordForgotForm + | + +formKey: AuthFormKey | +Widget build() ] + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [AuthFormController | +authRepository: IAuthRepository; @@ -393,581 +557,439 @@ [PasswordTextField]o-[FormControl] - [<abstract>IAppDelegate + [StudyUJobsToBeDone | - +dynamic onAppStart() + +Widget build() ] - [AppController + [LoginForm | - +sharedPreferences: SharedPreferences; - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +formKey: AuthFormKey | - +dynamic onAppStart(); - -dynamic _callDelegates() + +Widget build() ] - [AppController]o-[SharedPreferences] + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel + [StudyAnalyzeController | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() + +dynamic onExport() ] - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + [StudyBaseController]<:-[StudyAnalyzeController] - [StudyRecruitScreen + [StudyAnalyzeScreen | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() + +Widget? banner(); + +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + [PublishDialog | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() + +Widget build() ] - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] + [<abstract>StudyPageWidget]<:-[PublishDialog] - [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>? + [PublishSuccessDialog | - +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>StudyPageWidget]<:-[PublishSuccessDialog] - [EnrolledBadge - | - +enrolledCount: int + [PublishConfirmationDialog | +Widget build() ] - [StudyInvitesTable - | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) - | - +Widget build(); - -List<Widget> _buildRow() + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + + [App ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] + [AppContent + ] - [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> + [<abstract>IStudyAppBarViewModel | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool ] - [StudyFormViewModel]o-[Study] - [StudyFormViewModel]o-[<abstract>IStudyRepository] - [StudyFormViewModel]o-[<abstract>IAuthRepository] - [StudyFormViewModel]o-[GoRouter] - [StudyFormViewModel]o-[StudyInfoFormViewModel] - [StudyFormViewModel]o-[EnrollmentFormViewModel] - [StudyFormViewModel]o-[MeasurementsFormViewModel] - [StudyFormViewModel]o-[ReportsFormViewModel] - [StudyFormViewModel]o-[InterventionsFormViewModel] - [StudyFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - [ConsentItemFormView + [StudyScaffold | - +formViewModel: ConsentItemFormViewModel + +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 ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] - [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] - [StudyDesignEnrollmentFormView + [StudyParticipationBadge | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool + | + +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [ConsentItemFormViewModel + [<abstract>StudyPageWidget | - +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> + +studyId: String | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +Widget? banner() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [<abstract>IScreenerQuestionLogicFormViewModel + [<abstract>IStudyStatusBadgeViewModel | - +isDirtyOptionsBannerVisible: bool + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [ScreenerQuestionLogicFormView + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + + [StudyStatusBadge | - +formViewModel: ScreenerQuestionFormViewModel + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + +Widget build() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] - [ScreenerQuestionFormViewModel + [FrameControlsWidget | - <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 + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +Widget build() ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [EnrollmentFormViewModel + [StudyTestScreen | - +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()> + +previewRoute: String? | - +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(); + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [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>StudyPageWidget]<:-[StudyTestScreen] - [EnrollmentFormConsentItemDelegate - | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + [<abstract>IStudyNavViewModel | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - - [ConsentItemFormData + [StudyNav | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() + ] + + [StudyDesignNav | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [RouteInformation + | + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? + | + +String toString() + ] - [InterventionsFormData + [<abstract>PlatformController | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget | - +Study apply(); - +InterventionsFormData copy() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [InterventionTaskFormViewModel + [WebController | - +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> + +iFrameElement: IFrameElement | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [InterventionTaskFormView + [MobileController | - +formViewModel: InterventionTaskFormViewModel + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [<abstract>PlatformController]<:-[MobileController] - [StudyScheduleFormData + [StudySettingsFormViewModel | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +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> | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [InterventionFormView + [StudySettingsDialog | - +formViewModel: InterventionFormViewModel + +Widget build() ] - [InterventionFormView]o-[InterventionFormViewModel] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [InterventionsFormViewModel + [StudyBaseController | - +study: Study; + +studyId: String; + +studyRepository: IStudyRepository; +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + +studySubscription: StreamSubscription<WrappedModel<Study>>? | - +void setControlsFrom(); - +InterventionsFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +InterventionFormViewModel provide(); - +void onCancel(); - +dynamic onSave(); - +dynamic testStudySchedule() + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [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] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [InterventionFormData + [WebFrame | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + +previewSrc: String; + +studyId: String | - +Intervention toIntervention(); - +InterventionFormData copy() + +Widget build() ] - [<abstract>IFormData]<:-[InterventionFormData] + [DisabledFrame + | + +Widget build() + ] - [StudyScheduleFormView + [PhoneContainer | - +formViewModel: StudyScheduleControls + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? | - -FormTableRow _renderCustomSequence(); +Widget build() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [InterventionFormViewModel + [MobileFrame | - +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() + ] + + [DesktopFrame | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() + +Widget build() ] - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - - [<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 + [StudyTestController | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +authRepository: IAuthRepository; + +languageCode: String ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [StudyDesignInterventionsFormView + [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() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [InterventionTaskFormData - | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String + [TestAppRoutes | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs + [StudyDesignInfoFormView | +Widget build() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [StudyFormValidationSet + [StudyInfoFormViewModel | - +index: int; - <static>+values: List<StudyFormValidationSet> + +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() ] - [Enum]<:--[StudyFormValidationSet] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] [StudyInfoFormData | @@ -1002,50 +1024,33 @@ [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [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 + [StudyFormValidationSet | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic + +index: int; + <static>+values: List<StudyFormValidationSet> + ] + + [Enum]<:--[StudyFormValidationSet] + + [StudyDesignMeasurementsFormView | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() + +Widget build() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] [MeasurementsFormViewModel | @@ -1082,29 +1087,16 @@ [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [StudyDesignMeasurementsFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs + [MeasurementsFormData | - +Widget build() - ] - - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] - - [MeasurementSurveyFormView + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String | - +formViewModel: MeasurementSurveyFormViewModel + +Study apply(); + +MeasurementsFormData copy() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] [MeasurementSurveyFormViewModel | @@ -1162,327 +1154,271 @@ [MeasurementSurveyFormData]o-[QuestionnaireFormData] [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [MeasurementsFormData + [SurveyPreview | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + +routeArgs: MeasurementFormRouteArgs | - +Study apply(); - +MeasurementsFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [<abstract>IStudyFormData + [MeasurementSurveyFormView | - +Study apply() + +formViewModel: MeasurementSurveyFormViewModel ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [<abstract>StudyDesignPageWidget + [<abstract>IStudyFormData | - +Widget? banner() + +Study apply() ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [StudyFormScaffold + [ReportsFormViewModel | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +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() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [ReportsFormViewModel]o-[Study] + [ReportsFormViewModel]o-[GoRouter] + [ReportsFormViewModel]o-[ReportFormItemDelegate] + [ReportsFormViewModel]o-[FormArray] + [ReportsFormViewModel]o-[FormViewModelCollection] + [ReportsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - [<abstract>WithScheduleControls + [ReportFormItemDelegate | - +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>? + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [<abstract>IFormDataWithSchedule + [ReportItemFormView | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) | - +Schedule toSchedule() + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [ScheduleControls + [LinearRegressionSectionFormView | - +formViewModel: WithScheduleControls + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +Widget build() ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [QuestionFormViewModel + [DataReferenceIdentifier | - <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 + +hashCode: int | - +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() + +bool ==() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [DataReference]<:-[DataReferenceIdentifier] - [<abstract>QuestionFormData + [DataReferenceEditor | - <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 + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [ChoiceQuestionFormData + [TemporalAggregationFormatted | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [BoolQuestionFormData + [ImprovementDirectionFormatted | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [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> + [ReportSectionType | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] - [<abstract>IScaleQuestionFormViewModel + [AverageSectionFormView | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +formViewModel: QuestionFormViewModel + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [SurveyQuestionType + [ReportItemFormViewModel | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +sectionControl: FormControl<ReportSection>; + +dataReferenceControl: FormControl<DataReferenceIdentifier<num>>; + +temporalAggregationControl: FormControl<TemporalAggregationFormatted>; + +improvementDirectionControl: FormControl<ImprovementDirectionFormatted>; + +alphaControl: FormControl<double>; + -_controlsBySectionType: Map<ReportSectionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +sectionBaseControls: Map<String, AbstractControl<dynamic>>; + +form: FormGroup; + +sectionId: String; + +sectionType: ReportSectionType; + <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>>; + <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>>; + <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>>; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +Widget build() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel + [ReportItemFormData | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [SurveyQuestionFormView + +isPrimary: bool; + +section: ReportSection; + +id: String | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [QuestionnaireFormData + [ReportsFormData | - +questionsData: List<QuestionFormData>?; + +reportItems: List<ReportItemFormData>; +id: String | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +Study apply(); + +ReportsFormData copy() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + [ReportStatus | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] [StudyDesignReportsFormView | @@ -1492,706 +1428,763 @@ [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [ReportsFormViewModel + [ReportBadge | - +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 + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - +void setControlsFrom(); - +ReportsFormData buildFormData(); - +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() + +Widget build() ] - [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] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [ReportFormItemDelegate - | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + [StudyDesignEnrollmentFormView | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [ReportItemFormView + [ConsentItemFormData | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>IFormData]<:-[ConsentItemFormData] - [TemporalAggregationFormatted + [EnrollmentFormData | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +Study apply(); + +EnrollmentFormData copy() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [ImprovementDirectionFormatted + [ConsentItemFormViewModel | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + +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> | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [ReportSectionType + [<abstract>IScreenerQuestionLogicFormViewModel | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +isDirtyOptionsBannerVisible: bool ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] - - [DataReferenceIdentifier + [ScreenerQuestionLogicFormView | - +hashCode: int + +formViewModel: ScreenerQuestionFormViewModel | - +bool ==() - ] - - [DataReference]<:-[DataReferenceIdentifier] - - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [AverageSectionFormView + [ScreenerQuestionFormViewModel | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + <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() ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [LinearRegressionSectionFormView + [EnrollmentFormViewModel | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +form: FormGroup; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> | - +Widget build() + +void setControlsFrom(); + +EnrollmentFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [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] - [ReportItemFormData + [EnrollmentFormConsentItemDelegate | - +isPrimary: bool; - +section: ReportSection; - +id: String + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [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 + [ConsentItemFormView | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +formViewModel: ConsentItemFormViewModel ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - [ReportsFormData + [<abstract>WithScheduleControls | - +reportItems: List<ReportItemFormData>; - +id: String + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? | - +Study apply(); - +ReportsFormData copy() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [ReportStatus + [<abstract>IFormDataWithSchedule | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? + | + +Schedule toSchedule() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [ReportBadge + [ScheduleControls | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +formViewModel: WithScheduleControls | - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [AppStatus + [SurveyQuestionType | +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [PublishDialog + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel | +Widget build() ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [PublishConfirmationDialog + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel | +Widget build() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [PublishSuccessDialog + [<abstract>IScaleQuestionFormViewModel | - +Widget build() + +isMidValuesClearedInfoVisible: bool ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - - [StudyAnalyzeScreen + [ScaleQuestionFormView | - +Widget? banner(); - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - - [StudyAnalyzeController - | - +dynamic onExport() - ] - - [StudyBaseController]<:-[StudyAnalyzeController] - - [StudyBaseController - | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? - | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() - ] - - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] - - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool - | - +Widget build() + +formViewModel: QuestionFormViewModel ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] - - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? - | - +String toString() - ] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [<abstract>PlatformController + [<abstract>QuestionFormData | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + <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 | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] - [WebController - | - +iFrameElement: IFrameElement + [ChoiceQuestionFormData | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() - ] - - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] - - [MobileController + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>PlatformController]<:-[MobileController] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [<abstract>IStudyAppBarViewModel + [BoolQuestionFormData | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool - ] - - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - - [StudyScaffold + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> | - +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 + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - [StudyController - | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + [ScaleQuestionFormData | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() - ] - - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] - - [<abstract>IStudyStatusBadgeViewModel + +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> | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [StudyStatusBadge + [QuestionFormViewModel | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: 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; + +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 | - +Widget build() + +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() ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [StudyTestController + [SurveyQuestionFormView | - +authRepository: IAuthRepository; - +languageCode: String + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [TestAppRoutes + [<abstract>WithQuestionnaireControls | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String - ] - - [<abstract>IStudyNavViewModel + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [StudyNav - | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() - ] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [StudyDesignNav + [QuestionnaireFormData | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [StudySettingsDialog + [<abstract>IFormData]<:--[QuestionnaireFormData] + + [<abstract>StudyDesignPageWidget | - +Widget build() + +Widget? banner() ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [StudySettingsFormViewModel + [StudyFormViewModel | - +study: AsyncValue<Study>; + +studyDirtyCopy: Study?; +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; + +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(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() - ] - - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - - [<abstract>StudyPageWidget - | - +studyId: String - | - +Widget? banner() + +void dispose(); + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [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] - [StudyTestScreen + [<abstract>StudyScheduleControls | - +previewRoute: 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 | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + [StudyDesignInterventionsFormView | +Widget build() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [PreviewFrame + [InterventionFormViewModel | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: 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> + | + +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() ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [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] - [WebFrame + [StudyScheduleFormView | - +previewSrc: String; - +studyId: String + +formViewModel: StudyScheduleControls | + -FormTableRow _renderCustomSequence(); +Widget build() ] - [DisabledFrame - | - +Widget build() - ] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [PhoneContainer + [StudyScheduleFormData | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - +Widget build() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [MobileFrame + [InterventionFormView | - +Widget build() + +formViewModel: InterventionFormViewModel ] - [DesktopFrame + [InterventionFormView]o-[InterventionFormViewModel] + + [InterventionsFormViewModel | - +Widget build() + +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() ] - [StudiesFilter + [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 | - +index: int; - <static>+values: List<StudiesFilter> + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String + | + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [Enum]<:--[StudiesFilter] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [DashboardScaffold + [InterventionPreview | - +body: Widget + +routeArgs: InterventionFormRouteArgs | +Widget build() ] - [DashboardScaffold]o-[<abstract>Widget] - - [StudiesTable - | - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] + + [InterventionTaskFormView | - +Widget build(); - -List<Widget> _buildRow() + +formViewModel: InterventionTaskFormViewModel ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [DashboardScreen + [InterventionsFormData | - +filter: StudiesFilter? + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String + | + +Study apply(); + +InterventionsFormData copy() ] - [DashboardScreen]o-[StudiesFilter] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [DashboardController + [InterventionTaskFormViewModel | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; + +form: FormGroup; + +taskId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +titles: Map<FormMode, String> | - -dynamic _subscribeStudies(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [<abstract>IModelActionProvider]<:--[DashboardController] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [StudyMonitorScreen + [InterventionFormData | - +Widget build() + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String + | + +Intervention toIntervention(); + +InterventionFormData copy() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [<abstract>IFormData]<:-[InterventionFormData] [AccountSettingsDialog | @@ -2200,1556 +2193,1685 @@ [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [App + [AppStatus + | + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [AppContent + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] + + [<abstract>IAppDelegate + | + +dynamic onAppStart() + ] + + [AppController + | + +sharedPreferences: SharedPreferences; + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() ] + [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()? + + + - - + + + + + + + void Function(BuildContext, WidgetRef)? + + + - - - - - - - - + + + + + - - - FormValidationSetEnum + + + GoRouterDrawerEntry + + + + + + +intent: RoutingIntent + + + + + + +void onClick() - - - - - + + + - - - FormControlValidation + + + RoutingIntent - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + + + + + + + AppDrawer - - - +FormControlValidation merge() + + + +title: String + +width: int + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - + + + + + - - - AbstractControl + + + DashboardController + + + + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + + + + + + -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() - - - - + + + - - - ManagedFormViewModel + + + IStudyRepository - - - +ManagedFormViewModel<T> createDuplicate() + + + + + + + + IAuthRepository - - - - - + + + - - - FormViewModel + + + IUserRepository - - - -_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>> + + + + + + + + GoRouter - - - -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() + + + + + + + + StreamSubscription - - - + + + - - - FormViewModelNotFoundException + + + SearchController - - - + + + - - - Exception + + + IModelActionProvider - - - - - + + + + + - - - FormViewModelCollection + + + StudiesTable - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + +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)?> - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + +Widget build() + -List<Widget> _buildRow() - - - + + + - - - FormArray + + + void Function(Study) - - - - - + + + - - - FormArrayTable + + + List<ModelAction<dynamic>> Function(Study) - - - +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 - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + + + + + + int Function(Study, Study) - - - + + + + + + + + + DashboardScaffold + + + + + + +body: Widget + + - - - void Function(T) + + + +Widget build() - - - + + + + - - - List<ModelAction<dynamic>> Function(T, int) + + + StudiesFilter - - - - - - - - void Function()? + + + +index: int + <static>+values: List<StudiesFilter> - - - + + + - - - String Function(T) + + + Enum - - - + + + + - - - IconData + + + DashboardScreen - - - - - - - - Widget Function(BuildContext, T, int)? + + + +filter: StudiesFilter? - - - + + + + - - - Widget + + + StudyMonitorScreen - - - - - - - - EdgeInsets + + + +Widget build() - - - - - + + + + + - - - IFormData + + + StudyPageWidget - - - +id: String + + + +studyId: String - - - +IFormData copy() + + + +Widget? banner() - - - + + + - + CustomFormControl - + -_onValueChangedDebouncer: Debouncer? -_onStatusChangedDebouncer: Debouncer? @@ -3760,7 +3882,7 @@ - + +void dispose() @@ -3769,9 +3891,9 @@ - + - + Debouncer @@ -3780,9 +3902,9 @@ - + - + void Function(T?)? @@ -3791,9 +3913,9 @@ - + - + void Function(ControlStatus)? @@ -3802,9 +3924,9 @@ - + - + FormControl @@ -3813,27 +3935,38 @@ - + - + FormInvalidException + + + + + + + Exception + + + + - - + + - + FormConfigException - + +message: String? @@ -3842,16 +3975,16 @@ - - + + - + IFormViewModelDelegate - + +dynamic onSave() +void onCancel() @@ -3861,16 +3994,16 @@ - - + + - + IFormGroupController - + +form: FormGroup @@ -3879,9 +4012,9 @@ - + - + FormGroup @@ -3890,16 +4023,16 @@ - - + + - + FormControlOption - + +value: T +label: String @@ -3908,612 +4041,406 @@ - - - - - - - - Equatable - - - - - - - - - - - - FormMode - - - - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode - - - - - - - - - - - CancelableOperation - - - - - - - - - - - Enum - - - - - - - - - - - - UnsavedChangesDialog - - - - - - +Widget build() - - - - - - - - - - - - - DrawerEntry - - - - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +title: String - +helpText: String? - - - - - - +void onClick() - - - - - - - - - - - String Function() - - - - - - - - - - - String Function()? - - - - - - - - - - - void Function(BuildContext, WidgetRef)? - - - - - - - - - - - - - GoRouterDrawerEntry - - - - - - +intent: RoutingIntent - - - - - - +void onClick() - - - - - - - - - - - RoutingIntent - - - - - - - - - - - - AppDrawer - - - - - - +title: String - +width: int - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double - - - - - - - - - - - - AuthScaffold - - - - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + + + + + + Equatable - - - - + + + + + - - - AuthFormKey + + + FormViewModel - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + -_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() - - - - - + + + + - - - PasswordRecoveryForm + + + FormMode - - - +formKey: AuthFormKey + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - +Widget build() + + + + + + + + FormValidationSetEnum - - - + + + - - - FormConsumerRefWidget + + + CancelableOperation - - - - - + + + + - - - LoginForm + + + ManagedFormViewModel - - - +formKey: AuthFormKey + + + +ManagedFormViewModel<T> createDuplicate() - - - +Widget build() + + + + + + + + FormViewModelNotFoundException - - - - - + + + + + - - - SignupForm + + + FormViewModelCollection - - - +formKey: AuthFormKey + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - - - + + + - - - PasswordForgotForm + + + FormArray - - - +formKey: AuthFormKey + + + + + + + + + UnsavedChangesDialog - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudyUJobsToBeDone + + + IFormData - - - +Widget build() + + + +id: String - - - - - - - - - - AuthFormController + + + +IFormData copy() - - - +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 + + + + + + + + + + FormArrayTable - - - -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() + + + +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> - - - - - - - - IAuthRepository + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - + + + - - - SharedPreferences + + + AbstractControl - - - + + + - - - INotificationService + + + void Function(T) - - - + + + - - - GoRouter + + + List<ModelAction<dynamic>> Function(T, int) - - - - - - - - EmailTextField - - + + + - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + void Function()? - - - - - - - - PasswordTextField - - + + + - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + String Function(T) - - - - - - - - IAppDelegate - - + + + - - - +dynamic onAppStart() + + + Widget Function(BuildContext, T, int)? - - - - - - - - - AppController - - - - - - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic - - + + + - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + EdgeInsets - - - - - + + + + + - - - InviteCodeFormView + + + FormControlValidation - - - +formViewModel: InviteCodeFormViewModel + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + +FormControlValidation merge() - - - + + + - + InviteCodeFormViewModel - + +study: Study +inviteCodeRepository: IInviteCodeRepository @@ -4532,7 +4459,7 @@ - + +void initControls() -dynamic _uniqueInviteCode() @@ -4545,207 +4472,186 @@ - - - + + + - - - FormConsumerWidget + + + Study - - - - - - - - StudyRecruitScreen - - + + + - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + IInviteCodeRepository - - - - - + + + + + - - - StudyPageWidget + + + EnrolledBadge - - - +studyId: String + + + +enrolledCount: int - - - +Widget? banner() + + + +Widget build() - - - - - + + + + + - - - StudyRecruitController + + + InviteCodeFormView - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + +formViewModel: InviteCodeFormViewModel - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - + + + - - - IInviteCodeRepository + + + FormConsumerWidget - - - + + + + - - - StreamSubscription + + + StudyRecruitScreen - - - - - - - - - - StudyBaseController + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? - - + + + + + + - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + StudyRecruitController - - - - - - - - IModelActionProvider + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - - - - - - Study + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - - + + + + + - - - EnrolledBadge + + + StudyBaseController - - - +enrolledCount: int + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - +Widget build() + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - + + + - + StudyInvitesTable - + +invites: List<StudyInvite> +onSelect: void Function(StudyInvite) @@ -4756,7 +4662,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -4766,9 +4672,9 @@ - + - + void Function(StudyInvite) @@ -4777,9 +4683,9 @@ - + - + List<ModelAction<dynamic>> Function(StudyInvite) @@ -4788,9 +4694,9 @@ - + - + Intervention? Function(String) @@ -4799,1529 +4705,1364 @@ - + - + int Function(StudyInvite) - - - - - + + + + - - - StudyFormViewModel + + + AuthScaffold - - - +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> + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + + + + + + + AuthFormKey - - - - - - - - IStudyRepository + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - - - + + + + + - - - StudyInfoFormViewModel + + + SignupForm - - - +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 + + + +formKey: AuthFormKey - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - - + + + - - - EnrollmentFormViewModel + + + FormConsumerRefWidget - - - +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()> + + + + + + + + + + PasswordRecoveryForm - - - +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() + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - - - + + + + + - - - MeasurementsFormViewModel + + + PasswordForgotForm - - - +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> + + + +formKey: AuthFormKey - - - +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() - - - - - + + + + + - - - ReportsFormViewModel + + + AuthFormController - - - +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 + + + +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() - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + + + + + + SharedPreferences - - - - - + + + - - - InterventionsFormViewModel + + + INotificationService - - - +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 + + + + + + + + + EmailTextField - - - +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() + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - + + + + - - - ConsentItemFormView + + + PasswordTextField - - - +formViewModel: ConsentItemFormViewModel + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - - - - - - ConsentItemFormViewModel - - + + + + - - - +consentIdControl: FormControl<String> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +iconControl: FormControl<IconOption> - +form: FormGroup - +consentId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +titles: Map<FormMode, String> + + + StudyUJobsToBeDone - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +Widget build() - - - - - + + + + + - - - EnrollmentFormData + + + LoginForm - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + +formKey: AuthFormKey - - - +Study apply() - +EnrollmentFormData copy() + + + +Widget build() - - - + + + + - - - Participation + + + StudyAnalyzeController + + + + + + +dynamic onExport() - - - - - + + + + - - - QuestionnaireFormData + + + StudyAnalyzeScreen - - - +questionsData: List<QuestionFormData>? - +id: String + + + +Widget? banner() + +Widget build() - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + + + + + + + PublishDialog + + + + + + +Widget build() - - - - + + + + - - - IStudyFormData + + + PublishSuccessDialog - - - +Study apply() + + + +Widget build() - - - - + + + + - - - StudyDesignEnrollmentFormView + + + PublishConfirmationDialog - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + +Widget build() - - - - + + + - - - StudyDesignPageWidget + + + App - - - +Widget? banner() + + + + + + + + AppContent - - - - + + + + - - - IScreenerQuestionLogicFormViewModel + + + IStudyAppBarViewModel - - - +isDirtyOptionsBannerVisible: bool + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - - - + + + + - - - ScreenerQuestionLogicFormView + + + IStudyStatusBadgeViewModel - - - +formViewModel: ScreenerQuestionFormViewModel + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + + + + + + + IStudyNavViewModel + + + + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - - - - - - - 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 + + + StudyScaffold - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + +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 - - - - - + + + - - - QuestionFormViewModel + + + NavbarTab - - - <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 - - + + + + - - - +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() + + + SingleColumnLayoutType - - - - - + + + + - - - EnrollmentFormConsentItemDelegate + + + PreviewFrame - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + + + + + + StudyFormRouteArgs - - - - - + + + + + - - - WithQuestionnaireControls + + + StudyParticipationBadge - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +Widget build() - - - + + + - - - IListActionProvider + + + Participation - - - + + + - - - IProviderArgsResolver + + + BadgeType - - - - - + + + - - - ConsentItemFormData + + + ConsumerWidget - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + + + + + + IWithBanner - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + + + + + + StudyStatus - - - - - + + + + + - - - InterventionsFormData + + + StudyStatusBadge - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +Study apply() - +InterventionsFormData copy() + + + +Widget build() - - - - - + + + + + - - - StudyScheduleFormData + + + FrameControlsWidget - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +Widget build() - - - - - + + + + + - - - InterventionTaskFormViewModel + + + StudyTestScreen - - - +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> + + + +previewRoute: String? - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - - - + + + + - - - WithScheduleControls + + + StudyNav - - - +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>? + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + + + + + + + StudyDesignNav + + + + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - - + + + + + - - - InterventionTaskFormView + + + RouteInformation - - - +formViewModel: InterventionTaskFormViewModel + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - - - - - - PhaseSequence + + + +String toString() - - - - + + + + + - - - InterventionFormView + + + PlatformController - - - +formViewModel: InterventionFormViewModel + + + +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() - - - - - + + + + + - - - InterventionFormViewModel + + + WebController - - - +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> + + + +iFrameElement: IFrameElement - - - +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() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - - - + + + - - - StudyScheduleControls + + + IFrameElement - - - <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 + + + + + + + + + MobileController - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - - - + + + + + - - - InterventionFormData + + + StudySettingsFormViewModel - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - - - + + + - - - StudyScheduleFormView + + + AsyncValue - - - +formViewModel: StudyScheduleControls + + + + + + + + + StudySettingsDialog - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudyDesignInterventionsFormView + + + WebFrame - - - +Widget build() + + + +previewSrc: String + +studyId: String - - - - - - - - - - InterventionTaskFormData + + + +Widget build() - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + + + + + + + DisabledFrame - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +Widget build() - - - - - + + + + + - - - IFormDataWithSchedule + + + PhoneContainer - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? - - - +Schedule toSchedule() + + + +Widget build() - - - - - + + + - - - InterventionPreview + + + Color - - - +routeArgs: InterventionFormRouteArgs + + + + + + + + + MobileFrame - - - +Widget build() + + + +Widget build() - - - + + + + - - - InterventionFormRouteArgs + + + DesktopFrame - - - - - - - - ConsumerWidget + + + +Widget build() - - - - + + + + - - - StudyFormValidationSet + + + StudyTestController - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +authRepository: IAuthRepository + +languageCode: String - - - - - + + + + + - - - StudyInfoFormData + + + StudyController - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - +Study apply() - +StudyInfoFormData copy() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - - - - - - - StudyContactInfoFormData - - + + + + - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + TestAppRoutes - - - +Study apply() - +StudyInfoFormData copy() + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - + + - + StudyDesignInfoFormView - + +Widget build() - - - - - - - - StudyDesignMeasurementsFormView - - - - - - +Widget build() - - - - - - - - - - - - - SurveyPreview - - + + + + - - - +routeArgs: MeasurementFormRouteArgs + + + StudyDesignPageWidget - - - +Widget build() + + + +Widget? banner() - - - + + + + + - - - MeasurementFormRouteArgs + + + StudyInfoFormViewModel - - - - - - - - - MeasurementSurveyFormView + + + +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: MeasurementSurveyFormViewModel + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - - - + + + + + - - - MeasurementSurveyFormViewModel + + + StudyInfoFormData - - - +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> + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +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() + + + +Study apply() + +StudyInfoFormData copy() - - - - - + + + + + - - - MeasurementSurveyFormData + + + StudyContactInfoFormData - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +Study apply() + +StudyInfoFormData copy() - - - - - - - - - MeasurementsFormData - - + + + + - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + IStudyFormData - - - +Study apply() - +MeasurementsFormData copy() + + + +Study apply() - - - + + + - + StudyFormScaffold - + +studyId: String +formViewModelBuilder: T Function(WidgetRef) @@ -6329,7 +6070,7 @@ - + +Widget build() @@ -6338,9 +6079,9 @@ - + - + T Function(WidgetRef) @@ -6349,354 +6090,465 @@ - + - + Widget Function(T) - - - + + + + - - - StudyUTimeOfDay + + + StudyFormValidationSet + + + + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + + - - - ScheduleControls + + + StudyDesignMeasurementsFormView - - - +formViewModel: WithScheduleControls + + + +Widget build() - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + + + + + + + + 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() - - - - + + + - - - SurveyQuestionType + + + IListActionProvider - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType + + + + + + + + IProviderArgsResolver - - - - - + + + + + - - - QuestionFormData + + + MeasurementsFormData - - - <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 + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +Study apply() + +MeasurementsFormData copy() - - - - - + + + + + - - - ChoiceQuestionFormData + + + MeasurementSurveyFormViewModel - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +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() - - - - - + + + + + - - - BoolQuestionFormData + + + 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() - - - - - + + + + + - - - ScaleQuestionFormData + + + WithScheduleControls - - - +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> + + + +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>? - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - + + + + + - - - Color + + + MeasurementSurveyFormData - - - - - - - - - IScaleQuestionFormViewModel + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - +isMidValuesClearedInfoVisible: bool + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - + + + + + - - - ScaleQuestionFormView + + + QuestionnaireFormData - - - +formViewModel: QuestionFormViewModel + + + +questionsData: List<QuestionFormData>? + +id: String + + + + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - BoolQuestionFormView + + + IFormDataWithSchedule - - - +formViewModel: QuestionFormViewModel + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - +Widget build() + + + +Schedule toSchedule() - - - - - + + + + + - - - ChoiceQuestionFormView + + + SurveyPreview - - - +formViewModel: QuestionFormViewModel + + + +routeArgs: MeasurementFormRouteArgs - - - +Widget build() + + + +Widget build() - - - - + + + - - - SurveyQuestionFormView + + + MeasurementFormRouteArgs - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + + + + + + + MeasurementSurveyFormView + + + + + + +formViewModel: MeasurementSurveyFormViewModel - - - - + + + + + - - - StudyDesignReportsFormView + + + ReportsFormViewModel - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +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 @@ -6705,7 +6557,7 @@ - + +void onCancel() +dynamic onSave() @@ -6719,17 +6571,17 @@ - - - + + + - + ReportItemFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -6738,7 +6590,7 @@ - + +Widget build() -dynamic _buildSectionText() @@ -6749,17 +6601,17 @@ - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -6792,7 +6644,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -6806,28 +6658,130 @@ - + - + Widget Function(BuildContext) + + + + + + + + + LinearRegressionSectionFormView + + + + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + +Widget build() + + + + + + + + + + + + + DataReferenceIdentifier + + + + + + +hashCode: int + + + + + + +bool ==() + + + + + + + + + + + DataReference + + + + + + + + + + + + + DataReferenceEditor + + + + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + + + + + + + + + ReactiveDropdownField + + + + - - - + + + - + TemporalAggregationFormatted - + -_value: TemporalAggregation <static>+values: List<TemporalAggregationFormatted> @@ -6838,7 +6792,7 @@ - + +bool ==() +String toString() @@ -6850,9 +6804,9 @@ - + - + TemporalAggregation @@ -6861,17 +6815,17 @@ - - - + + + - + ImprovementDirectionFormatted - + -_value: ImprovementDirection <static>+values: List<ImprovementDirectionFormatted> @@ -6882,7 +6836,7 @@ - + +bool ==() +String toString() @@ -6894,9 +6848,9 @@ - + - + ImprovementDirection @@ -6905,16 +6859,16 @@ - - + + - + ReportSectionType - + +index: int <static>+values: List<ReportSectionType> @@ -6924,94 +6878,19 @@ - - - - - - - - - DataReferenceIdentifier - - - - - - +hashCode: int - - - - - - +bool ==() - - - - - - - - - - - DataReference - - - - - - - - - - - - - DataReferenceEditor - - - - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - - - - ReactiveDropdownField - - - - - - - + + + - + AverageSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -7019,53 +6898,26 @@ - + +Widget build() - - - - - - - - - LinearRegressionSectionFormView - - - - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - +Widget build() - - - - - - - + + + - + ReportItemFormData - + +isPrimary: bool +section: ReportSection @@ -7073,7 +6925,7 @@ - + <static>+dynamic fromDomainModel() +ReportItemFormData copy() @@ -7083,9 +6935,9 @@ - + - + ReportSection @@ -7094,24 +6946,24 @@ - - - + + + - + ReportsFormData - + +reportItems: List<ReportItemFormData> +id: String - + +Study apply() +ReportsFormData copy() @@ -7121,16 +6973,16 @@ - - + + - + ReportStatus - + +index: int <static>+values: List<ReportStatus> @@ -7140,19 +6992,38 @@ + + + + + + + + StudyDesignReportsFormView + + + + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() + + + + - - - + + + - + ReportBadge - + +status: ReportStatus? +type: BadgeType @@ -7161,1047 +7032,1253 @@ - + +Widget build() - - - + + + + - - - BadgeType + + + StudyDesignEnrollmentFormView + + + + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - + + + + + - - - AppStatus + + + ConsentItemFormData - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String + + + + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - + + + + + - - - PublishDialog + + + EnrollmentFormData - - - +Widget build() + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String + + + + + + +Study apply() + +EnrollmentFormData copy() - - - - + + + + + - - - PublishConfirmationDialog + + + ConsentItemFormViewModel + + + + + + +consentIdControl: FormControl<String> + +titleControl: FormControl<String> + +descriptionControl: FormControl<String> + +iconControl: FormControl<IconOption> + +form: FormGroup + +consentId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - - + + + + - - - PublishSuccessDialog + + + IScreenerQuestionLogicFormViewModel - - - +Widget build() + + + +isDirtyOptionsBannerVisible: bool - - - - - - - - StudyAnalyzeScreen - - + + + + + - - - +Widget? banner() - +Widget build() + + + ScreenerQuestionLogicFormView - - - - - - - - - StudyAnalyzeController + + + +formViewModel: ScreenerQuestionFormViewModel - - - +dynamic onExport() + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - - + + + + + - - - StudyParticipationBadge + + + ScreenerQuestionFormViewModel - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: 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() - - - - - + + + + + - - - RouteInformation + + + QuestionFormViewModel - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - +String toString() + + + +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() - - - - - + + + + + - - - PlatformController + + + EnrollmentFormViewModel - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + +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 activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + +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() - - - - - - - - - WebController - - + + + + + - - - +iFrameElement: IFrameElement + + + EnrollmentFormConsentItemDelegate - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - - - - - - IFrameElement + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - + + + + - - - MobileController + + + ConsentItemFormView - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + +formViewModel: ConsentItemFormViewModel - - - - + + + - - - IStudyAppBarViewModel + + + StudyUTimeOfDay - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + + + + + + + + ScheduleControls - - - - - - - - - IStudyStatusBadgeViewModel + + + +formViewModel: WithScheduleControls - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - + + + + - - - IStudyNavViewModel + + + SurveyQuestionType - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType - - - - + + + + + - - - StudyScaffold + + + ChoiceQuestionFormView - - - +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: QuestionFormViewModel - - - - - - - - NavbarTab + + + +Widget build() - - - + + + + + - - - SingleColumnLayoutType + + + BoolQuestionFormView - - - - - - + + + +formViewModel: QuestionFormViewModel + + - - - StudyController + + + +Widget build() - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + + + + + + + IScaleQuestionFormViewModel - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - StudyStatus + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel - - - - - + + + + + - - - StudyStatusBadge + + + QuestionFormData - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String - - - +Widget build() + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - - + + + + + - - - StudyTestController + + + ChoiceQuestionFormData - - - +authRepository: IAuthRepository - +languageCode: String + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - - + + + + + - - - TestAppRoutes + + + BoolQuestionFormData - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - + + + + + - - - StudyNav + + + 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> - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - + + + + - - - StudyDesignNav + + + SurveyQuestionFormView - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - + + + + + - - - StudySettingsDialog + + + StudyFormViewModel - - - +Widget build() + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + + + + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - - - + + + + + - - - StudySettingsFormViewModel + + + InterventionsFormViewModel - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + +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() - - - + + + + + - - - AsyncValue + + + 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 + + - - - IWithBanner + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - - - + + + - - - StudyTestScreen + + + PhaseSequence - - - +previewRoute: String? + + + + + + + + + StudyDesignInterventionsFormView - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +Widget build() - - - - - + + + + + - - - FrameControlsWidget + + + InterventionFormViewModel - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - + + + + + - - - PreviewFrame + + + StudyScheduleFormView - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + +formViewModel: StudyScheduleControls - - - - - - - - StudyFormRouteArgs + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - - - - - - WebFrame + + + + + + + + + StudyScheduleFormData - - - +previewSrc: String - +studyId: String + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +Widget build() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - - + + + + - - - DisabledFrame + + + InterventionFormView - - - +Widget build() + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - PhoneContainer + + + InterventionTaskFormData - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +Widget build() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - + + + + + - - - MobileFrame + + + InterventionPreview - - - +Widget build() + + + +routeArgs: InterventionFormRouteArgs - - - - - - - - - DesktopFrame + + + +Widget build() - - - +Widget build() + + + + + + + + InterventionFormRouteArgs - - - - + + + + - - - StudiesFilter + + + InterventionTaskFormView - - - +index: int - <static>+values: List<StudiesFilter> + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - DashboardScaffold + + + InterventionTaskFormViewModel - - - +body: Widget + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - - - - - - StudiesTable - - + + + + + - - - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget + + + InterventionsFormData - - - +Widget build() - -List<Widget> _buildRow() + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - - - - - - void Function(Study) + + + +Study apply() + +InterventionsFormData copy() - - - + + + + + - - - List<ModelAction<dynamic>> Function(Study) + + + InterventionFormData - - - - - - - - - DashboardScreen + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - +filter: StudiesFilter? + + + +Intervention toIntervention() + +InterventionFormData copy() - - - - - - - - - DashboardController - - + + + + - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + + + AccountSettingsDialog - - - -dynamic _subscribeStudies() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +Widget build() - - - - + + + + - - - StudyMonitorScreen + + + AppStatus - - - +Widget build() + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - - + + + + - - - AccountSettingsDialog + + + IAppDelegate - - - +Widget build() + + + +dynamic onAppStart() - - - + + + + + - - - App + + + AppController - - - - + + + +sharedPreferences: SharedPreferences + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic + + - - - AppContent + + + +dynamic onAppStart() + -dynamic _callDelegates() diff --git a/docs/uml/designer_v2/lib/repositories/uml.svg b/docs/uml/designer_v2/lib/repositories/uml.svg index 8dd0e0247..712cf0b22 100644 --- a/docs/uml/designer_v2/lib/repositories/uml.svg +++ b/docs/uml/designer_v2/lib/repositories/uml.svg @@ -1,8 +1,20 @@ - - [StudyLaunched + + [<abstract>IAppRepository + | + +dynamic fetchAppConfig(); + +void dispose() ] - [<abstract>ModelEvent]<:-[StudyLaunched] + [AppRepository + | + +apiClient: StudyUApi + | + +dynamic fetchAppConfig(); + +void dispose() + ] + + [AppRepository]o-[<abstract>StudyUApi] + [<abstract>IAppRepository]<:--[AppRepository] [<abstract>IStudyRepository | @@ -16,7 +28,8 @@ | +apiClient: StudyUApi; +authRepository: IAuthRepository; - +ref: ProviderRef<dynamic> + +ref: ProviderRef<dynamic>; + +sortCallback: void Function()? | +String getKey(); +dynamic deleteParticipants(); @@ -27,6 +40,7 @@ [StudyRepository]o-[<abstract>StudyUApi] [StudyRepository]o-[<abstract>IAuthRepository] [StudyRepository]o-[<abstract>ProviderRef] + [StudyRepository]o-[void Function()?] [<abstract>ModelRepository]<:-[StudyRepository] [<abstract>IStudyRepository]<:--[StudyRepository] @@ -48,48 +62,50 @@ [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] - [<abstract>ModelEvent + [<abstract>IUserRepository | - +modelId: String; - +model: T - ] - - [IsFetched - ] - - [<abstract>ModelEvent]<:-[IsFetched] - - [IsSaving - ] - - [<abstract>ModelEvent]<:-[IsSaving] - - [IsSaved + +user: StudyUUser + | + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [<abstract>ModelEvent]<:-[IsSaved] + [<abstract>IUserRepository]o-[StudyUUser] - [IsDeleted + [UserRepository + | + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: Ref<Object?>; + +user: StudyUUser + | + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [<abstract>ModelEvent]<:-[IsDeleted] + [UserRepository]o-[<abstract>StudyUApi] + [UserRepository]o-[<abstract>IAuthRepository] + [UserRepository]o-[<abstract>Ref] + [UserRepository]o-[StudyUUser] + [<abstract>IUserRepository]<:--[UserRepository] - [<abstract>IAppRepository + [PreferenceAction | - +dynamic fetchAppConfig(); - +void dispose() + +index: int; + <static>+values: List<PreferenceAction>; + <static>+pin: PreferenceAction; + <static>+pinOff: PreferenceAction ] - [AppRepository - | - +apiClient: StudyUApi - | - +dynamic fetchAppConfig(); - +void dispose() + [PreferenceAction]o-[PreferenceAction] + [Enum]<:--[PreferenceAction] + + [StudyLaunched ] - [AppRepository]o-[<abstract>StudyUApi] - [<abstract>IAppRepository]<:--[AppRepository] + [<abstract>ModelEvent]<:-[StudyLaunched] [WrappedModel | @@ -187,94 +203,107 @@ [<abstract>ModelRepository]o-[BehaviorSubject] [<abstract>IModelRepository]<:-[<abstract>ModelRepository] - [<abstract>StudyUApi + [<abstract>ModelEvent | - +dynamic saveStudy(); - +dynamic fetchStudy(); - +dynamic getUserStudies(); - +dynamic deleteStudy(); - +dynamic saveStudyInvite(); - +dynamic fetchStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic deleteParticipants(); - +dynamic fetchAppConfig() - ] - - [APIException + +modelId: String; + +model: T ] - [Exception]<:--[APIException] - - [StudyNotFoundException + [IsFetched ] - [APIException]<:-[StudyNotFoundException] + [<abstract>ModelEvent]<:-[IsFetched] - [MeasurementNotFoundException + [IsSaving ] - [APIException]<:-[MeasurementNotFoundException] + [<abstract>ModelEvent]<:-[IsSaving] - [QuestionNotFoundException + [IsSaved ] - [APIException]<:-[QuestionNotFoundException] + [<abstract>ModelEvent]<:-[IsSaved] - [ConsentItemNotFoundException + [IsDeleted ] - [APIException]<:-[ConsentItemNotFoundException] + [<abstract>ModelEvent]<:-[IsDeleted] - [InterventionNotFoundException + [<abstract>SupabaseClientDependant + | + +supabaseClient: SupabaseClient ] - [APIException]<:-[InterventionNotFoundException] + [<abstract>SupabaseClientDependant]o-[SupabaseClient] - [InterventionTaskNotFoundException + [SupabaseQueryError + | + +statusCode: String?; + +message: String; + +details: dynamic ] - [APIException]<:-[InterventionTaskNotFoundException] + [Exception]<:--[SupabaseQueryError] - [ReportNotFoundException + [<abstract>SupabaseQueryMixin + | + +dynamic deleteAll(); + +dynamic getAll(); + +dynamic getById(); + +dynamic getByColumn(); + +List<T> deserializeList(); + +T deserializeObject() ] - [APIException]<:-[ReportNotFoundException] - - [ReportSectionNotFoundException + [<abstract>IInviteCodeRepository + | + +dynamic isCodeAlreadyUsed() ] - [APIException]<:-[ReportSectionNotFoundException] + [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] - [StudyInviteNotFoundException + [InviteCodeRepository + | + +studyId: String; + +ref: ProviderRef<dynamic>; + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +studyRepository: IStudyRepository; + +study: Study + | + +String getKey(); + +dynamic isCodeAlreadyUsed(); + +List<ModelAction<dynamic>> availableActions(); + +dynamic emitUpdate() ] - [APIException]<:-[StudyInviteNotFoundException] + [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] - [StudyUApiClient + [InviteCodeRepositoryDelegate | - +supabaseClient: SupabaseClient; - <static>+studyColumns: List<String>; - <static>+studyWithParticipantActivityColumns: List<String>; - +testDelayMilliseconds: int + +study: Study; + +apiClient: StudyUApi; + +studyRepository: IStudyRepository | - +dynamic deleteParticipants(); - +dynamic getUserStudies(); - +dynamic fetchStudy(); - +dynamic deleteStudy(); - +dynamic saveStudy(); - +dynamic fetchStudyInvite(); - +dynamic saveStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic fetchAppConfig(); - -dynamic _awaitGuarded(); - -dynamic _apiException(); - -dynamic _testDelay() + +dynamic fetch(); + +dynamic fetchAll(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +StudyInvite createDuplicate(); + +StudyInvite createNewInstance() ] - [StudyUApiClient]o-[SupabaseClient] - [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] - [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] - [<abstract>StudyUApi]<:--[StudyUApiClient] + [InviteCodeRepositoryDelegate]o-[Study] + [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] + [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] + [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] [<abstract>IAuthRepository | @@ -326,328 +355,431 @@ [AuthRepository]o-[User] [<abstract>IAuthRepository]<:--[AuthRepository] - [<abstract>IInviteCodeRepository + [<abstract>StudyUApi | - +dynamic isCodeAlreadyUsed() + +dynamic saveStudy(); + +dynamic fetchStudy(); + +dynamic getUserStudies(); + +dynamic deleteStudy(); + +dynamic saveStudyInvite(); + +dynamic fetchStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic deleteParticipants(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser() ] - [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] + [APIException + ] - [InviteCodeRepository - | - +studyId: String; - +ref: ProviderRef<dynamic>; - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +studyRepository: IStudyRepository; - +study: Study - | - +String getKey(); - +dynamic isCodeAlreadyUsed(); - +List<ModelAction<dynamic>> availableActions(); - +dynamic emitUpdate() + [Exception]<:--[APIException] + + [StudyNotFoundException ] - [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] + [APIException]<:-[StudyNotFoundException] - [InviteCodeRepositoryDelegate - | - +study: Study; - +apiClient: StudyUApi; - +studyRepository: IStudyRepository - | - +dynamic fetch(); - +dynamic fetchAll(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +StudyInvite createDuplicate(); - +StudyInvite createNewInstance() + [MeasurementNotFoundException ] - [InviteCodeRepositoryDelegate]o-[Study] - [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] - [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] - [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] + [APIException]<:-[MeasurementNotFoundException] - [<abstract>SupabaseClientDependant - | - +supabaseClient: SupabaseClient + [QuestionNotFoundException ] - [<abstract>SupabaseClientDependant]o-[SupabaseClient] + [APIException]<:-[QuestionNotFoundException] - [SupabaseQueryError - | - +statusCode: String?; - +message: String; - +details: dynamic + [ConsentItemNotFoundException ] - [Exception]<:--[SupabaseQueryError] + [APIException]<:-[ConsentItemNotFoundException] - [<abstract>SupabaseQueryMixin - | - +dynamic deleteAll(); - +dynamic getAll(); - +dynamic getById(); - +dynamic getByColumn(); - +List<T> deserializeList(); - +T deserializeObject() + [InterventionNotFoundException ] - - + [APIException]<:-[InterventionNotFoundException] + + [InterventionTaskNotFoundException + ] + + [APIException]<:-[InterventionTaskNotFoundException] + + [ReportNotFoundException + ] + + [APIException]<:-[ReportNotFoundException] + + [ReportSectionNotFoundException + ] + + [APIException]<:-[ReportSectionNotFoundException] + + [StudyInviteNotFoundException + ] + + [APIException]<:-[StudyInviteNotFoundException] + + [UserNotFoundException + ] + + [APIException]<:-[UserNotFoundException] + + [StudyUApiClient + | + +supabaseClient: SupabaseClient; + <static>+studyColumns: List<String>; + <static>+studyWithParticipantActivityColumns: List<String>; + +testDelayMilliseconds: int + | + +dynamic deleteParticipants(); + +dynamic getUserStudies(); + +dynamic fetchStudy(); + +dynamic deleteStudy(); + +dynamic saveStudy(); + +dynamic fetchStudyInvite(); + +dynamic saveStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser(); + -dynamic _awaitGuarded(); + -dynamic _apiException(); + -dynamic _testDelay() + ] + + [StudyUApiClient]o-[SupabaseClient] + [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] + [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] + [<abstract>StudyUApi]<:--[StudyUApiClient] + + + - + - - + + + + + + + + - + + + + + + - - + - + - + - + - + - + - - + + - + - - + + - + - + - - - - - - - - - - - - - + + + + + - + - - + + + - - + - + - - + + + - - - + + + - - + - - + + - + + + + - + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - + - + - - + + - + - + + + + + + + + + + + + + + + - + - - - + + + + + + + + + - + - + - + - + - + - + - + - + - + + + - + - - - + + + + - - + - + - + - + - + + + - + - + - + - + + + - + - - - - + + + - - + - + - + - + - + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + - + - - - - + + + + + - - - StudyLaunched + + + IAppRepository + + + + + + +dynamic fetchAppConfig() + +void dispose() - - - - + + + + + - - - ModelEvent + + + AppRepository - - - +modelId: String - +model: T + + + +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() - - + + - + IStudyRepository - + +dynamic launch() +dynamic deleteParticipants() @@ -657,17 +789,17 @@ - - - + + + - + ModelRepository - + +delegate: IModelRepositoryDelegate<T> -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> @@ -678,7 +810,7 @@ - + +WrappedModel<T>? get() +dynamic fetchAll() @@ -706,25 +838,26 @@ - - - + + + - + StudyRepository - + +apiClient: StudyUApi +authRepository: IAuthRepository +ref: ProviderRef<dynamic> + +sortCallback: void Function()? - + +String getKey() +dynamic deleteParticipants() @@ -734,45 +867,19 @@ - - - - - - - - StudyUApi - - - - - - +dynamic saveStudy() - +dynamic fetchStudy() - +dynamic getUserStudies() - +dynamic deleteStudy() - +dynamic saveStudyInvite() - +dynamic fetchStudyInvite() - +dynamic deleteStudyInvite() - +dynamic deleteParticipants() - +dynamic fetchAppConfig() - - - - - - - + + + - + IAuthRepository - + +allowPasswordReset: bool +currentUser: User? @@ -781,7 +888,7 @@ - + +dynamic signUp() +dynamic signInWith() @@ -795,35 +902,46 @@ - + - + ProviderRef + + + + + + + void Function()? + + + + - - - + + + - + StudyRepositoryDelegate - + +apiClient: StudyUApi +authRepository: IAuthRepository - + +dynamic fetchAll() +dynamic fetch() @@ -838,16 +956,16 @@ - - + + - + IModelRepositoryDelegate - + +dynamic fetchAll() +dynamic fetch() @@ -860,108 +978,160 @@ - - - + + + + + - - - IsFetched + + + IUserRepository + + + + + + +user: StudyUUser + + + + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + - - - IsSaving + + + StudyUUser - - - + + + + + - - - IsSaved + + + UserRepository + + + + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: Ref<Object?> + +user: StudyUUser + + + + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + - - - IsDeleted + + + Ref - - - - + + + + - - - IAppRepository + + + PreferenceAction - - - +dynamic fetchAppConfig() - +void dispose() + + + +index: int + <static>+values: List<PreferenceAction> + <static>+pin: PreferenceAction + <static>+pinOff: PreferenceAction - - - - - + + + - - - AppRepository + + + Enum - - - +apiClient: StudyUApi + + + + + + + + StudyLaunched - - - +dynamic fetchAppConfig() - +void dispose() + + + + + + + + + ModelEvent + + + + + + +modelId: String + +model: T - - - + + + - + WrappedModel - + -_model: T +asyncValue: AsyncValue<T> @@ -975,7 +1145,7 @@ - + +dynamic markWithError() +dynamic markAsLoading() @@ -987,9 +1157,9 @@ - + - + AsyncValue @@ -998,9 +1168,9 @@ - + - + ModelRepositoryException @@ -1009,9 +1179,9 @@ - + - + Exception @@ -1020,9 +1190,9 @@ - + - + ModelNotFoundException @@ -1031,16 +1201,16 @@ - - + + - + IModelRepository - + +String getKey() +WrappedModel<T>? get() @@ -1062,9 +1232,9 @@ - + - + IModelActionProvider @@ -1073,221 +1243,231 @@ - + - + BehaviorSubject - - - + + + - - - APIException + + + IsFetched - - - + + + - - - StudyNotFoundException + + + IsSaving - - - + + + - - - MeasurementNotFoundException + + + IsSaved - - - + + + - - - QuestionNotFoundException + + + IsDeleted - - - + + + + - - - ConsentItemNotFoundException + + + SupabaseClientDependant - - - - - - - - InterventionNotFoundException + + + +supabaseClient: SupabaseClient - - - + + + - - - InterventionTaskNotFoundException + + + SupabaseClient - - - + + + + - - - ReportNotFoundException + + + SupabaseQueryError - - - - - - - - ReportSectionNotFoundException + + + +statusCode: String? + +message: String + +details: dynamic - - - + + + + - - - StudyInviteNotFoundException + + + SupabaseQueryMixin - - - - - - - - - - StudyUApiClient + + + +dynamic deleteAll() + +dynamic getAll() + +dynamic getById() + +dynamic getByColumn() + +List<T> deserializeList() + +T deserializeObject() - - - +supabaseClient: SupabaseClient - <static>+studyColumns: List<String> - <static>+studyWithParticipantActivityColumns: List<String> - +testDelayMilliseconds: int + + + + + + + + + IInviteCodeRepository - - - +dynamic deleteParticipants() - +dynamic getUserStudies() - +dynamic fetchStudy() - +dynamic deleteStudy() - +dynamic saveStudy() - +dynamic fetchStudyInvite() - +dynamic saveStudyInvite() - +dynamic deleteStudyInvite() - +dynamic fetchAppConfig() - -dynamic _awaitGuarded() - -dynamic _apiException() - -dynamic _testDelay() + + + +dynamic isCodeAlreadyUsed() - - - + + + + + - - - SupabaseClient + + + InviteCodeRepository - - - - - + + + +studyId: String + +ref: ProviderRef<dynamic> + +apiClient: StudyUApi + +authRepository: IAuthRepository + +studyRepository: IStudyRepository + +study: Study + + - - - SupabaseClientDependant + + + +String getKey() + +dynamic isCodeAlreadyUsed() + +List<ModelAction<dynamic>> availableActions() + +dynamic emitUpdate() - - - +supabaseClient: SupabaseClient + + + + + + + + Study - - - - + + + + + - - - SupabaseQueryMixin + + + InviteCodeRepositoryDelegate - - - +dynamic deleteAll() - +dynamic getAll() - +dynamic getById() - +dynamic getByColumn() - +List<T> deserializeList() - +T deserializeObject() + + + +study: Study + +apiClient: StudyUApi + +studyRepository: IStudyRepository + + + + + + +dynamic fetch() + +dynamic fetchAll() + +dynamic save() + +dynamic delete() + +dynamic onError() + +StudyInvite createDuplicate() + +StudyInvite createNewInstance() - + - + User @@ -1296,9 +1476,9 @@ - + - + Session @@ -1307,9 +1487,9 @@ - + - + IAppDelegate @@ -1318,17 +1498,17 @@ - - - + + + - + AuthRepository - + <static>+PERSIST_SESSION_KEY: String +supabaseClient: SupabaseClient @@ -1341,7 +1521,7 @@ - + -void _registerAuthListener() +dynamic signUp() @@ -1360,9 +1540,9 @@ - + - + SharedPreferences @@ -1371,126 +1551,173 @@ - + - + GoTrueClient - - - - + + + - - - IInviteCodeRepository + + + APIException - - - +dynamic isCodeAlreadyUsed() + + + + + + + + StudyNotFoundException - - - - - + + + - - - InviteCodeRepository + + + MeasurementNotFoundException - - - +studyId: String - +ref: ProviderRef<dynamic> - +apiClient: StudyUApi - +authRepository: IAuthRepository - +studyRepository: IStudyRepository - +study: Study + + + + + + + + QuestionNotFoundException - - - +String getKey() - +dynamic isCodeAlreadyUsed() - +List<ModelAction<dynamic>> availableActions() - +dynamic emitUpdate() + + + + + + + + ConsentItemNotFoundException - - - + + + - - - Study + + + InterventionNotFoundException - - - - - + + + - - - InviteCodeRepositoryDelegate + + + InterventionTaskNotFoundException - - - +study: Study - +apiClient: StudyUApi - +studyRepository: IStudyRepository + + + + + + + + ReportNotFoundException - - - +dynamic fetch() - +dynamic fetchAll() - +dynamic save() - +dynamic delete() - +dynamic onError() - +StudyInvite createDuplicate() - +StudyInvite createNewInstance() + + + + + + + + ReportSectionNotFoundException - - - - + + + - - - SupabaseQueryError + + + StudyInviteNotFoundException - - - +statusCode: String? - +message: String - +details: dynamic + + + + + + + + UserNotFoundException + + + + + + + + + + + + + StudyUApiClient + + + + + + +supabaseClient: SupabaseClient + <static>+studyColumns: List<String> + <static>+studyWithParticipantActivityColumns: List<String> + +testDelayMilliseconds: int + + + + + + +dynamic deleteParticipants() + +dynamic getUserStudies() + +dynamic fetchStudy() + +dynamic deleteStudy() + +dynamic saveStudy() + +dynamic fetchStudyInvite() + +dynamic saveStudyInvite() + +dynamic deleteStudyInvite() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() + -dynamic _awaitGuarded() + -dynamic _apiException() + -dynamic _testDelay() diff --git a/docs/uml/designer_v2/lib/uml.svg b/docs/uml/designer_v2/lib/uml.svg index 36b675306..331385868 100644 --- a/docs/uml/designer_v2/lib/uml.svg +++ b/docs/uml/designer_v2/lib/uml.svg @@ -1,2424 +1,2217 @@ - - [NotificationDispatcher + + [Assets | - +child: Widget?; - +snackbarInnerPadding: double; - +snackbarWidth: double?; - +snackbarBehavior: SnackBarBehavior; - +snackbarDefaultDuration: int - ] - - [NotificationDispatcher]o-[<abstract>Widget] - [NotificationDispatcher]o-[SnackBarBehavior] - - [<abstract>IClipboardService - | - +dynamic copy() + <static>+logoWide: String ] - [ClipboardService + [Config | - +dynamic copy() + <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>IClipboardService]<:--[ClipboardService] - - [<abstract>INotificationService + [<abstract>IAppRepository | - +void showMessage(); - +void show(); - +Stream<NotificationIntent> watchNotifications(); + +dynamic fetchAppConfig(); +void dispose() ] - [NotificationService + [AppRepository | - -_streamController: BehaviorSubject<NotificationIntent> + +apiClient: StudyUApi | - +Stream<NotificationIntent> watchNotifications(); - +void showMessage(); - +void show(); + +dynamic fetchAppConfig(); +void dispose() ] - [NotificationService]o-[BehaviorSubject] - [<abstract>INotificationService]<:--[NotificationService] + [AppRepository]o-[<abstract>StudyUApi] + [<abstract>IAppRepository]<:--[AppRepository] - [Notifications + [<abstract>IStudyRepository | - <static>+passwordReset: SnackbarIntent; - <static>+passwordResetSuccess: SnackbarIntent; - <static>+studyDeleted: SnackbarIntent; - <static>+inviteCodeDeleted: SnackbarIntent; - <static>+inviteCodeClipped: SnackbarIntent; - <static>+studyDeleteConfirmation: AlertIntent + +dynamic launch(); + +dynamic deleteParticipants() ] - [Notifications]o-[SnackbarIntent] - [Notifications]o-[AlertIntent] + [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] - [NotificationDefaultActions + [StudyRepository | - <static>+cancel: NotificationAction + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: ProviderRef<dynamic>; + +sortCallback: void Function()? + | + +String getKey(); + +dynamic deleteParticipants(); + +dynamic launch(); + +List<ModelAction<dynamic>> availableActions() ] - [NotificationDefaultActions]o-[NotificationAction] + [StudyRepository]o-[<abstract>StudyUApi] + [StudyRepository]o-[<abstract>IAuthRepository] + [StudyRepository]o-[<abstract>ProviderRef] + [StudyRepository]o-[void Function()?] + [<abstract>ModelRepository]<:-[StudyRepository] + [<abstract>IStudyRepository]<:--[StudyRepository] - [<abstract>NotificationIntent + [StudyRepositoryDelegate | - +message: String?; - +customContent: Widget?; - +icon: IconData?; - +actions: List<NotificationAction>?; - +type: NotificationType + +apiClient: StudyUApi; + +authRepository: IAuthRepository | - +void register() + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +Study createNewInstance(); + +Study createDuplicate() ] - [<abstract>NotificationIntent]o-[<abstract>Widget] - [<abstract>NotificationIntent]o-[IconData] - [<abstract>NotificationIntent]o-[NotificationType] + [StudyRepositoryDelegate]o-[<abstract>StudyUApi] + [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] + [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] - [NotificationAction + [<abstract>IUserRepository | - +label: String; - +onSelect: dynamic Function(); - +isDestructive: bool - ] - - [NotificationAction]o-[dynamic Function()] - - [SnackbarIntent + +user: StudyUUser | - +duration: int? + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [<abstract>NotificationIntent]<:-[SnackbarIntent] + [<abstract>IUserRepository]o-[StudyUUser] - [AlertIntent + [UserRepository | - +title: String; - +dismissOnAction: bool; - +isDestructive: dynamic + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: Ref<Object?>; + +user: StudyUUser + | + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [<abstract>NotificationIntent]<:-[AlertIntent] + [UserRepository]o-[<abstract>StudyUApi] + [UserRepository]o-[<abstract>IAuthRepository] + [UserRepository]o-[<abstract>Ref] + [UserRepository]o-[StudyUUser] + [<abstract>IUserRepository]<:--[UserRepository] - [NotificationType + [PreferenceAction | +index: int; - <static>+values: List<NotificationType>; - <static>+snackbar: NotificationType; - <static>+alert: NotificationType; - <static>+custom: NotificationType + <static>+values: List<PreferenceAction>; + <static>+pin: PreferenceAction; + <static>+pinOff: PreferenceAction ] - [NotificationType]o-[NotificationType] - [Enum]<:--[NotificationType] + [PreferenceAction]o-[PreferenceAction] + [Enum]<:--[PreferenceAction] - [DropdownMenuItemTheme - | - +iconTheme: IconThemeData? + [StudyLaunched ] - [DropdownMenuItemTheme]o-[IconThemeData] - [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] + [<abstract>ModelEvent]<:-[StudyLaunched] - [ThemeConfig - | - <static>+kMinContentWidth: double; - <static>+kMaxContentWidth: double; - <static>+kHoverFadeFactor: double; - <static>+kMuteFadeFactor: double + [WrappedModel | - <static>+dynamic bodyBackgroundColor(); - <static>+Color modalBarrierColor(); - <static>+Color containerColor(); - <static>+Color colorPickerInitialColor(); - <static>+TextStyle bodyTextMuted(); - <static>+TextStyle bodyTextBackground(); - <static>+double iconSplashRadius(); - <static>+Color sidesheetBackgroundColor(); - <static>+InputDecorationTheme dropdownInputDecorationTheme(); - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() - ] - - [NoAnimationPageTransitionsBuilder + -_model: T; + +asyncValue: AsyncValue<T>; + +isLocalOnly: bool; + +isDirty: bool; + +isDeleted: bool; + +lastSaved: DateTime?; + +lastFetched: DateTime?; + +lastUpdated: DateTime?; + +model: T | - +Widget buildTransitions() + +dynamic markWithError(); + +dynamic markAsLoading(); + +dynamic markAsFetched(); + +dynamic markAsSaved() ] - [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] + [WrappedModel]o-[<abstract>AsyncValue] - [WebTransitionBuilder - | - +Widget buildTransitions() + [ModelRepositoryException ] - [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] + [Exception]<:--[ModelRepositoryException] - [ThemeSettingChange - | - +settings: ThemeSettings + [ModelNotFoundException ] - [ThemeSettingChange]o-[ThemeSettings] - [<abstract>Notification]<:-[ThemeSettingChange] + [ModelRepositoryException]<:--[ModelNotFoundException] - [ThemeProvider - | - +settings: ValueNotifier<ThemeSettings>; - +lightDynamic: ColorScheme?; - +darkDynamic: ColorScheme?; - +pageTransitionsTheme: PageTransitionsTheme; - +shapeMedium: ShapeBorder + [<abstract>IModelRepository | - +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() + +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() ] - [ThemeProvider]o-[ValueNotifier] - [ThemeProvider]o-[ColorScheme] - [ThemeProvider]o-[PageTransitionsTheme] - [ThemeProvider]o-[<abstract>ShapeBorder] - [<abstract>InheritedWidget]<:-[ThemeProvider] + [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] - [ThemeSettings + [<abstract>IModelRepositoryDelegate | - +sourceColor: Color; - +themeMode: ThemeMode + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +T createNewInstance(); + +T createDuplicate(); + +dynamic onError() ] - [ThemeSettings]o-[Color] - [ThemeSettings]o-[ThemeMode] - - [CustomColor - | - +name: String; - +color: Color; - +blend: bool + [<abstract>ModelRepository | - +Color value() - ] - - [CustomColor]o-[Color] - - [LanguagePicker + +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>> | - +languagePickerType: LanguagePickerType; - +iconColor: Color?; - +offset: Offset? + +WrappedModel<T>? get(); + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic duplicateAndSave(); + +dynamic duplicateAndSaveFromRemote(); + +Stream<List<WrappedModel<T>>> watchAll(); + +Stream<WrappedModel<T>> watch(); + +Stream<ModelEvent<T>> watchAllChanges(); + +Stream<ModelEvent<T>> watchChanges(); + -dynamic _buildModelSpecificController(); + +dynamic ensurePersisted(); + +WrappedModel<T> upsertLocally(); + +List<WrappedModel<T>> upsertAllLocally(); + +dynamic emitUpdate(); + +dynamic emitModelEvent(); + +dynamic emitError(); + +void dispose(); + +List<ModelAction<dynamic>> availableActions() ] - [LanguagePicker]o-[LanguagePickerType] - [LanguagePicker]o-[Color] - [LanguagePicker]o-[Offset] + [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] + [<abstract>ModelRepository]o-[BehaviorSubject] + [<abstract>IModelRepository]<:-[<abstract>ModelRepository] - [LanguagePickerType + [<abstract>ModelEvent | - +index: int; - <static>+values: List<LanguagePickerType>; - <static>+field: LanguagePickerType; - <static>+icon: LanguagePickerType + +modelId: String; + +model: T ] - [LanguagePickerType]o-[LanguagePickerType] - [Enum]<:--[LanguagePickerType] - - [PlatformLocaleWeb - | - +Locale getPlatformLocale() + [IsFetched ] - [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] + [<abstract>ModelEvent]<:-[IsFetched] - [<abstract>PlatformLocale - | - +Locale getPlatformLocale() + [IsSaving ] - [PlatformLocaleMobile - | - +Locale getPlatformLocale() + [<abstract>ModelEvent]<:-[IsSaving] + + [IsSaved ] - [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] + [<abstract>ModelEvent]<:-[IsSaved] - [AppTranslation - | - <static>+dynamic init() + [IsDeleted ] - [CountWhereValidator - | - +predicate: bool Function(T?); - +minCount: int?; - +maxCount: int?; - <static>+kValidationMessageMinCount: String; - <static>+kValidationMessageMaxCount: String + [<abstract>ModelEvent]<:-[IsDeleted] + + [<abstract>SupabaseClientDependant | - +Map<String, dynamic>? validate() + +supabaseClient: SupabaseClient ] - [CountWhereValidator]o-[bool Function(T?)] - [<abstract>Validator]<:-[CountWhereValidator] + [<abstract>SupabaseClientDependant]o-[SupabaseClient] - [MustMatchValidator - | - +control: AbstractControl<dynamic>?; - +matchingControl: AbstractControl<dynamic>? + [SupabaseQueryError | - +Map<String, dynamic>? validate() + +statusCode: String?; + +message: String; + +details: dynamic ] - [MustMatchValidator]o-[<abstract>AbstractControl] - [<abstract>Validator]<:-[MustMatchValidator] + [Exception]<:--[SupabaseQueryError] - [FieldValidators + [<abstract>SupabaseQueryMixin | - <static>+String? emailValidator() + +dynamic deleteAll(); + +dynamic getAll(); + +dynamic getById(); + +dynamic getByColumn(); + +List<T> deserializeList(); + +T deserializeObject() ] - [Patterns + [<abstract>IInviteCodeRepository | - <static>+timeFormatString: String; - <static>+emailFormatString: String; - <static>+url: String + +dynamic isCodeAlreadyUsed() ] - [Time + [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] + + [InviteCodeRepository | - <static>+dynamic fromTimeOfDay(); - +Map<String, dynamic> toJson(); - <static>+Time fromJson() + +studyId: String; + +ref: ProviderRef<dynamic>; + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +studyRepository: IStudyRepository; + +study: Study + | + +String getKey(); + +dynamic isCodeAlreadyUsed(); + +List<ModelAction<dynamic>> availableActions(); + +dynamic emitUpdate() ] - [TimeOfDay]<:-[Time] + [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] - [TimeValueAccessor + [InviteCodeRepositoryDelegate | - +String modelToViewValue(); - +Time? viewToModelValue(); - -String _addLeadingZeroIfNeeded() + +study: Study; + +apiClient: StudyUApi; + +studyRepository: IStudyRepository + | + +dynamic fetch(); + +dynamic fetchAll(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +StudyInvite createDuplicate(); + +StudyInvite createNewInstance() ] - [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] + [InviteCodeRepositoryDelegate]o-[Study] + [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] + [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] + [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] - [CombinedStreamNotifier + [<abstract>IAuthRepository | - -_subscriptions: List<StreamSubscription<dynamic>> + +allowPasswordReset: bool; + +currentUser: User?; + +isLoggedIn: bool; + +session: Session? | + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); +void dispose() ] - [ChangeNotifier]<:-[CombinedStreamNotifier] + [<abstract>IAuthRepository]o-[User] + [<abstract>IAuthRepository]o-[Session] + [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] - [ModelAction + [AuthRepository | - +type: T; - +label: String; - +icon: IconData?; - +onExecute: Function; - +isAvailable: bool; - +isDestructive: bool + <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() ] - [ModelAction]o-[IconData] + [AuthRepository]o-[SupabaseClient] + [AuthRepository]o-[SharedPreferences] + [AuthRepository]o-[GoTrueClient] + [AuthRepository]o-[Session] + [AuthRepository]o-[User] + [<abstract>IAuthRepository]<:--[AuthRepository] - [<abstract>IModelActionProvider + [<abstract>StudyUApi | - +List<ModelAction<dynamic>> availableActions() + +dynamic saveStudy(); + +dynamic fetchStudy(); + +dynamic getUserStudies(); + +dynamic deleteStudy(); + +dynamic saveStudyInvite(); + +dynamic fetchStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic deleteParticipants(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser() ] - [<abstract>IListActionProvider - | - +void onSelectItem(); - +void onNewItem() + [APIException ] - [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] + [Exception]<:--[APIException] - [ModelActionType - | - +index: int; - <static>+values: List<ModelActionType>; - <static>+edit: ModelActionType; - <static>+delete: ModelActionType; - <static>+remove: ModelActionType; - <static>+duplicate: ModelActionType; - <static>+clipboard: ModelActionType; - <static>+primary: ModelActionType + [StudyNotFoundException ] - [ModelActionType]o-[ModelActionType] - [Enum]<:--[ModelActionType] + [APIException]<:-[StudyNotFoundException] - [StudyUException - | - +message: String - | - +String toString() + [MeasurementNotFoundException ] - [Exception]<:--[StudyUException] + [APIException]<:-[MeasurementNotFoundException] - [<abstract>ExecutionLimiter - | - +milliseconds: int; - <static>-_timer: Timer? - | - +void dispose() + [QuestionNotFoundException ] - [<abstract>ExecutionLimiter]o-[Timer] + [APIException]<:-[QuestionNotFoundException] - [Debouncer - | - +leading: bool; - +cancelUncompleted: bool; - -_uncompletedFutureOperation: CancelableOperation<dynamic>? - | - +dynamic call() + [ConsentItemNotFoundException ] - [Debouncer]o-[CancelableOperation] - [<abstract>ExecutionLimiter]<:-[Debouncer] + [APIException]<:-[ConsentItemNotFoundException] - [Throttler - | - +dynamic call() + [InterventionNotFoundException ] - [<abstract>ExecutionLimiter]<:-[Throttler] + [APIException]<:-[InterventionNotFoundException] - [<abstract>JsonFileLoader + [InterventionTaskNotFoundException + ] + + [APIException]<:-[InterventionTaskNotFoundException] + + [ReportNotFoundException + ] + + [APIException]<:-[ReportNotFoundException] + + [ReportSectionNotFoundException + ] + + [APIException]<:-[ReportSectionNotFoundException] + + [StudyInviteNotFoundException + ] + + [APIException]<:-[StudyInviteNotFoundException] + + [UserNotFoundException + ] + + [APIException]<:-[UserNotFoundException] + + [StudyUApiClient | - +jsonAssetsPath: String + +supabaseClient: SupabaseClient; + <static>+studyColumns: List<String>; + <static>+studyWithParticipantActivityColumns: List<String>; + +testDelayMilliseconds: int | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() + +dynamic deleteParticipants(); + +dynamic getUserStudies(); + +dynamic fetchStudy(); + +dynamic deleteStudy(); + +dynamic saveStudy(); + +dynamic fetchStudyInvite(); + +dynamic saveStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser(); + -dynamic _awaitGuarded(); + -dynamic _apiException(); + -dynamic _testDelay() ] - [<abstract>FileFormatEncoder + [StudyUApiClient]o-[SupabaseClient] + [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] + [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] + [<abstract>StudyUApi]<:--[StudyUApiClient] + + [AppTranslation | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() + <static>+dynamic init() ] - [CSVStringEncoder + [LanguagePicker | - +String encode() + +languagePickerType: LanguagePickerType; + +iconColor: Color?; + +offset: Offset? ] - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] + [LanguagePicker]o-[LanguagePickerType] + [LanguagePicker]o-[Color] + [LanguagePicker]o-[Offset] - [JsonStringEncoder + [LanguagePickerType | - +String encode() + +index: int; + <static>+values: List<LanguagePickerType>; + <static>+field: LanguagePickerType; + <static>+icon: LanguagePickerType ] - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] + [LanguagePickerType]o-[LanguagePickerType] + [Enum]<:--[LanguagePickerType] - [OptimisticUpdate - | - +applyOptimistic: void Function(); - +apply: dynamic Function(); - +rollback: void Function(); - +onUpdate: void Function()?; - +onError: void Function(Object, StackTrace?)?; - +rethrowErrors: bool; - +runOptimistically: bool; - +completeFutureOptimistically: bool + [<abstract>PlatformLocale | - +dynamic execute(); - -void _runUpdateHandlerIfAny() + +Locale getPlatformLocale() ] - [OptimisticUpdate]o-[void Function()] - [OptimisticUpdate]o-[dynamic Function()] - [OptimisticUpdate]o-[void Function()?] - [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - - [Tuple - | - +first: T1; - +second: T2; - +props: List<Object?> + [PlatformLocaleMobile | - +Map<String, dynamic> toJson(); - <static>+Tuple<dynamic, dynamic> fromJson(); - +Tuple<T1, T2> copy(); - +Tuple<T1, T2> copyWith() + +Locale getPlatformLocale() ] - [<abstract>Equatable]<:-[Tuple] + [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] - [SuppressedBehaviorSubject - | - +subject: BehaviorSubject<T>; - +didSuppressInitialEvent: bool; - -_controller: StreamController<T> + [PlatformLocaleWeb | - -StreamController<T> _buildDerivedController(); - +dynamic close() + +Locale getPlatformLocale() ] - [SuppressedBehaviorSubject]o-[BehaviorSubject] - [SuppressedBehaviorSubject]o-[StreamController] + [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - [NumericalRangeFormatter + [<abstract>GoRouteParamEnum | - +min: int?; - +max: int? + +String toRouteParam(); + +String toShortString() + ] + + [RouterKeys | - +TextEditingValue formatEditUpdate() + <static>+studyKey: ValueKey<String>; + <static>+authKey: ValueKey<String> ] - [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] + [RouterKeys]o-[ValueKey] - [StudySequenceFormatter + [RouteParams | - +TextEditingValue formatEditUpdate() + <static>+studiesFilter: String; + <static>+studyId: String; + <static>+measurementId: String; + <static>+interventionId: String; + <static>+testAppRoute: String ] - [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - - [SerializableColor + [RouterConf | - +Map<String, dynamic> toJson(); - <static>+SerializableColor fromJson() + <static>+router: GoRouter; + <static>+routes: List<GoRoute>; + <static>+publicRoutes: List<GoRoute>; + <static>+privateRoutes: List<GoRoute> + | + <static>+GoRoute route() ] - [Color]<:-[SerializableColor] + [RouterConf]o-[GoRouter] - [<abstract>IProviderArgsResolver + [<abstract>StudyFormRouteArgs | - +R provide() + +studyId: String ] - [Config + [<abstract>QuestionFormRouteArgs | - <static>+isDebugMode: bool; - <static>+defaultLocale: Set<String>; - <static>+supportedLocales: Map<String, String>; - <static>+newStudyId: String; - <static>+newModelId: String; - <static>+minSplashTime: int; - <static>+formAutosaveDebounce: int + +questionId: String ] - [<abstract>FormValidationSetEnum + [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] + + [ScreenerQuestionFormRouteArgs ] - [FormControlValidation + [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] + + [ConsentItemFormRouteArgs | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + +consentId: String + ] + + [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] + + [MeasurementFormRouteArgs | - +FormControlValidation merge() + +measurementId: String ] - [FormControlValidation]o-[<abstract>AbstractControl] + [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] - [<abstract>ManagedFormViewModel + [SurveyQuestionFormRouteArgs | - +ManagedFormViewModel<T> createDuplicate() + +questionId: String ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] + [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] - [FormViewModelNotFoundException + [InterventionFormRouteArgs + | + +interventionId: String ] - [Exception]<:--[FormViewModelNotFoundException] + [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] - [FormViewModelCollection + [InterventionTaskFormRouteArgs | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + +taskId: String + ] + + [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] + + [ReportItemFormRouteArgs | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() + +sectionId: String ] - [FormViewModelCollection]o-[FormArray] + [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - [FormArrayTable + [RoutingIntents | - +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() + <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) ] - [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] + [RoutingIntents]o-[RoutingIntent] + [RoutingIntents]o-[RoutingIntent Function(String)] + [RoutingIntents]o-[RoutingIntent Function(String, String)] + [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] + [RoutingIntents]o-[RoutingIntent Function(Exception)] - [<abstract>IFormData + [RoutingIntent | - +id: String + +route: GoRoute; + +params: Map<String, String>; + +queryParams: Map<String, String>; + +dispatch: RoutingIntentDispatch?; + +extra: Object?; + +routeName: String; + +arguments: Map<String, String>; + +props: List<Object?> | - +IFormData copy() + -dynamic _validateRoute(); + +bool matches() ] - [CustomFormControl - | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? + [RoutingIntent]o-[GoRoute] + [RoutingIntent]o-[RoutingIntentDispatch] + [<abstract>Equatable]<:-[RoutingIntent] + + [RoutingIntentDispatch | - +void dispose() + +index: int; + <static>+values: List<RoutingIntentDispatch>; + <static>+go: RoutingIntentDispatch; + <static>+push: RoutingIntentDispatch ] - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] + [RoutingIntentDispatch]o-[RoutingIntentDispatch] + [Enum]<:--[RoutingIntentDispatch] - [FormInvalidException + [StudyTemplates + | + <static>+kUnnamedStudyTitle: String + | + <static>+Study emptyDraft() ] - [Exception]<:--[FormInvalidException] - - [FormConfigException + [StudyActionType | - +message: String? + +index: int; + <static>+values: List<StudyActionType>; + <static>+pin: StudyActionType; + <static>+pinoff: StudyActionType; + <static>+edit: StudyActionType; + <static>+duplicate: StudyActionType; + <static>+duplicateDraft: StudyActionType; + <static>+addCollaborator: StudyActionType; + <static>+export: StudyActionType; + <static>+delete: StudyActionType ] - [Exception]<:--[FormConfigException] + [StudyActionType]o-[StudyActionType] + [Enum]<:--[StudyActionType] - [<abstract>IFormViewModelDelegate - | - +dynamic onSave(); - +void onCancel() + [<abstract>ResultTypes ] - [<abstract>IFormGroupController + [MeasurementResultTypes | - +form: FormGroup + <static>+questionnaire: String; + <static>+values: List<String> ] - [<abstract>IFormGroupController]o-[FormGroup] + [<abstract>ResultTypes]<:-[MeasurementResultTypes] - [FormControlOption + [InterventionResultTypes | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> + <static>+checkmarkTask: String; + <static>+values: List<String> ] - [<abstract>Equatable]<:-[FormControlOption] + [<abstract>ResultTypes]<:-[InterventionResultTypes] - [<abstract>FormViewModel - | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + [StudyExportData | - -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() + +study: Study; + +measurementsData: List<Map<String, dynamic>>; + +interventionsData: List<Map<String, dynamic>>; + +isEmpty: bool ] - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] + [StudyExportData]o-[Study] - [FormMode + [FormSideSheetTab | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode + +formViewBuilder: Widget Function(T) ] - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] - - [UnsavedChangesDialog - | - +Widget build() - ] + [FormSideSheetTab]o-[Widget Function(T)] + [NavbarTab]<:-[FormSideSheetTab] - [DrawerEntry - | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +title: String; - +helpText: String? + [SidesheetTab | - +void onClick() + +builder: Widget Function(BuildContext) ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [SidesheetTab]o-[Widget Function(BuildContext)] + [NavbarTab]<:-[SidesheetTab] - [GoRouterDrawerEntry - | - +intent: RoutingIntent + [Sidesheet | - +void onClick() + <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)? ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [DrawerEntry]<:-[GoRouterDrawerEntry] + [Sidesheet]o-[<abstract>Widget] + [Sidesheet]o-[EdgeInsets] + [Sidesheet]o-[Widget Function(Widget)?] - [AppDrawer + [MouseEventsRegion | - +title: String; - +width: int; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double + +onTap: void Function()?; + +onHover: void Function(PointerHoverEvent)?; + +onEnter: void Function(PointerEnterEvent)?; + +onExit: void Function(PointerExitEvent)?; + +autoselectCursor: bool; + +cursor: SystemMouseCursor; + <static>+defaultCursor: SystemMouseCursor; + +autoCursor: SystemMouseCursor ] - [AuthScaffold - | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + [MouseEventsRegion]o-[void Function()?] + [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] + [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] + [MouseEventsRegion]o-[void Function(PointerExitEvent)?] + [MouseEventsRegion]o-[SystemMouseCursor] + + [ReactiveCustomColorPicker ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [ReactiveFormField]<:-[ReactiveCustomColorPicker] - [PasswordRecoveryForm - | - +formKey: AuthFormKey + [SplashPage | +Widget build() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - - [LoginForm + [ErrorPage | - +formKey: AuthFormKey + +error: Exception? | +Widget build() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [<abstract>ConsumerWidget]<:-[ErrorPage] - [SignupForm + [AsyncValueWidget | - +formKey: AuthFormKey + +value: AsyncValue<T>; + +data: Widget Function(T); + +error: Widget Function(Object, StackTrace?)?; + +loading: Widget Function()?; + +empty: Widget Function()? | +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + -Widget _buildDataOrEmptyWidget(); + -Widget _defaultError(); + -Widget _defaultLoad() ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] + [AsyncValueWidget]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[Widget Function(T)] + [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] + [AsyncValueWidget]o-[Widget Function()?] - [PasswordForgotForm - | - +formKey: AuthFormKey + [Search | - +Widget build() + +onQueryChanged: dynamic Function(String); + +searchController: SearchController?; + +hintText: String?; + +initialText: String? ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [Search]o-[dynamic Function(String)] + [Search]o-[SearchController] - [StudyUJobsToBeDone + [SearchController | - +Widget build() + +setText: void Function(String) ] - [AuthFormController + [SearchController]o-[void Function(String)] + + [HtmlStylingBanner | - +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 + +isDismissed: bool; + +onDismissed: dynamic Function()? | - -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() + +Widget build() ] - [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] + [HtmlStylingBanner]o-[dynamic Function()?] - [AuthFormKey - | - +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey + [NullHelperDecoration ] - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] + [InputDecoration]<:-[NullHelperDecoration] - [EmailTextField + [<abstract>IWithBanner | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +Widget? banner() ] - [EmailTextField]o-[FormControl] - - [PasswordTextField + [BannerBox | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +prefixIcon: Widget?; + +body: Widget; + +style: BannerStyle; + +padding: EdgeInsets?; + +noPrefix: bool; + +dismissable: bool; + +isDismissed: bool?; + +onDismissed: dynamic Function()?; + +dismissIconSize: double ] - [PasswordTextField]o-[FormControl] + [BannerBox]o-[<abstract>Widget] + [BannerBox]o-[BannerStyle] + [BannerBox]o-[EdgeInsets] + [BannerBox]o-[dynamic Function()?] - [<abstract>IAppDelegate + [BannerStyle | - +dynamic onAppStart() + +index: int; + <static>+values: List<BannerStyle>; + <static>+warning: BannerStyle; + <static>+info: BannerStyle; + <static>+error: BannerStyle ] - [AppController + [BannerStyle]o-[BannerStyle] + [Enum]<:--[BannerStyle] + + [ConstrainedWidthFlexible | - +sharedPreferences: SharedPreferences; - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +minWidth: double; + +maxWidth: double; + +flex: int; + +flexSum: int; + +child: Widget; + +outerConstraints: BoxConstraints | - +dynamic onAppStart(); - -dynamic _callDelegates() + +Widget build(); + -double _getWidth() ] - [AppController]o-[SharedPreferences] + [ConstrainedWidthFlexible]o-[<abstract>Widget] + [ConstrainedWidthFlexible]o-[BoxConstraints] - [InviteCodeFormView + [ActionPopUpMenuButton | - +formViewModel: InviteCodeFormViewModel + +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(); - -List<FormTableRow> _conditionalInterventionRows() + -Widget _buildPopupMenu() ] - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + [ActionPopUpMenuButton]o-[Color] + [ActionPopUpMenuButton]o-[Axis] + [ActionPopUpMenuButton]o-[PopupMenuPosition] - [StudyRecruitScreen + [FormControlLabel | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() + +formControl: AbstractControl<dynamic>; + +text: String; + +isClickable: bool; + +textStyle: TextStyle?; + +onClick: void Function(AbstractControl<dynamic>)? + | + +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + [FormControlLabel]o-[<abstract>AbstractControl] + [FormControlLabel]o-[TextStyle] + [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - [StudyRecruitController + [EmptyBody | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + +icon: IconData?; + +leading: Widget?; + +leadingSpacing: double?; + +title: String?; + +description: String?; + +button: Widget? | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() + +Widget build() ] - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] - - [InviteCodeFormViewModel - | - +study: Study; - +inviteCodeRepository: IInviteCodeRepository; - +codeControl: FormControl<String>; - +codeControlValidationMessages: Map<String, String Function(dynamic)>; - +isPreconfiguredScheduleControl: FormControl<bool>; - +preconfiguredScheduleTypeControl: FormControl<PhaseSequence>; - +interventionAControl: FormControl<String>; - +interventionBControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +interventionControlOptions: List<FormControlOption<String>>; - +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; - +isPreconfiguredSchedule: bool; - +preconfiguredSchedule: List<String>? + [EmptyBody]o-[IconData] + [EmptyBody]o-[<abstract>Widget] + + [ActionMenuType | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() + +index: int; + <static>+values: List<ActionMenuType>; + <static>+inline: ActionMenuType; + <static>+popup: ActionMenuType ] - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + [ActionMenuType]o-[ActionMenuType] + [Enum]<:--[ActionMenuType] - [EnrolledBadge + [HelpIcon | - +enrolledCount: int + +tooltipText: String? | +Widget build() ] - [StudyInvitesTable + [StudyULogo | - +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) + +onTap: void Function()? | - +Widget build(); - -List<Widget> _buildRow() + +Widget build() ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] + [StudyULogo]o-[void Function()?] - [StudyFormViewModel + [SingleColumnLayout | - +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> + <static>+defaultConstraints: BoxConstraints; + <static>+defaultConstraintsNarrow: BoxConstraints; + +body: Widget; + +header: Widget?; + +stickyHeader: bool; + +constraints: BoxConstraints?; + +scroll: bool; + +padding: EdgeInsets? | - +void read(); - +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() + <static>+dynamic fromType() ] - [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] + [SingleColumnLayout]o-[BoxConstraints] + [SingleColumnLayout]o-[<abstract>Widget] + [SingleColumnLayout]o-[EdgeInsets] - [ConsentItemFormView + [SingleColumnLayoutType | - +formViewModel: ConsentItemFormViewModel + +index: int; + <static>+values: List<SingleColumnLayoutType>; + <static>+boundedWide: SingleColumnLayoutType; + <static>+boundedNarrow: SingleColumnLayoutType; + <static>+stretched: SingleColumnLayoutType; + <static>+split: SingleColumnLayoutType ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [SingleColumnLayoutType]o-[SingleColumnLayoutType] + [Enum]<:--[SingleColumnLayoutType] - [EnrollmentFormData - | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + [<abstract>ISyncIndicatorViewModel | - +Study apply(); - +EnrollmentFormData copy() + +isDirty: bool; + +lastSynced: DateTime? ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] - - [StudyDesignEnrollmentFormView + [SyncIndicator | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +state: AsyncValue<T>; + +lastSynced: DateTime?; + +isDirty: bool; + +animationDuration: int; + +iconSize: double ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [SyncIndicator]o-[<abstract>AsyncValue] - [ConsentItemFormViewModel + [TextParagraph | - +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> + +text: String?; + +style: TextStyle?; + +selectable: bool; + +span: List<TextSpan>? | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +Widget build() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [TextParagraph]o-[TextStyle] - [<abstract>IScreenerQuestionLogicFormViewModel + [DismissButton | - +isDirtyOptionsBannerVisible: bool + +onPressed: void Function()?; + +text: String? + | + +Widget build() ] - [ScreenerQuestionLogicFormView + [DismissButton]o-[void Function()?] + + [Badge | - +formViewModel: ScreenerQuestionFormViewModel + +icon: IconData?; + +color: Color?; + +borderRadius: double; + +label: String; + +type: BadgeType; + +padding: EdgeInsets; + +iconSize: double?; + +labelStyle: TextStyle? | +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + -Color? _getBackgroundColor(); + -Color _getBorderColor(); + -Color? _getLabelColor() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [Badge]o-[IconData] + [Badge]o-[Color] + [Badge]o-[BadgeType] + [Badge]o-[EdgeInsets] + [Badge]o-[TextStyle] - [ScreenerQuestionFormViewModel + [BadgeType | - <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 + +index: int; + <static>+values: List<BadgeType>; + <static>+filled: BadgeType; + <static>+outlined: BadgeType; + <static>+outlineFill: BadgeType; + <static>+plain: BadgeType + ] + + [BadgeType]o-[BadgeType] + [Enum]<:--[BadgeType] + + [Hyperlink | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +text: String; + +url: String?; + +onClick: void Function()?; + +linkColor: Color; + +hoverColor: Color?; + +visitedColor: Color?; + +style: TextStyle?; + +hoverStyle: TextStyle?; + +visitedStyle: TextStyle?; + +icon: IconData?; + +iconSize: double? ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [Hyperlink]o-[void Function()?] + [Hyperlink]o-[Color] + [Hyperlink]o-[TextStyle] + [Hyperlink]o-[IconData] - [EnrollmentFormViewModel + [FormScaffold | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> - | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + +formViewModel: T; + +actions: List<Widget>?; + +body: Widget; + +drawer: Widget?; + +actionsSpacing: double; + +actionsPadding: double ] - [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] + [FormScaffold]o-[<abstract>Widget] - [EnrollmentFormConsentItemDelegate - | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + [PrimaryButton | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +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 ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [PrimaryButton]o-[IconData] + [PrimaryButton]o-[void Function()?] + [PrimaryButton]o-[dynamic Function()?] + [PrimaryButton]o-[EdgeInsets] + [PrimaryButton]o-[Size] - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String + [UnderConstruction | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +Widget build() ] - [<abstract>IFormData]<:-[ConsentItemFormData] - - [InterventionsFormData + [ActionMenuInline | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String + +actions: List<ModelAction<dynamic>>; + +iconSize: double?; + +visible: bool; + +splashRadius: double?; + +paddingVertical: double?; + +paddingHorizontal: double? | - +Study apply(); - +InterventionsFormData copy() + +Widget build() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionTaskFormViewModel + [IconPack | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> + <static>+defaultPack: List<IconOption>; + <static>+material: List<IconOption> | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + <static>+IconOption? resolveIconByName() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - - [InterventionTaskFormView + [IconOption | - +formViewModel: InterventionTaskFormViewModel + +name: String; + +icon: IconData?; + +isEmpty: bool; + +props: List<Object?> + | + +String toJson(); + <static>+IconOption fromJson() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [IconOption]o-[IconData] + [<abstract>Equatable]<:-[IconOption] - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + [ReactiveIconPicker ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [ReactiveFocusableFormField]<:-[ReactiveIconPicker] - [InterventionFormView + [IconPicker | - +formViewModel: InterventionFormViewModel + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +onSelect: void Function(IconOption)?; + +galleryIconSize: double?; + +selectedIconSize: double?; + +focusNode: FocusNode?; + +isDisabled: bool + | + +Widget build() ] - [InterventionFormView]o-[InterventionFormViewModel] + [IconPicker]o-[IconOption] + [IconPicker]o-[void Function(IconOption)?] + [IconPicker]o-[FocusNode] - [InterventionsFormViewModel + [IconPickerField | - +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 + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +selectedIconSize: double?; + +galleryIconSize: double?; + +onSelect: void Function(IconOption)?; + +focusNode: FocusNode?; + +isDisabled: 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() + +Widget build() ] - [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] + [IconPickerField]o-[IconOption] + [IconPickerField]o-[void Function(IconOption)?] + [IconPickerField]o-[FocusNode] - [InterventionFormData + [IconPickerGallery | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + +iconOptions: List<IconOption>; + +onSelect: void Function(IconOption)?; + +iconSize: double | - +Intervention toIntervention(); - +InterventionFormData copy() + +Widget build() ] - [<abstract>IFormData]<:-[InterventionFormData] + [IconPickerGallery]o-[void Function(IconOption)?] - [StudyScheduleFormView - | - +formViewModel: StudyScheduleControls + [<abstract>FormConsumerWidget | - -FormTableRow _renderCustomSequence(); +Widget build() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [<abstract>FormConsumerRefWidget + | + +Widget build() + ] - [InterventionFormViewModel + [Collapsible | - +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() + +contentBuilder: Widget Function(BuildContext, bool); + +headerBuilder: Widget Function(BuildContext, bool)?; + +title: String?; + +isCollapsed: bool ] - [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] + [Collapsible]o-[Widget Function(BuildContext, bool)] + [Collapsible]o-[Widget Function(BuildContext, bool)?] - [<abstract>StudyScheduleControls + [StandardDialog | - <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 + +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 | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +Widget build() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [StandardDialog]o-[<abstract>Widget] + [StandardDialog]o-[Color] + [StandardDialog]o-[EdgeInsets] - [StudyDesignInterventionsFormView + [SecondaryButton + | + +text: String; + +icon: IconData?; + +isLoading: bool; + +onPressed: void Function()? | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [SecondaryButton]o-[IconData] + [SecondaryButton]o-[void Function()?] - [InterventionTaskFormData - | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String + [StandardTableColumn | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +label: String; + +tooltip: String?; + +columnWidth: TableColumnWidth; + +sortable: bool; + +sortAscending: bool?; + +sortableIcon: Widget? ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + [StandardTableColumn]o-[<abstract>TableColumnWidth] + [StandardTableColumn]o-[<abstract>Widget] - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs + [StandardTable | - +Widget build() + +items: List<T>; + +inputColumns: List<StandardTableColumn>; + +onSelectItem: void Function(T); + +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; + +trailingActionsMenuType: ActionMenuType?; + +sortColumnPredicates: List<int Function(T, T)?>?; + +pinnedPredicates: int Function(T, T)?; + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +inputTrailingActionsColumn: StandardTableColumn; + +tableWrapper: Widget Function(Widget)?; + +cellSpacing: double; + +rowSpacing: double; + +minRowHeight: double?; + +showTableHeader: bool; + +hideLeadingTrailingWhenEmpty: bool; + +leadingWidget: Widget?; + +trailingWidget: Widget?; + +leadingWidgetSpacing: double?; + +trailingWidgetSpacing: double?; + +emptyWidget: Widget?; + +rowStyle: StandardTableStyle; + +disableRowInteractions: bool ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [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] - [StudyFormValidationSet + [StandardTableStyle | +index: int; - <static>+values: List<StudyFormValidationSet> + <static>+values: List<StandardTableStyle>; + <static>+plain: StandardTableStyle; + <static>+material: StandardTableStyle ] - [Enum]<:--[StudyFormValidationSet] + [StandardTableStyle]o-[StandardTableStyle] + [Enum]<:--[StandardTableStyle] - [StudyInfoFormData + [TwoColumnLayout | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String + <static>+defaultDivider: VerticalDivider; + <static>+defaultContentPadding: EdgeInsets; + <static>+slimContentPadding: EdgeInsets; + +leftWidget: Widget; + +rightWidget: Widget; + +dividerWidget: Widget?; + +headerWidget: Widget?; + +flexLeft: int?; + +flexRight: int?; + +constraintsLeft: BoxConstraints?; + +constraintsRight: BoxConstraints?; + +scrollLeft: bool; + +scrollRight: bool; + +paddingLeft: EdgeInsets?; + +paddingRight: EdgeInsets?; + +backgroundColorLeft: Color?; + +backgroundColorRight: Color?; + +stretchHeight: bool + ] + + [TwoColumnLayout]o-[VerticalDivider] + [TwoColumnLayout]o-[EdgeInsets] + [TwoColumnLayout]o-[<abstract>Widget] + [TwoColumnLayout]o-[BoxConstraints] + [TwoColumnLayout]o-[Color] + + [NavbarTab | - +Study apply(); - +StudyInfoFormData copy() + +title: String; + +intent: RoutingIntent?; + +index: int; + +enabled: bool ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [NavbarTab]o-[RoutingIntent] - [StudyContactInfoFormData + [TabbedNavbar | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: 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? + ] + + [TabbedNavbar]o-[BoxDecoration] + [TabbedNavbar]o-[Color] + [TabbedNavbar]o-[void Function(int, T)?] + [TabbedNavbar]o-[EdgeInsets] + [TabbedNavbar]o-[TabBarIndicatorSize] + + [FormTableRow | - +Study apply(); - +StudyInfoFormData copy() + +label: String?; + +labelBuilder: Widget Function(BuildContext)?; + +labelStyle: TextStyle?; + +labelHelpText: String?; + +input: Widget; + +control: AbstractControl<dynamic>?; + +layout: FormTableRowLayout? ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [FormTableRow]o-[Widget Function(BuildContext)?] + [FormTableRow]o-[TextStyle] + [FormTableRow]o-[<abstract>Widget] + [FormTableRow]o-[<abstract>AbstractControl] + [FormTableRow]o-[FormTableRowLayout] - [StudyDesignInfoFormView + [FormTableLayout + | + +rows: List<FormTableRow>; + +columnWidths: Map<int, TableColumnWidth>; + +rowDivider: Widget?; + +rowLayout: FormTableRowLayout?; + +rowLabelStyle: TextStyle? | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [FormTableLayout]o-[<abstract>Widget] + [FormTableLayout]o-[FormTableRowLayout] + [FormTableLayout]o-[TextStyle] - [StudyInfoFormViewModel + [FormSectionHeader | - +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 + +title: String; + +titleTextStyle: TextStyle?; + +helpText: String?; + +divider: bool; + +helpTextDisabled: bool | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() + +Widget build() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [FormSectionHeader]o-[TextStyle] - [MeasurementsFormViewModel + [FormLabel | - +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> + +labelText: String?; + +helpText: String?; + +labelTextStyle: TextStyle?; + +layout: FormTableRowLayout? | - +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() ] - [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] + [FormLabel]o-[TextStyle] + [FormLabel]o-[FormTableRowLayout] - [StudyDesignMeasurementsFormView + [FormTableRowLayout | - +Widget build() + +index: int; + <static>+values: List<FormTableRowLayout>; + <static>+vertical: FormTableRowLayout; + <static>+horizontal: FormTableRowLayout ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [FormTableRowLayout]o-[FormTableRowLayout] + [Enum]<:--[FormTableRowLayout] - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs + [NotificationDispatcher | - +Widget build() + +child: Widget?; + +snackbarInnerPadding: double; + +snackbarWidth: double?; + +snackbarBehavior: SnackBarBehavior; + +snackbarDefaultDuration: int ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [NotificationDispatcher]o-[<abstract>Widget] + [NotificationDispatcher]o-[SnackBarBehavior] - [MeasurementSurveyFormView + [<abstract>INotificationService | - +formViewModel: MeasurementSurveyFormViewModel + +void showMessage(); + +void show(); + +Stream<NotificationIntent> watchNotifications(); + +void dispose() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - - [MeasurementSurveyFormViewModel + [NotificationService | - +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> + -_streamController: BehaviorSubject<NotificationIntent> | - +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() + +Stream<NotificationIntent> watchNotifications(); + +void showMessage(); + +void show(); + +void dispose() ] - [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] + [NotificationService]o-[BehaviorSubject] + [<abstract>INotificationService]<:--[NotificationService] - [MeasurementSurveyFormData + [<abstract>NotificationIntent | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String + +message: String?; + +customContent: Widget?; + +icon: IconData?; + +actions: List<NotificationAction>?; + +type: NotificationType | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +void register() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [<abstract>NotificationIntent]o-[<abstract>Widget] + [<abstract>NotificationIntent]o-[IconData] + [<abstract>NotificationIntent]o-[NotificationType] - [MeasurementsFormData - | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + [NotificationAction | - +Study apply(); - +MeasurementsFormData copy() + +label: String; + +onSelect: dynamic Function(); + +isDestructive: bool ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [NotificationAction]o-[dynamic Function()] - [<abstract>IStudyFormData + [SnackbarIntent | - +Study apply() + +duration: int? ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [<abstract>NotificationIntent]<:-[SnackbarIntent] - [<abstract>StudyDesignPageWidget + [AlertIntent | - +Widget? banner() + +title: String; + +dismissOnAction: bool; + +isDestructive: dynamic ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [<abstract>NotificationIntent]<:-[AlertIntent] - [StudyFormScaffold - | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + [NotificationType | - +Widget build() + +index: int; + <static>+values: List<NotificationType>; + <static>+snackbar: NotificationType; + <static>+alert: NotificationType; + <static>+custom: NotificationType ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [NotificationType]o-[NotificationType] + [Enum]<:--[NotificationType] - [<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>? + [<abstract>IClipboardService | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + +dynamic copy() ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + [ClipboardService | - +Schedule toSchedule() + +dynamic copy() ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [<abstract>IClipboardService]<:--[ClipboardService] - [ScheduleControls - | - +formViewModel: WithScheduleControls + [Notifications | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + <static>+passwordReset: SnackbarIntent; + <static>+passwordResetSuccess: SnackbarIntent; + <static>+studyDeleted: SnackbarIntent; + <static>+inviteCodeDeleted: SnackbarIntent; + <static>+inviteCodeClipped: SnackbarIntent; + <static>+studyDeleteConfirmation: AlertIntent ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [Notifications]o-[SnackbarIntent] + [Notifications]o-[AlertIntent] - [QuestionFormViewModel - | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - -_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 + [NotificationDefaultActions | - +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() + <static>+cancel: NotificationAction ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [NotificationDefaultActions]o-[NotificationAction] - [<abstract>QuestionFormData + [DrawerEntry | - <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 + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +title: String; + +helpText: String? | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +void onClick() ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - [ChoiceQuestionFormData + [GoRouterDrawerEntry | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + +intent: RoutingIntent | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +void onClick() ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [GoRouterDrawerEntry]o-[RoutingIntent] + [DrawerEntry]<:-[GoRouterDrawerEntry] - [BoolQuestionFormData - | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + [AppDrawer | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +title: String; + +width: int; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - - [ScaleQuestionFormData + [DashboardController | - +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> + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + -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() ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [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 + [StudiesTable | - +isMidValuesClearedInfoVisible: bool + +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 + [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)] + + [DashboardScaffold | - +formViewModel: QuestionFormViewModel + +body: Widget + | + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [DashboardScaffold]o-[<abstract>Widget] - [SurveyQuestionType + [StudiesFilter | +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType + <static>+values: List<StudiesFilter> ] - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + [Enum]<:--[StudiesFilter] - [BoolQuestionFormView + [DashboardScreen | - +formViewModel: QuestionFormViewModel + +filter: StudiesFilter? + ] + + [DashboardScreen]o-[StudiesFilter] + + [StudyMonitorScreen | +Widget build() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - [ChoiceQuestionFormView + [CustomFormControl | - +formViewModel: QuestionFormViewModel + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? | - +Widget build() + +void dispose() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] - [SurveyQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + [FormInvalidException ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [Exception]<:--[FormInvalidException] - [QuestionnaireFormData + [FormConfigException | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +message: String? ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [Exception]<:--[FormConfigException] - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + [<abstract>IFormViewModelDelegate | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +void onCancel() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IFormGroupController + | + +form: FormGroup + ] - [StudyDesignReportsFormView + [<abstract>IFormGroupController]o-[FormGroup] + + [FormControlOption | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +value: T; + +label: String; + +description: String?; + +props: List<Object?> ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [<abstract>Equatable]<:-[FormControlOption] - [ReportsFormViewModel + [<abstract>FormViewModel | - +study: Study; - +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_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>; - +canTestConsent: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> | - +void setControlsFrom(); - +ReportsFormData buildFormData(); + -dynamic _setFormData(); + -dynamic _rememberDefaultControlValidators(); + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); + -dynamic _disableAllControls(); + -dynamic _formModeUpdated(); + -dynamic _restoreControlsFromFormData(); + +void revalidate(); + -void _applyValidationSet(); +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() + +dynamic save(); + +dynamic cancel(); + +void enableAutosave(); + +void listenToImmediateFormChildren(); + +dynamic markFormGroupChanged(); + +void dispose(); + +void setControlsFrom(); + +T buildFormData(); + +void initControls() ] - [ReportsFormViewModel]o-[Study] - [ReportsFormViewModel]o-[GoRouter] - [ReportsFormViewModel]o-[ReportFormItemDelegate] - [ReportsFormViewModel]o-[FormArray] - [ReportsFormViewModel]o-[FormViewModelCollection] - [ReportsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] + [<abstract>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] - [ReportFormItemDelegate - | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + [FormMode | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +index: int; + <static>+values: List<FormMode>; + <static>+create: FormMode; + <static>+readonly: FormMode; + <static>+edit: FormMode ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [FormMode]o-[FormMode] + [Enum]<:--[FormMode] - [ReportItemFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + [<abstract>ManagedFormViewModel | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +ManagedFormViewModel<T> createDuplicate() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int - | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + [FormViewModelNotFoundException ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [Exception]<:--[FormViewModelNotFoundException] - [ImprovementDirectionFormatted + [FormViewModelCollection | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + +formViewModels: List<T>; + +formArray: FormArray<dynamic>; + +stagedViewModels: List<T>; + +retrievableViewModels: List<T>; + +formData: List<D> | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +void add(); + +T remove(); + +T? findWhere(); + +T? removeWhere(); + +bool contains(); + +void stage(); + +T commit(); + +void reset(); + +void read() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [FormViewModelCollection]o-[FormArray] - [ReportSectionType + [UnsavedChangesDialog | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +Widget build() ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] - - [DataReferenceIdentifier + [<abstract>IFormData | - +hashCode: int + +id: String | - +bool ==() + +IFormData copy() ] - [DataReference]<:-[DataReferenceIdentifier] - - [DataReferenceEditor + [FormArrayTable | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +Widget build(); + -List<Widget> _buildRow(); + -Widget _newItemButton() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [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] - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() + [<abstract>FormValidationSetEnum ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [ReportItemFormData + [FormControlValidation | - +isPrimary: bool; - +section: ReportSection; - +id: String + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +FormControlValidation merge() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [FormControlValidation]o-[<abstract>AbstractControl] - [ReportItemFormViewModel + [InviteCodeFormViewModel | - <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>>; + +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; - +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 + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String + [EnrolledBadge | - +Study apply(); - +ReportsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[ReportsFormData] - - [ReportStatus + +enrolledCount: int | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +Widget build() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] - - [ReportBadge + [InviteCodeFormView | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +formViewModel: InviteCodeFormViewModel | - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - [AppStatus + [StudyRecruitScreen | - +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - [PublishDialog + [StudyRecruitController | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishDialog] - - [PublishConfirmationDialog + +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() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [PublishSuccessDialog + [StudyInvitesTable | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - - [StudyAnalyzeScreen + +invites: List<StudyInvite>; + +onSelect: void Function(StudyInvite); + +getActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); + +getIntervention: Intervention? Function(String); + +getParticipantCountForInvite: int Function(StudyInvite) | - +Widget? banner(); - +Widget build() + +Widget build(); + -List<Widget> _buildRow() ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] - [StudyAnalyzeController + [AuthScaffold | - +dynamic onExport() + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets ] - [StudyBaseController]<:-[StudyAnalyzeController] + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] - [StudyBaseController + [SignupForm | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + +formKey: AuthFormKey | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] - [StudyParticipationBadge + [PasswordRecoveryForm | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool + +formKey: AuthFormKey | +Widget build() ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [RouteInformation + [PasswordForgotForm | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? + +formKey: AuthFormKey | - +String toString() + +Widget build() ] - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + + [AuthFormController | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + +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() ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [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] - [WebController + [AuthFormKey | - +iFrameElement: IFrameElement + +index: int; + <static>+values: List<AuthFormKey>; + <static>+login: AuthFormKey; + <static>+signup: AuthFormKey; + <static>+passwordForgot: AuthFormKey; + <static>+passwordRecovery: AuthFormKey; + <static>-_loginSubmit: AuthFormKey; + <static>-_signupSubmit: AuthFormKey + ] + + [AuthFormKey]o-[AuthFormKey] + [Enum]<:--[AuthFormKey] + + [EmailTextField | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] + [EmailTextField]o-[FormControl] - [MobileController + [PasswordTextField | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [<abstract>PlatformController]<:-[MobileController] + [PasswordTextField]o-[FormControl] + + [StudyUJobsToBeDone + | + +Widget build() + ] + + [LoginForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] + + [StudyAnalyzeController + | + +dynamic onExport() + ] + + [StudyBaseController]<:-[StudyAnalyzeController] + + [StudyAnalyzeScreen + | + +Widget? banner(); + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + + [PublishDialog + | + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[PublishDialog] + + [PublishSuccessDialog + | + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + + [PublishConfirmationDialog + | + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + + [App + ] + + [AppContent + ] [<abstract>IStudyAppBarViewModel | @@ -2452,25 +2245,36 @@ [StudyScaffold]o-[<abstract>Widget] [StudyScaffold]o-[SingleColumnLayoutType] - [StudyController + [PreviewFrame | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? + ] + + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + + [StudyParticipationBadge | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool + | + +Widget build() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] + + [<abstract>StudyPageWidget + | + +studyId: String + | + +Widget? banner() + ] + + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] [<abstract>IStudyStatusBadgeViewModel | @@ -2496,25 +2300,31 @@ [StudyStatusBadge]o-[StudyStatus] [StudyStatusBadge]o-[BadgeType] - [StudyTestController + [FrameControlsWidget | - +authRepository: IAuthRepository; - +languageCode: String + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool + | + +Widget build() ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [TestAppRoutes + [StudyTestScreen | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String + +previewRoute: String? + | + +Widget build(); + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [<abstract>IStudyNavViewModel | +isEditTabEnabled: bool; @@ -2545,80 +2355,115 @@ <static>+dynamic reports() ] - [StudySettingsDialog + [RouteInformation | - +Widget build() + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? + | + +String toString() ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - - [StudySettingsFormViewModel + [<abstract>PlatformController | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [<abstract>StudyPageWidget + [WebController | - +studyId: String + +iFrameElement: IFrameElement | - +Widget? banner() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [StudyTestScreen + [MobileController | - +previewRoute: String? + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() + ] + + [<abstract>PlatformController]<:-[MobileController] + + [StudySettingsFormViewModel | - +Widget build(); - +Widget? banner(); - +dynamic load(); + +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 showHelp() + +dynamic setLaunchDefaults() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + [StudySettingsDialog | +Widget build() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [PreviewFrame + [StudyBaseController | +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? + | + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] [WebFrame | @@ -2661,9141 +2506,9292 @@ +Widget build() ] - [StudiesFilter + [StudyTestController | - +index: int; - <static>+values: List<StudiesFilter> + +authRepository: IAuthRepository; + +languageCode: String ] - [Enum]<:--[StudiesFilter] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [DashboardScaffold + [StudyController | - +body: Widget + +notificationService: INotificationService; + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; + +studyActions: List<ModelAction<dynamic>> | - +Widget build() + +dynamic syncStudyStatus(); + +dynamic onStudySubscriptionUpdate(); + -dynamic _redirectNewToActualStudyID(); + +dynamic publishStudy(); + +void onChangeStudyParticipation(); + +void onAddParticipants(); + +void onSettingsPressed(); + +void dispose() ] - [DashboardScaffold]o-[<abstract>Widget] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [StudiesTable - | - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget + [TestAppRoutes | - +Widget build(); - -List<Widget> _buildRow() + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - - [DashboardScreen + [StudyDesignInfoFormView | - +filter: StudiesFilter? + +Widget build() ] - [DashboardScreen]o-[StudiesFilter] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [DashboardController + [StudyInfoFormViewModel | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +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 | - -dynamic _subscribeStudies(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [<abstract>IModelActionProvider]<:--[DashboardController] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [StudyMonitorScreen + [StudyInfoFormData | - +Widget build() + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [AccountSettingsDialog + [StudyContactInfoFormData | - +Widget build() + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [App + [StudyFormScaffold + | + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) + | + +Widget build() ] - [AppContent - ] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [Assets + [StudyFormValidationSet | - <static>+logoWide: String + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [<abstract>ResultTypes - ] + [Enum]<:--[StudyFormValidationSet] - [MeasurementResultTypes + [StudyDesignMeasurementsFormView | - <static>+questionnaire: String; - <static>+values: List<String> + +Widget build() ] - [<abstract>ResultTypes]<:-[MeasurementResultTypes] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [InterventionResultTypes + [MeasurementsFormViewModel | - <static>+checkmarkTask: String; - <static>+values: List<String> + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +form: FormGroup; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +measurementRequired: dynamic; + +titles: Map<FormMode, String> + | + +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [<abstract>ResultTypes]<:-[InterventionResultTypes] + [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] - [StudyExportData + [MeasurementsFormData | - +study: Study; - +measurementsData: List<Map<String, dynamic>>; - +interventionsData: List<Map<String, dynamic>>; - +isEmpty: bool + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String + | + +Study apply(); + +MeasurementsFormData copy() ] - [StudyExportData]o-[Study] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [StudyTemplates + [MeasurementSurveyFormViewModel | - <static>+kUnnamedStudyTitle: String + +study: Study; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; + +form: FormGroup; + +measurementId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - <static>+Study emptyDraft() + +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() ] - [StudyActionType + [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] + + [MeasurementSurveyFormData | - +index: int; - <static>+values: List<StudyActionType>; - <static>+edit: StudyActionType; - <static>+duplicate: StudyActionType; - <static>+duplicateDraft: StudyActionType; - <static>+addCollaborator: StudyActionType; - <static>+export: StudyActionType; - <static>+delete: StudyActionType + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String + | + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [StudyActionType]o-[StudyActionType] - [Enum]<:--[StudyActionType] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [StudyLaunched + [SurveyPreview + | + +routeArgs: MeasurementFormRouteArgs + | + +Widget build() ] - [<abstract>ModelEvent]<:-[StudyLaunched] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [<abstract>IStudyRepository + [MeasurementSurveyFormView | - +dynamic launch(); - +dynamic deleteParticipants() + +formViewModel: MeasurementSurveyFormViewModel ] - [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [StudyRepository - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: ProviderRef<dynamic> + [<abstract>IStudyFormData | - +String getKey(); - +dynamic deleteParticipants(); - +dynamic launch(); - +List<ModelAction<dynamic>> availableActions() + +Study apply() ] - [StudyRepository]o-[<abstract>StudyUApi] - [StudyRepository]o-[<abstract>IAuthRepository] - [StudyRepository]o-[<abstract>ProviderRef] - [<abstract>ModelRepository]<:-[StudyRepository] - [<abstract>IStudyRepository]<:--[StudyRepository] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [StudyRepositoryDelegate + [ReportsFormViewModel | - +apiClient: StudyUApi; - +authRepository: IAuthRepository + +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 | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +Study createNewInstance(); - +Study createDuplicate() + +void setControlsFrom(); + +ReportsFormData buildFormData(); + +void read(); + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); + +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); + +dynamic testReport(); + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide() ] - [StudyRepositoryDelegate]o-[<abstract>StudyUApi] - [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] - [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] + [ReportsFormViewModel]o-[Study] + [ReportsFormViewModel]o-[GoRouter] + [ReportsFormViewModel]o-[ReportFormItemDelegate] + [ReportsFormViewModel]o-[FormArray] + [ReportsFormViewModel]o-[FormViewModelCollection] + [ReportsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] - [<abstract>ModelEvent + [ReportFormItemDelegate | - +modelId: String; - +model: T - ] - - [IsFetched + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic + | + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>ModelEvent]<:-[IsFetched] + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [IsSaving + [ReportItemFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) + | + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [<abstract>ModelEvent]<:-[IsSaving] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [IsSaved + [LinearRegressionSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> + | + +Widget build() ] - [<abstract>ModelEvent]<:-[IsSaved] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [IsDeleted + [DataReferenceIdentifier + | + +hashCode: int + | + +bool ==() ] - [<abstract>ModelEvent]<:-[IsDeleted] + [DataReference]<:-[DataReferenceIdentifier] - [<abstract>IAppRepository + [DataReferenceEditor | - +dynamic fetchAppConfig(); - +void dispose() + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + | + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [AppRepository + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] + + [TemporalAggregationFormatted | - +apiClient: StudyUApi + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int | - +dynamic fetchAppConfig(); - +void dispose() + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [AppRepository]o-[<abstract>StudyUApi] - [<abstract>IAppRepository]<:--[AppRepository] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [WrappedModel + [ImprovementDirectionFormatted | - -_model: T; - +asyncValue: AsyncValue<T>; - +isLocalOnly: bool; - +isDirty: bool; - +isDeleted: bool; - +lastSaved: DateTime?; - +lastFetched: DateTime?; - +lastUpdated: DateTime?; - +model: T + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +dynamic markWithError(); - +dynamic markAsLoading(); - +dynamic markAsFetched(); - +dynamic markAsSaved() - ] - - [WrappedModel]o-[<abstract>AsyncValue] - - [ModelRepositoryException + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [Exception]<:--[ModelRepositoryException] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [ModelNotFoundException + [ReportSectionType + | + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType ] - [ModelRepositoryException]<:--[ModelNotFoundException] + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] - [<abstract>IModelRepository + [AverageSectionFormView | - +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() + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> + | + +Widget build() ] - [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [<abstract>IModelRepositoryDelegate + [ReportItemFormViewModel | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +T createNewInstance(); - +T createDuplicate(); - +dynamic onError() + <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() ] - [<abstract>ModelRepository + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + + [ReportItemFormData | - +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>> + +isPrimary: bool; + +section: ReportSection; + +id: String | - +WrappedModel<T>? get(); - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic duplicateAndSave(); - +dynamic duplicateAndSaveFromRemote(); - +Stream<List<WrappedModel<T>>> watchAll(); - +Stream<WrappedModel<T>> watch(); - +Stream<ModelEvent<T>> watchAllChanges(); - +Stream<ModelEvent<T>> watchChanges(); - -dynamic _buildModelSpecificController(); - +dynamic ensurePersisted(); - +WrappedModel<T> upsertLocally(); - +List<WrappedModel<T>> upsertAllLocally(); - +dynamic emitUpdate(); - +dynamic emitModelEvent(); - +dynamic emitError(); - +void dispose(); - +List<ModelAction<dynamic>> availableActions() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] - [<abstract>ModelRepository]o-[BehaviorSubject] - [<abstract>IModelRepository]<:-[<abstract>ModelRepository] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [<abstract>StudyUApi + [ReportsFormData | - +dynamic saveStudy(); - +dynamic fetchStudy(); - +dynamic getUserStudies(); - +dynamic deleteStudy(); - +dynamic saveStudyInvite(); - +dynamic fetchStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic deleteParticipants(); - +dynamic fetchAppConfig() - ] - - [APIException + +reportItems: List<ReportItemFormData>; + +id: String + | + +Study apply(); + +ReportsFormData copy() ] - [Exception]<:--[APIException] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [StudyNotFoundException + [ReportStatus + | + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [APIException]<:-[StudyNotFoundException] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] - [MeasurementNotFoundException + [StudyDesignReportsFormView + | + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() ] - [APIException]<:-[MeasurementNotFoundException] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - [QuestionNotFoundException + [ReportBadge + | + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool + | + +Widget build() ] - [APIException]<:-[QuestionNotFoundException] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [ConsentItemNotFoundException + [StudyDesignEnrollmentFormView + | + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [APIException]<:-[ConsentItemNotFoundException] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [InterventionNotFoundException + [ConsentItemFormData + | + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String + | + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [APIException]<:-[InterventionNotFoundException] + [<abstract>IFormData]<:-[ConsentItemFormData] - [InterventionTaskNotFoundException + [EnrollmentFormData + | + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String + | + +Study apply(); + +EnrollmentFormData copy() ] - [APIException]<:-[InterventionTaskNotFoundException] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [ReportNotFoundException + [ConsentItemFormViewModel + | + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [APIException]<:-[ReportNotFoundException] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [ReportSectionNotFoundException + [<abstract>IScreenerQuestionLogicFormViewModel + | + +isDirtyOptionsBannerVisible: bool ] - [APIException]<:-[ReportSectionNotFoundException] - - [StudyInviteNotFoundException + [ScreenerQuestionLogicFormView + | + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [APIException]<:-[StudyInviteNotFoundException] + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [StudyUApiClient + [ScreenerQuestionFormViewModel | - +supabaseClient: SupabaseClient; - <static>+studyColumns: List<String>; - <static>+studyWithParticipantActivityColumns: List<String>; - +testDelayMilliseconds: int + <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 deleteParticipants(); - +dynamic getUserStudies(); - +dynamic fetchStudy(); - +dynamic deleteStudy(); - +dynamic saveStudy(); - +dynamic fetchStudyInvite(); - +dynamic saveStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic fetchAppConfig(); - -dynamic _awaitGuarded(); - -dynamic _apiException(); - -dynamic _testDelay() + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() ] - [StudyUApiClient]o-[SupabaseClient] - [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] - [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] - [<abstract>StudyUApi]<:--[StudyUApiClient] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [<abstract>IAuthRepository + [EnrollmentFormViewModel | - +allowPasswordReset: bool; - +currentUser: User?; - +isLoggedIn: bool; - +session: Session? + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +form: FormGroup; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> | - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose() + +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() ] - [<abstract>IAuthRepository]o-[User] - [<abstract>IAuthRepository]o-[Session] - [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] + [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] - [AuthRepository + [EnrollmentFormConsentItemDelegate | - <static>+PERSIST_SESSION_KEY: String; - +supabaseClient: SupabaseClient; - +sharedPreferences: SharedPreferences; - +allowPasswordReset: bool; - +authClient: GoTrueClient; - +session: Session?; - +currentUser: User?; - +isLoggedIn: bool + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - -void _registerAuthListener(); - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - -dynamic _persistSession(); - -dynamic _resetPersistedSession(); - -dynamic _recoverSession(); - +void dispose(); - +dynamic onAppStart() + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [AuthRepository]o-[SupabaseClient] - [AuthRepository]o-[SharedPreferences] - [AuthRepository]o-[GoTrueClient] - [AuthRepository]o-[Session] - [AuthRepository]o-[User] - [<abstract>IAuthRepository]<:--[AuthRepository] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IInviteCodeRepository + [ConsentItemFormView | - +dynamic isCodeAlreadyUsed() + +formViewModel: ConsentItemFormViewModel ] - [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - [InviteCodeRepository + [<abstract>WithScheduleControls | - +studyId: String; - +ref: ProviderRef<dynamic>; - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +studyRepository: IStudyRepository; - +study: Study + +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>? | - +String getKey(); - +dynamic isCodeAlreadyUsed(); - +List<ModelAction<dynamic>> availableActions(); - +dynamic emitUpdate() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [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>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [InviteCodeRepositoryDelegate + [<abstract>IFormDataWithSchedule | - +study: Study; - +apiClient: StudyUApi; - +studyRepository: IStudyRepository + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? | - +dynamic fetch(); - +dynamic fetchAll(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +StudyInvite createDuplicate(); - +StudyInvite createNewInstance() + +Schedule toSchedule() ] - [InviteCodeRepositoryDelegate]o-[Study] - [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] - [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] - [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [<abstract>SupabaseClientDependant + [ScheduleControls | - +supabaseClient: SupabaseClient + +formViewModel: WithScheduleControls + | + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [<abstract>SupabaseClientDependant]o-[SupabaseClient] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [SupabaseQueryError + [SurveyQuestionType | - +statusCode: String?; - +message: String; - +details: dynamic + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType ] - [Exception]<:--[SupabaseQueryError] - - [<abstract>SupabaseQueryMixin - | - +dynamic deleteAll(); - +dynamic getAll(); - +dynamic getById(); - +dynamic getByColumn(); - +List<T> deserializeList(); - +T deserializeObject() - ] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [<abstract>GoRouteParamEnum + [ChoiceQuestionFormView | - +String toRouteParam(); - +String toShortString() - ] - - [RouterKeys + +formViewModel: QuestionFormViewModel | - <static>+studyKey: ValueKey<String>; - <static>+authKey: ValueKey<String> + +Widget build() ] - [RouterKeys]o-[ValueKey] - - [RouteParams - | - <static>+studiesFilter: String; - <static>+studyId: String; - <static>+measurementId: String; - <static>+interventionId: String; - <static>+testAppRoute: String - ] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [RouterConf + [BoolQuestionFormView | - <static>+router: GoRouter; - <static>+routes: List<GoRoute>; - <static>+publicRoutes: List<GoRoute>; - <static>+privateRoutes: List<GoRoute> + +formViewModel: QuestionFormViewModel | - <static>+GoRoute route() + +Widget build() ] - [RouterConf]o-[GoRouter] - - [<abstract>StudyFormRouteArgs - | - +studyId: String - ] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [<abstract>QuestionFormRouteArgs + [<abstract>IScaleQuestionFormViewModel | - +questionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[<abstract>QuestionFormRouteArgs] - - [ScreenerQuestionFormRouteArgs + +isMidValuesClearedInfoVisible: bool ] - [<abstract>QuestionFormRouteArgs]<:-[ScreenerQuestionFormRouteArgs] - - [ConsentItemFormRouteArgs + [ScaleQuestionFormView | - +consentId: String + +formViewModel: QuestionFormViewModel ] - [<abstract>StudyFormRouteArgs]<:-[ConsentItemFormRouteArgs] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [MeasurementFormRouteArgs + [<abstract>QuestionFormData | - +measurementId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[MeasurementFormRouteArgs] - - [SurveyQuestionFormRouteArgs + <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 | - +questionId: String + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() ] - [MeasurementFormRouteArgs]<:-[SurveyQuestionFormRouteArgs] - [<abstract>QuestionFormRouteArgs]<:--[SurveyQuestionFormRouteArgs] + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] - [InterventionFormRouteArgs + [ChoiceQuestionFormData | - +interventionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[InterventionFormRouteArgs] - - [InterventionTaskFormRouteArgs + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> | - +taskId: String + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [InterventionFormRouteArgs]<:-[InterventionTaskFormRouteArgs] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [ReportItemFormRouteArgs + [BoolQuestionFormData | - +sectionId: String - ] - - [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - - [RoutingIntents + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> | - <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) + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [RoutingIntents]o-[RoutingIntent] - [RoutingIntents]o-[RoutingIntent Function(String)] - [RoutingIntents]o-[RoutingIntent Function(String, String)] - [RoutingIntents]o-[RoutingIntent Function(String, {String? appRoute})] - [RoutingIntents]o-[RoutingIntent Function(Exception)] + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - [RoutingIntent + [ScaleQuestionFormData | - +route: GoRoute; - +params: Map<String, String>; - +queryParams: Map<String, String>; - +dispatch: RoutingIntentDispatch?; - +extra: Object?; - +routeName: String; - +arguments: Map<String, String>; - +props: List<Object?> + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> | - -dynamic _validateRoute(); - +bool matches() + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [RoutingIntent]o-[GoRoute] - [RoutingIntent]o-[RoutingIntentDispatch] - [<abstract>Equatable]<:-[RoutingIntent] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [RoutingIntentDispatch + [QuestionFormViewModel | - +index: int; - <static>+values: List<RoutingIntentDispatch>; - <static>+go: RoutingIntentDispatch; - <static>+push: RoutingIntentDispatch - ] - - [RoutingIntentDispatch]o-[RoutingIntentDispatch] - [Enum]<:--[RoutingIntentDispatch] - - [NullHelperDecoration + <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 + | + +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() ] - [InputDecoration]<:-[NullHelperDecoration] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [MouseEventsRegion + [SurveyQuestionFormView | - +onTap: void Function()?; - +onHover: void Function(PointerHoverEvent)?; - +onEnter: void Function(PointerEnterEvent)?; - +onExit: void Function(PointerExitEvent)?; - +autoselectCursor: bool; - +cursor: SystemMouseCursor; - <static>+defaultCursor: SystemMouseCursor; - +autoCursor: SystemMouseCursor + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [MouseEventsRegion]o-[void Function()?] - [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] - [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] - [MouseEventsRegion]o-[void Function(PointerExitEvent)?] - [MouseEventsRegion]o-[SystemMouseCursor] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [ActionMenuInline + [<abstract>WithQuestionnaireControls | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? + +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() ] - [IconPack - | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> - | - <static>+IconOption? resolveIconByName() - ] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [IconOption + [QuestionnaireFormData | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> + +questionsData: List<QuestionFormData>?; + +id: String | - +String toJson(); - <static>+IconOption fromJson() + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [ReactiveIconPicker + [<abstract>StudyDesignPageWidget + | + +Widget? banner() ] - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [IconPicker + [StudyFormViewModel | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool + +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> | - +Widget build() + +void read(); + +void setControlsFrom(); + +Study buildFormData(); + +void dispose(); + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] + [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] - [IconPickerField + [<abstract>StudyScheduleControls | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic | - +Widget build() + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [IconPickerGallery - | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double + [StudyDesignInterventionsFormView | +Widget build() ] - [IconPickerGallery]o-[void Function(IconOption)?] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [<abstract>IWithBanner + [InterventionFormViewModel | - +Widget? banner() - ] - - [BannerBox + +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> | - +prefixIcon: Widget?; - +body: Widget; - +style: BannerStyle; - +padding: EdgeInsets?; - +noPrefix: bool; - +dismissable: bool; - +isDismissed: bool?; - +onDismissed: dynamic Function()?; - +dismissIconSize: double + +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() ] - [BannerBox]o-[<abstract>Widget] - [BannerBox]o-[BannerStyle] - [BannerBox]o-[EdgeInsets] - [BannerBox]o-[dynamic Function()?] + [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] - [BannerStyle + [StudyScheduleFormView | - +index: int; - <static>+values: List<BannerStyle>; - <static>+warning: BannerStyle; - <static>+info: BannerStyle; - <static>+error: BannerStyle + +formViewModel: StudyScheduleControls + | + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [BannerStyle]o-[BannerStyle] - [Enum]<:--[BannerStyle] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [Badge + [StudyScheduleFormData | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle? + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [BadgeType + [InterventionFormView | - +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType + +formViewModel: InterventionFormViewModel ] - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] + [InterventionFormView]o-[InterventionFormViewModel] - [ConstrainedWidthFlexible + [InterventionsFormViewModel | - +minWidth: double; - +maxWidth: double; - +flex: int; - +flexSum: int; - +child: Widget; - +outerConstraints: BoxConstraints + +study: Study; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; + +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool | - +Widget build(); - -double _getWidth() + +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() ] - [ConstrainedWidthFlexible]o-[<abstract>Widget] - [ConstrainedWidthFlexible]o-[BoxConstraints] + [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] - [SecondaryButton + [InterventionTaskFormData | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String | - +Widget build() + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [HtmlStylingBanner + [InterventionPreview | - +isDismissed: bool; - +onDismissed: dynamic Function()? + +routeArgs: InterventionFormRouteArgs | +Widget build() ] - [HtmlStylingBanner]o-[dynamic Function()?] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [NavbarTab + [InterventionTaskFormView | - +title: String; - +intent: RoutingIntent?; - +index: int; - +enabled: bool + +formViewModel: InterventionTaskFormViewModel ] - [NavbarTab]o-[RoutingIntent] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [TabbedNavbar + [InterventionsFormData | - +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? + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String + | + +Study apply(); + +InterventionsFormData copy() ] - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [ActionMenuType + [InterventionTaskFormViewModel | - +index: int; - <static>+values: List<ActionMenuType>; - <static>+inline: ActionMenuType; - <static>+popup: ActionMenuType + +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() ] - [ActionMenuType]o-[ActionMenuType] - [Enum]<:--[ActionMenuType] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [FormScaffold + [InterventionFormData | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String + | + +Intervention toIntervention(); + +InterventionFormData copy() ] - [FormScaffold]o-[<abstract>Widget] + [<abstract>IFormData]<:-[InterventionFormData] - [<abstract>FormConsumerWidget + [AccountSettingsDialog | +Widget build() ] - [<abstract>FormConsumerRefWidget - | - +Widget build() - ] + [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [PrimaryButton + [AppStatus | - +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 + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [PrimaryButton]o-[IconData] - [PrimaryButton]o-[void Function()?] - [PrimaryButton]o-[dynamic Function()?] - [PrimaryButton]o-[EdgeInsets] - [PrimaryButton]o-[Size] + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] - [SingleColumnLayout - | - <static>+defaultConstraints: BoxConstraints; - <static>+defaultConstraintsNarrow: BoxConstraints; - +body: Widget; - +header: Widget?; - +stickyHeader: bool; - +constraints: BoxConstraints?; - +scroll: bool; - +padding: EdgeInsets? + [<abstract>IAppDelegate | - <static>+dynamic fromType() + +dynamic onAppStart() ] - [SingleColumnLayout]o-[BoxConstraints] - [SingleColumnLayout]o-[<abstract>Widget] - [SingleColumnLayout]o-[EdgeInsets] - - [SingleColumnLayoutType + [AppController | - +index: int; - <static>+values: List<SingleColumnLayoutType>; - <static>+boundedWide: SingleColumnLayoutType; - <static>+boundedNarrow: SingleColumnLayoutType; - <static>+stretched: SingleColumnLayoutType; - <static>+split: SingleColumnLayoutType + +sharedPreferences: SharedPreferences; + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic + | + +dynamic onAppStart(); + -dynamic _callDelegates() ] - [SingleColumnLayoutType]o-[SingleColumnLayoutType] - [Enum]<:--[SingleColumnLayoutType] + [AppController]o-[SharedPreferences] - [FormTableRow + [CombinedStreamNotifier | - +label: String?; - +labelBuilder: Widget Function(BuildContext)?; - +labelStyle: TextStyle?; - +labelHelpText: String?; - +input: Widget; - +control: AbstractControl<dynamic>?; - +layout: FormTableRowLayout? + -_subscriptions: List<StreamSubscription<dynamic>> + | + +void dispose() ] - [FormTableRow]o-[Widget Function(BuildContext)?] - [FormTableRow]o-[TextStyle] - [FormTableRow]o-[<abstract>Widget] - [FormTableRow]o-[<abstract>AbstractControl] - [FormTableRow]o-[FormTableRowLayout] + [ChangeNotifier]<:-[CombinedStreamNotifier] - [FormTableLayout + [Tuple | - +rows: List<FormTableRow>; - +columnWidths: Map<int, TableColumnWidth>; - +rowDivider: Widget?; - +rowLayout: FormTableRowLayout?; - +rowLabelStyle: TextStyle? + +first: T1; + +second: T2; + +props: List<Object?> | - +Widget build() + +Map<String, dynamic> toJson(); + <static>+Tuple<dynamic, dynamic> fromJson(); + +Tuple<T1, T2> copy(); + +Tuple<T1, T2> copyWith() ] - [FormTableLayout]o-[<abstract>Widget] - [FormTableLayout]o-[FormTableRowLayout] - [FormTableLayout]o-[TextStyle] + [<abstract>Equatable]<:-[Tuple] - [FormSectionHeader + [OptimisticUpdate | - +title: String; - +titleTextStyle: TextStyle?; - +helpText: String?; - +divider: bool; - +helpTextDisabled: bool + +applyOptimistic: void Function(); + +apply: dynamic Function(); + +rollback: void Function(); + +onUpdate: void Function()?; + +onError: void Function(Object, StackTrace?)?; + +rethrowErrors: bool; + +runOptimistically: bool; + +completeFutureOptimistically: bool | - +Widget build() + +dynamic execute(); + -void _runUpdateHandlerIfAny() ] - [FormSectionHeader]o-[TextStyle] + [OptimisticUpdate]o-[void Function()] + [OptimisticUpdate]o-[dynamic Function()] + [OptimisticUpdate]o-[void Function()?] + [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - [FormLabel + [<abstract>ExecutionLimiter | - +labelText: String?; - +helpText: String?; - +labelTextStyle: TextStyle?; - +layout: FormTableRowLayout? + +milliseconds: int; + <static>-_timer: Timer? | - +Widget build() + +void dispose() ] - [FormLabel]o-[TextStyle] - [FormLabel]o-[FormTableRowLayout] + [<abstract>ExecutionLimiter]o-[Timer] - [FormTableRowLayout + [Debouncer | - +index: int; - <static>+values: List<FormTableRowLayout>; - <static>+vertical: FormTableRowLayout; - <static>+horizontal: FormTableRowLayout + +leading: bool; + +cancelUncompleted: bool; + -_uncompletedFutureOperation: CancelableOperation<dynamic>? + | + +dynamic call() ] - [FormTableRowLayout]o-[FormTableRowLayout] - [Enum]<:--[FormTableRowLayout] + [Debouncer]o-[CancelableOperation] + [<abstract>ExecutionLimiter]<:-[Debouncer] - [FormSideSheetTab + [Throttler | - +formViewBuilder: Widget Function(T) + +dynamic call() ] - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] + [<abstract>ExecutionLimiter]<:-[Throttler] - [SidesheetTab + [<abstract>FileFormatEncoder | - +builder: Widget Function(BuildContext) + +dynamic encodeAsync(); + +String encode(); + +dynamic call() ] - [SidesheetTab]o-[Widget Function(BuildContext)] - [NavbarTab]<:-[SidesheetTab] - - [Sidesheet + [CSVStringEncoder | - <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)? + +String encode() ] - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] + [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - [UnderConstruction + [JsonStringEncoder | - +Widget build() + +String encode() ] - [DismissButton + [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] + + [CountWhereValidator | - +onPressed: void Function()?; - +text: String? + +predicate: bool Function(T?); + +minCount: int?; + +maxCount: int?; + <static>+kValidationMessageMinCount: String; + <static>+kValidationMessageMaxCount: String | - +Widget build() + +Map<String, dynamic>? validate() ] - [DismissButton]o-[void Function()?] + [CountWhereValidator]o-[bool Function(T?)] + [<abstract>Validator]<:-[CountWhereValidator] - [TwoColumnLayout + [MustMatchValidator | - <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 + +control: AbstractControl<dynamic>?; + +matchingControl: AbstractControl<dynamic>? + | + +Map<String, dynamic>? validate() ] - [TwoColumnLayout]o-[VerticalDivider] - [TwoColumnLayout]o-[EdgeInsets] - [TwoColumnLayout]o-[<abstract>Widget] - [TwoColumnLayout]o-[BoxConstraints] - [TwoColumnLayout]o-[Color] + [MustMatchValidator]o-[<abstract>AbstractControl] + [<abstract>Validator]<:-[MustMatchValidator] - [ErrorPage - | - +error: Exception? + [FieldValidators | - +Widget build() + <static>+String? emailValidator() ] - [<abstract>ConsumerWidget]<:-[ErrorPage] + [Patterns + | + <static>+timeFormatString: String; + <static>+emailFormatString: String; + <static>+url: String + ] - [SplashPage + [Time | - +Widget build() + <static>+dynamic fromTimeOfDay(); + +Map<String, dynamic> toJson(); + <static>+Time fromJson() ] - [Hyperlink + [TimeOfDay]<:-[Time] + + [TimeValueAccessor | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? + +String modelToViewValue(); + +Time? viewToModelValue(); + -String _addLeadingZeroIfNeeded() ] - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] + [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - [StandardDialog + [NumericalRangeFormatter | - +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 + +min: int?; + +max: int? | - +Widget build() + +TextEditingValue formatEditUpdate() ] - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] + [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] - [StudyULogo - | - +onTap: void Function()? + [StudySequenceFormatter | - +Widget build() + +TextEditingValue formatEditUpdate() ] - [StudyULogo]o-[void Function()?] + [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - [HelpIcon + [<abstract>IProviderArgsResolver | - +tooltipText: String? + +R provide() + ] + + [<abstract>JsonFileLoader | - +Widget build() + +jsonAssetsPath: String + | + +dynamic loadJson(); + +dynamic parseJsonMapFromAssets(); + +dynamic parseJsonListFromAssets() ] - [EmptyBody + [ModelAction | + +type: T; + +label: String; +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? - | - +Widget build() + +onExecute: Function; + +isAvailable: bool; + +isDestructive: bool ] - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] + [ModelAction]o-[IconData] - [ReactiveCustomColorPicker + [<abstract>IModelActionProvider + | + +List<ModelAction<dynamic>> availableActions() ] - [ReactiveFormField]<:-[ReactiveCustomColorPicker] - - [TextParagraph + [<abstract>IListActionProvider | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? + +void onSelectItem(); + +void onNewItem() + ] + + [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] + + [ModelActionType | - +Widget build() + +index: int; + <static>+values: List<ModelActionType>; + <static>+edit: ModelActionType; + <static>+delete: ModelActionType; + <static>+remove: ModelActionType; + <static>+duplicate: ModelActionType; + <static>+clipboard: ModelActionType; + <static>+primary: ModelActionType ] - [TextParagraph]o-[TextStyle] + [ModelActionType]o-[ModelActionType] + [Enum]<:--[ModelActionType] - [FormControlLabel + [SuppressedBehaviorSubject | - +formControl: AbstractControl<dynamic>; - +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? + +subject: BehaviorSubject<T>; + +didSuppressInitialEvent: bool; + -_controller: StreamController<T> | - +Widget build() + -StreamController<T> _buildDerivedController(); + +dynamic close() ] - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + [SuppressedBehaviorSubject]o-[BehaviorSubject] + [SuppressedBehaviorSubject]o-[StreamController] - [StandardTableColumn + [SerializableColor | - +label: String; - +tooltip: String?; - +columnWidth: TableColumnWidth + +Map<String, dynamic> toJson(); + <static>+SerializableColor fromJson() ] - [StandardTableColumn]o-[<abstract>TableColumnWidth] + [Color]<:-[SerializableColor] - [StandardTable + [StudyUException | - +items: List<T>; - +columns: List<StandardTableColumn>; - +onSelectItem: void Function(T); - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; - +trailingActionsMenuType: ActionMenuType?; - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +trailingActionsColumn: 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 + +message: String + | + +String toString() ] - [StandardTable]o-[void Function(T)] - [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] - [StandardTable]o-[ActionMenuType] - [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] - [StandardTable]o-[StandardTableColumn] - [StandardTable]o-[Widget Function(Widget)?] - [StandardTable]o-[<abstract>Widget] - [StandardTable]o-[StandardTableStyle] + [Exception]<:--[StudyUException] - [StandardTableStyle + [DropdownMenuItemTheme | - +index: int; - <static>+values: List<StandardTableStyle>; - <static>+plain: StandardTableStyle; - <static>+material: StandardTableStyle + +iconTheme: IconThemeData? ] - [StandardTableStyle]o-[StandardTableStyle] - [Enum]<:--[StandardTableStyle] + [DropdownMenuItemTheme]o-[IconThemeData] + [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] - [Collapsible + [ThemeConfig | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool + <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() ] - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] + [NoAnimationPageTransitionsBuilder + | + +Widget buildTransitions() + ] - [<abstract>ISyncIndicatorViewModel + [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] + + [WebTransitionBuilder | - +isDirty: bool; - +lastSynced: DateTime? + +Widget buildTransitions() ] - [SyncIndicator + [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] + + [ThemeSettingChange | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double + +settings: ThemeSettings ] - [SyncIndicator]o-[<abstract>AsyncValue] + [ThemeSettingChange]o-[ThemeSettings] + [<abstract>Notification]<:-[ThemeSettingChange] - [ActionPopUpMenuButton + [ThemeProvider | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition + +settings: ValueNotifier<ThemeSettings>; + +lightDynamic: ColorScheme?; + +darkDynamic: ColorScheme?; + +pageTransitionsTheme: PageTransitionsTheme; + +shapeMedium: ShapeBorder | - +Widget build(); - -Widget _buildPopupMenu() + +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() ] - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] + [ThemeProvider]o-[ValueNotifier] + [ThemeProvider]o-[ColorScheme] + [ThemeProvider]o-[PageTransitionsTheme] + [ThemeProvider]o-[<abstract>ShapeBorder] + [<abstract>InheritedWidget]<:-[ThemeProvider] - [AsyncValueWidget + [ThemeSettings | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? + +sourceColor: Color; + +themeMode: ThemeMode + ] + + [ThemeSettings]o-[Color] + [ThemeSettings]o-[ThemeMode] + + [CustomColor | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() + +name: String; + +color: Color; + +blend: bool + | + +Color value() ] - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] + [CustomColor]o-[Color] - + - + - + - + - - - + + + - + + + + + + + + + + + + + + - - + - + + + - + + + + + + - - + - + - + + + - + - + - + - + - + - + - + - + - + + + + - + + - + + + + - - - - - + + + + - + + + + + + + + + - + - - + + - + - - - - - - - + - + - - - + + + + + + + + + + + - + + + + + + + + - + + - + - + - + - + - + - - - + - + - + - + + + + + + - + + - + - + - + - + - + - + + + - + - + - + - - + + + + + + + + + + + + + + + + + + + + + - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + - - - + - + - - - - - - - - - + - + - - - + - + + + + + - + - + - + - - + + - + + + + + + + + + + + + + + + + + + - + + + + + + + + - + - - - - - - - - - + - + - + - + - + - + - + - + - - - + - + - + - + - - - - - - - + + + - + - - - + - - + + - + - - - + + - + + + + + + - + - + - + - + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + - - - + + + + + + + - - + - + - - - + - + - + - + - + - + - + - + - + - + - - + + + - - + + + - + - - + + + - - + - + - + - + - + - + + + + - + + - + - + - + - - - + - + - + - + - + - + - + - + - - - + - + - - - + - + - - - + - + - - - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + + - - + - + - + - + - + - + - + - + - - - - - + - + - + - + + + + + - - - + - - + + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + - - + - + - + - + - + - + - - - - - - - + - + - + - + - - - + - + - - - + - - - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - + + + - - - + + + - - + - + - + - + - - + + + - - + - - - + + + + - - - - + - + - - + + + - - + - + - + - + - - - - - + - + - + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + - - - + + + - - - + + + - - - - + - + - - - + - + - + - + - + - + - + - + - + - + - - - + - - - + + + + + + + + + + + + - - + - - + + - + - + - + - - - - - + - + - - - - + + + - - + + + + + - + - + - + - + - - - - + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - + - - - - - - - - - - + - - - - - - - - + + + - + - - - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - + - - + - + - - - + - - - + + + + - - - - + - + - + - + - - - + - + - + - + - + - + - - - - - - + - - - + + - + - + + + - + - + - + - + - + - - + + - - - - - - + + - + - - - - - - + + - + - - - + + + - + - + - - - - + - - + - + - - - + - + - - - + - + - + - - + + - - - - - + - + - + + + - + - - - - + + - + - + - + - + - + - + - + - + - + - + - - - - - - + - - - - - - + - + - + - + - - + + + - - - + + + - - - + + + - - + - + - + - + - + - + - + - + - + + + - + - + + + + + - + - + - + + + - + - - - - + + - + - + - + - + - + - - - + - + - - - + - + - - - + - + - + - + - + - + - - - - - - - + + + - - - - + - - + + + - + - + + + - + - + - + - - + + + - - - - - - - - - - - - + - + - + - + - + - + - + - + + + + - + + - + - + + + + + - + - + - + - + - + - - - - + + + + + + + + + + + + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - - - + + + + - + + - + - + - + - + - + - + - + - - - - - + - + - + - + - + + + + + - + - + - + - - - - - - - - - - - + - + - - - + + + + + - + - + - + - + - + - - + + + - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + + + + + - + - - + + + - - - - - - - - - - + - + - + + + - + - + - - - + - - - - - - + - + + - + - + - + - - + + - + - - + + + + - + - + - + - - - - - - - - - - - + - + - - + + + - - + - + + + + + + + - + - + - + - + - + - - + + - + - + - + + + + + + + + + + + + + + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - + - - + + - + - + + + - + - - - + + + - + + + + - + + - + - + - + - + - + - + - + - - + + + + + + + - + + - + - - - - + + + - + + - + - + - + - - - + + - - - + + + - - + - + - - + + - + - + - + - + - + - - - + + + + + - - - - + - - + - + - + - + - - - - - - - - - - - - + + + - - - - - - - - + - + - + - + - + - + + + + - + + - + - + + + - + - + - + - + - + - - - + + + - + + + - + - - - - + + - + - - - + + - + + + + - + - + - + - + + + + + - + - + - + - - - - - - - + + - + + - + - + - + - + + + - + - + + + - + + + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - - - - + + + - - - + + + - + + - + - + - + - - - + + - - - + + + + - + - - + + - + - + - + - + - + - + - + - - - + + - + + - + - + + + - + - - - + + - + + - + - + + + - + - + + + - + - + - + - - - - - - + - + + + + + + - + - + + + - + - + - + - + - + - + - + - - - + + + + - + + - + - + - + - + - + - + - - - - + + + - - - + + + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - - + + - + - - - + - + - - - + + + - + - + - + - + - + - + - + - + - + - - - + + + + + + + + + + + + - + + - + - + + + - + + + + - + + - + - - - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + - + + + + - + - + + + - + - + - + + + + - + + - + - + - + - - - + + + + + + + + + - + + + + - + + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + - + - + + + - + - + + + + + + + + + + + - + - + + + - + + + + - + + - + - + - + + + - + - - + + - + - + + + + + + + - + - + + + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - - - + + + + + + + + Assets + + + + + + <static>+logoWide: String + + + - - - - + + + + - - - NotificationDispatcher + + + Config - - - +child: Widget? - +snackbarInnerPadding: double - +snackbarWidth: double? - +snackbarBehavior: SnackBarBehavior - +snackbarDefaultDuration: int + + + <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 + + + IAppRepository + + + + + + +dynamic fetchAppConfig() + +void dispose() - - - + + + + + - - - SnackBarBehavior + + + AppRepository + + + + + + +apiClient: StudyUApi + + + + + + +dynamic fetchAppConfig() + +void dispose() - - - - + + + + - - - IClipboardService + + + StudyUApi - - - +dynamic copy() + + + +dynamic saveStudy() + +dynamic fetchStudy() + +dynamic getUserStudies() + +dynamic deleteStudy() + +dynamic saveStudyInvite() + +dynamic fetchStudyInvite() + +dynamic deleteStudyInvite() + +dynamic deleteParticipants() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() - - - - + + + + - - - ClipboardService + + + IStudyRepository - - - +dynamic copy() + + + +dynamic launch() + +dynamic deleteParticipants() - - - - + + + + + - - - INotificationService + + + ModelRepository - - - +void showMessage() - +void show() - +Stream<NotificationIntent> watchNotifications() - +void dispose() + + + +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() - - - - - + + + + + - - - NotificationService + + + StudyRepository - - - -_streamController: BehaviorSubject<NotificationIntent> + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: ProviderRef<dynamic> + +sortCallback: void Function()? - - - +Stream<NotificationIntent> watchNotifications() - +void showMessage() - +void show() - +void dispose() + + + +String getKey() + +dynamic deleteParticipants() + +dynamic launch() + +List<ModelAction<dynamic>> availableActions() - - - + + + + + - - - BehaviorSubject + + + IAuthRepository - - - - - - - - - Notifications + + + +allowPasswordReset: bool + +currentUser: User? + +isLoggedIn: bool + +session: Session? - - - <static>+passwordReset: SnackbarIntent - <static>+passwordResetSuccess: SnackbarIntent - <static>+studyDeleted: SnackbarIntent - <static>+inviteCodeDeleted: SnackbarIntent - <static>+inviteCodeClipped: SnackbarIntent - <static>+studyDeleteConfirmation: AlertIntent + + + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + +void dispose() - - - - - - - - SnackbarIntent - - + + + - - - +duration: int? + + + ProviderRef - - - - + + + - - - AlertIntent + + + void Function()? - - - +title: String - +dismissOnAction: bool - +isDestructive: dynamic + + + + + + + + + + StudyRepositoryDelegate - - - - - - - - - NotificationDefaultActions + + + +apiClient: StudyUApi + +authRepository: IAuthRepository - - - <static>+cancel: NotificationAction + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic onError() + +Study createNewInstance() + +Study createDuplicate() - - - - + + + + - - - NotificationAction + + + IModelRepositoryDelegate - - - +label: String - +onSelect: dynamic Function() - +isDestructive: bool + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +T createNewInstance() + +T createDuplicate() + +dynamic onError() - - - - - + + + + + - - - NotificationIntent + + + IUserRepository - - - +message: String? - +customContent: Widget? - +icon: IconData? - +actions: List<NotificationAction>? - +type: NotificationType + + + +user: StudyUUser - - - +void register() + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + - - - IconData + + + StudyUUser - - - - + + + + + - - - NotificationType + + + UserRepository - - - +index: int - <static>+values: List<NotificationType> - <static>+snackbar: NotificationType - <static>+alert: NotificationType - <static>+custom: NotificationType + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: Ref<Object?> + +user: StudyUUser - - - - - - - - dynamic Function() + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + - - - Enum + + + Ref - - - - + + + + - - - DropdownMenuItemTheme - - - - - - +iconTheme: IconThemeData? + + + PreferenceAction - - - - - - - - IconThemeData + + + +index: int + <static>+values: List<PreferenceAction> + <static>+pin: PreferenceAction + <static>+pinOff: PreferenceAction - - - + + + - - - Diagnosticable + + + Enum - - - - - - - - - ThemeConfig - - - - - - <static>+kMinContentWidth: double - <static>+kMaxContentWidth: double - <static>+kHoverFadeFactor: double - <static>+kMuteFadeFactor: double - - + + + - - - <static>+dynamic bodyBackgroundColor() - <static>+Color modalBarrierColor() - <static>+Color containerColor() - <static>+Color colorPickerInitialColor() - <static>+TextStyle bodyTextMuted() - <static>+TextStyle bodyTextBackground() - <static>+double iconSplashRadius() - <static>+Color sidesheetBackgroundColor() - <static>+InputDecorationTheme dropdownInputDecorationTheme() - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() + + + StudyLaunched - - - - + + + + - - - NoAnimationPageTransitionsBuilder + + + ModelEvent - - - +Widget buildTransitions() + + + +modelId: String + +model: T - - - + + + + + - - - PageTransitionsBuilder + + + WrappedModel - - - - - - - - - WebTransitionBuilder + + + -_model: T + +asyncValue: AsyncValue<T> + +isLocalOnly: bool + +isDirty: bool + +isDeleted: bool + +lastSaved: DateTime? + +lastFetched: DateTime? + +lastUpdated: DateTime? + +model: T - - - +Widget buildTransitions() + + + +dynamic markWithError() + +dynamic markAsLoading() + +dynamic markAsFetched() + +dynamic markAsSaved() - - - - - - - - ThemeSettingChange - - + + + - - - +settings: ThemeSettings + + + AsyncValue - - - - - - - - ThemeSettings - - + + + - - - +sourceColor: Color - +themeMode: ThemeMode + + + ModelRepositoryException - - - + + + - - - Notification + + + Exception - - - - - + + + - - - ThemeProvider + + + ModelNotFoundException - - - +settings: ValueNotifier<ThemeSettings> - +lightDynamic: ColorScheme? - +darkDynamic: ColorScheme? - +pageTransitionsTheme: PageTransitionsTheme - +shapeMedium: ShapeBorder + + + + + + + + + IModelRepository - - - +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() + + + +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() - - - + + + + - - - ValueNotifier + + + IModelActionProvider - - - - - - - - ColorScheme + + + +List<ModelAction<dynamic>> availableActions() - - - + + + - - - PageTransitionsTheme + + + BehaviorSubject - - - + + + - - - ShapeBorder + + + IsFetched - - - + + + - - - InheritedWidget + + + IsSaving - - - + + + - - - Color + + + IsSaved - - - + + + - - - ThemeMode + + + IsDeleted - - - - - + + + + - - - CustomColor + + + SupabaseClientDependant - - - +name: String - +color: Color - +blend: bool + + + +supabaseClient: SupabaseClient - - - +Color value() + + + + + + + + SupabaseClient - - - - + + + + - - - LanguagePicker + + + SupabaseQueryError - - - +languagePickerType: LanguagePickerType - +iconColor: Color? - +offset: Offset? + + + +statusCode: String? + +message: String + +details: dynamic - - - - + + + + - - - LanguagePickerType + + + SupabaseQueryMixin - - - +index: int - <static>+values: List<LanguagePickerType> - <static>+field: LanguagePickerType - <static>+icon: LanguagePickerType + + + +dynamic deleteAll() + +dynamic getAll() + +dynamic getById() + +dynamic getByColumn() + +List<T> deserializeList() + +T deserializeObject() - - - + + + + - - - Offset + + + IInviteCodeRepository - - - - - - - - - PlatformLocaleWeb + + + +dynamic isCodeAlreadyUsed() - - - +Locale getPlatformLocale() + + + + + + + + + + InviteCodeRepository - - - - - - - - - PlatformLocale + + + +studyId: String + +ref: ProviderRef<dynamic> + +apiClient: StudyUApi + +authRepository: IAuthRepository + +studyRepository: IStudyRepository + +study: Study - - - +Locale getPlatformLocale() + + + +String getKey() + +dynamic isCodeAlreadyUsed() + +List<ModelAction<dynamic>> availableActions() + +dynamic emitUpdate() - - - - + + + - - - PlatformLocaleMobile + + + Study - - - +Locale getPlatformLocale() + + + + + + + + + + InviteCodeRepositoryDelegate - - - - - - - - - AppTranslation + + + +study: Study + +apiClient: StudyUApi + +studyRepository: IStudyRepository - - - <static>+dynamic init() + + + +dynamic fetch() + +dynamic fetchAll() + +dynamic save() + +dynamic delete() + +dynamic onError() + +StudyInvite createDuplicate() + +StudyInvite createNewInstance() - - - - - + + + - - - CountWhereValidator + + + User - - - +predicate: bool Function(T?) - +minCount: int? - +maxCount: int? - <static>+kValidationMessageMinCount: String - <static>+kValidationMessageMaxCount: String - - + + + + - - - +Map<String, dynamic>? validate() + + + Session - - - + + + + - - - bool Function(T?) + + + IAppDelegate - - - - - - - - Validator + + + +dynamic onAppStart() - - - - - + + + + + - - - MustMatchValidator + + + AuthRepository - - - +control: AbstractControl<dynamic>? - +matchingControl: AbstractControl<dynamic>? + + + <static>+PERSIST_SESSION_KEY: String + +supabaseClient: SupabaseClient + +sharedPreferences: SharedPreferences + +allowPasswordReset: bool + +authClient: GoTrueClient + +session: Session? + +currentUser: User? + +isLoggedIn: bool - - - +Map<String, dynamic>? validate() + + + -void _registerAuthListener() + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + -dynamic _persistSession() + -dynamic _resetPersistedSession() + -dynamic _recoverSession() + +void dispose() + +dynamic onAppStart() - - - + + + - - - AbstractControl + + + SharedPreferences - - - - + + + - - - FieldValidators + + + GoTrueClient - - - <static>+String? emailValidator() + + + + + + + + APIException - - - - + + + - - - Patterns + + + StudyNotFoundException - - - <static>+timeFormatString: String - <static>+emailFormatString: String - <static>+url: String + + + + + + + + MeasurementNotFoundException - - - - + + + - - - Time + + + QuestionNotFoundException - - - <static>+dynamic fromTimeOfDay() - +Map<String, dynamic> toJson() - <static>+Time fromJson() + + + + + + + + ConsentItemNotFoundException - - - + + + - - - TimeOfDay + + + InterventionNotFoundException - - - - + + + - - - TimeValueAccessor + + + InterventionTaskNotFoundException - - - +String modelToViewValue() - +Time? viewToModelValue() - -String _addLeadingZeroIfNeeded() + + + + + + + + ReportNotFoundException - - - + + + - - - ControlValueAccessor + + + ReportSectionNotFoundException - - - - - + + + - - - CombinedStreamNotifier + + + StudyInviteNotFoundException - - - -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + + + UserNotFoundException - - - +void dispose() + + + + + + + + + + StudyUApiClient - - - - + + + +supabaseClient: SupabaseClient + <static>+studyColumns: List<String> + <static>+studyWithParticipantActivityColumns: List<String> + +testDelayMilliseconds: int + + - - - ChangeNotifier + + + +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() - - - - + + + + - - - ModelAction + + + AppTranslation - - - +type: T - +label: String - +icon: IconData? - +onExecute: Function - +isAvailable: bool - +isDestructive: bool + + + <static>+dynamic init() - - - - + + + + - - - IModelActionProvider + + + LanguagePicker - - - +List<ModelAction<dynamic>> availableActions() + + + +languagePickerType: LanguagePickerType + +iconColor: Color? + +offset: Offset? - - - - + + + + - - - IListActionProvider + + + LanguagePickerType - - - +void onSelectItem() - +void onNewItem() + + + +index: int + <static>+values: List<LanguagePickerType> + <static>+field: LanguagePickerType + <static>+icon: LanguagePickerType - - - - - - - - ModelActionType - - + + + - - - +index: int - <static>+values: List<ModelActionType> - <static>+edit: ModelActionType - <static>+delete: ModelActionType - <static>+remove: ModelActionType - <static>+duplicate: ModelActionType - <static>+clipboard: ModelActionType - <static>+primary: ModelActionType + + + Color - - - - - + + + - - - StudyUException + + + Offset - - - +message: String + + + + + + + + + PlatformLocale - - - +String toString() + + + +Locale getPlatformLocale() - - - + + + + - - - Exception + + + PlatformLocaleMobile - - - - - - - - - - ExecutionLimiter + + + +Locale getPlatformLocale() - - - +milliseconds: int - <static>-_timer: Timer? + + + + + + + + + PlatformLocaleWeb - - - +void dispose() + + + +Locale getPlatformLocale() - - - + + + + - - - Timer + + + GoRouteParamEnum - - - - - - - - - - Debouncer + + + +String toRouteParam() + +String toShortString() - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + + + + + + + RouterKeys - - - +dynamic call() + + + <static>+studyKey: ValueKey<String> + <static>+authKey: ValueKey<String> - - - + + + - - - CancelableOperation + + + ValueKey - - - - + + + + - - - Throttler + + + RouteParams - - - +dynamic call() + + + <static>+studiesFilter: String + <static>+studyId: String + <static>+measurementId: String + <static>+interventionId: String + <static>+testAppRoute: String - - - - - + + + + + - - - JsonFileLoader + + + RouterConf - - - +jsonAssetsPath: String + + + <static>+router: GoRouter + <static>+routes: List<GoRoute> + <static>+publicRoutes: List<GoRoute> + <static>+privateRoutes: List<GoRoute> - - - +dynamic loadJson() - +dynamic parseJsonMapFromAssets() - +dynamic parseJsonListFromAssets() + + + <static>+GoRoute route() - - - - - - - - FileFormatEncoder - - + + + - - - +dynamic encodeAsync() - +String encode() - +dynamic call() + + + GoRouter - - - - + + + + - - - CSVStringEncoder + + + StudyFormRouteArgs - - - +String encode() + + + +studyId: String - - - - + + + + - - - JsonStringEncoder + + + QuestionFormRouteArgs - - - +String encode() + + + +questionId: String - - - - - + + + - - - OptimisticUpdate + + + ScreenerQuestionFormRouteArgs - - - +applyOptimistic: void Function() - +apply: dynamic Function() - +rollback: void Function() - +onUpdate: void Function()? - +onError: void Function(Object, StackTrace?)? - +rethrowErrors: bool - +runOptimistically: bool - +completeFutureOptimistically: bool + + + + + + + + + ConsentItemFormRouteArgs - - - +dynamic execute() - -void _runUpdateHandlerIfAny() + + + +consentId: String - - - + + + + - - - void Function() + + + MeasurementFormRouteArgs - - - - - - - - void Function()? + + + +measurementId: String - - - + + + + - - - void Function(Object, StackTrace?)? + + + SurveyQuestionFormRouteArgs - - - - - - - - - - Tuple + + + +questionId: String - - - +first: T1 - +second: T2 - +props: List<Object?> + + + + + + + + + InterventionFormRouteArgs - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() + + + +interventionId: String - - - + + + + - - - Equatable + + + InterventionTaskFormRouteArgs - - - - - - - - - - SuppressedBehaviorSubject + + + +taskId: String - - - +subject: BehaviorSubject<T> - +didSuppressInitialEvent: bool - -_controller: StreamController<T> + + + + + + + + + ReportItemFormRouteArgs - - - -StreamController<T> _buildDerivedController() - +dynamic close() + + + +sectionId: String - - - + + + + - - - StreamController + + + RoutingIntents + + + + + + <static>+root: RoutingIntent + <static>+studies: RoutingIntent + <static>+studiesShared: RoutingIntent + <static>+publicRegistry: RoutingIntent + <static>+study: RoutingIntent Function(String) + <static>+studyEdit: RoutingIntent Function(String) + <static>+studyEditInfo: RoutingIntent Function(String) + <static>+studyEditEnrollment: RoutingIntent Function(String) + <static>+studyEditInterventions: RoutingIntent Function(String) + <static>+studyEditIntervention: RoutingIntent Function(String, String) + <static>+studyEditMeasurements: RoutingIntent Function(String) + <static>+studyEditReports: RoutingIntent Function(String) + <static>+studyEditMeasurement: RoutingIntent Function(String, String) + <static>+studyTest: RoutingIntent Function(String, {String? appRoute}) + <static>+studyRecruit: RoutingIntent Function(String) + <static>+studyMonitor: RoutingIntent Function(String) + <static>+studyAnalyze: RoutingIntent Function(String) + <static>+studySettings: RoutingIntent Function(String) + <static>+accountSettings: RoutingIntent + <static>+studyNew: RoutingIntent + <static>+login: RoutingIntent + <static>+signup: RoutingIntent + <static>+passwordForgot: RoutingIntent + <static>+passwordForgot2: RoutingIntent Function(String) + <static>+passwordRecovery: RoutingIntent + <static>+error: RoutingIntent Function(Exception) - - - - - + + + + + - - - NumericalRangeFormatter + + + RoutingIntent - - - +min: int? - +max: int? + + + +route: GoRoute + +params: Map<String, String> + +queryParams: Map<String, String> + +dispatch: RoutingIntentDispatch? + +extra: Object? + +routeName: String + +arguments: Map<String, String> + +props: List<Object?> - - - +TextEditingValue formatEditUpdate() + + + -dynamic _validateRoute() + +bool matches() - - - + + + - - - TextInputFormatter + + + RoutingIntent Function(String) - - - - + + + - - - StudySequenceFormatter + + + RoutingIntent Function(String, String) - - - +TextEditingValue formatEditUpdate() + + + + + + + + RoutingIntent Function(String, {String? appRoute}) - - - - + + + - - - SerializableColor + + + RoutingIntent Function(Exception) - - - +Map<String, dynamic> toJson() - <static>+SerializableColor fromJson() + + + + + + + + GoRoute - - - - + + + + - - - IProviderArgsResolver + + + RoutingIntentDispatch - - - +R provide() + + + +index: int + <static>+values: List<RoutingIntentDispatch> + <static>+go: RoutingIntentDispatch + <static>+push: RoutingIntentDispatch - - - - + + + - - - Config + + + Equatable - - - <static>+isDebugMode: bool - <static>+defaultLocale: Set<String> - <static>+supportedLocales: Map<String, String> - <static>+newStudyId: String - <static>+newModelId: String - <static>+minSplashTime: int - <static>+formAutosaveDebounce: int + + + + + + + + + + StudyTemplates - - - - + + + <static>+kUnnamedStudyTitle: String + + - - - FormValidationSetEnum + + + <static>+Study emptyDraft() - - - - - + + + + - - - FormControlValidation + + + StudyActionType - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + +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 - - - +FormControlValidation merge() + + + + + + + + ResultTypes - - - - + + + + - - - ManagedFormViewModel + + + MeasurementResultTypes - - - +ManagedFormViewModel<T> createDuplicate() + + + <static>+questionnaire: String + <static>+values: List<String> - - - - - + + + + - - - FormViewModel + + + InterventionResultTypes - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + + + <static>+checkmarkTask: String + <static>+values: List<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() + + + + + + + + + StudyExportData - - - - - - - - FormViewModelNotFoundException + + + +study: Study + +measurementsData: List<Map<String, dynamic>> + +interventionsData: List<Map<String, dynamic>> + +isEmpty: bool - - - - - + + + + - - - FormViewModelCollection + + + FormSideSheetTab - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + +formViewBuilder: Widget Function(T) - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + + + + + + Widget Function(T) - - - + + + + - - - FormArray + + + NavbarTab - - - - - - - - - - FormArrayTable + + + +title: String + +intent: RoutingIntent? + +index: int + +enabled: bool - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + + + + + + + SidesheetTab - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + +builder: Widget Function(BuildContext) - - - + + + - - - void Function(T) + + + Widget Function(BuildContext) - - - + + + + - - - List<ModelAction<dynamic>> Function(T, int) + + + Sidesheet - - - - - - - - String Function(T) + + + <static>+kDefaultWidth: double + +titleText: String + +body: Widget? + +tabs: List<SidesheetTab>? + +actionButtons: List<Widget>? + +width: double? + +withCloseButton: bool + +ignoreAppBar: bool + +collapseSingleTab: bool + +bodyPadding: EdgeInsets? + +wrapContent: Widget Function(Widget)? - - - + + + - - - Widget Function(BuildContext, T, int)? + + + Widget - + - + EdgeInsets - - - - - - - - - IFormData - - - - - - +id: String - - + + + - - - +IFormData copy() + + + Widget Function(Widget)? - - - - - + + + + - - - CustomFormControl + + + MouseEventsRegion - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + +onTap: void Function()? + +onHover: void Function(PointerHoverEvent)? + +onEnter: void Function(PointerEnterEvent)? + +onExit: void Function(PointerExitEvent)? + +autoselectCursor: bool + +cursor: SystemMouseCursor + <static>+defaultCursor: SystemMouseCursor + +autoCursor: SystemMouseCursor - - - +void dispose() + + + + + + + + void Function(PointerHoverEvent)? - - - + + + - - - void Function(T?)? + + + void Function(PointerEnterEvent)? - - - + + + - - - void Function(ControlStatus)? + + + void Function(PointerExitEvent)? - - - + + + - - - FormControl + + + SystemMouseCursor - - - + + + - - - FormInvalidException + + + ReactiveCustomColorPicker - - - - - - - - FormConfigException - - + + + - - - +message: String? + + + ReactiveFormField - - - - + + + + - - - IFormViewModelDelegate + + + SplashPage - - - +dynamic onSave() - +void onCancel() + + + +Widget build() - - - - + + + + + - - - IFormGroupController + + + ErrorPage - - - +form: FormGroup + + + +error: Exception? + + + + + + +Widget build() - - - + + + - - - FormGroup + + + ConsumerWidget - - - - + + + + + - - - FormControlOption + + + AsyncValueWidget - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + +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() - - - - + + + - - - FormMode + + + Widget Function(Object, StackTrace?)? - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + + + + + + Widget Function()? - - - - + + + + - - - UnsavedChangesDialog + + + Search - - - +Widget build() + + + +onQueryChanged: dynamic Function(String) + +searchController: SearchController? + +hintText: String? + +initialText: String? - - - - - + + + - - - DrawerEntry + + + dynamic Function(String) - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +title: String - +helpText: String? + + + + + + + + + SearchController - - - +void onClick() + + + +setText: void Function(String) - - - + + + - - - String Function() + + + void Function(String) - - - + + + + + - - - String Function()? + + + HtmlStylingBanner - - - - + + + +isDismissed: bool + +onDismissed: dynamic Function()? + + - - - void Function(BuildContext, WidgetRef)? + + + +Widget build() - - - - - + + + - - - GoRouterDrawerEntry + + + dynamic Function()? - - - +intent: RoutingIntent - - + + + + - - - +void onClick() + + + NullHelperDecoration - - - - - + + + - - - RoutingIntent + + + InputDecoration - - - +route: GoRoute - +params: Map<String, String> - +queryParams: Map<String, String> - +dispatch: RoutingIntentDispatch? - +extra: Object? - +routeName: String - +arguments: Map<String, String> - +props: List<Object?> + + + + + + + + + IWithBanner - - - -dynamic _validateRoute() - +bool matches() + + + +Widget? banner() - - - - + + + + - - - AppDrawer + + + BannerBox - - - +title: String - +width: int - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + +prefixIcon: Widget? + +body: Widget + +style: BannerStyle + +padding: EdgeInsets? + +noPrefix: bool + +dismissable: bool + +isDismissed: bool? + +onDismissed: dynamic Function()? + +dismissIconSize: double + + + + + + + + + + + + BannerStyle + + + + + + +index: int + <static>+values: List<BannerStyle> + <static>+warning: BannerStyle + <static>+info: BannerStyle + <static>+error: BannerStyle - - - - + + + + + - - - AuthScaffold + + + ConstrainedWidthFlexible - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + +minWidth: double + +maxWidth: double + +flex: int + +flexSum: int + +child: Widget + +outerConstraints: BoxConstraints - - - - - - - - - AuthFormKey + + + +Widget build() + -double _getWidth() - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + + + + + + BoxConstraints - - - - - + + + + + - - - PasswordRecoveryForm + + + ActionPopUpMenuButton - - - +formKey: AuthFormKey + + + +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() - - - - + + + - - - FormConsumerRefWidget + + + Axis - - - +Widget build() + + + + + + + + PopupMenuPosition - - - - - + + + + + - - - LoginForm + + + FormControlLabel - - - +formKey: AuthFormKey + + + +formControl: AbstractControl<dynamic> + +text: String + +isClickable: bool + +textStyle: TextStyle? + +onClick: void Function(AbstractControl<dynamic>)? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - SignupForm + + + AbstractControl - - - +formKey: AuthFormKey - - + + + + - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + TextStyle - - - - - + + + - - - PasswordForgotForm + + + void Function(AbstractControl<dynamic>)? - - - +formKey: AuthFormKey - - + + + + + + - - - +Widget build() + + + EmptyBody - - - - - - - - - StudyUJobsToBeDone + + + +icon: IconData? + +leading: Widget? + +leadingSpacing: double? + +title: String? + +description: String? + +button: Widget? - - - +Widget build() + + + +Widget build() - - - - - + + + - - - AuthFormController + + + IconData - - - +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 + + + + + + + + + ActionMenuType - - - -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() + + + +index: int + <static>+values: List<ActionMenuType> + <static>+inline: ActionMenuType + <static>+popup: ActionMenuType - - - - - + + + + + - - - IAuthRepository + + + HelpIcon - - - +allowPasswordReset: bool - +currentUser: User? - +isLoggedIn: bool - +session: Session? + + + +tooltipText: String? - - - - - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() + + + + + +Widget build() - - - + + + + + - - - SharedPreferences + + + StudyULogo - - - - + + + +onTap: void Function()? + + - - - GoRouter + + + +Widget build() - - - - + + + + + - - - EmailTextField + + + SingleColumnLayout - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + <static>+defaultConstraints: BoxConstraints + <static>+defaultConstraintsNarrow: BoxConstraints + +body: Widget + +header: Widget? + +stickyHeader: bool + +constraints: BoxConstraints? + +scroll: bool + +padding: EdgeInsets? + + + + + + <static>+dynamic fromType() - - - - + + + + - - - PasswordTextField + + + SingleColumnLayoutType - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +index: int + <static>+values: List<SingleColumnLayoutType> + <static>+boundedWide: SingleColumnLayoutType + <static>+boundedNarrow: SingleColumnLayoutType + <static>+stretched: SingleColumnLayoutType + <static>+split: SingleColumnLayoutType - - - - + + + + - - - IAppDelegate + + + ISyncIndicatorViewModel - - - +dynamic onAppStart() + + + +isDirty: bool + +lastSynced: DateTime? - - - - - - - - - AppController - - + + + + - - - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + SyncIndicator - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + +state: AsyncValue<T> + +lastSynced: DateTime? + +isDirty: bool + +animationDuration: int + +iconSize: double - - - - - + + + + + - - - InviteCodeFormView + + + TextParagraph - - - +formViewModel: InviteCodeFormViewModel + + + +text: String? + +style: TextStyle? + +selectable: bool + +span: List<TextSpan>? - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + +Widget build() - - - - - + + + + + - - - InviteCodeFormViewModel + + + DismissButton - - - +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>? + + + +onPressed: void Function()? + +text: String? - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + +Widget build() - - - - - - - - FormConsumerWidget - - + + + + + - - - +Widget build() + + + Badge - - - - - - - - - StudyRecruitScreen + + + +icon: IconData? + +color: Color? + +borderRadius: double + +label: String + +type: BadgeType + +padding: EdgeInsets + +iconSize: double? + +labelStyle: TextStyle? - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + +Widget build() + -Color? _getBackgroundColor() + -Color _getBorderColor() + -Color? _getLabelColor() - - - - - - - - - StudyPageWidget - - + + + + - - - +studyId: String + + + BadgeType - - - +Widget? banner() + + + +index: int + <static>+values: List<BadgeType> + <static>+filled: BadgeType + <static>+outlined: BadgeType + <static>+outlineFill: BadgeType + <static>+plain: BadgeType - - - - - - - - - StudyRecruitController - - + + + + - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + Hyperlink - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +text: String + +url: String? + +onClick: void Function()? + +linkColor: Color + +hoverColor: Color? + +visitedColor: Color? + +style: TextStyle? + +hoverStyle: TextStyle? + +visitedStyle: TextStyle? + +icon: IconData? + +iconSize: double? - - - - + + + + - - - IInviteCodeRepository + + + FormScaffold - - - +dynamic isCodeAlreadyUsed() + + + +formViewModel: T + +actions: List<Widget>? + +body: Widget + +drawer: Widget? + +actionsSpacing: double + +actionsPadding: double - - - + + + + - - - StreamSubscription + + + PrimaryButton - - - - - - - - - - StudyBaseController + + + +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 - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? - - + + + + - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + Size - - - + + + + - - - Study + + + UnderConstruction + + + + + + +Widget build() - - - - - + + + + + - - - EnrolledBadge + + + ActionMenuInline - - - +enrolledCount: int + + + +actions: List<ModelAction<dynamic>> + +iconSize: double? + +visible: bool + +splashRadius: double? + +paddingVertical: double? + +paddingHorizontal: double? - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - StudyInvitesTable + + + IconPack - - - +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>+defaultPack: List<IconOption> + <static>+material: List<IconOption> - - - +Widget build() - -List<Widget> _buildRow() + + + <static>+IconOption? resolveIconByName() - - - + + + + + - - - void Function(StudyInvite) + + + IconOption - - - - - - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + +name: String + +icon: IconData? + +isEmpty: bool + +props: List<Object?> - - - - - - - - Intervention? Function(String) + + + +String toJson() + <static>+IconOption fromJson() - - - + + + - - - int Function(StudyInvite) + + + ReactiveIconPicker - - - - - + + + - - - StudyFormViewModel + + + ReactiveFocusableFormField - - - +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() + + + IconPicker - - - - - - - - - IStudyRepository + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +onSelect: void Function(IconOption)? + +galleryIconSize: double? + +selectedIconSize: double? + +focusNode: FocusNode? + +isDisabled: bool - - - +dynamic launch() - +dynamic deleteParticipants() + + + +Widget build() - - - - - + + + - - - StudyInfoFormViewModel + + + void Function(IconOption)? - - - +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() + + + FocusNode - - - - - + + + + + - - - EnrollmentFormViewModel + + + IconPickerField - - - +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()> + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +selectedIconSize: double? + +galleryIconSize: double? + +onSelect: void Function(IconOption)? + +focusNode: FocusNode? + +isDisabled: bool - - - +void setControlsFrom() - +EnrollmentFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() - +dynamic testScreener() - +dynamic testConsent() - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + + + +Widget build() - - - - - + + + + + - - - MeasurementsFormViewModel + + + IconPickerGallery - - - +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> + + + +iconOptions: List<IconOption> + +onSelect: void Function(IconOption)? + +iconSize: double - - - +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() - - - - - + + + + - - - ReportsFormViewModel + + + FormConsumerWidget - - - +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() + + + + + + + + + FormConsumerRefWidget - - - - - - - - - - InterventionsFormViewModel + + + +Widget build() - - - +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 + + + + + + + + + Collapsible - - - +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() + + + +contentBuilder: Widget Function(BuildContext, bool) + +headerBuilder: Widget Function(BuildContext, bool)? + +title: String? + +isCollapsed: bool - - - - + + + - - - ConsentItemFormView + + + Widget Function(BuildContext, bool) - - - +formViewModel: ConsentItemFormViewModel + + + + + + + + Widget Function(BuildContext, bool)? - - - - - + + + + + - - - ConsentItemFormViewModel + + + StandardDialog - - - +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> + + + +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 - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +Widget build() - - - - - + + + + + - - - EnrollmentFormData + + + SecondaryButton - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + +text: String + +icon: IconData? + +isLoading: bool + +onPressed: void Function()? - - - +Study apply() - +EnrollmentFormData copy() + + + +Widget build() - - - + + + + - - - Participation + + + StandardTableColumn + + + + + + +label: String + +tooltip: String? + +columnWidth: TableColumnWidth + +sortable: bool + +sortAscending: bool? + +sortableIcon: Widget? - - - - - + + + - - - QuestionnaireFormData + + + TableColumnWidth - - - +questionsData: List<QuestionFormData>? - +id: String + + + + + + + + + StandardTable - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +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 - - - - + + + - - - IStudyFormData + + + void Function(T) - - - +Study apply() + + + + + + + + List<ModelAction<dynamic>> Function(T, int)? - - - - + + + - - - StudyDesignEnrollmentFormView + + + int Function(T, T)? - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + + + + + + TableRow Function(BuildContext, List<StandardTableColumn>)? - - - - + + + + - - - StudyDesignPageWidget + + + StandardTableStyle - - - +Widget? banner() + + + +index: int + <static>+values: List<StandardTableStyle> + <static>+plain: StandardTableStyle + <static>+material: StandardTableStyle - - - - + + + + - - - IScreenerQuestionLogicFormViewModel + + + TwoColumnLayout - - - +isDirtyOptionsBannerVisible: bool + + + <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 - - - - - + + + - - - ScreenerQuestionLogicFormView + + + VerticalDivider - - - +formViewModel: ScreenerQuestionFormViewModel + + + + + + + + + TabbedNavbar - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + +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? - - - - - + + + - - - ScreenerQuestionFormViewModel + + + BoxDecoration - - - <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() + + + void Function(int, T)? - - - - - + + + - - - QuestionFormViewModel + + + TabBarIndicatorSize - - - <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 + + + + + + + + + FormTableRow - - - +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() + + + +label: String? + +labelBuilder: Widget Function(BuildContext)? + +labelStyle: TextStyle? + +labelHelpText: String? + +input: Widget + +control: AbstractControl<dynamic>? + +layout: FormTableRowLayout? - - - - - + + + - - - EnrollmentFormConsentItemDelegate + + + Widget Function(BuildContext)? - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + + + + + + + FormTableRowLayout - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +index: int + <static>+values: List<FormTableRowLayout> + <static>+vertical: FormTableRowLayout + <static>+horizontal: FormTableRowLayout - - - - - + + + + + - - - WithQuestionnaireControls + + + FormTableLayout - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +rows: List<FormTableRow> + +columnWidths: Map<int, TableColumnWidth> + +rowDivider: Widget? + +rowLayout: FormTableRowLayout? + +rowLabelStyle: TextStyle? - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +Widget build() - - - - - + + + + + - - - ConsentItemFormData + + + FormSectionHeader - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +title: String + +titleTextStyle: TextStyle? + +helpText: String? + +divider: bool + +helpTextDisabled: bool - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +Widget build() - - - - - + + + + + - - - InterventionsFormData + + + FormLabel - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +labelText: String? + +helpText: String? + +labelTextStyle: TextStyle? + +layout: FormTableRowLayout? - - - +Study apply() - +InterventionsFormData copy() + + + +Widget build() - - - - - - - - - StudyScheduleFormData - - + + + + - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + NotificationDispatcher - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +child: Widget? + +snackbarInnerPadding: double + +snackbarWidth: double? + +snackbarBehavior: SnackBarBehavior + +snackbarDefaultDuration: int - - - - - + + + - - - InterventionTaskFormViewModel + + + SnackBarBehavior - - - +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> + + + + + + + + + INotificationService - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + +void showMessage() + +void show() + +Stream<NotificationIntent> watchNotifications() + +void dispose() - - - - - + + + + + - - - WithScheduleControls + + + NotificationService - - - +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>? + + + -_streamController: BehaviorSubject<NotificationIntent> - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +Stream<NotificationIntent> watchNotifications() + +void showMessage() + +void show() + +void dispose() - - - - + + + + + - - - InterventionTaskFormView + + + NotificationIntent - - - +formViewModel: InterventionTaskFormViewModel + + + +message: String? + +customContent: Widget? + +icon: IconData? + +actions: List<NotificationAction>? + +type: NotificationType + + + + + + +void register() - - - + + + + - - - PhaseSequence + + + NotificationType - - - - - + + + +index: int + <static>+values: List<NotificationType> + <static>+snackbar: NotificationType + <static>+alert: NotificationType + <static>+custom: NotificationType + + - - - InterventionFormView + + + + + + + + + NotificationAction - - - +formViewModel: InterventionFormViewModel + + + +label: String + +onSelect: dynamic Function() + +isDestructive: bool - - - - - + + + - - - InterventionFormViewModel + + + dynamic Function() - - - +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> + + + + + + + + + SnackbarIntent - - - +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() + + + +duration: int? - - - - - - - - - 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 + + + AlertIntent - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +title: String + +dismissOnAction: bool + +isDestructive: dynamic - - - - - + + + + - - - InterventionFormData + + + IClipboardService - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + +dynamic copy() - - - +Intervention toIntervention() - +InterventionFormData copy() + + + + + + + + + ClipboardService - - - - - - - - - - StudyScheduleFormView + + + +dynamic copy() - - - +formViewModel: StudyScheduleControls + + + + + + + + + Notifications - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + <static>+passwordReset: SnackbarIntent + <static>+passwordResetSuccess: SnackbarIntent + <static>+studyDeleted: SnackbarIntent + <static>+inviteCodeDeleted: SnackbarIntent + <static>+inviteCodeClipped: SnackbarIntent + <static>+studyDeleteConfirmation: AlertIntent - - - - + + + + - - - StudyDesignInterventionsFormView + + + NotificationDefaultActions - - - +Widget build() + + + <static>+cancel: NotificationAction - - - - - + + + + + - - - InterventionTaskFormData + + + DrawerEntry - - - +taskId: String - +taskTitle: String - +taskDescription: 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? - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +void onClick() - - - - - + + + - - - IFormDataWithSchedule + + + String Function() - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + + + + + + String Function()? - - - +Schedule toSchedule() + + + + + + + + void Function(BuildContext, WidgetRef)? - - - - - + + + + + - - - InterventionPreview + + + GoRouterDrawerEntry - - - +routeArgs: InterventionFormRouteArgs + + + +intent: RoutingIntent - - - +Widget build() + + + +void onClick() - - - - - - - - InterventionFormRouteArgs - - + + + + - - - +interventionId: String + + + AppDrawer - - - - - - - - ConsumerWidget + + + +title: String + +width: int + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - - + + + + + - - - StudyFormValidationSet + + + DashboardController - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController - - - - - - - - - - StudyInfoFormData + + + -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() - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String - - + + + + - - - +Study apply() - +StudyInfoFormData copy() + + + StreamSubscription - - - - - + + + + + - - - StudyContactInfoFormData + + + StudiesTable - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: 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)?> - - - +Study apply() - +StudyInfoFormData copy() + + + +Widget build() + -List<Widget> _buildRow() - - - - - - - - StudyDesignInfoFormView - - + + + - - - +Widget build() + + + void Function(Study) - - - - + + + - - - StudyDesignMeasurementsFormView + + + List<ModelAction<dynamic>> Function(Study) - - - +Widget build() + + + + + + + + int Function(Study, Study) - - - - - + + + + + - - - SurveyPreview + + + DashboardScaffold - - - +routeArgs: MeasurementFormRouteArgs + + + +body: Widget - - - +Widget build() + + + +Widget build() - - - - + + + + - - - MeasurementFormRouteArgs + + + StudiesFilter - - - +measurementId: String + + + +index: int + <static>+values: List<StudiesFilter> - - - - + + + + - - - MeasurementSurveyFormView + + + DashboardScreen - - - +formViewModel: MeasurementSurveyFormViewModel + + + +filter: StudiesFilter? - - - - - - - - - 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> + + + StudyMonitorScreen - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +Widget build() - - - - - + + + + + - - - MeasurementSurveyFormData + + + StudyPageWidget - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +studyId: String - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +Widget? banner() - - - - - + + + + + - - - MeasurementsFormData + + + CustomFormControl - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +Study apply() - +MeasurementsFormData copy() + + + +void dispose() - - - - - - - - - StudyFormScaffold - - + + + + + - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + Debouncer - - - +Widget build() + + + +leading: bool + +cancelUncompleted: bool + -_uncompletedFutureOperation: CancelableOperation<dynamic>? - - - - - - - - T Function(WidgetRef) + + + +dynamic call() - - - - - - - Widget Function(T) + + + + + + + void Function(T?)? - - - + + + - - - StudyUTimeOfDay + + + void Function(ControlStatus)? - - - - - + + + - - - ScheduleControls + + + FormControl - - - +formViewModel: WithScheduleControls - - + + + + - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + FormInvalidException - - - - + + + + - - - SurveyQuestionType + + + FormConfigException - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType + + + +message: String? - - - - - - - - - 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 + + + IFormViewModelDelegate - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +dynamic onSave() + +void onCancel() - - - - - - - - - ChoiceQuestionFormData - - + + + + - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + IFormGroupController - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +form: FormGroup - - - - - + + + - - - BoolQuestionFormData + + + FormGroup - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + + + + + + + FormControlOption - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - - - + + + + + - - - ScaleQuestionFormData + + + FormViewModel - - - +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> + + + -_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>> - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + -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() - - - - + + + + - - - IScaleQuestionFormViewModel + + + FormMode - - - +isMidValuesClearedInfoVisible: bool + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - - + + + - - - ScaleQuestionFormView + + + FormValidationSetEnum - - - +formViewModel: QuestionFormViewModel + + + + + + + + CancelableOperation - - - - - + + + + - - - BoolQuestionFormView + + + ManagedFormViewModel - - - +formViewModel: QuestionFormViewModel + + + +ManagedFormViewModel<T> createDuplicate() - - - +Widget build() + + + + + + + + FormViewModelNotFoundException - - - - - + + + + + - - - ChoiceQuestionFormView + + + FormViewModelCollection - - - +formViewModel: QuestionFormViewModel + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - +Widget build() + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - - - - - - SurveyQuestionFormView - - + + + - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + FormArray - - - - + + + + - - - StudyDesignReportsFormView + + + UnsavedChangesDialog - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +Widget build() - - - - - + + + + + - - - ReportFormItemDelegate + + + IFormData - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +id: String - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +IFormData copy() - - - - - + + + + + - - - ReportItemFormView + + + FormArrayTable - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +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() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - - - + + + - - - ReportItemFormViewModel + + + List<ModelAction<dynamic>> Function(T, int) - - - <static>+defaultSectionType: ReportSectionType - +sectionIdControl: FormControl<String> - +sectionTypeControl: FormControl<ReportSectionType> - +titleControl: FormControl<String> - +descriptionControl: FormControl<String> - +sectionControl: FormControl<ReportSection> - +dataReferenceControl: FormControl<DataReferenceIdentifier<num>> - +temporalAggregationControl: FormControl<TemporalAggregationFormatted> - +improvementDirectionControl: FormControl<ImprovementDirectionFormatted> - +alphaControl: FormControl<double> - -_controlsBySectionType: Map<ReportSectionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsBySectionType: Map<ReportSectionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +sectionBaseControls: Map<String, AbstractControl<dynamic>> - +form: FormGroup - +sectionId: String - +sectionType: ReportSectionType - <static>+sectionTypeControlOptions: List<FormControlOption<ReportSectionType>> - <static>+temporalAggregationControlOptions: List<FormControlOption<TemporalAggregationFormatted>> - <static>+improvementDirectionControlOptions: List<FormControlOption<ImprovementDirectionFormatted>> - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +dataReferenceRequired: dynamic - +aggregationRequired: dynamic - +improvementDirectionRequired: dynamic - +alphaConfidenceRequired: dynamic - - + + + + - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + String Function(T) - - - + + + - - - Widget Function(BuildContext) + + + Widget Function(BuildContext, T, int)? - - - - - - - - - TemporalAggregationFormatted - - + + + + + - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + FormControlValidation - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> - - - - - - - - TemporalAggregation + + + +FormControlValidation merge() - - - - - + + + + + - - - ImprovementDirectionFormatted + + + InviteCodeFormViewModel - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + +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>? - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - + + + + + - - - ImprovementDirection + + + EnrolledBadge - - - - - - - + - - - ReportSectionType + + + +enrolledCount: int - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +Widget build() - - - - - + + + + + - - - DataReferenceIdentifier + + + InviteCodeFormView - - - +hashCode: int + + + +formViewModel: InviteCodeFormViewModel - - - +bool ==() + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - + + + + - - - DataReference + + + StudyRecruitScreen - - - - - - - - - - DataReferenceEditor + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + + + + + + + + StudyRecruitController - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - - - - - - ReactiveDropdownField + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - - + + + + + - - - AverageSectionFormView + + + StudyBaseController - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - +Widget build() + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - - + + + + + - - - LinearRegressionSectionFormView + + + StudyInvitesTable - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +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() - - - - - + + + - - - ReportItemFormData + + + void Function(StudyInvite) - - - +isPrimary: bool - +section: ReportSection - +id: String + + + + + + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + + + + + + Intervention? Function(String) - - - + + + - - - ReportSection + + + int Function(StudyInvite) - - - - - + + + + - - - ReportsFormData + + + AuthScaffold - - - +reportItems: List<ReportItemFormData> - +id: String + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - +Study apply() - +ReportsFormData copy() + + + + + + + + + AuthFormKey + + + + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - - + + + + + - - - ReportStatus + + + SignupForm - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +formKey: AuthFormKey + + + + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - - + + + + + - - - ReportBadge + + + PasswordRecoveryForm - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +formKey: AuthFormKey - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - BadgeType + + + PasswordForgotForm - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType + + + +formKey: AuthFormKey + + + + + + +Widget build() - - - - + + + + + - - - AppStatus + + + AuthFormController - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +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() - - - - + + + + - - - PublishDialog + + + EmailTextField - - - +Widget build() + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - + + + + - - - PublishConfirmationDialog + + + PasswordTextField - - - +Widget build() + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - + + + + - - - PublishSuccessDialog + + + StudyUJobsToBeDone - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - StudyAnalyzeScreen + + + LoginForm - - - +Widget? banner() - +Widget build() + + + +formKey: AuthFormKey + + + + + + +Widget build() - - + + - + StudyAnalyzeController - + +dynamic onExport() - - - - - - - - - StudyParticipationBadge - - + + + + - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool + + + StudyAnalyzeScreen - - - +Widget build() + + + +Widget? banner() + +Widget build() - - - - - - - - - RouteInformation - - + + + + - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + PublishDialog - - - +String toString() + + + +Widget build() - - - - - - - - - PlatformController - - + + + + - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + PublishSuccessDialog - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + +Widget build() - - - - - - - - - WebController - - + + + + - - - +iFrameElement: IFrameElement + + + PublishConfirmationDialog - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +Widget build() - - - + + + - - - IFrameElement + + + App - - - - - - - - MobileController - - + + + - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + AppContent - - + + - + IStudyAppBarViewModel - + +isSyncIndicatorVisible: bool +isStatusBadgeVisible: bool @@ -11806,16 +11802,16 @@ - - + + - + IStudyStatusBadgeViewModel - + +studyParticipation: Participation? +studyStatus: StudyStatus? @@ -11825,16 +11821,16 @@ - - + + - + IStudyNavViewModel - + +isEditTabEnabled: bool +isTestTabEnabled: bool @@ -11848,16 +11844,16 @@ - - + + - + StudyScaffold - + +studyId: String +tabs: List<NavbarTab>? @@ -11876,89 +11872,69 @@ - - - - - - - - NavbarTab - - - - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool - - - - - - - - + + + + - - - SingleColumnLayoutType + + + PreviewFrame - - - +index: int - <static>+values: List<SingleColumnLayoutType> - <static>+boundedWide: SingleColumnLayoutType - <static>+boundedNarrow: SingleColumnLayoutType - <static>+stretched: SingleColumnLayoutType - <static>+split: SingleColumnLayoutType + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - - - + + + + + - - - StudyController + + + StudyParticipationBadge - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +Widget build() + + + + + + + + + + + Participation - + - + StudyStatus @@ -11967,17 +11943,17 @@ - - - + + + - + StudyStatusBadge - + +participation: Participation? +status: StudyStatus? @@ -11987,67 +11963,81 @@ - + +Widget build() - - - - + + + + + - - - StudyTestController + + + FrameControlsWidget - - - +authRepository: IAuthRepository - +languageCode: String + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool + + + + + + +Widget build() - - - - + + + + + - - - TestAppRoutes + + + StudyTestScreen - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + +previewRoute: String? + + + + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - + + - + StudyNav - + <static>+dynamic tabs() <static>+dynamic edit() @@ -12061,16 +12051,16 @@ - - + + - + StudyDesignNav - + <static>+dynamic tabs() <static>+dynamic info() @@ -12082,203 +12072,212 @@ - - - - - - - - StudySettingsDialog - - - - - - +Widget build() - - - - - - - - - + + + + + - - - StudySettingsFormViewModel + + + RouteInformation - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + +String toString() - - - + + + + + - - - AsyncValue + + + PlatformController - - - - - - - - - IWithBanner + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget - - - +Widget? banner() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - - - + + + + + - - - StudyTestScreen + + + WebController - - - +previewRoute: String? + + + +iFrameElement: IFrameElement - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - - - + + + - - - FrameControlsWidget + + + IFrameElement - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + + + + + + + MobileController - - - +Widget build() + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - - + + + + + - - - PreviewFrame + + + StudySettingsFormViewModel - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + +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() - - - - + + + + - - - StudyFormRouteArgs + + + StudySettingsDialog - - - +studyId: String + + + +Widget build() - - - + + + - + WebFrame - + +previewSrc: String +studyId: String - + +Widget build() @@ -12287,16 +12286,16 @@ - - + + - + DisabledFrame - + +Widget build() @@ -12305,17 +12304,17 @@ - - - + + + - + PhoneContainer - + <static>+defaultWidth: double <static>+defaultHeight: double @@ -12329,7 +12328,7 @@ - + +Widget build() @@ -12338,16 +12337,16 @@ - - + + - + MobileFrame - + +Widget build() @@ -12356,3004 +12355,3391 @@ - - + + - + DesktopFrame - + +Widget build() - - - - + + + + - - - StudiesFilter + + + StudyTestController - - - +index: int - <static>+values: List<StudiesFilter> + + + +authRepository: IAuthRepository + +languageCode: String - - - - - + + + + + - - - DashboardScaffold + + + StudyController - - - +body: Widget + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - +Widget build() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - - - + + + + - - - StudiesTable + + + TestAppRoutes - - - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - +Widget build() - -List<Widget> _buildRow() + + + + + + + + + StudyDesignInfoFormView + + + + + + +Widget build() - - - + + + + - - - void Function(Study) + + + StudyDesignPageWidget + + + + + + +Widget? banner() - - - + + + + + - - - List<ModelAction<dynamic>> Function(Study) + + + StudyInfoFormViewModel + + + + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic + + + + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() + + + + + + + + + + + + + StudyInfoFormData + + + + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + + + StudyContactInfoFormData + + + + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() + + + + + + + + + + + + IStudyFormData + + + + + + +Study apply() + + + + + + + + + + + + + StudyFormScaffold + + + + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) + + + + + + +Widget build() + + + + + + + + + + + T Function(WidgetRef) + + + + + + + + + + + + StudyFormValidationSet + + + + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - + + + + - - - DashboardScreen + + + StudyDesignMeasurementsFormView - - - +filter: StudiesFilter? + + + +Widget build() - - - - - + + + + + - - - DashboardController + + + MeasurementsFormViewModel - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + + + +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> - - - -dynamic _subscribeStudies() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +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() - - - - + + + + - - - StudyMonitorScreen + + + IListActionProvider - - - +Widget build() + + + +void onSelectItem() + +void onNewItem() - - - - + + + + - - - AccountSettingsDialog + + + IProviderArgsResolver - - - +Widget build() + + + +R provide() - - - + + + + + - - - App + + + MeasurementsFormData - - - - + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String + + - - - AppContent + + + +Study apply() + +MeasurementsFormData copy() - - - - + + + + + - - - Assets + + + MeasurementSurveyFormViewModel - - - <static>+logoWide: String + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - - - - - - ResultTypes + + + +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() - - - - + + + + + - - - MeasurementResultTypes + + + WithQuestionnaireControls - - - <static>+questionnaire: String - <static>+values: List<String> + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> + + + + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - + + + + + - - - InterventionResultTypes + + + WithScheduleControls - - - <static>+checkmarkTask: String - <static>+values: List<String> + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? + + + + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - - + + + + + - - - StudyExportData + + + MeasurementSurveyFormData - - - +study: Study - +measurementsData: List<Map<String, dynamic>> - +interventionsData: List<Map<String, dynamic>> - +isEmpty: bool + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String + + + + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - + + + + + - - - StudyTemplates + + + QuestionnaireFormData - - - <static>+kUnnamedStudyTitle: String + + + +questionsData: List<QuestionFormData>? + +id: String - - - <static>+Study emptyDraft() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - + + + + + - - - StudyActionType + + + IFormDataWithSchedule + + + + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - +index: int - <static>+values: List<StudyActionType> - <static>+edit: StudyActionType - <static>+duplicate: StudyActionType - <static>+duplicateDraft: StudyActionType - <static>+addCollaborator: StudyActionType - <static>+export: StudyActionType - <static>+delete: StudyActionType + + + +Schedule toSchedule() - - - + + + + + - - - StudyLaunched + + + SurveyPreview - - - - - - - - - ModelEvent + + + +routeArgs: MeasurementFormRouteArgs - - - +modelId: String - +model: T + + + +Widget build() - - - - - - - - - ModelRepository - - + + + + - - - +delegate: IModelRepositoryDelegate<T> - -_allModelsStreamController: BehaviorSubject<List<WrappedModel<T>>> - -_allModelEventsStreamController: BehaviorSubject<ModelEvent<T>> - +modelStreamControllers: Map<String, BehaviorSubject<WrappedModel<T>>> - +modelEventsStreamControllers: Map<String, BehaviorSubject<ModelEvent<T>>> - -_allModels: Map<String, WrappedModel<T>> + + + MeasurementSurveyFormView - - - +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() + + + +formViewModel: MeasurementSurveyFormViewModel - - - - - + + + + + - - - StudyRepository + + + ReportsFormViewModel - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: ProviderRef<dynamic> + + + +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 getKey() - +dynamic deleteParticipants() - +dynamic launch() - +List<ModelAction<dynamic>> availableActions() + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - - + + + + + - - - StudyUApi + + + ReportFormItemDelegate - - - +dynamic saveStudy() - +dynamic fetchStudy() - +dynamic getUserStudies() - +dynamic deleteStudy() - +dynamic saveStudyInvite() - +dynamic fetchStudyInvite() - +dynamic deleteStudyInvite() - +dynamic deleteParticipants() - +dynamic fetchAppConfig() + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - - - - - - ProviderRef + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - + + + + + - - - StudyRepositoryDelegate + + + ReportItemFormView - - - +apiClient: StudyUApi - +authRepository: IAuthRepository + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic onError() - +Study createNewInstance() - +Study createDuplicate() + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - - + + + + + - - - IModelRepositoryDelegate + + + ReportItemFormViewModel - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +T createNewInstance() - +T createDuplicate() - +dynamic onError() + + + <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 - - - - - - - - IsFetched + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - + + + + + - - - IsSaving + + + LinearRegressionSectionFormView - - - - - - - - IsSaved + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - - - IsDeleted + + + +Widget build() - - - - + + + + + - - - IAppRepository + + + DataReferenceIdentifier - - - +dynamic fetchAppConfig() - +void dispose() + + + +hashCode: int - - - - - - - - - - AppRepository + + + +bool ==() - - - +apiClient: StudyUApi - - + + + + - - - +dynamic fetchAppConfig() - +void dispose() + + + DataReference - - - - - + + + + + - - - WrappedModel + + + DataReferenceEditor - - - -_model: T - +asyncValue: AsyncValue<T> - +isLocalOnly: bool - +isDirty: bool - +isDeleted: bool - +lastSaved: DateTime? - +lastFetched: DateTime? - +lastUpdated: DateTime? - +model: T + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +dynamic markWithError() - +dynamic markAsLoading() - +dynamic markAsFetched() - +dynamic markAsSaved() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - + + + - - - ModelRepositoryException + + + ReactiveDropdownField - - - + + + + + - - - ModelNotFoundException + + + TemporalAggregationFormatted - - - - - - - - - IModelRepository + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - +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() + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - + + + - - - APIException + + + TemporalAggregation - - - + + + + + - - - StudyNotFoundException + + + ImprovementDirectionFormatted - - - - + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int + + - - - MeasurementNotFoundException + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - + + + - - - QuestionNotFoundException + + + ImprovementDirection - - - + + + + - - - ConsentItemNotFoundException + + + ReportSectionType - - - - - - - - InterventionNotFoundException + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - + + + + + - - - InterventionTaskNotFoundException + + + AverageSectionFormView - - - - + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + - - - ReportNotFoundException + + + +Widget build() - - - + + + + + - - - ReportSectionNotFoundException + + + ReportItemFormData - - - - + + + +isPrimary: bool + +section: ReportSection + +id: String + + - - - StudyInviteNotFoundException + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - - - + + + - - - StudyUApiClient + + + ReportSection - - - +supabaseClient: SupabaseClient - <static>+studyColumns: List<String> - <static>+studyWithParticipantActivityColumns: List<String> - +testDelayMilliseconds: int - - + + + + + + - - - +dynamic deleteParticipants() - +dynamic getUserStudies() - +dynamic fetchStudy() - +dynamic deleteStudy() - +dynamic saveStudy() - +dynamic fetchStudyInvite() - +dynamic saveStudyInvite() - +dynamic deleteStudyInvite() - +dynamic fetchAppConfig() - -dynamic _awaitGuarded() - -dynamic _apiException() - -dynamic _testDelay() + + + ReportsFormData - - - - + + + +reportItems: List<ReportItemFormData> + +id: String + + - - - SupabaseClient + + + +Study apply() + +ReportsFormData copy() - - - - + + + + - - - SupabaseClientDependant + + + ReportStatus - - - +supabaseClient: SupabaseClient + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - - + + + + - - - SupabaseQueryMixin + + + StudyDesignReportsFormView - - - +dynamic deleteAll() - +dynamic getAll() - +dynamic getById() - +dynamic getByColumn() - +List<T> deserializeList() - +T deserializeObject() + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - + + + + + - - - User + + + ReportBadge - - - - + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool + + - - - Session + + + +Widget build() - - - - - + + + + - - - AuthRepository + + + StudyDesignEnrollmentFormView - - - <static>+PERSIST_SESSION_KEY: String - +supabaseClient: SupabaseClient - +sharedPreferences: SharedPreferences - +allowPasswordReset: bool - +authClient: GoTrueClient - +session: Session? - +currentUser: User? - +isLoggedIn: bool + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - -void _registerAuthListener() - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - -dynamic _persistSession() - -dynamic _resetPersistedSession() - -dynamic _recoverSession() - +void dispose() - +dynamic onAppStart() + + + + + + + + + + ConsentItemFormData - - - - + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String + + - - - GoTrueClient + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - - + + + + + - - - InviteCodeRepository + + + EnrollmentFormData - - - +studyId: String - +ref: ProviderRef<dynamic> - +apiClient: StudyUApi - +authRepository: IAuthRepository - +studyRepository: IStudyRepository - +study: Study + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String - - - +String getKey() - +dynamic isCodeAlreadyUsed() - +List<ModelAction<dynamic>> availableActions() - +dynamic emitUpdate() + + + +Study apply() + +EnrollmentFormData copy() - - - - - + + + + + - - - InviteCodeRepositoryDelegate + + + ConsentItemFormViewModel - - - +study: Study - +apiClient: StudyUApi - +studyRepository: IStudyRepository + + + +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> - - - +dynamic fetch() - +dynamic fetchAll() - +dynamic save() - +dynamic delete() - +dynamic onError() - +StudyInvite createDuplicate() - +StudyInvite createNewInstance() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - - + + + + - - - SupabaseQueryError + + + IScreenerQuestionLogicFormViewModel - - - +statusCode: String? - +message: String - +details: dynamic + + + +isDirtyOptionsBannerVisible: bool - - - - + + + + + - - - GoRouteParamEnum + + + ScreenerQuestionLogicFormView - - - +String toRouteParam() - +String toShortString() + + + +formViewModel: ScreenerQuestionFormViewModel + + + + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - + + + + + - - - RouterKeys + + + ScreenerQuestionFormViewModel - - - <static>+studyKey: ValueKey<String> - <static>+authKey: ValueKey<String> + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool + + + + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - + + + + + - - - ValueKey + + + QuestionFormViewModel - - - - - - - - - RouteParams + + + <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 - - - <static>+studiesFilter: String - <static>+studyId: String - <static>+measurementId: String - <static>+interventionId: String - <static>+testAppRoute: 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() - - - - - + + + + + - - - RouterConf + + + EnrollmentFormViewModel - - - <static>+router: GoRouter - <static>+routes: List<GoRoute> - <static>+publicRoutes: List<GoRoute> - <static>+privateRoutes: List<GoRoute> + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> - - - <static>+GoRoute route() + + + +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() - - - - + + + + + - - - QuestionFormRouteArgs + + + EnrollmentFormConsentItemDelegate - - - +questionId: String + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - - - - - - ScreenerQuestionFormRouteArgs + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - + + + + - - - ConsentItemFormRouteArgs + + + ConsentItemFormView - - - +consentId: String + + + +formViewModel: ConsentItemFormViewModel - - - - + + + - - - SurveyQuestionFormRouteArgs + + + StudyUTimeOfDay - - - +questionId: String + + + + + + + + + + ScheduleControls - - - - - - - - - InterventionTaskFormRouteArgs + + + +formViewModel: WithScheduleControls - - - +taskId: String + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - + + + + - - - ReportItemFormRouteArgs + + + SurveyQuestionType - - - +sectionId: String + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType - - - - + + + + + - - - RoutingIntents + + + ChoiceQuestionFormView - - - <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) + + + +formViewModel: QuestionFormViewModel - - - - - - - - RoutingIntent Function(String) + + + +Widget build() - - - + + + + + - - - RoutingIntent Function(String, String) + + + BoolQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - RoutingIntent Function(String, {String? appRoute}) + + + +Widget build() - - - + + + + - - - RoutingIntent Function(Exception) + + + IScaleQuestionFormViewModel - - - - - - - - GoRoute + + + +isMidValuesClearedInfoVisible: bool - - - - + + + + - - - RoutingIntentDispatch + + + ScaleQuestionFormView - - - +index: int - <static>+values: List<RoutingIntentDispatch> - <static>+go: RoutingIntentDispatch - <static>+push: RoutingIntentDispatch + + + +formViewModel: QuestionFormViewModel - - - + + + + + - - - NullHelperDecoration + + + 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 + + - - - InputDecoration + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - - + + + + + - - - MouseEventsRegion + + + ChoiceQuestionFormData - - - +onTap: void Function()? - +onHover: void Function(PointerHoverEvent)? - +onEnter: void Function(PointerEnterEvent)? - +onExit: void Function(PointerExitEvent)? - +autoselectCursor: bool - +cursor: SystemMouseCursor - <static>+defaultCursor: SystemMouseCursor - +autoCursor: SystemMouseCursor + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> - - - - - - - - void Function(PointerHoverEvent)? + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - void Function(PointerEnterEvent)? + + + BoolQuestionFormData - - - - + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> + + - - - void Function(PointerExitEvent)? + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + + + - - - SystemMouseCursor + + + 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> + + - - - ActionMenuInline + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? + + + + + + + + + SurveyQuestionFormView - - - +Widget build() + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - - + + + + + - - - IconPack + + + StudyFormViewModel - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> + + + +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> - - - <static>+IconOption? resolveIconByName() + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - - - + + + + + - - - IconOption + + + InterventionsFormViewModel - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> + + + +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 - - - +String toJson() - <static>+IconOption fromJson() + + + +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() - - - + + + + + - - - ReactiveIconPicker + + + StudyScheduleControls - - - - - - - - ReactiveFocusableFormField + + + <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 - - - - - - - - - - IconPicker + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool - - + + + + - - - +Widget build() + + + PhaseSequence - - - + + + + - - - void Function(IconOption)? + + + StudyDesignInterventionsFormView - - - - - - - - FocusNode + + + +Widget build() - - - - - + + + + + - - - IconPickerField + + + InterventionFormViewModel - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - - + + + + + - - - IconPickerGallery + + + StudyScheduleFormView - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double + + + +formViewModel: StudyScheduleControls - - - +Widget build() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - - - - - BannerBox - - + + + + + - - - +prefixIcon: Widget? - +body: Widget - +style: BannerStyle - +padding: EdgeInsets? - +noPrefix: bool - +dismissable: bool - +isDismissed: bool? - +onDismissed: dynamic Function()? - +dismissIconSize: double + + + StudyScheduleFormData - - - - - - - - - BannerStyle + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +index: int - <static>+values: List<BannerStyle> - <static>+warning: BannerStyle - <static>+info: BannerStyle - <static>+error: BannerStyle + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - + + + + - - - dynamic Function()? + + + InterventionFormView - - - - - - - - - - Badge + + + +formViewModel: InterventionFormViewModel - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? + + + + + + + + + + InterventionTaskFormData - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - - - - - - TextStyle + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - - - - - - ConstrainedWidthFlexible - - + + + + + - - - +minWidth: double - +maxWidth: double - +flex: int - +flexSum: int - +child: Widget - +outerConstraints: BoxConstraints + + + InterventionPreview - - - +Widget build() - -double _getWidth() + + + +routeArgs: InterventionFormRouteArgs + + + + + + +Widget build() - - - + + + + - - - BoxConstraints + + + InterventionTaskFormView + + + + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - SecondaryButton + + + InterventionTaskFormViewModel - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? + + + +taskIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +taskTitleControl: FormControl<String> + +taskDescriptionControl: FormControl<String> + +markAsCompletedControl: FormControl<bool> + +form: FormGroup + +taskId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - - + + + + + - - - HtmlStylingBanner + + + InterventionsFormData - - - +isDismissed: bool - +onDismissed: dynamic Function()? + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +Widget build() + + + +Study apply() + +InterventionsFormData copy() - - - - + + + + + - - - TabbedNavbar + + + InterventionFormData - - - +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? + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - - - - - - BoxDecoration + + + +Intervention toIntervention() + +InterventionFormData copy() - - - + + + + - - - void Function(int, T)? + + + AccountSettingsDialog - - - - - - - - TabBarIndicatorSize + + + +Widget build() - - - - + + + + - - - ActionMenuType + + + AppStatus - - - +index: int - <static>+values: List<ActionMenuType> - <static>+inline: ActionMenuType - <static>+popup: ActionMenuType + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - - + + + + + - - - FormScaffold + + + AppController - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double + + + +sharedPreferences: SharedPreferences + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic + + + + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - - + + + + + - - - PrimaryButton + + + CombinedStreamNotifier - - - +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 + + + -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + +void dispose() - - - + + + - - - Size + + + ChangeNotifier - - - - - + + + + + - - - SingleColumnLayout + + + Tuple - - - <static>+defaultConstraints: BoxConstraints - <static>+defaultConstraintsNarrow: BoxConstraints - +body: Widget - +header: Widget? - +stickyHeader: bool - +constraints: BoxConstraints? - +scroll: bool - +padding: EdgeInsets? + + + +first: T1 + +second: T2 + +props: List<Object?> - - - <static>+dynamic fromType() + + + +Map<String, dynamic> toJson() + <static>+Tuple<dynamic, dynamic> fromJson() + +Tuple<T1, T2> copy() + +Tuple<T1, T2> copyWith() - - - - + + + + + - - - FormTableRow + + + OptimisticUpdate + + + + + + +applyOptimistic: void Function() + +apply: dynamic Function() + +rollback: void Function() + +onUpdate: void Function()? + +onError: void Function(Object, StackTrace?)? + +rethrowErrors: bool + +runOptimistically: bool + +completeFutureOptimistically: bool - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? + + + +dynamic execute() + -void _runUpdateHandlerIfAny() - - - + + + - - - Widget Function(BuildContext)? + + + void Function() - - - - - - - - FormTableRowLayout - - + + + - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout + + + void Function(Object, StackTrace?)? - - - - - + + + + + - - - FormTableLayout + + + ExecutionLimiter - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? + + + +milliseconds: int + <static>-_timer: Timer? - - - +Widget build() + + + +void dispose() - - - - - + + + - - - FormSectionHeader + + + Timer - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool + + + + + + + + + Throttler - - - +Widget build() + + + +dynamic call() - - - - - - - - - FormLabel - - + + + + - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? + + + FileFormatEncoder - - - +Widget build() + + + +dynamic encodeAsync() + +String encode() + +dynamic call() - - - - + + + + - - - FormSideSheetTab + + + CSVStringEncoder - - - +formViewBuilder: Widget Function(T) + + + +String encode() - - - - + + + + - - - SidesheetTab + + + JsonStringEncoder - - - +builder: Widget Function(BuildContext) + + + +String encode() - - - - + + + + + - - - Sidesheet + + + CountWhereValidator - - - <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)? + + + +predicate: bool Function(T?) + +minCount: int? + +maxCount: int? + <static>+kValidationMessageMinCount: String + <static>+kValidationMessageMaxCount: String - - - - - - - - Widget Function(Widget)? + + + +Map<String, dynamic>? validate() - - - - + + + - - - UnderConstruction + + + bool Function(T?) - - - +Widget build() + + + + + + + + Validator - - - - - + + + + + - - - DismissButton + + + MustMatchValidator - - - +onPressed: void Function()? - +text: String? + + + +control: AbstractControl<dynamic>? + +matchingControl: AbstractControl<dynamic>? - - - +Widget build() + + + +Map<String, dynamic>? validate() - - - - + + + + - - - TwoColumnLayout + + + FieldValidators - - - <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 + + + <static>+String? emailValidator() - - - + + + + - - - VerticalDivider + + + Patterns + + + + + + <static>+timeFormatString: String + <static>+emailFormatString: String + <static>+url: String - - - - - + + + + - - - ErrorPage + + + Time + + + + + + <static>+dynamic fromTimeOfDay() + +Map<String, dynamic> toJson() + <static>+Time fromJson() - - - +error: Exception? - - + + + + - - - +Widget build() + + + TimeOfDay - - - - + + + + - - - SplashPage + + + TimeValueAccessor - - - +Widget build() + + + +String modelToViewValue() + +Time? viewToModelValue() + -String _addLeadingZeroIfNeeded() - - - - - - - - Hyperlink - - + + + - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? + + + ControlValueAccessor - - - - - + + + + + - - - StandardDialog + + + NumericalRangeFormatter - - - +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 + + + +min: int? + +max: int? - - - +Widget build() + + + +TextEditingValue formatEditUpdate() - - - - - + + + - - - StudyULogo + + + TextInputFormatter - - - +onTap: void Function()? + + + + + + + + + StudySequenceFormatter - - - +Widget build() + + + +TextEditingValue formatEditUpdate() - - - - - + + + + + - - - HelpIcon + + + JsonFileLoader - - - +tooltipText: String? + + + +jsonAssetsPath: String - - - +Widget build() + + + +dynamic loadJson() + +dynamic parseJsonMapFromAssets() + +dynamic parseJsonListFromAssets() - - - - - - - - - EmptyBody - - + + + + - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? + + + ModelAction - - - +Widget build() + + + +type: T + +label: String + +icon: IconData? + +onExecute: Function + +isAvailable: bool + +isDestructive: bool - - - + + + + - - - ReactiveCustomColorPicker + + + ModelActionType - - - - - - - - ReactiveFormField + + + +index: int + <static>+values: List<ModelActionType> + <static>+edit: ModelActionType + <static>+delete: ModelActionType + <static>+remove: ModelActionType + <static>+duplicate: ModelActionType + <static>+clipboard: ModelActionType + <static>+primary: ModelActionType - - - - - + + + + + - - - TextParagraph + + + SuppressedBehaviorSubject - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? + + + +subject: BehaviorSubject<T> + +didSuppressInitialEvent: bool + -_controller: StreamController<T> - - - +Widget build() + + + -StreamController<T> _buildDerivedController() + +dynamic close() - - - - - + + + - - - FormControlLabel + + + StreamController - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? - - + + + + + - - - +Widget build() + + + SerializableColor - - - - - - - - void Function(AbstractControl<dynamic>)? + + + +Map<String, dynamic> toJson() + <static>+SerializableColor fromJson() - - - - + + + + + - - - StandardTableColumn + + + StudyUException - - - +label: String - +tooltip: String? - +columnWidth: TableColumnWidth + + + +message: String - - - - - - - - TableColumnWidth + + + +String toString() - - - - + + + + - - - StandardTable + + + DropdownMenuItemTheme - - - +items: List<T> - +columns: List<StandardTableColumn> - +onSelectItem: void Function(T) - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? - +trailingActionsMenuType: ActionMenuType? - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +trailingActionsColumn: 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 + + + +iconTheme: IconThemeData? - - - + + + - - - List<ModelAction<dynamic>> Function(T, int)? + + + IconThemeData - - - + + + - - - TableRow Function(BuildContext, List<StandardTableColumn>)? + + + Diagnosticable - - - - + + + + + - - - StandardTableStyle + + + ThemeConfig - - - +index: int - <static>+values: List<StandardTableStyle> - <static>+plain: StandardTableStyle - <static>+material: StandardTableStyle + + + <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() - - - - + + + + - - - Collapsible + + + NoAnimationPageTransitionsBuilder - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool + + + +Widget buildTransitions() - - - + + + - - - Widget Function(BuildContext, bool) + + + PageTransitionsBuilder - - - + + + + - - - Widget Function(BuildContext, bool)? + + + WebTransitionBuilder + + + + + + +Widget buildTransitions() - - - - + + + + - - - ISyncIndicatorViewModel + + + ThemeSettingChange - - - +isDirty: bool - +lastSynced: DateTime? + + + +settings: ThemeSettings - - - - + + + + - - - SyncIndicator + + + ThemeSettings - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double + + + +sourceColor: Color + +themeMode: ThemeMode - - - - - + + + - - - ActionPopUpMenuButton + + + Notification - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition + + + + + + + + + + ThemeProvider - - - +Widget build() - -Widget _buildPopupMenu() + + + +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() - - - + + + - - - Axis + + + ValueNotifier - - - + + + - - - PopupMenuPosition + + + ColorScheme - - - - - + + + - - - AsyncValueWidget + + + PageTransitionsTheme - - - +value: AsyncValue<T> - +data: Widget Function(T) - +error: Widget Function(Object, StackTrace?)? - +loading: Widget Function()? - +empty: Widget Function()? + + + + + + + + ShapeBorder - - - +Widget build() - -Widget _buildDataOrEmptyWidget() - -Widget _defaultError() - -Widget _defaultLoad() + + + + + + + + InheritedWidget - - - + + + - - - Widget Function(Object, StackTrace?)? + + + ThemeMode - - - + + + + + - - - Widget Function()? + + + CustomColor + + + + + + +name: String + +color: Color + +blend: bool + + + + + + +Color value() diff --git a/docs/uml/designer_v2/lib/utils/uml.svg b/docs/uml/designer_v2/lib/utils/uml.svg index 5bf614ecf..265b70913 100644 --- a/docs/uml/designer_v2/lib/utils/uml.svg +++ b/docs/uml/designer_v2/lib/utils/uml.svg @@ -1,5 +1,98 @@ - - [CountWhereValidator + + [CombinedStreamNotifier + | + -_subscriptions: List<StreamSubscription<dynamic>> + | + +void dispose() + ] + + [ChangeNotifier]<:-[CombinedStreamNotifier] + + [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] + + [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; + <static>-_timer: Timer? + | + +void dispose() + ] + + [<abstract>ExecutionLimiter]o-[Timer] + + [Debouncer + | + +leading: bool; + +cancelUncompleted: bool; + -_uncompletedFutureOperation: CancelableOperation<dynamic>? + | + +dynamic call() + ] + + [Debouncer]o-[CancelableOperation] + [<abstract>ExecutionLimiter]<:-[Debouncer] + + [Throttler + | + +dynamic call() + ] + + [<abstract>ExecutionLimiter]<:-[Throttler] + + [<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?; @@ -54,14 +147,36 @@ [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - [CombinedStreamNotifier + [NumericalRangeFormatter | - -_subscriptions: List<StreamSubscription<dynamic>> + +min: int?; + +max: int? | - +void dispose() + +TextEditingValue formatEditUpdate() ] - [ChangeNotifier]<:-[CombinedStreamNotifier] + [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] + + [StudySequenceFormatter + | + +TextEditingValue formatEditUpdate() + ] + + [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] + + [<abstract>IProviderArgsResolver + | + +R provide() + ] + + [<abstract>JsonFileLoader + | + +jsonAssetsPath: String + | + +dynamic loadJson(); + +dynamic parseJsonMapFromAssets(); + +dynamic parseJsonListFromAssets() + ] [ModelAction | @@ -103,108 +218,6 @@ [ModelActionType]o-[ModelActionType] [Enum]<:--[ModelActionType] - [StudyUException - | - +message: String - | - +String toString() - ] - - [Exception]<:--[StudyUException] - - [<abstract>ExecutionLimiter - | - +milliseconds: int; - <static>-_timer: Timer? - | - +void dispose() - ] - - [<abstract>ExecutionLimiter]o-[Timer] - - [Debouncer - | - +leading: bool; - +cancelUncompleted: bool; - -_uncompletedFutureOperation: CancelableOperation<dynamic>? - | - +dynamic call() - ] - - [Debouncer]o-[CancelableOperation] - [<abstract>ExecutionLimiter]<:-[Debouncer] - - [Throttler - | - +dynamic call() - ] - - [<abstract>ExecutionLimiter]<:-[Throttler] - - [<abstract>JsonFileLoader - | - +jsonAssetsPath: String - | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() - ] - - [<abstract>FileFormatEncoder - | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() - ] - - [CSVStringEncoder - | - +String encode() - ] - - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - - [JsonStringEncoder - | - +String encode() - ] - - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] - - [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?)?] - - [Tuple - | - +first: T1; - +second: T2; - +props: List<Object?> - | - +Map<String, dynamic> toJson(); - <static>+Tuple<dynamic, dynamic> fromJson(); - +Tuple<T1, T2> copy(); - +Tuple<T1, T2> copyWith() - ] - - [<abstract>Equatable]<:-[Tuple] - [SuppressedBehaviorSubject | +subject: BehaviorSubject<T>; @@ -218,23 +231,6 @@ [SuppressedBehaviorSubject]o-[BehaviorSubject] [SuppressedBehaviorSubject]o-[StreamController] - [NumericalRangeFormatter - | - +min: int?; - +max: int? - | - +TextEditingValue formatEditUpdate() - ] - - [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] - - [StudySequenceFormatter - | - +TextEditingValue formatEditUpdate() - ] - - [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - [SerializableColor | +Map<String, dynamic> toJson(); @@ -243,116 +239,423 @@ [Color]<:-[SerializableColor] - [<abstract>IProviderArgsResolver + [StudyUException | - +R provide() + +message: String + | + +String toString() ] + [Exception]<:--[StudyUException] + - + - + - + + + + + - + - - - + - + - - - - - - - - - + - + - - - + - + - - + + + - - - + + + + + + + + + + + + + + + - - + + + - + - + + + + + + + + + + + - + + + + + + + + + + - - - - - - - - - + + - + + + + + + + + + + + + + + + + + + + + + CombinedStreamNotifier + + + + + + -_subscriptions: List<StreamSubscription<dynamic>> + + + + + + +void dispose() + + + + + + + + + + + ChangeNotifier + + + + + + + + + + + + + Tuple + + + + + + +first: T1 + +second: T2 + +props: List<Object?> + + + + + + +Map<String, dynamic> toJson() + <static>+Tuple<dynamic, dynamic> fromJson() + +Tuple<T1, T2> copy() + +Tuple<T1, T2> copyWith() + + + + + + + + + + + Equatable + + + + + + + + + + + + + OptimisticUpdate + + + + + + +applyOptimistic: void Function() + +apply: dynamic Function() + +rollback: void Function() + +onUpdate: void Function()? + +onError: void Function(Object, StackTrace?)? + +rethrowErrors: bool + +runOptimistically: bool + +completeFutureOptimistically: bool + + + + + + +dynamic execute() + -void _runUpdateHandlerIfAny() + + + + + + + + + + + void Function() + + + + + + + + + + + dynamic Function() + + + + + + + + + + + void Function()? + + + + + + + + + + + void Function(Object, StackTrace?)? + + + + + + + + + + + + + ExecutionLimiter + + + + + + +milliseconds: int + <static>-_timer: Timer? + + + + + + +void dispose() + + + + + + + + + + + Timer + + + + + + + + + + + + + Debouncer + + + + + + +leading: bool + +cancelUncompleted: bool + -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + + + + +dynamic call() + + + - - - + + + + + + + CancelableOperation + + + - - - + + + + + + + + Throttler + + + + + + +dynamic call() + + + - - - + + + + + + + + FileFormatEncoder + + + + + + +dynamic encodeAsync() + +String encode() + +dynamic call() + + + - - - - - + + + + + + + + CSVStringEncoder + + + + + + +String encode() + + + - - - + + + + + + + + JsonStringEncoder + + + + + + +String encode() + + + - - - - - - - - - + + + - + CountWhereValidator - + +predicate: bool Function(T?) +minCount: int? @@ -362,7 +665,7 @@ - + +Map<String, dynamic>? validate() @@ -371,9 +674,9 @@ - + - + bool Function(T?) @@ -382,9 +685,9 @@ - + - + Validator @@ -393,24 +696,24 @@ - - - + + + - + MustMatchValidator - + +control: AbstractControl<dynamic>? +matchingControl: AbstractControl<dynamic>? - + +Map<String, dynamic>? validate() @@ -419,9 +722,9 @@ - + - + AbstractControl @@ -430,16 +733,16 @@ - - + + - + FieldValidators - + <static>+String? emailValidator() @@ -448,16 +751,16 @@ - - + + - + Patterns - + <static>+timeFormatString: String <static>+emailFormatString: String @@ -468,16 +771,16 @@ - - + + - + Time - + <static>+dynamic fromTimeOfDay() +Map<String, dynamic> toJson() @@ -488,9 +791,9 @@ - + - + TimeOfDay @@ -499,16 +802,16 @@ - - + + - + TimeValueAccessor - + +String modelToViewValue() +Time? viewToModelValue() @@ -519,306 +822,107 @@ - + - + ControlValueAccessor - - - - - - - - - CombinedStreamNotifier - - - - - - -_subscriptions: List<StreamSubscription<dynamic>> - - - - - - +void dispose() - - - - - - - - - - - ChangeNotifier - - - - - - - - - - - - ModelAction - - - - - - +type: T - +label: String - +icon: IconData? - +onExecute: Function - +isAvailable: bool - +isDestructive: bool - - - - - - - - - - - IconData - - - - - - - - - - - - IModelActionProvider - - - - - - +List<ModelAction<dynamic>> availableActions() - - - - - - - - - - - - IListActionProvider - - - - - - +void onSelectItem() - +void onNewItem() - - - - - - - - - - - - ModelActionType - - - - - - +index: int - <static>+values: List<ModelActionType> - <static>+edit: ModelActionType - <static>+delete: ModelActionType - <static>+remove: ModelActionType - <static>+duplicate: ModelActionType - <static>+clipboard: ModelActionType - <static>+primary: ModelActionType - - - - - - - - - - - Enum - - - - - - - - - - - - - StudyUException - - - - - - +message: String - - - - - - +String toString() - - - - - - - - - - - Exception - - - - - - - - - - - - - ExecutionLimiter - - - - - - +milliseconds: int - <static>-_timer: Timer? - - - - - - +void dispose() - - - - - - - + + + + + - - - Timer + + + NumericalRangeFormatter - - - - - - - - - - Debouncer + + + +min: int? + +max: int? - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + +TextEditingValue formatEditUpdate() - - - +dynamic call() + + + + + + + + TextInputFormatter - - - + + + + - - - CancelableOperation + + + StudySequenceFormatter + + + + + + +TextEditingValue formatEditUpdate() - - - - + + + + - - - Throttler + + + IProviderArgsResolver - - - +dynamic call() + + + +R provide() - - - + + + - + JsonFileLoader - + +jsonAssetsPath: String - + +dynamic loadJson() +dynamic parseJsonMapFromAssets() @@ -827,193 +931,126 @@ - - - - - - - - FileFormatEncoder - - - - - - +dynamic encodeAsync() - +String encode() - +dynamic call() - - - - - - - - - - - - CSVStringEncoder - - - - - - +String encode() - - - - - - - - + + + + - - - JsonStringEncoder + + + ModelAction - - - +String encode() + + + +type: T + +label: String + +icon: IconData? + +onExecute: Function + +isAvailable: bool + +isDestructive: bool - - - - - - - - - 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() + + + IconData - - - + + + + - - - void Function() + + + IModelActionProvider - - - - - - - - dynamic Function() + + + +List<ModelAction<dynamic>> availableActions() - - - + + + + - - - void Function()? + + + IListActionProvider - - - - - - - - void Function(Object, StackTrace?)? + + + +void onSelectItem() + +void onNewItem() - - - - - - - - - Tuple - - + + + + - - - +first: T1 - +second: T2 - +props: List<Object?> + + + ModelActionType - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() + + + +index: int + <static>+values: List<ModelActionType> + <static>+edit: ModelActionType + <static>+delete: ModelActionType + <static>+remove: ModelActionType + <static>+duplicate: ModelActionType + <static>+clipboard: ModelActionType + <static>+primary: ModelActionType - - - + + + - - - Equatable + + + Enum - - - + + + - + SuppressedBehaviorSubject - + +subject: BehaviorSubject<T> +didSuppressInitialEvent: bool @@ -1021,7 +1058,7 @@ - + -StreamController<T> _buildDerivedController() +dynamic close() @@ -1031,9 +1068,9 @@ - + - + BehaviorSubject @@ -1042,82 +1079,27 @@ - + - + StreamController - - - - - - - - - NumericalRangeFormatter - - - - - - +min: int? - +max: int? - - - - - - +TextEditingValue formatEditUpdate() - - - - - - - - - - - TextInputFormatter - - - - - - - - - - - - StudySequenceFormatter - - - - - - +TextEditingValue formatEditUpdate() - - - - - - + + - + SerializableColor - + +Map<String, dynamic> toJson() <static>+SerializableColor fromJson() @@ -1127,29 +1109,47 @@ - + - + Color - - - - + + + + + - - - IProviderArgsResolver + + + StudyUException - - - +R provide() + + + +message: String + + + + + + +String toString() + + + + + + + + + + + Exception