From 00e0b1e60e368d1e3620eec61924ff17a098f386 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Wed, 6 Mar 2024 12:59:08 +0100 Subject: [PATCH 01/14] fix: temporarily disable free text for the designer --- .../shared/questionnaire/question/types/question_type.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_v2/lib/features/design/shared/questionnaire/question/types/question_type.dart b/designer_v2/lib/features/design/shared/questionnaire/question/types/question_type.dart index a77acb930..c1d3d7945 100644 --- a/designer_v2/lib/features/design/shared/questionnaire/question/types/question_type.dart +++ b/designer_v2/lib/features/design/shared/questionnaire/question/types/question_type.dart @@ -15,7 +15,7 @@ enum SurveyQuestionType { ScaleQuestion.questionType: SurveyQuestionType.scale, AnnotatedScaleQuestion.questionType: SurveyQuestionType.scale, VisualAnalogueQuestion.questionType: SurveyQuestionType.scale, - FreeTextQuestion.questionType: SurveyQuestionType.freeText, + // FreeTextQuestion.questionType: SurveyQuestionType.freeText, }; if (!typeMapping.containsKey(question.type)) { throw UnimplementedError("Missing SurveyQuestionType for question of type: ${question.type}"); From 053e85f80f9a78100f679c21c334dbfd98ac3155 Mon Sep 17 00:00:00 2001 From: StudyU Documenter Date: Wed, 6 Mar 2024 14:21:29 +0000 Subject: [PATCH 02/14] docs: update UML documentation --- .../questionnaire/question/types/uml.svg | 186 +- .../shared/questionnaire/question/uml.svg | 806 +- .../design/shared/questionnaire/uml.svg | 1004 +- .../lib/features/design/shared/uml.svg | 1156 +- .../designer_v2/lib/features/design/uml.svg | 6198 ++++----- docs/uml/designer_v2/lib/features/uml.svg | 10712 ++++++++-------- 6 files changed, 10031 insertions(+), 10031 deletions(-) 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 52be35c24..7eb253576 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 @@ -12,6 +12,19 @@ [SurveyQuestionType]o-[SurveyQuestionType] [Enum]<:--[SurveyQuestionType] + [FreeTextQuestionFormView + | + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic + | + +Widget build(); + +Widget disableOnReadonly(); + +Widget generateRow() + ] + + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [<abstract>IScaleQuestionFormViewModel | +isMidValuesClearedInfoVisible: bool @@ -44,19 +57,6 @@ [BoolQuestionFormView]o-[QuestionFormViewModel] [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic - | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() - ] - - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - @@ -73,27 +73,27 @@ - + - + - + + + - + - - - + - + - + - + @@ -129,18 +129,68 @@ + + + + + + + + + FreeTextQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic + + + + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() + + + + + + + + + + + QuestionFormViewModel + + + + + + + + + + + ConsumerWidget + + + + - - + + - + IScaleQuestionFormViewModel - + +isMidValuesClearedInfoVisible: bool @@ -149,122 +199,72 @@ - - + + - + ScaleQuestionFormView - + +formViewModel: QuestionFormViewModel - - - - - - - QuestionFormViewModel - - - - - - - + + + - + ChoiceQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() - - - - - - - ConsumerWidget - - - - - - - + + + - + BoolQuestionFormView - + +formViewModel: QuestionFormViewModel - + +Widget build() - - - - - - - - - FreeTextQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - - - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() - - - - 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 2c5540422..555c9eab5 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,71 +1,5 @@ - - [SurveyQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic - | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() - ] - - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - - [<abstract>QuestionFormData + + [<abstract>QuestionFormData | <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; +questionId: String; @@ -240,51 +174,83 @@ [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [SurveyQuestionFormView + | + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool + ] + + [SurveyQuestionFormView]o-[QuestionFormViewModel] + + [SurveyQuestionType + | + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType; + <static>+freeText: SurveyQuestionType + ] + + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] + + [FreeTextQuestionFormView + | + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic + | + +Widget build(); + +Widget disableOnReadonly(); + +Widget generateRow() + ] + + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + + [<abstract>IScaleQuestionFormViewModel + | + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView + | + +formViewModel: QuestionFormViewModel + ] + + [ScaleQuestionFormView]o-[QuestionFormViewModel] + + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -306,310 +272,66 @@ - + - + - + - + - + - + - + - + - - + + - - - - - - - - - - - SurveyQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool - - - - - - - - - - - - - QuestionFormViewModel - - - - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - - - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() - - - - - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType - - - - - - - - - - - Enum - - - + - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - - - - - - - - - ConsumerWidget - - - + + + + - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() - - - + + + - - - - - - - - - FreeTextQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - - - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() - - - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -646,6 +368,29 @@ + + + + + + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+freeText: SurveyQuestionType + + + + @@ -805,6 +550,106 @@ + + + + + + + + + QuestionFormViewModel + + + + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool + + + + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() + + + + @@ -818,9 +663,9 @@ - + - + FormArray @@ -829,9 +674,9 @@ - + - + AbstractControl @@ -840,9 +685,9 @@ - + - + FormGroup @@ -851,9 +696,9 @@ - + - + ManagedFormViewModel @@ -862,15 +707,170 @@ - + - + IListActionProvider + + + + + + + + SurveyQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool + + + + + + + + + + + Enum + + + + + + + + + + + + + FreeTextQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic + + + + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() + + + + + + + + + + + ConsumerWidget + + + + + + + + + + + + IScaleQuestionFormViewModel + + + + + + +isMidValuesClearedInfoVisible: bool + + + + + + + + + + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + + BoolQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + 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 5f93d2a6b..b4f17f3a1 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,69 +1,26 @@ - - [SurveyQuestionFormView + + [<abstract>WithQuestionnaireControls | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [ChoiceQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - - [FreeTextQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] [<abstract>QuestionFormData | @@ -240,28 +197,71 @@ [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [<abstract>WithQuestionnaireControls + [SurveyQuestionFormView | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool + ] + + [SurveyQuestionFormView]o-[QuestionFormViewModel] + + [SurveyQuestionType | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType; + <static>+freeText: SurveyQuestionType ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] + + [FreeTextQuestionFormView + | + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic + | + +Widget build(); + +Widget disableOnReadonly(); + +Widget generateRow() + ] + + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + + [<abstract>IScaleQuestionFormViewModel + | + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView + | + +formViewModel: QuestionFormViewModel + ] + + [ScaleQuestionFormView]o-[QuestionFormViewModel] + + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] [QuestionnaireFormData | @@ -279,405 +279,207 @@ - + - + - + - + - + - + - - - - + + + - + + - + - - - - - + + - - - + + + + + + - + - - - + + + - - - - + - - - - - - + + + - + - - - + - + - - - + - + - + - + - + - + - + + + + + + + - + - + - + - - - + - - + + - + - + + + - + - - + + + - - - + + + + + - + + - + - - - - - + + + + + + - - - SurveyQuestionFormView + + + WithQuestionnaireControls - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> + + + + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - - + + + - - - QuestionFormViewModel - - - - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - - - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() - - - - - - - - - - - - SurveyQuestionType - - - - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType - - - - - - - - - - - Enum - - - - - - - - - - - - IScaleQuestionFormViewModel - - - - - - +isMidValuesClearedInfoVisible: bool - - - - - - - - - - - - ScaleQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - - - - - +Widget build() + + + FormArray - - - + + + - - - ConsumerWidget + + + FormViewModelCollection - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + IFormViewModelDelegate - - - - - - - - - FreeTextQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - + + + - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + IProviderArgsResolver - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -690,7 +492,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -701,11 +503,34 @@ + + + + + + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+freeText: SurveyQuestionType + + + + - + - + IFormData @@ -714,17 +539,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -732,7 +557,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -744,24 +569,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -772,17 +597,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -799,7 +624,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -810,9 +635,9 @@ - + - + Color @@ -821,17 +646,17 @@ - - - + + + - + FreeTextQuestionFormData - + +textLengthRange: List<int> +textType: FreeTextQuestionType @@ -840,7 +665,7 @@ - + +Question<dynamic> toQuestion() +FreeTextQuestionFormData copy() @@ -851,42 +676,131 @@ - + - + FreeTextQuestionType - - - + + + + + - - - FormControl + + + QuestionFormViewModel + + + + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool + + + + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - + + + - - - FormArray + + + FormControl - + - + AbstractControl @@ -895,9 +809,9 @@ - + - + FormGroup @@ -906,9 +820,9 @@ - + - + ManagedFormViewModel @@ -917,104 +831,190 @@ - + - + IListActionProvider - - - - - + + + + - - - WithQuestionnaireControls + + + SurveyQuestionFormView - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + + + + + + Enum - - - + + + + + - - - FormViewModelCollection + + + FreeTextQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic + + + + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() - - - + + + - - - IFormViewModelDelegate + + + ConsumerWidget - - - + + + + - - - IProviderArgsResolver + + + IScaleQuestionFormViewModel + + + + + + +isMidValuesClearedInfoVisible: bool + + + + + + + + + + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + + BoolQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() - - - + + + - + QuestionnaireFormData - + +questionsData: List<QuestionFormData>? +id: String - + +StudyUQuestionnaire toQuestionnaire() +List<EligibilityCriterion> toEligibilityCriteria() 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 17f4e28a3..09e4b149b 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/uml.svg @@ -1,31 +1,5 @@ - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? - | - +Schedule toSchedule() - ] - - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - - [ScheduleControls - | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() - ] - - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] - - [<abstract>WithScheduleControls + + [<abstract>WithScheduleControls | +isTimeRestrictedControl: FormControl<bool>; +instanceID: FormControl<String>; @@ -49,71 +23,54 @@ [<abstract>WithScheduleControls]o-[FormControl] [<abstract>WithScheduleControls]o-[StreamSubscription] - [SurveyQuestionFormView - | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType - | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] - - [<abstract>IScaleQuestionFormViewModel - | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel - ] - - [ScaleQuestionFormView]o-[QuestionFormViewModel] - - [ChoiceQuestionFormView + [<abstract>IFormDataWithSchedule | - +formViewModel: QuestionFormViewModel + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? | - +Widget build() + +Schedule toSchedule() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [BoolQuestionFormView + [ScheduleControls | - +formViewModel: QuestionFormViewModel + +formViewModel: WithScheduleControls | - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [FreeTextQuestionFormView + [<abstract>WithQuestionnaireControls | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] [<abstract>QuestionFormData | @@ -290,28 +247,71 @@ [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [<abstract>WithQuestionnaireControls + [SurveyQuestionFormView | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool + ] + + [SurveyQuestionFormView]o-[QuestionFormViewModel] + + [SurveyQuestionType | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType; + <static>+freeText: SurveyQuestionType ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] + + [FreeTextQuestionFormView + | + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic + | + +Widget build(); + +Widget disableOnReadonly(); + +Widget generateRow() + ] + + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + + [<abstract>IScaleQuestionFormViewModel + | + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView + | + +formViewModel: QuestionFormViewModel + ] + + [ScaleQuestionFormView]o-[QuestionFormViewModel] + + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] [QuestionnaireFormData | @@ -329,269 +329,180 @@ - + - - - - - - - - - - - - - - - + - + - + - + - - - - - + - + - + - - + + - + - + + + - + - - - + - + - - - - - + + + + + + - - - + + - + - + - - - - - + + + + + - - + + - - - + + + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - - - + + + + + + + + + + - + + + + + + + + + + + + - + - - - - - - + + + + + + - - - IFormDataWithSchedule + + + WithScheduleControls - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + +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>? - - - +Schedule toSchedule() - - - - - - - - - - - StudyUTimeOfDay - - - - - - - - - - - IFormData - - - - - - - - - - - - - ScheduleControls - - - - - - +formViewModel: WithScheduleControls - - - - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() - - - - - - - - - - - - - WithScheduleControls - - - - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? - - - - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() - - - - - - - - - - - FormConsumerWidget + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - + - + FormControl @@ -600,306 +511,197 @@ - + - + StreamSubscription - - - - + + + + + - - - SurveyQuestionFormView + + + IFormDataWithSchedule - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - - - - - - - - QuestionFormViewModel + + + +Schedule toSchedule() - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool - - + + + + - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + StudyUTimeOfDay - - - - - - - - SurveyQuestionType - - + + + - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + IFormData - - - + + + + + - - - Enum + + + ScheduleControls - - - - - - - - - IScaleQuestionFormViewModel + + + +formViewModel: WithScheduleControls - - - +isMidValuesClearedInfoVisible: bool + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - - - - - ScaleQuestionFormView - - + + + - - - +formViewModel: QuestionFormViewModel + + + FormConsumerWidget - - - - - + + + + + - - - ChoiceQuestionFormView + + + WithQuestionnaireControls - - - +formViewModel: QuestionFormViewModel + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +Widget build() + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - + + + - - - ConsumerWidget + + + FormArray - - - - - - - - - BoolQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + FormViewModelCollection - - - - - + + + - - - FreeTextQuestionFormView + + + IFormViewModelDelegate - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - + + + + - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + IProviderArgsResolver - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -912,7 +714,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -923,6 +725,29 @@ + + + + + + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+freeText: SurveyQuestionType + + + + @@ -1071,22 +896,111 @@ - - - + + + + + - - - FormArray + + + QuestionFormViewModel + + + + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool + + + + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - + - + AbstractControl @@ -1095,9 +1009,9 @@ - + - + FormGroup @@ -1106,9 +1020,9 @@ - + - + ManagedFormViewModel @@ -1117,104 +1031,190 @@ - + - + IListActionProvider - - - - - + + + + - - - WithQuestionnaireControls + + + SurveyQuestionFormView - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + + + + + + Enum - - - + + + + + - - - FormViewModelCollection + + + FreeTextQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic + + + + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() - - - + + + - - - IFormViewModelDelegate + + + ConsumerWidget - - - + + + + - - - IProviderArgsResolver + + + IScaleQuestionFormViewModel + + + + + + +isMidValuesClearedInfoVisible: bool + + + + + + + + + + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + + BoolQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() - - - + + + - + QuestionnaireFormData - + +questionsData: List<QuestionFormData>? +id: String - + +StudyUQuestionnaire toQuestionnaire() +List<EligibilityCriterion> toEligibilityCriteria() diff --git a/docs/uml/designer_v2/lib/features/design/uml.svg b/docs/uml/designer_v2/lib/features/design/uml.svg index 0da76c349..efdc2e95e 100644 --- a/docs/uml/designer_v2/lib/features/design/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/uml.svg @@ -1,558 +1,427 @@ - - [MeasurementsFormData + + [StudyInfoFormData | - +surveyMeasurements: List<MeasurementSurveyFormData>; + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; +id: String | +Study apply(); - +MeasurementsFormData copy() + +StudyInfoFormData copy() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [SurveyPreview + [StudyContactInfoFormData | - +routeArgs: MeasurementFormRouteArgs + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String | - +Widget build() + +Study apply(); + +StudyInfoFormData copy() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [MeasurementSurveyFormData - | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String + [StudyDesignInfoFormView | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +Widget build() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [MeasurementSurveyFormViewModel + [StudyInfoFormViewModel | +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: 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>; +form: FormGroup; - +measurementId: String; - +instanceId: String; + +titles: Map<FormMode, String>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic | +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() + +StudyInfoFormData buildFormData() ] - [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] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [MeasurementSurveyFormView + [<abstract>WithScheduleControls | - +formViewModel: MeasurementSurveyFormViewModel + +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() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [StudyDesignMeasurementsFormView + [<abstract>IFormDataWithSchedule | - +Widget build() + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? + | + +Schedule toSchedule() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [MeasurementsFormViewModel + [ScheduleControls | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; - +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> + +formViewModel: WithScheduleControls | - +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(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [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] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [StudyFormScaffold + [<abstract>WithQuestionnaireControls | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +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() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [InterventionFormView + [<abstract>QuestionFormData | - +formViewModel: InterventionFormViewModel + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; + +questionId: String; + +questionText: String; + +questionInfoText: String?; + +questionType: SurveyQuestionType; + +responseOptionsValidity: Map<dynamic, bool>; + +responseOptions: List<dynamic>; + +id: String + | + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() ] - [InterventionFormView]o-[InterventionFormViewModel] + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] - [InterventionTaskFormView + [ChoiceQuestionFormData | - +formViewModel: InterventionTaskFormViewModel + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [StudyDesignInterventionsFormView + [BoolQuestionFormData | - +Widget build() + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - [<abstract>StudyScheduleControls + [ScaleQuestionFormData | - <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 + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [InterventionFormViewModel + [FreeTextQuestionFormData | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +textLengthRange: List<int>; + +textType: FreeTextQuestionType; + +textTypeExpression: String?; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +FreeTextQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() + ] + + [FreeTextQuestionFormData]o-[FreeTextQuestionType] + [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] + + [QuestionFormViewModel + | + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; +form: FormGroup; - +interventionId: String; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); +void setControlsFrom(); - +InterventionFormData buildFormData(); + +QuestionFormData 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 onSelectItem(); + +dynamic save(); + +QuestionFormViewModel 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] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [StudyScheduleFormView - | - +formViewModel: StudyScheduleControls + [SurveyQuestionFormView | - -FormTableRow _renderCustomSequence(); - +Widget build() + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String + [SurveyQuestionType | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType; + <static>+freeText: SurveyQuestionType ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [InterventionsFormViewModel + [FreeTextQuestionFormView | - +study: Study; - +router: GoRouter; - +interventionsArray: FormArray<dynamic>; - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; - +form: FormGroup; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +interventionsRequired: dynamic; - +titles: Map<FormMode, String>; - +canTestStudySchedule: bool + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic | - +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(); + +Widget disableOnReadonly(); + +Widget generateRow() ] - [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] + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [InterventionPreview + [<abstract>IScaleQuestionFormViewModel | - +routeArgs: InterventionFormRouteArgs + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView | - +Widget build() + +formViewModel: QuestionFormViewModel ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [InterventionFormData + [ChoiceQuestionFormView | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + +formViewModel: QuestionFormViewModel | - +Intervention toIntervention(); - +InterventionFormData copy() + +Widget build() ] - [<abstract>IFormData]<:-[InterventionFormData] - - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String - | - +Study apply(); - +InterventionsFormData copy() - ] - - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [InterventionTaskFormData - | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String - | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() - ] - - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - - [InterventionTaskFormViewModel - | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; - +form: FormGroup; - +taskId: String; - +instanceId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() - ] - - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - - [ConsentItemFormView - | - +formViewModel: ConsentItemFormViewModel - ] - - [ConsentItemFormView]o-[ConsentItemFormViewModel] - - [<abstract>IScreenerQuestionLogicFormViewModel - | - +isDirtyOptionsBannerVisible: bool - ] - - [ScreenerQuestionLogicFormView - | - +formViewModel: ScreenerQuestionFormViewModel - | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() - ] - - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [EnrollmentFormData + [BoolQuestionFormView | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + +formViewModel: QuestionFormViewModel | - +Study apply(); - +EnrollmentFormData copy() + +Widget build() ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [ConsentItemFormData + [QuestionnaireFormData | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; + +questionsData: List<QuestionFormData>?; +id: String | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() - ] - - [<abstract>IFormData]<:-[ConsentItemFormData] - - [EnrollmentFormViewModel - | - +study: Study; - +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> - | - +void setControlsFrom(); - +EnrollmentFormData buildFormData(); - +void read(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); - +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); - +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); - +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); - +dynamic testScreener(); - +dynamic testConsent(); - +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - ] - - [EnrollmentFormViewModel]o-[Study] - [EnrollmentFormViewModel]o-[GoRouter] - [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] - [EnrollmentFormViewModel]o-[FormControl] - [EnrollmentFormViewModel]o-[FormArray] - [EnrollmentFormViewModel]o-[FormViewModelCollection] - [EnrollmentFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] - [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] - - [EnrollmentFormConsentItemDelegate - | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic - | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() - ] - - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - - [StudyDesignEnrollmentFormView - | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [ScreenerQuestionFormViewModel + [StudyFormScaffold | - <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 + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | - +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] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [ConsentItemFormViewModel - | - +consentIdControl: FormControl<String>; - +titleControl: FormControl<String>; - +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +form: FormGroup; - +consentId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +titles: Map<FormMode, String> + [<abstract>IStudyFormData | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +Study apply() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] [StudyFormViewModel | @@ -592,419 +461,413 @@ [<abstract>FormViewModel]<:-[StudyFormViewModel] [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - [StudyDesignInfoFormView + [InterventionTaskFormData | - +Widget build() + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String + | + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [StudyInfoFormData + [StudyScheduleFormData | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; + +id: String | + +StudySchedule toStudySchedule(); +Study apply(); - +StudyInfoFormData copy() + +StudyScheduleFormData copy() ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [StudyContactInfoFormData + [InterventionFormView | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String + +formViewModel: InterventionFormViewModel + ] + + [InterventionFormView]o-[InterventionFormViewModel] + + [<abstract>StudyScheduleControls | - +Study apply(); - +StudyInfoFormData copy() + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic + | + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [StudyInfoFormViewModel + [InterventionsFormViewModel | +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; +form: FormGroup; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; +titles: Map<FormMode, String>; + +canTestStudySchedule: bool + | + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() + ] + + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] + + [InterventionFormViewModel + | + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | +void setControlsFrom(); - +StudyInfoFormData buildFormData() + +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() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [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>IFormDataWithSchedule + [InterventionsFormData | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String | - +Schedule toSchedule() + +Study apply(); + +InterventionsFormData copy() ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [ScheduleControls - | - +formViewModel: WithScheduleControls + [StudyDesignInterventionsFormView | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + +Widget build() ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [<abstract>WithScheduleControls + [StudyScheduleFormView | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? + +formViewModel: StudyScheduleControls | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [SurveyQuestionFormView + [InterventionTaskFormViewModel | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +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() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [SurveyQuestionType + [InterventionFormData | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+freeText: SurveyQuestionType + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String + | + +Intervention toIntervention(); + +InterventionFormData copy() ] - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + [<abstract>IFormData]<:-[InterventionFormData] - [<abstract>IScaleQuestionFormViewModel + [InterventionTaskFormView | - +isMidValuesClearedInfoVisible: bool + +formViewModel: InterventionTaskFormViewModel ] - [ScaleQuestionFormView + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + + [InterventionPreview | - +formViewModel: QuestionFormViewModel + +routeArgs: InterventionFormRouteArgs + | + +Widget build() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [ChoiceQuestionFormView + [MeasurementSurveyFormView | - +formViewModel: QuestionFormViewModel + +formViewModel: MeasurementSurveyFormViewModel + ] + + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + + [SurveyPreview + | + +routeArgs: MeasurementFormRouteArgs | +Widget build() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [BoolQuestionFormView + [MeasurementSurveyFormData | - +formViewModel: QuestionFormViewModel + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String | - +Widget build() + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [FreeTextQuestionFormView + [MeasurementSurveyFormViewModel | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic + +study: Study; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; + +form: FormGroup; + +measurementId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() + +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() ] - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [<abstract>QuestionFormData + [StudyDesignMeasurementsFormView | - <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>; + +Widget build() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + + [MeasurementsFormData + | + +surveyMeasurements: List<MeasurementSurveyFormData>; +id: String | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +Study apply(); + +MeasurementsFormData copy() ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [ChoiceQuestionFormData + [MeasurementsFormViewModel | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +form: FormGroup; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +measurementRequired: dynamic; + +titles: Map<FormMode, String> | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [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] - [BoolQuestionFormData - | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + [StudyFormValidationSet | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [Enum]<:--[StudyFormValidationSet] - [ScaleQuestionFormData + [ReportsFormData | - +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> + +reportItems: List<ReportItemFormData>; + +id: String | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +Study apply(); + +ReportsFormData copy() ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [FreeTextQuestionFormData + [ReportStatus | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus + ] + + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] + + [ReportItemFormView | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) + | + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [QuestionFormViewModel - | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool - | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() - ] - - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> - | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() - ] - - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - - [QuestionnaireFormData - | - +questionsData: List<QuestionFormData>?; - +id: String - | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() - ] - - [<abstract>IFormData]<:--[QuestionnaireFormData] - - [StudyDesignReportsFormView - | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - - [ReportItemFormViewModel + [ReportItemFormViewModel | <static>+defaultSectionType: ReportSectionType; +sectionIdControl: FormControl<String>; @@ -1048,7 +911,29 @@ [ReportItemFormViewModel]o-[FormGroup] [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [LinearRegressionSectionFormView + [ReportItemFormData + | + +isPrimary: bool; + +section: ReportSection; + +id: String + | + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() + ] + + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] + + [DataReferenceIdentifier + | + +hashCode: int + | + +bool ==() + ] + + [DataReference]<:-[DataReferenceIdentifier] + + [AverageSectionFormView | +formViewModel: ReportItemFormViewModel; +studyId: String; @@ -1057,8 +942,8 @@ +Widget build() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] [TemporalAggregationFormatted | @@ -1107,27 +992,6 @@ [ReportSectionType]o-[ReportSectionType] [Enum]<:--[ReportSectionType] - [DataReferenceIdentifier - | - +hashCode: int - | - +bool ==() - ] - - [DataReference]<:-[DataReferenceIdentifier] - - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() - ] - - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [DataReferenceEditor | +formControl: FormControl<DataReferenceIdentifier<T>>; @@ -1141,68 +1005,25 @@ [DataReferenceEditor]o-[FormControl] [DataReferenceEditor]o-[ReactiveDropdownField] - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String - | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() - ] - - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] - - [ReportItemFormView + [LinearRegressionSectionFormView | +formViewModel: ReportItemFormViewModel; +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) - | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() - ] - - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] - - [ReportBadge - | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +reportSectionColumnWidth: Map<int, TableColumnWidth> | +Widget build() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] - - [ReportsFormData - | - +reportItems: List<ReportItemFormData>; - +id: String - | - +Study apply(); - +ReportsFormData copy() - ] - - [<abstract>IStudyFormData]<:--[ReportsFormData] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [ReportStatus + [StudyDesignReportsFormView | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] [ReportsFormViewModel | @@ -1259,2082 +1080,1565 @@ [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [<abstract>StudyDesignPageWidget + [ReportBadge | - +Widget? banner() + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool + | + +Widget build() ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [<abstract>IStudyFormData + [EnrollmentFormData | - +Study apply() + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String + | + +Study apply(); + +EnrollmentFormData copy() ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [StudyFormValidationSet + [ConsentItemFormData | - +index: int; - <static>+values: List<StudyFormValidationSet> + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String + | + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [Enum]<:--[StudyFormValidationSet] + [<abstract>IFormData]<:-[ConsentItemFormData] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + [ConsentItemFormViewModel + | + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() + ] + + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + + [<abstract>IScreenerQuestionLogicFormViewModel + | + +isDirtyOptionsBannerVisible: bool + ] + + [ScreenerQuestionLogicFormView + | + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() + ] + + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + + [StudyDesignEnrollmentFormView + | + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + + [ScreenerQuestionFormViewModel + | + <static>+defaultResponseOptionValidity: bool; + +responseOptionsDisabledArray: FormArray<dynamic>; + +responseOptionsLogicControls: FormArray<bool>; + +responseOptionsLogicDescriptionControls: FormArray<String>; + -_questionBaseControls: Map<String, AbstractControl<dynamic>>; + +prevResponseOptionControls: List<AbstractControl<dynamic>>; + +prevResponseOptionValues: List<dynamic>; + +responseOptionsDisabledControls: List<AbstractControl<dynamic>>; + +logicControlOptions: List<FormControlOption<bool>>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isDirtyOptionsBannerVisible: bool + | + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() + ] + + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + + [ConsentItemFormView + | + +formViewModel: ConsentItemFormViewModel + ] + + [ConsentItemFormView]o-[ConsentItemFormViewModel] + + [EnrollmentFormViewModel + | + +study: Study; + +router: GoRouter; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +form: FormGroup; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titles: Map<FormMode, String>; + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> + | + +void setControlsFrom(); + +EnrollmentFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() + ] + + [EnrollmentFormViewModel]o-[Study] + [EnrollmentFormViewModel]o-[GoRouter] + [EnrollmentFormViewModel]o-[EnrollmentFormConsentItemDelegate] + [EnrollmentFormViewModel]o-[FormControl] + [EnrollmentFormViewModel]o-[FormArray] + [EnrollmentFormViewModel]o-[FormViewModelCollection] + [EnrollmentFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[EnrollmentFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormViewModel] + [<abstract>IListActionProvider]<:--[EnrollmentFormViewModel] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormViewModel] + + [EnrollmentFormConsentItemDelegate + | + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic + | + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() + ] + + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + + [<abstract>StudyDesignPageWidget + | + +Widget? banner() + ] + + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + + + + + + + + + + - - - - - - - - - - + - - + - + - + - - + + + + - + - - - + - + - + - + - + + + - + - + - + - + - - - - - - - - - - + - - + - - + + - + - + + + - + - - - + - + - - - + + - - - - - + + + - + + - + - + + + + + + + + + - + - + + + - + - + + + - + - + - + - + - + - - - - + + + - - - + + + - + + - + - - + + - + - - - + - + - + + + + + + - - + + + - + - + - + - + + + - + - + + + + + + + - + - + - + - - - - + + - + - - - + + + + - - - + + + - - + - + - - - - - + - + - - + + + - - - - + - + - + - + - - - - - + - + - + - + - - - + - + - + + + + + + + + + - + - + + + + + + - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + + + + + + + + + + - - + - + - + - + + + + + + + - + - + - + - + - + - - - - + + - + - - - - - - - - + - + + + + - + - - - + + + - + - + - - - + + + + + + + + + - + - + - + - + + + - + - + - + - + + + - + - + + + - + - + - + - + - - - - + + + + + + + + - + - - - - - - + + + + - + - + + + - + - - + + - + - + - + - + - + - - - + - + + + + + + + - + - - - - + + + - - - - - + + + - - - + + + - - - + + + - + + - + - + - - + + - + - + - + - - - + - + - - - + - + - - - + - + - - - - - - - - - + + + - + - - - + + + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - - - + - - + + - + - + - - - - - - - - - - - - + - - - - + - + - + + + + + - + - + - + - - - + - + - - - + - + - + - + - + - + + + + + + + + + + - + + - + - + - + + + + + + + + + - + - - - - + + - + - - - + - + - + - + - + - + + + + - - - + + + + - + - + - + - + + + - + - + + + + + - + + + - + - - + + - + - - + + + - - + - + - + - + - + - + - + - + - + - + - + - + - - + + + + - + - + - + - - - - + + + - + + - - - - + - - - + + + - - + - - - + - + - + - + - - - - - - + + + + + + + + - - - MeasurementsFormData + + + StudyInfoFormData - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String - - - - - - +Study apply() - +MeasurementsFormData copy() - - - - - - - - - - - - IStudyFormData - - - - - - +Study apply() - - - - - - - - - - - - - SurveyPreview - - - - - - +routeArgs: MeasurementFormRouteArgs - - - - - - +Widget build() - - - - - - - - - - - MeasurementFormRouteArgs - - - - - - - - - - - ConsumerWidget - - - - - - - - - - - - - MeasurementSurveyFormData - - - - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String - - - - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() - - - - - - - - - - - - - QuestionnaireFormData - - - - - - +questionsData: List<QuestionFormData>? - +id: String - - - - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() - - - - - - - - - - - - - IFormDataWithSchedule - - - - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? - - - - - - +Schedule toSchedule() - - - - - - - - - - - - - MeasurementSurveyFormViewModel - - - - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() - - - - - - - - - - - Study - - - - - - - - - - - FormControl - - - - - - - - - - - FormGroup - - - - - - - - - - - ManagedFormViewModel - - - - - - - - - - - - - WithQuestionnaireControls - - - - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() - - - - - - - - - - - - - WithScheduleControls - - - - - - +isTimeRestrictedControl: FormControl<bool> - +instanceID: FormControl<String> - +restrictedTimeStartControl: FormControl<Time> - +restrictedTimeStartPickerControl: FormControl<TimeOfDay> - +restrictedTimeEndControl: FormControl<Time> - +restrictedTimeEndPickerControl: FormControl<TimeOfDay> - +hasReminderControl: FormControl<bool> - +reminderTimeControl: FormControl<Time> - +reminderTimePickerControl: FormControl<TimeOfDay> - -_reminderControlStream: StreamSubscription<dynamic>? - +scheduleFormControls: Map<String, FormControl<Object>> - +hasReminder: bool - +isTimeRestricted: bool - +timeRestriction: List<Time>? - - - - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() - - - - - - - - - - - IFormViewModelDelegate - - - - - - - - - - - IListActionProvider - - - - - - - - - - - IProviderArgsResolver - - - - - - - - - - - - MeasurementSurveyFormView - - - - - - +formViewModel: MeasurementSurveyFormViewModel - - - - - - - - - - - - StudyDesignMeasurementsFormView - - - - - - +Widget build() - - - - - - - - - - - - StudyDesignPageWidget - - - - - - +Widget? banner() - - - - - - - - - - - - - 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() - - - - - - - - - - - GoRouter - - - - - - - - - - - FormArray - - - - - - - - - - - FormViewModelCollection - - - - - - - - - - - FormViewModel - - - - - - - - - - - - - StudyFormScaffold - - - - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) - - - - - - +Widget build() - - - - - - - - - - - T Function(WidgetRef) - - - - - - - - - - - Widget Function(T) - - - - - - - - - - - - InterventionFormView - - - - - - +formViewModel: InterventionFormViewModel - - - - - - - - - - - - - InterventionFormViewModel - - - - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> - - - - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() - - - - - - - - - - - - InterventionTaskFormView - - - - - - +formViewModel: InterventionTaskFormViewModel - - - - - - - - - - - - - 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() - - - - - - - - - - - - StudyDesignInterventionsFormView - - - - - - +Widget build() - - - - - - - - - - - - - StudyScheduleControls - - - - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +Study apply() + +StudyInfoFormData copy() - - - + + + + + - - - PhaseSequence + + + StudyContactInfoFormData - - - - - - + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String + + - - - StudyScheduleFormView + + + +Study apply() + +StudyInfoFormData copy() - - - +formViewModel: StudyScheduleControls + + + + + + + + + IStudyFormData - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +Study apply() - - - + + + + - - - FormConsumerWidget + + + StudyDesignInfoFormView - - - - - - - - - - StudyScheduleFormData + + + +Widget build() - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + + + + + + + StudyDesignPageWidget - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +Widget? banner() - - - - - + + + + + - - - InterventionsFormViewModel + + + StudyInfoFormViewModel - - - +study: Study - +router: GoRouter - +interventionsArray: FormArray<dynamic> - +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> - +form: FormGroup - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +interventionsRequired: dynamic - +titles: Map<FormMode, String> - +canTestStudySchedule: bool + + + +study: Study + +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() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - - - + + + - - - InterventionPreview + + + Study - - - +routeArgs: InterventionFormRouteArgs + + + + + + + + FormControl - - - +Widget build() + + + + + + + + FormGroup - - - + + + - - - InterventionFormRouteArgs + + + FormViewModel - - - - - + + + + + - - - InterventionFormData + + + WithScheduleControls - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +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>? - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - + + + - - - IFormData + + + StreamSubscription - - - - - + + + + + - - - InterventionsFormData + + + IFormDataWithSchedule - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - +Study apply() - +InterventionsFormData copy() + + + +Schedule toSchedule() + + + + + + + + + + + StudyUTimeOfDay + + + + + + + + + + + IFormData - - - - - + + + + + - - - InterventionTaskFormData + + + ScheduleControls - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + +formViewModel: WithScheduleControls - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - - - - - ConsentItemFormView - - + + + - - - +formViewModel: ConsentItemFormViewModel + + + FormConsumerWidget - - - - - + + + + + - - - ConsentItemFormViewModel + + + WithQuestionnaireControls - - - +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> + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - + + + - - - IScreenerQuestionLogicFormViewModel + + + FormArray - - - +isDirtyOptionsBannerVisible: bool + + + + + + + + FormViewModelCollection - - - - - + + + - - - ScreenerQuestionLogicFormView + + + IFormViewModelDelegate - - - +formViewModel: ScreenerQuestionFormViewModel - - + + + + - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + IProviderArgsResolver - - - - - + + + + + - - - ScreenerQuestionFormViewModel + + + QuestionFormData - - - <static>+defaultResponseOptionValidity: bool - +responseOptionsDisabledArray: FormArray<dynamic> - +responseOptionsLogicControls: FormArray<bool> - +responseOptionsLogicDescriptionControls: FormArray<String> - -_questionBaseControls: Map<String, AbstractControl<dynamic>> - +prevResponseOptionControls: List<AbstractControl<dynamic>> - +prevResponseOptionValues: List<dynamic> - +responseOptionsDisabledControls: List<AbstractControl<dynamic>> - +logicControlOptions: List<FormControlOption<bool>> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isDirtyOptionsBannerVisible: bool + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - - - + + + + - - - EnrollmentFormData + + + SurveyQuestionType - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - +Study apply() - +EnrollmentFormData copy() + + + + + + + + + + ChoiceQuestionFormData - - - - + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> + + - - - Participation + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - ConsentItemFormData + + + BoolQuestionFormData - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - EnrollmentFormViewModel + + + ScaleQuestionFormData - - - +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()> + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> - - - +void setControlsFrom() - +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() + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + - - - EnrollmentFormConsentItemDelegate + + + Color - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + + + + + + + + FreeTextQuestionFormData - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +textLengthRange: List<int> + +textType: FreeTextQuestionType + +textTypeExpression: String? + +responseOptions: List<String> - - - - - - - - - StudyDesignEnrollmentFormView + + + +Question<dynamic> toQuestion() + +FreeTextQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + + + + + + FreeTextQuestionType - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -3398,43 +2702,308 @@ - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() + + + + + + + + + + + AbstractControl + + + + + + + + + + + ManagedFormViewModel + + + + + + + + + + + IListActionProvider + + + + + + + + + + + + SurveyQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool + + + + + + + + + + + Enum + + + + + + + + + + + + + FreeTextQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic + + + + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() + + + + + + + + + + + ConsumerWidget + + + + + + + + + + + + IScaleQuestionFormViewModel + + + + + + +isMidValuesClearedInfoVisible: bool + + + + + + + + + + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + + + + + + + + ChoiceQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + + BoolQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() + + + + + + + + + + + + + QuestionnaireFormData + + + + + + +questionsData: List<QuestionFormData>? + +id: String + + + + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() + + + + + + + + + + + + + StudyFormScaffold + + + + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) + + + + + + +Widget build() + + + + + + + + + + + T Function(WidgetRef) + + + + + + + + + + + Widget Function(T) - - - + + + - + StudyFormViewModel - + +studyDirtyCopy: Study? +studyRepository: IStudyRepository @@ -3452,7 +3021,7 @@ - + +void read() +void setControlsFrom() @@ -3467,9 +3036,9 @@ - + - + IStudyRepository @@ -3478,632 +3047,876 @@ - + - + IAuthRepository - - - - - + + + - - - StudyInfoFormViewModel + + + GoRouter - - - +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 + + + + + + + + + + EnrollmentFormViewModel - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +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() + + + + + + + + + + + + + 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() + + + + + + + + + + + + + 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() - - - - - + + + + + - - - ReportsFormViewModel + + + InterventionTaskFormData - - - +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 + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - + + + + + - - - StudyDesignInfoFormView + + + StudyScheduleFormData - - - +Widget build() + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String + + + + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - - - + + + - - - StudyInfoFormData + + + PhaseSequence - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + + + + + + + InterventionFormView - - - +Study apply() - +StudyInfoFormData copy() + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - StudyContactInfoFormData + + + InterventionFormViewModel - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Study apply() - +StudyInfoFormData copy() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - + + + + + - - - StudyUTimeOfDay + + + StudyScheduleControls + + + + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic + + + + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - - - + + + + + - - - ScheduleControls + + + InterventionsFormData - - - +formViewModel: WithScheduleControls + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + +Study apply() + +InterventionsFormData copy() - - - + + + + - - - StreamSubscription + + + StudyDesignInterventionsFormView + + + + + + +Widget build() - - - - + + + + + - - - SurveyQuestionFormView + + + StudyScheduleFormView - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +formViewModel: StudyScheduleControls + + + + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - + + + + + - - - SurveyQuestionType + + + InterventionTaskFormViewModel - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + +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> - - - - - - - - Enum + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - + + + + + - - - IScaleQuestionFormViewModel + + + InterventionFormData - - - +isMidValuesClearedInfoVisible: bool + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String + + + + + + +Intervention toIntervention() + +InterventionFormData copy() - - - - + + + + - - - ScaleQuestionFormView + + + InterventionTaskFormView - - - +formViewModel: QuestionFormViewModel + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - ChoiceQuestionFormView + + + InterventionPreview - - - +formViewModel: QuestionFormViewModel + + + +routeArgs: InterventionFormRouteArgs - - - +Widget build() + + + +Widget build() - - - - - + + + - - - BoolQuestionFormView + + + InterventionFormRouteArgs - - - +formViewModel: QuestionFormViewModel + + + + + + + + + MeasurementSurveyFormView - - - +Widget build() + + + +formViewModel: MeasurementSurveyFormViewModel - - - - - + + + + + - - - FreeTextQuestionFormView + + + MeasurementSurveyFormViewModel - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + +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() - - - - - + + + + + - - - QuestionFormData + + + SurveyPreview - - - <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 + + + +routeArgs: MeasurementFormRouteArgs - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +Widget build() - - - - - + + + - - - ChoiceQuestionFormData + + + MeasurementFormRouteArgs - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + + + + + + + + MeasurementSurveyFormData - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - - - - - - - - BoolQuestionFormData + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + + + + + + + StudyDesignMeasurementsFormView - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() - - - - - + + + + + - - - ScaleQuestionFormData + + + MeasurementsFormData - - - +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> + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Study apply() + +MeasurementsFormData copy() - - - + + + + - - - Color + + + StudyFormValidationSet + + + + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + + + - - - FreeTextQuestionFormData + + + ReportsFormData - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> + + + +reportItems: List<ReportItemFormData> + +id: String - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Study apply() + +ReportsFormData copy() - - - + + + + - - - FreeTextQuestionType + + + ReportStatus - - - - - - - - AbstractControl + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - - + + + + + - - - StudyDesignReportsFormView + + + ReportItemFormView - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -4136,7 +3949,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -4148,18 +3961,29 @@ + + + + + + + Widget Function(BuildContext) + + + + - - + + - + ReportSectionType - + +index: int <static>+values: List<ReportSectionType> @@ -4169,46 +3993,121 @@ - - - - - + + + + + - - - LinearRegressionSectionFormView + + + ReportItemFormData - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +Widget build() + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() + + + + + + + + + + + ReportSection + + + + + + + + + + + + + DataReferenceIdentifier + + + + + + +hashCode: int + + + + + + +bool ==() + + + + + + + + + + + DataReference + + + + + + + + + + + + + AverageSectionFormView + + + + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + +Widget build() - - - + + + - + TemporalAggregationFormatted - + -_value: TemporalAggregation <static>+values: List<TemporalAggregationFormatted> @@ -4219,7 +4118,7 @@ - + +bool ==() +String toString() @@ -4231,9 +4130,9 @@ - + - + TemporalAggregation @@ -4242,9 +4141,9 @@ - + - + IconData @@ -4253,17 +4152,17 @@ - - - + + + - + ImprovementDirectionFormatted - + -_value: ImprovementDirection <static>+values: List<ImprovementDirectionFormatted> @@ -4274,7 +4173,7 @@ - + +bool ==() +String toString() @@ -4286,347 +4185,448 @@ - + - + ImprovementDirection - - - - - + + + + + - - - DataReferenceIdentifier + + + DataReferenceEditor - - - +hashCode: int + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +bool ==() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - + + + - - - DataReference + + + ReactiveDropdownField - - - - - + + + + + - - - AverageSectionFormView + + + LinearRegressionSectionFormView - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + +Widget build() + + + + + + + + + + + + StudyDesignReportsFormView + + + + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() + + + + + + + + + + + + + ReportFormItemDelegate + + + + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic + + + + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + + + + + + + + + + + + + ReportBadge + + + + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool + + + + + + +Widget build() - - - +Widget build() + + + + + + + + BadgeType - - - - - + + + + + - - - DataReferenceEditor + + + EnrollmentFormData - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +Study apply() + +EnrollmentFormData copy() - - - + + + - - - ReactiveDropdownField + + + Participation - - - - - + + + + + - - - ReportItemFormData + + + ConsentItemFormData - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - + + + + + - - - ReportSection + + + ConsentItemFormViewModel - - - - - - - - - - ReportItemFormView + + + +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> - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + + + + + + + IScreenerQuestionLogicFormViewModel - - - - - - - - Widget Function(BuildContext) + + + +isDirtyOptionsBannerVisible: bool - - - - - + + + + + - - - ReportBadge + + + ScreenerQuestionLogicFormView - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +formViewModel: ScreenerQuestionFormViewModel - - - +Widget build() + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - + + + + + - - - ReportStatus + + + ScreenerQuestionFormViewModel - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + <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 - - - - - - - - BadgeType + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - + + + + - - - ReportsFormData + + + StudyDesignEnrollmentFormView - - - +reportItems: List<ReportItemFormData> - +id: String + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - +Study apply() - +ReportsFormData copy() + + + + + + + + + ConsentItemFormView + + + + + + +formViewModel: ConsentItemFormViewModel - - - - - + + + + + - - - ReportFormItemDelegate + + + EnrollmentFormConsentItemDelegate - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - + - + StudyPageWidget - - - - - - - - StudyFormValidationSet - - - - - - +index: int - <static>+values: List<StudyFormValidationSet> - - - - diff --git a/docs/uml/designer_v2/lib/features/uml.svg b/docs/uml/designer_v2/lib/features/uml.svg index a3eed81d5..fce44a5d0 100644 --- a/docs/uml/designer_v2/lib/features/uml.svg +++ b/docs/uml/designer_v2/lib/features/uml.svg @@ -1,140 +1,36 @@ - - [StudyRecruitScreen - | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - - [EnrolledBadge - | - +enrolledCount: int + + [AccountSettingsDialog | +Widget build() ] - [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] - - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel - | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() - ] - - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [StudyInvitesTable - | - +invites: List<StudyInvite>; - +onSelect: void Function(StudyInvite); - +getActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite); - +getIntervention: Intervention? Function(String); - +getParticipantCountForInvite: int Function(StudyInvite) + [<abstract>IAppDelegate | - +Widget build(); - -List<Widget> _buildRow() + +dynamic onAppStart() ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] - - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + [AppController | - -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] - - [DashboardScreen + +sharedPreferences: SharedPreferences; + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic | - +filter: StudiesFilter? + +dynamic onAppStart(); + -dynamic _callDelegates() ] - [DashboardScreen]o-[StudiesFilter] + [AppController]o-[SharedPreferences] - [DashboardController - | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +userRepository: IUserRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController; - +isSortAscending: bool + [StudiesFilter | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void setSorting(); - +void filterStudies(); - +void sortStudies(); - +bool isSortingActiveForColumn(); - +bool isPinned(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + +index: int; + <static>+values: List<StudiesFilter> ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] + [Enum]<:--[StudiesFilter] [StudiesTableItem | @@ -175,13 +71,12 @@ [DashboardScaffold]o-[<abstract>Widget] - [StudiesFilter + [DashboardScreen | - +index: int; - <static>+values: List<StudiesFilter> + +filter: StudiesFilter? ] - [Enum]<:--[StudiesFilter] + [DashboardScreen]o-[StudiesFilter] [StudiesTableColumnSize | @@ -235,98 +130,148 @@ [StudiesTableColumn]o-[StudiesTableColumn] [Enum]<:--[StudiesTableColumn] - [PublishDialog + [DashboardController | - +Widget build() - ] - - [<abstract>StudyPageWidget]<:-[PublishDialog] - - [PublishSuccessDialog + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController; + +isSortAscending: bool | - +Widget build() + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void setSorting(); + +void filterStudies(); + +void sortStudies(); + +bool isSortingActiveForColumn(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] - [PublishConfirmationDialog + [StudyMonitorScreen | +Widget build() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] - [DrawerEntry - | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +autoCloseDrawer: bool; - +title: String; - +helpText: String? - | - +void onClick() + [App ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [AppContent + ] - [GoRouterDrawerEntry + [StudyInvitesTable | - +intent: RoutingIntent; - +onNavigated: void Function()? + +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) | - +void onClick() + +Widget build(); + -List<Widget> _buildRow() ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [GoRouterDrawerEntry]o-[void Function()?] - [DrawerEntry]<:-[GoRouterDrawerEntry] + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] - [AppDrawer + [InviteCodeFormView | - +width: int; - +autoCloseDrawer: bool; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double - ] - - [<abstract>IAppDelegate + +formViewModel: InviteCodeFormViewModel | - +dynamic onAppStart() + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [AppController + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + + [EnrolledBadge | - +sharedPreferences: SharedPreferences; - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +enrolledCount: int | - +dynamic onAppStart(); - -dynamic _callDelegates() + +Widget build() ] - [AppController]o-[SharedPreferences] - - [AppStatus + [InviteCodeFormViewModel | - +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + +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() ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] + + [StudyRecruitController + | + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + | + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() + ] + + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] + + [StudyRecruitScreen + | + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() + ] + + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] [FormInvalidException ] @@ -458,23 +403,6 @@ [FormViewModelCollection]o-[FormArray] - [CustomFormControl - | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? - | - +void dispose() - ] - - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] - [<abstract>FormValidationSetEnum ] @@ -490,17 +418,22 @@ [FormControlValidation]o-[<abstract>AbstractControl] - [<abstract>IFormData + [CustomFormControl | - +id: String + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? | - +IFormData copy() + +void dispose() ] - [UnsavedChangesDialog - | - +Widget build() - ] + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] [FormArrayTable | @@ -539,30 +472,66 @@ [FormArrayTable]o-[<abstract>Widget] [FormArrayTable]o-[EdgeInsets] - [StudyUJobsToBeDone + [UnsavedChangesDialog | +Widget build() ] - [LoginForm + [<abstract>IFormData + | + +id: String + | + +IFormData copy() + ] + + [PasswordRecoveryForm | +formKey: AuthFormKey | +Widget build() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [PasswordForgotForm + [SignupForm | +formKey: AuthFormKey + | + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() + ] + + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] + + [StudyUJobsToBeDone | +Widget build() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [EmailTextField + | + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? + ] + + [EmailTextField]o-[FormControl] + + [PasswordTextField + | + +labelText: String; + +hintText: String?; + +onSubmitted: dynamic Function(FormControl<dynamic>)?; + +formControlName: String?; + +formControl: FormControl<dynamic>? + ] + + [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] + [PasswordTextField]o-[FormControl] [AuthFormController | @@ -629,27 +598,15 @@ [AuthFormKey]o-[AuthFormKey] [Enum]<:--[AuthFormKey] - [EmailTextField + [PasswordForgotForm | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? - ] - - [EmailTextField]o-[FormControl] - - [PasswordTextField + +formKey: AuthFormKey | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +Widget build() ] - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] [AuthScaffold | @@ -664,3476 +621,3084 @@ [AuthScaffold]o-[AuthFormKey] [AuthScaffold]o-[EdgeInsets] - [SignupForm - | - +formKey: AuthFormKey - | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() - ] - - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] - - [PasswordRecoveryForm + [LoginForm | +formKey: AuthFormKey | +Widget build() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [StudyAnalyzeScreen + [AppStatus | - +Widget? banner(); - +Widget build() + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] - [StudyAnalyzeController + [StudyInfoFormData | - +dynamic onExport() - ] - - [StudyBaseController]<:-[StudyAnalyzeController] - - [App + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [AppContent - ] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [StudyBaseController + [StudyContactInfoFormData | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +Study apply(); + +StudyInfoFormData copy() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + [StudyDesignInfoFormView | +Widget build() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [<abstract>IStudyStatusBadgeViewModel + [StudyInfoFormViewModel | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? - ] + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic + | + +void setControlsFrom(); + +StudyInfoFormData buildFormData() + ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [StudyStatusBadge + [<abstract>WithScheduleControls | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? | - +Widget build() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [PreviewFrame + [<abstract>IFormDataWithSchedule | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? + | + +Schedule toSchedule() ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [WebFrame + [ScheduleControls | - +previewSrc: String; - +studyId: String + +formViewModel: WithScheduleControls | - +Widget build() + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [DisabledFrame - | - +Widget build() - ] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [PhoneContainer + [<abstract>WithQuestionnaireControls | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + +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() ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [MobileFrame + [<abstract>QuestionFormData | - +Widget build() - ] - - [DesktopFrame + <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 + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] + + [ChoiceQuestionFormData | - +authRepository: IAuthRepository; - +languageCode: String + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> + | + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [<abstract>IStudyNavViewModel + [BoolQuestionFormData | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool - ] - - [StudyNav + <static>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [StudyDesignNav - | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() - ] + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - [StudySettingsDialog + [ScaleQuestionFormData | - +Widget build() + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> + | + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [StudySettingsFormViewModel + [FreeTextQuestionFormData | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> + +textLengthRange: List<int>; + +textType: FreeTextQuestionType; + +textTypeExpression: String?; + +responseOptions: List<String> | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + +Question<dynamic> toQuestion(); + +FreeTextQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [FreeTextQuestionFormData]o-[FreeTextQuestionType] + [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [TestAppRoutes + [QuestionFormViewModel | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String - ] - - [StudyParticipationBadge - | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: 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?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +form: FormGroup; + +questionId: String; + +questionType: SurveyQuestionType; + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; + +answerOptionsArray: FormArray<dynamic>; + +answerOptionsControls: List<AbstractControl<dynamic>>; + +validAnswerOptions: List<String>; + +boolOptions: List<AbstractControl<String>>; + +scaleMinValue: int; + +scaleMaxValue: int; + +scaleRange: int; + +scaleAllValueControls: List<AbstractControl<int>>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | - +Widget build() + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel createDuplicate() ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [StudyTestScreen - | - +previewRoute: String? + [SurveyQuestionFormView | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [StudyController - | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + [SurveyQuestionType | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType; + <static>+freeText: SurveyQuestionType ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [RouteInformation + [FreeTextQuestionFormView | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic | - +String toString() + +Widget build(); + +Widget disableOnReadonly(); + +Widget generateRow() ] - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + + [<abstract>IScaleQuestionFormViewModel | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + +isMidValuesClearedInfoVisible: bool ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] - - [WebController - | - +iFrameElement: IFrameElement + [ScaleQuestionFormView | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + +formViewModel: QuestionFormViewModel ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [MobileController + [ChoiceQuestionFormView | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [<abstract>PlatformController]<:-[MobileController] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [<abstract>IStudyAppBarViewModel + [BoolQuestionFormView | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool + +formViewModel: QuestionFormViewModel + | + +Widget build() ] - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [StudyScaffold + [QuestionnaireFormData | - +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 + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [<abstract>StudyPageWidget + [StudyFormScaffold | - +studyId: String + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | - +Widget? banner() + +Widget build() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [StudyMonitorScreen + [<abstract>IStudyFormData | - +Widget build() + +Study apply() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [MeasurementsFormViewModel + [StudyFormViewModel | - +study: Study; + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +studyInfoFormViewModel: StudyInfoFormViewModel; + +enrollmentFormViewModel: EnrollmentFormViewModel; + +measurementsFormViewModel: MeasurementsFormViewModel; + +reportsFormViewModel: ReportsFormViewModel; + +interventionsFormViewModel: InterventionsFormViewModel; +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +isStudyReadonly: bool; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +measurementRequired: dynamic; +titles: Map<FormMode, String> | +void read(); +void setControlsFrom(); - +MeasurementsFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); + +Study buildFormData(); + +void dispose(); +void onCancel(); - +dynamic onSave() + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [MeasurementsFormViewModel]o-[Study] - [MeasurementsFormViewModel]o-[GoRouter] - [MeasurementsFormViewModel]o-[FormArray] - [MeasurementsFormViewModel]o-[FormViewModelCollection] - [MeasurementsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[MeasurementsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementsFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] + [StudyFormViewModel]o-[Study] + [StudyFormViewModel]o-[<abstract>IStudyRepository] + [StudyFormViewModel]o-[<abstract>IAuthRepository] + [StudyFormViewModel]o-[GoRouter] + [StudyFormViewModel]o-[StudyInfoFormViewModel] + [StudyFormViewModel]o-[EnrollmentFormViewModel] + [StudyFormViewModel]o-[MeasurementsFormViewModel] + [StudyFormViewModel]o-[ReportsFormViewModel] + [StudyFormViewModel]o-[InterventionsFormViewModel] + [StudyFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[StudyFormViewModel] - [MeasurementSurveyFormView + [InterventionTaskFormData | - +formViewModel: MeasurementSurveyFormViewModel + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String + | + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [MeasurementSurveyFormData + [StudyScheduleFormData | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; +id: String | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [SurveyPreview + [InterventionFormView | - +routeArgs: MeasurementFormRouteArgs + +formViewModel: InterventionFormViewModel + ] + + [InterventionFormView]o-[InterventionFormViewModel] + + [<abstract>StudyScheduleControls | - +Widget build() + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic + | + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [MeasurementSurveyFormViewModel + [InterventionsFormViewModel | +study: Study; - +measurementIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +surveyTitleControl: FormControl<String>; - +surveyIntroTextControl: FormControl<String>; - +surveyOutroTextControl: FormControl<String>; + +router: GoRouter; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; +form: FormGroup; - +measurementId: String; - +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; + +titles: Map<FormMode, String>; + +canTestStudySchedule: bool + | + +void setControlsFrom(); + +InterventionsFormData buildFormData(); + +void read(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); + +void onCancel(); + +dynamic onSave(); + +dynamic testStudySchedule() + ] + + [InterventionsFormViewModel]o-[Study] + [InterventionsFormViewModel]o-[GoRouter] + [InterventionsFormViewModel]o-[FormArray] + [InterventionsFormViewModel]o-[FormViewModelCollection] + [InterventionsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InterventionsFormViewModel] + [<abstract>StudyScheduleControls]<:-[InterventionsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionsFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] + + [InterventionFormViewModel + | + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; + +atLeastOneTask: dynamic; +breadcrumbsTitle: String; +titles: Map<FormMode, String> | +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); + +InterventionFormData buildFormData(); +List<ModelAction<dynamic>> availableActions(); +List<ModelAction<dynamic>> availablePopupActions(); +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + [InterventionFormViewModel]o-[Study] + [InterventionFormViewModel]o-[FormControl] + [InterventionFormViewModel]o-[FormArray] + [InterventionFormViewModel]o-[FormViewModelCollection] + [InterventionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] + [<abstract>IListActionProvider]<:--[InterventionFormViewModel] + [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - [MeasurementsFormData + [InterventionsFormData | - +surveyMeasurements: List<MeasurementSurveyFormData>; + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; +id: String | +Study apply(); - +MeasurementsFormData copy() + +InterventionsFormData copy() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [StudyDesignMeasurementsFormView + [StudyDesignInterventionsFormView | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [<abstract>WithScheduleControls + [StudyScheduleFormView | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? + +formViewModel: StudyScheduleControls | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [ScheduleControls - | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() - ] - - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] - - [<abstract>IFormDataWithSchedule + [InterventionTaskFormViewModel | + +taskIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +taskTitleControl: FormControl<String>; + +taskDescriptionControl: FormControl<String>; + +markAsCompletedControl: FormControl<bool>; + +form: FormGroup; + +taskId: String; +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +titles: Map<FormMode, String> | - +Schedule toSchedule() + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [<abstract>QuestionFormData + [InterventionFormData | - <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>; + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; +id: String | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() + +Intervention toIntervention(); + +InterventionFormData copy() ] - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] + [<abstract>IFormData]<:-[InterventionFormData] - [ChoiceQuestionFormData - | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> + [InterventionTaskFormView | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() + +formViewModel: InterventionTaskFormViewModel ] - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [BoolQuestionFormData + [InterventionPreview | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> + +routeArgs: InterventionFormRouteArgs | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +Widget build() ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [ScaleQuestionFormData + [MeasurementSurveyFormView | - +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> + +formViewModel: MeasurementSurveyFormViewModel + ] + + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + + [SurveyPreview | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +routeArgs: MeasurementFormRouteArgs + | + +Widget build() ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [FreeTextQuestionFormData + [MeasurementSurveyFormData | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [QuestionFormViewModel + [MeasurementSurveyFormViewModel | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; + +study: Study; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; +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>>; + +measurementId: String; + +instanceId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; - +titles: Map<FormMode, String>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); +void setControlsFrom(); - +QuestionFormData buildFormData(); + +MeasurementSurveyFormData buildFormData(); +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); +void onSelectItem(); - +dynamic save(); - +QuestionFormViewModel createDuplicate() + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [SurveyQuestionFormView + [StudyDesignMeasurementsFormView | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +Widget build() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [SurveyQuestionType + [MeasurementsFormData | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+freeText: SurveyQuestionType - ] - - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String + | + +Study apply(); + +MeasurementsFormData copy() + ] - [ChoiceQuestionFormView + [<abstract>IStudyFormData]<:--[MeasurementsFormData] + + [MeasurementsFormViewModel | - +formViewModel: QuestionFormViewModel + +study: Study; + +router: GoRouter; + +measurementsArray: FormArray<dynamic>; + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + +form: FormGroup; + +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +measurementRequired: dynamic; + +titles: Map<FormMode, String> | - +Widget build() + +void read(); + +void setControlsFrom(); + +MeasurementsFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +MeasurementSurveyFormViewModel provide(); + +void onCancel(); + +dynamic onSave() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [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] - [BoolQuestionFormView - | - +formViewModel: QuestionFormViewModel + [StudyFormValidationSet | - +Widget build() + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [Enum]<:--[StudyFormValidationSet] - [FreeTextQuestionFormView + [ReportsFormData | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic + +reportItems: List<ReportItemFormData>; + +id: String | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() + +Study apply(); + +ReportsFormData copy() ] - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [<abstract>IScaleQuestionFormViewModel + [ReportStatus | - +isMidValuesClearedInfoVisible: bool + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [ScaleQuestionFormView + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] + + [ReportItemFormView | - +formViewModel: QuestionFormViewModel + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) + | + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [<abstract>WithQuestionnaireControls + [ReportItemFormViewModel | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + <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 setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [QuestionnaireFormData + [ReportItemFormData | - +questionsData: List<QuestionFormData>?; + +isPrimary: bool; + +section: ReportSection; +id: String | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [<abstract>StudyDesignPageWidget + [DataReferenceIdentifier | - +Widget? banner() + +hashCode: int + | + +bool ==() ] - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [DataReference]<:-[DataReferenceIdentifier] - [InterventionFormData + [AverageSectionFormView | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Intervention toIntervention(); - +InterventionFormData copy() + +Widget build() ] - [<abstract>IFormData]<:-[InterventionFormData] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [InterventionTaskFormView + [TemporalAggregationFormatted | - +formViewModel: InterventionTaskFormViewModel + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int + | + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [InterventionFormViewModel + [ImprovementDirectionFormatted | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; - +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +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 ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [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] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [StudyDesignInterventionsFormView + [ReportSectionType + | + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType + ] + + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] + + [DataReferenceEditor + | + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + | + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + ] + + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] + + [LinearRegressionSectionFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [InterventionsFormViewModel + [StudyDesignReportsFormView + | + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + + [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] - [StudyScheduleFormView + [ReportFormItemDelegate | - +formViewModel: StudyScheduleControls + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic + | + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() + ] + + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + + [ReportBadge + | + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - -FormTableRow _renderCustomSequence(); +Widget build() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [<abstract>StudyScheduleControls + [EnrollmentFormData | - <static>+defaultScheduleType: PhaseSequence; - <static>+defaultScheduleTypeSequence: String; - <static>+defaultNumCycles: int; - <static>+defaultPeriodLength: int; - +sequenceTypeControl: FormControl<PhaseSequence>; - +sequenceTypeCustomControl: FormControl<String>; - +phaseDurationControl: FormControl<int>; - +numCyclesControl: FormControl<int>; - +includeBaselineControl: FormControl<bool>; - +studyScheduleControls: Map<String, FormControl<Object>>; - <static>+kNumCyclesMin: int; - <static>+kNumCyclesMax: int; - <static>+kPhaseDurationMin: int; - <static>+kPhaseDurationMax: int; - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +numCyclesRange: dynamic; - +phaseDurationRange: dynamic; - +customSequenceRequired: dynamic + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +Study apply(); + +EnrollmentFormData copy() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [InterventionTaskFormData + [ConsentItemFormData | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; + +consentId: String; + +title: String; + +description: String; + +iconName: String?; +id: String | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + [<abstract>IFormData]<:-[ConsentItemFormData] - [InterventionTaskFormViewModel + [ConsentItemFormViewModel | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; +form: FormGroup; - +taskId: String; - +instanceId: String; + +consentId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; + +descriptionRequired: dynamic; +titles: Map<FormMode, String> | +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [InterventionFormView + [<abstract>IScreenerQuestionLogicFormViewModel | - +formViewModel: InterventionFormViewModel + +isDirtyOptionsBannerVisible: bool ] - [InterventionFormView]o-[InterventionFormViewModel] - - [StudyScheduleFormData + [ScreenerQuestionLogicFormView | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String + +formViewModel: ScreenerQuestionFormViewModel | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs + [StudyDesignEnrollmentFormView | - +Widget build() + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [InterventionsFormData + [ScreenerQuestionFormViewModel | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: 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 | - +Study apply(); - +InterventionsFormData copy() + +dynamic onResponseOptionsChanged(); + +void setControlsFrom(); + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] - - [StudyDesignInfoFormView - | - +Widget build() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - - [StudyInfoFormData - | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] - - [StudyContactInfoFormData - | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - - [StudyInfoFormViewModel - | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic - | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() - ] - - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [ReportBadge - | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + [ConsentItemFormView | - +Widget build() + +formViewModel: ConsentItemFormViewModel ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - [ReportsFormViewModel + [EnrollmentFormViewModel | +study: Study; +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +consentItemDelegate: EnrollmentFormConsentItemDelegate; + +enrollmentTypeControl: FormControl<Participation>; + +consentItemArray: FormArray<dynamic>; + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titles: Map<FormMode, String>; - +canTestConsent: bool + +canTestScreener: bool; + +canTestConsent: bool; + +questionTitles: Map<FormMode, String Function()> | +void setControlsFrom(); - +ReportsFormData buildFormData(); + +EnrollmentFormData buildFormData(); +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide() + +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() ] - [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] + [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] - [ReportFormItemDelegate + [EnrollmentFormConsentItemDelegate | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; +propagateOnSave: bool; +validationSet: dynamic | +void onCancel(); +dynamic onSave(); - +ReportItemFormViewModel provide(); + +ConsentItemFormViewModel provide(); +List<ModelAction<dynamic>> availableActions(); +void onNewItem(); +void onSelectItem() ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String + [<abstract>StudyDesignPageWidget | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +Widget? banner() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [ReportItemFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + [PublishSuccessDialog | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +Widget build() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - [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 + [PublishDialog | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +Widget build() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [<abstract>StudyPageWidget]<:-[PublishDialog] - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [PublishConfirmationDialog | +Widget build() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + [StudyAnalyzeController | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +dynamic onExport() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [StudyBaseController]<:-[StudyAnalyzeController] - [ImprovementDirectionFormatted + [StudyAnalyzeScreen | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; + +Widget? banner(); + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + + [DrawerEntry + | + +localizedTitle: String Function(); +icon: IconData?; - +hashCode: int + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +autoCloseDrawer: bool; + +title: String; + +helpText: String? | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +void onClick() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - [ReportSectionType + [GoRouterDrawerEntry | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +intent: RoutingIntent; + +onNavigated: void Function()? + | + +void onClick() ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [GoRouterDrawerEntry]o-[RoutingIntent] + [GoRouterDrawerEntry]o-[void Function()?] + [DrawerEntry]<:-[GoRouterDrawerEntry] - [DataReferenceIdentifier + [AppDrawer | - +hashCode: int + +width: int; + +autoCloseDrawer: bool; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double + ] + + [StudyController | - +bool ==() + +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() ] - [DataReference]<:-[DataReferenceIdentifier] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] - [AverageSectionFormView + [PreviewFrame | - +formViewModel: ReportItemFormViewModel; +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> - | - +Widget build() + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + [<abstract>IStudyStatusBadgeViewModel | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - [ReportsFormData + [StudyStatusBadge | - +reportItems: List<ReportItemFormData>; - +id: String + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - +Study apply(); - +ReportsFormData copy() + +Widget build() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] - [ReportStatus + [StudyTestController | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +authRepository: IAuthRepository; + +languageCode: String ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [StudyDesignReportsFormView + [RouteInformation | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? + | + +String toString() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] - - [<abstract>IStudyFormData + [<abstract>PlatformController | - +Study apply() + +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>IFormData]<:--[<abstract>IStudyFormData] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [EnrollmentFormData + [WebController | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + +iFrameElement: IFrameElement | - +Study apply(); - +EnrollmentFormData copy() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [ConsentItemFormView + [MobileController | - +formViewModel: ConsentItemFormViewModel + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [<abstract>PlatformController]<:-[MobileController] - [StudyDesignEnrollmentFormView + [StudySettingsFormViewModel | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel + [StudySettingsDialog | - +isDirtyOptionsBannerVisible: bool + +Widget build() ] - [ScreenerQuestionLogicFormView + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + + [StudyTestScreen | - +formViewModel: ScreenerQuestionFormViewModel + +previewRoute: String? | +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [EnrollmentFormViewModel + [StudyBaseController | - +study: Study; + +studyId: String; + +studyRepository: IStudyRepository; +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()> + +studySubscription: StreamSubscription<WrappedModel<Study>>? | - +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() + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [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] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [EnrollmentFormConsentItemDelegate + [StudyParticipationBadge | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool; + +center: bool | - +void onCancel(); - +dynamic onSave(); - +ConsentItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +Widget build() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [ScreenerQuestionFormViewModel + [<abstract>IStudyAppBarViewModel | - <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 + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool + ] + + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + + [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 ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] - [ConsentItemFormData + [FrameControlsWidget | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + +Widget build() ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [ConsentItemFormViewModel + [WebFrame | - +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> + +previewSrc: String; + +studyId: String | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + +Widget build() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [DisabledFrame + | + +Widget build() + ] - [StudyFormScaffold + [PhoneContainer | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? | +Widget build() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [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> + [MobileFrame | - +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] + [DesktopFrame + | + +Widget build() + ] - [StudyFormValidationSet + [<abstract>StudyPageWidget | - +index: int; - <static>+values: List<StudyFormValidationSet> + +studyId: String + | + +Widget? banner() ] - [Enum]<:--[StudyFormValidationSet] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [AccountSettingsDialog + [TestAppRoutes | - +Widget build() + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String ] - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] + [<abstract>IStudyNavViewModel + | + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool + ] - - - - - - - + [StudyNav + | + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() + ] + + [StudyDesignNav + | + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() + ] + + + + + + + + - - - + + + - + - - - + + - + + - + - + - + - - - + - + - - - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + - - + - + + + + - + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + + + - + - + - + - + - + - + - + - + - + - - + + + + + - - + - + - + - + - + - + - + + + - + - + - + + + - + - - - - - - - - - - + + + + + - - - + + + - + + - + - + + + - + - + - + - + - + - - - + - + - + - + - + + + + + + - - + - + + + - + - - + + - + - - - + - + - + - + - + - + - + - + - + + + - + - - + + + - - + - + - - + + + - - - - - + + + - - + - + - + - + - + - + - + - + - - - + - + - + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + + + + - - - + + - + - + + + + + - + - + + + - + - + - + - + - + - + - + - + + + - + - + - - + + - + - + - - - - + + + - + + + + - + - + - + - + - + - + + + - + - + - + - + - + - - - - - + + - - - - - - - + + - + - + + + - + - + - + - - - + + - - - - - + + + - + + - + - - - + + - + + + + + + - + - + + + - + - + + + - + - + - + - + - + - + - + - - - - - + - + - - - + + + + - + + - + - + - + - - - - - + + - + + - + - - - + + + - + - + - + - - - + + + - + - - - + + + + - + + - + - - - - - - + + + - + + - + - - + + - + - + - + - + - + - + - + - - - - + + + - - - - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + + + + - - + - - + + - + - + - + - - - + - + - - - + - + - + - + - + - + - - - - - - - - + + + + + + + - + + + + - + - + - + - + - + - - - - + + - + - + - + - + - + - - - + - + - - - - - + - + + + - + - - - - - - - - + + + - - - - - + + + - - - + + - + - - - + + - + + + + - + - + + + - + - + - + - - - - - - - + + + + + + + - + - + - - - - + - - + + + - + - - - + - + - - - + + + - + - - - + + + - + - + - + - + - + + + + + + + - + - + - + - + - + - - - - - - - - + + + + + - + + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - + - + - + + + + + + - - + - - + + - + - - - + - + - + - + - - - + - + - + - + - - - - - + + + - + - + + + + + - - - - + - - + + + - + - - - + - + - - - - - - - + - - - - + - - - - - - + - + - + - + + + + - + + - + - - - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - - - + - + - + - + - + - + - + + + + + + + - + - + - + - - - + + + - + - - - + + + + + - + + + + + + - + + - + - + - + - + - + - + - + - - + + + - - - - + - + - - - + - + - + - + + + + + - - - - - - + + - + - - - + - + - - + + - + - + - + - + - - + + + + + + + + + + + + + + + + + + + + + + - + - - - + - + - - - + - + - + - + - + - + - + - + - + + + - + - + - + - + + + - + - - - - - - + + + - - - + + + - - - + + + - - + - + - + - + - - + + + - - - + + + + + - - - + + + - - + - + - - - - + + + + + + + - - - - + - + - + - + - - - + - + - + + + + + + + - + - - - + - + - + - + - + - + - + - + + + + - + + + + + + - + - + - + - + - + - + - + - + - + - + + + - + - - - - + + + - + + - - - - - - - - - - - - - StudyRecruitScreen - - - - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() - - - - - - - - - - - - - StudyPageWidget - - - - - - +studyId: String - - - - - - +Widget? banner() - - - - - - - - - - - - - EnrolledBadge - - - - - - +enrolledCount: int - - - - - - +Widget build() - - - + - - - - - - - - - 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() + + + AccountSettingsDialog - - - - - - - - Study + + + +Widget build() - - - + + + - - - IInviteCodeRepository + + + ConsumerWidget - - - - - - - FormControl - - - - - - - - - - - FormGroup - - - - - - - - - - - - - FormViewModel - - - - - - -_formData: T? - -_formMode: FormMode - -_validationSet: FormValidationSetEnum? - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? - +autosave: bool - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> - -_immediateFormChildrenListenerDebouncer: Debouncer? - -_autosaveOperation: CancelableOperation<dynamic>? - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> - +prevFormValue: Map<String, dynamic>? - <static>-_formKey: String - +formData: T? - +formMode: FormMode - +isReadonly: bool - +validationSet: FormValidationSetEnum? - +isDirty: bool - +title: String - +isValid: bool - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - - - - -dynamic _setFormData() - -dynamic _rememberDefaultControlValidators() - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() - -dynamic _disableAllControls() - -dynamic _formModeUpdated() - -dynamic _restoreControlsFromFormData() - +void revalidate() - -void _applyValidationSet() - +void read() - +dynamic save() - +dynamic cancel() - +void enableAutosave() - +void listenToImmediateFormChildren() - +dynamic markFormGroupChanged() - +void dispose() - +void setControlsFrom() - +T buildFormData() - +void initControls() - - - - - - - - - - - - - InviteCodeFormView - - - - - - +formViewModel: InviteCodeFormViewModel - - - - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() - - - - - - - - - - - FormConsumerWidget - - - - - - - - - - - - - StudyInvitesTable - - - - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) - - - - - - +Widget build() - -List<Widget> _buildRow() - - - - - - - - - - - void Function(StudyInvite) - - - - - - - - - - - List<ModelAction<dynamic>> Function(StudyInvite) - - - - - - - - - - - Intervention? Function(String) - - - - - - - - - - - int Function(StudyInvite) - - - - - - - - - - - - - StudyRecruitController - - - - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() - - - - - - - - - - - StreamSubscription - - - - - - - - - - - - - StudyBaseController - - - - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() - - - - - - - - - - - IModelActionProvider - - - - - - - - - - - - DashboardScreen - - - - - - +filter: StudiesFilter? - - - - - - - - - - - - StudiesFilter - - - - - - +index: int - <static>+values: List<StudiesFilter> - - - - - - - - - - - - - DashboardController - - - - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool - - - - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + + + + + + IAppDelegate + + + + + + +dynamic onAppStart() - - - + + + + + - - - IStudyRepository + + + AppController - - - - + + + +sharedPreferences: SharedPreferences + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic + + - - - IAuthRepository + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - + + + - - - IUserRepository + + + SharedPreferences - - - + + + + - - - GoRouter + + + StudiesFilter + + + + + + +index: int + <static>+values: List<StudiesFilter> - - - + + + - - - SearchController + + + Enum - - + + - + StudiesTableItem - + +study: Study +itemHeight: double @@ -4149,11 +3714,22 @@ + + + + + + + Study + + + + - + - + void Function(Study, bool)? @@ -4162,9 +3738,9 @@ - + - + void Function(Study)? @@ -4173,16 +3749,16 @@ - - + + - + StudiesTableColumnHeader - + +title: String +sortable: bool @@ -4195,9 +3771,9 @@ - + - + void Function()? @@ -4206,24 +3782,24 @@ - - - + + + - + DashboardScaffold - + <static>+compactWidthThreshold: double +body: Widget - + +Widget build() @@ -4232,39 +3808,46 @@ - + - + Widget - - - + + + + - - - Enum + + + DashboardScreen + + + + + + +filter: StudiesFilter? - - - + + + - + StudiesTableColumnSize - + +collapsed: bool +flex: int? @@ -4272,7 +3855,7 @@ - + +Widget createContainer() @@ -4281,17 +3864,17 @@ - - - + + + - + StudiesTable - + +itemHeight: double +itemPadding: double @@ -4309,7 +3892,7 @@ - + +Widget build() -Widget _buildColumnHeader() @@ -4319,9 +3902,9 @@ - + - + void Function(Study) @@ -4330,27 +3913,71 @@ - + - + List<ModelAction<dynamic>> Function(Study) + + + + + + + + + DashboardController + + + + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + +isSortAscending: bool + + + + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void setSorting() + +void filterStudies() + +void sortStudies() + +bool isSortingActiveForColumn() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() + + + + - - + + - + StudiesTableColumn - + +index: int <static>+values: List<StudiesTableColumn> @@ -4367,282 +3994,511 @@ - - - - + + + - - - PublishDialog + + + IStudyRepository - - - +Widget build() + + + + + + + + IAuthRepository + + + + + + + + + + + IUserRepository + + + + + + + + + + + GoRouter + + + + + + + + + + + StreamSubscription + + + + + + + + + + + SearchController + + + + + + + + + + + IModelActionProvider + + + + + + + + + + + + StudyMonitorScreen + + + + + + +Widget build() + + + + + + + + + + + + + StudyPageWidget + + + + + + +studyId: String + + + + + + +Widget? banner() + + + + + + + + + + + App + + + + + + + + + + + AppContent + + + + + + + + + + + + + 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() - - - - + + + - - - PublishSuccessDialog + + + void Function(StudyInvite) - - - +Widget build() + + + + + + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - - + + + - - - PublishConfirmationDialog + + + Intervention? Function(String) - - - +Widget build() + + + + + + + + int Function(StudyInvite) - - - - - + + + + + - - - DrawerEntry + + + InviteCodeFormView - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +autoCloseDrawer: bool - +title: String - +helpText: String? + + + +formViewModel: InviteCodeFormViewModel - - - +void onClick() + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - + + + + + - - - String Function() + + + InviteCodeFormViewModel - - - - - - - - IconData + + + +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>? - - - - - - - - String Function()? + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - + + + - - - void Function(BuildContext, WidgetRef)? + + + FormConsumerWidget - - - - - + + + + + - - - GoRouterDrawerEntry + + + EnrolledBadge - - - +intent: RoutingIntent - +onNavigated: void Function()? + + + +enrolledCount: int - - - +void onClick() + + + +Widget build() - - - + + + - - - RoutingIntent + + + IInviteCodeRepository - - - - + + + - - - AppDrawer + + + FormControl - - - +width: int - +autoCloseDrawer: bool - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + + + + + + FormGroup - - - - + + + + + - - - IAppDelegate + + + FormViewModel - - - +dynamic onAppStart() + + + -_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() - - - - - + + + + + - - - AppController + + + StudyRecruitController - - - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - + + + + + - - - SharedPreferences + + + StudyBaseController + + + + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - + + + + - - - AppStatus + + + StudyRecruitScreen - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - + - + FormInvalidException @@ -4651,9 +4507,9 @@ - + - + Exception @@ -4662,16 +4518,16 @@ - - + + - + FormConfigException - + +message: String? @@ -4680,16 +4536,16 @@ - - + + - + IFormViewModelDelegate - + +dynamic onSave() +void onCancel() @@ -4699,16 +4555,16 @@ - - + + - + IFormGroupController - + +form: FormGroup @@ -4717,16 +4573,16 @@ - - + + - + FormControlOption - + +value: T +label: String @@ -4738,9 +4594,9 @@ - + - + Equatable @@ -4749,16 +4605,16 @@ - - + + - + FormMode - + +index: int <static>+values: List<FormMode> @@ -4771,9 +4627,9 @@ - + - + FormValidationSetEnum @@ -4782,9 +4638,9 @@ - + - + Debouncer @@ -4793,9 +4649,9 @@ - + - + CancelableOperation @@ -4804,16 +4660,16 @@ - - + + - + ManagedFormViewModel - + +ManagedFormViewModel<T> createDuplicate() @@ -4822,9 +4678,9 @@ - + - + FormViewModelNotFoundException @@ -4833,17 +4689,17 @@ - - - + + + - + FormViewModelCollection - + +formViewModels: List<T> +formArray: FormArray<dynamic> @@ -4853,7 +4709,7 @@ - + +void add() +T remove() @@ -4870,80 +4726,28 @@ - + - + FormArray - - - - - - - - - CustomFormControl - - - - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? - - - - - - +void dispose() - - - - - - - - - - - void Function(T?)? - - - - - - - - - - - void Function(ControlStatus)? - - - - - - - + + + - + FormControlValidation - + +control: AbstractControl<dynamic> +validators: List<Validator<dynamic>> @@ -4952,7 +4756,7 @@ - + +FormControlValidation merge() @@ -4961,71 +4765,80 @@ - + - + AbstractControl - - - - - + + + + + - - - IFormData + + + CustomFormControl - - - +id: String + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +IFormData copy() + + + +void dispose() - - - - + + + - - - UnsavedChangesDialog + + + void Function(T?)? - - - +Widget build() + + + + + + + + void Function(ControlStatus)? - - - + + + - + FormArrayTable - + +control: AbstractControl<dynamic> +items: List<T> @@ -5049,7 +4862,7 @@ - + +Widget build() -List<Widget> _buildRow() @@ -5060,9 +4873,9 @@ - + - + void Function(T) @@ -5071,9 +4884,9 @@ - + - + List<ModelAction<dynamic>> Function(T, int) @@ -5082,20 +4895,31 @@ - + - + String Function(T) + + + + + + + IconData + + + + - + - + Widget Function(BuildContext, T, int)? @@ -5104,70 +4928,95 @@ - + - + EdgeInsets - - - - + + + + - - - StudyUJobsToBeDone + + + UnsavedChangesDialog - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - LoginForm + + + IFormData - - - +formKey: AuthFormKey + + + +id: String - - - +Widget build() + + + +IFormData copy() + + + + + + + + + + + + + PasswordRecoveryForm + + + + + + +formKey: AuthFormKey + + + + + + +Widget build() - - + + - + AuthFormKey - + +index: int <static>+values: List<AuthFormKey> @@ -5183,53 +5032,127 @@ - + - + FormConsumerRefWidget - - - - - + + + + + - - - PasswordForgotForm + + + SignupForm - - - +formKey: AuthFormKey + + + +formKey: AuthFormKey - - - +Widget build() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() + + + + + + + + + + + + StudyUJobsToBeDone + + + + + + +Widget build() + + + + + + + + + + + + EmailTextField + + + + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? + + + + + + + + + + + + PasswordTextField + + + + + + +labelText: String + +hintText: String? + +onSubmitted: dynamic Function(FormControl<dynamic>)? + +formControlName: String? + +formControl: FormControl<dynamic>? + + + + + + + + + + + dynamic Function(FormControl<dynamic>)? - - - + + + - + AuthFormController - + +authRepository: IAuthRepository +sharedPreferences: SharedPreferences @@ -5253,7 +5176,7 @@ - + -dynamic _getFormFor() -dynamic _onChangeFormKey() @@ -5278,81 +5201,52 @@ - + - + INotificationService - - - - - - - - EmailTextField - - - - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? - - - - - - - - + + + + + - - - PasswordTextField + + + PasswordForgotForm - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +formKey: AuthFormKey - - - - - - - - dynamic Function(FormControl<dynamic>)? + + + +Widget build() - - + + - + AuthScaffold - + +body: Widget +formKey: AuthFormKey @@ -5363,3303 +5257,3409 @@ - - - - - + + + + + - - - SignupForm + + + LoginForm - - - +formKey: AuthFormKey + + + +formKey: AuthFormKey - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + +Widget build() - - - - - + + + + - - - PasswordRecoveryForm + + + AppStatus - - - +formKey: AuthFormKey + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - +Widget build() + + + + + + + + + + StudyInfoFormData + + + + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() - - - - + + + + + - - - StudyAnalyzeScreen + + + StudyContactInfoFormData - - - +Widget? banner() - +Widget build() + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() - - - - + + + + - - - StudyAnalyzeController + + + IStudyFormData - - - +dynamic onExport() + + + +Study apply() - - - + + + + - - - App + + + StudyDesignInfoFormView + + + + + + +Widget build() - - - + + + + - - - AppContent + + + StudyDesignPageWidget + + + + + + +Widget? banner() - - - - - + + + + + - - - FrameControlsWidget + + + StudyInfoFormViewModel - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - +Widget build() + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - + + + + + - - - ConsumerWidget + + + WithScheduleControls + + + + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? + + + + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - - + + + + + - - - IStudyStatusBadgeViewModel + + + IFormDataWithSchedule - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? + + + + + + +Schedule toSchedule() + + + + + + + + + + + StudyUTimeOfDay + + + + + + + + + + + + + ScheduleControls - - - - - - - - Participation + + + +formViewModel: WithScheduleControls - - - - - - - - StudyStatus + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - - + + + + + - - - StudyStatusBadge + + + WithQuestionnaireControls - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +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() - - - + + + - - - BadgeType + + + IProviderArgsResolver - - - - + + + + + - - - PreviewFrame + + + QuestionFormData - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String + + + + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - + + + + - - - StudyFormRouteArgs + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - - - + + + + + - - - WebFrame + + + ChoiceQuestionFormData - - - +previewSrc: String - +studyId: String + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> - - - +Widget build() + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - - + + + + + - - - DisabledFrame + + + BoolQuestionFormData - - - +Widget build() + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - PhoneContainer + + + ScaleQuestionFormData - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> - - - +Widget build() + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - + - + Color - - - - + + + + + - - - MobileFrame + + + FreeTextQuestionFormData - - - +Widget build() + + + +textLengthRange: List<int> + +textType: FreeTextQuestionType + +textTypeExpression: String? + +responseOptions: List<String> - - - - - - - - - DesktopFrame + + + +Question<dynamic> toQuestion() + +FreeTextQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - +Widget build() + + + + + + + + FreeTextQuestionType - - - - + + + + + - - - StudyTestController + + + QuestionFormViewModel + + + + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - +authRepository: IAuthRepository - +languageCode: String + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - - - - - - IStudyNavViewModel - - + + + - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + IListActionProvider - - - - + + + + - - - StudyNav + + + SurveyQuestionFormView - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - - - - - StudyDesignNav - - + + + + + - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + FreeTextQuestionFormView - - - - - - - - - StudySettingsDialog + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic - - - +Widget build() + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() - - - - - - - - - StudySettingsFormViewModel - - - - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> - - + + + + - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + IScaleQuestionFormViewModel - - - - - - - - AsyncValue + + + +isMidValuesClearedInfoVisible: bool - - - - + + + + - - - TestAppRoutes + + + ScaleQuestionFormView - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + +formViewModel: QuestionFormViewModel - - - - - + + + + + - - - StudyParticipationBadge + + + ChoiceQuestionFormView - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - - - + + + + + - - - StudyTestScreen + + + BoolQuestionFormView - - - +previewRoute: String? + + + +formViewModel: QuestionFormViewModel - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +Widget build() - - - - - + + + + + - - - StudyController + + + QuestionnaireFormData - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +questionsData: List<QuestionFormData>? + +id: String - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - RouteInformation + + + StudyFormScaffold - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) - - - +String toString() + + + +Widget build() - - - - - + + + - - - PlatformController + + + T Function(WidgetRef) - - - +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 Function(T) - - - - - + + + + + - - - WebController + + + StudyFormViewModel - - - +iFrameElement: IFrameElement + + + +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 activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - + + + + + - - - IFrameElement + + + EnrollmentFormViewModel - - - - - - - - - MobileController + + + +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 openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + +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() - - - - + + + + + - - - IStudyAppBarViewModel + + + MeasurementsFormViewModel - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + +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() - - - - + + + + + - - - StudyScaffold + + + ReportsFormViewModel - - - +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 + + + +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 - - - - - - - - NavbarTab + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - + + + + + - - - SingleColumnLayoutType + + + 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 + + - - - IWithBanner + + + +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() - - - - + + + + + - - - StudyMonitorScreen + + + InterventionTaskFormData - - - +Widget build() + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - - - - - - - - MeasurementsFormViewModel + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - +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> + + + + + + + + + + StudyScheduleFormData - - - +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() + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - - - - - - IListActionProvider + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - + + + - - - IProviderArgsResolver + + + PhaseSequence - - - - + + + + - - - MeasurementSurveyFormView + + + InterventionFormView - - - +formViewModel: MeasurementSurveyFormViewModel + + + +formViewModel: InterventionFormViewModel - - - - - + + + + + - - - MeasurementSurveyFormViewModel + + + InterventionFormViewModel - - - +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> + + + +study: Study + +interventionIdControl: FormControl<String> + +interventionTitleControl: FormControl<String> + +interventionIconControl: FormControl<IconOption> + +interventionDescriptionControl: FormControl<String> + +interventionTasksArray: FormArray<dynamic> + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> + +form: FormGroup + +interventionId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneTask: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - - + + + + + - - - MeasurementSurveyFormData + + + StudyScheduleControls - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - - - + + + + + - - - QuestionnaireFormData + + + InterventionsFormData - - - +questionsData: List<QuestionFormData>? - +id: String + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +Study apply() + +InterventionsFormData copy() - - - - - + + + + - - - IFormDataWithSchedule + + + StudyDesignInterventionsFormView - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + +Widget build() - - - +Schedule toSchedule() + + + + + + + + + + StudyScheduleFormView - - - - - - + + + +formViewModel: StudyScheduleControls + + - - - SurveyPreview + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - +routeArgs: MeasurementFormRouteArgs + + + + + + + + + + InterventionTaskFormViewModel - - - +Widget build() + + + +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> - - - - - - - - MeasurementFormRouteArgs + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - - + + + + + - - - WithQuestionnaireControls + + + InterventionFormData - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +Intervention toIntervention() + +InterventionFormData copy() - - - - - - - - - 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>? + + + InterventionTaskFormView - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - MeasurementsFormData + + + InterventionPreview - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + +routeArgs: InterventionFormRouteArgs - - - +Study apply() - +MeasurementsFormData copy() + + + +Widget build() - - - - - - - - IStudyFormData - - + + + - - - +Study apply() + + + InterventionFormRouteArgs - - - - + + + + - - - StudyDesignMeasurementsFormView + + + MeasurementSurveyFormView - - - +Widget build() + + + +formViewModel: MeasurementSurveyFormViewModel - - - - + + + + + - - - StudyDesignPageWidget + + + MeasurementSurveyFormViewModel - - - +Widget? banner() + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> + + + + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - - - + + + + + - - - ScheduleControls + + + SurveyPreview - - - +formViewModel: WithScheduleControls + + + +routeArgs: MeasurementFormRouteArgs - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + +Widget build() - - - + + + - - - StudyUTimeOfDay + + + MeasurementFormRouteArgs - - - - - + + + + + - - - QuestionFormData + + + MeasurementSurveyFormData - - - <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 + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - - - - SurveyQuestionType - - + + + + - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + StudyDesignMeasurementsFormView + + + + + + +Widget build() - - - - - + + + + + - - - ChoiceQuestionFormData + + + MeasurementsFormData - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +Study apply() + +MeasurementsFormData copy() - - - - - + + + + - - - BoolQuestionFormData + + + StudyFormValidationSet - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + + + + + + + + ReportsFormData - - - - - - + + + +reportItems: List<ReportItemFormData> + +id: String + + - - - ScaleQuestionFormData + + + +Study apply() + +ReportsFormData copy() - - - +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> + + + + + + + + + ReportStatus - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - - - + + + + + - - - FreeTextQuestionFormData + + + ReportItemFormView - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - + + + + + - - - FreeTextQuestionType + + + ReportItemFormViewModel - - - - - - - - - - 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 - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + + + + + + Widget Function(BuildContext) - - - - + + + + - - - SurveyQuestionFormView + + + ReportSectionType - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - ChoiceQuestionFormView + + + ReportItemFormData - - - +formViewModel: QuestionFormViewModel + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +Widget build() + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - - - + + + - - - BoolQuestionFormView + + + ReportSection - - - +formViewModel: QuestionFormViewModel + + + + + + + + + + DataReferenceIdentifier - - - +Widget build() + + + +hashCode: int + + + + + + +bool ==() - - - - - + + + - - - FreeTextQuestionFormView + + + DataReference - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic + + + + + + + + + + AverageSectionFormView - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + +Widget build() - - - - + + + + + - - - IScaleQuestionFormViewModel + + + TemporalAggregationFormatted - - - +isMidValuesClearedInfoVisible: bool + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - - - - - - - ScaleQuestionFormView + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - +formViewModel: QuestionFormViewModel + + + + + + + + TemporalAggregation - - - - - + + + + + - - - InterventionFormData + + + ImprovementDirectionFormatted - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - - + + + - - - InterventionTaskFormView + + + ImprovementDirection - - - +formViewModel: InterventionTaskFormViewModel + + + + + + + + + + DataReferenceEditor - - - - - - - - - - InterventionTaskFormViewModel + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +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> + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + + + + + + ReactiveDropdownField - - - - - + + + + + - - - InterventionFormViewModel + + + LinearRegressionSectionFormView - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +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() - - - - - - - - StudyDesignInterventionsFormView + + + + + + + + StudyDesignReportsFormView - - - +Widget build() + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - - - + + + + + - - - InterventionsFormViewModel + + + ReportFormItemDelegate - - - +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 + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - + + + + + - - - StudyScheduleControls + + + ReportBadge - - - <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 + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +Widget build() - - - - - + + + - - - StudyScheduleFormView + + + BadgeType - - - +formViewModel: StudyScheduleControls + + + + + + + + + + EnrollmentFormData - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String + + + + + + +Study apply() + +EnrollmentFormData copy() - - - + + + - - - PhaseSequence + + + Participation - - - - - + + + + + - - - InterventionTaskFormData + + + ConsentItemFormData - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - + + + + + - - - InterventionFormView + + + ConsentItemFormViewModel - - - +formViewModel: InterventionFormViewModel + + + +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> - - - - - - - - - - StudyScheduleFormData + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + + + + + + + IScreenerQuestionLogicFormViewModel - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +isDirtyOptionsBannerVisible: bool - - - - - + + + + + - - - InterventionPreview + + + ScreenerQuestionLogicFormView - - - +routeArgs: InterventionFormRouteArgs + + + +formViewModel: ScreenerQuestionFormViewModel - - - +Widget build() + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - + + + + + - - - InterventionFormRouteArgs + + + ScreenerQuestionFormViewModel + + + + + + <static>+defaultResponseOptionValidity: bool + +responseOptionsDisabledArray: FormArray<dynamic> + +responseOptionsLogicControls: FormArray<bool> + +responseOptionsLogicDescriptionControls: FormArray<String> + -_questionBaseControls: Map<String, AbstractControl<dynamic>> + +prevResponseOptionControls: List<AbstractControl<dynamic>> + +prevResponseOptionValues: List<dynamic> + +responseOptionsDisabledControls: List<AbstractControl<dynamic>> + +logicControlOptions: List<FormControlOption<bool>> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isDirtyOptionsBannerVisible: bool + + + + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - - - - - InterventionsFormData - - + + + + - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + StudyDesignEnrollmentFormView - - - +Study apply() - +InterventionsFormData copy() + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - + + + + - - - StudyDesignInfoFormView + + + ConsentItemFormView - - - +Widget build() + + + +formViewModel: ConsentItemFormViewModel - - - - - + + + + + - - - StudyInfoFormData + + + EnrollmentFormConsentItemDelegate - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +Study apply() - +StudyInfoFormData copy() + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - - - - - StudyContactInfoFormData - - + + + + - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + PublishSuccessDialog - - - +Study apply() - +StudyInfoFormData copy() + + + +Widget build() - - - - - + + + + - - - StudyInfoFormViewModel + + + PublishDialog - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + +Widget build() - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + + + + + + + PublishConfirmationDialog - - - - - - - - - - ReportBadge + + + +Widget build() - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + + + + + + + StudyAnalyzeController - - - +Widget build() + + + +dynamic onExport() - - - - + + + + - - - ReportStatus + + + StudyAnalyzeScreen - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +Widget? banner() + +Widget build() - - - - - + + + + + - - - ReportsFormViewModel + + + DrawerEntry - - - +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 + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +autoCloseDrawer: bool + +title: String + +helpText: String? - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + +void onClick() - - - - - + + + - - - ReportFormItemDelegate + + + String Function() - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + + + + + + String Function()? - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + + + + + + void Function(BuildContext, WidgetRef)? - - - - - + + + + + - - - ReportItemFormData + + + GoRouterDrawerEntry - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +intent: RoutingIntent + +onNavigated: void Function()? - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + +void onClick() - - - + + + - - - ReportSection + + + RoutingIntent - - - - - - - - - ReportItemFormView - - + + + + - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + AppDrawer - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + +width: int + +autoCloseDrawer: bool + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - - - + + + + + - - - ReportItemFormViewModel + + + StudyController - - - <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 + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - + + + + - - - Widget Function(BuildContext) + + + PreviewFrame - - - - - - - - - ReportSectionType + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + + + + + + StudyFormRouteArgs - - - - - + + + + - - - LinearRegressionSectionFormView + + + IStudyStatusBadgeViewModel - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - +Widget build() + + + + + + + + StudyStatus - - - - - + + + + + - - - TemporalAggregationFormatted + + + StudyStatusBadge - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +Widget build() - - - + + + + - - - TemporalAggregation + + + StudyTestController + + + + + + +authRepository: IAuthRepository + +languageCode: String - - - - - + + + + + - - - ImprovementDirectionFormatted + + + RouteInformation - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +String toString() - - - + + + + + - - - ImprovementDirection + + + 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() - - - - - + + + + + - - - DataReferenceIdentifier + + + WebController - - - +hashCode: int + + + +iFrameElement: IFrameElement - - - +bool ==() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - + + + - - - DataReference + + + IFrameElement - - - - - - - - - AverageSectionFormView - - + + + + - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + MobileController - - - +Widget build() + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - - - + + + + + - - - DataReferenceEditor + + + StudySettingsFormViewModel - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - + + + - - - ReactiveDropdownField + + + AsyncValue - - - - - - - - - ReportsFormData - - + + + + - - - +reportItems: List<ReportItemFormData> - +id: String + + + StudySettingsDialog - - - +Study apply() - +ReportsFormData copy() + + + +Widget build() - - - - + + + + + - - - StudyDesignReportsFormView + + + StudyTestScreen - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +previewRoute: String? - - - - - - - - - - EnrollmentFormData + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String - - + + + + + + - - - +Study apply() - +EnrollmentFormData copy() + + + StudyParticipationBadge - - - - - - - - - ConsentItemFormView + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + +center: bool - - - +formViewModel: ConsentItemFormViewModel + + + +Widget build() - - - - - - - - - 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> + + + IStudyAppBarViewModel - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - - + + + + - - - StudyDesignEnrollmentFormView + + + IStudyNavViewModel - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - - + + + + - - - IScreenerQuestionLogicFormViewModel + + + StudyScaffold - - - +isDirtyOptionsBannerVisible: bool + + + +studyId: String + +tabs: List<NavbarTab>? + +tabsSubnav: List<NavbarTab>? + +selectedTab: NavbarTab? + +selectedTabSubnav: NavbarTab? + +body: StudyPageWidget + +drawer: Widget? + +disableActions: bool + +actionsSpacing: double + +actionsPadding: double + +layoutType: SingleColumnLayoutType? + +appbarHeight: double + +appbarSubnavHeight: double - - - - - - - - - ScreenerQuestionLogicFormView - - + + + - - - +formViewModel: ScreenerQuestionFormViewModel + + + NavbarTab - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + + + + + + SingleColumnLayoutType - - - - - + + + + + - - - 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() - - - - - + + + + + - - - EnrollmentFormViewModel + + + WebFrame - - - +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()> + + + +previewSrc: String + +studyId: 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() - - - - - - - - - EnrollmentFormConsentItemDelegate - - + + + + - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + DisabledFrame - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Widget build() - - - - - + + + + + - - - ConsentItemFormData + + + PhoneContainer - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +Widget build() - - - - - - - - - StudyFormScaffold - - + + + + - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + MobileFrame - - - +Widget build() + + + +Widget build() - - - + + + + - - - T Function(WidgetRef) + + + DesktopFrame - - - - - - - - Widget Function(T) + + + +Widget build() - - - - - + + + - - - StudyFormViewModel + + + IWithBanner - - - +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> + + + + + + + + + TestAppRoutes - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - - + + + + - - - StudyFormValidationSet + + + StudyNav - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - - + + + + - - - AccountSettingsDialog + + + StudyDesignNav - - - +Widget build() + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() From dc75b597c9db75fdb9af392d71029915f2e9eda4 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 15 Mar 2024 16:01:41 +0100 Subject: [PATCH 03/14] fix: sql error --- database/app_config.sql.example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/app_config.sql.example b/database/app_config.sql.example index 9dff2612f..9f3977277 100644 --- a/database/app_config.sql.example +++ b/database/app_config.sql.example @@ -1,7 +1,7 @@ -INSERT INTO public.app_config (id, app_privacy, app_terms, designer_privacy, designer_terms, imprint, contact, analytics) +INSERT INTO public.app_config (id, app_min_version, app_privacy, app_terms, designer_privacy, designer_terms, imprint, contact, analytics) VALUES ( 'prod', - '2.6.0' + '2.6.0', '{ "de": "example.com", "en": "example.com" }', '{ "de": "example.com", "en": "example.com" }', '{ "de": "example.com", "en": "example.com" }', From e7f9ddcb7dfbb11e9fdd05e3791b55d2a1fe52b9 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 15 Mar 2024 16:01:50 +0100 Subject: [PATCH 04/14] fix: enable color emoji --- designer_v2/web/index.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer_v2/web/index.html b/designer_v2/web/index.html index d031b69a4..40041af31 100644 --- a/designer_v2/web/index.html +++ b/designer_v2/web/index.html @@ -52,7 +52,9 @@ serviceWorkerVersion: serviceWorkerVersion, }, onEntrypointLoaded: function(engineInitializer) { - engineInitializer.initializeEngine().then(function(appRunner) { + engineInitializer.initializeEngine({ + useColorEmoji: true, + }).then(function(appRunner) { appRunner.runApp(); }); } From 85198de2e38658be26841f2f81223f35253703c5 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 15 Mar 2024 16:16:31 +0100 Subject: [PATCH 05/14] style: remove ripple effect from dashboard table item --- designer_v2/lib/features/dashboard/studies_table_item.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/designer_v2/lib/features/dashboard/studies_table_item.dart b/designer_v2/lib/features/dashboard/studies_table_item.dart index 2dfe3734d..1636e2a0f 100644 --- a/designer_v2/lib/features/dashboard/studies_table_item.dart +++ b/designer_v2/lib/features/dashboard/studies_table_item.dart @@ -84,6 +84,7 @@ class _StudiesTableItemState extends State { ), elevation: 0.0, child: InkWell( + splashColor: Colors.transparent, onTap: () => widget.onTap?.call(widget.study), onHover: (hover) { setState(() { From d0802816911f78555220f37c8593593eb9a7007c Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 15 Mar 2024 16:33:18 +0100 Subject: [PATCH 06/14] style: navbar divider color transparent --- designer_v2/lib/common_views/navbar_tabbed.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/designer_v2/lib/common_views/navbar_tabbed.dart b/designer_v2/lib/common_views/navbar_tabbed.dart index 20f748729..8d9a6c1a9 100644 --- a/designer_v2/lib/common_views/navbar_tabbed.dart +++ b/designer_v2/lib/common_views/navbar_tabbed.dart @@ -190,6 +190,7 @@ class _TabbedNavbarState extends ConsumerState Date: Fri, 15 Mar 2024 15:38:50 +0000 Subject: [PATCH 07/14] docs: update UML documentation --- docs/uml/designer_v2/lib/common_views/uml.svg | 3932 +-- .../lib/features/dashboard/uml.svg | 720 +- docs/uml/designer_v2/lib/features/uml.svg | 11220 ++++----- docs/uml/designer_v2/lib/uml.svg | 20416 ++++++++-------- 4 files changed, 18145 insertions(+), 18143 deletions(-) diff --git a/docs/uml/designer_v2/lib/common_views/uml.svg b/docs/uml/designer_v2/lib/common_views/uml.svg index b38b6d5e7..425f28f48 100644 --- a/docs/uml/designer_v2/lib/common_views/uml.svg +++ b/docs/uml/designer_v2/lib/common_views/uml.svg @@ -1,89 +1,40 @@ - - [ConstrainedWidthFlexible + + [<abstract>ISyncIndicatorViewModel | - +minWidth: double; - +maxWidth: double; - +flex: int; - +flexSum: int; - +child: Widget; - +outerConstraints: BoxConstraints - | - +Widget build(); - -double _getWidth() - ] - - [ConstrainedWidthFlexible]o-[<abstract>Widget] - [ConstrainedWidthFlexible]o-[BoxConstraints] - - [ErrorPage - | - +error: Exception? - | - +Widget build() + +isDirty: bool; + +lastSynced: DateTime? ] - [<abstract>ConsumerWidget]<:-[ErrorPage] - - [SplashPage + [SyncIndicator | - +Widget build() + +state: AsyncValue<T>; + +lastSynced: DateTime?; + +isDirty: bool; + +animationDuration: int; + +iconSize: double ] - [UnderConstruction - | - +Widget build() - ] + [SyncIndicator]o-[<abstract>AsyncValue] - [SecondaryButton + [EmptyBody | - +text: String; +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? - | - +Widget build() - ] - - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] - - [StandardDialog - | - +title: Widget?; - +titleText: String?; - +body: Widget; - +actionButtons: List<Widget>; - +backgroundColor: Color?; - +borderRadius: double?; - +width: double?; - +height: double?; - +minWidth: double; - +minHeight: double; - +maxWidth: double?; - +maxHeight: double?; - +padding: EdgeInsets - | - +Widget build() - ] - - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] - - [<abstract>FormConsumerWidget + +leading: Widget?; + +leadingSpacing: double?; + +title: String?; + +description: String?; + +button: Widget? | +Widget build() ] - [<abstract>FormConsumerRefWidget - | - +Widget build() - ] + [EmptyBody]o-[IconData] + [EmptyBody]o-[<abstract>Widget] - [ReactiveCustomColorPicker + [NullHelperDecoration ] - [ReactiveFormField]<:-[ReactiveCustomColorPicker] + [InputDecoration]<:-[NullHelperDecoration] [Search | @@ -103,83 +54,114 @@ [SearchController]o-[void Function(String)] - [ActionMenuType + [ConstrainedWidthFlexible | - +index: int; - <static>+values: List<ActionMenuType>; - <static>+inline: ActionMenuType; - <static>+popup: ActionMenuType + +minWidth: double; + +maxWidth: double; + +flex: int; + +flexSum: int; + +child: Widget; + +outerConstraints: BoxConstraints + | + +Widget build(); + -double _getWidth() ] - [ActionMenuType]o-[ActionMenuType] - [Enum]<:--[ActionMenuType] + [ConstrainedWidthFlexible]o-[<abstract>Widget] + [ConstrainedWidthFlexible]o-[BoxConstraints] - [<abstract>ISyncIndicatorViewModel + [AsyncValueWidget | - +isDirty: bool; - +lastSynced: DateTime? - ] - - [SyncIndicator + +value: AsyncValue<T>; + +data: Widget Function(T); + +error: Widget Function(Object, StackTrace?)?; + +loading: Widget Function()?; + +empty: Widget Function()? | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double + +Widget build(); + -Widget _buildDataOrEmptyWidget(); + -Widget _defaultError(); + -Widget _defaultLoad() ] - [SyncIndicator]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[Widget Function(T)] + [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] + [AsyncValueWidget]o-[Widget Function()?] - [FormControlLabel + [ActionPopUpMenuButton | - +formControl: AbstractControl<dynamic>; - +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? + +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() ] - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + [ActionPopUpMenuButton]o-[Color] + [ActionPopUpMenuButton]o-[Axis] + [ActionPopUpMenuButton]o-[PopupMenuPosition] - [<abstract>IWithBanner + [PrimaryButton | - +Widget? banner() + +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 ] - [BannerBox + [PrimaryButton]o-[IconData] + [PrimaryButton]o-[void Function()?] + [PrimaryButton]o-[dynamic Function()?] + [PrimaryButton]o-[EdgeInsets] + [PrimaryButton]o-[Size] + + [Hyperlink | - +prefixIcon: Widget?; - +body: Widget; - +style: BannerStyle; - +padding: EdgeInsets?; - +noPrefix: bool; - +dismissable: bool; - +isDismissed: bool?; - +onDismissed: dynamic Function()?; - +dismissIconSize: double + +text: String; + +url: String?; + +onClick: void Function()?; + +linkColor: Color; + +hoverColor: Color?; + +visitedColor: Color?; + +style: TextStyle?; + +hoverStyle: TextStyle?; + +visitedStyle: TextStyle?; + +icon: IconData?; + +iconSize: double? ] - [BannerBox]o-[<abstract>Widget] - [BannerBox]o-[BannerStyle] - [BannerBox]o-[EdgeInsets] - [BannerBox]o-[dynamic Function()?] + [Hyperlink]o-[void Function()?] + [Hyperlink]o-[Color] + [Hyperlink]o-[TextStyle] + [Hyperlink]o-[IconData] - [BannerStyle + [DismissButton | - +index: int; - <static>+values: List<BannerStyle>; - <static>+warning: BannerStyle; - <static>+info: BannerStyle; - <static>+error: BannerStyle + +onPressed: void Function()?; + +text: String? + | + +Widget build() ] - [BannerStyle]o-[BannerStyle] - [Enum]<:--[BannerStyle] + [DismissButton]o-[void Function()?] [FormTableRow | @@ -250,94 +232,110 @@ [FormTableRowLayout]o-[FormTableRowLayout] [Enum]<:--[FormTableRowLayout] - [DismissButton - | - +onPressed: void Function()?; - +text: String? + [ActionMenuType | - +Widget build() + +index: int; + <static>+values: List<ActionMenuType>; + <static>+inline: ActionMenuType; + <static>+popup: ActionMenuType ] - [DismissButton]o-[void Function()?] + [ActionMenuType]o-[ActionMenuType] + [Enum]<:--[ActionMenuType] - [EmptyBody - | - +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? - | - +Widget build() + [ReactiveCustomColorPicker ] - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] + [ReactiveFormField]<:-[ReactiveCustomColorPicker] - [IndicatorRangeSliderThumbShape - | - +buildContext: BuildContext; - +start: T; - +end: T + [NavbarTab | - +Size getPreferredSize(); - +void paint() + +title: String; + +intent: RoutingIntent?; + +index: int; + +enabled: bool ] - [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] - [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] + [NavbarTab]o-[RoutingIntent] - [Hyperlink + [TabbedNavbar | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? + +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? ] - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] + [TabbedNavbar]o-[BoxDecoration] + [TabbedNavbar]o-[Color] + [TabbedNavbar]o-[void Function(int, T)?] + [TabbedNavbar]o-[EdgeInsets] + [TabbedNavbar]o-[TabBarIndicatorSize] - [SingleColumnLayout + [Collapsible | - <static>+defaultConstraints: BoxConstraints; - <static>+defaultConstraintsNarrow: BoxConstraints; - +body: Widget; - +header: Widget?; - +stickyHeader: bool; - +constraints: BoxConstraints?; - +scroll: bool; - +padding: EdgeInsets? + +contentBuilder: Widget Function(BuildContext, bool); + +headerBuilder: Widget Function(BuildContext, bool)?; + +title: String?; + +isCollapsed: bool + ] + + [Collapsible]o-[Widget Function(BuildContext, bool)] + [Collapsible]o-[Widget Function(BuildContext, bool)?] + + [StudyULogo | - <static>+dynamic fromType() + +onTap: void Function()? + | + +Widget build() ] - [SingleColumnLayout]o-[BoxConstraints] - [SingleColumnLayout]o-[<abstract>Widget] - [SingleColumnLayout]o-[EdgeInsets] + [StudyULogo]o-[void Function()?] - [SingleColumnLayoutType + [FormSideSheetTab | - +index: int; - <static>+values: List<SingleColumnLayoutType>; - <static>+boundedWide: SingleColumnLayoutType; - <static>+boundedNarrow: SingleColumnLayoutType; - <static>+stretched: SingleColumnLayoutType; - <static>+split: SingleColumnLayoutType + +formViewBuilder: Widget Function(T) ] - [SingleColumnLayoutType]o-[SingleColumnLayoutType] - [Enum]<:--[SingleColumnLayoutType] + [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 | @@ -357,263 +355,68 @@ [MouseEventsRegion]o-[void Function(PointerExitEvent)?] [MouseEventsRegion]o-[SystemMouseCursor] - [HelpIcon + [FormControlLabel | - +tooltipText: String? + +formControl: AbstractControl<dynamic>; + +text: String; + +isClickable: bool; + +textStyle: TextStyle?; + +onClick: void Function(AbstractControl<dynamic>)? | +Widget build() ] - [FormScaffold - | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double - ] - - [FormScaffold]o-[<abstract>Widget] - - [StandardTableColumn - | - +label: String; - +tooltip: String?; - +columnWidth: TableColumnWidth; - +sortable: bool; - +sortAscending: bool?; - +sortableIcon: Widget? - ] - - [StandardTableColumn]o-[<abstract>TableColumnWidth] - [StandardTableColumn]o-[<abstract>Widget] - - [StandardTable - | - +items: List<T>; - +inputColumns: List<StandardTableColumn>; - +onSelectItem: void Function(T); - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; - +trailingActionsMenuType: ActionMenuType?; - +sortColumnPredicates: List<int Function(T, T)?>?; - +pinnedPredicates: int Function(T, T)?; - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; - +inputTrailingActionsColumn: StandardTableColumn; - +tableWrapper: Widget Function(Widget)?; - +cellSpacing: double; - +rowSpacing: double; - +minRowHeight: double?; - +showTableHeader: bool; - +hideLeadingTrailingWhenEmpty: bool; - +leadingWidget: Widget?; - +trailingWidget: Widget?; - +leadingWidgetSpacing: double?; - +trailingWidgetSpacing: double?; - +emptyWidget: Widget?; - +rowStyle: StandardTableStyle; - +disableRowInteractions: bool - ] - - [StandardTable]o-[void Function(T)] - [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] - [StandardTable]o-[ActionMenuType] - [StandardTable]o-[int Function(T, T)?] - [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] - [StandardTable]o-[StandardTableColumn] - [StandardTable]o-[Widget Function(Widget)?] - [StandardTable]o-[<abstract>Widget] - [StandardTable]o-[StandardTableStyle] - - [StandardTableStyle - | - +index: int; - <static>+values: List<StandardTableStyle>; - <static>+plain: StandardTableStyle; - <static>+material: StandardTableStyle - ] - - [StandardTableStyle]o-[StandardTableStyle] - [Enum]<:--[StandardTableStyle] + [FormControlLabel]o-[<abstract>AbstractControl] + [FormControlLabel]o-[TextStyle] + [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - [ActionMenuInline - | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? + [<abstract>IWithBanner | - +Widget build() + +Widget? banner() ] - [Badge - | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle? + [BannerBox | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() + +prefixIcon: Widget?; + +body: Widget; + +style: BannerStyle; + +padding: EdgeInsets?; + +noPrefix: bool; + +dismissable: bool; + +isDismissed: bool?; + +onDismissed: dynamic Function()?; + +dismissIconSize: double ] - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] + [BannerBox]o-[<abstract>Widget] + [BannerBox]o-[BannerStyle] + [BannerBox]o-[EdgeInsets] + [BannerBox]o-[dynamic Function()?] - [BadgeType + [BannerStyle | +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType - ] - - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] - - [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] - - [HtmlStylingBanner - | - +isDismissed: bool; - +onDismissed: dynamic Function()? - | - +Widget build() - ] - - [HtmlStylingBanner]o-[dynamic Function()?] - - [AsyncValueWidget - | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? - | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() - ] - - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] - - [NullHelperDecoration - ] - - [InputDecoration]<:-[NullHelperDecoration] - - [Collapsible - | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool - ] - - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] - - [ActionPopUpMenuButton - | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition - | - +Widget build(); - -Widget _buildPopupMenu() - ] - - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] - - [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)? + <static>+values: List<BannerStyle>; + <static>+warning: BannerStyle; + <static>+info: BannerStyle; + <static>+error: BannerStyle ] - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] + [BannerStyle]o-[BannerStyle] + [Enum]<:--[BannerStyle] - [FormSideSheetTab + [SecondaryButton | - +formViewBuilder: Widget Function(T) + +text: String; + +icon: IconData?; + +isLoading: bool; + +onPressed: void Function()? + | + +Widget build() ] - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] + [SecondaryButton]o-[IconData] + [SecondaryButton]o-[void Function()?] [IconPack | @@ -687,871 +490,903 @@ [IconPickerGallery]o-[void Function(IconOption)?] - [StudyULogo + [SingleColumnLayout | - +onTap: void Function()? + <static>+defaultConstraints: BoxConstraints; + <static>+defaultConstraintsNarrow: BoxConstraints; + +body: Widget; + +header: Widget?; + +stickyHeader: bool; + +constraints: BoxConstraints?; + +scroll: bool; + +padding: EdgeInsets? | - +Widget build() + <static>+dynamic fromType() ] - [StudyULogo]o-[void Function()?] + [SingleColumnLayout]o-[BoxConstraints] + [SingleColumnLayout]o-[<abstract>Widget] + [SingleColumnLayout]o-[EdgeInsets] - [NavbarTab + [SingleColumnLayoutType | - +title: String; - +intent: RoutingIntent?; +index: int; - +enabled: bool + <static>+values: List<SingleColumnLayoutType>; + <static>+boundedWide: SingleColumnLayoutType; + <static>+boundedNarrow: SingleColumnLayoutType; + <static>+stretched: SingleColumnLayoutType; + <static>+split: SingleColumnLayoutType ] - [NavbarTab]o-[RoutingIntent] + [SingleColumnLayoutType]o-[SingleColumnLayoutType] + [Enum]<:--[SingleColumnLayoutType] - [TabbedNavbar + [<abstract>FormConsumerWidget | - +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; + +Widget build() + ] + + [<abstract>FormConsumerRefWidget + | + +Widget build() + ] + + [FormScaffold + | + +formViewModel: T; + +actions: List<Widget>?; + +body: Widget; + +drawer: Widget?; + +actionsSpacing: double; + +actionsPadding: double + ] + + [FormScaffold]o-[<abstract>Widget] + + [StandardDialog + | + +title: Widget?; + +titleText: String?; + +body: Widget; + +actionButtons: List<Widget>; +backgroundColor: Color?; - +labelColorHover: Color?; - +unselectedLabelColorHover: Color? + +borderRadius: double?; + +width: double?; + +height: double?; + +minWidth: double; + +minHeight: double; + +maxWidth: double?; + +maxHeight: double?; + +padding: EdgeInsets + | + +Widget build() + ] + + [StandardDialog]o-[<abstract>Widget] + [StandardDialog]o-[Color] + [StandardDialog]o-[EdgeInsets] + + [HtmlStylingBanner + | + +isDismissed: bool; + +onDismissed: dynamic Function()? + | + +Widget build() + ] + + [HtmlStylingBanner]o-[dynamic Function()?] + + [StandardTableColumn + | + +label: String; + +tooltip: String?; + +columnWidth: TableColumnWidth; + +sortable: bool; + +sortAscending: bool?; + +sortableIcon: Widget? + ] + + [StandardTableColumn]o-[<abstract>TableColumnWidth] + [StandardTableColumn]o-[<abstract>Widget] + + [StandardTable + | + +items: List<T>; + +inputColumns: List<StandardTableColumn>; + +onSelectItem: void Function(T); + +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)?; + +trailingActionsMenuType: ActionMenuType?; + +sortColumnPredicates: List<int Function(T, T)?>?; + +pinnedPredicates: int Function(T, T)?; + +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)?; + +inputTrailingActionsColumn: StandardTableColumn; + +tableWrapper: Widget Function(Widget)?; + +cellSpacing: double; + +rowSpacing: double; + +minRowHeight: double?; + +showTableHeader: bool; + +hideLeadingTrailingWhenEmpty: bool; + +leadingWidget: Widget?; + +trailingWidget: Widget?; + +leadingWidgetSpacing: double?; + +trailingWidgetSpacing: double?; + +emptyWidget: Widget?; + +rowStyle: StandardTableStyle; + +disableRowInteractions: bool + ] + + [StandardTable]o-[void Function(T)] + [StandardTable]o-[List<ModelAction<dynamic>> Function(T, int)?] + [StandardTable]o-[ActionMenuType] + [StandardTable]o-[int Function(T, T)?] + [StandardTable]o-[TableRow Function(BuildContext, List<StandardTableColumn>)?] + [StandardTable]o-[StandardTableColumn] + [StandardTable]o-[Widget Function(Widget)?] + [StandardTable]o-[<abstract>Widget] + [StandardTable]o-[StandardTableStyle] + + [StandardTableStyle + | + +index: int; + <static>+values: List<StandardTableStyle>; + <static>+plain: StandardTableStyle; + <static>+material: StandardTableStyle + ] + + [StandardTableStyle]o-[StandardTableStyle] + [Enum]<:--[StandardTableStyle] + + [TwoColumnLayout + | + <static>+defaultDivider: VerticalDivider; + <static>+defaultContentPadding: EdgeInsets; + <static>+slimContentPadding: EdgeInsets; + +leftWidget: Widget; + +rightWidget: Widget; + +dividerWidget: Widget?; + +headerWidget: Widget?; + +flexLeft: int?; + +flexRight: int?; + +constraintsLeft: BoxConstraints?; + +constraintsRight: BoxConstraints?; + +scrollLeft: bool; + +scrollRight: bool; + +paddingLeft: EdgeInsets?; + +paddingRight: EdgeInsets?; + +backgroundColorLeft: Color?; + +backgroundColorRight: Color?; + +stretchHeight: bool + ] + + [TwoColumnLayout]o-[VerticalDivider] + [TwoColumnLayout]o-[EdgeInsets] + [TwoColumnLayout]o-[<abstract>Widget] + [TwoColumnLayout]o-[BoxConstraints] + [TwoColumnLayout]o-[Color] + + [ActionMenuInline + | + +actions: List<ModelAction<dynamic>>; + +iconSize: double?; + +visible: bool; + +splashRadius: double?; + +paddingVertical: double?; + +paddingHorizontal: double? + | + +Widget build() + ] + + [TextParagraph + | + +text: String?; + +style: TextStyle?; + +selectable: bool; + +span: List<TextSpan>? + | + +Widget build() + ] + + [TextParagraph]o-[TextStyle] + + [SplashPage + | + +Widget build() + ] + + [ErrorPage + | + +error: Exception? + | + +Widget build() + ] + + [<abstract>ConsumerWidget]<:-[ErrorPage] + + [Badge + | + +icon: IconData?; + +color: Color?; + +borderRadius: double; + +label: String; + +type: BadgeType; + +padding: EdgeInsets; + +iconSize: double?; + +labelStyle: TextStyle?; + +center: bool + | + +Widget build(); + -Color? _getBackgroundColor(); + -Color _getBorderColor(); + -Color? _getLabelColor() + ] + + [Badge]o-[IconData] + [Badge]o-[Color] + [Badge]o-[BadgeType] + [Badge]o-[EdgeInsets] + [Badge]o-[TextStyle] + + [BadgeType + | + +index: int; + <static>+values: List<BadgeType>; + <static>+filled: BadgeType; + <static>+outlined: BadgeType; + <static>+outlineFill: BadgeType; + <static>+plain: BadgeType ] - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] + [BadgeType]o-[BadgeType] + [Enum]<:--[BadgeType] - [TextParagraph + [IndicatorRangeSliderThumbShape | - +text: String?; - +style: TextStyle?; - +selectable: bool; - +span: List<TextSpan>? + +buildContext: BuildContext; + +start: T; + +end: T | - +Widget build() + +Size getPreferredSize(); + +void paint() ] - [TextParagraph]o-[TextStyle] + [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] + [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] - [PrimaryButton + [HelpIcon | - +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 + +tooltipText: String? + | + +Widget build() ] - [PrimaryButton]o-[IconData] - [PrimaryButton]o-[void Function()?] - [PrimaryButton]o-[dynamic Function()?] - [PrimaryButton]o-[EdgeInsets] - [PrimaryButton]o-[Size] + [UnderConstruction + | + +Widget build() + ] - + - + - - - - - - + + - + - - - + - + - + - + - + + + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - + - + - - - + - + - + - + - - - + + - + + - + - - - + + - + + + + - + - + - + - + - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - - - + + - + + - + - - - + - + - + - + - + - + - + - + - - - + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - - - - - - - - - - - ConstrainedWidthFlexible - - - - - - +minWidth: double - +maxWidth: double - +flex: int - +flexSum: int - +child: Widget - +outerConstraints: BoxConstraints - - - - - - +Widget build() - -double _getWidth() - - - - - - - - - - - Widget - - - + - - - - - - - BoxConstraints - - - + + + - - - - - - - - - ErrorPage - - - - - - +error: Exception? - - - - - - +Widget build() - - - + + + - - - - - - - ConsumerWidget - - - + + + - - - - - - - - SplashPage - - - - - - +Widget build() - - - + + + - - - - - - - - UnderConstruction - - - - - - +Widget build() - - - + + - - - - - - - - - SecondaryButton - - - - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? - - - - - - +Widget build() - - - + + + + - - - + + + + + + - - - IconData + + + ISyncIndicatorViewModel - - - - - - - - void Function()? + + + +isDirty: bool + +lastSynced: DateTime? - - - - - - - - - StandardDialog - - + + + + - - - +title: Widget? - +titleText: String? - +body: Widget - +actionButtons: List<Widget> - +backgroundColor: Color? - +borderRadius: double? - +width: double? - +height: double? - +minWidth: double - +minHeight: double - +maxWidth: double? - +maxHeight: double? - +padding: EdgeInsets + + + SyncIndicator - - - +Widget build() + + + +state: AsyncValue<T> + +lastSynced: DateTime? + +isDirty: bool + +animationDuration: int + +iconSize: double - - - + + + - - - Color + + + AsyncValue - - - + + + + + - - - EdgeInsets + + + EmptyBody - - - - - - - - - FormConsumerWidget + + + +icon: IconData? + +leading: Widget? + +leadingSpacing: double? + +title: String? + +description: String? + +button: Widget? - - - +Widget build() + + + +Widget build() - - - - + + + - - - FormConsumerRefWidget + + + IconData - - - +Widget build() + + + + + + + + Widget - - - + + + - - - ReactiveCustomColorPicker + + + NullHelperDecoration - - - + + + - - - ReactiveFormField + + + InputDecoration - - + + - + Search - + +onQueryChanged: dynamic Function(String) +searchController: SearchController? @@ -1563,9 +1398,9 @@ - + - + dynamic Function(String) @@ -1574,16 +1409,16 @@ - - + + - + SearchController - + +setText: void Function(String) @@ -1592,250 +1427,341 @@ - + - + void Function(String) - - - - + + + + + - - - ActionMenuType + + + ConstrainedWidthFlexible - - - +index: int - <static>+values: List<ActionMenuType> - <static>+inline: ActionMenuType - <static>+popup: ActionMenuType + + + +minWidth: double + +maxWidth: double + +flex: int + +flexSum: int + +child: Widget + +outerConstraints: BoxConstraints + + + + + + +Widget build() + -double _getWidth() - - - + + + - - - Enum + + + BoxConstraints - - - - + + + + + - - - ISyncIndicatorViewModel + + + AsyncValueWidget - - - +isDirty: bool - +lastSynced: DateTime? + + + +value: AsyncValue<T> + +data: Widget Function(T) + +error: Widget Function(Object, StackTrace?)? + +loading: Widget Function()? + +empty: Widget Function()? + + + + + + +Widget build() + -Widget _buildDataOrEmptyWidget() + -Widget _defaultError() + -Widget _defaultLoad() - - - - + + + - - - SyncIndicator + + + Widget Function(T) - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double + + + + + + + + Widget Function(Object, StackTrace?)? - - - + + + - - - AsyncValue + + + Widget Function()? - - - - - + + + + + - - - FormControlLabel + + + ActionPopUpMenuButton - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? + + + +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() - - - + + + - - - AbstractControl + + + Color - - - + + + - - - TextStyle + + + Axis - - - + + + + + + + PopupMenuPosition + + + + + + + + + + + + PrimaryButton + + + + + + +text: String + +icon: IconData? + +isLoading: bool + +showLoadingEarliestAfterMs: int + +onPressed: void Function()? + +tooltip: String + +tooltipDisabled: String + +enabled: bool + +onPressedFuture: dynamic Function()? + +innerPadding: EdgeInsets + +minimumSize: Size? + +isDisabled: bool + + + + + + + + + + + void Function()? + + + + + + + + + + + dynamic Function()? + + + + + + + + + + + EdgeInsets + + + + + + + - - - void Function(AbstractControl<dynamic>)? + + + Size - - - - + + + + - - - IWithBanner + + + Hyperlink - - - +Widget? banner() + + + +text: String + +url: String? + +onClick: void Function()? + +linkColor: Color + +hoverColor: Color? + +visitedColor: Color? + +style: TextStyle? + +hoverStyle: TextStyle? + +visitedStyle: TextStyle? + +icon: IconData? + +iconSize: double? - - - - - - - - BannerBox - - + + + - - - +prefixIcon: Widget? - +body: Widget - +style: BannerStyle - +padding: EdgeInsets? - +noPrefix: bool - +dismissable: bool - +isDismissed: bool? - +onDismissed: dynamic Function()? - +dismissIconSize: double + + + TextStyle - - - - + + + + + - - - BannerStyle + + + DismissButton - - - +index: int - <static>+values: List<BannerStyle> - <static>+warning: BannerStyle - <static>+info: BannerStyle - <static>+error: BannerStyle + + + +onPressed: void Function()? + +text: String? - - - - - - - - dynamic Function()? + + + +Widget build() - - + + - + FormTableRow - + +label: String? +labelBuilder: Widget Function(BuildContext)? @@ -1850,27 +1776,38 @@ - + - + Widget Function(BuildContext)? + + + + + + + AbstractControl + + + + - - + + - + FormTableRowLayout - + +index: int <static>+values: List<FormTableRowLayout> @@ -1882,17 +1819,17 @@ - - - + + + - + FormTableLayout - + +rows: List<FormTableRow> +columnWidths: Map<int, TableColumnWidth> @@ -1902,7 +1839,7 @@ - + +Widget build() @@ -1911,17 +1848,17 @@ - - - + + + - + FormSectionHeader - + +title: String +titleTextStyle: TextStyle? @@ -1931,7 +1868,7 @@ - + +Widget build() @@ -1940,17 +1877,17 @@ - - - + + + - + FormLabel - + +labelText: String? +helpText: String? @@ -1959,214 +1896,329 @@ - + +Widget build() - - - - - + + + - - - DismissButton + + + Enum - - - +onPressed: void Function()? - +text: String? + + + + + + + + + ActionMenuType - - - +Widget build() + + + +index: int + <static>+values: List<ActionMenuType> + <static>+inline: ActionMenuType + <static>+popup: ActionMenuType - - - - - + + + - - - EmptyBody + + + ReactiveCustomColorPicker - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? + + + + + + + + ReactiveFormField - - - +Widget build() + + + + + + + + + NavbarTab + + + + + + +title: String + +intent: RoutingIntent? + +index: int + +enabled: bool - - - - - + + + - - - IndicatorRangeSliderThumbShape + + + RoutingIntent - - - +buildContext: BuildContext - +start: T - +end: T + + + + + + + + + TabbedNavbar - - - +Size getPreferredSize() - +void paint() + + + +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? - - - + + + - - - BuildContext + + + BoxDecoration - - - + + + - - - RangeSliderThumbShape + + + void Function(int, T)? + + + + + + + + + + + TabBarIndicatorSize + + + + + + + + + + + + Collapsible + + + + + + +contentBuilder: Widget Function(BuildContext, bool) + +headerBuilder: Widget Function(BuildContext, bool)? + +title: String? + +isCollapsed: bool + + + + + + + + + + + Widget Function(BuildContext, bool) + + + + + + + + + + + Widget Function(BuildContext, bool)? + + + + + + + + + + + + + StudyULogo + + + + + + +onTap: void Function()? + + + + + + +Widget build() - - - - + + + + - - - Hyperlink + + + FormSideSheetTab - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: double? + + + +formViewBuilder: Widget Function(T) - - - - - + + + + - - - SingleColumnLayout + + + SidesheetTab - - - <static>+defaultConstraints: BoxConstraints - <static>+defaultConstraintsNarrow: BoxConstraints - +body: Widget - +header: Widget? - +stickyHeader: bool - +constraints: BoxConstraints? - +scroll: bool - +padding: EdgeInsets? + + + +builder: Widget Function(BuildContext) - - - <static>+dynamic fromType() + + + + + + + + Widget Function(BuildContext) - - - - + + + + - - - SingleColumnLayoutType + + + Sidesheet - - - +index: int - <static>+values: List<SingleColumnLayoutType> - <static>+boundedWide: SingleColumnLayoutType - <static>+boundedNarrow: SingleColumnLayoutType - <static>+stretched: SingleColumnLayoutType - <static>+split: SingleColumnLayoutType + + + <static>+kDefaultWidth: double + +titleText: String + +body: Widget? + +tabs: List<SidesheetTab>? + +actionButtons: List<Widget>? + +width: double? + +withCloseButton: bool + +ignoreAppBar: bool + +collapseSingleTab: bool + +bodyPadding: EdgeInsets? + +wrapContent: Widget Function(Widget)? + + + + + + + + + + + Widget Function(Widget)? - - + + - + MouseEventsRegion - + +onTap: void Function()? +onHover: void Function(PointerHoverEvent)? @@ -2182,9 +2234,9 @@ - + - + void Function(PointerHoverEvent)? @@ -2193,9 +2245,9 @@ - + - + void Function(PointerEnterEvent)? @@ -2204,9 +2256,9 @@ - + - + void Function(PointerExitEvent)? @@ -2215,1020 +2267,970 @@ - + - + SystemMouseCursor - - - - - - - - - HelpIcon - - - - - - +tooltipText: String? - - - - - - +Widget build() - - - - - - - - - - - - FormScaffold - - + + + + + - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double + + + FormControlLabel - - - - - - - - - StandardTableColumn + + + +formControl: AbstractControl<dynamic> + +text: String + +isClickable: bool + +textStyle: TextStyle? + +onClick: void Function(AbstractControl<dynamic>)? - - - +label: String - +tooltip: String? - +columnWidth: TableColumnWidth - +sortable: bool - +sortAscending: bool? - +sortableIcon: Widget? + + + +Widget build() - - - + + + - - - TableColumnWidth + + + void Function(AbstractControl<dynamic>)? - - - - + + + + - - - StandardTable + + + IWithBanner - - - +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 + + + +Widget? banner() - - - + + + + - - - void Function(T) + + + BannerBox - - - - - - - - List<ModelAction<dynamic>> Function(T, int)? + + + +prefixIcon: Widget? + +body: Widget + +style: BannerStyle + +padding: EdgeInsets? + +noPrefix: bool + +dismissable: bool + +isDismissed: bool? + +onDismissed: dynamic Function()? + +dismissIconSize: double - - - + + + + - - - int Function(T, T)? + + + BannerStyle - - - - - - - - TableRow Function(BuildContext, List<StandardTableColumn>)? + + + +index: int + <static>+values: List<BannerStyle> + <static>+warning: BannerStyle + <static>+info: BannerStyle + <static>+error: BannerStyle - - - + + + + + - - - Widget Function(Widget)? + + + SecondaryButton - - - - - - - - - StandardTableStyle + + + +text: String + +icon: IconData? + +isLoading: bool + +onPressed: void Function()? - - - +index: int - <static>+values: List<StandardTableStyle> - <static>+plain: StandardTableStyle - <static>+material: StandardTableStyle + + + +Widget build() - - - - - + + + + + - - - ActionMenuInline + + + IconPack - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? + + + <static>+defaultPack: List<IconOption> + <static>+material: List<IconOption> - - - +Widget build() + + + <static>+IconOption? resolveIconByName() - - - - - + + + + + - - - Badge + + + IconOption - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? + + + +name: String + +icon: IconData? + +isEmpty: bool + +props: List<Object?> - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() + + + +String toJson() + <static>+IconOption fromJson() - - - - + + + - - - BadgeType + + + Equatable - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType + + + + + + + + ReactiveIconPicker - - - - + + + - - - TwoColumnLayout + + + ReactiveFocusableFormField - - - <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 + + + + + + + + + + IconPicker - - - - + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +onSelect: void Function(IconOption)? + +galleryIconSize: double? + +selectedIconSize: double? + +focusNode: FocusNode? + +isDisabled: bool + + - - - VerticalDivider + + + +Widget build() - - - - - + + + - - - HtmlStylingBanner + + + void Function(IconOption)? - - - +isDismissed: bool - +onDismissed: dynamic Function()? - - + + + + - - - +Widget build() + + + FocusNode - - - - - + + + + + - - - AsyncValueWidget + + + IconPickerField - - - +value: AsyncValue<T> - +data: Widget Function(T) - +error: Widget Function(Object, StackTrace?)? - +loading: Widget Function()? - +empty: Widget Function()? + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +selectedIconSize: double? + +galleryIconSize: double? + +onSelect: void Function(IconOption)? + +focusNode: FocusNode? + +isDisabled: bool - - - +Widget build() - -Widget _buildDataOrEmptyWidget() - -Widget _defaultError() - -Widget _defaultLoad() + + + +Widget build() - - - + + + + + - - - Widget Function(T) + + + IconPickerGallery - - - - - - - - Widget Function(Object, StackTrace?)? + + + +iconOptions: List<IconOption> + +onSelect: void Function(IconOption)? + +iconSize: double - - - - - - - - Widget Function()? + + + +Widget build() - - - + + + + + - - - NullHelperDecoration + + + SingleColumnLayout - - - - + + + <static>+defaultConstraints: BoxConstraints + <static>+defaultConstraintsNarrow: BoxConstraints + +body: Widget + +header: Widget? + +stickyHeader: bool + +constraints: BoxConstraints? + +scroll: bool + +padding: EdgeInsets? + + - - - InputDecoration + + + <static>+dynamic fromType() - - - - + + + + - - - Collapsible + + + SingleColumnLayoutType - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool + + + +index: int + <static>+values: List<SingleColumnLayoutType> + <static>+boundedWide: SingleColumnLayoutType + <static>+boundedNarrow: SingleColumnLayoutType + <static>+stretched: SingleColumnLayoutType + <static>+split: SingleColumnLayoutType - - - + + + + - - - Widget Function(BuildContext, bool) + + + FormConsumerWidget + + + + + + +Widget build() - - - + + + + - - - Widget Function(BuildContext, bool)? + + + FormConsumerRefWidget - - - - - - - - - - ActionPopUpMenuButton + + + +Widget build() - - - +actions: List<ModelAction<dynamic>> - +triggerIconColor: Color? - +triggerIconColorHover: Color? - +triggerIconSize: double - +disableSplashEffect: bool - +hideOnEmpty: bool - +orientation: Axis - +elevation: double? - +splashRadius: double? - +enabled: bool - +position: PopupMenuPosition + + + + + + + + + FormScaffold - - - +Widget build() - -Widget _buildPopupMenu() + + + +formViewModel: T + +actions: List<Widget>? + +body: Widget + +drawer: Widget? + +actionsSpacing: double + +actionsPadding: double - - - + + + + + - - - Axis + + + StandardDialog - - - - + + + +title: Widget? + +titleText: String? + +body: Widget + +actionButtons: List<Widget> + +backgroundColor: Color? + +borderRadius: double? + +width: double? + +height: double? + +minWidth: double + +minHeight: double + +maxWidth: double? + +maxHeight: double? + +padding: EdgeInsets + + - - - PopupMenuPosition + + + +Widget build() - - - - + + + + + - - - SidesheetTab + + + HtmlStylingBanner - - - +builder: Widget Function(BuildContext) + + + +isDismissed: bool + +onDismissed: dynamic Function()? - - - - - - - - Widget Function(BuildContext) + + + +Widget build() - - - - + + + + - - - NavbarTab + + + StandardTableColumn - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool + + + +label: String + +tooltip: String? + +columnWidth: TableColumnWidth + +sortable: bool + +sortAscending: bool? + +sortableIcon: Widget? - - - - - - - - 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)? + + + TableColumnWidth - - - - + + + + - - - FormSideSheetTab + + + StandardTable - - - +formViewBuilder: Widget Function(T) + + + +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 - - - - - + + + - - - IconPack + + + void Function(T) - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> + + + + + + + + List<ModelAction<dynamic>> Function(T, int)? - - - <static>+IconOption? resolveIconByName() + + + + + + + + int Function(T, T)? - - - - - + + + - - - IconOption + + + TableRow Function(BuildContext, List<StandardTableColumn>)? - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> + + + + + + + + + StandardTableStyle - - - +String toJson() - <static>+IconOption fromJson() + + + +index: int + <static>+values: List<StandardTableStyle> + <static>+plain: StandardTableStyle + <static>+material: StandardTableStyle - - - + + + + - - - Equatable + + + TwoColumnLayout - - - - - - - - ReactiveIconPicker + + + <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 - - - + + + - - - ReactiveFocusableFormField + + + VerticalDivider - - - - - + + + + + - - - IconPicker + + + ActionMenuInline - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool + + + +actions: List<ModelAction<dynamic>> + +iconSize: double? + +visible: bool + +splashRadius: double? + +paddingVertical: double? + +paddingHorizontal: double? - - - +Widget build() + + + +Widget build() - - - + + + + + - - - void Function(IconOption)? + + + TextParagraph - - - - + + + +text: String? + +style: TextStyle? + +selectable: bool + +span: List<TextSpan>? + + - - - FocusNode + + + +Widget build() - - - - - + + + + - - - IconPickerField + + + SplashPage - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool + + + +Widget build() - - - +Widget build() + + + + + + + + + + ErrorPage - - - - - - - - - - IconPickerGallery + + + +error: Exception? - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double + + + +Widget build() - - - +Widget build() + + + + + + + + ConsumerWidget - - - - - + + + + + - - - StudyULogo + + + Badge - - - +onTap: void Function()? + + + +icon: IconData? + +color: Color? + +borderRadius: double + +label: String + +type: BadgeType + +padding: EdgeInsets + +iconSize: double? + +labelStyle: TextStyle? + +center: bool - - - +Widget build() + + + +Widget build() + -Color? _getBackgroundColor() + -Color _getBorderColor() + -Color? _getLabelColor() - - - + + + + - - - RoutingIntent + + + BadgeType + + + + + + +index: int + <static>+values: List<BadgeType> + <static>+filled: BadgeType + <static>+outlined: BadgeType + <static>+outlineFill: BadgeType + <static>+plain: BadgeType - - - - + + + + + - - - TabbedNavbar + + + IndicatorRangeSliderThumbShape - - - +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? + + + +buildContext: BuildContext + +start: T + +end: T - - - - - - - - BoxDecoration + + + +Size getPreferredSize() + +void paint() - - - + + + - - - void Function(int, T)? + + + BuildContext - - - + + + - - - TabBarIndicatorSize + + + RangeSliderThumbShape - - - - - + + + + + - - - TextParagraph + + + HelpIcon - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? + + + +tooltipText: String? - - - +Widget build() + + + +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 + + + UnderConstruction - - - - - - - - Size + + + +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 b12fd2761..74b4061b4 100644 --- a/docs/uml/designer_v2/lib/features/dashboard/uml.svg +++ b/docs/uml/designer_v2/lib/features/dashboard/uml.svg @@ -1,64 +1,5 @@ - - [DashboardScreen - | - +filter: StudiesFilter? - ] - - [DashboardScreen]o-[StudiesFilter] - - [DashboardController - | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +userRepository: IUserRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController; - +isSortAscending: bool - | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void setSorting(); - +void filterStudies(); - +void sortStudies(); - +bool isSortingActiveForColumn(); - +bool isPinned(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() - ] - - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] - - [StudiesTableItem - | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? - ] - - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] - - [StudiesTableColumnHeader + + [StudiesTableColumnHeader | +title: String; +sortable: bool; @@ -79,14 +20,6 @@ [DashboardScaffold]o-[<abstract>Widget] - [StudiesFilter - | - +index: int; - <static>+values: List<StudiesFilter> - ] - - [Enum]<:--[StudiesFilter] - [StudiesTableColumnSize | +collapsed: bool; @@ -139,144 +72,331 @@ [StudiesTableColumn]o-[StudiesTableColumn] [Enum]<:--[StudiesTableColumn] + [DashboardScreen + | + +filter: StudiesFilter? + ] + + [DashboardScreen]o-[StudiesFilter] + + [DashboardController + | + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController; + +isSortAscending: bool + | + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void setSorting(); + +void filterStudies(); + +void sortStudies(); + +bool isSortingActiveForColumn(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() + ] + + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] + + [StudiesTableItem + | + +study: Study; + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +actions: List<ModelAction<dynamic>>; + +columnSizes: List<StudiesTableColumnSize>; + +isPinned: bool; + +onPinnedChanged: void Function(Study, bool)?; + +onTap: void Function(Study)? + ] + + [StudiesTableItem]o-[Study] + [StudiesTableItem]o-[void Function(Study, bool)?] + [StudiesTableItem]o-[void Function(Study)?] + + [StudiesFilter + | + +index: int; + <static>+values: List<StudiesFilter> + ] + + [Enum]<:--[StudiesFilter] + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - - - - - + - + - + - + + + + - + + - + - + - + - + - + - + - - - - - + + + + + - - - DashboardScreen + + + StudiesTableColumnHeader - - - +filter: StudiesFilter? + + + +title: String + +sortable: bool + +sortAscending: bool + +sortingActive: bool + +onSort: void Function()? - - - - + + + - - - StudiesFilter + + + void Function()? - - - +index: int - <static>+values: List<StudiesFilter> + + + + + + + + + + DashboardScaffold + + + + + + <static>+compactWidthThreshold: double + +body: Widget + + + + + + +Widget build() + + + + + + + + + + + Widget + + + + + + + + + + + + + StudiesTableColumnSize + + + + + + +collapsed: bool + +flex: int? + +width: double? + + + + + + +Widget createContainer() + + + + + + + + + + + + + StudiesTable + + + + + + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +compactWidthThreshold: double + +superCompactWidthThreshold: double + +compactStatTitleThreshold: double + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController + + + + + + +Widget build() + -Widget _buildColumnHeader() + + + + + + + + + + + void Function(Study) + + + + + + + + + + + List<ModelAction<dynamic>> Function(Study) - - - + + + - + DashboardController - + +studyRepository: IStudyRepository +authRepository: IAuthRepository @@ -288,7 +408,7 @@ - + -dynamic _subscribeStudies() +dynamic setSearchText() @@ -308,11 +428,87 @@ + + + + + + + + StudiesTableColumn + + + + + + +index: int + <static>+values: List<StudiesTableColumn> + <static>+pin: StudiesTableColumn + <static>+title: StudiesTableColumn + <static>+status: StudiesTableColumn + <static>+participation: StudiesTableColumn + <static>+createdAt: StudiesTableColumn + <static>+enrolled: StudiesTableColumn + <static>+active: StudiesTableColumn + <static>+completed: StudiesTableColumn + <static>+action: StudiesTableColumn + + + + + + + + + + + Enum + + + + + + + + + + + + DashboardScreen + + + + + + +filter: StudiesFilter? + + + + + + + + + + + + StudiesFilter + + + + + + +index: int + <static>+values: List<StudiesFilter> + + + + - + - + IStudyRepository @@ -321,9 +517,9 @@ - + - + IAuthRepository @@ -332,9 +528,9 @@ - + - + IUserRepository @@ -343,9 +539,9 @@ - + - + GoRouter @@ -354,9 +550,9 @@ - + - + StreamSubscription @@ -365,9 +561,9 @@ - + - + SearchController @@ -376,9 +572,9 @@ - + - + IModelActionProvider @@ -387,16 +583,16 @@ - - + + - + StudiesTableItem - + +study: Study +itemHeight: double @@ -414,9 +610,9 @@ - + - + Study @@ -425,9 +621,9 @@ - + - + void Function(Study, bool)? @@ -436,211 +632,15 @@ - + - + void Function(Study)? - - - - - - - - StudiesTableColumnHeader - - - - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? - - - - - - - - - - - void Function()? - - - - - - - - - - - - - DashboardScaffold - - - - - - <static>+compactWidthThreshold: double - +body: Widget - - - - - - +Widget build() - - - - - - - - - - - Widget - - - - - - - - - - - Enum - - - - - - - - - - - - - StudiesTableColumnSize - - - - - - +collapsed: bool - +flex: int? - +width: double? - - - - - - +Widget createContainer() - - - - - - - - - - - - - StudiesTable - - - - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController - - - - - - +Widget build() - -Widget _buildColumnHeader() - - - - - - - - - - - void Function(Study) - - - - - - - - - - - List<ModelAction<dynamic>> Function(Study) - - - - - - - - - - - - StudiesTableColumn - - - - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn - - - - diff --git a/docs/uml/designer_v2/lib/features/uml.svg b/docs/uml/designer_v2/lib/features/uml.svg index fce44a5d0..9ad270e1a 100644 --- a/docs/uml/designer_v2/lib/features/uml.svg +++ b/docs/uml/designer_v2/lib/features/uml.svg @@ -1,175 +1,168 @@ - - [AccountSettingsDialog + + [SignupForm | - +Widget build() - ] - - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - - [<abstract>IAppDelegate + +formKey: AuthFormKey | - +dynamic onAppStart() + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() ] - [AppController + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] + + [AuthFormController | + +authRepository: IAuthRepository; +sharedPreferences: SharedPreferences; - +appDelegates: List<IAppDelegate>; - -_delayedFuture: dynamic; - +isInitialized: dynamic + +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 onAppStart(); - -dynamic _callDelegates() + -dynamic _getFormFor(); + -dynamic _onChangeFormKey(); + +dynamic resetControlsFor(); + -dynamic _forceValidationMessages(); + +dynamic signUp(); + -dynamic _signUp(); + +dynamic signIn(); + -dynamic _signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic sendPasswordResetLink(); + +dynamic recoverPassword(); + +dynamic updateUser(); + -dynamic _readDebugUser(); + -void _setRememberMe(); + -void _delRememberMe(); + -void _initRememberMe() ] - [AppController]o-[SharedPreferences] + [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] - [StudiesFilter + [AuthFormKey | +index: int; - <static>+values: List<StudiesFilter> + <static>+values: List<AuthFormKey>; + <static>+login: AuthFormKey; + <static>+signup: AuthFormKey; + <static>+passwordForgot: AuthFormKey; + <static>+passwordRecovery: AuthFormKey; + <static>-_loginSubmit: AuthFormKey; + <static>-_signupSubmit: AuthFormKey ] - [Enum]<:--[StudiesFilter] + [AuthFormKey]o-[AuthFormKey] + [Enum]<:--[AuthFormKey] - [StudiesTableItem + [PasswordForgotForm | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? + +formKey: AuthFormKey + | + +Widget build() ] - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] - [StudiesTableColumnHeader + [EmailTextField | - +title: String; - +sortable: bool; - +sortAscending: bool; - +sortingActive: bool; - +onSort: void Function()? + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [StudiesTableColumnHeader]o-[void Function()?] + [EmailTextField]o-[FormControl] - [DashboardScaffold + [PasswordTextField | - <static>+compactWidthThreshold: double; - +body: Widget + +labelText: String; + +hintText: String?; + +onSubmitted: dynamic Function(FormControl<dynamic>)?; + +formControlName: String?; + +formControl: FormControl<dynamic>? + ] + + [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] + [PasswordTextField]o-[FormControl] + + [PasswordRecoveryForm + | + +formKey: AuthFormKey | +Widget build() ] - [DashboardScaffold]o-[<abstract>Widget] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [DashboardScreen + [AuthScaffold | - +filter: StudiesFilter? + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets ] - [DashboardScreen]o-[StudiesFilter] + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] - [StudiesTableColumnSize - | - +collapsed: bool; - +flex: int?; - +width: double? + [StudyUJobsToBeDone | - +Widget createContainer() + +Widget build() ] - [StudiesTable + [LoginForm | - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +compactWidthThreshold: double; - +superCompactWidthThreshold: double; - +compactStatTitleThreshold: double; - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget; - +pinnedStudies: Iterable<String>; - +dashboardController: DashboardController + +formKey: AuthFormKey | - +Widget build(); - -Widget _buildColumnHeader() + +Widget build() ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - [StudiesTable]o-[DashboardController] + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] - [StudiesTableColumn + [<abstract>IAppDelegate | - +index: int; - <static>+values: List<StudiesTableColumn>; - <static>+pin: StudiesTableColumn; - <static>+title: StudiesTableColumn; - <static>+status: StudiesTableColumn; - <static>+participation: StudiesTableColumn; - <static>+createdAt: StudiesTableColumn; - <static>+enrolled: StudiesTableColumn; - <static>+active: StudiesTableColumn; - <static>+completed: StudiesTableColumn; - <static>+action: StudiesTableColumn + +dynamic onAppStart() ] - [StudiesTableColumn]o-[StudiesTableColumn] - [Enum]<:--[StudiesTableColumn] - - [DashboardController - | - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +userRepository: IUserRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController; - +isSortAscending: bool + [AppController | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void setSorting(); - +void filterStudies(); - +void sortStudies(); - +bool isSortingActiveForColumn(); - +bool isPinned(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() - ] - - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] - - [StudyMonitorScreen + +sharedPreferences: SharedPreferences; + +appDelegates: List<IAppDelegate>; + -_delayedFuture: dynamic; + +isInitialized: dynamic | - +Widget build() + +dynamic onAppStart(); + -dynamic _callDelegates() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [AppController]o-[SharedPreferences] [App ] @@ -177,1564 +170,1464 @@ [AppContent ] - [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) + [AppStatus | - +Widget build(); - -List<Widget> _buildRow() + +index: int; + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel + [StudyAnalyzeScreen | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() + +Widget? banner(); + +Widget build() ] - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - [EnrolledBadge - | - +enrolledCount: int + [StudyAnalyzeController | - +Widget build() + +dynamic onExport() ] - [InviteCodeFormViewModel + [StudyBaseController]<:-[StudyAnalyzeController] + + [StudyParticipationBadge | - +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>? + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool; + +center: bool | - +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] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [StudyRecruitController - | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + [PreviewFrame | - -dynamic _subscribeInvites(); - +Intervention? getIntervention(); - +int getParticipantCountForInvite(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void dispose() + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [StudyRecruitController]o-[<abstract>IInviteCodeRepository] - [StudyRecruitController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyRecruitController] - [<abstract>IModelActionProvider]<:--[StudyRecruitController] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [StudyRecruitScreen + [FrameControlsWidget | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool + | + +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - [FormInvalidException + [<abstract>IStudyNavViewModel + | + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool ] - [Exception]<:--[FormInvalidException] - - [FormConfigException + [StudyNav | - +message: String? + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() ] - [Exception]<:--[FormConfigException] - - [<abstract>IFormViewModelDelegate + [StudyDesignNav | - +dynamic onSave(); - +void onCancel() + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() ] - [<abstract>IFormGroupController + [StudySettingsFormViewModel | - +form: FormGroup + +study: AsyncValue<Study>; + +studyRepository: IStudyRepository; + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [<abstract>IFormGroupController]o-[FormGroup] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [FormControlOption + [StudySettingsDialog | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> + +Widget build() ] - [<abstract>Equatable]<:-[FormControlOption] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [<abstract>FormViewModel + [StudyTestScreen | - -_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>> + +previewRoute: 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(); + +Widget build(); + +Widget? banner(); + +dynamic load(); +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() + +dynamic showHelp() ] - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [FormMode + [StudyBaseController | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode + +studyId: String; + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? + | + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [<abstract>ManagedFormViewModel + [StudyTestController | - +ManagedFormViewModel<T> createDuplicate() + +authRepository: IAuthRepository; + +languageCode: String ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [FormViewModelNotFoundException + [WebFrame + | + +previewSrc: String; + +studyId: String + | + +Widget build() ] - [Exception]<:--[FormViewModelNotFoundException] - - [FormViewModelCollection + [DisabledFrame | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + +Widget build() + ] + + [PhoneContainer | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? + | + +Widget build() ] - [FormViewModelCollection]o-[FormArray] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [<abstract>FormValidationSetEnum + [MobileFrame + | + +Widget build() ] - [FormControlValidation + [DesktopFrame | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + +Widget build() + ] + + [<abstract>IStudyAppBarViewModel | - +FormControlValidation merge() + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool ] - [FormControlValidation]o-[<abstract>AbstractControl] + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] - [CustomFormControl - | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? + [StudyScaffold | - +void dispose() + +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 ] - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] - [FormArrayTable + [RouteInformation | - +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> + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? | - +Widget build(); - -List<Widget> _buildRow(); - -Widget _newItemButton() + +String toString() ] - [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>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() + ] - [UnsavedChangesDialog + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] + + [WebController | - +Widget build() + +iFrameElement: IFrameElement + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [<abstract>IFormData + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] + + [MobileController | - +id: String + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() + ] + + [<abstract>PlatformController]<:-[MobileController] + + [<abstract>IStudyStatusBadgeViewModel | - +IFormData copy() + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [PasswordRecoveryForm + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + + [StudyStatusBadge | - +formKey: AuthFormKey + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | +Widget build() ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] - [SignupForm + [TestAppRoutes | - +formKey: AuthFormKey + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String + ] + + [<abstract>StudyPageWidget | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + +studyId: String + | + +Widget? banner() ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [StudyUJobsToBeDone + [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] + + [StudyMonitorScreen | +Widget build() ] - [EmailTextField + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + + [StudiesTableColumnHeader | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +title: String; + +sortable: bool; + +sortAscending: bool; + +sortingActive: bool; + +onSort: void Function()? ] - [EmailTextField]o-[FormControl] + [StudiesTableColumnHeader]o-[void Function()?] - [PasswordTextField + [DashboardScaffold | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + <static>+compactWidthThreshold: double; + +body: Widget + | + +Widget build() ] - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] + [DashboardScaffold]o-[<abstract>Widget] - [AuthFormController + [StudiesTableColumnSize | - +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 + +collapsed: bool; + +flex: int?; + +width: double? | - -dynamic _getFormFor(); - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -dynamic _readDebugUser(); - -void _setRememberMe(); - -void _delRememberMe(); - -void _initRememberMe() + +Widget createContainer() ] - [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] + [StudiesTable + | + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +compactWidthThreshold: double; + +superCompactWidthThreshold: double; + +compactStatTitleThreshold: double; + +studies: List<Study>; + +onSelect: void Function(Study); + +getActions: List<ModelAction<dynamic>> Function(Study); + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController + | + +Widget build(); + -Widget _buildColumnHeader() + ] - [AuthFormKey + [StudiesTable]o-[void Function(Study)] + [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] + [StudiesTable]o-[<abstract>Widget] + [StudiesTable]o-[DashboardController] + + [StudiesTableColumn | +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey + <static>+values: List<StudiesTableColumn>; + <static>+pin: StudiesTableColumn; + <static>+title: StudiesTableColumn; + <static>+status: StudiesTableColumn; + <static>+participation: StudiesTableColumn; + <static>+createdAt: StudiesTableColumn; + <static>+enrolled: StudiesTableColumn; + <static>+active: StudiesTableColumn; + <static>+completed: StudiesTableColumn; + <static>+action: StudiesTableColumn ] - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] + [StudiesTableColumn]o-[StudiesTableColumn] + [Enum]<:--[StudiesTableColumn] - [PasswordForgotForm - | - +formKey: AuthFormKey + [DashboardScreen | - +Widget build() + +filter: StudiesFilter? ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [DashboardScreen]o-[StudiesFilter] - [AuthScaffold + [DashboardController | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController; + +isSortAscending: bool + | + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void setSorting(); + +void filterStudies(); + +void sortStudies(); + +bool isSortingActiveForColumn(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] - [LoginForm - | - +formKey: AuthFormKey + [StudiesTableItem | - +Widget build() + +study: Study; + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +actions: List<ModelAction<dynamic>>; + +columnSizes: List<StudiesTableColumnSize>; + +isPinned: bool; + +onPinnedChanged: void Function(Study, bool)?; + +onTap: void Function(Study)? ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [StudiesTableItem]o-[Study] + [StudiesTableItem]o-[void Function(Study, bool)?] + [StudiesTableItem]o-[void Function(Study)?] - [AppStatus + [StudiesFilter | +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + <static>+values: List<StudiesFilter> ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [Enum]<:--[StudiesFilter] - [StudyInfoFormData + [FormArrayTable | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String + +control: AbstractControl<dynamic>; + +items: List<T>; + +onSelectItem: void Function(T); + +getActionsAt: List<ModelAction<dynamic>> Function(T, int); + +onNewItem: void Function()?; + +rowTitle: String Function(T); + +onNewItemLabel: String; + +sectionTitle: String?; + +sectionDescription: String?; + +emptyIcon: IconData?; + +emptyTitle: String?; + +emptyDescription: String?; + +sectionTitleDivider: bool?; + +rowPrefix: Widget Function(BuildContext, T, int)?; + +rowSuffix: Widget Function(BuildContext, T, int)?; + +leadingWidget: Widget?; + +itemsSectionPadding: EdgeInsets?; + +hideLeadingTrailingWhenEmpty: bool; + <static>+columns: List<StandardTableColumn> | - +Study apply(); - +StudyInfoFormData copy() + +Widget build(); + -List<Widget> _buildRow(); + -Widget _newItemButton() ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [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] - [StudyContactInfoFormData + [CustomFormControl | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? | - +Study apply(); - +StudyInfoFormData copy() + +void dispose() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] - [StudyDesignInfoFormView + [FormInvalidException + ] + + [Exception]<:--[FormInvalidException] + + [FormConfigException | - +Widget build() + +message: String? ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [Exception]<:--[FormConfigException] - [StudyInfoFormViewModel + [<abstract>IFormViewModelDelegate | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic - | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() - ] - - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - - [<abstract>WithScheduleControls - | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? - | - +void setScheduleControlsFrom(); - -dynamic _initReminderControl() - ] - - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] - - [<abstract>IFormDataWithSchedule - | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? - | - +Schedule toSchedule() - ] - - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - - [ScheduleControls - | - +formViewModel: WithScheduleControls - | - +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() - ] - - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] - - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> - | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() - ] - - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - - [<abstract>QuestionFormData - | - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; - +questionId: String; - +questionText: String; - +questionInfoText: String?; - +questionType: SurveyQuestionType; - +responseOptionsValidity: Map<dynamic, bool>; - +responseOptions: List<dynamic>; - +id: String - | - +Question<dynamic> toQuestion(); - +EligibilityCriterion toEligibilityCriterion(); - +Answer<dynamic> constructAnswerFor(); - +dynamic setResponseOptionsValidityFrom(); - +QuestionFormData copy() - ] - - [<abstract>QuestionFormData]o-[SurveyQuestionType] - [<abstract>IFormData]<:--[<abstract>QuestionFormData] - - [ChoiceQuestionFormData - | - +isMultipleChoice: bool; - +answerOptions: List<String>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +QuestionFormData copy(); - -Choice _buildChoiceForValue(); - +Answer<dynamic> constructAnswerFor() - ] - - [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - - [BoolQuestionFormData - | - <static>+kResponseOptions: Map<String, bool>; - +responseOptions: List<String> - | - +Question<dynamic> toQuestion(); - +BoolQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +void onCancel() ] - [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - - [ScaleQuestionFormData - | - +minValue: double; - +maxValue: double; - +minLabel: String?; - +maxLabel: String?; - +midValues: List<double?>; - +midLabels: List<String?>; - +stepSize: double; - +initialValue: double?; - +minColor: Color?; - +maxColor: Color?; - +responseOptions: List<double>; - +midAnnotations: List<Annotation> + [<abstract>IFormGroupController | - +ScaleQuestion toQuestion(); - +QuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +form: FormGroup ] - [ScaleQuestionFormData]o-[Color] - [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] + [<abstract>IFormGroupController]o-[FormGroup] - [FreeTextQuestionFormData - | - +textLengthRange: List<int>; - +textType: FreeTextQuestionType; - +textTypeExpression: String?; - +responseOptions: List<String> + [FormControlOption | - +Question<dynamic> toQuestion(); - +FreeTextQuestionFormData copy(); - +Answer<dynamic> constructAnswerFor() + +value: T; + +label: String; + +description: String?; + +props: List<Object?> ] - [FreeTextQuestionFormData]o-[FreeTextQuestionType] - [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] + [<abstract>Equatable]<:-[FormControlOption] - [QuestionFormViewModel + [<abstract>FormViewModel | - <static>+defaultQuestionType: SurveyQuestionType; - -_titles: Map<FormMode, String Function()>?; - +questionIdControl: FormControl<String>; - +questionTypeControl: FormControl<SurveyQuestionType>; - +questionTextControl: FormControl<String>; - +questionInfoTextControl: FormControl<String>; - +questionBaseControls: Map<String, AbstractControl<dynamic>>; - +isMultipleChoiceControl: FormControl<bool>; - +choiceResponseOptionsArray: FormArray<dynamic>; - +customOptionsMin: int; - +customOptionsMax: int; - +customOptionsInitial: int; - +boolResponseOptionsArray: FormArray<String>; - <static>+kDefaultScaleMinValue: int; - <static>+kDefaultScaleMaxValue: int; - <static>+kNumMidValueControls: int; - <static>+kMidValueDebounceMilliseconds: int; - +scaleMinValueControl: FormControl<int>; - +scaleMaxValueControl: FormControl<int>; - -_scaleRangeControl: FormControl<int>; - +scaleMinLabelControl: FormControl<String>; - +scaleMaxLabelControl: FormControl<String>; - +scaleMidValueControls: FormArray<int>; - +scaleMidLabelControls: FormArray<String?>; - -_scaleResponseOptionsArray: FormArray<int>; - +scaleMinColorControl: FormControl<SerializableColor>; - +scaleMaxColorControl: FormControl<SerializableColor>; - +prevMidValues: List<int?>?; - +freeTextTypeControl: FormControl<FreeTextQuestionType>; - +customRegexControl: FormControl<String>; - +freeTextResponseOptionsArray: FormArray<dynamic>; - +freeTextLengthMin: AbstractControl<int>; - +freeTextLengthMax: AbstractControl<int>; - +freeTextExampleTextControl: FormControl<String>; - <static>+kDefaultFreeTextMinLength: int; - <static>+kDefaultFreeTextMaxLength: int; - +freeTextLengthControl: FormControl<RangeValues>; - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; - +form: FormGroup; - +questionId: String; - +questionType: SurveyQuestionType; - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>>; - +answerOptionsArray: FormArray<dynamic>; - +answerOptionsControls: List<AbstractControl<dynamic>>; - +validAnswerOptions: List<String>; - +boolOptions: List<AbstractControl<String>>; - +scaleMinValue: int; - +scaleMaxValue: int; - +scaleRange: int; - +scaleAllValueControls: List<AbstractControl<int>>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +questionTextRequired: dynamic; - +numValidChoiceOptions: dynamic; - +scaleRangeValid: dynamic; + -_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>; - +isAddOptionButtonVisible: bool; - +isMidValuesClearedInfoVisible: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> | - +String? scaleMidLabelAt(); - -dynamic _onScaleRangeChanged(); - -dynamic _applyInputFormatters(); - -dynamic _updateScaleMidValueControls(); - -Map<String, dynamic>? _validateFreeText(); - -dynamic _onFreeTextLengthChanged(); - -List<FormControlValidation> _getValidationConfig(); - +dynamic onQuestionTypeChanged(); - +dynamic onResponseOptionsChanged(); - -void _updateFormControls(); - +void initControls(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem(); + -dynamic _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(); - +QuestionFormViewModel createDuplicate() + +dynamic cancel(); + +void enableAutosave(); + +void listenToImmediateFormChildren(); + +dynamic markFormGroupChanged(); + +void dispose(); + +void setControlsFrom(); + +T buildFormData(); + +void initControls() ] - [QuestionFormViewModel]o-[SurveyQuestionType] - [QuestionFormViewModel]o-[FormControl] - [QuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]o-[<abstract>AbstractControl] - [QuestionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] - [<abstract>IListActionProvider]<:--[QuestionFormViewModel] + [<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] - [SurveyQuestionFormView + [FormMode | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +index: int; + <static>+values: List<FormMode>; + <static>+create: FormMode; + <static>+readonly: FormMode; + <static>+edit: FormMode ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [FormMode]o-[FormMode] + [Enum]<:--[FormMode] - [SurveyQuestionType + [<abstract>IFormData | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+freeText: SurveyQuestionType + +id: String + | + +IFormData copy() ] - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + [UnsavedChangesDialog + | + +Widget build() + ] - [FreeTextQuestionFormView + [<abstract>FormValidationSetEnum + ] + + [FormControlValidation | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() + +FormControlValidation merge() ] - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [FormControlValidation]o-[<abstract>AbstractControl] - [<abstract>IScaleQuestionFormViewModel + [<abstract>ManagedFormViewModel | - +isMidValuesClearedInfoVisible: bool + +ManagedFormViewModel<T> createDuplicate() ] - [ScaleQuestionFormView - | - +formViewModel: QuestionFormViewModel + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + + [FormViewModelNotFoundException ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [Exception]<:--[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() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [FormViewModelCollection]o-[FormArray] - [BoolQuestionFormView + [DrawerEntry | - +formViewModel: QuestionFormViewModel + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +autoCloseDrawer: bool; + +title: String; + +helpText: String? | - +Widget build() + +void onClick() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - [QuestionnaireFormData + [GoRouterDrawerEntry | - +questionsData: List<QuestionFormData>?; - +id: String + +intent: RoutingIntent; + +onNavigated: void Function()? | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +void onClick() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [GoRouterDrawerEntry]o-[RoutingIntent] + [GoRouterDrawerEntry]o-[void Function()?] + [DrawerEntry]<:-[GoRouterDrawerEntry] - [StudyFormScaffold + [AppDrawer | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +width: int; + +autoCloseDrawer: bool; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double + ] + + [StudyInvitesTable | - +Widget build() + +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() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] - [<abstract>IStudyFormData + [InviteCodeFormView | - +Study apply() + +formViewModel: InviteCodeFormViewModel + | + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - [StudyFormViewModel + [InviteCodeFormViewModel | - +studyDirtyCopy: Study?; - +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +router: GoRouter; - +studyInfoFormViewModel: StudyInfoFormViewModel; - +enrollmentFormViewModel: EnrollmentFormViewModel; - +measurementsFormViewModel: MeasurementsFormViewModel; - +reportsFormViewModel: ReportsFormViewModel; - +interventionsFormViewModel: InterventionsFormViewModel; + +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; - +isStudyReadonly: bool; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titles: Map<FormMode, String> + +titles: Map<FormMode, String>; + +interventionControlOptions: List<FormControlOption<String>>; + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>>; + +isPreconfiguredSchedule: bool; + +preconfiguredSchedule: List<String>? | - +void read(); + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); +void setControlsFrom(); - +Study buildFormData(); - +void dispose(); - +void onCancel(); - +dynamic onSave(); - -dynamic _applyAndSaveSubform() + +dynamic save() ] - [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] + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [InterventionTaskFormData + [StudyRecruitController | - +taskId: String; - +taskTitle: String; - +taskDescription: String?; - <static>+kDefaultTitle: String; - +id: String + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + | + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() + ] + + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] + + [StudyRecruitScreen | - +CheckmarkTask toTask(); - +InterventionTaskFormData copy() + +Widget build(); + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - [StudyScheduleFormData + [EnrolledBadge | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String + +enrolledCount: int | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() + +Widget build() ] - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - - [InterventionFormView + [PublishConfirmationDialog | - +formViewModel: InterventionFormViewModel + +Widget build() ] - [InterventionFormView]o-[InterventionFormViewModel] + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - [<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 + [PublishSuccessDialog | - +void setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +Widget build() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] - [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 + [PublishDialog | - +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] + [<abstract>StudyPageWidget]<:-[PublishDialog] - [InterventionFormViewModel + [StudyFormScaffold | - +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> + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | - +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] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; - +id: String + [StudyFormValidationSet | - +Study apply(); - +InterventionsFormData copy() + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [Enum]<:--[StudyFormValidationSet] - [StudyDesignInterventionsFormView + [<abstract>QuestionFormData | - +Widget build() + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; + +questionId: String; + +questionText: String; + +questionInfoText: String?; + +questionType: SurveyQuestionType; + +responseOptionsValidity: Map<dynamic, bool>; + +responseOptions: List<dynamic>; + +id: String + | + +Question<dynamic> toQuestion(); + +EligibilityCriterion toEligibilityCriterion(); + +Answer<dynamic> constructAnswerFor(); + +dynamic setResponseOptionsValidityFrom(); + +QuestionFormData copy() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [<abstract>QuestionFormData]o-[SurveyQuestionType] + [<abstract>IFormData]<:--[<abstract>QuestionFormData] - [StudyScheduleFormView + [ChoiceQuestionFormData | - +formViewModel: StudyScheduleControls + +isMultipleChoice: bool; + +answerOptions: List<String>; + +responseOptions: List<String> | - -FormTableRow _renderCustomSequence(); - +Widget build() + +Question<dynamic> toQuestion(); + +QuestionFormData copy(); + -Choice _buildChoiceForValue(); + +Answer<dynamic> constructAnswerFor() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [<abstract>QuestionFormData]<:-[ChoiceQuestionFormData] - [InterventionTaskFormViewModel + [BoolQuestionFormData | - +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>+kResponseOptions: Map<String, bool>; + +responseOptions: List<String> | - +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +Question<dynamic> toQuestion(); + +BoolQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [<abstract>QuestionFormData]<:-[BoolQuestionFormData] - [InterventionFormData + [ScaleQuestionFormData | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + +minValue: double; + +maxValue: double; + +minLabel: String?; + +maxLabel: String?; + +midValues: List<double?>; + +midLabels: List<String?>; + +stepSize: double; + +initialValue: double?; + +minColor: Color?; + +maxColor: Color?; + +responseOptions: List<double>; + +midAnnotations: List<Annotation> | - +Intervention toIntervention(); - +InterventionFormData copy() + +ScaleQuestion toQuestion(); + +QuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [<abstract>IFormData]<:-[InterventionFormData] + [ScaleQuestionFormData]o-[Color] + [<abstract>QuestionFormData]<:-[ScaleQuestionFormData] - [InterventionTaskFormView + [FreeTextQuestionFormData + | + +textLengthRange: List<int>; + +textType: FreeTextQuestionType; + +textTypeExpression: String?; + +responseOptions: List<String> | - +formViewModel: InterventionTaskFormViewModel + +Question<dynamic> toQuestion(); + +FreeTextQuestionFormData copy(); + +Answer<dynamic> constructAnswerFor() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [FreeTextQuestionFormData]o-[FreeTextQuestionType] + [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] - [InterventionPreview - | - +routeArgs: InterventionFormRouteArgs + [SurveyQuestionFormView | - +Widget build() + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [SurveyQuestionFormView]o-[QuestionFormViewModel] - [MeasurementSurveyFormView + [SurveyQuestionType | - +formViewModel: MeasurementSurveyFormViewModel + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType; + <static>+freeText: SurveyQuestionType ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs + [<abstract>IScaleQuestionFormViewModel | - +Widget build() + +isMidValuesClearedInfoVisible: bool ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] - - [MeasurementSurveyFormData - | - +measurementId: String; - +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; - +id: String + [ScaleQuestionFormView | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +formViewModel: QuestionFormViewModel ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [ScaleQuestionFormView]o-[QuestionFormViewModel] - [MeasurementSurveyFormViewModel + [ChoiceQuestionFormView | - +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> + +formViewModel: QuestionFormViewModel | - +void setControlsFrom(); - +MeasurementSurveyFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); - +SurveyQuestionFormRouteArgs buildFormRouteArgs(); - +MeasurementSurveyFormViewModel createDuplicate() + +Widget build() ] - [MeasurementSurveyFormViewModel]o-[Study] - [MeasurementSurveyFormViewModel]o-[FormControl] - [MeasurementSurveyFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] - [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] - [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - [StudyDesignMeasurementsFormView + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] - [MeasurementsFormData + [FreeTextQuestionFormView | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic | - +Study apply(); - +MeasurementsFormData copy() + +Widget build(); + +Widget disableOnReadonly(); + +Widget generateRow() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] - [MeasurementsFormViewModel + [QuestionFormViewModel | - +study: Study; - +router: GoRouter; - +measurementsArray: FormArray<dynamic>; - +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData>; + <static>+defaultQuestionType: SurveyQuestionType; + -_titles: Map<FormMode, String Function()>?; + +questionIdControl: FormControl<String>; + +questionTypeControl: FormControl<SurveyQuestionType>; + +questionTextControl: FormControl<String>; + +questionInfoTextControl: FormControl<String>; + +questionBaseControls: Map<String, AbstractControl<dynamic>>; + +isMultipleChoiceControl: FormControl<bool>; + +choiceResponseOptionsArray: FormArray<dynamic>; + +customOptionsMin: int; + +customOptionsMax: int; + +customOptionsInitial: int; + +boolResponseOptionsArray: FormArray<String>; + <static>+kDefaultScaleMinValue: int; + <static>+kDefaultScaleMaxValue: int; + <static>+kNumMidValueControls: int; + <static>+kMidValueDebounceMilliseconds: int; + +scaleMinValueControl: FormControl<int>; + +scaleMaxValueControl: FormControl<int>; + -_scaleRangeControl: FormControl<int>; + +scaleMinLabelControl: FormControl<String>; + +scaleMaxLabelControl: FormControl<String>; + +scaleMidValueControls: FormArray<int>; + +scaleMidLabelControls: FormArray<String?>; + -_scaleResponseOptionsArray: FormArray<int>; + +scaleMinColorControl: FormControl<SerializableColor>; + +scaleMaxColorControl: FormControl<SerializableColor>; + +prevMidValues: List<int?>?; + +freeTextTypeControl: FormControl<FreeTextQuestionType>; + +customRegexControl: FormControl<String>; + +freeTextResponseOptionsArray: FormArray<dynamic>; + +freeTextLengthMin: AbstractControl<int>; + +freeTextLengthMax: AbstractControl<int>; + +freeTextExampleTextControl: FormControl<String>; + <static>+kDefaultFreeTextMinLength: int; + <static>+kDefaultFreeTextMaxLength: int; + +freeTextLengthControl: FormControl<RangeValues>; + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup>; + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>>; +form: FormGroup; - +measurementViewModels: List<MeasurementSurveyFormViewModel>; + +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>>; - +measurementRequired: dynamic; - +titles: Map<FormMode, String> + +questionTextRequired: dynamic; + +numValidChoiceOptions: dynamic; + +scaleRangeValid: dynamic; + +titles: Map<FormMode, String>; + +isAddOptionButtonVisible: bool; + +isMidValuesClearedInfoVisible: bool | - +void read(); + +String? scaleMidLabelAt(); + -dynamic _onScaleRangeChanged(); + -dynamic _applyInputFormatters(); + -dynamic _updateScaleMidValueControls(); + -Map<String, dynamic>? _validateFreeText(); + -dynamic _onFreeTextLengthChanged(); + -List<FormControlValidation> _getValidationConfig(); + +dynamic onQuestionTypeChanged(); + +dynamic onResponseOptionsChanged(); + -void _updateFormControls(); + +void initControls(); +void setControlsFrom(); - +MeasurementsFormData buildFormData(); + +QuestionFormData buildFormData(); +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); +void onNewItem(); - +MeasurementSurveyFormViewModel provide(); - +void onCancel(); - +dynamic onSave() + +void onSelectItem(); + +dynamic save(); + +QuestionFormViewModel 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] + [QuestionFormViewModel]o-[SurveyQuestionType] + [QuestionFormViewModel]o-[FormControl] + [QuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]o-[<abstract>AbstractControl] + [QuestionFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] + [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [StudyFormValidationSet + [<abstract>WithQuestionnaireControls | - +index: int; - <static>+values: List<StudyFormValidationSet> + +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() ] - [Enum]<:--[StudyFormValidationSet] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [ReportsFormData + [QuestionnaireFormData | - +reportItems: List<ReportItemFormData>; + +questionsData: List<QuestionFormData>?; +id: String | - +Study apply(); - +ReportsFormData copy() + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() + ] + + [<abstract>IFormData]<:--[QuestionnaireFormData] + + [<abstract>IFormDataWithSchedule + | + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? + | + +Schedule toSchedule() ] - [<abstract>IStudyFormData]<:--[ReportsFormData] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [ReportStatus + [ScheduleControls | - +index: int; - <static>+values: List<ReportStatus>; - <static>+primary: ReportStatus; - <static>+secondary: ReportStatus + +formViewModel: WithScheduleControls + | + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [ReportItemFormView + [<abstract>WithScheduleControls | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [ReportItemFormViewModel + [InterventionFormViewModel | - <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; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; +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>; + +interventionId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [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] - [ReportItemFormData + [StudyScheduleFormData | - +isPrimary: bool; - +section: ReportSection; + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; +id: String | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [DataReferenceIdentifier + [StudyScheduleFormView | - +hashCode: int + +formViewModel: StudyScheduleControls | - +bool ==() + -FormTableRow _renderCustomSequence(); + +Widget build() ] - [DataReference]<:-[DataReferenceIdentifier] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [InterventionTaskFormView | - +Widget build() + +formViewModel: InterventionTaskFormViewModel ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [TemporalAggregationFormatted + [InterventionPreview | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + +routeArgs: InterventionFormRouteArgs | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +Widget build() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] - [ImprovementDirectionFormatted + [InterventionsFormData | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +Study apply(); + +InterventionsFormData copy() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] - [ReportSectionType + [InterventionTaskFormData | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +taskId: String; + +taskTitle: String; + +taskDescription: String?; + <static>+kDefaultTitle: String; + +id: String + | + +CheckmarkTask toTask(); + +InterventionTaskFormData copy() ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [DataReferenceEditor - | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + [InterventionFormView | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +formViewModel: InterventionFormViewModel ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [InterventionFormView]o-[InterventionFormViewModel] - [LinearRegressionSectionFormView + [InterventionTaskFormViewModel | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +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() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] - [StudyDesignReportsFormView + [StudyDesignInterventionsFormView | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] - [ReportsFormViewModel + [InterventionsFormViewModel | +study: Study; +router: GoRouter; - +reportItemDelegate: ReportFormItemDelegate; - +reportItemArray: FormArray<dynamic>; - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +interventionsArray: FormArray<dynamic>; + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData>; +form: FormGroup; - +reportItemModels: List<ReportItemFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +interventionsRequired: dynamic; +titles: Map<FormMode, String>; - +canTestConsent: bool + +canTestStudySchedule: bool | +void setControlsFrom(); - +ReportsFormData buildFormData(); + +InterventionsFormData buildFormData(); +void read(); - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); - +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); - +dynamic testReport(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +InterventionFormViewModel provide(); +void onCancel(); +dynamic onSave(); - +ReportItemFormViewModel provide() + +dynamic testStudySchedule() ] - [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] + [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] - [ReportFormItemDelegate + [InterventionFormData | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + +interventionId: String; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: String | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +Intervention toIntervention(); + +InterventionFormData copy() ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [<abstract>IFormData]<:-[InterventionFormData] - [ReportBadge + [<abstract>StudyScheduleControls | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: 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() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] [EnrollmentFormData | @@ -1752,20 +1645,6 @@ [EnrollmentFormData]o-[QuestionnaireFormData] [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() - ] - - [<abstract>IFormData]<:-[ConsentItemFormData] - [ConsentItemFormViewModel | +consentIdControl: FormControl<String>; @@ -1788,6 +1667,13 @@ [ConsentItemFormViewModel]o-[FormGroup] [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [ConsentItemFormView + | + +formViewModel: ConsentItemFormViewModel + ] + + [ConsentItemFormView]o-[ConsentItemFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel | +isDirtyOptionsBannerVisible: bool @@ -1806,15 +1692,6 @@ [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] - [StudyDesignEnrollmentFormView - | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() - ] - - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [ScreenerQuestionFormViewModel | <static>+defaultResponseOptionValidity: bool; @@ -1842,12 +1719,28 @@ [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [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] [EnrollmentFormViewModel | @@ -1917,2452 +1810,2627 @@ [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>StudyDesignPageWidget + [MeasurementsFormViewModel | - +Widget? banner() + +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>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + [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] - [PublishSuccessDialog + [MeasurementSurveyFormData | - +Widget build() + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <static>+kDefaultTitle: String; + +id: String + | + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [PublishDialog + [SurveyPreview + | + +routeArgs: MeasurementFormRouteArgs | +Widget build() ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] + + [MeasurementSurveyFormViewModel + | + +study: Study; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: FormControl<String>; + +form: FormGroup; + +measurementId: String; + +instanceId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +MeasurementSurveyFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs(); + +SurveyQuestionFormRouteArgs buildFormRouteArgs(); + +MeasurementSurveyFormViewModel createDuplicate() + ] + + [MeasurementSurveyFormViewModel]o-[Study] + [MeasurementSurveyFormViewModel]o-[FormControl] + [MeasurementSurveyFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithQuestionnaireControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>WithScheduleControls]<:-[MeasurementSurveyFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[MeasurementSurveyFormViewModel] + [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] + [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [PublishConfirmationDialog + [MeasurementSurveyFormView | - +Widget build() + +formViewModel: MeasurementSurveyFormViewModel ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [StudyAnalyzeController + [MeasurementsFormData | - +dynamic onExport() + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String + | + +Study apply(); + +MeasurementsFormData copy() ] - [StudyBaseController]<:-[StudyAnalyzeController] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [StudyAnalyzeScreen + [StudyDesignMeasurementsFormView | - +Widget? banner(); +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [DrawerEntry - | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +autoCloseDrawer: bool; - +title: String; - +helpText: String? + [<abstract>StudyDesignPageWidget | - +void onClick() + +Widget? banner() ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [GoRouterDrawerEntry - | - +intent: RoutingIntent; - +onNavigated: void Function()? + [StudyDesignInfoFormView | - +void onClick() + +Widget build() ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [GoRouterDrawerEntry]o-[void Function()?] - [DrawerEntry]<:-[GoRouterDrawerEntry] - - [AppDrawer - | - +width: int; - +autoCloseDrawer: bool; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double - ] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [StudyController + [StudyInfoFormData | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +Study apply(); + +StudyInfoFormData copy() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [PreviewFrame + [StudyContactInfoFormData | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? - ] - - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - - [<abstract>IStudyStatusBadgeViewModel + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? + +Study apply(); + +StudyInfoFormData copy() ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [StudyStatusBadge + [StudyInfoFormViewModel | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic | - +Widget build() + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [StudyTestController + [StudyFormViewModel | + +studyDirtyCopy: Study?; + +studyRepository: IStudyRepository; +authRepository: IAuthRepository; - +languageCode: String - ] - - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] - - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? + +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> | - +String toString() + +void read(); + +void setControlsFrom(); + +Study buildFormData(); + +void dispose(); + +void onCancel(); + +dynamic onSave(); + -dynamic _applyAndSaveSubform() ] - [<abstract>PlatformController - | - +studyId: String; - +baseSrc: String; - +previewSrc: String; - +routeInformation: RouteInformation; - +frameWidget: Widget + [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>IStudyFormData | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void listen(); - +void send(); - +void openNewPage() + +Study apply() ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [WebController + [ReportsFormData | - +iFrameElement: IFrameElement + +reportItems: List<ReportItemFormData>; + +id: String | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + +Study apply(); + +ReportsFormData copy() ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [MobileController + [ReportStatus | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [<abstract>PlatformController]<:-[MobileController] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] - [StudySettingsFormViewModel + [ReportItemFormData | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> + +isPrimary: bool; + +section: ReportSection; + +id: String | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [StudySettingsDialog + [ReportItemFormViewModel | - +Widget build() + <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>StudyPageWidget]<:-[StudySettingsDialog] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [StudyTestScreen + [LinearRegressionSectionFormView | - +previewRoute: String? + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - [StudyBaseController + [AverageSectionFormView | + +formViewModel: ReportItemFormViewModel; +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +Widget build() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [StudyParticipationBadge + [TemporalAggregationFormatted | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: bool + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int | - +Widget build() + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [<abstract>IStudyAppBarViewModel + [ImprovementDirectionFormatted | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int + | + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [StudyScaffold + [ReportSectionType | - +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 + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType ] - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] - [FrameControlsWidget + [DataReferenceEditor | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> | - +Widget build() + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() ] - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] - [WebFrame + [DataReferenceIdentifier | - +previewSrc: String; - +studyId: String + +hashCode: int | - +Widget build() + +bool ==() ] - [DisabledFrame - | - +Widget build() - ] + [DataReference]<:-[DataReferenceIdentifier] - [PhoneContainer + [ReportItemFormView | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) | - +Widget build() + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] - [MobileFrame + [StudyDesignReportsFormView | - +Widget build() + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() ] - [DesktopFrame + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + + [ReportsFormViewModel | - +Widget build() + +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() ] - [<abstract>StudyPageWidget + [ReportsFormViewModel]o-[Study] + [ReportsFormViewModel]o-[GoRouter] + [ReportsFormViewModel]o-[ReportFormItemDelegate] + [ReportsFormViewModel]o-[FormArray] + [ReportsFormViewModel]o-[FormViewModelCollection] + [ReportsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportsFormViewModel] + [<abstract>IProviderArgsResolver]<:--[ReportsFormViewModel] + + [ReportFormItemDelegate | - +studyId: String + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +Widget? banner() + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [TestAppRoutes + [ReportBadge | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String - ] - - [<abstract>IStudyNavViewModel + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool + +Widget build() ] - [StudyNav - | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() - ] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [StudyDesignNav + [AccountSettingsDialog | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() + +Widget build() ] + [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] + - + - - - + - + - - + + + + + - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + + - + - + + + + + - + - + + + - + - + - + - + - + - - + + + - - + + + - + - + - + - + - + - + - + - + + + - + - + - + - + - - - - + + + + + + - + - + - + - + - + - + - + - + + + - + - - - + - + - + - + - + - + - + + + + + + + - + - - - + - + - + - + - - - - + + + + + + + + + + + + + - - - - + - + - + - - + + - + - - - + - + - + - + - + - + - + - + - + - - - - + - - + - + - - - - - - - - - - - + + + + + - + - + - + - + - + - + - + - + - + - - - - - + + + + - + + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + + - - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - - + + - + - - + + + - - + - + - - - + - + - + - + - + - + - + - + - - - + - + - - + + + + + + + - - + - + + + + + + + - + - + - + - - - - + + - + - + + + - + - + - + - - - + - + - + - + - + - + - + - - + + - + - - - - - + + - + + - + + + - + - - - + + + + - - + - + - - + + + - - - - - - + - + - - - + - + - - - + - + - + - + - + + + - + - + - + - + - + - - - - + + + - - + - + - + + + - + - - + + + - - + - + - - - + - + - + + + - + - - - + - + - - + + - + - - + + + + + + + + + + - + - + - + - - + + - + - - + + - + - - - + + - + + + + + + - + - + + + - + - + + + - + - + - + - - - + + - + + - + - + - + - + + + - + - - - - - - - - - + + + - - - - + - - + + + - + - + - + - + - + - + - + - + - + - - - + + + + - + + - + - + - + + + + - - - - + - + - + - + + + + + + - - + + + + + + + + + + + + + + + + - - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - + - - - - + + - + - - - + + + - + - + - + - - - - - - - + + + - + - + + + + + + + - + - - - + - + - + - + - - - + + + + + + + - + - - - + - + - + - + - + - + - - - - - - - - + + + - + + + + - + - + - + - - - + - + - - + + + + - + - + - + - + - + - + - - - - - - - - - - + - - + - - - - - - - - - - - - - - + + - - - - + - - + - + - + + + - + - + - + - + + + - + - - - + + + + - - - + + + + + + - + - - - - - + - + - - - + - + - + - + - + - + - + - + - + - + + + + + - + - - - - + + + - - - + + + - + + - + - - - - - + - + - - - + + - - - + + + - - - + + + - + + - + - + - + - - - - - - - - + + + - - + - + - + - + + + - + - + - + - + - + - - + + - + - + + + - + - + + + - + - + - + + + + + + + + + + + - + - - - - - - + + + - - - + + + - - - + + - + + + + - - - - - + + + + + + + + - + - - - + - - + + + + + + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - - - - - - + + + - - - + + + - - - + + + - - + - + - + - + + + - + - + - + - + - + - - - - - - - - - - - - - - + + - + - - - - - - - - - - - - - - - + + - + + - + - - - + + + - + - + - + - - - + - + - + + + - + - + + + - + - + + + - + - + - + - + - + - + - + - - - + - + - - - + + - + + - + - - - - - + - + - + + + - + - + - + - + + + - + - - - - - - - + - + - + - + - + - + - + - + - + - + + + - + - + - + - - + + - + - + - + - - - + + - - - + + + - - - + + + - - - + + - + - + - - - - - - - - - - - - - - - - AccountSettingsDialog - - - - - - +Widget build() - - - + - - - + + + + + + + - - - ConsumerWidget + + + SignupForm - - - - - - - - - IAppDelegate + + + +formKey: AuthFormKey - - - +dynamic onAppStart() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - - - + + + + - - - AppController + + + AuthFormKey - - - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + + + + + + FormConsumerRefWidget - - - + + + + + - - - SharedPreferences + + + AuthFormController - - - - - - - - - StudiesFilter + + + +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 - - - +index: int - <static>+values: List<StudiesFilter> + + + -dynamic _getFormFor() + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -dynamic _readDebugUser() + -void _setRememberMe() + -void _delRememberMe() + -void _initRememberMe() - - - + + + - - - Enum + + + IAuthRepository - - - - + + + - - - StudiesTableItem + + + SharedPreferences - - - +study: Study - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +actions: List<ModelAction<dynamic>> - +columnSizes: List<StudiesTableColumnSize> - +isPinned: bool - +onPinnedChanged: void Function(Study, bool)? - +onTap: void Function(Study)? + + + + + + + + INotificationService - - - + + + - - - Study + + + GoRouter - - - + + + - - - void Function(Study, bool)? + + + FormControl - - - + + + - - - void Function(Study)? + + + FormGroup - - - - + + + + - - - StudiesTableColumnHeader + + + IFormGroupController - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? + + + +form: FormGroup - - - + + + - - - void Function()? + + + Enum - - - - - + + + + + - - - DashboardScaffold + + + PasswordForgotForm - - - <static>+compactWidthThreshold: double - +body: Widget + + + +formKey: AuthFormKey - - - +Widget build() + + + +Widget build() - - - + + + + - - - Widget + + + EmailTextField + + + + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - + + + + - - - DashboardScreen + + + PasswordTextField - - - +filter: StudiesFilter? + + + +labelText: String + +hintText: String? + +onSubmitted: dynamic Function(FormControl<dynamic>)? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - - + + + - - - StudiesTableColumnSize + + + dynamic Function(FormControl<dynamic>)? - - - +collapsed: bool - +flex: int? - +width: double? + + + + + + + + + + PasswordRecoveryForm - - - +Widget createContainer() + + + +formKey: AuthFormKey - - - - - - - - - - StudiesTable + + + +Widget build() - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController + + + + + + + + + AuthScaffold - - - +Widget build() - -Widget _buildColumnHeader() + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - + + + - - - void Function(Study) + + + Widget - - - + + + - - - List<ModelAction<dynamic>> Function(Study) + + + EdgeInsets - - - - - + + + + - - - DashboardController + + + StudyUJobsToBeDone - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool + + + +Widget build() - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + + + + + + + + LoginForm - - - - - - - - - StudiesTableColumn + + + +formKey: AuthFormKey - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn + + + +Widget build() - - - + + + + - - - IStudyRepository + + + IAppDelegate - - - - - - - - IAuthRepository + + + +dynamic onAppStart() - - - + + + + + - - - IUserRepository + + + AppController - - - - + + + +sharedPreferences: SharedPreferences + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic + + - - - GoRouter + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - + + + - - - StreamSubscription + + + App - - - + + + - - - SearchController + + + AppContent - - - + + + + - - - IModelActionProvider + + + AppStatus + + + + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - - + + + + - - - StudyMonitorScreen + + + StudyAnalyzeScreen - - - +Widget build() + + + +Widget? banner() + +Widget build() - - - + + + - + StudyPageWidget - + +studyId: String - + +Widget? banner() - - - + + + + - - - App + + + StudyAnalyzeController + + + + + + +dynamic onExport() - - - + + + + + - - - AppContent + + + StudyBaseController + + + + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - - + + + + + - - - StudyInvitesTable + + + StudyParticipationBadge - - - +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) + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + +center: bool - - - +Widget build() - -List<Widget> _buildRow() + + + +Widget build() - - - + + + - - - void Function(StudyInvite) + + + Participation - - - + + + - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + BadgeType + + + + + + + + + + + + PreviewFrame + + + + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - + + + - - - Intervention? Function(String) + + + StudyFormRouteArgs - - - + + + + + - - - int Function(StudyInvite) + + + FrameControlsWidget - - - - - - - - - - InviteCodeFormView + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool - - - +formViewModel: InviteCodeFormViewModel + + + +Widget build() - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + + + + + + void Function()? - - - - - + + + - - - InviteCodeFormViewModel + + + ConsumerWidget - - - +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>? + + + + + + + + + IStudyNavViewModel - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - + + + + - - - FormConsumerWidget + + + StudyNav + + + + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - - - + + + + - - - EnrolledBadge + + + StudyDesignNav - - - +enrolledCount: int + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - +Widget build() + + + + + + + + + + StudySettingsFormViewModel - - - - + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> + + - - - IInviteCodeRepository + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - + + + - - - FormControl + + + AsyncValue - - - + + + - - - FormGroup + + + IStudyRepository - - - + + + - + FormViewModel - + -_formData: T? -_formMode: FormMode @@ -4387,7 +4455,7 @@ - + -dynamic _setFormData() -dynamic _rememberDefaultControlValidators() @@ -4411,3077 +4479,2938 @@ - - - - - + + + + - - - StudyRecruitController + + + StudySettingsDialog - - - +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() + + + + + + + + + + StudyTestScreen - - - - - - - - - - StudyBaseController + + + +previewRoute: String? - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + + + + + + StreamSubscription - - - - + + + + - - - StudyRecruitScreen + + + StudyTestController - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + +authRepository: IAuthRepository + +languageCode: String - - - + + + + + - - - FormInvalidException + + + WebFrame - - - - + + + +previewSrc: String + +studyId: String + + - - - Exception + + + +Widget build() - - - - + + + + - - - FormConfigException + + + DisabledFrame - - - +message: String? + + + +Widget build() - - - - + + + + + - - - IFormViewModelDelegate + + + PhoneContainer - - - +dynamic onSave() - +void onCancel() + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? - - - - - - - - - IFormGroupController + + + +Widget build() - - - +form: FormGroup + + + + + + + + Color - - - - + + + + - - - FormControlOption + + + MobileFrame - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + +Widget build() - - - + + + + - - - Equatable + + + DesktopFrame - - - - - - - - - FormMode + + + +Widget build() - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + + + + + + + IStudyAppBarViewModel - - - - - - - - FormValidationSetEnum + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - + + + + - - - Debouncer + + + IStudyStatusBadgeViewModel - - - - - - - - CancelableOperation + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - - + + + + - - - ManagedFormViewModel + + + StudyScaffold - - - +ManagedFormViewModel<T> 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 - - - + + + - - - FormViewModelNotFoundException + + + NavbarTab - - - - - + + + - - - FormViewModelCollection + + + SingleColumnLayoutType - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + + + + + + + + RouteInformation - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - - - - - - FormArray + + + +String toString() - - - - - + + + + + - - - FormControlValidation + + + PlatformController - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget - - - +FormControlValidation merge() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - + + + + + - - - AbstractControl + + + WebController - - - - - - - - - - CustomFormControl + + + +iFrameElement: IFrameElement - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - +void dispose() + + + + + + + + IFrameElement - - - + + + + - - - void Function(T?)? + + + MobileController + + + + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - + + + - - - void Function(ControlStatus)? + + + StudyStatus - - - - - + + + + + - - - FormArrayTable + + + StudyStatusBadge - - - +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> + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + +Widget build() - - - + + + + - - - void Function(T) + + + TestAppRoutes - - - - - - - - List<ModelAction<dynamic>> Function(T, int) + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - + + + - - - String Function(T) + + + IWithBanner - - - + + + + + - - - IconData + + + StudyController - - - - - - - - Widget Function(BuildContext, T, int)? + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - - - - - - EdgeInsets + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - - + + + + - - - UnsavedChangesDialog + + + StudyMonitorScreen - - - +Widget build() + + + +Widget build() - - - - - - - - - IFormData - - + + + + - - - +id: String + + + StudiesTableColumnHeader - - - +IFormData copy() + + + +title: String + +sortable: bool + +sortAscending: bool + +sortingActive: bool + +onSort: void Function()? - - - - - + + + + + - - - PasswordRecoveryForm + + + DashboardScaffold - - - +formKey: AuthFormKey + + + <static>+compactWidthThreshold: double + +body: Widget - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - AuthFormKey + + + StudiesTableColumnSize - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + +collapsed: bool + +flex: int? + +width: double? - - - - - - - - FormConsumerRefWidget + + + +Widget createContainer() - - - - - + + + + + - - - SignupForm + + + StudiesTable - - - +formKey: AuthFormKey + + + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +compactWidthThreshold: double + +superCompactWidthThreshold: double + +compactStatTitleThreshold: double + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + +Widget build() + -Widget _buildColumnHeader() + + + + + + + + + + + void Function(Study) - - - - + + + - - - StudyUJobsToBeDone + + + List<ModelAction<dynamic>> Function(Study) - - - +Widget build() + + + + + + + + + + DashboardController - - - - - - - - - EmailTextField + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + +isSortAscending: bool - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void setSorting() + +void filterStudies() + +void sortStudies() + +bool isSortingActiveForColumn() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - - + + + + - - - PasswordTextField + + + StudiesTableColumn - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +index: int + <static>+values: List<StudiesTableColumn> + <static>+pin: StudiesTableColumn + <static>+title: StudiesTableColumn + <static>+status: StudiesTableColumn + <static>+participation: StudiesTableColumn + <static>+createdAt: StudiesTableColumn + <static>+enrolled: StudiesTableColumn + <static>+active: StudiesTableColumn + <static>+completed: StudiesTableColumn + <static>+action: StudiesTableColumn - - - + + + + - - - dynamic Function(FormControl<dynamic>)? + + + DashboardScreen - - - - - - - - - - AuthFormController + + + +filter: StudiesFilter? - - - +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 + + + + + + + + + StudiesFilter - - - -dynamic _getFormFor() - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -dynamic _readDebugUser() - -void _setRememberMe() - -void _delRememberMe() - -void _initRememberMe() + + + +index: int + <static>+values: List<StudiesFilter> - - - + + + - - - INotificationService + + + IUserRepository - - - - - + + + - - - PasswordForgotForm + + + SearchController - - - +formKey: AuthFormKey - - + + + + - - - +Widget build() + + + IModelActionProvider - - - - + + + + - - - AuthScaffold + + + StudiesTableItem - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + +study: Study + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +actions: List<ModelAction<dynamic>> + +columnSizes: List<StudiesTableColumnSize> + +isPinned: bool + +onPinnedChanged: void Function(Study, bool)? + +onTap: void Function(Study)? - - - - - + + + - - - LoginForm + + + Study - - - +formKey: AuthFormKey - - + + + + - - - +Widget build() + + + void Function(Study, bool)? - - - - - - - - AppStatus - - + + + - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + void Function(Study)? - - - - - + + + + + - - - StudyInfoFormData + + + FormArrayTable - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + +control: AbstractControl<dynamic> + +items: List<T> + +onSelectItem: void Function(T) + +getActionsAt: List<ModelAction<dynamic>> Function(T, int) + +onNewItem: void Function()? + +rowTitle: String Function(T) + +onNewItemLabel: String + +sectionTitle: String? + +sectionDescription: String? + +emptyIcon: IconData? + +emptyTitle: String? + +emptyDescription: String? + +sectionTitleDivider: bool? + +rowPrefix: Widget Function(BuildContext, T, int)? + +rowSuffix: Widget Function(BuildContext, T, int)? + +leadingWidget: Widget? + +itemsSectionPadding: EdgeInsets? + +hideLeadingTrailingWhenEmpty: bool + <static>+columns: List<StandardTableColumn> - - - +Study apply() - +StudyInfoFormData copy() + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - - - + + + - - - StudyContactInfoFormData + + + AbstractControl - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String - - + + + + - - - +Study apply() - +StudyInfoFormData copy() + + + void Function(T) - - - - - - - - IStudyFormData - - + + + - - - +Study apply() + + + List<ModelAction<dynamic>> Function(T, int) - - - - - - - - StudyDesignInfoFormView - - + + + - - - +Widget build() + + + String Function(T) - - - - + + + - - - StudyDesignPageWidget + + + IconData - - - +Widget? banner() + + + + + + + + Widget Function(BuildContext, T, int)? - - - - - + + + + + - - - StudyInfoFormViewModel + + + CustomFormControl - - - +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 + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + +void dispose() - - - - - + + + - - - WithScheduleControls + + + Debouncer - - - +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() + + + void Function(T?)? - - - - - + + + - - - IFormDataWithSchedule + + + void Function(ControlStatus)? - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? - - + + + + - - - +Schedule toSchedule() + + + FormInvalidException - - - + + + - - - StudyUTimeOfDay + + + Exception - - - - - + + + + - - - ScheduleControls + + + FormConfigException - - - +formViewModel: WithScheduleControls + + + +message: String? - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + + + + + + + IFormViewModelDelegate - - - - - - - - - - WithQuestionnaireControls + + + +dynamic onSave() + +void onCancel() - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + + + + + + + FormControlOption - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - + + + - - - IProviderArgsResolver + + + Equatable - - - - - - - - - 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 + + + FormMode - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - - + + + - - - SurveyQuestionType + + + FormValidationSetEnum - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + + + + + + CancelableOperation - - - - - + + + + + - - - ChoiceQuestionFormData + + + IFormData - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + +id: String - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + +IFormData copy() - - - - - + + + + - - - BoolQuestionFormData + + + UnsavedChangesDialog - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + +Widget build() - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + + + + + + + + FormControlValidation - - - - - - + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> + + - - - ScaleQuestionFormData + + + +FormControlValidation merge() - - - +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> + + + + + + + + + ManagedFormViewModel - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +ManagedFormViewModel<T> createDuplicate() - - - + + + - - - Color + + + FormViewModelNotFoundException - - - - - + + + + + - - - FreeTextQuestionFormData + + + FormViewModelCollection - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - + + + - - - FreeTextQuestionType + + + FormArray - - - - - + + + + + - - - QuestionFormViewModel + + + DrawerEntry - - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +autoCloseDrawer: bool + +title: String + +helpText: String? - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + +void onClick() - - - + + + - - - IListActionProvider + + + String Function() - - - - + + + - - - SurveyQuestionFormView + + + String Function()? - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + + + + + + void Function(BuildContext, WidgetRef)? - - - - - + + + + + - - - FreeTextQuestionFormView + + + GoRouterDrawerEntry - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic + + + +intent: RoutingIntent + +onNavigated: void Function()? - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + +void onClick() - - - - + + + - - - IScaleQuestionFormViewModel + + + RoutingIntent - - - +isMidValuesClearedInfoVisible: bool + + + + + + + + + AppDrawer + + + + + + +width: int + +autoCloseDrawer: bool + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - - + + + + + - - - ScaleQuestionFormView + + + StudyInvitesTable - - - +formViewModel: QuestionFormViewModel + + + +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() - - - - - + + + - - - ChoiceQuestionFormView + + + void Function(StudyInvite) - - - +formViewModel: QuestionFormViewModel + + + + + + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - +Widget build() + + + + + + + + Intervention? Function(String) - - - - - + + + - - - BoolQuestionFormView + + + int Function(StudyInvite) - - - +formViewModel: QuestionFormViewModel + + + + + + + + + + InviteCodeFormView - - - +Widget build() + + + +formViewModel: InviteCodeFormViewModel + + + + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - - - + + + + + - - - QuestionnaireFormData + + + InviteCodeFormViewModel - - - +questionsData: List<QuestionFormData>? - +id: String + + + +study: Study + +inviteCodeRepository: IInviteCodeRepository + +codeControl: FormControl<String> + +codeControlValidationMessages: Map<String, String Function(dynamic)> + +isPreconfiguredScheduleControl: FormControl<bool> + +preconfiguredScheduleTypeControl: FormControl<PhaseSequence> + +interventionAControl: FormControl<String> + +interventionBControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +interventionControlOptions: List<FormControlOption<String>> + +preconfiguredScheduleTypeOptions: List<FormControlOption<PhaseSequence>> + +isPreconfiguredSchedule: bool + +preconfiguredSchedule: List<String>? - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - - - + + + - - - StudyFormScaffold + + + FormConsumerWidget - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + + + + + + IInviteCodeRepository - - - +Widget build() + + + + + + + + + + StudyRecruitController - - - - + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + - - - T Function(WidgetRef) + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - + + + + - - - Widget Function(T) + + + StudyRecruitScreen + + + + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - - - + + + + + - - - StudyFormViewModel + + + EnrolledBadge - - - +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> + + + +enrolledCount: int - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + +Widget build() - - - - - + + + + - - - EnrollmentFormViewModel + + + PublishConfirmationDialog - - - +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() + + + + + + + + + PublishSuccessDialog - - - - - - - - - - MeasurementsFormViewModel + + + +Widget build() - - - +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> + + + + + + + + + PublishDialog - - - +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 + + + StudyFormScaffold - - - +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 + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + +Widget build() - - - - - + + + - - - InterventionsFormViewModel + + + T Function(WidgetRef) - - - +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() + + + Widget Function(T) - - - - - - - - - InterventionTaskFormData - - + + + + - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + StudyFormValidationSet - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - - - - - StudyScheduleFormData - - + + + + + - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + QuestionFormData - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String - - - - - - - - PhaseSequence + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - - + + + + - - - InterventionFormView + + + SurveyQuestionType - - - +formViewModel: InterventionFormViewModel + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - - - + + + + + - - - InterventionFormViewModel + + + ChoiceQuestionFormData - - - +study: Study - +interventionIdControl: FormControl<String> - +interventionTitleControl: FormControl<String> - +interventionIconControl: FormControl<IconOption> - +interventionDescriptionControl: FormControl<String> - +interventionTasksArray: FormArray<dynamic> - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData> - +form: FormGroup - +interventionId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneTask: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - StudyScheduleControls + + + BoolQuestionFormData - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - InterventionsFormData + + + ScaleQuestionFormData - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> - - - +Study apply() - +InterventionsFormData copy() + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - + + + + + - - - StudyDesignInterventionsFormView + + + FreeTextQuestionFormData - - - +Widget build() + + + +textLengthRange: List<int> + +textType: FreeTextQuestionType + +textTypeExpression: String? + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +FreeTextQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + - - - StudyScheduleFormView + + + FreeTextQuestionType - - - +formViewModel: StudyScheduleControls + + + + + + + + + SurveyQuestionFormView - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - - + + + + + - - - InterventionTaskFormViewModel + + + QuestionFormViewModel - - - +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>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - - - - - - - InterventionFormData - - + + + + - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + IScaleQuestionFormViewModel - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +isMidValuesClearedInfoVisible: bool - - - - + + + + - - - InterventionTaskFormView + + + ScaleQuestionFormView - - - +formViewModel: InterventionTaskFormViewModel + + + +formViewModel: QuestionFormViewModel - - - - - + + + + + - - - InterventionPreview + + + ChoiceQuestionFormView - - - +routeArgs: InterventionFormRouteArgs + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - + + + + + - - - InterventionFormRouteArgs + + + BoolQuestionFormView - - - - - - - - - MeasurementSurveyFormView + + + +formViewModel: QuestionFormViewModel - - - +formViewModel: MeasurementSurveyFormViewModel + + + +Widget build() - - - - - + + + + + - - - MeasurementSurveyFormViewModel + + + FreeTextQuestionFormView - - - +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> + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic - - - +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() + +Widget disableOnReadonly() + +Widget generateRow() - - - - - + + + - - - SurveyPreview + + + IListActionProvider - - - +routeArgs: MeasurementFormRouteArgs + + + + + + + + + + WithQuestionnaireControls - - - +Widget build() + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - - - - - - MeasurementFormRouteArgs + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - - + + + - - - MeasurementSurveyFormData + + + IProviderArgsResolver - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String - - + + + + + + - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + QuestionnaireFormData - - - - - - - - - StudyDesignMeasurementsFormView + + + +questionsData: List<QuestionFormData>? + +id: String - - - +Widget build() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - - + + + + + - - - MeasurementsFormData + + + IFormDataWithSchedule - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - +Study apply() - +MeasurementsFormData copy() + + + +Schedule toSchedule() - - - - - - - - StudyFormValidationSet - - + + + - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + StudyUTimeOfDay - - - - - + + + + + - - - ReportsFormData + + + ScheduleControls - - - +reportItems: List<ReportItemFormData> - +id: String + + + +formViewModel: WithScheduleControls - - - +Study apply() - +ReportsFormData copy() + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - + + + + + - - - ReportStatus + + + WithScheduleControls - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + +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() - - - - - + + + + + - - - ReportItemFormView + + + InterventionFormViewModel - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + +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() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + +void setControlsFrom() + +InterventionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +void onCancel() + +dynamic onSave() + +InterventionTaskFormViewModel provide() + +InterventionTaskFormRouteArgs buildNewFormRouteArgs() + +InterventionTaskFormRouteArgs buildFormRouteArgs() + +InterventionFormViewModel createDuplicate() - - - - - + + + + + - - - ReportItemFormViewModel + + + StudyScheduleFormData - - - <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 + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - + + + - - - Widget Function(BuildContext) + + + PhaseSequence - - - - + + + + - - - ReportSectionType + + + IStudyFormData - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +Study apply() - - - - - + + + + + - - - ReportItemFormData + + + StudyScheduleFormView - - - +isPrimary: bool - +section: ReportSection - +id: String + + + +formViewModel: StudyScheduleControls - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - + + + + + - - - ReportSection + + + StudyScheduleControls - - - - - - - - - - DataReferenceIdentifier + + + <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 - - - +hashCode: int + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - +bool ==() + + + + + + + + + InterventionTaskFormView - - - - - - - - DataReference + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - AverageSectionFormView + + + InterventionTaskFormViewModel - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +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() - - - - - + + + + + - - - TemporalAggregationFormatted + + + InterventionPreview - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + +routeArgs: InterventionFormRouteArgs - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +Widget build() - - - + + + - - - TemporalAggregation + + + InterventionFormRouteArgs - - - - - - - - - ImprovementDirectionFormatted - - + + + + + - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + InterventionsFormData - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - - - - - - ImprovementDirection + + + +Study apply() + +InterventionsFormData copy() - - - - - + + + + + - - - 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() - - - + + + + - - - ReactiveDropdownField + + + InterventionFormView - - - - - - - - - - LinearRegressionSectionFormView + + + +formViewModel: InterventionFormViewModel - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + + + + + + + StudyDesignInterventionsFormView - - - +Widget build() + + + +Widget build() - - - - + + + + - - - StudyDesignReportsFormView + + + StudyDesignPageWidget - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +Widget? banner() - - - - - + + + + + - - - ReportFormItemDelegate + + + InterventionsFormViewModel - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +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() - - - - - - - - - ReportBadge - - + + + + + - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + InterventionFormData - - - +Widget build() + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - - - - - - BadgeType + + + +Intervention toIntervention() + +InterventionFormData copy() - - - + + + - + EnrollmentFormData - + <static>+kDefaultEnrollmentType: Participation +enrollmentType: Participation @@ -7491,7 +7420,7 @@ - + +Study apply() +EnrollmentFormData copy() @@ -7499,60 +7428,19 @@ - - - - - - - Participation - - - - - - - - - - - - - ConsentItemFormData - - - - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String - - - - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() - - - - - - - + + + - + ConsentItemFormViewModel - + +consentIdControl: FormControl<String> +titleControl: FormControl<String> @@ -7567,7 +7455,7 @@ - + +void setControlsFrom() +ConsentItemFormData buildFormData() @@ -7576,18 +7464,36 @@ + + + + + + + + ConsentItemFormView + + + + + + +formViewModel: ConsentItemFormViewModel + + + + - - + + - + IScreenerQuestionLogicFormViewModel - + +isDirtyOptionsBannerVisible: bool @@ -7596,23 +7502,23 @@ - - - + + + - + ScreenerQuestionLogicFormView - + +formViewModel: ScreenerQuestionFormViewModel - + +Widget build() -dynamic _buildInfoBanner() @@ -7624,17 +7530,17 @@ - - - + + + - + ScreenerQuestionFormViewModel - + <static>+defaultResponseOptionValidity: bool +responseOptionsDisabledArray: FormArray<dynamic> @@ -7650,7 +7556,7 @@ - + +dynamic onResponseOptionsChanged() +void setControlsFrom() @@ -7665,16 +7571,16 @@ - - + + - + StudyDesignEnrollmentFormView - + +Widget build() -dynamic _showScreenerQuestionSidesheetWithArgs() @@ -7683,37 +7589,101 @@ - - - - + + + + + - - - ConsentItemFormView + + + ConsentItemFormData - - - +formViewModel: ConsentItemFormViewModel + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String + + + + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() + + + + + + + + + + + + + EnrollmentFormViewModel + + + + + + +study: Study + +router: GoRouter + +consentItemDelegate: EnrollmentFormConsentItemDelegate + +enrollmentTypeControl: FormControl<Participation> + +consentItemArray: FormArray<dynamic> + +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +form: FormGroup + +enrollmentTypeControlOptions: List<FormControlOption<Participation>> + +consentItemModels: List<ConsentItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestScreener: bool + +canTestConsent: bool + +questionTitles: Map<FormMode, String Function()> + + + + + + +void setControlsFrom() + +EnrollmentFormData buildFormData() + +void read() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs() + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs() + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs() + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs() + +dynamic testScreener() + +dynamic testConsent() + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() - - - + + + - + EnrollmentFormConsentItemDelegate - + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> +owner: EnrollmentFormViewModel @@ -7722,7 +7692,7 @@ - + +void onCancel() +dynamic onSave() @@ -7734,932 +7704,962 @@ - - - - + + + + + - - - PublishSuccessDialog + + + MeasurementsFormViewModel - - - +Widget build() + + + +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> - - - - - - - - - PublishDialog + + + +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() + + + + + + + + + + MeasurementSurveyFormData - - - - - - - - - PublishConfirmationDialog + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - +Widget build() + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - + + + + + - - - StudyAnalyzeController + + + SurveyPreview - - - +dynamic onExport() + + + +routeArgs: MeasurementFormRouteArgs - - - - - - - - - StudyAnalyzeScreen + + + +Widget build() - - - +Widget? banner() - +Widget build() + + + + + + + + MeasurementFormRouteArgs - - - - - + + + + + - - - DrawerEntry + + + MeasurementSurveyFormViewModel - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +autoCloseDrawer: bool - +title: String - +helpText: String? + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +void onClick() + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - + + + + - - - String Function() + + + MeasurementSurveyFormView - - - - - - - - String Function()? + + + +formViewModel: MeasurementSurveyFormViewModel - - - + + + + + - - - void Function(BuildContext, WidgetRef)? + + + MeasurementsFormData - - - - - - - - - - GoRouterDrawerEntry + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - +intent: RoutingIntent - +onNavigated: void Function()? + + + +Study apply() + +MeasurementsFormData copy() - - - +void onClick() + + + + + + + + + StudyDesignMeasurementsFormView - - - - - - - - RoutingIntent + + + +Widget build() - - - - + + + + - - - AppDrawer + + + StudyDesignInfoFormView - - - +width: int - +autoCloseDrawer: bool - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + +Widget build() - - - - - + + + + + - - - StudyController + + + StudyInfoFormData - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - +dynamic syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +Study apply() + +StudyInfoFormData copy() - - - - + + + + + - - - PreviewFrame + + + StudyContactInfoFormData - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - - - - - - StudyFormRouteArgs + + + +Study apply() + +StudyInfoFormData copy() - - - - + + + + + - - - IStudyStatusBadgeViewModel + + + StudyInfoFormViewModel - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + +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 - - - - - - - - StudyStatus + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - - - - - - - StudyStatusBadge - - - - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool - - + + + + + - - - +Widget build() + + + StudyFormViewModel - - - - - - - - - StudyTestController + + + +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> - - - +authRepository: IAuthRepository - +languageCode: String + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - - - + + + + + - - - RouteInformation + + + ReportsFormViewModel - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + +study: Study + +router: GoRouter + +reportItemDelegate: ReportFormItemDelegate + +reportItemArray: FormArray<dynamic> + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +form: FormGroup + +reportItemModels: List<ReportItemFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> + +canTestConsent: bool - - - +String toString() + + + +void setControlsFrom() + +ReportsFormData buildFormData() + +void read() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() + +ReportItemFormRouteArgs buildReportItemFormRouteArgs() + +dynamic testReport() + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() - - - - - + + + + + - - - PlatformController + + + ReportsFormData - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + +reportItems: List<ReportItemFormData> + +id: String - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + +Study apply() + +ReportsFormData copy() - - - - - - - - - WebController - - + + + + - - - +iFrameElement: IFrameElement + + + ReportStatus - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void openNewPage() - +void listen() - +void send() + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - + + + + + - - - IFrameElement + + + ReportItemFormData - - - - - - - - - MobileController + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - - - + + + - - - StudySettingsFormViewModel + + + ReportSection - - - +study: AsyncValue<Study> - +studyRepository: IStudyRepository - <static>+defaultPublishedToRegistry: bool - <static>+defaultPublishedToRegistryResults: bool - +isPublishedToRegistryControl: FormControl<bool> - +isPublishedToRegistryResultsControl: FormControl<bool> - +form: FormGroup - +titles: Map<FormMode, String> + + + + + + + + + + ReportItemFormViewModel - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + <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 - - - - - - - - AsyncValue + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - - + + + + - - - StudySettingsDialog + + + ReportSectionType - - - +Widget build() + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - StudyTestScreen + + + LinearRegressionSectionFormView - - - +previewRoute: String? + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +Widget build() - - - - - + + + + + - - - StudyParticipationBadge + + + AverageSectionFormView - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - IStudyAppBarViewModel + + + TemporalAggregationFormatted - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int + + + + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - - - - - - IStudyNavViewModel - - + + + - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + TemporalAggregation - - - - + + + + + - - - StudyScaffold + + + ImprovementDirectionFormatted - - - +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 + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int - - - - - - - - NavbarTab + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - + + + - - - SingleColumnLayoutType + + + ImprovementDirection - - - - - + + + + + - - - FrameControlsWidget + + + DataReferenceEditor - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +Widget build() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - + + + - - - WebFrame + + + ReactiveDropdownField - - - +previewSrc: String - +studyId: String + + + + + + + + + + DataReferenceIdentifier - - - +Widget build() + + + +hashCode: int - - - - - - - - - DisabledFrame + + + +bool ==() - - - +Widget build() + + + + + + + + DataReference - - - - - + + + + + - - - PhoneContainer + + + ReportItemFormView - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - +Widget build() + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - - - - - - MobileFrame - - + + + - - - +Widget build() + + + Widget Function(BuildContext) - - - - + + + + - - - DesktopFrame + + + StudyDesignReportsFormView - - - +Widget build() + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - + + + + + - - - IWithBanner + + + ReportFormItemDelegate - - - - - - - - - TestAppRoutes + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - + + + + + - - - StudyNav + + + ReportBadge - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool + + + + + + +Widget build() - - - - + + + + - - - StudyDesignNav + + + AccountSettingsDialog - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + +Widget build() diff --git a/docs/uml/designer_v2/lib/uml.svg b/docs/uml/designer_v2/lib/uml.svg index ad064d0f3..d18e94f75 100644 --- a/docs/uml/designer_v2/lib/uml.svg +++ b/docs/uml/designer_v2/lib/uml.svg @@ -1,5 +1,16 @@ - - [RoutingIntents + + [Config + | + <static>+isDebugMode: bool; + <static>+defaultLocale: Set<String>; + <static>+supportedLocales: Map<String, String>; + <static>+newStudyId: String; + <static>+newModelId: String; + <static>+minSplashTime: int; + <static>+formAutosaveDebounce: int + ] + + [RoutingIntents | <static>+root: RoutingIntent; <static>+studies: RoutingIntent; @@ -160,757 +171,1042 @@ [<abstract>StudyFormRouteArgs]<:-[ReportItemFormRouteArgs] - [Assets + [<abstract>ISyncIndicatorViewModel | - <static>+logoWide: String + +isDirty: bool; + +lastSynced: DateTime? ] - [StudyTemplates - | - <static>+kUnnamedStudyTitle: String + [SyncIndicator | - <static>+Study emptyDraft() + +state: AsyncValue<T>; + +lastSynced: DateTime?; + +isDirty: bool; + +animationDuration: int; + +iconSize: double ] - [StudyActionType + [SyncIndicator]o-[<abstract>AsyncValue] + + [EmptyBody | - +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 + +icon: IconData?; + +leading: Widget?; + +leadingSpacing: double?; + +title: String?; + +description: String?; + +button: Widget? + | + +Widget build() ] - [StudyActionType]o-[StudyActionType] - [Enum]<:--[StudyActionType] + [EmptyBody]o-[IconData] + [EmptyBody]o-[<abstract>Widget] - [<abstract>ResultTypes + [NullHelperDecoration ] - [MeasurementResultTypes + [InputDecoration]<:-[NullHelperDecoration] + + [Search | - <static>+questionnaire: String; - <static>+values: List<String> + +onQueryChanged: dynamic Function(String); + +searchController: SearchController?; + +hintText: String?; + +initialText: String? ] - [<abstract>ResultTypes]<:-[MeasurementResultTypes] + [Search]o-[dynamic Function(String)] + [Search]o-[SearchController] - [InterventionResultTypes + [SearchController | - <static>+checkmarkTask: String; - <static>+values: List<String> + +setText: void Function(String) ] - [<abstract>ResultTypes]<:-[InterventionResultTypes] + [SearchController]o-[void Function(String)] - [StudyExportData + [ConstrainedWidthFlexible | - +study: Study; - +measurementsData: List<Map<String, dynamic>>; - +interventionsData: List<Map<String, dynamic>>; - +isEmpty: bool + +minWidth: double; + +maxWidth: double; + +flex: int; + +flexSum: int; + +child: Widget; + +outerConstraints: BoxConstraints + | + +Widget build(); + -double _getWidth() ] - [StudyExportData]o-[Study] + [ConstrainedWidthFlexible]o-[<abstract>Widget] + [ConstrainedWidthFlexible]o-[BoxConstraints] - [<abstract>ModelEvent + [AsyncValueWidget | - +modelId: String; - +model: T - ] - - [IsFetched + +value: AsyncValue<T>; + +data: Widget Function(T); + +error: Widget Function(Object, StackTrace?)?; + +loading: Widget Function()?; + +empty: Widget Function()? + | + +Widget build(); + -Widget _buildDataOrEmptyWidget(); + -Widget _defaultError(); + -Widget _defaultLoad() ] - [<abstract>ModelEvent]<:-[IsFetched] + [AsyncValueWidget]o-[<abstract>AsyncValue] + [AsyncValueWidget]o-[Widget Function(T)] + [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] + [AsyncValueWidget]o-[Widget Function()?] - [IsSaving + [ActionPopUpMenuButton + | + +actions: List<ModelAction<dynamic>>; + +triggerIconColor: Color?; + +triggerIconColorHover: Color?; + +triggerIconSize: double; + +disableSplashEffect: bool; + +hideOnEmpty: bool; + +orientation: Axis; + +elevation: double?; + +splashRadius: double?; + +enabled: bool; + +position: PopupMenuPosition + | + +Widget build(); + -Widget _buildPopupMenu() ] - [<abstract>ModelEvent]<:-[IsSaving] + [ActionPopUpMenuButton]o-[Color] + [ActionPopUpMenuButton]o-[Axis] + [ActionPopUpMenuButton]o-[PopupMenuPosition] - [IsSaved + [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 ] - [<abstract>ModelEvent]<:-[IsSaved] + [PrimaryButton]o-[IconData] + [PrimaryButton]o-[void Function()?] + [PrimaryButton]o-[dynamic Function()?] + [PrimaryButton]o-[EdgeInsets] + [PrimaryButton]o-[Size] - [IsDeleted + [Hyperlink + | + +text: String; + +url: String?; + +onClick: void Function()?; + +linkColor: Color; + +hoverColor: Color?; + +visitedColor: Color?; + +style: TextStyle?; + +hoverStyle: TextStyle?; + +visitedStyle: TextStyle?; + +icon: IconData?; + +iconSize: double? ] - [<abstract>ModelEvent]<:-[IsDeleted] + [Hyperlink]o-[void Function()?] + [Hyperlink]o-[Color] + [Hyperlink]o-[TextStyle] + [Hyperlink]o-[IconData] - [<abstract>SupabaseClientDependant + [DismissButton | - +supabaseClient: SupabaseClient + +onPressed: void Function()?; + +text: String? + | + +Widget build() ] - [<abstract>SupabaseClientDependant]o-[SupabaseClient] + [DismissButton]o-[void Function()?] - [SupabaseQueryError + [FormTableRow | - +statusCode: String?; - +message: String; - +details: dynamic + +label: String?; + +labelBuilder: Widget Function(BuildContext)?; + +labelStyle: TextStyle?; + +labelHelpText: String?; + +input: Widget; + +control: AbstractControl<dynamic>?; + +layout: FormTableRowLayout? ] - [Exception]<:--[SupabaseQueryError] + [FormTableRow]o-[Widget Function(BuildContext)?] + [FormTableRow]o-[TextStyle] + [FormTableRow]o-[<abstract>Widget] + [FormTableRow]o-[<abstract>AbstractControl] + [FormTableRow]o-[FormTableRowLayout] - [<abstract>SupabaseQueryMixin + [FormTableLayout | - +dynamic deleteAll(); - +dynamic getAll(); - +dynamic getById(); - +dynamic getByColumn(); - +List<T> deserializeList(); - +T deserializeObject() + +rows: List<FormTableRow>; + +columnWidths: Map<int, TableColumnWidth>; + +rowDivider: Widget?; + +rowLayout: FormTableRowLayout?; + +rowLabelStyle: TextStyle? + | + +Widget build() ] - [<abstract>IAppRepository + [FormTableLayout]o-[<abstract>Widget] + [FormTableLayout]o-[FormTableRowLayout] + [FormTableLayout]o-[TextStyle] + + [FormSectionHeader | - +dynamic fetchAppConfig(); - +void dispose() + +title: String; + +titleTextStyle: TextStyle?; + +helpText: String?; + +divider: bool; + +helpTextDisabled: bool + | + +Widget build() ] - [AppRepository + [FormSectionHeader]o-[TextStyle] + + [FormLabel | - +apiClient: StudyUApi + +labelText: String?; + +helpText: String?; + +labelTextStyle: TextStyle?; + +layout: FormTableRowLayout? | - +dynamic fetchAppConfig(); - +void dispose() + +Widget build() ] - [AppRepository]o-[<abstract>StudyUApi] - [<abstract>IAppRepository]<:--[AppRepository] + [FormLabel]o-[TextStyle] + [FormLabel]o-[FormTableRowLayout] - [WrappedModel + [FormTableRowLayout | - -_model: T; - +asyncValue: AsyncValue<T>; - +isLocalOnly: bool; - +isDirty: bool; - +isDeleted: bool; - +lastSaved: DateTime?; - +lastFetched: DateTime?; - +lastUpdated: DateTime?; - +model: T - | - +dynamic markWithError(); - +dynamic markAsLoading(); - +dynamic markAsFetched(); - +dynamic markAsSaved() + +index: int; + <static>+values: List<FormTableRowLayout>; + <static>+vertical: FormTableRowLayout; + <static>+horizontal: FormTableRowLayout ] - [WrappedModel]o-[<abstract>AsyncValue] + [FormTableRowLayout]o-[FormTableRowLayout] + [Enum]<:--[FormTableRowLayout] - [ModelRepositoryException + [ActionMenuType + | + +index: int; + <static>+values: List<ActionMenuType>; + <static>+inline: ActionMenuType; + <static>+popup: ActionMenuType ] - [Exception]<:--[ModelRepositoryException] + [ActionMenuType]o-[ActionMenuType] + [Enum]<:--[ActionMenuType] - [ModelNotFoundException + [ReactiveCustomColorPicker ] - [ModelRepositoryException]<:--[ModelNotFoundException] + [ReactiveFormField]<:-[ReactiveCustomColorPicker] - [<abstract>IModelRepository + [NavbarTab | - +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() + +title: String; + +intent: RoutingIntent?; + +index: int; + +enabled: bool ] - [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] + [NavbarTab]o-[RoutingIntent] - [<abstract>IModelRepositoryDelegate + [TabbedNavbar | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +T createNewInstance(); - +T createDuplicate(); - +dynamic onError() + +tabs: List<T>; + +selectedTab: T?; + +indicator: BoxDecoration?; + +height: double?; + +disabledBackgroundColor: Color?; + +disabledTooltipText: String?; + +onSelect: void Function(int, T)?; + +labelPadding: EdgeInsets?; + +labelSpacing: double?; + +indicatorSize: TabBarIndicatorSize?; + +isScrollable: bool; + +backgroundColor: Color?; + +labelColorHover: Color?; + +unselectedLabelColorHover: Color? ] - [<abstract>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>> + [TabbedNavbar]o-[BoxDecoration] + [TabbedNavbar]o-[Color] + [TabbedNavbar]o-[void Function(int, T)?] + [TabbedNavbar]o-[EdgeInsets] + [TabbedNavbar]o-[TabBarIndicatorSize] + + [Collapsible | - +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() + +contentBuilder: Widget Function(BuildContext, bool); + +headerBuilder: Widget Function(BuildContext, bool)?; + +title: String?; + +isCollapsed: bool ] - [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] - [<abstract>ModelRepository]o-[BehaviorSubject] - [<abstract>IModelRepository]<:-[<abstract>ModelRepository] + [Collapsible]o-[Widget Function(BuildContext, bool)] + [Collapsible]o-[Widget Function(BuildContext, bool)?] - [<abstract>IAuthRepository + [StudyULogo | - +allowPasswordReset: bool; - +currentUser: User?; - +isLoggedIn: bool; - +session: Session?; - +serializedSession: String? + +onTap: void Function()? | - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose() + +Widget build() ] - [<abstract>IAuthRepository]o-[User] - [<abstract>IAuthRepository]o-[Session] - [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] + [StudyULogo]o-[void Function()?] - [AuthRepository - | - +supabaseClient: SupabaseClient; - +sharedPreferences: SharedPreferences; - +allowPasswordReset: bool; - +authClient: GoTrueClient; - +session: Session?; - +serializedSession: String?; - +currentUser: User?; - +isLoggedIn: bool + [FormSideSheetTab | - -void _registerAuthListener(); - +dynamic signUp(); - +dynamic signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic updateUser(); - +void dispose(); - +dynamic onAppStart() + +formViewBuilder: Widget Function(T) ] - [AuthRepository]o-[SupabaseClient] - [AuthRepository]o-[SharedPreferences] - [AuthRepository]o-[GoTrueClient] - [AuthRepository]o-[Session] - [AuthRepository]o-[User] - [<abstract>IAuthRepository]<:--[AuthRepository] + [FormSideSheetTab]o-[Widget Function(T)] + [NavbarTab]<:-[FormSideSheetTab] - [<abstract>IInviteCodeRepository + [SidesheetTab | - +dynamic isCodeAlreadyUsed() + +builder: Widget Function(BuildContext) ] - [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] + [SidesheetTab]o-[Widget Function(BuildContext)] + [NavbarTab]<:-[SidesheetTab] - [InviteCodeRepository + [Sidesheet | - +studyId: String; - +ref: ProviderRef<dynamic>; - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +studyRepository: IStudyRepository; - +study: Study + <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 | - +String getKey(); - +dynamic isCodeAlreadyUsed(); - +List<ModelAction<dynamic>> availableActions(); - +dynamic emitUpdate() + +onTap: void Function()?; + +onHover: void Function(PointerHoverEvent)?; + +onEnter: void Function(PointerEnterEvent)?; + +onExit: void Function(PointerExitEvent)?; + +autoselectCursor: bool; + +cursor: SystemMouseCursor; + <static>+defaultCursor: SystemMouseCursor; + +autoCursor: SystemMouseCursor ] - [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] + [MouseEventsRegion]o-[void Function()?] + [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] + [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] + [MouseEventsRegion]o-[void Function(PointerExitEvent)?] + [MouseEventsRegion]o-[SystemMouseCursor] - [InviteCodeRepositoryDelegate + [FormControlLabel | - +study: Study; - +apiClient: StudyUApi; - +studyRepository: IStudyRepository + +formControl: AbstractControl<dynamic>; + +text: String; + +isClickable: bool; + +textStyle: TextStyle?; + +onClick: void Function(AbstractControl<dynamic>)? | - +dynamic fetch(); - +dynamic fetchAll(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +StudyInvite createDuplicate(); - +StudyInvite createNewInstance() + +Widget build() ] - [InviteCodeRepositoryDelegate]o-[Study] - [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] - [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] - [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] + [FormControlLabel]o-[<abstract>AbstractControl] + [FormControlLabel]o-[TextStyle] + [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] - [<abstract>IStudyRepository + [<abstract>IWithBanner | - +dynamic launch(); - +dynamic deleteParticipants() + +Widget? banner() ] - [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] - - [StudyRepository + [BannerBox | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: ProviderRef<dynamic>; - +sortCallback: void Function()? + +prefixIcon: Widget?; + +body: Widget; + +style: BannerStyle; + +padding: EdgeInsets?; + +noPrefix: bool; + +dismissable: bool; + +isDismissed: bool?; + +onDismissed: dynamic Function()?; + +dismissIconSize: double + ] + + [BannerBox]o-[<abstract>Widget] + [BannerBox]o-[BannerStyle] + [BannerBox]o-[EdgeInsets] + [BannerBox]o-[dynamic Function()?] + + [BannerStyle | - +String getKey(); - +dynamic deleteParticipants(); - +dynamic launch(); - +List<ModelAction<dynamic>> availableActions() + +index: int; + <static>+values: List<BannerStyle>; + <static>+warning: BannerStyle; + <static>+info: BannerStyle; + <static>+error: BannerStyle ] - [StudyRepository]o-[<abstract>StudyUApi] - [StudyRepository]o-[<abstract>IAuthRepository] - [StudyRepository]o-[<abstract>ProviderRef] - [StudyRepository]o-[void Function()?] - [<abstract>ModelRepository]<:-[StudyRepository] - [<abstract>IStudyRepository]<:--[StudyRepository] + [BannerStyle]o-[BannerStyle] + [Enum]<:--[BannerStyle] - [StudyRepositoryDelegate + [SecondaryButton | - +apiClient: StudyUApi; - +authRepository: IAuthRepository + +text: String; + +icon: IconData?; + +isLoading: bool; + +onPressed: void Function()? | - +dynamic fetchAll(); - +dynamic fetch(); - +dynamic save(); - +dynamic delete(); - +dynamic onError(); - +Study createNewInstance(); - +Study createDuplicate() + +Widget build() ] - [StudyRepositoryDelegate]o-[<abstract>StudyUApi] - [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] - [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] + [SecondaryButton]o-[IconData] + [SecondaryButton]o-[void Function()?] - [<abstract>StudyUApi + [IconPack | - +dynamic saveStudy(); - +dynamic fetchStudy(); - +dynamic getUserStudies(); - +dynamic deleteStudy(); - +dynamic saveStudyInvite(); - +dynamic fetchStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic deleteParticipants(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser() + <static>+defaultPack: List<IconOption>; + <static>+material: List<IconOption> + | + <static>+IconOption? resolveIconByName() ] - [APIException + [IconOption + | + +name: String; + +icon: IconData?; + +isEmpty: bool; + +props: List<Object?> + | + +String toJson(); + <static>+IconOption fromJson() ] - [Exception]<:--[APIException] + [IconOption]o-[IconData] + [<abstract>Equatable]<:-[IconOption] - [StudyNotFoundException + [ReactiveIconPicker ] - [APIException]<:-[StudyNotFoundException] + [ReactiveFocusableFormField]<:-[ReactiveIconPicker] - [MeasurementNotFoundException + [IconPicker + | + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +onSelect: void Function(IconOption)?; + +galleryIconSize: double?; + +selectedIconSize: double?; + +focusNode: FocusNode?; + +isDisabled: bool + | + +Widget build() ] - [APIException]<:-[MeasurementNotFoundException] + [IconPicker]o-[IconOption] + [IconPicker]o-[void Function(IconOption)?] + [IconPicker]o-[FocusNode] - [QuestionNotFoundException + [IconPickerField + | + +iconOptions: List<IconOption>; + +selectedOption: IconOption?; + +selectedIconSize: double?; + +galleryIconSize: double?; + +onSelect: void Function(IconOption)?; + +focusNode: FocusNode?; + +isDisabled: bool + | + +Widget build() ] - [APIException]<:-[QuestionNotFoundException] + [IconPickerField]o-[IconOption] + [IconPickerField]o-[void Function(IconOption)?] + [IconPickerField]o-[FocusNode] - [ConsentItemNotFoundException + [IconPickerGallery + | + +iconOptions: List<IconOption>; + +onSelect: void Function(IconOption)?; + +iconSize: double + | + +Widget build() ] - [APIException]<:-[ConsentItemNotFoundException] + [IconPickerGallery]o-[void Function(IconOption)?] - [InterventionNotFoundException + [SingleColumnLayout + | + <static>+defaultConstraints: BoxConstraints; + <static>+defaultConstraintsNarrow: BoxConstraints; + +body: Widget; + +header: Widget?; + +stickyHeader: bool; + +constraints: BoxConstraints?; + +scroll: bool; + +padding: EdgeInsets? + | + <static>+dynamic fromType() ] - [APIException]<:-[InterventionNotFoundException] + [SingleColumnLayout]o-[BoxConstraints] + [SingleColumnLayout]o-[<abstract>Widget] + [SingleColumnLayout]o-[EdgeInsets] - [InterventionTaskNotFoundException + [SingleColumnLayoutType + | + +index: int; + <static>+values: List<SingleColumnLayoutType>; + <static>+boundedWide: SingleColumnLayoutType; + <static>+boundedNarrow: SingleColumnLayoutType; + <static>+stretched: SingleColumnLayoutType; + <static>+split: SingleColumnLayoutType ] - [APIException]<:-[InterventionTaskNotFoundException] + [SingleColumnLayoutType]o-[SingleColumnLayoutType] + [Enum]<:--[SingleColumnLayoutType] - [ReportNotFoundException + [<abstract>FormConsumerWidget + | + +Widget build() ] - [APIException]<:-[ReportNotFoundException] - - [ReportSectionNotFoundException + [<abstract>FormConsumerRefWidget + | + +Widget build() ] - [APIException]<:-[ReportSectionNotFoundException] - - [StudyInviteNotFoundException + [FormScaffold + | + +formViewModel: T; + +actions: List<Widget>?; + +body: Widget; + +drawer: Widget?; + +actionsSpacing: double; + +actionsPadding: double ] - [APIException]<:-[StudyInviteNotFoundException] + [FormScaffold]o-[<abstract>Widget] - [UserNotFoundException + [StandardDialog + | + +title: Widget?; + +titleText: String?; + +body: Widget; + +actionButtons: List<Widget>; + +backgroundColor: Color?; + +borderRadius: double?; + +width: double?; + +height: double?; + +minWidth: double; + +minHeight: double; + +maxWidth: double?; + +maxHeight: double?; + +padding: EdgeInsets + | + +Widget build() ] - [APIException]<:-[UserNotFoundException] + [StandardDialog]o-[<abstract>Widget] + [StandardDialog]o-[Color] + [StandardDialog]o-[EdgeInsets] - [StudyUApiClient + [HtmlStylingBanner | - +supabaseClient: SupabaseClient; - <static>+studyColumns: List<String>; - <static>+studyWithParticipantActivityColumns: List<String>; - +testDelayMilliseconds: int + +isDismissed: bool; + +onDismissed: dynamic Function()? | - +dynamic deleteParticipants(); - +dynamic getUserStudies(); - +dynamic fetchStudy(); - +dynamic deleteStudy(); - +dynamic saveStudy(); - +dynamic fetchStudyInvite(); - +dynamic saveStudyInvite(); - +dynamic deleteStudyInvite(); - +dynamic fetchAppConfig(); - +dynamic fetchUser(); - +dynamic saveUser(); - -dynamic _awaitGuarded(); - -dynamic _apiException(); - -dynamic _testDelay() + +Widget build() ] - [StudyUApiClient]o-[SupabaseClient] - [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] - [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] - [<abstract>StudyUApi]<:--[StudyUApiClient] + [HtmlStylingBanner]o-[dynamic Function()?] - [StudyLaunched + [StandardTableColumn + | + +label: String; + +tooltip: String?; + +columnWidth: TableColumnWidth; + +sortable: bool; + +sortAscending: bool?; + +sortableIcon: Widget? ] - [<abstract>ModelEvent]<:-[StudyLaunched] + [StandardTableColumn]o-[<abstract>TableColumnWidth] + [StandardTableColumn]o-[<abstract>Widget] - [<abstract>IUserRepository - | - +user: StudyUUser + [StandardTable | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() - ] + +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 + ] - [<abstract>IUserRepository]o-[StudyUUser] + [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] - [UserRepository - | - +apiClient: StudyUApi; - +authRepository: IAuthRepository; - +ref: Ref<Object?>; - +user: StudyUUser + [StandardTableStyle | - +dynamic fetchUser(); - +dynamic saveUser(); - +dynamic updatePreferences() + +index: int; + <static>+values: List<StandardTableStyle>; + <static>+plain: StandardTableStyle; + <static>+material: StandardTableStyle ] - [UserRepository]o-[<abstract>StudyUApi] - [UserRepository]o-[<abstract>IAuthRepository] - [UserRepository]o-[<abstract>Ref] - [UserRepository]o-[StudyUUser] - [<abstract>IUserRepository]<:--[UserRepository] + [StandardTableStyle]o-[StandardTableStyle] + [Enum]<:--[StandardTableStyle] - [PreferenceAction + [TwoColumnLayout | - +index: int; - <static>+values: List<PreferenceAction>; - <static>+pin: PreferenceAction; - <static>+pinOff: PreferenceAction + <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 ] - [PreferenceAction]o-[PreferenceAction] - [Enum]<:--[PreferenceAction] + [TwoColumnLayout]o-[VerticalDivider] + [TwoColumnLayout]o-[EdgeInsets] + [TwoColumnLayout]o-[<abstract>Widget] + [TwoColumnLayout]o-[BoxConstraints] + [TwoColumnLayout]o-[Color] - [Config + [ActionMenuInline | - <static>+isDebugMode: bool; - <static>+defaultLocale: Set<String>; - <static>+supportedLocales: Map<String, String>; - <static>+newStudyId: String; - <static>+newModelId: String; - <static>+minSplashTime: int; - <static>+formAutosaveDebounce: int + +actions: List<ModelAction<dynamic>>; + +iconSize: double?; + +visible: bool; + +splashRadius: double?; + +paddingVertical: double?; + +paddingHorizontal: double? + | + +Widget build() ] - [SuppressedBehaviorSubject + [TextParagraph | - +subject: BehaviorSubject<T>; - +didSuppressInitialEvent: bool; - -_controller: StreamController<T> + +text: String?; + +style: TextStyle?; + +selectable: bool; + +span: List<TextSpan>? | - -StreamController<T> _buildDerivedController(); - +dynamic close() + +Widget build() ] - [SuppressedBehaviorSubject]o-[BehaviorSubject] - [SuppressedBehaviorSubject]o-[StreamController] + [TextParagraph]o-[TextStyle] - [<abstract>IProviderArgsResolver + [SplashPage | - +R provide() + +Widget build() ] - [CombinedStreamNotifier + [ErrorPage | - -_subscriptions: List<StreamSubscription<dynamic>> + +error: Exception? | - +void dispose() + +Widget build() ] - [ChangeNotifier]<:-[CombinedStreamNotifier] + [<abstract>ConsumerWidget]<:-[ErrorPage] - [Time + [Badge | - <static>+dynamic fromTimeOfDay(); - +Map<String, dynamic> toJson(); - <static>+Time fromJson() + +icon: IconData?; + +color: Color?; + +borderRadius: double; + +label: String; + +type: BadgeType; + +padding: EdgeInsets; + +iconSize: double?; + +labelStyle: TextStyle?; + +center: bool + | + +Widget build(); + -Color? _getBackgroundColor(); + -Color _getBorderColor(); + -Color? _getLabelColor() ] - [TimeOfDay]<:-[Time] + [Badge]o-[IconData] + [Badge]o-[Color] + [Badge]o-[BadgeType] + [Badge]o-[EdgeInsets] + [Badge]o-[TextStyle] - [TimeValueAccessor + [BadgeType | - +String modelToViewValue(); - +Time? viewToModelValue(); - -String _addLeadingZeroIfNeeded() + +index: int; + <static>+values: List<BadgeType>; + <static>+filled: BadgeType; + <static>+outlined: BadgeType; + <static>+outlineFill: BadgeType; + <static>+plain: BadgeType ] - [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] + [BadgeType]o-[BadgeType] + [Enum]<:--[BadgeType] - [Tuple + [IndicatorRangeSliderThumbShape | - +first: T1; - +second: T2; - +props: List<Object?> + +buildContext: BuildContext; + +start: T; + +end: T | - +Map<String, dynamic> toJson(); - <static>+Tuple<dynamic, dynamic> fromJson(); - +Tuple<T1, T2> copy(); - +Tuple<T1, T2> copyWith() + +Size getPreferredSize(); + +void paint() ] - [<abstract>Equatable]<:-[Tuple] + [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] + [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] - [OptimisticUpdate + [HelpIcon | - +applyOptimistic: void Function(); - +apply: dynamic Function(); - +rollback: void Function(); - +onUpdate: void Function()?; - +onError: void Function(Object, StackTrace?)?; - +rethrowErrors: bool; - +runOptimistically: bool; - +completeFutureOptimistically: bool + +tooltipText: String? | - +dynamic execute(); - -void _runUpdateHandlerIfAny() + +Widget build() ] - [OptimisticUpdate]o-[void Function()] - [OptimisticUpdate]o-[dynamic Function()] - [OptimisticUpdate]o-[void Function()?] - [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] - - [<abstract>JsonFileLoader + [UnderConstruction | - +jsonAssetsPath: String + +Widget build() + ] + + [NotificationDispatcher | - +dynamic loadJson(); - +dynamic parseJsonMapFromAssets(); - +dynamic parseJsonListFromAssets() + +child: Widget?; + +snackbarInnerPadding: double; + +snackbarWidth: double?; + +snackbarBehavior: SnackBarBehavior; + +snackbarDefaultDuration: int ] - [NumericalRangeFormatter + [NotificationDispatcher]o-[<abstract>Widget] + [NotificationDispatcher]o-[SnackBarBehavior] + + [<abstract>NotificationIntent | - +min: int?; - +max: int? + +message: String?; + +customContent: Widget?; + +icon: IconData?; + +actions: List<NotificationAction>?; + +type: NotificationType | - +TextEditingValue formatEditUpdate() + +void register() ] - [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] + [<abstract>NotificationIntent]o-[<abstract>Widget] + [<abstract>NotificationIntent]o-[IconData] + [<abstract>NotificationIntent]o-[NotificationType] - [StudySequenceFormatter + [NotificationAction | - +TextEditingValue formatEditUpdate() + +label: String; + +onSelect: dynamic Function(); + +isDestructive: bool ] - [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] + [NotificationAction]o-[dynamic Function()] - [CountWhereValidator - | - +predicate: bool Function(T?); - +minCount: int?; - +maxCount: int?; - <static>+kValidationMessageMinCount: String; - <static>+kValidationMessageMaxCount: String + [SnackbarIntent | - +Map<String, dynamic>? validate() + +duration: int? ] - [CountWhereValidator]o-[bool Function(T?)] - [<abstract>Validator]<:-[CountWhereValidator] + [<abstract>NotificationIntent]<:-[SnackbarIntent] - [Patterns + [AlertIntent | - <static>+timeFormatString: String; - <static>+emailFormatString: String; - <static>+url: String + +title: String; + +dismissOnAction: bool; + +isDestructive: dynamic ] - [ModelAction + [<abstract>NotificationIntent]<:-[AlertIntent] + + [NotificationType | - +type: T; - +label: String; - +icon: IconData?; - +onExecute: Function; - +isAvailable: bool; - +isDestructive: bool + +index: int; + <static>+values: List<NotificationType>; + <static>+snackbar: NotificationType; + <static>+alert: NotificationType; + <static>+custom: NotificationType ] - [ModelAction]o-[IconData] + [NotificationType]o-[NotificationType] + [Enum]<:--[NotificationType] - [<abstract>IModelActionProvider + [<abstract>INotificationService | - +List<ModelAction<dynamic>> availableActions() + +void showMessage(); + +void show(); + +Stream<NotificationIntent> watchNotifications(); + +void dispose() ] - [<abstract>IListActionProvider + [NotificationService | - +void onSelectItem(); - +void onNewItem() + -_streamController: BehaviorSubject<NotificationIntent> + | + +Stream<NotificationIntent> watchNotifications(); + +void showMessage(); + +void show(); + +void dispose() ] - [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] + [NotificationService]o-[BehaviorSubject] + [<abstract>INotificationService]<:--[NotificationService] - [ModelActionType + [Notifications | - +index: int; - <static>+values: List<ModelActionType>; - <static>+edit: ModelActionType; - <static>+delete: ModelActionType; - <static>+remove: ModelActionType; - <static>+duplicate: ModelActionType; - <static>+clipboard: ModelActionType; - <static>+primary: ModelActionType + <static>+credentialsInvalid: SnackbarIntent; + <static>+userAlreadyRegistered: SnackbarIntent; + <static>+passwordReset: SnackbarIntent; + <static>+passwordResetSuccess: SnackbarIntent; + <static>+studyDeleted: SnackbarIntent; + <static>+inviteCodeDeleted: SnackbarIntent; + <static>+inviteCodeClipped: SnackbarIntent; + <static>+studyDeleteConfirmation: AlertIntent ] - [ModelActionType]o-[ModelActionType] - [Enum]<:--[ModelActionType] + [Notifications]o-[SnackbarIntent] + [Notifications]o-[AlertIntent] - [<abstract>FileFormatEncoder + [NotificationDefaultActions | - +dynamic encodeAsync(); - +String encode(); - +dynamic call() + <static>+cancel: NotificationAction ] - [CSVStringEncoder + [NotificationDefaultActions]o-[NotificationAction] + + [<abstract>IClipboardService | - +String encode() + +dynamic copy() ] - [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] + [ClipboardService + | + +dynamic copy() + ] - [JsonStringEncoder + [<abstract>IClipboardService]<:--[ClipboardService] + + [Assets | - +String encode() + <static>+logoWide: String ] - [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] + [SignupForm + | + +formKey: AuthFormKey + | + +Widget build(); + -dynamic _onClickTermsOfUse(); + -dynamic _onClickPrivacyPolicy() + ] - [SerializableColor + [SignupForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[SignupForm] + + [AuthFormController | - +Map<String, dynamic> toJson(); - <static>+SerializableColor fromJson() + +authRepository: IAuthRepository; + +sharedPreferences: SharedPreferences; + +notificationService: INotificationService; + +router: GoRouter; + +emailControl: FormControl<String>; + +passwordControl: FormControl<String>; + +passwordConfirmationControl: FormControl<String>; + +rememberMeControl: FormControl<bool>; + +termsOfServiceControl: FormControl<bool>; + <static>+authValidationMessages: Map<String, String Function(dynamic)>; + +loginForm: FormGroup; + +signupForm: FormGroup; + +passwordForgotForm: FormGroup; + +passwordRecoveryForm: FormGroup; + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; + -_formKey: AuthFormKey; + +shouldRemember: bool; + +formKey: AuthFormKey; + +form: FormGroup + | + -dynamic _getFormFor(); + -dynamic _onChangeFormKey(); + +dynamic resetControlsFor(); + -dynamic _forceValidationMessages(); + +dynamic signUp(); + -dynamic _signUp(); + +dynamic signIn(); + -dynamic _signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic sendPasswordResetLink(); + +dynamic recoverPassword(); + +dynamic updateUser(); + -dynamic _readDebugUser(); + -void _setRememberMe(); + -void _delRememberMe(); + -void _initRememberMe() ] - [Color]<:-[SerializableColor] + [AuthFormController]o-[<abstract>IAuthRepository] + [AuthFormController]o-[SharedPreferences] + [AuthFormController]o-[<abstract>INotificationService] + [AuthFormController]o-[GoRouter] + [AuthFormController]o-[FormControl] + [AuthFormController]o-[FormGroup] + [AuthFormController]o-[AuthFormKey] + [<abstract>IFormGroupController]<:--[AuthFormController] - [<abstract>ExecutionLimiter + [AuthFormKey | - +milliseconds: int; - <static>-_timer: Timer? + +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] + + [PasswordForgotForm | - +void dispose() + +formKey: AuthFormKey + | + +Widget build() ] - [<abstract>ExecutionLimiter]o-[Timer] + [PasswordForgotForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] - [Debouncer + [EmailTextField | - +leading: bool; - +cancelUncompleted: bool; - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + +labelText: String; + +hintText: String?; + +formControlName: String?; + +formControl: FormControl<dynamic>? + ] + + [EmailTextField]o-[FormControl] + + [PasswordTextField | - +dynamic call() + +labelText: String; + +hintText: String?; + +onSubmitted: dynamic Function(FormControl<dynamic>)?; + +formControlName: String?; + +formControl: FormControl<dynamic>? ] - [Debouncer]o-[CancelableOperation] - [<abstract>ExecutionLimiter]<:-[Debouncer] + [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] + [PasswordTextField]o-[FormControl] - [Throttler + [PasswordRecoveryForm | - +dynamic call() + +formKey: AuthFormKey + | + +Widget build() ] - [<abstract>ExecutionLimiter]<:-[Throttler] + [PasswordRecoveryForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] - [AccountSettingsDialog + [AuthScaffold + | + +body: Widget; + +formKey: AuthFormKey; + +leftContentMinWidth: double; + +leftPanelMinWidth: double; + +leftPanelPadding: EdgeInsets + ] + + [AuthScaffold]o-[<abstract>Widget] + [AuthScaffold]o-[AuthFormKey] + [AuthScaffold]o-[EdgeInsets] + + [StudyUJobsToBeDone | +Widget build() ] - [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] + [LoginForm + | + +formKey: AuthFormKey + | + +Widget build() + ] + + [LoginForm]o-[AuthFormKey] + [<abstract>FormConsumerRefWidget]<:-[LoginForm] [<abstract>IAppDelegate | @@ -930,416 +1226,517 @@ [AppController]o-[SharedPreferences] - [StudiesFilter + [App + ] + + [AppContent + ] + + [AppStatus | +index: int; - <static>+values: List<StudiesFilter> + <static>+values: List<AppStatus>; + <static>+initializing: AppStatus; + <static>+initialized: AppStatus ] - [Enum]<:--[StudiesFilter] + [AppStatus]o-[AppStatus] + [Enum]<:--[AppStatus] - [StudiesTableItem + [StudyAnalyzeScreen | - +study: Study; - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +actions: List<ModelAction<dynamic>>; - +columnSizes: List<StudiesTableColumnSize>; - +isPinned: bool; - +onPinnedChanged: void Function(Study, bool)?; - +onTap: void Function(Study)? + +Widget? banner(); + +Widget build() ] - [StudiesTableItem]o-[Study] - [StudiesTableItem]o-[void Function(Study, bool)?] - [StudiesTableItem]o-[void Function(Study)?] + [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] - [StudiesTableColumnHeader + [StudyAnalyzeController | - +title: String; - +sortable: bool; - +sortAscending: bool; - +sortingActive: bool; - +onSort: void Function()? + +dynamic onExport() ] - [StudiesTableColumnHeader]o-[void Function()?] + [StudyBaseController]<:-[StudyAnalyzeController] - [DashboardScaffold + [StudyParticipationBadge | - <static>+compactWidthThreshold: double; - +body: Widget + +participation: Participation; + +type: BadgeType; + +showPrefixIcon: bool; + +center: bool | +Widget build() ] - [DashboardScaffold]o-[<abstract>Widget] + [StudyParticipationBadge]o-[Participation] + [StudyParticipationBadge]o-[BadgeType] - [DashboardScreen + [PreviewFrame | - +filter: StudiesFilter? + +studyId: String; + +routeArgs: StudyFormRouteArgs?; + +route: String? ] - [DashboardScreen]o-[StudiesFilter] + [PreviewFrame]o-[<abstract>StudyFormRouteArgs] - [StudiesTableColumnSize + [FrameControlsWidget | - +collapsed: bool; - +flex: int?; - +width: double? + +onRefresh: void Function()?; + +onOpenNewTab: void Function()?; + +enabled: bool | - +Widget createContainer() + +Widget build() ] - [StudiesTable - | - +itemHeight: double; - +itemPadding: double; - +rowSpacing: double; - +columnSpacing: double; - +compactWidthThreshold: double; - +superCompactWidthThreshold: double; - +compactStatTitleThreshold: double; - +studies: List<Study>; - +onSelect: void Function(Study); - +getActions: List<ModelAction<dynamic>> Function(Study); - +emptyWidget: Widget; - +pinnedStudies: Iterable<String>; - +dashboardController: DashboardController + [FrameControlsWidget]o-[void Function()?] + [<abstract>ConsumerWidget]<:-[FrameControlsWidget] + + [<abstract>IStudyNavViewModel | - +Widget build(); - -Widget _buildColumnHeader() + +isEditTabEnabled: bool; + +isTestTabEnabled: bool; + +isRecruitTabEnabled: bool; + +isMonitorTabEnabled: bool; + +isAnalyzeTabEnabled: bool; + +isSettingsEnabled: bool ] - [StudiesTable]o-[void Function(Study)] - [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] - [StudiesTable]o-[<abstract>Widget] - [StudiesTable]o-[DashboardController] - - [StudiesTableColumn + [StudyNav | - +index: int; - <static>+values: List<StudiesTableColumn>; - <static>+pin: StudiesTableColumn; - <static>+title: StudiesTableColumn; - <static>+status: StudiesTableColumn; - <static>+participation: StudiesTableColumn; - <static>+createdAt: StudiesTableColumn; - <static>+enrolled: StudiesTableColumn; - <static>+active: StudiesTableColumn; - <static>+completed: StudiesTableColumn; - <static>+action: StudiesTableColumn + <static>+dynamic tabs(); + <static>+dynamic edit(); + <static>+dynamic test(); + <static>+dynamic recruit(); + <static>+dynamic monitor(); + <static>+dynamic analyze() ] - [StudiesTableColumn]o-[StudiesTableColumn] - [Enum]<:--[StudiesTableColumn] + [StudyDesignNav + | + <static>+dynamic tabs(); + <static>+dynamic info(); + <static>+dynamic enrollment(); + <static>+dynamic interventions(); + <static>+dynamic measurements(); + <static>+dynamic reports() + ] - [DashboardController + [StudySettingsFormViewModel | + +study: AsyncValue<Study>; +studyRepository: IStudyRepository; - +authRepository: IAuthRepository; - +userRepository: IUserRepository; - +router: GoRouter; - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; - +searchController: SearchController; - +isSortAscending: bool + <static>+defaultPublishedToRegistry: bool; + <static>+defaultPublishedToRegistryResults: bool; + +isPublishedToRegistryControl: FormControl<bool>; + +isPublishedToRegistryResultsControl: FormControl<bool>; + +form: FormGroup; + +titles: Map<FormMode, String> | - -dynamic _subscribeStudies(); - +dynamic setSearchText(); - +dynamic setStudiesFilter(); - +dynamic onSelectStudy(); - +dynamic onClickNewStudy(); - +dynamic pinStudy(); - +dynamic pinOffStudy(); - +void setSorting(); - +void filterStudies(); - +void sortStudies(); - +bool isSortingActiveForColumn(); - +bool isPinned(); - +List<ModelAction<dynamic>> availableActions(); - +void dispose() + +void setControlsFrom(); + +Study buildFormData(); + +dynamic keepControlsSynced(); + +dynamic save(); + +dynamic setLaunchDefaults() ] - [DashboardController]o-[<abstract>IStudyRepository] - [DashboardController]o-[<abstract>IAuthRepository] - [DashboardController]o-[<abstract>IUserRepository] - [DashboardController]o-[GoRouter] - [DashboardController]o-[StreamSubscription] - [DashboardController]o-[SearchController] - [<abstract>IModelActionProvider]<:--[DashboardController] + [StudySettingsFormViewModel]o-[<abstract>AsyncValue] + [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] + [StudySettingsFormViewModel]o-[FormControl] + [StudySettingsFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] - [StudyMonitorScreen + [StudySettingsDialog | +Widget build() ] - [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + [<abstract>StudyPageWidget]<:-[StudySettingsDialog] - [App + [StudyTestScreen + | + +previewRoute: String? + | + +Widget build(); + +Widget? banner(); + +dynamic load(); + +dynamic save(); + +dynamic showHelp() ] - [AppContent - ] + [<abstract>StudyPageWidget]<:-[StudyTestScreen] - [StudyInvitesTable + [StudyBaseController | - +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) + +studyId: String; + +studyRepository: IStudyRepository; + +router: GoRouter; + +studySubscription: StreamSubscription<WrappedModel<Study>>? | - +Widget build(); - -List<Widget> _buildRow() + +dynamic subscribeStudy(); + +dynamic onStudySubscriptionUpdate(); + +dynamic onStudySubscriptionError(); + +void dispose() ] - [StudyInvitesTable]o-[void Function(StudyInvite)] - [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] - [StudyInvitesTable]o-[Intervention? Function(String)] - [StudyInvitesTable]o-[int Function(StudyInvite)] + [StudyBaseController]o-[<abstract>IStudyRepository] + [StudyBaseController]o-[GoRouter] + [StudyBaseController]o-[StreamSubscription] - [InviteCodeFormView - | - +formViewModel: InviteCodeFormViewModel + [StudyTestController | - +Widget build(); - -List<FormTableRow> _conditionalInterventionRows() + +authRepository: IAuthRepository; + +languageCode: String ] - [InviteCodeFormView]o-[InviteCodeFormViewModel] - [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] + [StudyTestController]o-[<abstract>IAuthRepository] + [StudyBaseController]<:-[StudyTestController] - [EnrolledBadge + [WebFrame | - +enrolledCount: int + +previewSrc: String; + +studyId: String | +Widget build() ] - [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>? + [DisabledFrame | - +void initControls(); - -dynamic _uniqueInviteCode(); - +void regenerateCode(); - -String _generateCode(); - +StudyInvite buildFormData(); - +void setControlsFrom(); - +dynamic save() + +Widget build() ] - [InviteCodeFormViewModel]o-[Study] - [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] - [InviteCodeFormViewModel]o-[FormControl] - [InviteCodeFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - - [StudyRecruitController + [PhoneContainer | - +inviteCodeRepository: IInviteCodeRepository; - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + <static>+defaultWidth: double; + <static>+defaultHeight: double; + +width: double; + +height: double; + +borderColor: Color; + +borderWidth: double; + +borderRadius: double; + +innerContent: Widget; + +innerContentBackgroundColor: Color? | - -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] + [PhoneContainer]o-[Color] + [PhoneContainer]o-[<abstract>Widget] - [StudyRecruitScreen + [MobileFrame | - +Widget build(); - -Widget _inviteCodesSectionHeader(); - -Widget _newInviteCodeButton(); - -dynamic _onSelectInvite() - ] - - [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - - [FormInvalidException + +Widget build() ] - [Exception]<:--[FormInvalidException] - - [FormConfigException + [DesktopFrame | - +message: String? + +Widget build() ] - [Exception]<:--[FormConfigException] - - [<abstract>IFormViewModelDelegate + [<abstract>IStudyAppBarViewModel | - +dynamic onSave(); - +void onCancel() + +isSyncIndicatorVisible: bool; + +isStatusBadgeVisible: bool; + +isPublishVisible: bool ] - [<abstract>IFormGroupController + [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] + [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + + [StudyScaffold | - +form: FormGroup + +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 ] - [<abstract>IFormGroupController]o-[FormGroup] + [StudyScaffold]o-[NavbarTab] + [StudyScaffold]o-[<abstract>StudyPageWidget] + [StudyScaffold]o-[<abstract>Widget] + [StudyScaffold]o-[SingleColumnLayoutType] - [FormControlOption + [RouteInformation | - +value: T; - +label: String; - +description: String?; - +props: List<Object?> + +route: String?; + +extra: String?; + +cmd: String?; + +data: String? + | + +String toString() ] - [<abstract>Equatable]<:-[FormControlOption] - - [<abstract>FormViewModel + [<abstract>PlatformController | - -_formData: T?; - -_formMode: FormMode; - -_validationSet: FormValidationSetEnum?; - +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>?; - +autosave: bool; - -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>>; - -_immediateFormChildrenListenerDebouncer: Debouncer?; - -_autosaveOperation: CancelableOperation<dynamic>?; - -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>>; - +prevFormValue: Map<String, dynamic>?; - <static>-_formKey: String; - +formData: T?; - +formMode: FormMode; - +isReadonly: bool; - +validationSet: FormValidationSetEnum?; - +isDirty: bool; - +title: String; - +isValid: bool; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +studyId: String; + +baseSrc: String; + +previewSrc: String; + +routeInformation: RouteInformation; + +frameWidget: Widget | - -dynamic _setFormData(); - -dynamic _rememberDefaultControlValidators(); - -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators(); - -dynamic _disableAllControls(); - -dynamic _formModeUpdated(); - -dynamic _restoreControlsFromFormData(); - +void revalidate(); - -void _applyValidationSet(); - +void read(); - +dynamic save(); - +dynamic cancel(); - +void enableAutosave(); - +void listenToImmediateFormChildren(); - +dynamic markFormGroupChanged(); - +void dispose(); - +void setControlsFrom(); - +T buildFormData(); - +void initControls() + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void listen(); + +void send(); + +void openNewPage() ] - [<abstract>FormViewModel]o-[FormMode] - [<abstract>FormViewModel]o-[<abstract>FormValidationSetEnum] - [<abstract>FormViewModel]o-[<abstract>IFormViewModelDelegate] - [<abstract>FormViewModel]o-[Debouncer] - [<abstract>FormViewModel]o-[CancelableOperation] - [<abstract>IFormGroupController]<:--[<abstract>FormViewModel] + [<abstract>PlatformController]o-[RouteInformation] + [<abstract>PlatformController]o-[<abstract>Widget] - [FormMode + [WebController | - +index: int; - <static>+values: List<FormMode>; - <static>+create: FormMode; - <static>+readonly: FormMode; - <static>+edit: FormMode + +iFrameElement: IFrameElement + | + +void activate(); + +void registerViews(); + +void generateUrl(); + +void navigate(); + +void refresh(); + +void openNewPage(); + +void listen(); + +void send() ] - [FormMode]o-[FormMode] - [Enum]<:--[FormMode] + [WebController]o-[IFrameElement] + [<abstract>PlatformController]<:-[WebController] - [<abstract>ManagedFormViewModel + [MobileController | - +ManagedFormViewModel<T> createDuplicate() + +void openNewPage(); + +void refresh(); + +void registerViews(); + +void listen(); + +void send(); + +void navigate(); + +void activate(); + +void generateUrl() ] - [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] + [<abstract>PlatformController]<:-[MobileController] - [FormViewModelNotFoundException + [<abstract>IStudyStatusBadgeViewModel + | + +studyParticipation: Participation?; + +studyStatus: StudyStatus? ] - [Exception]<:--[FormViewModelNotFoundException] + [<abstract>IStudyStatusBadgeViewModel]o-[Participation] + [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] - [FormViewModelCollection + [StudyStatusBadge | - +formViewModels: List<T>; - +formArray: FormArray<dynamic>; - +stagedViewModels: List<T>; - +retrievableViewModels: List<T>; - +formData: List<D> + +participation: Participation?; + +status: StudyStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | - +void add(); - +T remove(); - +T? findWhere(); - +T? removeWhere(); - +bool contains(); - +void stage(); - +T commit(); - +void reset(); - +void read() + +Widget build() ] - [FormViewModelCollection]o-[FormArray] + [StudyStatusBadge]o-[Participation] + [StudyStatusBadge]o-[StudyStatus] + [StudyStatusBadge]o-[BadgeType] - [<abstract>FormValidationSetEnum + [TestAppRoutes + | + <static>+studyOverview: String; + <static>+eligibility: String; + <static>+intervention: String; + <static>+consent: String; + <static>+journey: String; + <static>+dashboard: String ] - [FormControlValidation + [<abstract>StudyPageWidget | - +control: AbstractControl<dynamic>; - +validators: List<Validator<dynamic>>; - +asyncValidators: List<AsyncValidator<dynamic>>?; - +validationMessages: Map<String, String Function(Object)> + +studyId: String | - +FormControlValidation merge() + +Widget? banner() ] - [FormControlValidation]o-[<abstract>AbstractControl] + [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] + [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - [CustomFormControl + [StudyController | - -_onValueChangedDebouncer: Debouncer?; - -_onStatusChangedDebouncer: Debouncer?; - +onValueChanged: void Function(T?)?; - +onStatusChanged: void Function(ControlStatus)?; - +onStatusChangedDebounceTime: int?; - +onValueChangedDebounceTime: int? + +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() ] - [CustomFormControl]o-[Debouncer] - [CustomFormControl]o-[void Function(T?)?] - [CustomFormControl]o-[void Function(ControlStatus)?] - [FormControl]<:-[CustomFormControl] + [StudyController]o-[<abstract>INotificationService] + [StudyController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyController] + + [StudyMonitorScreen + | + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[StudyMonitorScreen] + + [StudiesTableColumnHeader + | + +title: String; + +sortable: bool; + +sortAscending: bool; + +sortingActive: bool; + +onSort: void Function()? + ] + + [StudiesTableColumnHeader]o-[void Function()?] + + [DashboardScaffold + | + <static>+compactWidthThreshold: double; + +body: Widget + | + +Widget build() + ] + + [DashboardScaffold]o-[<abstract>Widget] + + [StudiesTableColumnSize + | + +collapsed: bool; + +flex: int?; + +width: double? + | + +Widget createContainer() + ] + + [StudiesTable + | + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +compactWidthThreshold: double; + +superCompactWidthThreshold: double; + +compactStatTitleThreshold: double; + +studies: List<Study>; + +onSelect: void Function(Study); + +getActions: List<ModelAction<dynamic>> Function(Study); + +emptyWidget: Widget; + +pinnedStudies: Iterable<String>; + +dashboardController: DashboardController + | + +Widget build(); + -Widget _buildColumnHeader() + ] + + [StudiesTable]o-[void Function(Study)] + [StudiesTable]o-[List<ModelAction<dynamic>> Function(Study)] + [StudiesTable]o-[<abstract>Widget] + [StudiesTable]o-[DashboardController] + + [StudiesTableColumn + | + +index: int; + <static>+values: List<StudiesTableColumn>; + <static>+pin: StudiesTableColumn; + <static>+title: StudiesTableColumn; + <static>+status: StudiesTableColumn; + <static>+participation: StudiesTableColumn; + <static>+createdAt: StudiesTableColumn; + <static>+enrolled: StudiesTableColumn; + <static>+active: StudiesTableColumn; + <static>+completed: StudiesTableColumn; + <static>+action: StudiesTableColumn + ] + + [StudiesTableColumn]o-[StudiesTableColumn] + [Enum]<:--[StudiesTableColumn] + + [DashboardScreen + | + +filter: StudiesFilter? + ] + + [DashboardScreen]o-[StudiesFilter] + + [DashboardController + | + +studyRepository: IStudyRepository; + +authRepository: IAuthRepository; + +userRepository: IUserRepository; + +router: GoRouter; + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>?; + +searchController: SearchController; + +isSortAscending: bool + | + -dynamic _subscribeStudies(); + +dynamic setSearchText(); + +dynamic setStudiesFilter(); + +dynamic onSelectStudy(); + +dynamic onClickNewStudy(); + +dynamic pinStudy(); + +dynamic pinOffStudy(); + +void setSorting(); + +void filterStudies(); + +void sortStudies(); + +bool isSortingActiveForColumn(); + +bool isPinned(); + +List<ModelAction<dynamic>> availableActions(); + +void dispose() + ] + + [DashboardController]o-[<abstract>IStudyRepository] + [DashboardController]o-[<abstract>IAuthRepository] + [DashboardController]o-[<abstract>IUserRepository] + [DashboardController]o-[GoRouter] + [DashboardController]o-[StreamSubscription] + [DashboardController]o-[SearchController] + [<abstract>IModelActionProvider]<:--[DashboardController] + + [StudiesTableItem + | + +study: Study; + +itemHeight: double; + +itemPadding: double; + +rowSpacing: double; + +columnSpacing: double; + +actions: List<ModelAction<dynamic>>; + +columnSizes: List<StudiesTableColumnSize>; + +isPinned: bool; + +onPinnedChanged: void Function(Study, bool)?; + +onTap: void Function(Study)? + ] + + [StudiesTableItem]o-[Study] + [StudiesTableItem]o-[void Function(Study, bool)?] + [StudiesTableItem]o-[void Function(Study)?] + + [StudiesFilter + | + +index: int; + <static>+values: List<StudiesFilter> + ] + + [Enum]<:--[StudiesFilter] [FormArrayTable | @@ -1378,326 +1775,360 @@ [FormArrayTable]o-[<abstract>Widget] [FormArrayTable]o-[EdgeInsets] - [UnsavedChangesDialog - | - +Widget build() - ] - - [<abstract>IFormData + [CustomFormControl | - +id: String + -_onValueChangedDebouncer: Debouncer?; + -_onStatusChangedDebouncer: Debouncer?; + +onValueChanged: void Function(T?)?; + +onStatusChanged: void Function(ControlStatus)?; + +onStatusChangedDebounceTime: int?; + +onValueChangedDebounceTime: int? | - +IFormData copy() + +void dispose() ] - [PasswordRecoveryForm - | - +formKey: AuthFormKey - | - +Widget build() + [CustomFormControl]o-[Debouncer] + [CustomFormControl]o-[void Function(T?)?] + [CustomFormControl]o-[void Function(ControlStatus)?] + [FormControl]<:-[CustomFormControl] + + [FormInvalidException ] - [PasswordRecoveryForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordRecoveryForm] + [Exception]<:--[FormInvalidException] - [SignupForm - | - +formKey: AuthFormKey + [FormConfigException | - +Widget build(); - -dynamic _onClickTermsOfUse(); - -dynamic _onClickPrivacyPolicy() + +message: String? ] - [SignupForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[SignupForm] + [Exception]<:--[FormConfigException] - [StudyUJobsToBeDone + [<abstract>IFormViewModelDelegate | - +Widget build() + +dynamic onSave(); + +void onCancel() ] - [EmailTextField + [<abstract>IFormGroupController | - +labelText: String; - +hintText: String?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +form: FormGroup ] - [EmailTextField]o-[FormControl] + [<abstract>IFormGroupController]o-[FormGroup] - [PasswordTextField + [FormControlOption | - +labelText: String; - +hintText: String?; - +onSubmitted: dynamic Function(FormControl<dynamic>)?; - +formControlName: String?; - +formControl: FormControl<dynamic>? + +value: T; + +label: String; + +description: String?; + +props: List<Object?> ] - [PasswordTextField]o-[dynamic Function(FormControl<dynamic>)?] - [PasswordTextField]o-[FormControl] + [<abstract>Equatable]<:-[FormControlOption] - [AuthFormController - | - +authRepository: IAuthRepository; - +sharedPreferences: SharedPreferences; - +notificationService: INotificationService; - +router: GoRouter; - +emailControl: FormControl<String>; - +passwordControl: FormControl<String>; - +passwordConfirmationControl: FormControl<String>; - +rememberMeControl: FormControl<bool>; - +termsOfServiceControl: FormControl<bool>; - <static>+authValidationMessages: Map<String, String Function(dynamic)>; - +loginForm: FormGroup; - +signupForm: FormGroup; - +passwordForgotForm: FormGroup; - +passwordRecoveryForm: FormGroup; - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>>; - -_formKey: AuthFormKey; - +shouldRemember: bool; - +formKey: AuthFormKey; - +form: FormGroup + [<abstract>FormViewModel | - -dynamic _getFormFor(); - -dynamic _onChangeFormKey(); - +dynamic resetControlsFor(); - -dynamic _forceValidationMessages(); - +dynamic signUp(); - -dynamic _signUp(); - +dynamic signIn(); - -dynamic _signInWith(); - +dynamic signOut(); - +dynamic resetPasswordForEmail(); - +dynamic sendPasswordResetLink(); - +dynamic recoverPassword(); - +dynamic updateUser(); - -dynamic _readDebugUser(); - -void _setRememberMe(); - -void _delRememberMe(); - -void _initRememberMe() + -_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() ] - [AuthFormController]o-[<abstract>IAuthRepository] - [AuthFormController]o-[SharedPreferences] - [AuthFormController]o-[<abstract>INotificationService] - [AuthFormController]o-[GoRouter] - [AuthFormController]o-[FormControl] - [AuthFormController]o-[FormGroup] - [AuthFormController]o-[AuthFormKey] - [<abstract>IFormGroupController]<:--[AuthFormController] + [<abstract>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] - [AuthFormKey + [FormMode | +index: int; - <static>+values: List<AuthFormKey>; - <static>+login: AuthFormKey; - <static>+signup: AuthFormKey; - <static>+passwordForgot: AuthFormKey; - <static>+passwordRecovery: AuthFormKey; - <static>-_loginSubmit: AuthFormKey; - <static>-_signupSubmit: AuthFormKey + <static>+values: List<FormMode>; + <static>+create: FormMode; + <static>+readonly: FormMode; + <static>+edit: FormMode ] - [AuthFormKey]o-[AuthFormKey] - [Enum]<:--[AuthFormKey] + [FormMode]o-[FormMode] + [Enum]<:--[FormMode] - [PasswordForgotForm + [<abstract>IFormData | - +formKey: AuthFormKey + +id: String + | + +IFormData copy() + ] + + [UnsavedChangesDialog | +Widget build() ] - [PasswordForgotForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[PasswordForgotForm] + [<abstract>FormValidationSetEnum + ] - [AuthScaffold + [FormControlValidation | - +body: Widget; - +formKey: AuthFormKey; - +leftContentMinWidth: double; - +leftPanelMinWidth: double; - +leftPanelPadding: EdgeInsets + +control: AbstractControl<dynamic>; + +validators: List<Validator<dynamic>>; + +asyncValidators: List<AsyncValidator<dynamic>>?; + +validationMessages: Map<String, String Function(Object)> + | + +FormControlValidation merge() ] - [AuthScaffold]o-[<abstract>Widget] - [AuthScaffold]o-[AuthFormKey] - [AuthScaffold]o-[EdgeInsets] + [FormControlValidation]o-[<abstract>AbstractControl] - [LoginForm - | - +formKey: AuthFormKey + [<abstract>ManagedFormViewModel | - +Widget build() + +ManagedFormViewModel<T> createDuplicate() ] - [LoginForm]o-[AuthFormKey] - [<abstract>FormConsumerRefWidget]<:-[LoginForm] + [<abstract>FormViewModel]<:-[<abstract>ManagedFormViewModel] - [AppStatus + [FormViewModelNotFoundException + ] + + [Exception]<:--[FormViewModelNotFoundException] + + [FormViewModelCollection | - +index: int; - <static>+values: List<AppStatus>; - <static>+initializing: AppStatus; - <static>+initialized: AppStatus + +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() ] - [AppStatus]o-[AppStatus] - [Enum]<:--[AppStatus] + [FormViewModelCollection]o-[FormArray] - [StudyInfoFormData + [DrawerEntry | + +localizedTitle: String Function(); + +icon: IconData?; + +localizedHelpText: String Function()?; + +enabled: bool; + +onSelected: void Function(BuildContext, WidgetRef)?; + +autoCloseDrawer: bool; +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String + +helpText: String? | - +Study apply(); - +StudyInfoFormData copy() + +void onClick() ] - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] + [DrawerEntry]o-[String Function()] + [DrawerEntry]o-[IconData] + [DrawerEntry]o-[String Function()?] + [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] - [StudyContactInfoFormData + [GoRouterDrawerEntry | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String + +intent: RoutingIntent; + +onNavigated: void Function()? | - +Study apply(); - +StudyInfoFormData copy() + +void onClick() ] - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] + [GoRouterDrawerEntry]o-[RoutingIntent] + [GoRouterDrawerEntry]o-[void Function()?] + [DrawerEntry]<:-[GoRouterDrawerEntry] - [StudyDesignInfoFormView + [AppDrawer | - +Widget build() + +width: int; + +autoCloseDrawer: bool; + +leftPaddingEntries: double; + +logoPaddingVertical: double; + +logoPaddingHorizontal: double; + +logoMaxHeight: double; + +logoSectionMinHeight: double; + +logoSectionMaxHeight: double ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] + [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() + ] - [StudyInfoFormViewModel + [StudyInvitesTable]o-[void Function(StudyInvite)] + [StudyInvitesTable]o-[List<ModelAction<dynamic>> Function(StudyInvite)] + [StudyInvitesTable]o-[Intervention? Function(String)] + [StudyInvitesTable]o-[int Function(StudyInvite)] + + [InviteCodeFormView | - +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: InviteCodeFormViewModel | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() + +Widget build(); + -List<FormTableRow> _conditionalInterventionRows() ] - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] + [InviteCodeFormView]o-[InviteCodeFormViewModel] + [<abstract>FormConsumerWidget]<:-[InviteCodeFormView] - [<abstract>WithScheduleControls + [InviteCodeFormViewModel | - +isTimeRestrictedControl: FormControl<bool>; - +instanceID: FormControl<String>; - +restrictedTimeStartControl: FormControl<Time>; - +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; - +restrictedTimeEndControl: FormControl<Time>; - +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; - +hasReminderControl: FormControl<bool>; - +reminderTimeControl: FormControl<Time>; - +reminderTimePickerControl: FormControl<TimeOfDay>; - -_reminderControlStream: StreamSubscription<dynamic>?; - +scheduleFormControls: Map<String, FormControl<Object>>; - +hasReminder: bool; - +isTimeRestricted: bool; - +timeRestriction: List<Time>? + +study: Study; + +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 setScheduleControlsFrom(); - -dynamic _initReminderControl() + +void initControls(); + -dynamic _uniqueInviteCode(); + +void regenerateCode(); + -String _generateCode(); + +StudyInvite buildFormData(); + +void setControlsFrom(); + +dynamic save() ] - [<abstract>WithScheduleControls]o-[FormControl] - [<abstract>WithScheduleControls]o-[StreamSubscription] + [InviteCodeFormViewModel]o-[Study] + [InviteCodeFormViewModel]o-[<abstract>IInviteCodeRepository] + [InviteCodeFormViewModel]o-[FormControl] + [InviteCodeFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[InviteCodeFormViewModel] - [<abstract>IFormDataWithSchedule + [StudyRecruitController | - +instanceId: String; - +isTimeLocked: bool; - +timeLockStart: StudyUTimeOfDay?; - +timeLockEnd: StudyUTimeOfDay?; - +hasReminder: bool; - +reminderTime: StudyUTimeOfDay? + +inviteCodeRepository: IInviteCodeRepository; + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? | - +Schedule toSchedule() + -dynamic _subscribeInvites(); + +Intervention? getIntervention(); + +int getParticipantCountForInvite(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void dispose() ] - [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] - [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + [StudyRecruitController]o-[<abstract>IInviteCodeRepository] + [StudyRecruitController]o-[StreamSubscription] + [StudyBaseController]<:-[StudyRecruitController] + [<abstract>IModelActionProvider]<:--[StudyRecruitController] - [ScheduleControls - | - +formViewModel: WithScheduleControls + [StudyRecruitScreen | +Widget build(); - -List<FormTableRow> _conditionalTimeRestrictions() + -Widget _inviteCodesSectionHeader(); + -Widget _newInviteCodeButton(); + -dynamic _onSelectInvite() ] - [ScheduleControls]o-[<abstract>WithScheduleControls] - [<abstract>FormConsumerWidget]<:-[ScheduleControls] + [<abstract>StudyPageWidget]<:-[StudyRecruitScreen] - [<abstract>WithQuestionnaireControls + [EnrolledBadge | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + +enrolledCount: int | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +Widget build() ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [PublishConfirmationDialog + | + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] + + [PublishSuccessDialog + | + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + + [PublishDialog + | + +Widget build() + ] + + [<abstract>StudyPageWidget]<:-[PublishDialog] + + [StudyFormScaffold + | + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) + | + +Widget build() + ] + + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + + [StudyFormValidationSet + | + +index: int; + <static>+values: List<StudyFormValidationSet> + ] + + [Enum]<:--[StudyFormValidationSet] [<abstract>QuestionFormData | @@ -1784,6 +2215,72 @@ [FreeTextQuestionFormData]o-[FreeTextQuestionType] [<abstract>QuestionFormData]<:-[FreeTextQuestionFormData] + [SurveyQuestionFormView + | + +formViewModel: QuestionFormViewModel; + +isHtmlStyleable: bool + ] + + [SurveyQuestionFormView]o-[QuestionFormViewModel] + + [SurveyQuestionType + | + +index: int; + <static>+values: List<SurveyQuestionType>; + <static>+choice: SurveyQuestionType; + <static>+bool: SurveyQuestionType; + <static>+scale: SurveyQuestionType; + <static>+freeText: SurveyQuestionType + ] + + [SurveyQuestionType]o-[SurveyQuestionType] + [Enum]<:--[SurveyQuestionType] + + [<abstract>IScaleQuestionFormViewModel + | + +isMidValuesClearedInfoVisible: bool + ] + + [ScaleQuestionFormView + | + +formViewModel: QuestionFormViewModel + ] + + [ScaleQuestionFormView]o-[QuestionFormViewModel] + + [ChoiceQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [ChoiceQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + + [BoolQuestionFormView + | + +formViewModel: QuestionFormViewModel + | + +Widget build() + ] + + [BoolQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + + [FreeTextQuestionFormView + | + +formViewModel: QuestionFormViewModel; + +generateLabelHelpTextMap: dynamic + | + +Widget build(); + +Widget disableOnReadonly(); + +Widget generateRow() + ] + + [FreeTextQuestionFormView]o-[QuestionFormViewModel] + [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [QuestionFormViewModel | <static>+defaultQuestionType: SurveyQuestionType; @@ -1874,141 +2371,190 @@ [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [SurveyQuestionFormView + [<abstract>WithQuestionnaireControls | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool - ] - - [SurveyQuestionFormView]o-[QuestionFormViewModel] - - [SurveyQuestionType + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+freeText: SurveyQuestionType + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [FreeTextQuestionFormView + [QuestionnaireFormData | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic + +questionsData: List<QuestionFormData>?; + +id: String | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [<abstract>IScaleQuestionFormViewModel + [<abstract>IFormDataWithSchedule | - +isMidValuesClearedInfoVisible: bool + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? + | + +Schedule toSchedule() ] - [ScaleQuestionFormView + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] + + [ScheduleControls | - +formViewModel: QuestionFormViewModel + +formViewModel: WithScheduleControls + | + +Widget build(); + -List<FormTableRow> _conditionalTimeRestrictions() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [ScheduleControls]o-[<abstract>WithScheduleControls] + [<abstract>FormConsumerWidget]<:-[ScheduleControls] - [ChoiceQuestionFormView + [<abstract>WithScheduleControls | - +formViewModel: QuestionFormViewModel + +isTimeRestrictedControl: FormControl<bool>; + +instanceID: FormControl<String>; + +restrictedTimeStartControl: FormControl<Time>; + +restrictedTimeStartPickerControl: FormControl<TimeOfDay>; + +restrictedTimeEndControl: FormControl<Time>; + +restrictedTimeEndPickerControl: FormControl<TimeOfDay>; + +hasReminderControl: FormControl<bool>; + +reminderTimeControl: FormControl<Time>; + +reminderTimePickerControl: FormControl<TimeOfDay>; + -_reminderControlStream: StreamSubscription<dynamic>?; + +scheduleFormControls: Map<String, FormControl<Object>>; + +hasReminder: bool; + +isTimeRestricted: bool; + +timeRestriction: List<Time>? | - +Widget build() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - [BoolQuestionFormView + [InterventionFormViewModel | - +formViewModel: QuestionFormViewModel + +study: Study; + +interventionIdControl: FormControl<String>; + +interventionTitleControl: FormControl<String>; + +interventionIconControl: FormControl<IconOption>; + +interventionDescriptionControl: FormControl<String>; + +interventionTasksArray: FormArray<dynamic>; + +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; + +form: FormGroup; + +interventionId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +atLeastOneTask: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - +Widget build() + +void setControlsFrom(); + +InterventionFormData buildFormData(); + +List<ModelAction<dynamic>> availableActions(); + +List<ModelAction<dynamic>> availablePopupActions(); + +List<ModelAction<dynamic>> availableInlineActions(); + +void onSelectItem(); + +void onNewItem(); + +void onCancel(); + +dynamic onSave(); + +InterventionTaskFormViewModel provide(); + +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); + +InterventionTaskFormRouteArgs buildFormRouteArgs(); + +InterventionFormViewModel createDuplicate() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [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] - [QuestionnaireFormData + [StudyScheduleFormData | - +questionsData: List<QuestionFormData>?; + +sequenceType: PhaseSequence; + +sequenceTypeCustom: String; + +numCycles: int; + +phaseDuration: int; + +includeBaseline: bool; +id: String | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +StudySchedule toStudySchedule(); + +Study apply(); + +StudyScheduleFormData copy() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [StudyScheduleFormData]o-[PhaseSequence] + [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [StudyFormScaffold + [StudyScheduleFormView | - +studyId: String; - +formViewModelBuilder: T Function(WidgetRef); - +formViewBuilder: Widget Function(T) + +formViewModel: StudyScheduleControls | + -FormTableRow _renderCustomSequence(); +Widget build() ] - [StudyFormScaffold]o-[T Function(WidgetRef)] - [StudyFormScaffold]o-[Widget Function(T)] - [<abstract>ConsumerWidget]<:-[StudyFormScaffold] + [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] + [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] - [<abstract>IStudyFormData + [InterventionTaskFormView | - +Study apply() + +formViewModel: InterventionTaskFormViewModel ] - [<abstract>IFormData]<:--[<abstract>IStudyFormData] + [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - [StudyFormViewModel + [InterventionPreview | - +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> + +routeArgs: InterventionFormRouteArgs | - +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] + [InterventionPreview]o-[InterventionFormRouteArgs] + [<abstract>ConsumerWidget]<:-[InterventionPreview] + + [InterventionsFormData + | + +interventionsData: List<InterventionFormData>; + +studyScheduleData: StudyScheduleFormData; + +id: String + | + +Study apply(); + +InterventionsFormData copy() + ] + + [InterventionsFormData]o-[StudyScheduleFormData] + [<abstract>IStudyFormData]<:--[InterventionsFormData] [InterventionTaskFormData | @@ -2024,23 +2570,6 @@ [<abstract>IFormDataWithSchedule]<:-[InterventionTaskFormData] - [StudyScheduleFormData - | - +sequenceType: PhaseSequence; - +sequenceTypeCustom: String; - +numCycles: int; - +phaseDuration: int; - +includeBaseline: bool; - +id: String - | - +StudySchedule toStudySchedule(); - +Study apply(); - +StudyScheduleFormData copy() - ] - - [StudyScheduleFormData]o-[PhaseSequence] - [<abstract>IStudyFormData]<:--[StudyScheduleFormData] - [InterventionFormView | +formViewModel: InterventionFormViewModel @@ -2048,35 +2577,36 @@ [InterventionFormView]o-[InterventionFormViewModel] - [<abstract>StudyScheduleControls + [InterventionTaskFormViewModel | - <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 + +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 setStudyScheduleControlsFrom(); - +StudyScheduleFormData buildStudyScheduleFormData(); - +bool isSequencingCustom() + +void setControlsFrom(); + +InterventionTaskFormData buildFormData(); + +InterventionTaskFormViewModel createDuplicate() ] - [<abstract>StudyScheduleControls]o-[PhaseSequence] - [<abstract>StudyScheduleControls]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormControl] + [InterventionTaskFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] + [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + + [StudyDesignInterventionsFormView + | + +Widget build() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] [InterventionsFormViewModel | @@ -2115,226 +2645,232 @@ [<abstract>IListActionProvider]<:--[InterventionsFormViewModel] [<abstract>IProviderArgsResolver]<:--[InterventionsFormViewModel] - [InterventionFormViewModel + [InterventionFormData | - +study: Study; - +interventionIdControl: FormControl<String>; - +interventionTitleControl: FormControl<String>; - +interventionIconControl: FormControl<IconOption>; - +interventionDescriptionControl: FormControl<String>; - +interventionTasksArray: FormArray<dynamic>; - +tasksCollection: FormViewModelCollection<InterventionTaskFormViewModel, InterventionTaskFormData>; - +form: FormGroup; +interventionId: String; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneTask: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +InterventionFormData buildFormData(); - +List<ModelAction<dynamic>> availableActions(); - +List<ModelAction<dynamic>> availablePopupActions(); - +List<ModelAction<dynamic>> availableInlineActions(); - +void onSelectItem(); - +void onNewItem(); - +void onCancel(); - +dynamic onSave(); - +InterventionTaskFormViewModel provide(); - +InterventionTaskFormRouteArgs buildNewFormRouteArgs(); - +InterventionTaskFormRouteArgs buildFormRouteArgs(); - +InterventionFormViewModel createDuplicate() - ] - - [InterventionFormViewModel]o-[Study] - [InterventionFormViewModel]o-[FormControl] - [InterventionFormViewModel]o-[FormArray] - [InterventionFormViewModel]o-[FormViewModelCollection] - [InterventionFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[InterventionFormViewModel] - [<abstract>IListActionProvider]<:--[InterventionFormViewModel] - [<abstract>IProviderArgsResolver]<:--[InterventionFormViewModel] - - [InterventionsFormData - | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; +id: String | - +Study apply(); - +InterventionsFormData copy() + +Intervention toIntervention(); + +InterventionFormData copy() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [<abstract>IFormData]<:-[InterventionFormData] - [StudyDesignInterventionsFormView + [<abstract>StudyScheduleControls | - +Widget build() + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic + | + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] - [StudyScheduleFormView + [EnrollmentFormData | - +formViewModel: StudyScheduleControls + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; + +id: String | - -FormTableRow _renderCustomSequence(); - +Widget build() + +Study apply(); + +EnrollmentFormData copy() ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [InterventionTaskFormViewModel + [ConsentItemFormViewModel | - +taskIdControl: FormControl<String>; - +instanceIdControl: FormControl<String>; - +taskTitleControl: FormControl<String>; - +taskDescriptionControl: FormControl<String>; - +markAsCompletedControl: FormControl<bool>; + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; +form: FormGroup; - +taskId: String; - +instanceId: String; + +consentId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; + +descriptionRequired: dynamic; +titles: Map<FormMode, String> | +void setControlsFrom(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [InterventionFormData - | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + [ConsentItemFormView | - +Intervention toIntervention(); - +InterventionFormData copy() + +formViewModel: ConsentItemFormViewModel ] - [<abstract>IFormData]<:-[InterventionFormData] + [ConsentItemFormView]o-[ConsentItemFormViewModel] - [InterventionTaskFormView + [<abstract>IScreenerQuestionLogicFormViewModel | - +formViewModel: InterventionTaskFormViewModel + +isDirtyOptionsBannerVisible: bool ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] - - [InterventionPreview + [ScreenerQuestionLogicFormView | - +routeArgs: InterventionFormRouteArgs + +formViewModel: ScreenerQuestionFormViewModel | - +Widget build() + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [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] - [SurveyPreview - | - +routeArgs: MeasurementFormRouteArgs + [StudyDesignEnrollmentFormView | - +Widget build() + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [MeasurementSurveyFormData + [ConsentItemFormData | - +measurementId: String; + +consentId: String; +title: String; - +introText: String?; - +outroText: String?; - +questionnaireFormData: QuestionnaireFormData; - <static>+kDefaultTitle: String; + +description: String; + +iconName: String?; +id: String | - +QuestionnaireTask toQuestionnaireTask(); - +MeasurementSurveyFormData copy() + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [MeasurementSurveyFormData]o-[QuestionnaireFormData] - [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [<abstract>IFormData]<:-[ConsentItemFormData] - [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; + +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; + +consentItemModels: List<ConsentItemFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +atLeastOneQuestion: dynamic; - +breadcrumbsTitle: String; - +titles: Map<FormMode, String> + +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] - - [StudyDesignMeasurementsFormView - | - +Widget build() + +ScreenerQuestionFormRouteArgs buildNewScreenerQuestionFormRouteArgs(); + +ScreenerQuestionFormRouteArgs buildScreenerQuestionFormRouteArgs(); + +ConsentItemFormRouteArgs buildNewConsentItemFormRouteArgs(); + +ConsentItemFormRouteArgs buildConsentItemFormRouteArgs(); + +dynamic testScreener(); + +dynamic testConsent(); + +ScreenerQuestionFormViewModel provideQuestionFormViewModel() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [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] - [MeasurementsFormData + [EnrollmentFormConsentItemDelegate | - +surveyMeasurements: List<MeasurementSurveyFormData>; - +id: String + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic | - +Study apply(); - +MeasurementsFormData copy() + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [<abstract>IStudyFormData]<:--[MeasurementsFormData] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] [MeasurementsFormViewModel | @@ -2371,1874 +2907,1357 @@ [<abstract>IListActionProvider]<:--[MeasurementsFormViewModel] [<abstract>IProviderArgsResolver]<:--[MeasurementsFormViewModel] - [StudyFormValidationSet - | - +index: int; - <static>+values: List<StudyFormValidationSet> - ] - - [Enum]<:--[StudyFormValidationSet] - - [ReportsFormData + [MeasurementSurveyFormData | - +reportItems: List<ReportItemFormData>; + +measurementId: String; + +title: String; + +introText: String?; + +outroText: String?; + +questionnaireFormData: QuestionnaireFormData; + <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 + +QuestionnaireTask toQuestionnaireTask(); + +MeasurementSurveyFormData copy() ] - [ReportStatus]o-[ReportStatus] - [Enum]<:--[ReportStatus] + [MeasurementSurveyFormData]o-[QuestionnaireFormData] + [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] - [ReportItemFormView + [SurveyPreview | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +routeArgs: MeasurementFormRouteArgs | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + +Widget build() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] - [ReportItemFormViewModel + [MeasurementSurveyFormViewModel | - <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; + +measurementIdControl: FormControl<String>; + +instanceIdControl: FormControl<String>; + +surveyTitleControl: FormControl<String>; + +surveyIntroTextControl: FormControl<String>; + +surveyOutroTextControl: 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>; + +measurementId: String; + +instanceId: String; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titleRequired: dynamic; - +descriptionRequired: dynamic; - +dataReferenceRequired: dynamic; - +aggregationRequired: dynamic; - +improvementDirectionRequired: dynamic; - +alphaConfidenceRequired: dynamic + +atLeastOneQuestion: dynamic; + +breadcrumbsTitle: String; + +titles: Map<FormMode, String> | - -List<FormControlValidation> _getValidationConfig(); - +ReportItemFormData buildFormData(); - +ReportItemFormViewModel createDuplicate(); - +dynamic onSectionTypeChanged(); - -void _updateFormControls(); - +void setControlsFrom() + +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() ] - [ReportItemFormViewModel]o-[ReportSectionType] - [ReportItemFormViewModel]o-[FormControl] - [ReportItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] + [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] - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String + [MeasurementSurveyFormView | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() + +formViewModel: MeasurementSurveyFormViewModel ] - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] - [DataReferenceIdentifier + [MeasurementsFormData | - +hashCode: int + +surveyMeasurements: List<MeasurementSurveyFormData>; + +id: String | - +bool ==() + +Study apply(); + +MeasurementsFormData copy() ] - [DataReference]<:-[DataReferenceIdentifier] + [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [AverageSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [StudyDesignMeasurementsFormView | +Widget build() ] - [AverageSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[AverageSectionFormView] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] - [TemporalAggregationFormatted - | - -_value: TemporalAggregation; - <static>+values: List<TemporalAggregationFormatted>; - +value: TemporalAggregation; - +string: String; - +icon: IconData?; - +hashCode: int + [<abstract>StudyDesignPageWidget | - +bool ==(); - +String toString(); - +String toJson(); - <static>+TemporalAggregationFormatted fromJson() + +Widget? banner() ] - [TemporalAggregationFormatted]o-[TemporalAggregation] - [TemporalAggregationFormatted]o-[IconData] + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - [ImprovementDirectionFormatted - | - -_value: ImprovementDirection; - <static>+values: List<ImprovementDirectionFormatted>; - +value: ImprovementDirection; - +string: String; - +icon: IconData?; - +hashCode: int + [StudyDesignInfoFormView | - +bool ==(); - +String toString(); - +String toJson(); - <static>+ImprovementDirectionFormatted fromJson() + +Widget build() ] - [ImprovementDirectionFormatted]o-[ImprovementDirection] - [ImprovementDirectionFormatted]o-[IconData] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - [ReportSectionType + [StudyInfoFormData | - +index: int; - <static>+values: List<ReportSectionType>; - <static>+average: ReportSectionType; - <static>+linearRegression: ReportSectionType + +title: String; + +description: String?; + +iconName: String; + +contactInfoFormData: StudyContactInfoFormData; + +id: String + | + +Study apply(); + +StudyInfoFormData copy() ] - [ReportSectionType]o-[ReportSectionType] - [Enum]<:--[ReportSectionType] + [StudyInfoFormData]o-[StudyContactInfoFormData] + [<abstract>IStudyFormData]<:--[StudyInfoFormData] - [DataReferenceEditor + [StudyContactInfoFormData | - +formControl: FormControl<DataReferenceIdentifier<T>>; - +availableTasks: List<Task>; - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + +organization: String?; + +institutionalReviewBoard: String?; + +institutionalReviewBoardNumber: String?; + +researchers: String?; + +email: String?; + +website: String?; + +phone: String?; + +additionalInfo: String?; + +id: String | - +FormTableRow buildFormTableRow(); - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + +Study apply(); + +StudyInfoFormData copy() ] - [DataReferenceEditor]o-[FormControl] - [DataReferenceEditor]o-[ReactiveDropdownField] + [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - [LinearRegressionSectionFormView - | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + [StudyInfoFormViewModel | - +Widget build() - ] - - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] - - [StudyDesignReportsFormView + +study: Study; + +titleControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +descriptionControl: FormControl<String>; + +organizationControl: FormControl<String>; + +reviewBoardControl: FormControl<String>; + +reviewBoardNumberControl: FormControl<String>; + +researchersControl: FormControl<String>; + +emailControl: FormControl<String>; + +websiteControl: FormControl<String>; + +phoneControl: FormControl<String>; + +additionalInfoControl: FormControl<String>; + +form: FormGroup; + +titles: Map<FormMode, String>; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +iconRequired: dynamic; + +organizationRequired: dynamic; + +reviewBoardRequired: dynamic; + +reviewBoardNumberRequired: dynamic; + +researchersRequired: dynamic; + +emailRequired: dynamic; + +phoneRequired: dynamic; + +emailFormat: dynamic; + +websiteFormat: dynamic | - +Widget build(); - -dynamic _showReportItemSidesheetWithArgs() + +void setControlsFrom(); + +StudyInfoFormData buildFormData() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + [StudyInfoFormViewModel]o-[Study] + [StudyInfoFormViewModel]o-[FormControl] + [StudyInfoFormViewModel]o-[FormGroup] + [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - [ReportsFormViewModel + [StudyFormViewModel | - +study: Study; + +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 - | - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; - +owner: ReportsFormViewModel; - +propagateOnSave: bool; - +validationSet: dynamic + [<abstract>IStudyFormData | - +void onCancel(); - +dynamic onSave(); - +ReportItemFormViewModel provide(); - +List<ModelAction<dynamic>> availableActions(); - +void onNewItem(); - +void onSelectItem() + +Study apply() ] - [ReportFormItemDelegate]o-[FormViewModelCollection] - [ReportFormItemDelegate]o-[ReportsFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] - [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] - [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] - [ReportBadge + [ReportsFormData | - +status: ReportStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool + +reportItems: List<ReportItemFormData>; + +id: String | - +Widget build() + +Study apply(); + +ReportsFormData copy() ] - [ReportBadge]o-[ReportStatus] - [ReportBadge]o-[BadgeType] + [<abstract>IStudyFormData]<:--[ReportsFormData] - [EnrollmentFormData - | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String + [ReportStatus | - +Study apply(); - +EnrollmentFormData copy() + +index: int; + <static>+values: List<ReportStatus>; + <static>+primary: ReportStatus; + <static>+secondary: ReportStatus ] - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] + [ReportStatus]o-[ReportStatus] + [Enum]<:--[ReportStatus] - [ConsentItemFormData + [ReportItemFormData | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; + +isPrimary: bool; + +section: ReportSection; +id: String | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [<abstract>IFormData]<:-[ConsentItemFormData] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] - [ConsentItemFormViewModel + [ReportItemFormViewModel | - +consentIdControl: FormControl<String>; + <static>+defaultSectionType: ReportSectionType; + +sectionIdControl: FormControl<String>; + +sectionTypeControl: FormControl<ReportSectionType>; +titleControl: FormControl<String>; +descriptionControl: FormControl<String>; - +iconControl: FormControl<IconOption>; + +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; - +consentId: String; + +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; - +titles: Map<FormMode, String> + +dataReferenceRequired: dynamic; + +aggregationRequired: dynamic; + +improvementDirectionRequired: dynamic; + +alphaConfidenceRequired: dynamic | - +void setControlsFrom(); - +ConsentItemFormData buildFormData(); - +ConsentItemFormViewModel createDuplicate() + -List<FormControlValidation> _getValidationConfig(); + +ReportItemFormData buildFormData(); + +ReportItemFormViewModel createDuplicate(); + +dynamic onSectionTypeChanged(); + -void _updateFormControls(); + +void setControlsFrom() ] - [ConsentItemFormViewModel]o-[FormControl] - [ConsentItemFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] + [ReportItemFormViewModel]o-[ReportSectionType] + [ReportItemFormViewModel]o-[FormControl] + [ReportItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel + [LinearRegressionSectionFormView | - +isDirtyOptionsBannerVisible: bool + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> + | + +Widget build() ] - [ScreenerQuestionLogicFormView + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + + [AverageSectionFormView | - +formViewModel: ScreenerQuestionFormViewModel + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +Widget build(); - -dynamic _buildInfoBanner(); - -dynamic _buildAnswerOptionsLogicControls(); - -List<Widget> _buildOptionLogicRow() + +Widget build() ] - [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] - [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + [AverageSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[AverageSectionFormView] - [StudyDesignEnrollmentFormView + [TemporalAggregationFormatted | - +Widget build(); - -dynamic _showScreenerQuestionSidesheetWithArgs(); - -dynamic _showConsentItemSidesheetWithArgs() + -_value: TemporalAggregation; + <static>+values: List<TemporalAggregationFormatted>; + +value: TemporalAggregation; + +string: String; + +icon: IconData?; + +hashCode: int + | + +bool ==(); + +String toString(); + +String toJson(); + <static>+TemporalAggregationFormatted fromJson() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] + [TemporalAggregationFormatted]o-[TemporalAggregation] + [TemporalAggregationFormatted]o-[IconData] - [ScreenerQuestionFormViewModel + [ImprovementDirectionFormatted | - <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 + -_value: ImprovementDirection; + <static>+values: List<ImprovementDirectionFormatted>; + +value: ImprovementDirection; + +string: String; + +icon: IconData?; + +hashCode: int | - +dynamic onResponseOptionsChanged(); - +void setControlsFrom(); - +QuestionFormData buildFormData(); - -List<FormControl<dynamic>> _copyFormControls(); - -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); - -AbstractControl<dynamic>? _findAssociatedControlFor(); - +ScreenerQuestionFormViewModel createDuplicate() + +bool ==(); + +String toString(); + +String toJson(); + <static>+ImprovementDirectionFormatted fromJson() ] - [ScreenerQuestionFormViewModel]o-[FormArray] - [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] - [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] + [ImprovementDirectionFormatted]o-[ImprovementDirection] + [ImprovementDirectionFormatted]o-[IconData] - [ConsentItemFormView + [ReportSectionType | - +formViewModel: ConsentItemFormViewModel + +index: int; + <static>+values: List<ReportSectionType>; + <static>+average: ReportSectionType; + <static>+linearRegression: ReportSectionType ] - [ConsentItemFormView]o-[ConsentItemFormViewModel] + [ReportSectionType]o-[ReportSectionType] + [Enum]<:--[ReportSectionType] - [EnrollmentFormViewModel + [DataReferenceEditor + | + +formControl: FormControl<DataReferenceIdentifier<T>>; + +availableTasks: List<Task>; + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + | + +FormTableRow buildFormTableRow(); + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + ] + + [DataReferenceEditor]o-[FormControl] + [DataReferenceEditor]o-[ReactiveDropdownField] + + [DataReferenceIdentifier + | + +hashCode: int + | + +bool ==() + ] + + [DataReference]<:-[DataReferenceIdentifier] + + [ReportItemFormView + | + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) + | + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() + ] + + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] + + [StudyDesignReportsFormView + | + +Widget build(); + -dynamic _showReportItemSidesheetWithArgs() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignReportsFormView] + + [ReportsFormViewModel | +study: Study; +router: GoRouter; - +consentItemDelegate: EnrollmentFormConsentItemDelegate; - +enrollmentTypeControl: FormControl<Participation>; - +consentItemArray: FormArray<dynamic>; - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +reportItemDelegate: ReportFormItemDelegate; + +reportItemArray: FormArray<dynamic>; + +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; +form: FormGroup; - +enrollmentTypeControlOptions: List<FormControlOption<Participation>>; - +consentItemModels: List<ConsentItemFormViewModel>; + +reportItemModels: List<ReportItemFormViewModel>; +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; +titles: Map<FormMode, String>; - +canTestScreener: bool; - +canTestConsent: bool; - +questionTitles: Map<FormMode, String Function()> + +canTestConsent: bool | +void setControlsFrom(); - +EnrollmentFormData buildFormData(); + +ReportsFormData 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() + +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs(); + +ReportItemFormRouteArgs buildReportItemFormRouteArgs(); + +dynamic testReport(); + +void onCancel(); + +dynamic onSave(); + +ReportItemFormViewModel provide() ] - [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] + [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] - [EnrollmentFormConsentItemDelegate + [ReportFormItemDelegate | - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; - +owner: EnrollmentFormViewModel; + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData>; + +owner: ReportsFormViewModel; +propagateOnSave: bool; +validationSet: dynamic | +void onCancel(); +dynamic onSave(); - +ConsentItemFormViewModel provide(); + +ReportItemFormViewModel provide(); +List<ModelAction<dynamic>> availableActions(); +void onNewItem(); +void onSelectItem() ] - [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] - [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] - [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] - [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] + [ReportFormItemDelegate]o-[FormViewModelCollection] + [ReportFormItemDelegate]o-[ReportsFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[ReportFormItemDelegate] + [<abstract>IListActionProvider]<:--[ReportFormItemDelegate] + [<abstract>IProviderArgsResolver]<:--[ReportFormItemDelegate] - [<abstract>StudyDesignPageWidget + [ReportBadge | - +Widget? banner() - ] - - [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] - - [PublishSuccessDialog + +status: ReportStatus?; + +type: BadgeType; + +showPrefixIcon: bool; + +showTooltip: bool | +Widget build() ] - [<abstract>StudyPageWidget]<:-[PublishSuccessDialog] + [ReportBadge]o-[ReportStatus] + [ReportBadge]o-[BadgeType] - [PublishDialog + [AccountSettingsDialog | +Widget build() ] - [<abstract>StudyPageWidget]<:-[PublishDialog] + [<abstract>ConsumerWidget]<:-[AccountSettingsDialog] - [PublishConfirmationDialog + [<abstract>IAppRepository | - +Widget build() + +dynamic fetchAppConfig(); + +void dispose() ] - [<abstract>StudyPageWidget]<:-[PublishConfirmationDialog] - - [StudyAnalyzeController + [AppRepository | - +dynamic onExport() - ] - - [StudyBaseController]<:-[StudyAnalyzeController] - - [StudyAnalyzeScreen + +apiClient: StudyUApi | - +Widget? banner(); - +Widget build() + +dynamic fetchAppConfig(); + +void dispose() ] - [<abstract>StudyPageWidget]<:-[StudyAnalyzeScreen] + [AppRepository]o-[<abstract>StudyUApi] + [<abstract>IAppRepository]<:--[AppRepository] - [DrawerEntry + [<abstract>IAuthRepository | - +localizedTitle: String Function(); - +icon: IconData?; - +localizedHelpText: String Function()?; - +enabled: bool; - +onSelected: void Function(BuildContext, WidgetRef)?; - +autoCloseDrawer: bool; - +title: String; - +helpText: String? + +allowPasswordReset: bool; + +currentUser: User?; + +isLoggedIn: bool; + +session: Session?; + +serializedSession: String? | - +void onClick() + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); + +void dispose() ] - [DrawerEntry]o-[String Function()] - [DrawerEntry]o-[IconData] - [DrawerEntry]o-[String Function()?] - [DrawerEntry]o-[void Function(BuildContext, WidgetRef)?] + [<abstract>IAuthRepository]o-[User] + [<abstract>IAuthRepository]o-[Session] + [<abstract>IAppDelegate]<:-[<abstract>IAuthRepository] - [GoRouterDrawerEntry + [AuthRepository | - +intent: RoutingIntent; - +onNavigated: void Function()? + +supabaseClient: SupabaseClient; + +sharedPreferences: SharedPreferences; + +allowPasswordReset: bool; + +authClient: GoTrueClient; + +session: Session?; + +serializedSession: String?; + +currentUser: User?; + +isLoggedIn: bool | - +void onClick() + -void _registerAuthListener(); + +dynamic signUp(); + +dynamic signInWith(); + +dynamic signOut(); + +dynamic resetPasswordForEmail(); + +dynamic updateUser(); + +void dispose(); + +dynamic onAppStart() ] - [GoRouterDrawerEntry]o-[RoutingIntent] - [GoRouterDrawerEntry]o-[void Function()?] - [DrawerEntry]<:-[GoRouterDrawerEntry] + [AuthRepository]o-[SupabaseClient] + [AuthRepository]o-[SharedPreferences] + [AuthRepository]o-[GoTrueClient] + [AuthRepository]o-[Session] + [AuthRepository]o-[User] + [<abstract>IAuthRepository]<:--[AuthRepository] - [AppDrawer - | - +width: int; - +autoCloseDrawer: bool; - +leftPaddingEntries: double; - +logoPaddingVertical: double; - +logoPaddingHorizontal: double; - +logoMaxHeight: double; - +logoSectionMinHeight: double; - +logoSectionMaxHeight: double + [StudyLaunched ] - [StudyController - | - +notificationService: INotificationService; - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>?; - +studyActions: List<ModelAction<dynamic>> + [<abstract>ModelEvent]<:-[StudyLaunched] + + [<abstract>StudyUApi | - +dynamic syncStudyStatus(); - +dynamic onStudySubscriptionUpdate(); - -dynamic _redirectNewToActualStudyID(); - +dynamic publishStudy(); - +void onChangeStudyParticipation(); - +void onAddParticipants(); - +void onSettingsPressed(); - +void dispose() + +dynamic saveStudy(); + +dynamic fetchStudy(); + +dynamic getUserStudies(); + +dynamic deleteStudy(); + +dynamic saveStudyInvite(); + +dynamic fetchStudyInvite(); + +dynamic deleteStudyInvite(); + +dynamic deleteParticipants(); + +dynamic fetchAppConfig(); + +dynamic fetchUser(); + +dynamic saveUser() ] - [StudyController]o-[<abstract>INotificationService] - [StudyController]o-[StreamSubscription] - [StudyBaseController]<:-[StudyController] - - [PreviewFrame - | - +studyId: String; - +routeArgs: StudyFormRouteArgs?; - +route: String? + [APIException ] - [PreviewFrame]o-[<abstract>StudyFormRouteArgs] + [Exception]<:--[APIException] - [<abstract>IStudyStatusBadgeViewModel - | - +studyParticipation: Participation?; - +studyStatus: StudyStatus? + [StudyNotFoundException ] - [<abstract>IStudyStatusBadgeViewModel]o-[Participation] - [<abstract>IStudyStatusBadgeViewModel]o-[StudyStatus] + [APIException]<:-[StudyNotFoundException] - [StudyStatusBadge - | - +participation: Participation?; - +status: StudyStatus?; - +type: BadgeType; - +showPrefixIcon: bool; - +showTooltip: bool - | - +Widget build() + [MeasurementNotFoundException ] - [StudyStatusBadge]o-[Participation] - [StudyStatusBadge]o-[StudyStatus] - [StudyStatusBadge]o-[BadgeType] + [APIException]<:-[MeasurementNotFoundException] - [StudyTestController - | - +authRepository: IAuthRepository; - +languageCode: String + [QuestionNotFoundException ] - [StudyTestController]o-[<abstract>IAuthRepository] - [StudyBaseController]<:-[StudyTestController] + [APIException]<:-[QuestionNotFoundException] - [RouteInformation - | - +route: String?; - +extra: String?; - +cmd: String?; - +data: String? - | - +String toString() + [ConsentItemNotFoundException ] - [<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() + [APIException]<:-[ConsentItemNotFoundException] + + [InterventionNotFoundException ] - [<abstract>PlatformController]o-[RouteInformation] - [<abstract>PlatformController]o-[<abstract>Widget] + [APIException]<:-[InterventionNotFoundException] - [WebController - | - +iFrameElement: IFrameElement - | - +void activate(); - +void registerViews(); - +void generateUrl(); - +void navigate(); - +void refresh(); - +void openNewPage(); - +void listen(); - +void send() + [InterventionTaskNotFoundException ] - [WebController]o-[IFrameElement] - [<abstract>PlatformController]<:-[WebController] + [APIException]<:-[InterventionTaskNotFoundException] - [MobileController - | - +void openNewPage(); - +void refresh(); - +void registerViews(); - +void listen(); - +void send(); - +void navigate(); - +void activate(); - +void generateUrl() + [ReportNotFoundException ] - [<abstract>PlatformController]<:-[MobileController] + [APIException]<:-[ReportNotFoundException] - [StudySettingsFormViewModel - | - +study: AsyncValue<Study>; - +studyRepository: IStudyRepository; - <static>+defaultPublishedToRegistry: bool; - <static>+defaultPublishedToRegistryResults: bool; - +isPublishedToRegistryControl: FormControl<bool>; - +isPublishedToRegistryResultsControl: FormControl<bool>; - +form: FormGroup; - +titles: Map<FormMode, String> - | - +void setControlsFrom(); - +Study buildFormData(); - +dynamic keepControlsSynced(); - +dynamic save(); - +dynamic setLaunchDefaults() + [ReportSectionNotFoundException ] - [StudySettingsFormViewModel]o-[<abstract>AsyncValue] - [StudySettingsFormViewModel]o-[<abstract>IStudyRepository] - [StudySettingsFormViewModel]o-[FormControl] - [StudySettingsFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudySettingsFormViewModel] + [APIException]<:-[ReportSectionNotFoundException] - [StudySettingsDialog - | - +Widget build() + [StudyInviteNotFoundException ] - [<abstract>StudyPageWidget]<:-[StudySettingsDialog] + [APIException]<:-[StudyInviteNotFoundException] - [StudyTestScreen - | - +previewRoute: String? - | - +Widget build(); - +Widget? banner(); - +dynamic load(); - +dynamic save(); - +dynamic showHelp() + [UserNotFoundException ] - [<abstract>StudyPageWidget]<:-[StudyTestScreen] + [APIException]<:-[UserNotFoundException] - [StudyBaseController + [StudyUApiClient | - +studyId: String; - +studyRepository: IStudyRepository; - +router: GoRouter; - +studySubscription: StreamSubscription<WrappedModel<Study>>? + +supabaseClient: SupabaseClient; + <static>+studyColumns: List<String>; + <static>+studyWithParticipantActivityColumns: List<String>; + +testDelayMilliseconds: int | - +dynamic subscribeStudy(); - +dynamic onStudySubscriptionUpdate(); - +dynamic onStudySubscriptionError(); - +void dispose() + +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() ] - [StudyBaseController]o-[<abstract>IStudyRepository] - [StudyBaseController]o-[GoRouter] - [StudyBaseController]o-[StreamSubscription] + [StudyUApiClient]o-[SupabaseClient] + [<abstract>SupabaseClientDependant]<:-[StudyUApiClient] + [<abstract>SupabaseQueryMixin]<:-[StudyUApiClient] + [<abstract>StudyUApi]<:--[StudyUApiClient] - [StudyParticipationBadge + [WrappedModel | - +participation: Participation; - +type: BadgeType; - +showPrefixIcon: bool; - +center: bool + -_model: T; + +asyncValue: AsyncValue<T>; + +isLocalOnly: bool; + +isDirty: bool; + +isDeleted: bool; + +lastSaved: DateTime?; + +lastFetched: DateTime?; + +lastUpdated: DateTime?; + +model: T | - +Widget build() + +dynamic markWithError(); + +dynamic markAsLoading(); + +dynamic markAsFetched(); + +dynamic markAsSaved() ] - [StudyParticipationBadge]o-[Participation] - [StudyParticipationBadge]o-[BadgeType] + [WrappedModel]o-[<abstract>AsyncValue] - [<abstract>IStudyAppBarViewModel - | - +isSyncIndicatorVisible: bool; - +isStatusBadgeVisible: bool; - +isPublishVisible: bool + [ModelRepositoryException ] - [<abstract>IStudyStatusBadgeViewModel]<:--[<abstract>IStudyAppBarViewModel] - [<abstract>IStudyNavViewModel]<:--[<abstract>IStudyAppBarViewModel] + [Exception]<:--[ModelRepositoryException] - [StudyScaffold - | - +studyId: String; - +tabs: List<NavbarTab>?; - +tabsSubnav: List<NavbarTab>?; - +selectedTab: NavbarTab?; - +selectedTabSubnav: NavbarTab?; - +body: StudyPageWidget; - +drawer: Widget?; - +disableActions: bool; - +actionsSpacing: double; - +actionsPadding: double; - +layoutType: SingleColumnLayoutType?; - +appbarHeight: double; - +appbarSubnavHeight: double - ] - - [StudyScaffold]o-[NavbarTab] - [StudyScaffold]o-[<abstract>StudyPageWidget] - [StudyScaffold]o-[<abstract>Widget] - [StudyScaffold]o-[SingleColumnLayoutType] - - [FrameControlsWidget - | - +onRefresh: void Function()?; - +onOpenNewTab: void Function()?; - +enabled: bool - | - +Widget build() - ] - - [FrameControlsWidget]o-[void Function()?] - [<abstract>ConsumerWidget]<:-[FrameControlsWidget] - - [WebFrame - | - +previewSrc: String; - +studyId: String - | - +Widget build() - ] - - [DisabledFrame - | - +Widget build() - ] - - [PhoneContainer - | - <static>+defaultWidth: double; - <static>+defaultHeight: double; - +width: double; - +height: double; - +borderColor: Color; - +borderWidth: double; - +borderRadius: double; - +innerContent: Widget; - +innerContentBackgroundColor: Color? - | - +Widget build() - ] - - [PhoneContainer]o-[Color] - [PhoneContainer]o-[<abstract>Widget] - - [MobileFrame - | - +Widget build() - ] - - [DesktopFrame - | - +Widget build() - ] - - [<abstract>StudyPageWidget - | - +studyId: String - | - +Widget? banner() - ] - - [<abstract>ConsumerWidget]<:-[<abstract>StudyPageWidget] - [<abstract>IWithBanner]<:--[<abstract>StudyPageWidget] - - [TestAppRoutes - | - <static>+studyOverview: String; - <static>+eligibility: String; - <static>+intervention: String; - <static>+consent: String; - <static>+journey: String; - <static>+dashboard: String - ] - - [<abstract>IStudyNavViewModel - | - +isEditTabEnabled: bool; - +isTestTabEnabled: bool; - +isRecruitTabEnabled: bool; - +isMonitorTabEnabled: bool; - +isAnalyzeTabEnabled: bool; - +isSettingsEnabled: bool - ] - - [StudyNav - | - <static>+dynamic tabs(); - <static>+dynamic edit(); - <static>+dynamic test(); - <static>+dynamic recruit(); - <static>+dynamic monitor(); - <static>+dynamic analyze() - ] - - [StudyDesignNav - | - <static>+dynamic tabs(); - <static>+dynamic info(); - <static>+dynamic enrollment(); - <static>+dynamic interventions(); - <static>+dynamic measurements(); - <static>+dynamic reports() - ] - - [<abstract>IClipboardService - | - +dynamic copy() - ] - - [ClipboardService - | - +dynamic copy() - ] - - [<abstract>IClipboardService]<:--[ClipboardService] - - [<abstract>NotificationIntent - | - +message: String?; - +customContent: Widget?; - +icon: IconData?; - +actions: List<NotificationAction>?; - +type: NotificationType - | - +void register() - ] - - [<abstract>NotificationIntent]o-[<abstract>Widget] - [<abstract>NotificationIntent]o-[IconData] - [<abstract>NotificationIntent]o-[NotificationType] - - [NotificationAction - | - +label: String; - +onSelect: dynamic Function(); - +isDestructive: bool - ] - - [NotificationAction]o-[dynamic Function()] - - [SnackbarIntent - | - +duration: int? - ] - - [<abstract>NotificationIntent]<:-[SnackbarIntent] - - [AlertIntent - | - +title: String; - +dismissOnAction: bool; - +isDestructive: dynamic - ] - - [<abstract>NotificationIntent]<:-[AlertIntent] - - [NotificationType - | - +index: int; - <static>+values: List<NotificationType>; - <static>+snackbar: NotificationType; - <static>+alert: NotificationType; - <static>+custom: NotificationType - ] - - [NotificationType]o-[NotificationType] - [Enum]<:--[NotificationType] - - [NotificationDispatcher - | - +child: Widget?; - +snackbarInnerPadding: double; - +snackbarWidth: double?; - +snackbarBehavior: SnackBarBehavior; - +snackbarDefaultDuration: int - ] - - [NotificationDispatcher]o-[<abstract>Widget] - [NotificationDispatcher]o-[SnackBarBehavior] - - [Notifications - | - <static>+credentialsInvalid: SnackbarIntent; - <static>+userAlreadyRegistered: SnackbarIntent; - <static>+passwordReset: SnackbarIntent; - <static>+passwordResetSuccess: SnackbarIntent; - <static>+studyDeleted: SnackbarIntent; - <static>+inviteCodeDeleted: SnackbarIntent; - <static>+inviteCodeClipped: SnackbarIntent; - <static>+studyDeleteConfirmation: AlertIntent - ] - - [Notifications]o-[SnackbarIntent] - [Notifications]o-[AlertIntent] - - [NotificationDefaultActions - | - <static>+cancel: NotificationAction + [ModelNotFoundException ] - [NotificationDefaultActions]o-[NotificationAction] - - [<abstract>INotificationService - | - +void showMessage(); - +void show(); - +Stream<NotificationIntent> watchNotifications(); - +void dispose() - ] + [ModelRepositoryException]<:--[ModelNotFoundException] - [NotificationService - | - -_streamController: BehaviorSubject<NotificationIntent> + [<abstract>IModelRepository | - +Stream<NotificationIntent> watchNotifications(); - +void showMessage(); - +void show(); + +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() ] - [NotificationService]o-[BehaviorSubject] - [<abstract>INotificationService]<:--[NotificationService] - - [ErrorPage - | - +error: Exception? - | - +Widget build() - ] - - [<abstract>ConsumerWidget]<:-[ErrorPage] - - [SplashPage - | - +Widget build() - ] - - [NullHelperDecoration - ] - - [InputDecoration]<:-[NullHelperDecoration] - - [Collapsible - | - +contentBuilder: Widget Function(BuildContext, bool); - +headerBuilder: Widget Function(BuildContext, bool)?; - +title: String?; - +isCollapsed: bool - ] - - [Collapsible]o-[Widget Function(BuildContext, bool)] - [Collapsible]o-[Widget Function(BuildContext, bool)?] - - [FormScaffold - | - +formViewModel: T; - +actions: List<Widget>?; - +body: Widget; - +drawer: Widget?; - +actionsSpacing: double; - +actionsPadding: double - ] - - [FormScaffold]o-[<abstract>Widget] - - [AsyncValueWidget - | - +value: AsyncValue<T>; - +data: Widget Function(T); - +error: Widget Function(Object, StackTrace?)?; - +loading: Widget Function()?; - +empty: Widget Function()? - | - +Widget build(); - -Widget _buildDataOrEmptyWidget(); - -Widget _defaultError(); - -Widget _defaultLoad() - ] - - [AsyncValueWidget]o-[<abstract>AsyncValue] - [AsyncValueWidget]o-[Widget Function(T)] - [AsyncValueWidget]o-[Widget Function(Object, StackTrace?)?] - [AsyncValueWidget]o-[Widget Function()?] - - [SidesheetTab - | - +builder: Widget Function(BuildContext) - ] - - [SidesheetTab]o-[Widget Function(BuildContext)] - [NavbarTab]<:-[SidesheetTab] - - [Sidesheet - | - <static>+kDefaultWidth: double; - +titleText: String; - +body: Widget?; - +tabs: List<SidesheetTab>?; - +actionButtons: List<Widget>?; - +width: double?; - +withCloseButton: bool; - +ignoreAppBar: bool; - +collapseSingleTab: bool; - +bodyPadding: EdgeInsets?; - +wrapContent: Widget Function(Widget)? - ] - - [Sidesheet]o-[<abstract>Widget] - [Sidesheet]o-[EdgeInsets] - [Sidesheet]o-[Widget Function(Widget)?] - - [FormSideSheetTab - | - +formViewBuilder: Widget Function(T) - ] - - [FormSideSheetTab]o-[Widget Function(T)] - [NavbarTab]<:-[FormSideSheetTab] + [<abstract>IModelActionProvider]<:--[<abstract>IModelRepository] - [ActionMenuType + [<abstract>IModelRepositoryDelegate | - +index: int; - <static>+values: List<ActionMenuType>; - <static>+inline: ActionMenuType; - <static>+popup: ActionMenuType + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +T createNewInstance(); + +T createDuplicate(); + +dynamic onError() ] - [ActionMenuType]o-[ActionMenuType] - [Enum]<:--[ActionMenuType] - - [Badge + [<abstract>ModelRepository | - +icon: IconData?; - +color: Color?; - +borderRadius: double; - +label: String; - +type: BadgeType; - +padding: EdgeInsets; - +iconSize: double?; - +labelStyle: TextStyle?; - +center: bool + +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>> | - +Widget build(); - -Color? _getBackgroundColor(); - -Color _getBorderColor(); - -Color? _getLabelColor() + +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() ] - [Badge]o-[IconData] - [Badge]o-[Color] - [Badge]o-[BadgeType] - [Badge]o-[EdgeInsets] - [Badge]o-[TextStyle] + [<abstract>ModelRepository]o-[<abstract>IModelRepositoryDelegate] + [<abstract>ModelRepository]o-[BehaviorSubject] + [<abstract>IModelRepository]<:-[<abstract>ModelRepository] - [BadgeType + [<abstract>SupabaseClientDependant | - +index: int; - <static>+values: List<BadgeType>; - <static>+filled: BadgeType; - <static>+outlined: BadgeType; - <static>+outlineFill: BadgeType; - <static>+plain: BadgeType + +supabaseClient: SupabaseClient ] - [BadgeType]o-[BadgeType] - [Enum]<:--[BadgeType] + [<abstract>SupabaseClientDependant]o-[SupabaseClient] - [ConstrainedWidthFlexible - | - +minWidth: double; - +maxWidth: double; - +flex: int; - +flexSum: int; - +child: Widget; - +outerConstraints: BoxConstraints + [SupabaseQueryError | - +Widget build(); - -double _getWidth() + +statusCode: String?; + +message: String; + +details: dynamic ] - [ConstrainedWidthFlexible]o-[<abstract>Widget] - [ConstrainedWidthFlexible]o-[BoxConstraints] - - [IconPack - | - <static>+defaultPack: List<IconOption>; - <static>+material: List<IconOption> - | - <static>+IconOption? resolveIconByName() - ] + [Exception]<:--[SupabaseQueryError] - [IconOption - | - +name: String; - +icon: IconData?; - +isEmpty: bool; - +props: List<Object?> + [<abstract>SupabaseQueryMixin | - +String toJson(); - <static>+IconOption fromJson() - ] - - [IconOption]o-[IconData] - [<abstract>Equatable]<:-[IconOption] - - [ReactiveIconPicker + +dynamic deleteAll(); + +dynamic getAll(); + +dynamic getById(); + +dynamic getByColumn(); + +List<T> deserializeList(); + +T deserializeObject() ] - [ReactiveFocusableFormField]<:-[ReactiveIconPicker] - - [IconPicker - | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +onSelect: void Function(IconOption)?; - +galleryIconSize: double?; - +selectedIconSize: double?; - +focusNode: FocusNode?; - +isDisabled: bool + [<abstract>IInviteCodeRepository | - +Widget build() + +dynamic isCodeAlreadyUsed() ] - [IconPicker]o-[IconOption] - [IconPicker]o-[void Function(IconOption)?] - [IconPicker]o-[FocusNode] + [<abstract>ModelRepository]<:--[<abstract>IInviteCodeRepository] - [IconPickerField + [InviteCodeRepository | - +iconOptions: List<IconOption>; - +selectedOption: IconOption?; - +selectedIconSize: double?; - +galleryIconSize: double?; - +onSelect: void Function(IconOption)?; - +focusNode: FocusNode?; - +isDisabled: bool + +studyId: String; + +ref: ProviderRef<dynamic>; + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +studyRepository: IStudyRepository; + +study: Study | - +Widget build() + +String getKey(); + +dynamic isCodeAlreadyUsed(); + +List<ModelAction<dynamic>> availableActions(); + +dynamic emitUpdate() ] - [IconPickerField]o-[IconOption] - [IconPickerField]o-[void Function(IconOption)?] - [IconPickerField]o-[FocusNode] + [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] - [IconPickerGallery + [InviteCodeRepositoryDelegate | - +iconOptions: List<IconOption>; - +onSelect: void Function(IconOption)?; - +iconSize: double + +study: Study; + +apiClient: StudyUApi; + +studyRepository: IStudyRepository | - +Widget build() + +dynamic fetch(); + +dynamic fetchAll(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +StudyInvite createDuplicate(); + +StudyInvite createNewInstance() ] - [IconPickerGallery]o-[void Function(IconOption)?] + [InviteCodeRepositoryDelegate]o-[Study] + [InviteCodeRepositoryDelegate]o-[<abstract>StudyUApi] + [InviteCodeRepositoryDelegate]o-[<abstract>IStudyRepository] + [<abstract>IModelRepositoryDelegate]<:-[InviteCodeRepositoryDelegate] - [TwoColumnLayout + [<abstract>IStudyRepository | - <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 + +dynamic launch(); + +dynamic deleteParticipants() ] - [TwoColumnLayout]o-[VerticalDivider] - [TwoColumnLayout]o-[EdgeInsets] - [TwoColumnLayout]o-[<abstract>Widget] - [TwoColumnLayout]o-[BoxConstraints] - [TwoColumnLayout]o-[Color] + [<abstract>ModelRepository]<:--[<abstract>IStudyRepository] - [<abstract>FormConsumerWidget + [StudyRepository | - +Widget build() + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: ProviderRef<dynamic>; + +sortCallback: void Function()? + | + +String getKey(); + +dynamic deleteParticipants(); + +dynamic launch(); + +List<ModelAction<dynamic>> availableActions() ] - [<abstract>FormConsumerRefWidget + [StudyRepository]o-[<abstract>StudyUApi] + [StudyRepository]o-[<abstract>IAuthRepository] + [StudyRepository]o-[<abstract>ProviderRef] + [StudyRepository]o-[void Function()?] + [<abstract>ModelRepository]<:-[StudyRepository] + [<abstract>IStudyRepository]<:--[StudyRepository] + + [StudyRepositoryDelegate | - +Widget build() + +apiClient: StudyUApi; + +authRepository: IAuthRepository + | + +dynamic fetchAll(); + +dynamic fetch(); + +dynamic save(); + +dynamic delete(); + +dynamic onError(); + +Study createNewInstance(); + +Study createDuplicate() ] - [<abstract>IWithBanner + [StudyRepositoryDelegate]o-[<abstract>StudyUApi] + [StudyRepositoryDelegate]o-[<abstract>IAuthRepository] + [<abstract>IModelRepositoryDelegate]<:-[StudyRepositoryDelegate] + + [<abstract>ModelEvent | - +Widget? banner() + +modelId: String; + +model: T ] - [BannerBox - | - +prefixIcon: Widget?; - +body: Widget; - +style: BannerStyle; - +padding: EdgeInsets?; - +noPrefix: bool; - +dismissable: bool; - +isDismissed: bool?; - +onDismissed: dynamic Function()?; - +dismissIconSize: double + [IsFetched ] - [BannerBox]o-[<abstract>Widget] - [BannerBox]o-[BannerStyle] - [BannerBox]o-[EdgeInsets] - [BannerBox]o-[dynamic Function()?] + [<abstract>ModelEvent]<:-[IsFetched] - [BannerStyle - | - +index: int; - <static>+values: List<BannerStyle>; - <static>+warning: BannerStyle; - <static>+info: BannerStyle; - <static>+error: BannerStyle + [IsSaving ] - [BannerStyle]o-[BannerStyle] - [Enum]<:--[BannerStyle] + [<abstract>ModelEvent]<:-[IsSaving] - [StudyULogo - | - +onTap: void Function()? - | - +Widget build() + [IsSaved ] - [StudyULogo]o-[void Function()?] + [<abstract>ModelEvent]<:-[IsSaved] - [FormTableRow - | - +label: String?; - +labelBuilder: Widget Function(BuildContext)?; - +labelStyle: TextStyle?; - +labelHelpText: String?; - +input: Widget; - +control: AbstractControl<dynamic>?; - +layout: FormTableRowLayout? + [IsDeleted ] - [FormTableRow]o-[Widget Function(BuildContext)?] - [FormTableRow]o-[TextStyle] - [FormTableRow]o-[<abstract>Widget] - [FormTableRow]o-[<abstract>AbstractControl] - [FormTableRow]o-[FormTableRowLayout] + [<abstract>ModelEvent]<:-[IsDeleted] - [FormTableLayout + [<abstract>IUserRepository | - +rows: List<FormTableRow>; - +columnWidths: Map<int, TableColumnWidth>; - +rowDivider: Widget?; - +rowLayout: FormTableRowLayout?; - +rowLabelStyle: TextStyle? + +user: StudyUUser | - +Widget build() + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [FormTableLayout]o-[<abstract>Widget] - [FormTableLayout]o-[FormTableRowLayout] - [FormTableLayout]o-[TextStyle] + [<abstract>IUserRepository]o-[StudyUUser] - [FormSectionHeader + [UserRepository | - +title: String; - +titleTextStyle: TextStyle?; - +helpText: String?; - +divider: bool; - +helpTextDisabled: bool + +apiClient: StudyUApi; + +authRepository: IAuthRepository; + +ref: Ref<Object?>; + +user: StudyUUser | - +Widget build() + +dynamic fetchUser(); + +dynamic saveUser(); + +dynamic updatePreferences() ] - [FormSectionHeader]o-[TextStyle] + [UserRepository]o-[<abstract>StudyUApi] + [UserRepository]o-[<abstract>IAuthRepository] + [UserRepository]o-[<abstract>Ref] + [UserRepository]o-[StudyUUser] + [<abstract>IUserRepository]<:--[UserRepository] - [FormLabel - | - +labelText: String?; - +helpText: String?; - +labelTextStyle: TextStyle?; - +layout: FormTableRowLayout? + [PreferenceAction | - +Widget build() + +index: int; + <static>+values: List<PreferenceAction>; + <static>+pin: PreferenceAction; + <static>+pinOff: PreferenceAction ] - [FormLabel]o-[TextStyle] - [FormLabel]o-[FormTableRowLayout] + [PreferenceAction]o-[PreferenceAction] + [Enum]<:--[PreferenceAction] - [FormTableRowLayout + [DropdownMenuItemTheme | - +index: int; - <static>+values: List<FormTableRowLayout>; - <static>+vertical: FormTableRowLayout; - <static>+horizontal: FormTableRowLayout + +iconTheme: IconThemeData? ] - [FormTableRowLayout]o-[FormTableRowLayout] - [Enum]<:--[FormTableRowLayout] + [DropdownMenuItemTheme]o-[IconThemeData] + [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] - [IndicatorRangeSliderThumbShape + [ThemeConfig | - +buildContext: BuildContext; - +start: T; - +end: T + <static>+kMinContentWidth: double; + <static>+kMaxContentWidth: double; + <static>+kHoverFadeFactor: double; + <static>+kMuteFadeFactor: double | - +Size getPreferredSize(); - +void paint() + <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() ] - [IndicatorRangeSliderThumbShape]o-[<abstract>BuildContext] - [<abstract>RangeSliderThumbShape]<:-[IndicatorRangeSliderThumbShape] - - [ActionMenuInline - | - +actions: List<ModelAction<dynamic>>; - +iconSize: double?; - +visible: bool; - +splashRadius: double?; - +paddingVertical: double?; - +paddingHorizontal: double? + [NoAnimationPageTransitionsBuilder | - +Widget build() + +Widget buildTransitions() ] - [NavbarTab + [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] + + [WebTransitionBuilder | - +title: String; - +intent: RoutingIntent?; - +index: int; - +enabled: bool + +Widget buildTransitions() ] - [NavbarTab]o-[RoutingIntent] + [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] - [TabbedNavbar + [ThemeSettingChange | - +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? + +settings: ThemeSettings ] - [TabbedNavbar]o-[BoxDecoration] - [TabbedNavbar]o-[Color] - [TabbedNavbar]o-[void Function(int, T)?] - [TabbedNavbar]o-[EdgeInsets] - [TabbedNavbar]o-[TabBarIndicatorSize] + [ThemeSettingChange]o-[ThemeSettings] + [<abstract>Notification]<:-[ThemeSettingChange] - [Hyperlink + [ThemeProvider | - +text: String; - +url: String?; - +onClick: void Function()?; - +linkColor: Color; - +hoverColor: Color?; - +visitedColor: Color?; - +style: TextStyle?; - +hoverStyle: TextStyle?; - +visitedStyle: TextStyle?; - +icon: IconData?; - +iconSize: double? + +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() ] - [Hyperlink]o-[void Function()?] - [Hyperlink]o-[Color] - [Hyperlink]o-[TextStyle] - [Hyperlink]o-[IconData] + [ThemeProvider]o-[ValueNotifier] + [ThemeProvider]o-[ColorScheme] + [ThemeProvider]o-[PageTransitionsTheme] + [ThemeProvider]o-[<abstract>ShapeBorder] + [<abstract>InheritedWidget]<:-[ThemeProvider] - [MouseEventsRegion + [ThemeSettings | - +onTap: void Function()?; - +onHover: void Function(PointerHoverEvent)?; - +onEnter: void Function(PointerEnterEvent)?; - +onExit: void Function(PointerExitEvent)?; - +autoselectCursor: bool; - +cursor: SystemMouseCursor; - <static>+defaultCursor: SystemMouseCursor; - +autoCursor: SystemMouseCursor + +sourceColor: Color; + +themeMode: ThemeMode ] - [MouseEventsRegion]o-[void Function()?] - [MouseEventsRegion]o-[void Function(PointerHoverEvent)?] - [MouseEventsRegion]o-[void Function(PointerEnterEvent)?] - [MouseEventsRegion]o-[void Function(PointerExitEvent)?] - [MouseEventsRegion]o-[SystemMouseCursor] + [ThemeSettings]o-[Color] + [ThemeSettings]o-[ThemeMode] - [HtmlStylingBanner + [CustomColor | - +isDismissed: bool; - +onDismissed: dynamic Function()? + +name: String; + +color: Color; + +blend: bool | - +Widget build() + +Color value() ] - [HtmlStylingBanner]o-[dynamic Function()?] + [CustomColor]o-[Color] - [ActionPopUpMenuButton + [StudyTemplates | - +actions: List<ModelAction<dynamic>>; - +triggerIconColor: Color?; - +triggerIconColorHover: Color?; - +triggerIconSize: double; - +disableSplashEffect: bool; - +hideOnEmpty: bool; - +orientation: Axis; - +elevation: double?; - +splashRadius: double?; - +enabled: bool; - +position: PopupMenuPosition + <static>+kUnnamedStudyTitle: String | - +Widget build(); - -Widget _buildPopupMenu() + <static>+Study emptyDraft() ] - [ActionPopUpMenuButton]o-[Color] - [ActionPopUpMenuButton]o-[Axis] - [ActionPopUpMenuButton]o-[PopupMenuPosition] + [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 + ] - [SingleColumnLayout + [StudyActionType]o-[StudyActionType] + [Enum]<:--[StudyActionType] + + [<abstract>ResultTypes + ] + + [MeasurementResultTypes | - <static>+defaultConstraints: BoxConstraints; - <static>+defaultConstraintsNarrow: BoxConstraints; - +body: Widget; - +header: Widget?; - +stickyHeader: bool; - +constraints: BoxConstraints?; - +scroll: bool; - +padding: EdgeInsets? + <static>+questionnaire: String; + <static>+values: List<String> + ] + + [<abstract>ResultTypes]<:-[MeasurementResultTypes] + + [InterventionResultTypes | - <static>+dynamic fromType() + <static>+checkmarkTask: String; + <static>+values: List<String> ] - [SingleColumnLayout]o-[BoxConstraints] - [SingleColumnLayout]o-[<abstract>Widget] - [SingleColumnLayout]o-[EdgeInsets] + [<abstract>ResultTypes]<:-[InterventionResultTypes] - [SingleColumnLayoutType + [StudyExportData | - +index: int; - <static>+values: List<SingleColumnLayoutType>; - <static>+boundedWide: SingleColumnLayoutType; - <static>+boundedNarrow: SingleColumnLayoutType; - <static>+stretched: SingleColumnLayoutType; - <static>+split: SingleColumnLayoutType + +study: Study; + +measurementsData: List<Map<String, dynamic>>; + +interventionsData: List<Map<String, dynamic>>; + +isEmpty: bool ] - [SingleColumnLayoutType]o-[SingleColumnLayoutType] - [Enum]<:--[SingleColumnLayoutType] + [StudyExportData]o-[Study] - [StandardDialog + [CombinedStreamNotifier | - +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 + -_subscriptions: List<StreamSubscription<dynamic>> | - +Widget build() + +void dispose() ] - [StandardDialog]o-[<abstract>Widget] - [StandardDialog]o-[Color] - [StandardDialog]o-[EdgeInsets] + [ChangeNotifier]<:-[CombinedStreamNotifier] - [HelpIcon + [OptimisticUpdate | - +tooltipText: String? + +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() ] - [UnderConstruction + [OptimisticUpdate]o-[void Function()] + [OptimisticUpdate]o-[dynamic Function()] + [OptimisticUpdate]o-[void Function()?] + [OptimisticUpdate]o-[void Function(Object, StackTrace?)?] + + [Time | - +Widget build() + <static>+dynamic fromTimeOfDay(); + +Map<String, dynamic> toJson(); + <static>+Time fromJson() ] - [FormControlLabel - | - +formControl: AbstractControl<dynamic>; - +text: String; - +isClickable: bool; - +textStyle: TextStyle?; - +onClick: void Function(AbstractControl<dynamic>)? + [TimeOfDay]<:-[Time] + + [TimeValueAccessor | - +Widget build() + +String modelToViewValue(); + +Time? viewToModelValue(); + -String _addLeadingZeroIfNeeded() ] - [FormControlLabel]o-[<abstract>AbstractControl] - [FormControlLabel]o-[TextStyle] - [FormControlLabel]o-[void Function(AbstractControl<dynamic>)?] + [<abstract>ControlValueAccessor]<:-[TimeValueAccessor] - [ReactiveCustomColorPicker + [ModelAction + | + +type: T; + +label: String; + +icon: IconData?; + +onExecute: Function; + +isAvailable: bool; + +isDestructive: bool ] - [ReactiveFormField]<:-[ReactiveCustomColorPicker] + [ModelAction]o-[IconData] - [<abstract>ISyncIndicatorViewModel + [<abstract>IModelActionProvider | - +isDirty: bool; - +lastSynced: DateTime? + +List<ModelAction<dynamic>> availableActions() ] - [SyncIndicator + [<abstract>IListActionProvider | - +state: AsyncValue<T>; - +lastSynced: DateTime?; - +isDirty: bool; - +animationDuration: int; - +iconSize: double + +void onSelectItem(); + +void onNewItem() ] - [SyncIndicator]o-[<abstract>AsyncValue] + [<abstract>IModelActionProvider]<:-[<abstract>IListActionProvider] - [Search + [ModelActionType | - +onQueryChanged: dynamic Function(String); - +searchController: SearchController?; - +hintText: String?; - +initialText: String? + +index: int; + <static>+values: List<ModelActionType>; + <static>+edit: ModelActionType; + <static>+delete: ModelActionType; + <static>+remove: ModelActionType; + <static>+duplicate: ModelActionType; + <static>+clipboard: ModelActionType; + <static>+primary: ModelActionType ] - [Search]o-[dynamic Function(String)] - [Search]o-[SearchController] + [ModelActionType]o-[ModelActionType] + [Enum]<:--[ModelActionType] - [SearchController + [SerializableColor | - +setText: void Function(String) + +Map<String, dynamic> toJson(); + <static>+SerializableColor fromJson() ] - [SearchController]o-[void Function(String)] + [Color]<:-[SerializableColor] - [StandardTableColumn + [Tuple | - +label: String; - +tooltip: String?; - +columnWidth: TableColumnWidth; - +sortable: bool; - +sortAscending: bool?; - +sortableIcon: Widget? + +first: T1; + +second: T2; + +props: List<Object?> + | + +Map<String, dynamic> toJson(); + <static>+Tuple<dynamic, dynamic> fromJson(); + +Tuple<T1, T2> copy(); + +Tuple<T1, T2> copyWith() ] - [StandardTableColumn]o-[<abstract>TableColumnWidth] - [StandardTableColumn]o-[<abstract>Widget] + [<abstract>Equatable]<:-[Tuple] - [StandardTable + [CountWhereValidator | - +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 + +predicate: bool Function(T?); + +minCount: int?; + +maxCount: int?; + <static>+kValidationMessageMinCount: String; + <static>+kValidationMessageMaxCount: String + | + +Map<String, dynamic>? validate() ] - [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] + [CountWhereValidator]o-[bool Function(T?)] + [<abstract>Validator]<:-[CountWhereValidator] - [StandardTableStyle + [Patterns | - +index: int; - <static>+values: List<StandardTableStyle>; - <static>+plain: StandardTableStyle; - <static>+material: StandardTableStyle + <static>+timeFormatString: String; + <static>+emailFormatString: String; + <static>+url: String ] - [StandardTableStyle]o-[StandardTableStyle] - [Enum]<:--[StandardTableStyle] - - [DismissButton + [<abstract>ExecutionLimiter | - +onPressed: void Function()?; - +text: String? + +milliseconds: int; + <static>-_timer: Timer? | - +Widget build() + +void dispose() ] - [DismissButton]o-[void Function()?] + [<abstract>ExecutionLimiter]o-[Timer] - [PrimaryButton + [Debouncer | - +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 + +leading: bool; + +cancelUncompleted: bool; + -_uncompletedFutureOperation: CancelableOperation<dynamic>? + | + +dynamic call() ] - [PrimaryButton]o-[IconData] - [PrimaryButton]o-[void Function()?] - [PrimaryButton]o-[dynamic Function()?] - [PrimaryButton]o-[EdgeInsets] - [PrimaryButton]o-[Size] + [Debouncer]o-[CancelableOperation] + [<abstract>ExecutionLimiter]<:-[Debouncer] - [SecondaryButton - | - +text: String; - +icon: IconData?; - +isLoading: bool; - +onPressed: void Function()? + [Throttler | - +Widget build() + +dynamic call() ] - [SecondaryButton]o-[IconData] - [SecondaryButton]o-[void Function()?] + [<abstract>ExecutionLimiter]<:-[Throttler] - [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() ] - [TextParagraph]o-[TextStyle] + [SuppressedBehaviorSubject]o-[BehaviorSubject] + [SuppressedBehaviorSubject]o-[StreamController] - [EmptyBody + [<abstract>JsonFileLoader | - +icon: IconData?; - +leading: Widget?; - +leadingSpacing: double?; - +title: String?; - +description: String?; - +button: Widget? + +jsonAssetsPath: String | - +Widget build() + +dynamic loadJson(); + +dynamic parseJsonMapFromAssets(); + +dynamic parseJsonListFromAssets() ] - [EmptyBody]o-[IconData] - [EmptyBody]o-[<abstract>Widget] - - [DropdownMenuItemTheme + [<abstract>IProviderArgsResolver | - +iconTheme: IconThemeData? + +R provide() ] - [DropdownMenuItemTheme]o-[IconThemeData] - [<abstract>Diagnosticable]<:-[DropdownMenuItemTheme] - - [ThemeConfig + [NumericalRangeFormatter | - <static>+kMinContentWidth: double; - <static>+kMaxContentWidth: double; - <static>+kHoverFadeFactor: double; - <static>+kMuteFadeFactor: double + +min: int?; + +max: int? | - <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() + +TextEditingValue formatEditUpdate() ] - [NoAnimationPageTransitionsBuilder + [<abstract>TextInputFormatter]<:-[NumericalRangeFormatter] + + [StudySequenceFormatter | - +Widget buildTransitions() + +TextEditingValue formatEditUpdate() ] - [<abstract>PageTransitionsBuilder]<:-[NoAnimationPageTransitionsBuilder] + [<abstract>TextInputFormatter]<:-[StudySequenceFormatter] - [WebTransitionBuilder + [<abstract>FileFormatEncoder + | + +dynamic encodeAsync(); + +String encode(); + +dynamic call() + ] + + [CSVStringEncoder | - +Widget buildTransitions() + +String encode() ] - [<abstract>PageTransitionsBuilder]<:-[WebTransitionBuilder] + [<abstract>FileFormatEncoder]<:-[CSVStringEncoder] - [ThemeSettingChange + [JsonStringEncoder | - +settings: ThemeSettings + +String encode() ] - [ThemeSettingChange]o-[ThemeSettings] - [<abstract>Notification]<:-[ThemeSettingChange] + [<abstract>FileFormatEncoder]<:-[JsonStringEncoder] - [ThemeProvider - | - +settings: ValueNotifier<ThemeSettings>; - +lightDynamic: ColorScheme?; - +darkDynamic: ColorScheme?; - +pageTransitionsTheme: PageTransitionsTheme; - +shapeMedium: ShapeBorder + [PlatformLocaleWeb | - +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() + +Locale getPlatformLocale() ] - [ThemeProvider]o-[ValueNotifier] - [ThemeProvider]o-[ColorScheme] - [ThemeProvider]o-[PageTransitionsTheme] - [ThemeProvider]o-[<abstract>ShapeBorder] - [<abstract>InheritedWidget]<:-[ThemeProvider] + [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - [ThemeSettings + [PlatformLocaleMobile | - +sourceColor: Color; - +themeMode: ThemeMode + +Locale getPlatformLocale() ] - [ThemeSettings]o-[Color] - [ThemeSettings]o-[ThemeMode] + [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] - [CustomColor - | - +name: String; - +color: Color; - +blend: bool + [<abstract>PlatformLocale | - +Color value() + +Locale getPlatformLocale() ] - [CustomColor]o-[Color] - [AppTranslation | <static>+dynamic init() @@ -4266,2271 +4285,2276 @@ [LanguagePickerType]o-[LanguagePickerType] [Enum]<:--[LanguagePickerType] - [<abstract>PlatformLocale - | - +Locale getPlatformLocale() - ] - - [PlatformLocaleMobile - | - +Locale getPlatformLocale() - ] - - [<abstract>PlatformLocale]<:--[PlatformLocaleMobile] - - [PlatformLocaleWeb - | - +Locale getPlatformLocale() - ] - - [<abstract>PlatformLocale]<:--[PlatformLocaleWeb] - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - - + + - + - + - + - - - - - - - - - - + + + + + + + + + + - + - - - - - - - - + + + + + + + + - - - - + - - - - - - + - + - - - - - - - - - + - + - - - - - + + + - - - - + - - + - + - - - - - - - - - - - - - + - + - + - + - - - + - + - + - + - - - + - + - + - + - + - + - + - + - + - - - - + - - - - - - + - + - + - + - + - + - + - + - + - + - - - - + + + - - + - + - + - + - + - + - - - - + + + - - + - + - + - + - + - + - + - + - - - - + + + - - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + + + - + - + - + - - - - - - - - - + - + - + - + - + - + - + - + - - - - - + - + - - - + - + - - - + - - - - + - - - - - - - - + - + - + + + - + - - - - - - - + + + - - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - + - + - + - + - + - + - + - + + + + - + + - + - + - + - - + + + - - - - + + + + + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - + - + - + - + - - - + - + - + - + - - - + - - - - - + + + + - - - + + + - - + - + - - - + - + - + - + - + - + - + - + - + - + - - + + + - - + - + - - + + + - - - - - + + + - - + - + - + - + - + - + - + - + - + - + + + + - - - + + - + - + - + - + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - - - + - + - - - + - + + + + - + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - + + + + - + + - + - + + + + + + + + + + - - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - - - + - + - - + + + - - + - + - + + + + + + - - + - - - - + + - + - + + + - + - + - + - - - + - + - + - + - + + + - - - - + - - + - + - - - + - + - + - - - - + - - - + + + + + - - + - + - + - - - - - - + + + + + + - + - - - + - + - - - + - + - + - + - + + + - + - + - + - + - - - - - - + - - + - + - + + + + + + + - + - - + + + - - + - + - - - + - + - + + + - + - - - + - + - - - + - - - - + + + - + + - + - - - - + + + - - + - + - + - + - + - + - + - + - + - + - + + + + + - + - + - + - + - + - + - + - + - + - - + + - + - - - - + + - - - - + - - + - + - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - - - + + + + - - - + + + - - + - + - + - + - + - + - + - + - + - + - - - + - - - + + + + - - - + + + - - + - + - + - - - - + + - + - - - + - + - + - + - - - - - - - + - + - + - + - - - + - + - + - + - - - + - + - - - + - + - + - + - + - - - - - - - - - - + - - - + + + - + + - + - - - + - + - - + + - + - + + + - + - + - + - + - + - + - - - - - - + - - - + + + - - + - - - + + + + - - + - - + + - + + + - + - - + + - + - + - + - + - + - + - + - + - + - - - + - + - - - - - + - + - - - + + + - + - + - + - + - + - + - + - + - - - - + - - + + + - + - + - + - + - + - - - - - + - + - + + + - + - + - + - - - + + + + - + + + + + + + + + + - + - + - + - - + + - + + + + + + - - + - - + + + + + + - + - + + + - + - - + + + + + - - - + + + - - + - - + + - + - + - + - + + + - + - + + + - + - - + + + + + - - - - + - + - + - + - - - + - + - - - - - + - + - - + + - + - - + + - + - + - + - - - + + - - - + + + + + + + - + + - + + + + - + + - + - + + + - + - + - + - - - - - - + + + - - - + + + - - - + + + - - + - + - + - + + + - + - + - + - + - + - - - - - - - - - - - - - - + + - + - - - + + - + + - + - + + + - + - + - + - + + + - + - - - - - + + - + + + + - + - - - + - + - + - + - + + + + + + + - + - + - + - + - + - + - + - + - + - - - - - + + + + + + - - - + + + - - - + + + - - - - - + + + + - + - + - + - + - + - + - + - - - - - - - - - + + - + + - + - + - + - + + + - + - + - + - - + + + + + - + + - + - - + + + + + + - + - + - + - + - + - + - + - + - + - - - + - + - + - + - - + + + + - + - + - + - - - - + + + - + + - + - + - + - - - + + - - - - - - - + + + + - + - - + + - + - + - + - + - + - + - + - + - + - - - + + + + + - + - - - - - - - - + + + - + + - + - + + + - + - + + + - + - + - + - + - + - - - + + + + + + + + - - - + + + - - - - - + + + - + + - + - - - + + - + + + + + + + + - + - - - - - + + + - + - - + + - + - + - + - + - + - + + + - + - + - + - + - - - - + - - + - + - + - + - + - + - - - - - + - + - + - + - + - + - + - + - - - + + + + - - - + + + - - - + + + - + + - + - - - + + - + + - + - + + + - + - + - + - + - + - + + + - + - + + + - + - + + + - + - + - + - - + + + - - + - + - + - + + + + - + + - + - + - + - + + + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - - - + + + + + - + - - + + - + - - - + - + - - - + + - - - + + + - - - + + + - + + - + - + - + - + + + - + - - - + + - + + - + - + - + - + + + - + - + - + - + - + - + - + - + - + - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - - + + - - - + + + - + + + + + + - + - + - + - + + + - + - + - - - - + + + - + + - + - + - + - + - + - + - + - + - + - - - - - + + + + - + + - + - + - + - + - + - - - + + + + - + + - + - + - + - + - + - + - + - + + + + + + + - + - + - + - + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + - + + - + - + + + + + + + - + - + + + - + - + - + - + - + - + - + - + + + - + - + - + - + - + - + - + - - - - - - - + + + + + + + + + - + - - - + + + - + - + - + - + - + - + - + - - - + + + + + - + - + + + - + + + + - + + + + + + - + - + + + - + - + - + - + + + + + - + - + - + + + + + + + + + - + - + - + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + Config + + + + + + <static>+isDebugMode: bool + <static>+defaultLocale: Set<String> + <static>+supportedLocales: Map<String, String> + <static>+newStudyId: String + <static>+newModelId: String + <static>+minSplashTime: int + <static>+formAutosaveDebounce: int + + + - - - + + - + RoutingIntents - + <static>+root: RoutingIntent <static>+studies: RoutingIntent @@ -6564,17 +6588,17 @@ - - - + + + - + RoutingIntent - + +route: GoRoute +params: Map<String, String> @@ -6587,7 +6611,7 @@ - + -dynamic _validateRoute() +bool matches() @@ -6597,9 +6621,9 @@ - + - + RoutingIntent Function(String) @@ -6608,9 +6632,9 @@ - + - + RoutingIntent Function(String, String) @@ -6619,9 +6643,9 @@ - + - + RoutingIntent Function(String, {String? appRoute}) @@ -6630,9 +6654,9 @@ - + - + RoutingIntent Function(Exception) @@ -6641,9 +6665,9 @@ - + - + GoRoute @@ -6652,16 +6676,16 @@ - - + + - + RoutingIntentDispatch - + +index: int <static>+values: List<RoutingIntentDispatch> @@ -6673,9 +6697,9 @@ - + - + Equatable @@ -6684,9 +6708,9 @@ - + - + Enum @@ -6695,16 +6719,16 @@ - - + + - + GoRouteParamEnum - + +String toRouteParam() +String toShortString() @@ -6714,16 +6738,16 @@ - - + + - + RouterKeys - + <static>+studyKey: ValueKey<String> <static>+authKey: ValueKey<String> @@ -6733,9 +6757,9 @@ - + - + ValueKey @@ -6744,16 +6768,16 @@ - - + + - + RouteParams - + <static>+studiesFilter: String <static>+studyId: String @@ -6766,17 +6790,17 @@ - - - + + + - + RouterConf - + <static>+router: GoRouter <static>+routes: List<GoRoute> @@ -6785,7 +6809,7 @@ - + <static>+GoRoute route() @@ -6794,9 +6818,9 @@ - + - + GoRouter @@ -6805,16 +6829,16 @@ - - + + - + StudyFormRouteArgs - + +studyId: String @@ -6823,16 +6847,16 @@ - - + + - + QuestionFormRouteArgs - + +questionId: String @@ -6841,9 +6865,9 @@ - + - + ScreenerQuestionFormRouteArgs @@ -6852,16 +6876,16 @@ - - + + - + ConsentItemFormRouteArgs - + +consentId: String @@ -6870,16 +6894,16 @@ - - + + - + MeasurementFormRouteArgs - + +measurementId: String @@ -6888,16 +6912,16 @@ - - + + - + SurveyQuestionFormRouteArgs - + +questionId: String @@ -6906,16 +6930,16 @@ - - + + - + InterventionFormRouteArgs - + +interventionId: String @@ -6924,16 +6948,16 @@ - - + + - + InterventionTaskFormRouteArgs - + +taskId: String @@ -6942,9044 +6966,9074 @@ - - + + - + ReportItemFormRouteArgs - + +sectionId: String - - - - - - - - Assets - - - - - - <static>+logoWide: String - - - - - - - - - - - - - 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 - - - - - - - - - - - ResultTypes - - - - - - - - - - - - MeasurementResultTypes - - - - - - <static>+questionnaire: String - <static>+values: List<String> - - - - - - - - + + + + - - - InterventionResultTypes + + + ISyncIndicatorViewModel - - - <static>+checkmarkTask: String - <static>+values: List<String> + + + +isDirty: bool + +lastSynced: DateTime? - - - - + + + + - - - StudyExportData + + + SyncIndicator - - - +study: Study - +measurementsData: List<Map<String, dynamic>> - +interventionsData: List<Map<String, dynamic>> - +isEmpty: bool + + + +state: AsyncValue<T> + +lastSynced: DateTime? + +isDirty: bool + +animationDuration: int + +iconSize: double - - - + + + - - - Study + + + AsyncValue - - - - - - - - ModelEvent - - + + + + + - - - +modelId: String - +model: T + + + EmptyBody - - - - - - - - IsFetched + + + +icon: IconData? + +leading: Widget? + +leadingSpacing: double? + +title: String? + +description: String? + +button: Widget? - - - - - - - - IsSaving + + + +Widget build() - - - + + + - - - IsSaved + + + IconData - - - + + + - - - IsDeleted + + + Widget - - - - - - - - SupabaseClientDependant - - + + + - - - +supabaseClient: SupabaseClient + + + NullHelperDecoration - - - + + + - - - SupabaseClient + + + InputDecoration - - - - + + + + - - - SupabaseQueryError + + + Search - - - +statusCode: String? - +message: String - +details: dynamic + + + +onQueryChanged: dynamic Function(String) + +searchController: SearchController? + +hintText: String? + +initialText: String? - - - + + + - - - Exception + + + dynamic Function(String) - - - - + + + + - - - SupabaseQueryMixin + + + SearchController - - - +dynamic deleteAll() - +dynamic getAll() - +dynamic getById() - +dynamic getByColumn() - +List<T> deserializeList() - +T deserializeObject() + + + +setText: void Function(String) - - - - - - - - IAppRepository - - + + + - - - +dynamic fetchAppConfig() - +void dispose() + + + void Function(String) - - - - - + + + + + - - - AppRepository + + + ConstrainedWidthFlexible - - - +apiClient: StudyUApi + + + +minWidth: double + +maxWidth: double + +flex: int + +flexSum: int + +child: Widget + +outerConstraints: BoxConstraints - - - +dynamic fetchAppConfig() - +void dispose() + + + +Widget build() + -double _getWidth() - - - - - - - - StudyUApi - - + + + - - - +dynamic saveStudy() - +dynamic fetchStudy() - +dynamic getUserStudies() - +dynamic deleteStudy() - +dynamic saveStudyInvite() - +dynamic fetchStudyInvite() - +dynamic deleteStudyInvite() - +dynamic deleteParticipants() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() + + + BoxConstraints - - - - - + + + + + - - - WrappedModel + + + AsyncValueWidget - - - -_model: T - +asyncValue: AsyncValue<T> - +isLocalOnly: bool - +isDirty: bool - +isDeleted: bool - +lastSaved: DateTime? - +lastFetched: DateTime? - +lastUpdated: DateTime? - +model: T + + + +value: AsyncValue<T> + +data: Widget Function(T) + +error: Widget Function(Object, StackTrace?)? + +loading: Widget Function()? + +empty: Widget Function()? - - - +dynamic markWithError() - +dynamic markAsLoading() - +dynamic markAsFetched() - +dynamic markAsSaved() + + + +Widget build() + -Widget _buildDataOrEmptyWidget() + -Widget _defaultError() + -Widget _defaultLoad() - - - + + + - - - AsyncValue + + + Widget Function(T) - - - + + + - - - ModelRepositoryException + + + Widget Function(Object, StackTrace?)? - - - + + + - - - ModelNotFoundException + + + Widget Function()? - - - - + + + + + - - - IModelRepository + + + ActionPopUpMenuButton - - - +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() + + + +actions: List<ModelAction<dynamic>> + +triggerIconColor: Color? + +triggerIconColorHover: Color? + +triggerIconSize: double + +disableSplashEffect: bool + +hideOnEmpty: bool + +orientation: Axis + +elevation: double? + +splashRadius: double? + +enabled: bool + +position: PopupMenuPosition + + + + + + +Widget build() + -Widget _buildPopupMenu() - - - - + + + - - - IModelActionProvider + + + Color - - - +List<ModelAction<dynamic>> availableActions() + + + + + + + + Axis - - - - + + + - - - IModelRepositoryDelegate + + + PopupMenuPosition - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +T createNewInstance() - +T createDuplicate() - +dynamic onError() + + + + + + + + + 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 - - - - - + + + - - - ModelRepository + + + void Function()? - - - +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() + + + dynamic Function()? - - - + + + - - - BehaviorSubject + + + EdgeInsets - - - - - + + + - - - IAuthRepository + + + Size - - - +allowPasswordReset: bool - +currentUser: User? - +isLoggedIn: bool - +session: Session? - +serializedSession: String? + + + + + + + + + Hyperlink - - - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +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? - - - + + + - - - User + + + TextStyle - - - + + + + + - - - Session + + + DismissButton - - - - - - - - - IAppDelegate + + + +onPressed: void Function()? + +text: String? - - - +dynamic onAppStart() + + + +Widget build() - - - - - + + + + - - - AuthRepository + + + FormTableRow - - - +supabaseClient: SupabaseClient - +sharedPreferences: SharedPreferences - +allowPasswordReset: bool - +authClient: GoTrueClient - +session: Session? - +serializedSession: String? - +currentUser: User? - +isLoggedIn: bool + + + +label: String? + +labelBuilder: Widget Function(BuildContext)? + +labelStyle: TextStyle? + +labelHelpText: String? + +input: Widget + +control: AbstractControl<dynamic>? + +layout: FormTableRowLayout? - - - -void _registerAuthListener() - +dynamic signUp() - +dynamic signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic updateUser() - +void dispose() - +dynamic onAppStart() + + + + + + + + Widget Function(BuildContext)? - - - + + + - - - SharedPreferences + + + AbstractControl - - - + + + + - - - GoTrueClient + + + FormTableRowLayout + + + + + + +index: int + <static>+values: List<FormTableRowLayout> + <static>+vertical: FormTableRowLayout + <static>+horizontal: FormTableRowLayout - - - - + + + + + - - - IInviteCodeRepository + + + FormTableLayout - - - +dynamic isCodeAlreadyUsed() + + + +rows: List<FormTableRow> + +columnWidths: Map<int, TableColumnWidth> + +rowDivider: Widget? + +rowLayout: FormTableRowLayout? + +rowLabelStyle: TextStyle? + + + + + + +Widget build() - - - - - + + + + + - - - InviteCodeRepository + + + FormSectionHeader - - - +studyId: String - +ref: ProviderRef<dynamic> - +apiClient: StudyUApi - +authRepository: IAuthRepository - +studyRepository: IStudyRepository - +study: Study + + + +title: String + +titleTextStyle: TextStyle? + +helpText: String? + +divider: bool + +helpTextDisabled: bool - - - +String getKey() - +dynamic isCodeAlreadyUsed() - +List<ModelAction<dynamic>> availableActions() - +dynamic emitUpdate() + + + +Widget build() - - - + + + + + - - - ProviderRef + + + FormLabel - - - - - - - - - IStudyRepository + + + +labelText: String? + +helpText: String? + +labelTextStyle: TextStyle? + +layout: FormTableRowLayout? - - - +dynamic launch() - +dynamic deleteParticipants() + + + +Widget build() - - - - - + + + + - - - InviteCodeRepositoryDelegate + + + ActionMenuType - - - +study: Study - +apiClient: StudyUApi - +studyRepository: IStudyRepository + + + +index: int + <static>+values: List<ActionMenuType> + <static>+inline: ActionMenuType + <static>+popup: ActionMenuType - - - +dynamic fetch() - +dynamic fetchAll() - +dynamic save() - +dynamic delete() - +dynamic onError() - +StudyInvite createDuplicate() - +StudyInvite createNewInstance() + + + + + + + + ReactiveCustomColorPicker - - - - - + + + - - - StudyRepository + + + ReactiveFormField - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: ProviderRef<dynamic> - +sortCallback: void Function()? - - + + + + + - - - +String getKey() - +dynamic deleteParticipants() - +dynamic launch() - +List<ModelAction<dynamic>> availableActions() + + + NavbarTab - - - - - - - - void Function()? + + + +title: String + +intent: RoutingIntent? + +index: int + +enabled: bool - - - - - + + + + - - - StudyRepositoryDelegate + + + TabbedNavbar - - - +apiClient: StudyUApi - +authRepository: IAuthRepository + + + +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? - - - +dynamic fetchAll() - +dynamic fetch() - +dynamic save() - +dynamic delete() - +dynamic onError() - +Study createNewInstance() - +Study createDuplicate() + + + + + + + + BoxDecoration - - - + + + - - - APIException + + + void Function(int, T)? - - - + + + - - - StudyNotFoundException + + + TabBarIndicatorSize - - - + + + + - - - MeasurementNotFoundException + + + Collapsible - - - - - - - - QuestionNotFoundException + + + +contentBuilder: Widget Function(BuildContext, bool) + +headerBuilder: Widget Function(BuildContext, bool)? + +title: String? + +isCollapsed: bool - - - + + + - - - ConsentItemNotFoundException + + + Widget Function(BuildContext, bool) - - - + + + - - - InterventionNotFoundException + + + Widget Function(BuildContext, bool)? - - - + + + + + - - - InterventionTaskNotFoundException + + + StudyULogo - - - - + + + +onTap: void Function()? + + - - - ReportNotFoundException + + + +Widget build() - - - + + + + - - - ReportSectionNotFoundException + + + FormSideSheetTab + + + + + + +formViewBuilder: Widget Function(T) - - - + + + + - - - StudyInviteNotFoundException + + + SidesheetTab + + + + + + +builder: Widget Function(BuildContext) - - - + + + - - - UserNotFoundException + + + Widget Function(BuildContext) - - - - - + + + + - - - StudyUApiClient + + + Sidesheet - - - +supabaseClient: SupabaseClient - <static>+studyColumns: List<String> - <static>+studyWithParticipantActivityColumns: List<String> - +testDelayMilliseconds: int + + + <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)? - - - +dynamic deleteParticipants() - +dynamic getUserStudies() - +dynamic fetchStudy() - +dynamic deleteStudy() - +dynamic saveStudy() - +dynamic fetchStudyInvite() - +dynamic saveStudyInvite() - +dynamic deleteStudyInvite() - +dynamic fetchAppConfig() - +dynamic fetchUser() - +dynamic saveUser() - -dynamic _awaitGuarded() - -dynamic _apiException() - -dynamic _testDelay() + + + + + + + + Widget Function(Widget)? - - - + + + + - - - StudyLaunched + + + MouseEventsRegion + + + + + + +onTap: void Function()? + +onHover: void Function(PointerHoverEvent)? + +onEnter: void Function(PointerEnterEvent)? + +onExit: void Function(PointerExitEvent)? + +autoselectCursor: bool + +cursor: SystemMouseCursor + <static>+defaultCursor: SystemMouseCursor + +autoCursor: SystemMouseCursor - - - - - + + + - - - IUserRepository + + + void Function(PointerHoverEvent)? - - - +user: StudyUUser + + + + + + + + void Function(PointerEnterEvent)? - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() + + + + + + + + void Function(PointerExitEvent)? - - - + + + - - - StudyUUser + + + SystemMouseCursor - - - - - + + + + + - - - UserRepository + + + FormControlLabel - - - +apiClient: StudyUApi - +authRepository: IAuthRepository - +ref: Ref<Object?> - +user: StudyUUser + + + +formControl: AbstractControl<dynamic> + +text: String + +isClickable: bool + +textStyle: TextStyle? + +onClick: void Function(AbstractControl<dynamic>)? - - - +dynamic fetchUser() - +dynamic saveUser() - +dynamic updatePreferences() + + + +Widget build() - - - + + + - - - Ref + + + void Function(AbstractControl<dynamic>)? - - - - + + + + - - - PreferenceAction + + + IWithBanner - - - +index: int - <static>+values: List<PreferenceAction> - <static>+pin: PreferenceAction - <static>+pinOff: PreferenceAction + + + +Widget? banner() - - - - + + + + - - - Config + + + BannerBox - - - <static>+isDebugMode: bool - <static>+defaultLocale: Set<String> - <static>+supportedLocales: Map<String, String> - <static>+newStudyId: String - <static>+newModelId: String - <static>+minSplashTime: int - <static>+formAutosaveDebounce: int + + + +prefixIcon: Widget? + +body: Widget + +style: BannerStyle + +padding: EdgeInsets? + +noPrefix: bool + +dismissable: bool + +isDismissed: bool? + +onDismissed: dynamic Function()? + +dismissIconSize: double - - - - - - - - - SuppressedBehaviorSubject - - + + + + - - - +subject: BehaviorSubject<T> - +didSuppressInitialEvent: bool - -_controller: StreamController<T> + + + BannerStyle - - - -StreamController<T> _buildDerivedController() - +dynamic close() + + + +index: int + <static>+values: List<BannerStyle> + <static>+warning: BannerStyle + <static>+info: BannerStyle + <static>+error: BannerStyle - - - + + + + + - - - StreamController + + + SecondaryButton - - - - - - - - - IProviderArgsResolver + + + +text: String + +icon: IconData? + +isLoading: bool + +onPressed: void Function()? - - - +R provide() + + + +Widget build() - - - - - + + + + + - - - CombinedStreamNotifier + + + IconPack - - - -_subscriptions: List<StreamSubscription<dynamic>> + + + <static>+defaultPack: List<IconOption> + <static>+material: List<IconOption> - - - +void dispose() + + + <static>+IconOption? resolveIconByName() - - - + + + + + - - - ChangeNotifier + + + IconOption - - - - - - - - - Time + + + +name: String + +icon: IconData? + +isEmpty: bool + +props: List<Object?> - - - <static>+dynamic fromTimeOfDay() - +Map<String, dynamic> toJson() - <static>+Time fromJson() + + + +String toJson() + <static>+IconOption fromJson() - - - + + + - - - TimeOfDay + + + ReactiveIconPicker - - - - + + + - - - TimeValueAccessor + + + ReactiveFocusableFormField - - - +String modelToViewValue() - +Time? viewToModelValue() - -String _addLeadingZeroIfNeeded() + + + + + + + + + + IconPicker - - - - + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +onSelect: void Function(IconOption)? + +galleryIconSize: double? + +selectedIconSize: double? + +focusNode: FocusNode? + +isDisabled: bool + + - - - ControlValueAccessor + + + +Widget build() - - - - - + + + - - - Tuple + + + void Function(IconOption)? - - - +first: T1 - +second: T2 - +props: List<Object?> - - + + + + - - - +Map<String, dynamic> toJson() - <static>+Tuple<dynamic, dynamic> fromJson() - +Tuple<T1, T2> copy() - +Tuple<T1, T2> copyWith() + + + FocusNode - - - - - + + + + + - - - OptimisticUpdate + + + IconPickerField - - - +applyOptimistic: void Function() - +apply: dynamic Function() - +rollback: void Function() - +onUpdate: void Function()? - +onError: void Function(Object, StackTrace?)? - +rethrowErrors: bool - +runOptimistically: bool - +completeFutureOptimistically: bool + + + +iconOptions: List<IconOption> + +selectedOption: IconOption? + +selectedIconSize: double? + +galleryIconSize: double? + +onSelect: void Function(IconOption)? + +focusNode: FocusNode? + +isDisabled: bool - - - +dynamic execute() - -void _runUpdateHandlerIfAny() + + + +Widget build() - - - + + + + + - - - void Function() + + + IconPickerGallery - - - - - - - - dynamic Function() + + + +iconOptions: List<IconOption> + +onSelect: void Function(IconOption)? + +iconSize: double - - - - - - - - void Function(Object, StackTrace?)? + + + +Widget build() - - - - - + + + + + - - - JsonFileLoader + + + SingleColumnLayout - - - +jsonAssetsPath: String + + + <static>+defaultConstraints: BoxConstraints + <static>+defaultConstraintsNarrow: BoxConstraints + +body: Widget + +header: Widget? + +stickyHeader: bool + +constraints: BoxConstraints? + +scroll: bool + +padding: EdgeInsets? - - - +dynamic loadJson() - +dynamic parseJsonMapFromAssets() - +dynamic parseJsonListFromAssets() + + + <static>+dynamic fromType() - - - - - + + + + - - - NumericalRangeFormatter + + + SingleColumnLayoutType - - - +min: int? - +max: int? + + + +index: int + <static>+values: List<SingleColumnLayoutType> + <static>+boundedWide: SingleColumnLayoutType + <static>+boundedNarrow: SingleColumnLayoutType + <static>+stretched: SingleColumnLayoutType + <static>+split: SingleColumnLayoutType - - - +TextEditingValue formatEditUpdate() + + + + + + + + + FormConsumerWidget - - - - - - - - TextInputFormatter + + + +Widget build() - - - - + + + + - - - StudySequenceFormatter + + + FormConsumerRefWidget - - - +TextEditingValue formatEditUpdate() + + + +Widget build() - - - - - + + + + - - - CountWhereValidator + + + FormScaffold - - - +predicate: bool Function(T?) - +minCount: int? - +maxCount: int? - <static>+kValidationMessageMinCount: String - <static>+kValidationMessageMaxCount: String + + + +formViewModel: T + +actions: List<Widget>? + +body: Widget + +drawer: Widget? + +actionsSpacing: double + +actionsPadding: double - - - +Map<String, dynamic>? validate() + + + + + + + + + + StandardDialog - - - - + + + +title: Widget? + +titleText: String? + +body: Widget + +actionButtons: List<Widget> + +backgroundColor: Color? + +borderRadius: double? + +width: double? + +height: double? + +minWidth: double + +minHeight: double + +maxWidth: double? + +maxHeight: double? + +padding: EdgeInsets + + - - - bool Function(T?) + + + +Widget build() - - - + + + + + - - - Validator + + + HtmlStylingBanner - - - - - - - - - Patterns + + + +isDismissed: bool + +onDismissed: dynamic Function()? - - - <static>+timeFormatString: String - <static>+emailFormatString: String - <static>+url: String + + + +Widget build() - - - - + + + + - - - ModelAction + + + StandardTableColumn - - - +type: T - +label: String - +icon: IconData? - +onExecute: Function - +isAvailable: bool - +isDestructive: bool + + + +label: String + +tooltip: String? + +columnWidth: TableColumnWidth + +sortable: bool + +sortAscending: bool? + +sortableIcon: Widget? - - - + + + - - - IconData + + + TableColumnWidth - - - - + + + + - - - IListActionProvider + + + StandardTable - - - +void onSelectItem() - +void onNewItem() + + + +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 - - - - + + + - - - ModelActionType + + + void Function(T) - - - +index: int - <static>+values: List<ModelActionType> - <static>+edit: ModelActionType - <static>+delete: ModelActionType - <static>+remove: ModelActionType - <static>+duplicate: ModelActionType - <static>+clipboard: ModelActionType - <static>+primary: ModelActionType + + + + + + + + List<ModelAction<dynamic>> Function(T, int)? - - - - + + + - - - FileFormatEncoder + + + int Function(T, T)? - - - +dynamic encodeAsync() - +String encode() - +dynamic call() + + + + + + + + TableRow Function(BuildContext, List<StandardTableColumn>)? - - - - + + + + - - - CSVStringEncoder + + + StandardTableStyle - - - +String encode() + + + +index: int + <static>+values: List<StandardTableStyle> + <static>+plain: StandardTableStyle + <static>+material: StandardTableStyle - - - - + + + + - - - JsonStringEncoder + + + TwoColumnLayout - - - +String encode() + + + <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 - - - - + + + - - - SerializableColor + + + VerticalDivider - - - +Map<String, dynamic> toJson() - <static>+SerializableColor fromJson() + + + + + + + + + + ActionMenuInline - - - - + + + +actions: List<ModelAction<dynamic>> + +iconSize: double? + +visible: bool + +splashRadius: double? + +paddingVertical: double? + +paddingHorizontal: double? + + - - - Color + + + +Widget build() - - - - - + + + + + - - - ExecutionLimiter + + + TextParagraph - - - +milliseconds: int - <static>-_timer: Timer? + + + +text: String? + +style: TextStyle? + +selectable: bool + +span: List<TextSpan>? - - - +void dispose() + + + +Widget build() - - - + + + + - - - Timer + + + SplashPage + + + + + + +Widget build() - - - - - + + + + + - - - Debouncer + + + ErrorPage - - - +leading: bool - +cancelUncompleted: bool - -_uncompletedFutureOperation: CancelableOperation<dynamic>? + + + +error: Exception? - - - +dynamic call() + + + +Widget build() - - - + + + - - - CancelableOperation + + + ConsumerWidget - - - - + + + + + - - - Throttler + + + Badge - - - +dynamic call() + + + +icon: IconData? + +color: Color? + +borderRadius: double + +label: String + +type: BadgeType + +padding: EdgeInsets + +iconSize: double? + +labelStyle: TextStyle? + +center: bool - - - - - - - - - AccountSettingsDialog + + + +Widget build() + -Color? _getBackgroundColor() + -Color _getBorderColor() + -Color? _getLabelColor() - - - +Widget build() + + + + + + + + + BadgeType - - - - - - - - ConsumerWidget + + + +index: int + <static>+values: List<BadgeType> + <static>+filled: BadgeType + <static>+outlined: BadgeType + <static>+outlineFill: BadgeType + <static>+plain: BadgeType - - - - - + + + + + - - - AppController + + + IndicatorRangeSliderThumbShape - - - +sharedPreferences: SharedPreferences - +appDelegates: List<IAppDelegate> - -_delayedFuture: dynamic - +isInitialized: dynamic + + + +buildContext: BuildContext + +start: T + +end: T - - - +dynamic onAppStart() - -dynamic _callDelegates() + + + +Size getPreferredSize() + +void paint() - - - - + + + - - - StudiesFilter + + + BuildContext - - - +index: int - <static>+values: List<StudiesFilter> + + + + + + + + RangeSliderThumbShape - - - - + + + + + - - - StudiesTableItem + + + HelpIcon - - - +study: Study - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +actions: List<ModelAction<dynamic>> - +columnSizes: List<StudiesTableColumnSize> - +isPinned: bool - +onPinnedChanged: void Function(Study, bool)? - +onTap: void Function(Study)? + + + +tooltipText: String? - - - - - - - - void Function(Study, bool)? + + + +Widget build() - - - + + + + - - - void Function(Study)? + + + UnderConstruction + + + + + + +Widget build() - - - - + + + + - - - StudiesTableColumnHeader + + + NotificationDispatcher - - - +title: String - +sortable: bool - +sortAscending: bool - +sortingActive: bool - +onSort: void Function()? + + + +child: Widget? + +snackbarInnerPadding: double + +snackbarWidth: double? + +snackbarBehavior: SnackBarBehavior + +snackbarDefaultDuration: int - - - - - + + + - - - DashboardScaffold + + + SnackBarBehavior - - - <static>+compactWidthThreshold: double - +body: Widget + + + + + + + + + + NotificationIntent - - - +Widget build() + + + +message: String? + +customContent: Widget? + +icon: IconData? + +actions: List<NotificationAction>? + +type: NotificationType - - - - - - - - Widget + + + +void register() - - - - + + + + - - - DashboardScreen + + + NotificationType - - - +filter: StudiesFilter? + + + +index: int + <static>+values: List<NotificationType> + <static>+snackbar: NotificationType + <static>+alert: NotificationType + <static>+custom: NotificationType - - - - - - - - - StudiesTableColumnSize - - + + + + - - - +collapsed: bool - +flex: int? - +width: double? + + + NotificationAction - - - +Widget createContainer() + + + +label: String + +onSelect: dynamic Function() + +isDestructive: bool - - - - - + + + - - - StudiesTable + + + dynamic Function() - - - +itemHeight: double - +itemPadding: double - +rowSpacing: double - +columnSpacing: double - +compactWidthThreshold: double - +superCompactWidthThreshold: double - +compactStatTitleThreshold: double - +studies: List<Study> - +onSelect: void Function(Study) - +getActions: List<ModelAction<dynamic>> Function(Study) - +emptyWidget: Widget - +pinnedStudies: Iterable<String> - +dashboardController: DashboardController + + + + + + + + + SnackbarIntent - - - +Widget build() - -Widget _buildColumnHeader() + + + +duration: int? - - - + + + + - - - void Function(Study) + + + AlertIntent - - - - - - - - List<ModelAction<dynamic>> Function(Study) + + + +title: String + +dismissOnAction: bool + +isDestructive: dynamic - - - - - - - - - DashboardController - - + + + + - - - +studyRepository: IStudyRepository - +authRepository: IAuthRepository - +userRepository: IUserRepository - +router: GoRouter - -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? - +searchController: SearchController - +isSortAscending: bool + + + INotificationService - - - -dynamic _subscribeStudies() - +dynamic setSearchText() - +dynamic setStudiesFilter() - +dynamic onSelectStudy() - +dynamic onClickNewStudy() - +dynamic pinStudy() - +dynamic pinOffStudy() - +void setSorting() - +void filterStudies() - +void sortStudies() - +bool isSortingActiveForColumn() - +bool isPinned() - +List<ModelAction<dynamic>> availableActions() - +void dispose() + + + +void showMessage() + +void show() + +Stream<NotificationIntent> watchNotifications() + +void dispose() - - - - + + + + + - - - StudiesTableColumn + + + NotificationService - - - +index: int - <static>+values: List<StudiesTableColumn> - <static>+pin: StudiesTableColumn - <static>+title: StudiesTableColumn - <static>+status: StudiesTableColumn - <static>+participation: StudiesTableColumn - <static>+createdAt: StudiesTableColumn - <static>+enrolled: StudiesTableColumn - <static>+active: StudiesTableColumn - <static>+completed: StudiesTableColumn - <static>+action: StudiesTableColumn + + + -_streamController: BehaviorSubject<NotificationIntent> + + + + + + +Stream<NotificationIntent> watchNotifications() + +void showMessage() + +void show() + +void dispose() - - - + + + - - - StreamSubscription + + + BehaviorSubject - - - - + + + + - - - SearchController + + + Notifications - - - +setText: void Function(String) + + + <static>+credentialsInvalid: SnackbarIntent + <static>+userAlreadyRegistered: SnackbarIntent + <static>+passwordReset: SnackbarIntent + <static>+passwordResetSuccess: SnackbarIntent + <static>+studyDeleted: SnackbarIntent + <static>+inviteCodeDeleted: SnackbarIntent + <static>+inviteCodeClipped: SnackbarIntent + <static>+studyDeleteConfirmation: AlertIntent - - - - + + + + - - - StudyMonitorScreen + + + NotificationDefaultActions - - - +Widget build() + + + <static>+cancel: NotificationAction - - - - - + + + + - - - StudyPageWidget + + + IClipboardService - - - +studyId: String + + + +dynamic copy() - - - +Widget? banner() + + + + + + + + + ClipboardService - - - - - - - - App + + + +dynamic copy() - - - + + + + - - - AppContent + + + Assets + + + + + + <static>+logoWide: String - - - - - + + + + + - - - StudyInvitesTable + + + SignupForm - - - +invites: List<StudyInvite> - +onSelect: void Function(StudyInvite) - +getActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getInlineActions: List<ModelAction<dynamic>> Function(StudyInvite) - +getIntervention: Intervention? Function(String) - +getParticipantCountForInvite: int Function(StudyInvite) + + + +formKey: AuthFormKey - - - +Widget build() - -List<Widget> _buildRow() + + + +Widget build() + -dynamic _onClickTermsOfUse() + -dynamic _onClickPrivacyPolicy() - - - + + + + - - - void Function(StudyInvite) + + + AuthFormKey - - - - - - - - List<ModelAction<dynamic>> Function(StudyInvite) + + + +index: int + <static>+values: List<AuthFormKey> + <static>+login: AuthFormKey + <static>+signup: AuthFormKey + <static>+passwordForgot: AuthFormKey + <static>+passwordRecovery: AuthFormKey + <static>-_loginSubmit: AuthFormKey + <static>-_signupSubmit: AuthFormKey - - - + + + + + - - - Intervention? Function(String) + + + AuthFormController - - - - + + + +authRepository: IAuthRepository + +sharedPreferences: SharedPreferences + +notificationService: INotificationService + +router: GoRouter + +emailControl: FormControl<String> + +passwordControl: FormControl<String> + +passwordConfirmationControl: FormControl<String> + +rememberMeControl: FormControl<bool> + +termsOfServiceControl: FormControl<bool> + <static>+authValidationMessages: Map<String, String Function(dynamic)> + +loginForm: FormGroup + +signupForm: FormGroup + +passwordForgotForm: FormGroup + +passwordRecoveryForm: FormGroup + +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> + -_formKey: AuthFormKey + +shouldRemember: bool + +formKey: AuthFormKey + +form: FormGroup + + - - - int Function(StudyInvite) + + + -dynamic _getFormFor() + -dynamic _onChangeFormKey() + +dynamic resetControlsFor() + -dynamic _forceValidationMessages() + +dynamic signUp() + -dynamic _signUp() + +dynamic signIn() + -dynamic _signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic sendPasswordResetLink() + +dynamic recoverPassword() + +dynamic updateUser() + -dynamic _readDebugUser() + -void _setRememberMe() + -void _delRememberMe() + -void _initRememberMe() - - - - - + + + + + - - - InviteCodeFormView + + + IAuthRepository - - - +formViewModel: InviteCodeFormViewModel + + + +allowPasswordReset: bool + +currentUser: User? + +isLoggedIn: bool + +session: Session? + +serializedSession: String? - - - +Widget build() - -List<FormTableRow> _conditionalInterventionRows() + + + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + +void dispose() - - - - - + + + - - - InviteCodeFormViewModel + + + SharedPreferences - - - +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>? + + + + + + + + FormControl - - - +void initControls() - -dynamic _uniqueInviteCode() - +void regenerateCode() - -String _generateCode() - +StudyInvite buildFormData() - +void setControlsFrom() - +dynamic save() + + + + + + + + FormGroup - - - - + + + + - - - FormConsumerWidget + + + IFormGroupController - - - +Widget build() + + + +form: FormGroup - - - - - + + + + + - - - EnrolledBadge + + + PasswordForgotForm - - - +enrolledCount: int + + + +formKey: AuthFormKey - - - +Widget build() + + + +Widget build() - - - + + + + - - - FormControl + + + EmailTextField - - - - - - - - FormGroup + + + +labelText: String + +hintText: String? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - - - + + + + - - - FormViewModel + + + PasswordTextField - - - -_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>> + + + +labelText: String + +hintText: String? + +onSubmitted: dynamic Function(FormControl<dynamic>)? + +formControlName: String? + +formControl: FormControl<dynamic>? - - - -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() + + + + + + + + dynamic Function(FormControl<dynamic>)? - - - - - + + + + + - - - StudyRecruitController + + + PasswordRecoveryForm - - - +inviteCodeRepository: IInviteCodeRepository - -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? + + + +formKey: AuthFormKey - - - -dynamic _subscribeInvites() - +Intervention? getIntervention() - +int getParticipantCountForInvite() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void dispose() + + + +Widget build() - - - - - + + + + - - - StudyBaseController + + + AuthScaffold - - - +studyId: String - +studyRepository: IStudyRepository - +router: GoRouter - +studySubscription: StreamSubscription<WrappedModel<Study>>? + + + +body: Widget + +formKey: AuthFormKey + +leftContentMinWidth: double + +leftPanelMinWidth: double + +leftPanelPadding: EdgeInsets - - - +dynamic subscribeStudy() - +dynamic onStudySubscriptionUpdate() - +dynamic onStudySubscriptionError() - +void dispose() + + + + + + + + + StudyUJobsToBeDone + + + + + + +Widget build() - - - - + + + + + - - - StudyRecruitScreen + + + LoginForm - - - +Widget build() - -Widget _inviteCodesSectionHeader() - -Widget _newInviteCodeButton() - -dynamic _onSelectInvite() + + + +formKey: AuthFormKey - - - - - - - - FormInvalidException + + + +Widget build() - - - - + + + + - - - FormConfigException + + + IAppDelegate - - - +message: String? + + + +dynamic onAppStart() - - - - + + + + + - - - IFormViewModelDelegate + + + AppController + + + + + + +sharedPreferences: SharedPreferences + +appDelegates: List<IAppDelegate> + -_delayedFuture: dynamic + +isInitialized: dynamic - - - +dynamic onSave() - +void onCancel() + + + +dynamic onAppStart() + -dynamic _callDelegates() - - - - + + + - - - IFormGroupController + + + App - - - +form: FormGroup + + + + + + + + AppContent - - - - + + + + - - - FormControlOption + + + AppStatus - - - +value: T - +label: String - +description: String? - +props: List<Object?> + + + +index: int + <static>+values: List<AppStatus> + <static>+initializing: AppStatus + <static>+initialized: AppStatus - - - - + + + + - - - FormMode + + + StudyAnalyzeScreen - - - +index: int - <static>+values: List<FormMode> - <static>+create: FormMode - <static>+readonly: FormMode - <static>+edit: FormMode + + + +Widget? banner() + +Widget build() - - - + + + + + - - - FormValidationSetEnum + + + StudyPageWidget - - - - - - - - - ManagedFormViewModel + + + +studyId: String - - - +ManagedFormViewModel<T> createDuplicate() + + + +Widget? banner() - - - + + + + - - - FormViewModelNotFoundException + + + StudyAnalyzeController - - - - - - - - - - FormViewModelCollection + + + +dynamic onExport() - - - +formViewModels: List<T> - +formArray: FormArray<dynamic> - +stagedViewModels: List<T> - +retrievableViewModels: List<T> - +formData: List<D> + + + + + + + + + + StudyBaseController - - - +void add() - +T remove() - +T? findWhere() - +T? removeWhere() - +bool contains() - +void stage() - +T commit() - +void reset() - +void read() + + + +studyId: String + +studyRepository: IStudyRepository + +router: GoRouter + +studySubscription: StreamSubscription<WrappedModel<Study>>? - - - - - - - - FormArray + + + +dynamic subscribeStudy() + +dynamic onStudySubscriptionUpdate() + +dynamic onStudySubscriptionError() + +void dispose() - - - - - + + + + + - - - FormControlValidation + + + StudyParticipationBadge - - - +control: AbstractControl<dynamic> - +validators: List<Validator<dynamic>> - +asyncValidators: List<AsyncValidator<dynamic>>? - +validationMessages: Map<String, String Function(Object)> + + + +participation: Participation + +type: BadgeType + +showPrefixIcon: bool + +center: bool - - - +FormControlValidation merge() + + + +Widget build() - - - + + + - - - AbstractControl + + + Participation - - - - - + + + + - - - CustomFormControl + + + PreviewFrame - - - -_onValueChangedDebouncer: Debouncer? - -_onStatusChangedDebouncer: Debouncer? - +onValueChanged: void Function(T?)? - +onStatusChanged: void Function(ControlStatus)? - +onStatusChangedDebounceTime: int? - +onValueChangedDebounceTime: int? + + + +studyId: String + +routeArgs: StudyFormRouteArgs? + +route: String? - - - +void dispose() + + + + + + + + + + FrameControlsWidget - - - - + + + +onRefresh: void Function()? + +onOpenNewTab: void Function()? + +enabled: bool + + - - - void Function(T?)? + + + +Widget build() - - - + + + + - - - void Function(ControlStatus)? + + + IStudyNavViewModel - - - - - - - - - - FormArrayTable + + + +isEditTabEnabled: bool + +isTestTabEnabled: bool + +isRecruitTabEnabled: bool + +isMonitorTabEnabled: bool + +isAnalyzeTabEnabled: bool + +isSettingsEnabled: bool - - - +control: AbstractControl<dynamic> - +items: List<T> - +onSelectItem: void Function(T) - +getActionsAt: List<ModelAction<dynamic>> Function(T, int) - +onNewItem: void Function()? - +rowTitle: String Function(T) - +onNewItemLabel: String - +sectionTitle: String? - +sectionDescription: String? - +emptyIcon: IconData? - +emptyTitle: String? - +emptyDescription: String? - +sectionTitleDivider: bool? - +rowPrefix: Widget Function(BuildContext, T, int)? - +rowSuffix: Widget Function(BuildContext, T, int)? - +leadingWidget: Widget? - +itemsSectionPadding: EdgeInsets? - +hideLeadingTrailingWhenEmpty: bool - <static>+columns: List<StandardTableColumn> + + + + + + + + + StudyNav - - - +Widget build() - -List<Widget> _buildRow() - -Widget _newItemButton() + + + <static>+dynamic tabs() + <static>+dynamic edit() + <static>+dynamic test() + <static>+dynamic recruit() + <static>+dynamic monitor() + <static>+dynamic analyze() - - - + + + + - - - void Function(T) + + + StudyDesignNav - - - - - - - - List<ModelAction<dynamic>> Function(T, int) + + + <static>+dynamic tabs() + <static>+dynamic info() + <static>+dynamic enrollment() + <static>+dynamic interventions() + <static>+dynamic measurements() + <static>+dynamic reports() - - - + + + + + - - - String Function(T) + + + StudySettingsFormViewModel - - - - - - - - Widget Function(BuildContext, T, int)? + + + +study: AsyncValue<Study> + +studyRepository: IStudyRepository + <static>+defaultPublishedToRegistry: bool + <static>+defaultPublishedToRegistryResults: bool + +isPublishedToRegistryControl: FormControl<bool> + +isPublishedToRegistryResultsControl: FormControl<bool> + +form: FormGroup + +titles: Map<FormMode, String> - - - - - - - - EdgeInsets + + + +void setControlsFrom() + +Study buildFormData() + +dynamic keepControlsSynced() + +dynamic save() + +dynamic setLaunchDefaults() - - - - + + + + - - - UnsavedChangesDialog + + + IStudyRepository - - - +Widget build() + + + +dynamic launch() + +dynamic deleteParticipants() - - - - - + + + + + - - - IFormData + + + FormViewModel - - - +id: String + + + -_formData: T? + -_formMode: FormMode + -_validationSet: FormValidationSetEnum? + +delegate: IFormViewModelDelegate<FormViewModel<dynamic>>? + +autosave: bool + -_immediateFormChildrenSubscriptions: List<StreamSubscription<dynamic>> + -_immediateFormChildrenListenerDebouncer: Debouncer? + -_autosaveOperation: CancelableOperation<dynamic>? + -_defaultControlValidators: Map<String, Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>> + +prevFormValue: Map<String, dynamic>? + <static>-_formKey: String + +formData: T? + +formMode: FormMode + +isReadonly: bool + +validationSet: FormValidationSetEnum? + +isDirty: bool + +title: String + +isValid: bool + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - - - +IFormData copy() + + + -dynamic _setFormData() + -dynamic _rememberDefaultControlValidators() + -Tuple<List<Validator<dynamic>>, List<AsyncValidator<dynamic>>>? _getDefaultValidators() + -dynamic _disableAllControls() + -dynamic _formModeUpdated() + -dynamic _restoreControlsFromFormData() + +void revalidate() + -void _applyValidationSet() + +void read() + +dynamic save() + +dynamic cancel() + +void enableAutosave() + +void listenToImmediateFormChildren() + +dynamic markFormGroupChanged() + +void dispose() + +void setControlsFrom() + +T buildFormData() + +void initControls() - - - - - - - - - PasswordRecoveryForm - - + + + + - - - +formKey: AuthFormKey + + + StudySettingsDialog - - - +Widget build() + + + +Widget build() - - - - + + + + + - - - AuthFormKey + + + StudyTestScreen - - - +index: int - <static>+values: List<AuthFormKey> - <static>+login: AuthFormKey - <static>+signup: AuthFormKey - <static>+passwordForgot: AuthFormKey - <static>+passwordRecovery: AuthFormKey - <static>-_loginSubmit: AuthFormKey - <static>-_signupSubmit: AuthFormKey + + + +previewRoute: String? - - - - - - - - - FormConsumerRefWidget + + + +Widget build() + +Widget? banner() + +dynamic load() + +dynamic save() + +dynamic showHelp() - - - +Widget build() + + + + + + + + StreamSubscription - - - - - + + + + - - - SignupForm + + + StudyTestController - - - +formKey: AuthFormKey + + + +authRepository: IAuthRepository + +languageCode: String - - - +Widget build() - -dynamic _onClickTermsOfUse() - -dynamic _onClickPrivacyPolicy() + + + + + + + + + + WebFrame - - - - - - - - - StudyUJobsToBeDone + + + +previewSrc: String + +studyId: String - - - +Widget build() + + + +Widget build() - - - - + + + + - - - EmailTextField + + + DisabledFrame - - - +labelText: String - +hintText: String? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + +Widget build() - - - - + + + + + - - - PasswordTextField + + + PhoneContainer - - - +labelText: String - +hintText: String? - +onSubmitted: dynamic Function(FormControl<dynamic>)? - +formControlName: String? - +formControl: FormControl<dynamic>? + + + <static>+defaultWidth: double + <static>+defaultHeight: double + +width: double + +height: double + +borderColor: Color + +borderWidth: double + +borderRadius: double + +innerContent: Widget + +innerContentBackgroundColor: Color? - - - - - - - - dynamic Function(FormControl<dynamic>)? + + + +Widget build() - - - - - - - - - AuthFormController - - + + + + - - - +authRepository: IAuthRepository - +sharedPreferences: SharedPreferences - +notificationService: INotificationService - +router: GoRouter - +emailControl: FormControl<String> - +passwordControl: FormControl<String> - +passwordConfirmationControl: FormControl<String> - +rememberMeControl: FormControl<bool> - +termsOfServiceControl: FormControl<bool> - <static>+authValidationMessages: Map<String, String Function(dynamic)> - +loginForm: FormGroup - +signupForm: FormGroup - +passwordForgotForm: FormGroup - +passwordRecoveryForm: FormGroup - +controlValidatorsByForm: Map<AuthFormKey, Map<FormControl<dynamic>, List<Validator<dynamic>>>> - -_formKey: AuthFormKey - +shouldRemember: bool - +formKey: AuthFormKey - +form: FormGroup + + + MobileFrame - - - -dynamic _getFormFor() - -dynamic _onChangeFormKey() - +dynamic resetControlsFor() - -dynamic _forceValidationMessages() - +dynamic signUp() - -dynamic _signUp() - +dynamic signIn() - -dynamic _signInWith() - +dynamic signOut() - +dynamic resetPasswordForEmail() - +dynamic sendPasswordResetLink() - +dynamic recoverPassword() - +dynamic updateUser() - -dynamic _readDebugUser() - -void _setRememberMe() - -void _delRememberMe() - -void _initRememberMe() + + + +Widget build() - - - - + + + + - - - INotificationService + + + DesktopFrame - - - +void showMessage() - +void show() - +Stream<NotificationIntent> watchNotifications() - +void dispose() + + + +Widget build() - - - - - - - - - PasswordForgotForm - - + + + + - - - +formKey: AuthFormKey + + + IStudyAppBarViewModel - - - +Widget build() + + + +isSyncIndicatorVisible: bool + +isStatusBadgeVisible: bool + +isPublishVisible: bool - - - - + + + + - - - AuthScaffold + + + IStudyStatusBadgeViewModel - - - +body: Widget - +formKey: AuthFormKey - +leftContentMinWidth: double - +leftPanelMinWidth: double - +leftPanelPadding: EdgeInsets + + + +studyParticipation: Participation? + +studyStatus: StudyStatus? - - - - - + + + + - - - LoginForm + + + StudyScaffold - - - +formKey: AuthFormKey + + + +studyId: String + +tabs: List<NavbarTab>? + +tabsSubnav: List<NavbarTab>? + +selectedTab: NavbarTab? + +selectedTabSubnav: NavbarTab? + +body: StudyPageWidget + +drawer: Widget? + +disableActions: bool + +actionsSpacing: double + +actionsPadding: double + +layoutType: SingleColumnLayoutType? + +appbarHeight: double + +appbarSubnavHeight: double - - - +Widget build() + + + + + + + + + + RouteInformation - - - - - - - - - AppStatus + + + +route: String? + +extra: String? + +cmd: String? + +data: String? - - - +index: int - <static>+values: List<AppStatus> - <static>+initializing: AppStatus - <static>+initialized: AppStatus + + + +String toString() - - - - - + + + + + - - - StudyInfoFormData + + + PlatformController - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + +studyId: String + +baseSrc: String + +previewSrc: String + +routeInformation: RouteInformation + +frameWidget: Widget - - - +Study apply() - +StudyInfoFormData copy() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void listen() + +void send() + +void openNewPage() - - - - - + + + + + - - - StudyContactInfoFormData + + + WebController - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + +iFrameElement: IFrameElement - - - +Study apply() - +StudyInfoFormData copy() + + + +void activate() + +void registerViews() + +void generateUrl() + +void navigate() + +void refresh() + +void openNewPage() + +void listen() + +void send() - - - - + + + - - - IStudyFormData + + + IFrameElement - - - +Study apply() + + + + + + + + + MobileController - - - - - - - - - StudyDesignInfoFormView + + + +void openNewPage() + +void refresh() + +void registerViews() + +void listen() + +void send() + +void navigate() + +void activate() + +void generateUrl() - - - +Widget build() + + + + + + + + StudyStatus - - - - + + + + + - - - StudyDesignPageWidget + + + StudyStatusBadge - - - +Widget? banner() + + + +participation: Participation? + +status: StudyStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - - - - - - - - StudyInfoFormViewModel + + + +Widget build() - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + + + + + + + TestAppRoutes - - - +void setControlsFrom() - +StudyInfoFormData buildFormData() + + + <static>+studyOverview: String + <static>+eligibility: String + <static>+intervention: String + <static>+consent: String + <static>+journey: String + <static>+dashboard: String - - - - - + + + + + - - - WithScheduleControls + + + StudyController - - - +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>? + + + +notificationService: INotificationService + +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? + +studyActions: List<ModelAction<dynamic>> - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +dynamic syncStudyStatus() + +dynamic onStudySubscriptionUpdate() + -dynamic _redirectNewToActualStudyID() + +dynamic publishStudy() + +void onChangeStudyParticipation() + +void onAddParticipants() + +void onSettingsPressed() + +void dispose() - - - - - + + + + - - - IFormDataWithSchedule + + + StudyMonitorScreen - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + +Widget build() - - - +Schedule toSchedule() + + + + + + + + + StudiesTableColumnHeader - - - - - - - - StudyUTimeOfDay + + + +title: String + +sortable: bool + +sortAscending: bool + +sortingActive: bool + +onSort: void Function()? - - - - - + + + + + - - - ScheduleControls + + + DashboardScaffold - - - +formViewModel: WithScheduleControls + + + <static>+compactWidthThreshold: double + +body: Widget - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + +Widget build() - - - - - + + + + + - - - WithQuestionnaireControls + + + StudiesTableColumnSize - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> + + + +collapsed: bool + +flex: int? + +width: double? - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() + + + +Widget createContainer() - - - - - + + + + + - - - QuestionFormData + + + StudiesTable - - - <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 + + + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +compactWidthThreshold: double + +superCompactWidthThreshold: double + +compactStatTitleThreshold: double + +studies: List<Study> + +onSelect: void Function(Study) + +getActions: List<ModelAction<dynamic>> Function(Study) + +emptyWidget: Widget + +pinnedStudies: Iterable<String> + +dashboardController: DashboardController - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +Widget build() + -Widget _buildColumnHeader() - - - - + + + - - - SurveyQuestionType + + + void Function(Study) - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + + + + + + List<ModelAction<dynamic>> Function(Study) - - - - - + + + + + - - - ChoiceQuestionFormData + + + DashboardController - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> + + + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +userRepository: IUserRepository + +router: GoRouter + -_studiesSubscription: StreamSubscription<List<WrappedModel<Study>>>? + +searchController: SearchController + +isSortAscending: bool - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + -dynamic _subscribeStudies() + +dynamic setSearchText() + +dynamic setStudiesFilter() + +dynamic onSelectStudy() + +dynamic onClickNewStudy() + +dynamic pinStudy() + +dynamic pinOffStudy() + +void setSorting() + +void filterStudies() + +void sortStudies() + +bool isSortingActiveForColumn() + +bool isPinned() + +List<ModelAction<dynamic>> availableActions() + +void dispose() - - - - - + + + + - - - BoolQuestionFormData + + + StudiesTableColumn - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + +index: int + <static>+values: List<StudiesTableColumn> + <static>+pin: StudiesTableColumn + <static>+title: StudiesTableColumn + <static>+status: StudiesTableColumn + <static>+participation: StudiesTableColumn + <static>+createdAt: StudiesTableColumn + <static>+enrolled: StudiesTableColumn + <static>+active: StudiesTableColumn + <static>+completed: StudiesTableColumn + <static>+action: StudiesTableColumn - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + + + + + + + DashboardScreen - - - - - - - - - - ScaleQuestionFormData + + + +filter: StudiesFilter? - - - +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> + + + + + + + + + StudiesFilter - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +index: int + <static>+values: List<StudiesFilter> - - - - - + + + + + - - - FreeTextQuestionFormData + + + IUserRepository - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> + + + +user: StudyUUser - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - + + + + - - - FreeTextQuestionType + + + IModelActionProvider + + + + + + +List<ModelAction<dynamic>> availableActions() - - - - - + + + + - - - QuestionFormViewModel + + + StudiesTableItem - - - <static>+defaultQuestionType: SurveyQuestionType - -_titles: Map<FormMode, String Function()>? - +questionIdControl: FormControl<String> - +questionTypeControl: FormControl<SurveyQuestionType> - +questionTextControl: FormControl<String> - +questionInfoTextControl: FormControl<String> - +questionBaseControls: Map<String, AbstractControl<dynamic>> - +isMultipleChoiceControl: FormControl<bool> - +choiceResponseOptionsArray: FormArray<dynamic> - +customOptionsMin: int - +customOptionsMax: int - +customOptionsInitial: int - +boolResponseOptionsArray: FormArray<String> - <static>+kDefaultScaleMinValue: int - <static>+kDefaultScaleMaxValue: int - <static>+kNumMidValueControls: int - <static>+kMidValueDebounceMilliseconds: int - +scaleMinValueControl: FormControl<int> - +scaleMaxValueControl: FormControl<int> - -_scaleRangeControl: FormControl<int> - +scaleMinLabelControl: FormControl<String> - +scaleMaxLabelControl: FormControl<String> - +scaleMidValueControls: FormArray<int> - +scaleMidLabelControls: FormArray<String?> - -_scaleResponseOptionsArray: FormArray<int> - +scaleMinColorControl: FormControl<SerializableColor> - +scaleMaxColorControl: FormControl<SerializableColor> - +prevMidValues: List<int?>? - +freeTextTypeControl: FormControl<FreeTextQuestionType> - +customRegexControl: FormControl<String> - +freeTextResponseOptionsArray: FormArray<dynamic> - +freeTextLengthMin: AbstractControl<int> - +freeTextLengthMax: AbstractControl<int> - +freeTextExampleTextControl: FormControl<String> - <static>+kDefaultFreeTextMinLength: int - <static>+kDefaultFreeTextMaxLength: int - +freeTextLengthControl: FormControl<RangeValues> - -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> - -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> - +form: FormGroup - +questionId: String - +questionType: SurveyQuestionType - +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> - +answerOptionsArray: FormArray<dynamic> - +answerOptionsControls: List<AbstractControl<dynamic>> - +validAnswerOptions: List<String> - +boolOptions: List<AbstractControl<String>> - +scaleMinValue: int - +scaleMaxValue: int - +scaleRange: int - +scaleAllValueControls: List<AbstractControl<int>> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +questionTextRequired: dynamic - +numValidChoiceOptions: dynamic - +scaleRangeValid: dynamic - +titles: Map<FormMode, String> - +isAddOptionButtonVisible: bool - +isMidValuesClearedInfoVisible: bool + + + +study: Study + +itemHeight: double + +itemPadding: double + +rowSpacing: double + +columnSpacing: double + +actions: List<ModelAction<dynamic>> + +columnSizes: List<StudiesTableColumnSize> + +isPinned: bool + +onPinnedChanged: void Function(Study, bool)? + +onTap: void Function(Study)? - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + + + + + + Study + + + + + + + + + + + void Function(Study, bool)? - - - - + + + - - - SurveyQuestionFormView + + + void Function(Study)? - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + + + + + + + + FormArrayTable - - - - - - - - - - FreeTextQuestionFormView + + + +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> - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic + + + +Widget build() + -List<Widget> _buildRow() + -Widget _newItemButton() - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + + + + + + List<ModelAction<dynamic>> Function(T, int) - - - - + + + - - - IScaleQuestionFormViewModel + + + String Function(T) - - - +isMidValuesClearedInfoVisible: bool + + + + + + + + Widget Function(BuildContext, T, int)? - - - - + + + + + - - - ScaleQuestionFormView + + + CustomFormControl - - - +formViewModel: QuestionFormViewModel + + + -_onValueChangedDebouncer: Debouncer? + -_onStatusChangedDebouncer: Debouncer? + +onValueChanged: void Function(T?)? + +onStatusChanged: void Function(ControlStatus)? + +onStatusChangedDebounceTime: int? + +onValueChangedDebounceTime: int? + + + + + + +void dispose() - - - - - + + + + + - - - ChoiceQuestionFormView + + + Debouncer - - - +formViewModel: QuestionFormViewModel + + + +leading: bool + +cancelUncompleted: bool + -_uncompletedFutureOperation: CancelableOperation<dynamic>? - - - +Widget build() + + + +dynamic call() - - - - - + + + - - - BoolQuestionFormView + + + void Function(T?)? - - - +formViewModel: QuestionFormViewModel + + + + + + + + void Function(ControlStatus)? - - - +Widget build() + + + + + + + + FormInvalidException - - - - - + + + - - - QuestionnaireFormData + + + Exception - - - +questionsData: List<QuestionFormData>? - +id: String + + + + + + + + + FormConfigException - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +message: String? - - - - - + + + + - - - StudyFormScaffold + + + IFormViewModelDelegate - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + +dynamic onSave() + +void onCancel() - - - +Widget build() + + + + + + + + + FormControlOption - - - - - - - - T Function(WidgetRef) + + + +value: T + +label: String + +description: String? + +props: List<Object?> - - - + + + + - - - Widget Function(T) + + + FormMode + + + + + + +index: int + <static>+values: List<FormMode> + <static>+create: FormMode + <static>+readonly: FormMode + <static>+edit: FormMode - - - - - + + + - - - StudyFormViewModel + + + FormValidationSetEnum - - - +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> + + + + + + + + CancelableOperation - - - +void read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + + + + + + + + IFormData - - - - - - + + + +id: String + + - - - EnrollmentFormViewModel + + + +IFormData 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()> + + + + + + + + + UnsavedChangesDialog - - - +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 + + + FormControlValidation - - - +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> + + + +control: AbstractControl<dynamic> + +validators: List<Validator<dynamic>> + +asyncValidators: List<AsyncValidator<dynamic>>? + +validationMessages: Map<String, String Function(Object)> - - - +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() + + + +FormControlValidation merge() - - - - - + + + + - - - ReportsFormViewModel + + + ManagedFormViewModel - - - +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 + + + +ManagedFormViewModel<T> createDuplicate() - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + + + + + + FormViewModelNotFoundException - - - - - + + + + + - - - InterventionsFormViewModel + + + FormViewModelCollection - - - +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 + + + +formViewModels: List<T> + +formArray: FormArray<dynamic> + +stagedViewModels: List<T> + +retrievableViewModels: List<T> + +formData: List<D> - - - +void setControlsFrom() - +InterventionsFormData buildFormData() - +void read() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +InterventionFormViewModel provide() - +void onCancel() - +dynamic onSave() - +dynamic testStudySchedule() + + + +void add() + +T remove() + +T? findWhere() + +T? removeWhere() + +bool contains() + +void stage() + +T commit() + +void reset() + +void read() - - - - - + + + - - - InterventionTaskFormData + + + FormArray - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +id: String + + + + + + + + + + DrawerEntry - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +localizedTitle: String Function() + +icon: IconData? + +localizedHelpText: String Function()? + +enabled: bool + +onSelected: void Function(BuildContext, WidgetRef)? + +autoCloseDrawer: bool + +title: String + +helpText: String? + + + + + + +void onClick() - - - - - + + + - - - StudyScheduleFormData + + + String Function() - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + + + + + + String Function()? - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + + + + + + void Function(BuildContext, WidgetRef)? - - - + + + + + + + + + GoRouterDrawerEntry + + + + + + +intent: RoutingIntent + +onNavigated: void Function()? + + - - - PhaseSequence + + + +void onClick() - - - - + + + + - - - InterventionFormView + + + AppDrawer - - - +formViewModel: InterventionFormViewModel + + + +width: int + +autoCloseDrawer: bool + +leftPaddingEntries: double + +logoPaddingVertical: double + +logoPaddingHorizontal: double + +logoMaxHeight: double + +logoSectionMinHeight: double + +logoSectionMaxHeight: double - - - - - + + + + + - - - InterventionFormViewModel + + + StudyInvitesTable - - - +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> + + + +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) - - - +void setControlsFrom() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + +Widget build() + -List<Widget> _buildRow() - - - - - + + + - - - StudyScheduleControls + + + void Function(StudyInvite) - - - <static>+defaultScheduleType: PhaseSequence - <static>+defaultScheduleTypeSequence: String - <static>+defaultNumCycles: int - <static>+defaultPeriodLength: int - +sequenceTypeControl: FormControl<PhaseSequence> - +sequenceTypeCustomControl: FormControl<String> - +phaseDurationControl: FormControl<int> - +numCyclesControl: FormControl<int> - +includeBaselineControl: FormControl<bool> - +studyScheduleControls: Map<String, FormControl<Object>> - <static>+kNumCyclesMin: int - <static>+kNumCyclesMax: int - <static>+kPhaseDurationMin: int - <static>+kPhaseDurationMax: int - +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> - +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +numCyclesRange: dynamic - +phaseDurationRange: dynamic - +customSequenceRequired: dynamic - - + + + + - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + List<ModelAction<dynamic>> Function(StudyInvite) - - - - - + + + - - - InterventionsFormData + + + Intervention? Function(String) - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String - - + + + + - - - +Study apply() - +InterventionsFormData copy() + + + int Function(StudyInvite) - - - - + + + + + - - - StudyDesignInterventionsFormView + + + InviteCodeFormView - - - +Widget build() + + + +formViewModel: InviteCodeFormViewModel + + + + + + +Widget build() + -List<FormTableRow> _conditionalInterventionRows() - - - - - + + + + + - - - StudyScheduleFormView + + + InviteCodeFormViewModel - - - +formViewModel: StudyScheduleControls + + + +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>? - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +void initControls() + -dynamic _uniqueInviteCode() + +void regenerateCode() + -String _generateCode() + +StudyInvite buildFormData() + +void setControlsFrom() + +dynamic save() - - - - - - - - - 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> + + + IInviteCodeRepository - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + +dynamic isCodeAlreadyUsed() - - - - - + + + + + - - - InterventionFormData + + + StudyRecruitController - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + +inviteCodeRepository: IInviteCodeRepository + -_invitesSubscription: StreamSubscription<List<WrappedModel<StudyInvite>>>? - - - +Intervention toIntervention() - +InterventionFormData copy() + + + -dynamic _subscribeInvites() + +Intervention? getIntervention() + +int getParticipantCountForInvite() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void dispose() - - - - + + + + - - - InterventionTaskFormView + + + StudyRecruitScreen - - - +formViewModel: InterventionTaskFormViewModel + + + +Widget build() + -Widget _inviteCodesSectionHeader() + -Widget _newInviteCodeButton() + -dynamic _onSelectInvite() - - - - - + + + + + - - - InterventionPreview + + + EnrolledBadge - - - +routeArgs: InterventionFormRouteArgs + + + +enrolledCount: int - - - +Widget build() + + + +Widget build() - - - - + + + + - - - MeasurementSurveyFormView + + + PublishConfirmationDialog - - - +formViewModel: MeasurementSurveyFormViewModel + + + +Widget build() - - - - - - - - - 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> + + + PublishSuccessDialog - - - +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() - - - - - + + + + - - - SurveyPreview + + + PublishDialog - - - +routeArgs: MeasurementFormRouteArgs + + + +Widget build() - - - +Widget build() + + + + + + + + + + StudyFormScaffold - - - - - - - - - - MeasurementSurveyFormData + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +Widget build() - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + + + + + + T Function(WidgetRef) - - - - + + + + - - - StudyDesignMeasurementsFormView + + + StudyFormValidationSet - - - +Widget build() + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + + + - - - MeasurementsFormData + + + QuestionFormData - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String + + + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> + +questionId: String + +questionText: String + +questionInfoText: String? + +questionType: SurveyQuestionType + +responseOptionsValidity: Map<dynamic, bool> + +responseOptions: List<dynamic> + +id: String - - - +Study apply() - +MeasurementsFormData copy() + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() - - - - + + + + - - - StudyFormValidationSet + + + SurveyQuestionType - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+freeText: SurveyQuestionType - - - - - + + + + + - - - ReportsFormData + + + ChoiceQuestionFormData - - - +reportItems: List<ReportItemFormData> - +id: String + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> - - - +Study apply() - +ReportsFormData copy() + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() - - - - + + + + + - - - ReportStatus + + + BoolQuestionFormData - - - +index: int - <static>+values: List<ReportStatus> - <static>+primary: ReportStatus - <static>+secondary: ReportStatus + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> - - - - - - - - - - ReportItemFormView + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + + + + + + + + ScaleQuestionFormData - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> + + + + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - + + + + + - - - ReportItemFormViewModel + + + FreeTextQuestionFormData - - - <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 + + + +textLengthRange: List<int> + +textType: FreeTextQuestionType + +textTypeExpression: String? + +responseOptions: List<String> - - - -List<FormControlValidation> _getValidationConfig() - +ReportItemFormData buildFormData() - +ReportItemFormViewModel createDuplicate() - +dynamic onSectionTypeChanged() - -void _updateFormControls() - +void setControlsFrom() + + + +Question<dynamic> toQuestion() + +FreeTextQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - + + + - - - Widget Function(BuildContext) + + + FreeTextQuestionType - - - - + + + + - - - ReportSectionType + + + SurveyQuestionFormView - - - +index: int - <static>+values: List<ReportSectionType> - <static>+average: ReportSectionType - <static>+linearRegression: ReportSectionType + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - - + + + + + - - - ReportItemFormData + + + QuestionFormViewModel - - - +isPrimary: bool - +section: ReportSection - +id: String + + + <static>+defaultQuestionType: SurveyQuestionType + -_titles: Map<FormMode, String Function()>? + +questionIdControl: FormControl<String> + +questionTypeControl: FormControl<SurveyQuestionType> + +questionTextControl: FormControl<String> + +questionInfoTextControl: FormControl<String> + +questionBaseControls: Map<String, AbstractControl<dynamic>> + +isMultipleChoiceControl: FormControl<bool> + +choiceResponseOptionsArray: FormArray<dynamic> + +customOptionsMin: int + +customOptionsMax: int + +customOptionsInitial: int + +boolResponseOptionsArray: FormArray<String> + <static>+kDefaultScaleMinValue: int + <static>+kDefaultScaleMaxValue: int + <static>+kNumMidValueControls: int + <static>+kMidValueDebounceMilliseconds: int + +scaleMinValueControl: FormControl<int> + +scaleMaxValueControl: FormControl<int> + -_scaleRangeControl: FormControl<int> + +scaleMinLabelControl: FormControl<String> + +scaleMaxLabelControl: FormControl<String> + +scaleMidValueControls: FormArray<int> + +scaleMidLabelControls: FormArray<String?> + -_scaleResponseOptionsArray: FormArray<int> + +scaleMinColorControl: FormControl<SerializableColor> + +scaleMaxColorControl: FormControl<SerializableColor> + +prevMidValues: List<int?>? + +freeTextTypeControl: FormControl<FreeTextQuestionType> + +customRegexControl: FormControl<String> + +freeTextResponseOptionsArray: FormArray<dynamic> + +freeTextLengthMin: AbstractControl<int> + +freeTextLengthMax: AbstractControl<int> + +freeTextExampleTextControl: FormControl<String> + <static>+kDefaultFreeTextMinLength: int + <static>+kDefaultFreeTextMaxLength: int + +freeTextLengthControl: FormControl<RangeValues> + -_controlsByQuestionType: Map<SurveyQuestionType, FormGroup> + -_sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + -_validationConfigsByQuestionType: Map<SurveyQuestionType, Map<FormValidationSetEnum, List<FormControlValidation>>> + +form: FormGroup + +questionId: String + +questionType: SurveyQuestionType + +questionTypeControlOptions: List<FormControlOption<SurveyQuestionType>> + +answerOptionsArray: FormArray<dynamic> + +answerOptionsControls: List<AbstractControl<dynamic>> + +validAnswerOptions: List<String> + +boolOptions: List<AbstractControl<String>> + +scaleMinValue: int + +scaleMaxValue: int + +scaleRange: int + +scaleAllValueControls: List<AbstractControl<int>> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +questionTextRequired: dynamic + +numValidChoiceOptions: dynamic + +scaleRangeValid: dynamic + +titles: Map<FormMode, String> + +isAddOptionButtonVisible: bool + +isMidValuesClearedInfoVisible: bool - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() + + + +String? scaleMidLabelAt() + -dynamic _onScaleRangeChanged() + -dynamic _applyInputFormatters() + -dynamic _updateScaleMidValueControls() + -Map<String, dynamic>? _validateFreeText() + -dynamic _onFreeTextLengthChanged() + -List<FormControlValidation> _getValidationConfig() + +dynamic onQuestionTypeChanged() + +dynamic onResponseOptionsChanged() + -void _updateFormControls() + +void initControls() + +void setControlsFrom() + +QuestionFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() + +dynamic save() + +QuestionFormViewModel createDuplicate() - - - + + + + - - - ReportSection + + + IScaleQuestionFormViewModel - - - - - - - - - - DataReferenceIdentifier + + + +isMidValuesClearedInfoVisible: bool - - - +hashCode: int - - + + + + + - - - +bool ==() + + + ScaleQuestionFormView - - - - - - - - DataReference + + + +formViewModel: QuestionFormViewModel - - - - - + + + + + - - - AverageSectionFormView + + + ChoiceQuestionFormView - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +formViewModel: QuestionFormViewModel - - - +Widget build() + + + +Widget build() - - - - - - - - - TemporalAggregationFormatted - - + + + + + - - - -_value: TemporalAggregation - <static>+values: List<TemporalAggregationFormatted> - +value: TemporalAggregation - +string: String - +icon: IconData? - +hashCode: int + + + BoolQuestionFormView - - - +bool ==() - +String toString() - +String toJson() - <static>+TemporalAggregationFormatted fromJson() + + + +formViewModel: QuestionFormViewModel - - - - - - - - TemporalAggregation + + + +Widget build() - - - - - + + + + + - - - ImprovementDirectionFormatted + + + FreeTextQuestionFormView - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() - - - + + + + - - - ImprovementDirection + + + IListActionProvider + + + + + + +void onSelectItem() + +void onNewItem() - - - - - + + + + + - - - DataReferenceEditor + + + WithQuestionnaireControls - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> + + + +questionsArray: FormArray<dynamic> + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> + +questionnaireControls: Map<String, FormArray<dynamic>> + +propagateOnSave: bool + +questionModels: List<Q> + +questionTitles: Map<FormMode, String Function()> - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - + + + + - - - ReactiveDropdownField + + + IProviderArgsResolver + + + + + + +R provide() - - - - - + + + + + - - - LinearRegressionSectionFormView + + + QuestionnaireFormData - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: Map<int, TableColumnWidth> + + + +questionsData: List<QuestionFormData>? + +id: String - - - +Widget build() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - + + + + + - - - StudyDesignReportsFormView + + + IFormDataWithSchedule - - - +Widget build() - -dynamic _showReportItemSidesheetWithArgs() + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? + + + + + + +Schedule toSchedule() - - - - - + + + - - - ReportFormItemDelegate + + + StudyUTimeOfDay - - - +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +owner: ReportsFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + + + + + + + + ScheduleControls - - - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +formViewModel: WithScheduleControls + + + + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - - + + + + + - - - ReportBadge + + + WithScheduleControls - - - +status: ReportStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? - - - +Widget build() + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - - + + + + + - - - BadgeType + + + InterventionFormViewModel - - - +index: int - <static>+values: List<BadgeType> - <static>+filled: BadgeType - <static>+outlined: BadgeType - <static>+outlineFill: BadgeType - <static>+plain: BadgeType + + + +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() - - - - - + + + + + - - - EnrollmentFormData + + + StudyScheduleFormData - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +Study apply() - +EnrollmentFormData copy() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - + + + - - - Participation + + + PhaseSequence - - - - - - - - - ConsentItemFormData - - + + + + - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + IStudyFormData - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +Study apply() - - - - - + + + + + - - - ConsentItemFormViewModel + + + StudyScheduleFormView - - - +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> + + + +formViewModel: StudyScheduleControls - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - + + + + + - - - IScreenerQuestionLogicFormViewModel + + + StudyScheduleControls - - - +isDirtyOptionsBannerVisible: 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 - - - - - - - - - - ScreenerQuestionLogicFormView + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - +formViewModel: ScreenerQuestionFormViewModel + + + + + + + + + InterventionTaskFormView - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + +formViewModel: InterventionTaskFormViewModel - - - - - + + + + + - - - ScreenerQuestionFormViewModel + + + InterventionTaskFormViewModel - - - <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 + + + +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 onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - - - - - - StudyDesignEnrollmentFormView - - + + + + + - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + InterventionPreview - - - - - - - - - ConsentItemFormView + + + +routeArgs: InterventionFormRouteArgs - - - +formViewModel: ConsentItemFormViewModel + + + +Widget build() - - - - - + + + + + - - - EnrollmentFormConsentItemDelegate + + + InterventionsFormData - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Study apply() + +InterventionsFormData copy() - - - - - - - - PublishSuccessDialog - - + + + + + - - - +Widget build() + + + InterventionTaskFormData - - - - - - - - - PublishDialog + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +Widget build() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - + + + + - - - PublishConfirmationDialog + + + InterventionFormView - - - +Widget build() + + + +formViewModel: InterventionFormViewModel - - - - + + + + - - - StudyAnalyzeController + + + StudyDesignInterventionsFormView - - - +dynamic onExport() + + + +Widget build() - - - - + + + + - - - StudyAnalyzeScreen + + + StudyDesignPageWidget - - - +Widget? banner() - +Widget build() + + + +Widget? banner() - - - - - + + + + + - - - DrawerEntry + + + InterventionsFormViewModel - - - +localizedTitle: String Function() - +icon: IconData? - +localizedHelpText: String Function()? - +enabled: bool - +onSelected: void Function(BuildContext, WidgetRef)? - +autoCloseDrawer: bool - +title: String - +helpText: String? + + + +study: Study + +router: GoRouter + +interventionsArray: FormArray<dynamic> + +interventionsCollection: FormViewModelCollection<InterventionFormViewModel, InterventionFormData> + +form: FormGroup + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +interventionsRequired: dynamic + +titles: Map<FormMode, String> + +canTestStudySchedule: bool - - - +void onClick() + + + +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() - - - + + + + + - - - String Function() + + + InterventionFormData - - - - - - - - String Function()? + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String - - - - - - - - void Function(BuildContext, WidgetRef)? + + + +Intervention toIntervention() + +InterventionFormData copy() - - - - - - - - - GoRouterDrawerEntry - - - - - - +intent: RoutingIntent - +onNavigated: void Function()? - - + + + + + - - - +void onClick() + + + EnrollmentFormData - - - - - - - - - AppDrawer + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: String - - - +width: int - +autoCloseDrawer: bool - +leftPaddingEntries: double - +logoPaddingVertical: double - +logoPaddingHorizontal: double - +logoMaxHeight: double - +logoSectionMinHeight: double - +logoSectionMaxHeight: double + + + +Study apply() + +EnrollmentFormData copy() - - - - - + + + + + - - - StudyController + + + ConsentItemFormViewModel - - - +notificationService: INotificationService - +studyEventsSubscription: StreamSubscription<ModelEvent<Study>>? - +studyActions: List<ModelAction<dynamic>> + + + +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 syncStudyStatus() - +dynamic onStudySubscriptionUpdate() - -dynamic _redirectNewToActualStudyID() - +dynamic publishStudy() - +void onChangeStudyParticipation() - +void onAddParticipants() - +void onSettingsPressed() - +void dispose() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - - + + + + - - - PreviewFrame + + + ConsentItemFormView - - - +studyId: String - +routeArgs: StudyFormRouteArgs? - +route: String? + + + +formViewModel: ConsentItemFormViewModel - - - - + + + + - - - IStudyStatusBadgeViewModel + + + IScreenerQuestionLogicFormViewModel - - - +studyParticipation: Participation? - +studyStatus: StudyStatus? + + + +isDirtyOptionsBannerVisible: bool - - - + + + + + - - - StudyStatus + + + ScreenerQuestionLogicFormView - - - - - - - - - - StudyStatusBadge + + + +formViewModel: ScreenerQuestionFormViewModel - - - +participation: Participation? - +status: StudyStatus? - +type: BadgeType - +showPrefixIcon: bool - +showTooltip: bool + + + +Widget build() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - +Widget build() + + + + + + + + + + ScreenerQuestionFormViewModel - - - - - - - - - StudyTestController + + + <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 - - - +authRepository: IAuthRepository - +languageCode: String + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - - - - - RouteInformation - - + + + + - - - +route: String? - +extra: String? - +cmd: String? - +data: String? + + + StudyDesignEnrollmentFormView - - - +String toString() + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - - - + + + + + - - - PlatformController + + + ConsentItemFormData - - - +studyId: String - +baseSrc: String - +previewSrc: String - +routeInformation: RouteInformation - +frameWidget: Widget + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - +void activate() - +void registerViews() - +void generateUrl() - +void navigate() - +void refresh() - +void listen() - +void send() - +void openNewPage() + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - - + + + + + - - - WebController + + + EnrollmentFormViewModel - - - +iFrameElement: IFrameElement + + + +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 openNewPage() - +void listen() - +void send() + + + +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() - - - + + + + + - - - IFrameElement + + + EnrollmentFormConsentItemDelegate - - - - - - - - - MobileController + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +void openNewPage() - +void refresh() - +void registerViews() - +void listen() - +void send() - +void navigate() - +void activate() - +void generateUrl() + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - + + + + + - - - StudySettingsFormViewModel + + + MeasurementsFormViewModel - - - +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 + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> - - - +void setControlsFrom() - +Study buildFormData() - +dynamic keepControlsSynced() - +dynamic save() - +dynamic setLaunchDefaults() + + + +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() - - - - + + + + + - - - StudySettingsDialog + + + MeasurementSurveyFormData - - - +Widget build() + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String - - - - - - - - - - StudyTestScreen + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - +previewRoute: String? + + + + + + + + + + SurveyPreview - - - +Widget build() - +Widget? banner() - +dynamic load() - +dynamic save() - +dynamic showHelp() + + + +routeArgs: MeasurementFormRouteArgs + + + + + + +Widget build() - - - - - + + + + + - - - StudyParticipationBadge + + + MeasurementSurveyFormViewModel - - - +participation: Participation - +type: BadgeType - +showPrefixIcon: bool - +center: bool + + + +study: Study + +measurementIdControl: FormControl<String> + +instanceIdControl: FormControl<String> + +surveyTitleControl: FormControl<String> + +surveyIntroTextControl: FormControl<String> + +surveyOutroTextControl: FormControl<String> + +form: FormGroup + +measurementId: String + +instanceId: String + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +atLeastOneQuestion: dynamic + +breadcrumbsTitle: String + +titles: Map<FormMode, String> - - - +Widget build() + + + +void setControlsFrom() + +MeasurementSurveyFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() + +SurveyQuestionFormRouteArgs buildFormRouteArgs() + +MeasurementSurveyFormViewModel createDuplicate() - - - - + + + + - - - IStudyAppBarViewModel + + + MeasurementSurveyFormView - - - +isSyncIndicatorVisible: bool - +isStatusBadgeVisible: bool - +isPublishVisible: bool + + + +formViewModel: MeasurementSurveyFormViewModel - - - - + + + + + - - - IStudyNavViewModel + + + MeasurementsFormData - - - +isEditTabEnabled: bool - +isTestTabEnabled: bool - +isRecruitTabEnabled: bool - +isMonitorTabEnabled: bool - +isAnalyzeTabEnabled: bool - +isSettingsEnabled: bool + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String + + + + + + +Study apply() + +MeasurementsFormData copy() - - - - + + + + - - - StudyScaffold + + + StudyDesignMeasurementsFormView - - - +studyId: String - +tabs: List<NavbarTab>? - +tabsSubnav: List<NavbarTab>? - +selectedTab: NavbarTab? - +selectedTabSubnav: NavbarTab? - +body: StudyPageWidget - +drawer: Widget? - +disableActions: bool - +actionsSpacing: double - +actionsPadding: double - +layoutType: SingleColumnLayoutType? - +appbarHeight: double - +appbarSubnavHeight: double + + + +Widget build() - - - - + + + + - - - NavbarTab + + + StudyDesignInfoFormView - - - +title: String - +intent: RoutingIntent? - +index: int - +enabled: bool + + + +Widget build() - - - - + + + + + - - - SingleColumnLayoutType + + + StudyInfoFormData - - - +index: int - <static>+values: List<SingleColumnLayoutType> - <static>+boundedWide: SingleColumnLayoutType - <static>+boundedNarrow: SingleColumnLayoutType - <static>+stretched: SingleColumnLayoutType - <static>+split: SingleColumnLayoutType + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String + + + + + + +Study apply() + +StudyInfoFormData copy() - - - - - + + + + + - - - FrameControlsWidget + + + StudyContactInfoFormData - - - +onRefresh: void Function()? - +onOpenNewTab: void Function()? - +enabled: bool + + + +organization: String? + +institutionalReviewBoard: String? + +institutionalReviewBoardNumber: String? + +researchers: String? + +email: String? + +website: String? + +phone: String? + +additionalInfo: String? + +id: String - - - +Widget build() + + + +Study apply() + +StudyInfoFormData copy() - - - - - + + + + + - - - WebFrame + + + StudyInfoFormViewModel - - - +previewSrc: String - +studyId: String + + + +study: Study + +titleControl: FormControl<String> + +iconControl: FormControl<IconOption> + +descriptionControl: FormControl<String> + +organizationControl: FormControl<String> + +reviewBoardControl: FormControl<String> + +reviewBoardNumberControl: FormControl<String> + +researchersControl: FormControl<String> + +emailControl: FormControl<String> + +websiteControl: FormControl<String> + +phoneControl: FormControl<String> + +additionalInfoControl: FormControl<String> + +form: FormGroup + +titles: Map<FormMode, String> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titleRequired: dynamic + +descriptionRequired: dynamic + +iconRequired: dynamic + +organizationRequired: dynamic + +reviewBoardRequired: dynamic + +reviewBoardNumberRequired: dynamic + +researchersRequired: dynamic + +emailRequired: dynamic + +phoneRequired: dynamic + +emailFormat: dynamic + +websiteFormat: dynamic - - - +Widget build() + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - - + + + + + - - - DisabledFrame + + + 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() - - - - - + + + + + - - - PhoneContainer + + + ReportsFormViewModel - - - <static>+defaultWidth: double - <static>+defaultHeight: double - +width: double - +height: double - +borderColor: Color - +borderWidth: double - +borderRadius: double - +innerContent: Widget - +innerContentBackgroundColor: Color? + + + +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() - - - - - - - - MobileFrame - - + + + + + - - - +Widget build() + + + ReportsFormData - - - - - - - - - DesktopFrame + + + +reportItems: List<ReportItemFormData> + +id: String - - - +Widget build() + + + +Study apply() + +ReportsFormData copy() - - - - + + + + - - - IWithBanner + + + ReportStatus - - - +Widget? banner() + + + +index: int + <static>+values: List<ReportStatus> + <static>+primary: ReportStatus + <static>+secondary: ReportStatus - - - - - - - - TestAppRoutes - - + + + + + - - - <static>+studyOverview: String - <static>+eligibility: String - <static>+intervention: String - <static>+consent: String - <static>+journey: String - <static>+dashboard: String + + + ReportItemFormData - - - - - - - - - StudyNav + + + +isPrimary: bool + +section: ReportSection + +id: String - - - <static>+dynamic tabs() - <static>+dynamic edit() - <static>+dynamic test() - <static>+dynamic recruit() - <static>+dynamic monitor() - <static>+dynamic analyze() + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - - + + + - - - StudyDesignNav + + + ReportSection - - - <static>+dynamic tabs() - <static>+dynamic info() - <static>+dynamic enrollment() - <static>+dynamic interventions() - <static>+dynamic measurements() - <static>+dynamic reports() + + + + + + + + + + ReportItemFormViewModel - - - - - - - - - IClipboardService + + + <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 - - - +dynamic copy() + + + -List<FormControlValidation> _getValidationConfig() + +ReportItemFormData buildFormData() + +ReportItemFormViewModel createDuplicate() + +dynamic onSectionTypeChanged() + -void _updateFormControls() + +void setControlsFrom() - - - - + + + + - - - ClipboardService + + + ReportSectionType - - - +dynamic copy() + + + +index: int + <static>+values: List<ReportSectionType> + <static>+average: ReportSectionType + <static>+linearRegression: ReportSectionType - - - - - + + + + + - - - NotificationIntent + + + LinearRegressionSectionFormView - - - +message: String? - +customContent: Widget? - +icon: IconData? - +actions: List<NotificationAction>? - +type: NotificationType + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +void register() + + + +Widget build() - - - - - - - - NotificationType - - + + + + + - - - +index: int - <static>+values: List<NotificationType> - <static>+snackbar: NotificationType - <static>+alert: NotificationType - <static>+custom: NotificationType + + + AverageSectionFormView - - - - - - - - - NotificationAction + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - +label: String - +onSelect: dynamic Function() - +isDestructive: bool + + + +Widget build() - - - - + + + + + - - - SnackbarIntent + + + TemporalAggregationFormatted - - - +duration: int? + + + -_value: TemporalAggregation + <static>+values: List<TemporalAggregationFormatted> + +value: TemporalAggregation + +string: String + +icon: IconData? + +hashCode: int - - - - - - - - - AlertIntent + + + +bool ==() + +String toString() + +String toJson() + <static>+TemporalAggregationFormatted fromJson() - - - +title: String - +dismissOnAction: bool - +isDestructive: dynamic + + + + + + + + TemporalAggregation - - - - + + + + + - - - NotificationDispatcher + + + ImprovementDirectionFormatted - - - +child: Widget? - +snackbarInnerPadding: double - +snackbarWidth: double? - +snackbarBehavior: SnackBarBehavior - +snackbarDefaultDuration: int + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int + + + + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - + + + - - - SnackBarBehavior + + + ImprovementDirection - - - - + + + + + - - - Notifications + + + DataReferenceEditor - - - <static>+credentialsInvalid: SnackbarIntent - <static>+userAlreadyRegistered: SnackbarIntent - <static>+passwordReset: SnackbarIntent - <static>+passwordResetSuccess: SnackbarIntent - <static>+studyDeleted: SnackbarIntent - <static>+inviteCodeDeleted: SnackbarIntent - <static>+inviteCodeClipped: SnackbarIntent - <static>+studyDeleteConfirmation: AlertIntent + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - - - - NotificationDefaultActions + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - <static>+cancel: NotificationAction + + + + + + + + ReactiveDropdownField - - - - - + + + + + - - - NotificationService + + + DataReferenceIdentifier - - - -_streamController: BehaviorSubject<NotificationIntent> + + + +hashCode: int - - - +Stream<NotificationIntent> watchNotifications() - +void showMessage() - +void show() - +void dispose() + + + +bool ==() - - - - - + + + - - - ErrorPage + + + DataReference - - - +error: Exception? - - + + + + + + - - - +Widget build() + + + ReportItemFormView - - - - - - - - - SplashPage + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - +Widget build() + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - + + + + - - - NullHelperDecoration + + + StudyDesignReportsFormView - - - - - - - - InputDecoration + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - - + + + + + - - - Collapsible + + + ReportFormItemDelegate - - - +contentBuilder: Widget Function(BuildContext, bool) - +headerBuilder: Widget Function(BuildContext, bool)? - +title: String? - +isCollapsed: bool + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - - - - - - Widget Function(BuildContext, bool) + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - + + + + + - - - Widget Function(BuildContext, bool)? + + + ReportBadge - - - - - - - - - FormScaffold + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +formViewModel: T - +actions: List<Widget>? - +body: Widget - +drawer: Widget? - +actionsSpacing: double - +actionsPadding: double + + + +Widget build() - - - - - + + + + - - - AsyncValueWidget + + + AccountSettingsDialog + + + + + + +Widget build() - - - +value: AsyncValue<T> - +data: Widget Function(T) - +error: Widget Function(Object, StackTrace?)? - +loading: Widget Function()? - +empty: Widget Function()? + + + + + + + + + IAppRepository - - - +Widget build() - -Widget _buildDataOrEmptyWidget() - -Widget _defaultError() - -Widget _defaultLoad() + + + +dynamic fetchAppConfig() + +void dispose() - - - + + + + + - - - Widget Function(Object, StackTrace?)? + + + AppRepository - - - - + + + +apiClient: StudyUApi + + - - - Widget Function()? + + + +dynamic fetchAppConfig() + +void dispose() - - - - + + + + - - - SidesheetTab + + + StudyUApi - - - +builder: Widget Function(BuildContext) + + + +dynamic saveStudy() + +dynamic fetchStudy() + +dynamic getUserStudies() + +dynamic deleteStudy() + +dynamic saveStudyInvite() + +dynamic fetchStudyInvite() + +dynamic deleteStudyInvite() + +dynamic deleteParticipants() + +dynamic fetchAppConfig() + +dynamic fetchUser() + +dynamic saveUser() - - - - + + + - - - Sidesheet + + + User - - - <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)? + + + + + + + + Session - - - + + + + + - - - Widget Function(Widget)? + + + AuthRepository - - - - - - - - - FormSideSheetTab + + + +supabaseClient: SupabaseClient + +sharedPreferences: SharedPreferences + +allowPasswordReset: bool + +authClient: GoTrueClient + +session: Session? + +serializedSession: String? + +currentUser: User? + +isLoggedIn: bool - - - +formViewBuilder: Widget Function(T) + + + -void _registerAuthListener() + +dynamic signUp() + +dynamic signInWith() + +dynamic signOut() + +dynamic resetPasswordForEmail() + +dynamic updateUser() + +void dispose() + +dynamic onAppStart() - - - - + + + - - - ActionMenuType + + + SupabaseClient - - - +index: int - <static>+values: List<ActionMenuType> - <static>+inline: ActionMenuType - <static>+popup: ActionMenuType + + + + + + + + GoTrueClient - - - - - + + + - - - Badge + + + StudyLaunched - - - +icon: IconData? - +color: Color? - +borderRadius: double - +label: String - +type: BadgeType - +padding: EdgeInsets - +iconSize: double? - +labelStyle: TextStyle? - +center: bool + + + + + + + + + ModelEvent - - - +Widget build() - -Color? _getBackgroundColor() - -Color _getBorderColor() - -Color? _getLabelColor() + + + +modelId: String + +model: T - - - + + + - - - TextStyle + + + APIException - - - - - + + + - - - ConstrainedWidthFlexible + + + StudyNotFoundException - - - +minWidth: double - +maxWidth: double - +flex: int - +flexSum: int - +child: Widget - +outerConstraints: BoxConstraints - - + + + + - - - +Widget build() - -double _getWidth() + + + MeasurementNotFoundException - - - + + + - - - BoxConstraints + + + QuestionNotFoundException - - - - - + + + - - - IconPack + + + ConsentItemNotFoundException - - - <static>+defaultPack: List<IconOption> - <static>+material: List<IconOption> - - + + + + - - - <static>+IconOption? resolveIconByName() + + + InterventionNotFoundException - - - - - + + + - - - IconOption + + + InterventionTaskNotFoundException - - - +name: String - +icon: IconData? - +isEmpty: bool - +props: List<Object?> + + + + + + + + ReportNotFoundException - - - +String toJson() - <static>+IconOption fromJson() + + + + + + + + ReportSectionNotFoundException - - - + + + - - - ReactiveIconPicker + + + StudyInviteNotFoundException - - - + + + - - - ReactiveFocusableFormField + + + UserNotFoundException - - - - - + + + + + - - - IconPicker + + + StudyUApiClient - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +onSelect: void Function(IconOption)? - +galleryIconSize: double? - +selectedIconSize: double? - +focusNode: FocusNode? - +isDisabled: bool + + + +supabaseClient: SupabaseClient + <static>+studyColumns: List<String> + <static>+studyWithParticipantActivityColumns: List<String> + +testDelayMilliseconds: int - - - +Widget build() + + + +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() - - - + + + + - - - void Function(IconOption)? + + + SupabaseClientDependant + + + + + + +supabaseClient: SupabaseClient - - - + + + + - - - FocusNode + + + SupabaseQueryMixin + + + + + + +dynamic deleteAll() + +dynamic getAll() + +dynamic getById() + +dynamic getByColumn() + +List<T> deserializeList() + +T deserializeObject() - - - - - + + + + + - - - IconPickerField + + + WrappedModel - - - +iconOptions: List<IconOption> - +selectedOption: IconOption? - +selectedIconSize: double? - +galleryIconSize: double? - +onSelect: void Function(IconOption)? - +focusNode: FocusNode? - +isDisabled: bool + + + -_model: T + +asyncValue: AsyncValue<T> + +isLocalOnly: bool + +isDirty: bool + +isDeleted: bool + +lastSaved: DateTime? + +lastFetched: DateTime? + +lastUpdated: DateTime? + +model: T - - - +Widget build() + + + +dynamic markWithError() + +dynamic markAsLoading() + +dynamic markAsFetched() + +dynamic markAsSaved() - - - - - + + + - - - IconPickerGallery + + + ModelRepositoryException - - - +iconOptions: List<IconOption> - +onSelect: void Function(IconOption)? - +iconSize: double - - + + + + - - - +Widget build() + + + ModelNotFoundException - - - - + + + + - - - TwoColumnLayout + + + IModelRepository - - - <static>+defaultDivider: VerticalDivider - <static>+defaultContentPadding: EdgeInsets - <static>+slimContentPadding: EdgeInsets - +leftWidget: Widget - +rightWidget: Widget - +dividerWidget: Widget? - +headerWidget: Widget? - +flexLeft: int? - +flexRight: int? - +constraintsLeft: BoxConstraints? - +constraintsRight: BoxConstraints? - +scrollLeft: bool - +scrollRight: bool - +paddingLeft: EdgeInsets? - +paddingRight: EdgeInsets? - +backgroundColorLeft: Color? - +backgroundColorRight: Color? - +stretchHeight: bool + + + +String 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() - - - + + + + - - - VerticalDivider + + + IModelRepositoryDelegate + + + + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +T createNewInstance() + +T createDuplicate() + +dynamic onError() - - - - + + + + + - - - BannerBox + + + ModelRepository - - - +prefixIcon: Widget? - +body: Widget - +style: BannerStyle - +padding: EdgeInsets? - +noPrefix: bool - +dismissable: bool - +isDismissed: bool? - +onDismissed: dynamic Function()? - +dismissIconSize: double + + + +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>> - - - - - - - - - BannerStyle + + + +WrappedModel<T>? get() + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic duplicateAndSave() + +dynamic duplicateAndSaveFromRemote() + +Stream<List<WrappedModel<T>>> watchAll() + +Stream<WrappedModel<T>> watch() + +Stream<ModelEvent<T>> watchAllChanges() + +Stream<ModelEvent<T>> watchChanges() + -dynamic _buildModelSpecificController() + +dynamic ensurePersisted() + +WrappedModel<T> upsertLocally() + +List<WrappedModel<T>> upsertAllLocally() + +dynamic emitUpdate() + +dynamic emitModelEvent() + +dynamic emitError() + +void dispose() + +List<ModelAction<dynamic>> availableActions() - - - +index: int - <static>+values: List<BannerStyle> - <static>+warning: BannerStyle - <static>+info: BannerStyle - <static>+error: BannerStyle + + + + + + + + + SupabaseQueryError - - - - - - - - dynamic Function()? + + + +statusCode: String? + +message: String + +details: dynamic - - - - - + + + + + - - - StudyULogo + + + InviteCodeRepository - - - +onTap: void Function()? + + + +studyId: String + +ref: ProviderRef<dynamic> + +apiClient: StudyUApi + +authRepository: IAuthRepository + +studyRepository: IStudyRepository + +study: Study - - - +Widget build() + + + +String getKey() + +dynamic isCodeAlreadyUsed() + +List<ModelAction<dynamic>> availableActions() + +dynamic emitUpdate() - - - - - - - - FormTableRow - - + + + - - - +label: String? - +labelBuilder: Widget Function(BuildContext)? - +labelStyle: TextStyle? - +labelHelpText: String? - +input: Widget - +control: AbstractControl<dynamic>? - +layout: FormTableRowLayout? + + + ProviderRef - - - + + + + + - - - Widget Function(BuildContext)? + + + InviteCodeRepositoryDelegate - - - - - - - - - FormTableRowLayout + + + +study: Study + +apiClient: StudyUApi + +studyRepository: IStudyRepository - - - +index: int - <static>+values: List<FormTableRowLayout> - <static>+vertical: FormTableRowLayout - <static>+horizontal: FormTableRowLayout + + + +dynamic fetch() + +dynamic fetchAll() + +dynamic save() + +dynamic delete() + +dynamic onError() + +StudyInvite createDuplicate() + +StudyInvite createNewInstance() - - - - - + + + + + - - - FormTableLayout + + + StudyRepository - - - +rows: List<FormTableRow> - +columnWidths: Map<int, TableColumnWidth> - +rowDivider: Widget? - +rowLayout: FormTableRowLayout? - +rowLabelStyle: TextStyle? + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: ProviderRef<dynamic> + +sortCallback: void Function()? - - - +Widget build() + + + +String getKey() + +dynamic deleteParticipants() + +dynamic launch() + +List<ModelAction<dynamic>> availableActions() - - - - - + + + + + - - - FormSectionHeader + + + StudyRepositoryDelegate - - - +title: String - +titleTextStyle: TextStyle? - +helpText: String? - +divider: bool - +helpTextDisabled: bool + + + +apiClient: StudyUApi + +authRepository: IAuthRepository - - - +Widget build() + + + +dynamic fetchAll() + +dynamic fetch() + +dynamic save() + +dynamic delete() + +dynamic onError() + +Study createNewInstance() + +Study createDuplicate() - - - - - + + + - - - FormLabel + + + IsFetched - - - +labelText: String? - +helpText: String? - +labelTextStyle: TextStyle? - +layout: FormTableRowLayout? - - + + + + - - - +Widget build() + + + IsSaving - - - - - + + + - - - IndicatorRangeSliderThumbShape + + + IsSaved - - - +buildContext: BuildContext - +start: T - +end: T + + + + + + + + IsDeleted - - - +Size getPreferredSize() - +void paint() + + + + + + + + StudyUUser - - - + + + + + - - - BuildContext + + + UserRepository - - - - + + + +apiClient: StudyUApi + +authRepository: IAuthRepository + +ref: Ref<Object?> + +user: StudyUUser + + - - - RangeSliderThumbShape + + + +dynamic fetchUser() + +dynamic saveUser() + +dynamic updatePreferences() - - - - - + + + - - - ActionMenuInline + + + Ref - - - +actions: List<ModelAction<dynamic>> - +iconSize: double? - +visible: bool - +splashRadius: double? - +paddingVertical: double? - +paddingHorizontal: double? + + + + + + + + + PreferenceAction - - - +Widget build() + + + +index: int + <static>+values: List<PreferenceAction> + <static>+pin: PreferenceAction + <static>+pinOff: PreferenceAction - - - - + + + + - - - TabbedNavbar + + + DropdownMenuItemTheme - - - +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? + + + +iconTheme: IconThemeData? - - - + + + - - - BoxDecoration + + + IconThemeData - - - + + + - - - void Function(int, T)? + + + Diagnosticable - - - + + + + + - - - TabBarIndicatorSize + + + ThemeConfig - - - - - - - - - Hyperlink + + + <static>+kMinContentWidth: double + <static>+kMaxContentWidth: double + <static>+kHoverFadeFactor: double + <static>+kMuteFadeFactor: double - - - +text: String - +url: String? - +onClick: void Function()? - +linkColor: Color - +hoverColor: Color? - +visitedColor: Color? - +style: TextStyle? - +hoverStyle: TextStyle? - +visitedStyle: TextStyle? - +icon: IconData? - +iconSize: 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() - - - - + + + + - - - MouseEventsRegion + + + NoAnimationPageTransitionsBuilder - - - +onTap: void Function()? - +onHover: void Function(PointerHoverEvent)? - +onEnter: void Function(PointerEnterEvent)? - +onExit: void Function(PointerExitEvent)? - +autoselectCursor: bool - +cursor: SystemMouseCursor - <static>+defaultCursor: SystemMouseCursor - +autoCursor: SystemMouseCursor + + + +Widget buildTransitions() - - - + + + - - - void Function(PointerHoverEvent)? + + + PageTransitionsBuilder - - - + + + + - - - void Function(PointerEnterEvent)? + + + WebTransitionBuilder - - - - - - - - void Function(PointerExitEvent)? + + + +Widget buildTransitions() - - - + + + + - - - SystemMouseCursor + + + ThemeSettingChange - - - - - - - - - - HtmlStylingBanner + + + +settings: ThemeSettings - - - +isDismissed: bool - +onDismissed: dynamic Function()? + + + + + + + + + ThemeSettings - - - +Widget build() + + + +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 - - - - - - - - Axis + + + +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() - - - + + + - - - PopupMenuPosition + + + ValueNotifier - - - - - + + + - - - SingleColumnLayout + + + ColorScheme - - - <static>+defaultConstraints: BoxConstraints - <static>+defaultConstraintsNarrow: BoxConstraints - +body: Widget - +header: Widget? - +stickyHeader: bool - +constraints: BoxConstraints? - +scroll: bool - +padding: EdgeInsets? - - + + + + - - - <static>+dynamic fromType() + + + PageTransitionsTheme - - - - - + + + - - - StandardDialog + + + ShapeBorder - - - +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 + + + + + + + + InheritedWidget - - - +Widget build() + + + + + + + + ThemeMode - - - - - + + + + + - - - HelpIcon + + + CustomColor - - - +tooltipText: String? + + + +name: String + +color: Color + +blend: bool - - - +Widget build() + + + +Color value() - - - - + + + + + - - - UnderConstruction + + + StudyTemplates - - - +Widget build() + + + <static>+kUnnamedStudyTitle: String - - - - - - - - - - FormControlLabel + + + <static>+Study emptyDraft() - - - +formControl: AbstractControl<dynamic> - +text: String - +isClickable: bool - +textStyle: TextStyle? - +onClick: void Function(AbstractControl<dynamic>)? + + + + + + + + + StudyActionType - - - +Widget build() + + + +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 - - - + + + - - - void Function(AbstractControl<dynamic>)? + + + ResultTypes - - - + + + + - - - ReactiveCustomColorPicker + + + MeasurementResultTypes - - - - - - - - ReactiveFormField + + + <static>+questionnaire: String + <static>+values: List<String> - - - - + + + + - - - ISyncIndicatorViewModel + + + InterventionResultTypes - - - +isDirty: bool - +lastSynced: DateTime? + + + <static>+checkmarkTask: String + <static>+values: List<String> - - - - + + + + - - - SyncIndicator + + + StudyExportData - - - +state: AsyncValue<T> - +lastSynced: DateTime? - +isDirty: bool - +animationDuration: int - +iconSize: double + + + +study: Study + +measurementsData: List<Map<String, dynamic>> + +interventionsData: List<Map<String, dynamic>> + +isEmpty: bool - - - - + + + + + - - - Search + + + CombinedStreamNotifier - - - +onQueryChanged: dynamic Function(String) - +searchController: SearchController? - +hintText: String? - +initialText: String? + + + -_subscriptions: List<StreamSubscription<dynamic>> - - - - - - - - dynamic Function(String) + + + +void dispose() - - - + + + - - - void Function(String) + + + ChangeNotifier - - - - + + + + + - - - StandardTableColumn + + + OptimisticUpdate - - - +label: String - +tooltip: String? - +columnWidth: TableColumnWidth - +sortable: bool - +sortAscending: bool? - +sortableIcon: Widget? + + + +applyOptimistic: void Function() + +apply: dynamic Function() + +rollback: void Function() + +onUpdate: void Function()? + +onError: void Function(Object, StackTrace?)? + +rethrowErrors: bool + +runOptimistically: bool + +completeFutureOptimistically: bool - - - - - - - - TableColumnWidth + + + +dynamic execute() + -void _runUpdateHandlerIfAny() - - - - - - - - StandardTable - - - - - - +items: List<T> - +inputColumns: List<StandardTableColumn> - +onSelectItem: void Function(T) - +trailingActionsAt: List<ModelAction<dynamic>> Function(T, int)? - +trailingActionsMenuType: ActionMenuType? - +sortColumnPredicates: List<int Function(T, T)?>? - +pinnedPredicates: int Function(T, T)? - +headerRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +dataRowBuilder: TableRow Function(BuildContext, List<StandardTableColumn>)? - +inputTrailingActionsColumn: StandardTableColumn - +tableWrapper: Widget Function(Widget)? - +cellSpacing: double - +rowSpacing: double - +minRowHeight: double? - +showTableHeader: bool - +hideLeadingTrailingWhenEmpty: bool - +leadingWidget: Widget? - +trailingWidget: Widget? - +leadingWidgetSpacing: double? - +trailingWidgetSpacing: double? - +emptyWidget: Widget? - +rowStyle: StandardTableStyle - +disableRowInteractions: bool + + + + + + + void Function() - - - + + + - - - List<ModelAction<dynamic>> Function(T, int)? + + + void Function(Object, StackTrace?)? - - - + + + + - - - int Function(T, T)? + + + Time + + + + + + <static>+dynamic fromTimeOfDay() + +Map<String, dynamic> toJson() + <static>+Time fromJson() - - - + + + - - - TableRow Function(BuildContext, List<StandardTableColumn>)? + + + TimeOfDay - - - - + + + + - - - StandardTableStyle + + + TimeValueAccessor - - - +index: int - <static>+values: List<StandardTableStyle> - <static>+plain: StandardTableStyle - <static>+material: StandardTableStyle + + + +String modelToViewValue() + +Time? viewToModelValue() + -String _addLeadingZeroIfNeeded() - - - - - + + + - - - DismissButton + + + ControlValueAccessor - - - +onPressed: void Function()? - +text: String? + + + + + + + + + ModelAction - - - +Widget build() + + + +type: T + +label: String + +icon: IconData? + +onExecute: Function + +isAvailable: bool + +isDestructive: bool - - - - + + + + - - - PrimaryButton + + + ModelActionType - - - +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<ModelActionType> + <static>+edit: ModelActionType + <static>+delete: ModelActionType + <static>+remove: ModelActionType + <static>+duplicate: ModelActionType + <static>+clipboard: ModelActionType + <static>+primary: ModelActionType - - - + + + + - - - Size + + + SerializableColor + + + + + + +Map<String, dynamic> toJson() + <static>+SerializableColor fromJson() - - - - - + + + + + - - - SecondaryButton + + + Tuple - - - +text: String - +icon: IconData? - +isLoading: bool - +onPressed: void Function()? + + + +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() - - - - - + + + + + - - - TextParagraph + + + CountWhereValidator - - - +text: String? - +style: TextStyle? - +selectable: bool - +span: List<TextSpan>? + + + +predicate: bool Function(T?) + +minCount: int? + +maxCount: int? + <static>+kValidationMessageMinCount: String + <static>+kValidationMessageMaxCount: String - - - +Widget build() + + + +Map<String, dynamic>? validate() - - - - - + + + - - - EmptyBody + + + bool Function(T?) - - - +icon: IconData? - +leading: Widget? - +leadingSpacing: double? - +title: String? - +description: String? - +button: Widget? - - + + + + - - - +Widget build() + + + Validator - - - - + + + + - - - DropdownMenuItemTheme + + + Patterns - - - +iconTheme: IconThemeData? + + + <static>+timeFormatString: String + <static>+emailFormatString: String + <static>+url: String - - - + + + + + - - - IconThemeData + + + ExecutionLimiter - - - - + + + +milliseconds: int + <static>-_timer: Timer? + + - - - Diagnosticable + + + +void dispose() - - - - - + + + - - - ThemeConfig + + + Timer - - - <static>+kMinContentWidth: double - <static>+kMaxContentWidth: double - <static>+kHoverFadeFactor: double - <static>+kMuteFadeFactor: double + + + + + + + + + Throttler - - - <static>+dynamic bodyBackgroundColor() - <static>+Color modalBarrierColor() - <static>+Color containerColor() - <static>+Color colorPickerInitialColor() - <static>+TextStyle bodyTextMuted() - <static>+TextStyle bodyTextBackground() - <static>+double iconSplashRadius() - <static>+Color sidesheetBackgroundColor() - <static>+InputDecorationTheme dropdownInputDecorationTheme() - <static>+DropdownMenuItemTheme dropdownMenuItemTheme() + + + +dynamic call() - - - - + + + + + - - - NoAnimationPageTransitionsBuilder + + + SuppressedBehaviorSubject - - - +Widget buildTransitions() + + + +subject: BehaviorSubject<T> + +didSuppressInitialEvent: bool + -_controller: StreamController<T> - - - - - - - - PageTransitionsBuilder + + + -StreamController<T> _buildDerivedController() + +dynamic close() - - - - + + + - - - WebTransitionBuilder + + + StreamController - - - +Widget buildTransitions() + + + + + + + + + + JsonFileLoader - - - - - - - - - ThemeSettingChange + + + +jsonAssetsPath: String - - - +settings: ThemeSettings + + + +dynamic loadJson() + +dynamic parseJsonMapFromAssets() + +dynamic parseJsonListFromAssets() - - - - + + + + + - - - ThemeSettings + + + NumericalRangeFormatter - - - +sourceColor: Color - +themeMode: ThemeMode + + + +min: int? + +max: int? - - - - - - - - Notification + + + +TextEditingValue formatEditUpdate() - - - - - + + + - - - ThemeProvider + + + TextInputFormatter - - - +settings: ValueNotifier<ThemeSettings> - +lightDynamic: ColorScheme? - +darkDynamic: ColorScheme? - +pageTransitionsTheme: PageTransitionsTheme - +shapeMedium: ShapeBorder + + + + + + + + + StudySequenceFormatter - - - +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() + + + +TextEditingValue formatEditUpdate() - - - + + + + - - - ValueNotifier + + + FileFormatEncoder - - - - - - - - ColorScheme + + + +dynamic encodeAsync() + +String encode() + +dynamic call() - - - + + + + - - - PageTransitionsTheme + + + CSVStringEncoder - - - - - - - - ShapeBorder + + + +String encode() - - - + + + + - - - InheritedWidget + + + JsonStringEncoder + + + + + + +String encode() - - - + + + + - - - ThemeMode + + + PlatformLocaleWeb + + + + + + +Locale getPlatformLocale() - - - - - + + + + - - - CustomColor + + + PlatformLocale - - - +name: String - +color: Color - +blend: bool + + + +Locale getPlatformLocale() - - - +Color value() + + + + + + + + + PlatformLocaleMobile + + + + + + +Locale getPlatformLocale() - - + + - + AppTranslation - + <static>+dynamic init() @@ -15988,16 +16042,16 @@ - - + + - + LanguagePicker - + +languagePickerType: LanguagePickerType +iconColor: Color? @@ -16008,16 +16062,16 @@ - - + + - + LanguagePickerType - + +index: int <static>+values: List<LanguagePickerType> @@ -16029,69 +16083,15 @@ - + - + Offset - - - - - - - - PlatformLocale - - - - - - +Locale getPlatformLocale() - - - - - - - - - - - - PlatformLocaleMobile - - - - - - +Locale getPlatformLocale() - - - - - - - - - - - - PlatformLocaleWeb - - - - - - +Locale getPlatformLocale() - - - - From d40f117e6a0128fe1ebd33661235b8f03d0396ad Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 15 Mar 2024 17:08:48 +0100 Subject: [PATCH 08/14] style: inherit white foregroundColor for ElevatedButton --- app/lib/screens/study/dashboard/dashboard.dart | 3 +++ app/lib/screens/study/dashboard/settings.dart | 7 +++---- app/lib/theme.dart | 5 +++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/lib/screens/study/dashboard/dashboard.dart b/app/lib/screens/study/dashboard/dashboard.dart index e6408ce3f..341c3dd32 100644 --- a/app/lib/screens/study/dashboard/dashboard.dart +++ b/app/lib/screens/study/dashboard/dashboard.dart @@ -269,6 +269,9 @@ class _DashboardScreenState extends State with WidgetsBindingOb } on SocketException catch (_) {} }, label: Text(AppLocalizations.of(context)!.next_day), + style: ElevatedButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.primary, + ), ), ) : null, diff --git a/app/lib/screens/study/dashboard/settings.dart b/app/lib/screens/study/dashboard/settings.dart index 2cebbea56..6e0eaafee 100644 --- a/app/lib/screens/study/dashboard/settings.dart +++ b/app/lib/screens/study/dashboard/settings.dart @@ -121,7 +121,6 @@ class _SettingsState extends State { label: Text(AppLocalizations.of(context)!.opt_out), style: ElevatedButton.styleFrom( backgroundColor: Colors.orange[800], - foregroundColor: Colors.white, ), onPressed: () { showDialog(context: context, builder: (_) => OptOutAlertDialog(subject: subject)); @@ -131,7 +130,7 @@ class _SettingsState extends State { ElevatedButton.icon( icon: const Icon(Icons.delete), label: Text(AppLocalizations.of(context)!.delete_data), - style: ElevatedButton.styleFrom(backgroundColor: Colors.red, foregroundColor: Colors.white), + style: ElevatedButton.styleFrom(backgroundColor: Colors.red), onPressed: () { showDialog(context: context, builder: (_) => DeleteAlertDialog(subject: subject)); }, @@ -175,7 +174,7 @@ class OptOutAlertDialog extends StatelessWidget { ElevatedButton.icon( icon: Icon(MdiIcons.exitToApp), label: Text(AppLocalizations.of(context)!.opt_out), - style: ElevatedButton.styleFrom(backgroundColor: Colors.orange[800], foregroundColor: Colors.white), + style: ElevatedButton.styleFrom(backgroundColor: Colors.orange[800]), onPressed: () async { await subject!.softDelete(); await deleteActiveStudyReference(); @@ -211,7 +210,7 @@ class DeleteAlertDialog extends StatelessWidget { ElevatedButton.icon( icon: const Icon(Icons.delete), label: Text(AppLocalizations.of(context)!.delete_data), - style: ElevatedButton.styleFrom(backgroundColor: Colors.red, foregroundColor: Colors.white), + style: ElevatedButton.styleFrom(backgroundColor: Colors.red), onPressed: () async { try { await subject!.delete(); // hard-delete diff --git a/app/lib/theme.dart b/app/lib/theme.dart index 004195e6b..37fc09fa3 100644 --- a/app/lib/theme.dart +++ b/app/lib/theme.dart @@ -17,5 +17,10 @@ ThemeData get theme => ThemeData( secondary: accentColor, primary: primaryColor, ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all(Colors.white), + ), + ), visualDensity: VisualDensity.adaptivePlatformDensity, ); From 3e26a94463dd00e247f83adfa2f9420d5e44cad7 Mon Sep 17 00:00:00 2001 From: StudyU Documenter Date: Fri, 15 Mar 2024 16:12:10 +0000 Subject: [PATCH 09/14] docs: update UML documentation --- .../app/lib/screens/study/dashboard/uml.svg | 530 +++++++++--------- 1 file changed, 265 insertions(+), 265 deletions(-) diff --git a/docs/uml/app/lib/screens/study/dashboard/uml.svg b/docs/uml/app/lib/screens/study/dashboard/uml.svg index 91509ae19..f9ee5b73d 100644 --- a/docs/uml/app/lib/screens/study/dashboard/uml.svg +++ b/docs/uml/app/lib/screens/study/dashboard/uml.svg @@ -1,4 +1,4 @@ - + [Settings ] @@ -20,14 +20,30 @@ [DeleteAlertDialog]o-[StudySubject] - [TaskOverview + [DashboardScreen | - +subject: StudySubject?; - +scheduleToday: List<TaskInstance>?; - +interventionIcon: String? + +error: String? ] - [TaskOverview]o-[StudySubject] + [OverflowMenuItem + | + +name: String; + +icon: IconData; + +routeName: String?; + +onTap: dynamic Function()? + ] + + [OverflowMenuItem]o-[IconData] + [OverflowMenuItem]o-[dynamic Function()?] + + [StudyFinishedPlaceholder + | + <static>+space: SizedBox + | + +Widget build() + ] + + [StudyFinishedPlaceholder]o-[SizedBox] [ProgressRow | @@ -62,30 +78,35 @@ [TaskBox]o-[Icon] [TaskBox]o-[dynamic Function()] - [DashboardScreen + [TaskOverview | - +error: String? + +subject: StudySubject?; + +scheduleToday: List<TaskInstance>?; + +interventionIcon: String? ] - [OverflowMenuItem + [TaskOverview]o-[StudySubject] + + [FAQ | - +name: String; - +icon: IconData; - +routeName: String?; - +onTap: dynamic Function()? + +Widget build() ] - [OverflowMenuItem]o-[IconData] - [OverflowMenuItem]o-[dynamic Function()?] + [Entry + | + +title: String; + +children: List<Entry> + ] - [StudyFinishedPlaceholder + [EntryItem | - <static>+space: SizedBox + +entry: Entry | + -Widget _buildTiles(); +Widget build() ] - [StudyFinishedPlaceholder]o-[SizedBox] + [EntryItem]o-[Entry] [ContactScreen ] @@ -131,111 +152,90 @@ [ContactItemType]o-[ContactItemType] [Enum]<:--[ContactItemType] - [FAQ - | - +Widget build() - ] - - [Entry - | - +title: String; - +children: List<Entry> - ] - - [EntryItem - | - +entry: Entry - | - -Widget _buildTiles(); - +Widget build() - ] - - [EntryItem]o-[Entry] - - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - + - + + + + + @@ -274,9 +274,9 @@ - + - + StudySubject @@ -308,38 +308,115 @@ - - - - + + + + - - - TaskOverview + + + DashboardScreen - - - +subject: StudySubject? - +scheduleToday: List<TaskInstance>? - +interventionIcon: String? + + + +error: String? + + + + + + + + + + + + OverflowMenuItem + + + + + + +name: String + +icon: IconData + +routeName: String? + +onTap: dynamic Function()? + + + + + + + + + + + IconData + + + + + + + + + + + dynamic Function()? + + + + + + + + + + + + + StudyFinishedPlaceholder + + + + + + <static>+space: SizedBox + + + + + + +Widget build() + + + + + + + + + + + SizedBox - - + + - + ProgressRow - + +subject: StudySubject? @@ -348,17 +425,17 @@ - - - + + + - + InterventionSegment - + +intervention: Intervention +percentCompleted: double @@ -369,7 +446,7 @@ - + +List<Widget> buildSeparators() +Widget build() @@ -379,9 +456,9 @@ - + - + Intervention @@ -390,16 +467,16 @@ - - + + - + TaskBox - + +taskInstance: TaskInstance +icon: Icon @@ -410,9 +487,9 @@ - + - + TaskInstance @@ -421,9 +498,9 @@ - + - + Icon @@ -432,117 +509,103 @@ - + - + dynamic Function() - - - - + + + + - - - DashboardScreen + + + TaskOverview - - - +error: String? + + + +subject: StudySubject? + +scheduleToday: List<TaskInstance>? + +interventionIcon: String? - - - - + + + + - - - OverflowMenuItem + + + FAQ - - - +name: String - +icon: IconData - +routeName: String? - +onTap: dynamic Function()? + + + +Widget build() - - - + + + + - - - IconData + + + Entry - - - - - - - - dynamic Function()? + + + +title: String + +children: List<Entry> - - - - - - - - - StudyFinishedPlaceholder - - + + + + + - - - <static>+space: SizedBox + + + EntryItem - - - +Widget build() + + + +entry: Entry - - - - - - - - SizedBox + + + -Widget _buildTiles() + +Widget build() - + - + ContactScreen @@ -551,17 +614,17 @@ - - - + + + - + ContactWidget - + +contact: Contact? +title: String @@ -570,7 +633,7 @@ - + +Widget build() @@ -579,9 +642,9 @@ - + - + Contact @@ -590,9 +653,9 @@ - + - + Color @@ -601,17 +664,17 @@ - - - + + + - + ContactItem - + +iconData: IconData +itemName: String @@ -621,7 +684,7 @@ - + +dynamic launchContact() +Widget build() @@ -631,16 +694,16 @@ - - + + - + ContactItemType - + +index: int <static>+values: List<ContactItemType> @@ -653,78 +716,15 @@ - + - + Enum - - - - - - - - FAQ - - - - - - +Widget build() - - - - - - - - - - - - Entry - - - - - - +title: String - +children: List<Entry> - - - - - - - - - - - - - EntryItem - - - - - - +entry: Entry - - - - - - -Widget _buildTiles() - +Widget build() - - - - From 74d9674bbccd4cf2eb9c905777a291b68d542cd3 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 15 Mar 2024 22:29:09 +0100 Subject: [PATCH 10/14] fix: make migration usable --- database/migration/migrate-app_min_version.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migration/migrate-app_min_version.sql b/database/migration/migrate-app_min_version.sql index 374e1fafb..e38d08d79 100644 --- a/database/migration/migrate-app_min_version.sql +++ b/database/migration/migrate-app_min_version.sql @@ -1,2 +1,2 @@ ALTER TABLE public.app_config -ADD COLUMN app_min_version text NOT NULL; +ADD COLUMN app_min_version text NOT NULL DEFAULT '2.6.0'; From b491c9c469ee808fe1aaa50b7a50759be2378552 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Fri, 15 Mar 2024 22:50:05 +0100 Subject: [PATCH 11/14] fix: upgrade deps --- app/android/app/build.gradle | 2 +- app/pubspec.lock | 16 ++++++++-------- app/pubspec.yaml | 6 +++--- core/pubspec.lock | 4 ++-- core/pubspec.yaml | 2 +- designer_v2/pubspec.lock | 16 ++++++++-------- designer_v2/pubspec.yaml | 4 ++-- flutter_common/pubspec.lock | 4 ++-- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 10 files changed, 30 insertions(+), 30 deletions(-) diff --git a/app/android/app/build.gradle b/app/android/app/build.gradle index 8a8d7490e..1f76598ef 100644 --- a/app/android/app/build.gradle +++ b/app/android/app/build.gradle @@ -31,7 +31,7 @@ if (keystorePropertiesFile.exists()) { android { namespace "health.studyu.app" // Start flutter_local_notifications - compileSdkVersion Math.max(flutter.compileSdkVersion, 33) + compileSdkVersion Math.max(flutter.compileSdkVersion, 34) // End flutter_local_notifications ndkVersion flutter.ndkVersion diff --git a/app/pubspec.lock b/app/pubspec.lock index 093bffdd2..1401c5b5a 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -290,10 +290,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "55b9b229307a10974b26296ff29f2e132256ba4bd74266939118eaefa941cb00" + sha256: f9a05409385b77b06c18f200a41c7c2711ebf7415669350bb0f8474c07bd40d1 url: "https://pub.dev" source: hosted - version: "16.3.3" + version: "17.0.0" flutter_local_notifications_linux: dependency: transitive description: @@ -873,26 +873,26 @@ packages: dependency: transitive description: name: sentry - sha256: d2ee9c850d876d285f22e2e662f400ec2438df9939fe4acd5d780df9841794ce + sha256: a460aa48568d47140dd0557410b624d344ffb8c05555107ac65035c1097cf1ad url: "https://pub.dev" source: hosted - version: "7.16.1" + version: "7.18.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: "5b428c189c825f16fb14e9166529043f06b965d5b59bfc3a1415e39c082398c0" + sha256: "3d0d1d4e0e407d276ae8128d123263ccbc37e988bae906765efd6f37d544f4c6" url: "https://pub.dev" source: hosted - version: "7.16.1" + version: "7.18.0" sentry_logging: dependency: "direct main" description: name: sentry_logging - sha256: "276e3535ac0f030410326aac0cee26713e34c499361db5dccf7a8ea1bf01d980" + sha256: f24b72cadc72f0fe9dcca6cde9c28e032807060b3ecc8f950f7c7a95595e7ac2 url: "https://pub.dev" source: hosted - version: "7.16.1" + version: "7.18.0" shared_preferences: dependency: "direct main" description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 617eb0885..eb0bb2657 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: flutter: sdk: flutter flutter_file_dialog: ^3.0.2 - flutter_local_notifications: ^16.3.3 + flutter_local_notifications: ^17.0.0 flutter_localizations: sdk: flutter flutter_timezone: ^1.0.8 @@ -30,8 +30,8 @@ dependencies: provider: ^6.1.2 quiver: ^3.2.1 rainbow_color: ^2.0.1 - sentry_flutter: ^7.16.1 - sentry_logging: ^7.16.1 + sentry_flutter: ^7.18.0 + sentry_logging: ^7.18.0 shared_preferences: ^2.2.2 studyu_core: ^4.3.3-dev.3 studyu_flutter_common: ^1.7.0-dev.4 diff --git a/core/pubspec.lock b/core/pubspec.lock index 756e2f337..e13661735 100644 --- a/core/pubspec.lock +++ b/core/pubspec.lock @@ -429,10 +429,10 @@ packages: dependency: "direct main" description: name: sentry - sha256: d2ee9c850d876d285f22e2e662f400ec2438df9939fe4acd5d780df9841794ce + sha256: a460aa48568d47140dd0557410b624d344ffb8c05555107ac65035c1097cf1ad url: "https://pub.dev" source: hosted - version: "7.16.1" + version: "7.18.0" shelf: dependency: transitive description: diff --git a/core/pubspec.yaml b/core/pubspec.yaml index f1f7b0969..cea21e8e5 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: json_annotation: ^4.8.1 logger: ^2.1.0 quiver: ^3.2.1 - sentry: ^7.16.1 + sentry: ^7.18.0 supabase: ^2.0.8 uuid: ^4.3.3 diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index 6efc07b49..9cc720841 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -284,10 +284,10 @@ packages: dependency: "direct main" description: name: flutter_riverpod - sha256: "4bce556b7ecbfea26109638d5237684538d4abc509d253e6c5c4c5733b360098" + sha256: "0f1974eff5bbe774bf1d870e406fc6f29e3d6f1c46bd9c58e7172ff68a785d7d" url: "https://pub.dev" source: hosted - version: "2.4.10" + version: "2.5.1" flutter_test: dependency: "direct dev" description: flutter @@ -339,10 +339,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "170c46e237d6eb0e6e9f0e8b3f56101e14fb64f787016e42edd74c39cf8b176a" + sha256: "7ecb2f391edbca5473db591b48555a8912dde60edd0fb3013bd6743033b2d3f8" url: "https://pub.dev" source: hosted - version: "13.2.0" + version: "13.2.1" gotrue: dependency: transitive description: @@ -784,10 +784,10 @@ packages: dependency: transitive description: name: riverpod - sha256: "548e2192eb7aeb826eb89387f814edb76594f3363e2c0bb99dd733d795ba3589" + sha256: f21b32ffd26a36555e501b04f4a5dca43ed59e16343f1a30c13632b2351dfa4d url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.5.1" riverpod_analyzer_utils: dependency: transitive description: @@ -816,10 +816,10 @@ packages: dependency: transitive description: name: sentry - sha256: d2ee9c850d876d285f22e2e662f400ec2438df9939fe4acd5d780df9841794ce + sha256: a460aa48568d47140dd0557410b624d344ffb8c05555107ac65035c1097cf1ad url: "https://pub.dev" source: hosted - version: "7.16.1" + version: "7.18.0" shared_preferences: dependency: "direct main" description: diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 013e4986c..7b9106f8a 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -20,10 +20,10 @@ dependencies: flutter_colorpicker: ^1.0.3 flutter_localizations: sdk: flutter - flutter_riverpod: ^2.4.10 + flutter_riverpod: ^2.5.1 flutter_web_plugins: sdk: flutter - go_router: ^13.2.0 + go_router: ^13.2.1 material_color_utilities: material_design_icons_flutter: ^7.0.7296 pointer_interceptor: ^0.10.1 diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index a763130a9..dd6de2fd1 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -372,10 +372,10 @@ packages: dependency: transitive description: name: sentry - sha256: d2ee9c850d876d285f22e2e662f400ec2438df9939fe4acd5d780df9841794ce + sha256: a460aa48568d47140dd0557410b624d344ffb8c05555107ac65035c1097cf1ad url: "https://pub.dev" source: hosted - version: "7.16.1" + version: "7.18.0" shared_preferences: dependency: "direct main" description: diff --git a/pubspec.lock b/pubspec.lock index 55f05d02d..768552516 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: "direct dev" description: name: melos - sha256: "7266e9fc9fee5f4a0c075e5cec375c00736dfc944358f533b740b93b3d8d681e" + sha256: "1ae029702496a0c143536a32d8a91706203803bb8a1685237ca8c9edc17ff25b" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "5.1.0" meta: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index fbd1472cd..df7a667ee 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,4 +9,4 @@ environment: dev_dependencies: flutter_lints: ^3.0.1 lint: ^2.3.0 - melos: ^4.1.0 + melos: ^5.1.0 From 7477313e9c99dc354e1d4fe5da2842a46e4ae432 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sat, 23 Mar 2024 11:25:53 +0100 Subject: [PATCH 12/14] chore: upgrade deps --- app/pubspec.lock | 20 ++++++++++---------- app/pubspec.yaml | 2 +- core/pubspec.lock | 4 ++-- designer_v2/pubspec.lock | 20 ++++++++++---------- flutter_common/pubspec.lock | 4 ++-- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 1401c5b5a..6b8cb6dda 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -737,10 +737,10 @@ packages: dependency: transitive description: name: permission_handler_apple - sha256: bdafc6db74253abb63907f4e357302e6bb786ab41465e8635f362ee71fd8707b + sha256: "92861b0f0c2443dd8898398c2baa4f1ae925109b5909ae4a17d0108a6a788932" url: "https://pub.dev" source: hosted - version: "9.4.0" + version: "9.4.2" permission_handler_html: dependency: transitive description: @@ -982,10 +982,10 @@ packages: dependency: transitive description: name: sqflite_common - sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5" + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" stack_trace: dependency: transitive description: @@ -1308,10 +1308,10 @@ packages: dependency: transitive description: name: webview_flutter_android - sha256: "3e5f4e9d818086b0d01a66fb1ff9cc72ab0cc58c71980e3d3661c5685ea0efb0" + sha256: f038ee2fae73b509dde1bc9d2c5a50ca92054282de17631a9a3d515883740934 url: "https://pub.dev" source: hosted - version: "3.15.0" + version: "3.16.0" webview_flutter_platform_interface: dependency: transitive description: @@ -1324,18 +1324,18 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "9bf168bccdf179ce90450b5f37e36fe263f591c9338828d6bf09b6f8d0f57f86" + sha256: f12f8d8a99784b863e8b85e4a9a5e3cf1839d6803d2c0c3e0533a8f3c5a992a7 url: "https://pub.dev" source: hosted - version: "3.12.0" + version: "3.13.0" win32: dependency: transitive description: name: win32 - sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + sha256: "8cb58b45c47dcb42ab3651533626161d6b67a2921917d8d429791f76972b3480" url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "5.3.0" xdg_directories: dependency: transitive description: diff --git a/app/pubspec.yaml b/app/pubspec.yaml index eb0bb2657..575a82e64 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: intersperse: ^2.0.0 intl: ^0.18.1 # flutter_localizations material_design_icons_flutter: ^7.0.7296 - package_info_plus: ^5.0.1 + package_info_plus: ^5.0.1 # wakelock_plus <= 1.1.6 pdf: ^3.10.8 permission_handler: ^11.3.0 provider: ^6.1.2 diff --git a/core/pubspec.lock b/core/pubspec.lock index e13661735..e50867728 100644 --- a/core/pubspec.lock +++ b/core/pubspec.lock @@ -621,10 +621,10 @@ packages: dependency: transitive description: name: vm_service - sha256: e7d5ecd604e499358c5fe35ee828c0298a320d54455e791e9dcf73486bc8d9f0 + sha256: a75f83f14ad81d5fe4b3319710b90dec37da0e22612326b696c9e1b8f34bbf48 url: "https://pub.dev" source: hosted - version: "14.1.0" + version: "14.2.0" watcher: dependency: transitive description: diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index 9cc720841..d946ed5f8 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -157,26 +157,26 @@ packages: dependency: "direct dev" description: name: custom_lint - sha256: "445242371d91d2e24bd7b82e3583a2c05610094ba2d0575262484ad889c8f981" + sha256: "7c0aec12df22f9082146c354692056677f1e70bc43471644d1fdb36c6fdda799" url: "https://pub.dev" source: hosted - version: "0.6.2" + version: "0.6.4" custom_lint_builder: dependency: transitive description: name: custom_lint_builder - sha256: "4c0aed2a3491096e91cf1281923ba1b6814993f16dde0fd60f697925225bbbd6" + sha256: d7dc41e709dde223806660268678be7993559e523eb3164e2a1425fd6f7615a9 url: "https://pub.dev" source: hosted - version: "0.6.2" + version: "0.6.4" custom_lint_core: dependency: transitive description: name: custom_lint_core - sha256: ce5d6215f4e143f7780ce53f73dfa6fc503f39d2d30bef76c48be9ac1a09d9a6 + sha256: a85e8f78f4c52f6c63cdaf8c872eb573db0231dcdf3c3a5906d493c1f8bc20e6 url: "https://pub.dev" source: hosted - version: "0.6.2" + version: "0.6.3" dart_style: dependency: transitive description: @@ -800,10 +800,10 @@ packages: dependency: "direct dev" description: name: riverpod_lint - sha256: e9bbd02e9e89e18eecb183bbca556d7b523a0669024da9b8167c08903f442937 + sha256: "3c67c14ccd16f0c9d53e35ef70d06cd9d072e2fb14557326886bbde903b230a5" url: "https://pub.dev" source: hosted - version: "2.3.9" + version: "2.3.10" rxdart: dependency: "direct main" description: @@ -1203,10 +1203,10 @@ packages: dependency: transitive description: name: win32 - sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + sha256: "8cb58b45c47dcb42ab3651533626161d6b67a2921917d8d429791f76972b3480" url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "5.3.0" xdg_directories: dependency: transitive description: diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index dd6de2fd1..b41e1997a 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -640,10 +640,10 @@ packages: dependency: transitive description: name: win32 - sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + sha256: "8cb58b45c47dcb42ab3651533626161d6b67a2921917d8d429791f76972b3480" url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "5.3.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index 768552516..12ba0fb0a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: "direct dev" description: name: melos - sha256: "1ae029702496a0c143536a32d8a91706203803bb8a1685237ca8c9edc17ff25b" + sha256: "98db49f249e7a37b9b76daf419d19ebb8c490e208eee88cccca6ca16651635f6" url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.2.1" meta: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index df7a667ee..a0223d8f0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,4 +9,4 @@ environment: dev_dependencies: flutter_lints: ^3.0.1 lint: ^2.3.0 - melos: ^5.1.0 + melos: ^5.2.1 From 162a83b24346abde809416ac6a0206aa96fbc5e2 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sat, 23 Mar 2024 11:29:00 +0100 Subject: [PATCH 13/14] chore(release): publish packages - studyu_app@2.6.5-dev.6 - studyu_core@4.3.3-dev.4 - studyu_designer_v2@1.6.2-dev.6 - studyu_flutter_common@1.7.0-dev.5 --- CHANGELOG.md | 69 +++++++++++++++++++++++++++++++++++++ app/CHANGELOG.md | 24 +++++++++++++ app/pubspec.yaml | 6 ++-- core/CHANGELOG.md | 15 ++++++++ core/pubspec.yaml | 2 +- designer_v2/CHANGELOG.md | 6 ++++ designer_v2/pubspec.yaml | 6 ++-- flutter_common/CHANGELOG.md | 4 +++ flutter_common/pubspec.yaml | 4 +-- 9 files changed, 127 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c8fe147e..6f60f8a5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,75 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-03-23 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`studyu_app` - `v2.6.5-dev.6`](#studyu_app---v265-dev6) + - [`studyu_core` - `v4.3.3-dev.4`](#studyu_core---v433-dev4) + - [`studyu_designer_v2` - `v1.6.2-dev.6`](#studyu_designer_v2---v162-dev6) + - [`studyu_flutter_common` - `v1.7.0-dev.5`](#studyu_flutter_common---v170-dev5) + +--- + +#### `studyu_app` - `v2.6.5-dev.6` + + - **REFACTOR**: login process and offline mode. ([aab64a42](https://github.com/hpi-studyu/studyu/commit/aab64a429df81037eb6cd9c06b7eb89b282a1a05)) + - **REFACTOR**: remove unnecessary late. ([f17902e2](https://github.com/hpi-studyu/studyu/commit/f17902e2d22294cc0ddcaa25ed091982da8fc082)) + - **REFACTOR**: improve return type of publishedPublicStudies(). ([fedec441](https://github.com/hpi-studyu/studyu/commit/fedec441fd4f0f39fe35e7cb89b2922a10ac9ea3)) + - **REFACTOR**: create abstract exception and rename ExtractedSupabaseListResult. ([5ef1bc43](https://github.com/hpi-studyu/studyu/commit/5ef1bc4378c2ac35e9781a040c4868910291794b)) + - **REFACTOR**: bind faulty studies to return value. ([e6b4ed70](https://github.com/hpi-studyu/studyu/commit/e6b4ed70d367ddb9e8b1e7fd0015d0f70a179a0c)) + - **REFACTOR**: remove ExtractedSupabaseListResult. ([0d3f4af9](https://github.com/hpi-studyu/studyu/commit/0d3f4af9d201556ba5ec0884741969e7dfa47b71)) + - **REFACTOR**: mounted check. ([e1b07e45](https://github.com/hpi-studyu/studyu/commit/e1b07e45093dd77898274e92582ba48b54e762e3)) + - **REFACTOR**: move constants to separate file. ([b4d3853d](https://github.com/hpi-studyu/studyu/commit/b4d3853d827c3e0f08db16234f5a136094938a0d)) + - **FIX**: upgrade deps. ([b491c9c4](https://github.com/hpi-studyu/studyu/commit/b491c9c469ee808fe1aaa50b7a50759be2378552)) + - **FIX**: make offline mode more reliable. ([45370246](https://github.com/hpi-studyu/studyu/commit/45370246253bfdf1a884a7e873ef68d4542e8e55)) + - **FIX**: web compatibility for app outdated screen. ([40f39afe](https://github.com/hpi-studyu/studyu/commit/40f39afe60293bfd62ea705a55f59012c6aa00e3)) + - **FIX**: multi-retrieval of public studies. ([4218eb00](https://github.com/hpi-studyu/studyu/commit/4218eb00f9067ea9586eb1a5b76dba202b493e5f)) + - **FIX**: review comments. ([71896db6](https://github.com/hpi-studyu/studyu/commit/71896db6425a04cbfe644fb73045102287abcd2b)) + - **FIX**: showSnackBar() method cannot be called during build. ([e835db62](https://github.com/hpi-studyu/studyu/commit/e835db62a6ca61b6e1afd3d0df4d0d9e53153a07)) + - **FIX**: translation. ([15af570a](https://github.com/hpi-studyu/studyu/commit/15af570ab0cc7d6ab053efac1666b6380c94a692)) + - **FIX**: check min app version improvements. ([8d36dc78](https://github.com/hpi-studyu/studyu/commit/8d36dc78771d748483bbf3ad22794a95e73dad06)) + - **FIX**: future-proof deserialization of studies. ([ca7c3145](https://github.com/hpi-studyu/studyu/commit/ca7c3145cd663dda47716ffa4ac5cef3fb25da84)) + - **FEAT**: show hidden studies info with MaterialBanner. ([5cac27d5](https://github.com/hpi-studyu/studyu/commit/5cac27d58cb3415c54de5ecc07c1eed4df74ac97)) + - **FEAT**: check app min version on resume. ([e82c3ac6](https://github.com/hpi-studyu/studyu/commit/e82c3ac68beb4adf0662753c551d7cf3d53814b9)) + - **FEAT**: rework deserialization of unsupported types to throw exception. ([54956cf1](https://github.com/hpi-studyu/studyu/commit/54956cf17c879dce27821da3a85f2d8d509542e7)) + - **FEAT**: check min app version and force update. ([08f33618](https://github.com/hpi-studyu/studyu/commit/08f3361865aa4b158e9e29e69efd30547db9991a)) + +#### `studyu_core` - `v4.3.3-dev.4` + + - **REFACTOR**: login process and offline mode. ([aab64a42](https://github.com/hpi-studyu/studyu/commit/aab64a429df81037eb6cd9c06b7eb89b282a1a05)) + - **REFACTOR**: improve return type of publishedPublicStudies(). ([fedec441](https://github.com/hpi-studyu/studyu/commit/fedec441fd4f0f39fe35e7cb89b2922a10ac9ea3)) + - **REFACTOR**: create abstract exception and rename ExtractedSupabaseListResult. ([5ef1bc43](https://github.com/hpi-studyu/studyu/commit/5ef1bc4378c2ac35e9781a040c4868910291794b)) + - **REFACTOR**: bind faulty studies to return value. ([e6b4ed70](https://github.com/hpi-studyu/studyu/commit/e6b4ed70d367ddb9e8b1e7fd0015d0f70a179a0c)) + - **REFACTOR**: remove ExtractedSupabaseListResult. ([0d3f4af9](https://github.com/hpi-studyu/studyu/commit/0d3f4af9d201556ba5ec0884741969e7dfa47b71)) + - **FIX**: upgrade deps. ([b491c9c4](https://github.com/hpi-studyu/studyu/commit/b491c9c469ee808fe1aaa50b7a50759be2378552)) + - **FIX**: make offline mode more reliable. ([45370246](https://github.com/hpi-studyu/studyu/commit/45370246253bfdf1a884a7e873ef68d4542e8e55)) + - **FIX**: remove unnecessary code. ([0634d971](https://github.com/hpi-studyu/studyu/commit/0634d971f9576be4ca663c6cc2f7543bab2374ff)) + - **FIX**: check min app version improvements. ([8d36dc78](https://github.com/hpi-studyu/studyu/commit/8d36dc78771d748483bbf3ad22794a95e73dad06)) + - **FIX**: future-proof deserialization of studies. ([ca7c3145](https://github.com/hpi-studyu/studyu/commit/ca7c3145cd663dda47716ffa4ac5cef3fb25da84)) + - **FEAT**: rework deserialization of unsupported types to throw exception. ([54956cf1](https://github.com/hpi-studyu/studyu/commit/54956cf17c879dce27821da3a85f2d8d509542e7)) + - **FEAT**: check min app version and force update. ([08f33618](https://github.com/hpi-studyu/studyu/commit/08f3361865aa4b158e9e29e69efd30547db9991a)) + +#### `studyu_designer_v2` - `v1.6.2-dev.6` + + - **FIX**: upgrade deps. ([b491c9c4](https://github.com/hpi-studyu/studyu/commit/b491c9c469ee808fe1aaa50b7a50759be2378552)) + - **FIX**: enable color emoji. ([e7f9ddcb](https://github.com/hpi-studyu/studyu/commit/e7f9ddcb7dfbb11e9fdd05e3791b55d2a1fe52b9)) + - **FIX**: temporarily disable free text for the designer. ([00e0b1e6](https://github.com/hpi-studyu/studyu/commit/00e0b1e60e368d1e3620eec61924ff17a098f386)) + +#### `studyu_flutter_common` - `v1.7.0-dev.5` + + - **FIX**: upgrade deps. ([b491c9c4](https://github.com/hpi-studyu/studyu/commit/b491c9c469ee808fe1aaa50b7a50759be2378552)) + + ## 2024-03-06 ### Changes diff --git a/app/CHANGELOG.md b/app/CHANGELOG.md index ce28991fc..d03fa8df0 100644 --- a/app/CHANGELOG.md +++ b/app/CHANGELOG.md @@ -1,3 +1,27 @@ +## 2.6.5-dev.6 + + - **REFACTOR**: login process and offline mode. ([aab64a42](https://github.com/hpi-studyu/studyu/commit/aab64a429df81037eb6cd9c06b7eb89b282a1a05)) + - **REFACTOR**: remove unnecessary late. ([f17902e2](https://github.com/hpi-studyu/studyu/commit/f17902e2d22294cc0ddcaa25ed091982da8fc082)) + - **REFACTOR**: improve return type of publishedPublicStudies(). ([fedec441](https://github.com/hpi-studyu/studyu/commit/fedec441fd4f0f39fe35e7cb89b2922a10ac9ea3)) + - **REFACTOR**: create abstract exception and rename ExtractedSupabaseListResult. ([5ef1bc43](https://github.com/hpi-studyu/studyu/commit/5ef1bc4378c2ac35e9781a040c4868910291794b)) + - **REFACTOR**: bind faulty studies to return value. ([e6b4ed70](https://github.com/hpi-studyu/studyu/commit/e6b4ed70d367ddb9e8b1e7fd0015d0f70a179a0c)) + - **REFACTOR**: remove ExtractedSupabaseListResult. ([0d3f4af9](https://github.com/hpi-studyu/studyu/commit/0d3f4af9d201556ba5ec0884741969e7dfa47b71)) + - **REFACTOR**: mounted check. ([e1b07e45](https://github.com/hpi-studyu/studyu/commit/e1b07e45093dd77898274e92582ba48b54e762e3)) + - **REFACTOR**: move constants to separate file. ([b4d3853d](https://github.com/hpi-studyu/studyu/commit/b4d3853d827c3e0f08db16234f5a136094938a0d)) + - **FIX**: upgrade deps. ([b491c9c4](https://github.com/hpi-studyu/studyu/commit/b491c9c469ee808fe1aaa50b7a50759be2378552)) + - **FIX**: make offline mode more reliable. ([45370246](https://github.com/hpi-studyu/studyu/commit/45370246253bfdf1a884a7e873ef68d4542e8e55)) + - **FIX**: web compatibility for app outdated screen. ([40f39afe](https://github.com/hpi-studyu/studyu/commit/40f39afe60293bfd62ea705a55f59012c6aa00e3)) + - **FIX**: multi-retrieval of public studies. ([4218eb00](https://github.com/hpi-studyu/studyu/commit/4218eb00f9067ea9586eb1a5b76dba202b493e5f)) + - **FIX**: review comments. ([71896db6](https://github.com/hpi-studyu/studyu/commit/71896db6425a04cbfe644fb73045102287abcd2b)) + - **FIX**: showSnackBar() method cannot be called during build. ([e835db62](https://github.com/hpi-studyu/studyu/commit/e835db62a6ca61b6e1afd3d0df4d0d9e53153a07)) + - **FIX**: translation. ([15af570a](https://github.com/hpi-studyu/studyu/commit/15af570ab0cc7d6ab053efac1666b6380c94a692)) + - **FIX**: check min app version improvements. ([8d36dc78](https://github.com/hpi-studyu/studyu/commit/8d36dc78771d748483bbf3ad22794a95e73dad06)) + - **FIX**: future-proof deserialization of studies. ([ca7c3145](https://github.com/hpi-studyu/studyu/commit/ca7c3145cd663dda47716ffa4ac5cef3fb25da84)) + - **FEAT**: show hidden studies info with MaterialBanner. ([5cac27d5](https://github.com/hpi-studyu/studyu/commit/5cac27d58cb3415c54de5ecc07c1eed4df74ac97)) + - **FEAT**: check app min version on resume. ([e82c3ac6](https://github.com/hpi-studyu/studyu/commit/e82c3ac68beb4adf0662753c551d7cf3d53814b9)) + - **FEAT**: rework deserialization of unsupported types to throw exception. ([54956cf1](https://github.com/hpi-studyu/studyu/commit/54956cf17c879dce27821da3a85f2d8d509542e7)) + - **FEAT**: check min app version and force update. ([08f33618](https://github.com/hpi-studyu/studyu/commit/08f3361865aa4b158e9e29e69efd30547db9991a)) + ## 2.6.5-dev.5 - **FIX**: upgrade deps. ([5327eb97](https://github.com/hpi-studyu/studyu/commit/5327eb971e6673847dc09ef56923b6a73ae73654)) diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 575a82e64..dd92585c9 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_app -version: 2.6.5-dev.5 +version: 2.6.5-dev.6 description: Partake in digital N-of-1 trials with the innovative StudyU Health App publish_to: none homepage: https://studyu.health @@ -33,8 +33,8 @@ dependencies: sentry_flutter: ^7.18.0 sentry_logging: ^7.18.0 shared_preferences: ^2.2.2 - studyu_core: ^4.3.3-dev.3 - studyu_flutter_common: ^1.7.0-dev.4 + studyu_core: ^4.3.3-dev.4 + studyu_flutter_common: ^1.7.0-dev.5 supabase: ^2.0.8 supabase_flutter: ^2.3.4 timeline_tile: ^2.0.0 diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 7671924c5..703ecff23 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,3 +1,18 @@ +## 4.3.3-dev.4 + + - **REFACTOR**: login process and offline mode. ([aab64a42](https://github.com/hpi-studyu/studyu/commit/aab64a429df81037eb6cd9c06b7eb89b282a1a05)) + - **REFACTOR**: improve return type of publishedPublicStudies(). ([fedec441](https://github.com/hpi-studyu/studyu/commit/fedec441fd4f0f39fe35e7cb89b2922a10ac9ea3)) + - **REFACTOR**: create abstract exception and rename ExtractedSupabaseListResult. ([5ef1bc43](https://github.com/hpi-studyu/studyu/commit/5ef1bc4378c2ac35e9781a040c4868910291794b)) + - **REFACTOR**: bind faulty studies to return value. ([e6b4ed70](https://github.com/hpi-studyu/studyu/commit/e6b4ed70d367ddb9e8b1e7fd0015d0f70a179a0c)) + - **REFACTOR**: remove ExtractedSupabaseListResult. ([0d3f4af9](https://github.com/hpi-studyu/studyu/commit/0d3f4af9d201556ba5ec0884741969e7dfa47b71)) + - **FIX**: upgrade deps. ([b491c9c4](https://github.com/hpi-studyu/studyu/commit/b491c9c469ee808fe1aaa50b7a50759be2378552)) + - **FIX**: make offline mode more reliable. ([45370246](https://github.com/hpi-studyu/studyu/commit/45370246253bfdf1a884a7e873ef68d4542e8e55)) + - **FIX**: remove unnecessary code. ([0634d971](https://github.com/hpi-studyu/studyu/commit/0634d971f9576be4ca663c6cc2f7543bab2374ff)) + - **FIX**: check min app version improvements. ([8d36dc78](https://github.com/hpi-studyu/studyu/commit/8d36dc78771d748483bbf3ad22794a95e73dad06)) + - **FIX**: future-proof deserialization of studies. ([ca7c3145](https://github.com/hpi-studyu/studyu/commit/ca7c3145cd663dda47716ffa4ac5cef3fb25da84)) + - **FEAT**: rework deserialization of unsupported types to throw exception. ([54956cf1](https://github.com/hpi-studyu/studyu/commit/54956cf17c879dce27821da3a85f2d8d509542e7)) + - **FEAT**: check min app version and force update. ([08f33618](https://github.com/hpi-studyu/studyu/commit/08f3361865aa4b158e9e29e69efd30547db9991a)) + ## 4.3.3-dev.3 - **FIX**: upgrade deps. ([5327eb97](https://github.com/hpi-studyu/studyu/commit/5327eb971e6673847dc09ef56923b6a73ae73654)) diff --git a/core/pubspec.yaml b/core/pubspec.yaml index cea21e8e5..c64a73e9b 100644 --- a/core/pubspec.yaml +++ b/core/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_core -version: 4.3.3-dev.3 +version: 4.3.3-dev.4 description: This package contains StudyU models and common functions for the app and designer packages homepage: https://studyu.health repository: https://github.com/hpi-studyu/studyu diff --git a/designer_v2/CHANGELOG.md b/designer_v2/CHANGELOG.md index 34d1aa5c7..3dfb4d26b 100644 --- a/designer_v2/CHANGELOG.md +++ b/designer_v2/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.6.2-dev.6 + + - **FIX**: upgrade deps. ([b491c9c4](https://github.com/hpi-studyu/studyu/commit/b491c9c469ee808fe1aaa50b7a50759be2378552)) + - **FIX**: enable color emoji. ([e7f9ddcb](https://github.com/hpi-studyu/studyu/commit/e7f9ddcb7dfbb11e9fdd05e3791b55d2a1fe52b9)) + - **FIX**: temporarily disable free text for the designer. ([00e0b1e6](https://github.com/hpi-studyu/studyu/commit/00e0b1e60e368d1e3620eec61924ff17a098f386)) + ## 1.6.2-dev.5 - **FIX**: upgrade deps. ([5327eb97](https://github.com/hpi-studyu/studyu/commit/5327eb971e6673847dc09ef56923b6a73ae73654)) diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index 7b9106f8a..d2fa3bace 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_designer_v2 -version: 1.6.2-dev.5 +version: 1.6.2-dev.6 description: Implement digital N-of-1 studies seamlessly with the StudyU Health Designer publish_to: none homepage: https://studyu.health @@ -33,8 +33,8 @@ dependencies: reactive_range_slider: ^2.0.0 rxdart: ^0.27.7 shared_preferences: ^2.2.2 - studyu_core: ^4.3.3-dev.3 - studyu_flutter_common: ^1.7.0-dev.4 + studyu_core: ^4.3.3-dev.4 + studyu_flutter_common: ^1.7.0-dev.5 supabase: ^2.0.8 supabase_flutter: ^2.3.4 url_launcher: ^6.2.5 diff --git a/flutter_common/CHANGELOG.md b/flutter_common/CHANGELOG.md index e76e9112f..1eca51af6 100644 --- a/flutter_common/CHANGELOG.md +++ b/flutter_common/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.0-dev.5 + + - **FIX**: upgrade deps. ([b491c9c4](https://github.com/hpi-studyu/studyu/commit/b491c9c469ee808fe1aaa50b7a50759be2378552)) + ## 1.7.0-dev.4 - **FIX**: upgrade deps. ([5327eb97](https://github.com/hpi-studyu/studyu/commit/5327eb971e6673847dc09ef56923b6a73ae73654)) diff --git a/flutter_common/pubspec.yaml b/flutter_common/pubspec.yaml index 131c00caf..ebc808fa0 100644 --- a/flutter_common/pubspec.yaml +++ b/flutter_common/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_flutter_common -version: 1.7.0-dev.4 +version: 1.7.0-dev.5 description: StudyU common flutter components and functions for app and designer homepage: https://studyu.health repository: https://github.com/hpi-studyu/studyu @@ -12,7 +12,7 @@ dependencies: sdk: flutter flutter_dotenv: ^5.1.0 shared_preferences: ^2.2.2 - studyu_core: ^4.3.3-dev.3 + studyu_core: ^4.3.3-dev.4 supabase_flutter: ^2.3.4 uuid: ^4.3.3 From 591649154b7b7acbf3e9ed36a68d8b911a914ed1 Mon Sep 17 00:00:00 2001 From: Johannes Vedder Date: Sat, 23 Mar 2024 11:34:36 +0100 Subject: [PATCH 14/14] chore: lock files --- app/pubspec.lock | 4 ++-- designer_v2/pubspec.lock | 4 ++-- flutter_common/pubspec.lock | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 6b8cb6dda..62a33ee44 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -1024,14 +1024,14 @@ packages: path: "../core" relative: true source: path - version: "4.3.3-dev.3" + version: "4.3.3-dev.4" studyu_flutter_common: dependency: "direct main" description: path: "../flutter_common" relative: true source: path - version: "1.7.0-dev.4" + version: "1.7.0-dev.5" supabase: dependency: "direct main" description: diff --git a/designer_v2/pubspec.lock b/designer_v2/pubspec.lock index d946ed5f8..87cddc45d 100644 --- a/designer_v2/pubspec.lock +++ b/designer_v2/pubspec.lock @@ -999,14 +999,14 @@ packages: path: "../core" relative: true source: path - version: "4.3.3-dev.3" + version: "4.3.3-dev.4" studyu_flutter_common: dependency: "direct main" description: path: "../flutter_common" relative: true source: path - version: "1.7.0-dev.4" + version: "1.7.0-dev.5" supabase: dependency: "direct main" description: diff --git a/flutter_common/pubspec.lock b/flutter_common/pubspec.lock index b41e1997a..43f98a7bc 100644 --- a/flutter_common/pubspec.lock +++ b/flutter_common/pubspec.lock @@ -491,7 +491,7 @@ packages: path: "../core" relative: true source: path - version: "4.3.3-dev.3" + version: "4.3.3-dev.4" supabase: dependency: transitive description: