diff --git a/CHANGELOG.md b/CHANGELOG.md index e462912d5..f078ee911 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,27 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-03-26 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`studyu_designer_v2` - `v1.6.3`](#studyu_designer_v2---v163) + +--- + +#### `studyu_designer_v2` - `v1.6.3` + + - **FIX**: disable freetext for Designer UI surveys. ([7e3988eb](https://github.com/hpi-studyu/studyu/commit/7e3988ebc80620be52636077a6fb13a180c1802a)) + + ## 2024-03-25 ### Changes diff --git a/designer_v2/CHANGELOG.md b/designer_v2/CHANGELOG.md index 68c78859a..d48e489a1 100644 --- a/designer_v2/CHANGELOG.md +++ b/designer_v2/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.3 + + - **FIX**: disable freetext for Designer UI surveys. ([7e3988eb](https://github.com/hpi-studyu/studyu/commit/7e3988ebc80620be52636077a6fb13a180c1802a)) + ## 1.6.2 - Graduate package to a stable release. See pre-releases prior to this version for changelog entries. diff --git a/designer_v2/lib/features/design/shared/questionnaire/question/question_form_view.dart b/designer_v2/lib/features/design/shared/questionnaire/question/question_form_view.dart index 6746b9aa8..03010098d 100644 --- a/designer_v2/lib/features/design/shared/questionnaire/question/question_form_view.dart +++ b/designer_v2/lib/features/design/shared/questionnaire/question/question_form_view.dart @@ -92,7 +92,8 @@ class _SurveyQuestionFormViewState extends ConsumerState _buildResponseTypeHeader(BuildContext context) { final theme = Theme.of(context); - + final noFreeText = formViewModel.questionTypeControlOptions; + noFreeText.removeWhere((element) => element.value == SurveyQuestionType.freeText); return Column( children: [ FormTableLayout( @@ -106,7 +107,7 @@ class _SurveyQuestionFormViewState extends ConsumerState data: theme.copyWith(inputDecorationTheme: ThemeConfig.dropdownInputDecorationTheme(theme)), child: ReactiveDropdownField( formControl: formViewModel.questionTypeControl, - items: formViewModel.questionTypeControlOptions.map((option) { + items: noFreeText.map((option) { final menuItemTheme = ThemeConfig.dropdownMenuItemTheme(theme); final iconTheme = menuItemTheme.iconTheme ?? theme.iconTheme; return DropdownMenuItem( 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 c1d3d7945..a77acb930 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}"); diff --git a/designer_v2/pubspec.yaml b/designer_v2/pubspec.yaml index ebc1e0c53..460b8affe 100644 --- a/designer_v2/pubspec.yaml +++ b/designer_v2/pubspec.yaml @@ -1,5 +1,5 @@ name: studyu_designer_v2 -version: 1.6.2 +version: 1.6.3 description: Implement digital N-of-1 studies seamlessly with the StudyU Health Designer publish_to: none homepage: https://studyu.health 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 7eb253576..52be35c24 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,19 +12,6 @@ [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 @@ -57,6 +44,19 @@ [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,68 +129,18 @@ - - - - - - - - - FreeTextQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic - - - - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() - - - - - - - - - - - QuestionFormViewModel - - - - - - - - - - - ConsumerWidget - - - - - - + + - + IScaleQuestionFormViewModel - + +isMidValuesClearedInfoVisible: bool @@ -199,72 +149,122 @@ - - + + - + 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 555c9eab5..46051d998 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,4 +1,4 @@ - + [<abstract>QuestionFormData | <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; @@ -84,6 +84,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; @@ -174,83 +240,17 @@ [<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] - - + - + - + - + @@ -272,66 +272,66 @@ - + - + - + - + - - - + + - + + - + - + - - - - - - + - - + + + - + - + + + - + - - + + + + + - - + - + - - - + - + - + - + - - - + - + + + + + + - - + @@ -550,6 +550,25 @@ + + + + + + + + SurveyQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool + + + + @@ -650,122 +669,134 @@ - - - + + + - - - FormControl + + + Enum - - - + + + + - - - FormArray + + + IScaleQuestionFormViewModel + + + + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - AbstractControl + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel - - - + + + + + - - - FormGroup + + + ChoiceQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - ManagedFormViewModel + + + +Widget build() - - - + + + - - - IListActionProvider + + + ConsumerWidget - - - - + + + + + - - - SurveyQuestionFormView + + + BoolQuestionFormView - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +formViewModel: QuestionFormViewModel - - - - - - - - Enum + + + +Widget build() - - - + + + - + FreeTextQuestionFormView - + +formViewModel: QuestionFormViewModel +generateLabelHelpTextMap: dynamic - + +Widget build() +Widget disableOnReadonly() @@ -774,99 +805,68 @@ - - - + + + - - - ConsumerWidget + + + FormControl - - - - - - - - IScaleQuestionFormViewModel - - + + + - - - +isMidValuesClearedInfoVisible: bool + + + FormArray - - - - - - - - ScaleQuestionFormView - - + + + - - - +formViewModel: QuestionFormViewModel + + + AbstractControl - - - - - - - - - ChoiceQuestionFormView - - - - - - +formViewModel: QuestionFormViewModel - - + + + - - - +Widget build() + + + FormGroup - - - - - + + + - - - BoolQuestionFormView + + + ManagedFormViewModel - - - +formViewModel: QuestionFormViewModel - - + + + + - - - +Widget build() + + + IListActionProvider 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 b4f17f3a1..45482827d 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,28 +1,5 @@ - - [<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 + + [<abstract>QuestionFormData | <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; +questionId: String; @@ -107,6 +84,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; @@ -197,71 +240,28 @@ [<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 + [<abstract>WithQuestionnaireControls | - +formViewModel: QuestionFormViewModel - | - +Widget build() - ] - - [ChoiceQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[ChoiceQuestionFormView] - - [BoolQuestionFormView - | - +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() ] - [BoolQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[BoolQuestionFormView] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] [QuestionnaireFormData | @@ -279,207 +279,127 @@ - + - - - - - + - + - + - - - - - - + + + + + + - - - - + - - - - - - + + + - + - - - + + + - + - - - + - + - - - + + - + + - + - + - + - + + + - - - - - - + - - + + + - + - + + + - + - - - - - + - + - - - + - + - + - + - - - + - + - - + + - + - - - - - - - - - - WithQuestionnaireControls - - - - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() - - - + + + + - - - - - - - FormArray - - - + + + - - - - - - - FormViewModelCollection - - - + + - - - - - - - IFormViewModelDelegate - - - + + + - - - - - - - IProviderArgsResolver - - - + + + + - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -492,7 +412,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -505,16 +425,16 @@ - - + + - + SurveyQuestionType - + +index: int <static>+values: List<SurveyQuestionType> @@ -528,9 +448,9 @@ - + - + IFormData @@ -539,17 +459,17 @@ - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -557,7 +477,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -569,24 +489,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -597,17 +517,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -624,7 +544,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -635,9 +555,9 @@ - + - + Color @@ -646,17 +566,17 @@ - - - + + + - + FreeTextQuestionFormData - + +textLengthRange: List<int> +textType: FreeTextQuestionType @@ -665,7 +585,7 @@ - + +Question<dynamic> toQuestion() +FreeTextQuestionFormData copy() @@ -676,28 +596,47 @@ - + - + FreeTextQuestionType + + + + + + + + SurveyQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool + + + + - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -761,7 +700,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -785,111 +724,134 @@ - - - + + + - - - FormControl + + + Enum - - - + + + + - - - AbstractControl + + + IScaleQuestionFormViewModel + + + + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - FormGroup + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel - - - + + + + + - - - ManagedFormViewModel + + + ChoiceQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - IListActionProvider + + + +Widget build() - - - - + + + - - - SurveyQuestionFormView + + + ConsumerWidget - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + + + + + + + + BoolQuestionFormView - - - - + + + +formViewModel: QuestionFormViewModel + + - - - Enum + + + +Widget build() - - - + + + - + FreeTextQuestionFormView - + +formViewModel: QuestionFormViewModel +generateLabelHelpTextMap: dynamic - + +Widget build() +Widget disableOnReadonly() @@ -898,123 +860,161 @@ - - - + + + - - - ConsumerWidget + + + FormControl - - - - + + + - - - IScaleQuestionFormViewModel + + + FormArray - - - +isMidValuesClearedInfoVisible: bool + + + + + + + + AbstractControl - - - - + + + - - - ScaleQuestionFormView + + + FormGroup - - - +formViewModel: QuestionFormViewModel + + + + + + + + ManagedFormViewModel - - - - - + + + - - - ChoiceQuestionFormView + + + IListActionProvider - - - +formViewModel: QuestionFormViewModel + + + + + + + + + + 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()> + + + + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - - + + + - - - BoolQuestionFormView + + + FormViewModelCollection - - - +formViewModel: QuestionFormViewModel + + + + + + + + IFormViewModelDelegate - - - +Widget build() + + + + + + + + IProviderArgsResolver - - - + + + - + 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 09e4b149b..04839244d 100644 --- a/docs/uml/designer_v2/lib/features/design/shared/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/shared/uml.svg @@ -1,78 +1,5 @@ - - [<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 + + [<abstract>QuestionFormData | <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)>; +questionId: String; @@ -157,6 +84,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; @@ -247,461 +240,238 @@ [<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 + [<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>IScaleQuestionFormViewModel + [QuestionnaireFormData | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + +questionsData: List<QuestionFormData>?; + +id: String | - +formViewModel: QuestionFormViewModel + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [ScaleQuestionFormView]o-[QuestionFormViewModel] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [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] - [QuestionnaireFormData + [<abstract>WithScheduleControls | - +questionsData: List<QuestionFormData>?; - +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>? | - +StudyUQuestionnaire toQuestionnaire(); - +List<EligibilityCriterion> toEligibilityCriteria(); - +QuestionnaireFormData copy() + +void setScheduleControlsFrom(); + -dynamic _initReminderControl() ] - [<abstract>IFormData]<:--[QuestionnaireFormData] + [<abstract>WithScheduleControls]o-[FormControl] + [<abstract>WithScheduleControls]o-[StreamSubscription] - + - + - - + + - + - - - + + - + + + + + + - - - - + - - + + + - + - - - + + + - + - + - + - + - - - - - - + + - + - - + + + - - - - - - + + + - + - - - + + + - + - - - + + + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - - - - - - - - - - + + + - - - + + + - - - + + - + - - - - - - - - - - - - - - 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() - - - - - - - - - - - FormControl - - - - - - - - - - - StreamSubscription - - - - - - - - - - - - - IFormDataWithSchedule - - - - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? - - - - - - +Schedule toSchedule() - - - - - - - - - - - StudyUTimeOfDay - - - - - - - - - - - IFormData - - - - - - - - - - - - - ScheduleControls - - - - - - +formViewModel: WithScheduleControls - - - - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() - - - - - - - - - - - FormConsumerWidget - - - - - - - - - - - - - WithQuestionnaireControls - - - - - - +questionsArray: FormArray<dynamic> - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> - +questionnaireControls: Map<String, FormArray<dynamic>> - +propagateOnSave: bool - +questionModels: List<Q> - +questionTitles: Map<FormMode, String Function()> - - - - - - +void setQuestionnaireControlsFrom() - +QuestionnaireFormData buildQuestionnaireFormData() - +void read() - +void onCancel() - +dynamic onSave() - +Q provide() - +Q provideQuestionFormViewModel() - - - - - - - - - - - FormArray - - - + - - - - - - - FormViewModelCollection - - - + + + + - - - - - - - IFormViewModelDelegate - - - + + + + + - - - - - - - IProviderArgsResolver - - - + + + - - - + + + - + QuestionFormData - + <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> +questionId: String @@ -714,7 +484,7 @@ - + +Question<dynamic> toQuestion() +EligibilityCriterion toEligibilityCriterion() @@ -727,16 +497,16 @@ - - + + - + SurveyQuestionType - + +index: int <static>+values: List<SurveyQuestionType> @@ -748,19 +518,30 @@ + + + + + + + IFormData + + + + - - - + + + - + ChoiceQuestionFormData - + +isMultipleChoice: bool +answerOptions: List<String> @@ -768,7 +549,7 @@ - + +Question<dynamic> toQuestion() +QuestionFormData copy() @@ -780,24 +561,24 @@ - - - + + + - + BoolQuestionFormData - + <static>+kResponseOptions: Map<String, bool> +responseOptions: List<String> - + +Question<dynamic> toQuestion() +BoolQuestionFormData copy() @@ -808,17 +589,17 @@ - - - + + + - + ScaleQuestionFormData - + +minValue: double +maxValue: double @@ -835,7 +616,7 @@ - + +ScaleQuestion toQuestion() +QuestionFormData copy() @@ -846,9 +627,9 @@ - + - + Color @@ -857,17 +638,17 @@ - - - + + + - + FreeTextQuestionFormData - + +textLengthRange: List<int> +textType: FreeTextQuestionType @@ -876,7 +657,7 @@ - + +Question<dynamic> toQuestion() +FreeTextQuestionFormData copy() @@ -887,28 +668,47 @@ - + - + FreeTextQuestionType + + + + + + + + SurveyQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool + + + + - - - + + + - + QuestionFormViewModel - + <static>+defaultQuestionType: SurveyQuestionType -_titles: Map<FormMode, String Function()>? @@ -972,7 +772,7 @@ - + +String? scaleMidLabelAt() -dynamic _onScaleRangeChanged() @@ -996,100 +796,134 @@ - - - + + + - - - AbstractControl + + + Enum - - - + + + + - - - FormGroup + + + IScaleQuestionFormViewModel - - - - - - - - ManagedFormViewModel + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - IListActionProvider + + + ScaleQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel - - - - + + + + + - - - SurveyQuestionFormView + + + ChoiceQuestionFormView - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() - - - + + + - - - Enum + + + ConsumerWidget + + + + + + + + + + + + + BoolQuestionFormView + + + + + + +formViewModel: QuestionFormViewModel + + + + + + +Widget build() - - - + + + - + FreeTextQuestionFormView - + +formViewModel: QuestionFormViewModel +generateLabelHelpTextMap: dynamic - + +Widget build() +Widget disableOnReadonly() @@ -1098,123 +932,161 @@ - - - + + + - - - ConsumerWidget + + + FormControl - - - - + + + - - - IScaleQuestionFormViewModel + + + FormArray - - - +isMidValuesClearedInfoVisible: bool + + + + + + + + AbstractControl - - - - + + + - - - ScaleQuestionFormView + + + FormGroup - - - +formViewModel: QuestionFormViewModel + + + + + + + + ManagedFormViewModel - - - - - + + + - - - ChoiceQuestionFormView + + + IListActionProvider - - - +formViewModel: QuestionFormViewModel + + + + + + + + + + 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()> + + + + + + +void setQuestionnaireControlsFrom() + +QuestionnaireFormData buildQuestionnaireFormData() + +void read() + +void onCancel() + +dynamic onSave() + +Q provide() + +Q provideQuestionFormViewModel() - - - - - + + + - - - BoolQuestionFormView + + + FormViewModelCollection - - - +formViewModel: QuestionFormViewModel + + + + + + + + IFormViewModelDelegate - - - +Widget build() + + + + + + + + IProviderArgsResolver - - - + + + - + QuestionnaireFormData - + +questionsData: List<QuestionFormData>? +id: String - + +StudyUQuestionnaire toQuestionnaire() +List<EligibilityCriterion> toEligibilityCriteria() @@ -1223,6 +1095,134 @@ + + + + + + + + + IFormDataWithSchedule + + + + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? + + + + + + +Schedule toSchedule() + + + + + + + + + + + StudyUTimeOfDay + + + + + + + + + + + + + ScheduleControls + + + + + + +formViewModel: WithScheduleControls + + + + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() + + + + + + + + + + + + + WithScheduleControls + + + + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? + + + + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() + + + + + + + + + + + FormConsumerWidget + + + + + + + + + + + StreamSubscription + + + + diff --git a/docs/uml/designer_v2/lib/features/design/uml.svg b/docs/uml/designer_v2/lib/features/design/uml.svg index efdc2e95e..a4a4e8bc0 100644 --- a/docs/uml/designer_v2/lib/features/design/uml.svg +++ b/docs/uml/designer_v2/lib/features/design/uml.svg @@ -1,154 +1,24 @@ - - [StudyInfoFormData + + [StudyFormScaffold | - +title: String; - +description: String?; - +iconName: String; - +contactInfoFormData: StudyContactInfoFormData; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [StudyInfoFormData]o-[StudyContactInfoFormData] - [<abstract>IStudyFormData]<:--[StudyInfoFormData] - - [StudyContactInfoFormData - | - +organization: String?; - +institutionalReviewBoard: String?; - +institutionalReviewBoardNumber: String?; - +researchers: String?; - +email: String?; - +website: String?; - +phone: String?; - +additionalInfo: String?; - +id: String - | - +Study apply(); - +StudyInfoFormData copy() - ] - - [<abstract>IStudyFormData]<:--[StudyContactInfoFormData] - - [StudyDesignInfoFormView + +studyId: String; + +formViewModelBuilder: T Function(WidgetRef); + +formViewBuilder: Widget Function(T) | +Widget build() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInfoFormView] - - [StudyInfoFormViewModel - | - +study: Study; - +titleControl: FormControl<String>; - +iconControl: FormControl<IconOption>; - +descriptionControl: FormControl<String>; - +organizationControl: FormControl<String>; - +reviewBoardControl: FormControl<String>; - +reviewBoardNumberControl: FormControl<String>; - +researchersControl: FormControl<String>; - +emailControl: FormControl<String>; - +websiteControl: FormControl<String>; - +phoneControl: FormControl<String>; - +additionalInfoControl: FormControl<String>; - +form: FormGroup; - +titles: Map<FormMode, String>; - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; - +titleRequired: dynamic; - +descriptionRequired: dynamic; - +iconRequired: dynamic; - +organizationRequired: dynamic; - +reviewBoardRequired: dynamic; - +reviewBoardNumberRequired: dynamic; - +researchersRequired: dynamic; - +emailRequired: dynamic; - +phoneRequired: dynamic; - +emailFormat: dynamic; - +websiteFormat: dynamic - | - +void setControlsFrom(); - +StudyInfoFormData buildFormData() - ] - - [StudyInfoFormViewModel]o-[Study] - [StudyInfoFormViewModel]o-[FormControl] - [StudyInfoFormViewModel]o-[FormGroup] - [<abstract>FormViewModel]<:-[StudyInfoFormViewModel] - - [<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] + [StudyFormScaffold]o-[T Function(WidgetRef)] + [StudyFormScaffold]o-[Widget Function(T)] + [<abstract>ConsumerWidget]<:-[StudyFormScaffold] - [<abstract>WithQuestionnaireControls - | - +questionsArray: FormArray<dynamic>; - +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; - +questionnaireControls: Map<String, FormArray<dynamic>>; - +propagateOnSave: bool; - +questionModels: List<Q>; - +questionTitles: Map<FormMode, String Function()> + [StudyFormValidationSet | - +void setQuestionnaireControlsFrom(); - +QuestionnaireFormData buildQuestionnaireFormData(); - +void read(); - +void onCancel(); - +dynamic onSave(); - +Q provide(); - +Q provideQuestionFormViewModel() + +index: int; + <static>+values: List<StudyFormValidationSet> ] - [<abstract>WithQuestionnaireControls]o-[FormArray] - [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] - [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] - [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] + [Enum]<:--[StudyFormValidationSet] [<abstract>QuestionFormData | @@ -235,6 +105,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; @@ -325,141 +261,190 @@ [<abstract>ManagedFormViewModel]<:-[QuestionFormViewModel] [<abstract>IListActionProvider]<:--[QuestionFormViewModel] - [SurveyQuestionFormView + [<abstract>WithQuestionnaireControls | - +formViewModel: QuestionFormViewModel; - +isHtmlStyleable: bool + +questionsArray: FormArray<dynamic>; + +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData>; + +questionnaireControls: Map<String, FormArray<dynamic>>; + +propagateOnSave: bool; + +questionModels: List<Q>; + +questionTitles: Map<FormMode, String Function()> + | + +void setQuestionnaireControlsFrom(); + +QuestionnaireFormData buildQuestionnaireFormData(); + +void read(); + +void onCancel(); + +dynamic onSave(); + +Q provide(); + +Q provideQuestionFormViewModel() ] - [SurveyQuestionFormView]o-[QuestionFormViewModel] + [<abstract>WithQuestionnaireControls]o-[FormArray] + [<abstract>WithQuestionnaireControls]o-[FormViewModelCollection] + [<abstract>IFormViewModelDelegate]<:--[<abstract>WithQuestionnaireControls] + [<abstract>IProviderArgsResolver]<:--[<abstract>WithQuestionnaireControls] - [SurveyQuestionType + [QuestionnaireFormData | - +index: int; - <static>+values: List<SurveyQuestionType>; - <static>+choice: SurveyQuestionType; - <static>+bool: SurveyQuestionType; - <static>+scale: SurveyQuestionType; - <static>+freeText: SurveyQuestionType + +questionsData: List<QuestionFormData>?; + +id: String + | + +StudyUQuestionnaire toQuestionnaire(); + +List<EligibilityCriterion> toEligibilityCriteria(); + +QuestionnaireFormData copy() ] - [SurveyQuestionType]o-[SurveyQuestionType] - [Enum]<:--[SurveyQuestionType] + [<abstract>IFormData]<:--[QuestionnaireFormData] - [FreeTextQuestionFormView + [<abstract>IFormDataWithSchedule | - +formViewModel: QuestionFormViewModel; - +generateLabelHelpTextMap: dynamic + +instanceId: String; + +isTimeLocked: bool; + +timeLockStart: StudyUTimeOfDay?; + +timeLockEnd: StudyUTimeOfDay?; + +hasReminder: bool; + +reminderTime: StudyUTimeOfDay? | - +Widget build(); - +Widget disableOnReadonly(); - +Widget generateRow() + +Schedule toSchedule() ] - [FreeTextQuestionFormView]o-[QuestionFormViewModel] - [<abstract>ConsumerWidget]<:-[FreeTextQuestionFormView] + [<abstract>IFormDataWithSchedule]o-[StudyUTimeOfDay] + [<abstract>IFormData]<:--[<abstract>IFormDataWithSchedule] - [<abstract>IScaleQuestionFormViewModel + [ScheduleControls | - +isMidValuesClearedInfoVisible: bool - ] - - [ScaleQuestionFormView + +formViewModel: WithScheduleControls | - +formViewModel: QuestionFormViewModel + +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 | @@ -475,23 +460,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 @@ -499,35 +467,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 | @@ -566,152 +535,267 @@ [<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> + +title: String; + +description: String?; + +tasksData: List<InterventionTaskFormData>?; + +iconName: String?; + <static>+kDefaultTitle: String; + +id: 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() + +Intervention toIntervention(); + +InterventionFormData copy() ] - [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>IFormData]<:-[InterventionFormData] - [InterventionsFormData + [<abstract>StudyScheduleControls | - +interventionsData: List<InterventionFormData>; - +studyScheduleData: StudyScheduleFormData; + <static>+defaultScheduleType: PhaseSequence; + <static>+defaultScheduleTypeSequence: String; + <static>+defaultNumCycles: int; + <static>+defaultPeriodLength: int; + +sequenceTypeControl: FormControl<PhaseSequence>; + +sequenceTypeCustomControl: FormControl<String>; + +phaseDurationControl: FormControl<int>; + +numCyclesControl: FormControl<int>; + +includeBaselineControl: FormControl<bool>; + +studyScheduleControls: Map<String, FormControl<Object>>; + <static>+kNumCyclesMin: int; + <static>+kNumCyclesMax: int; + <static>+kPhaseDurationMin: int; + <static>+kPhaseDurationMax: int; + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>>; + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +numCyclesRange: dynamic; + +phaseDurationRange: dynamic; + +customSequenceRequired: dynamic + | + +void setStudyScheduleControlsFrom(); + +StudyScheduleFormData buildStudyScheduleFormData(); + +bool isSequencingCustom() + ] + + [<abstract>StudyScheduleControls]o-[PhaseSequence] + [<abstract>StudyScheduleControls]o-[FormControl] + + [EnrollmentFormData + | + <static>+kDefaultEnrollmentType: Participation; + +enrollmentType: Participation; + +questionnaireFormData: QuestionnaireFormData; + +consentItemsFormData: List<ConsentItemFormData>?; +id: String | +Study apply(); - +InterventionsFormData copy() + +EnrollmentFormData copy() ] - [InterventionsFormData]o-[StudyScheduleFormData] - [<abstract>IStudyFormData]<:--[InterventionsFormData] + [EnrollmentFormData]o-[Participation] + [EnrollmentFormData]o-[QuestionnaireFormData] + [<abstract>IStudyFormData]<:--[EnrollmentFormData] - [StudyDesignInterventionsFormView + [ConsentItemFormViewModel | - +Widget build() + +consentIdControl: FormControl<String>; + +titleControl: FormControl<String>; + +descriptionControl: FormControl<String>; + +iconControl: FormControl<IconOption>; + +form: FormGroup; + +consentId: String; + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>>; + +titleRequired: dynamic; + +descriptionRequired: dynamic; + +titles: Map<FormMode, String> + | + +void setControlsFrom(); + +ConsentItemFormData buildFormData(); + +ConsentItemFormViewModel createDuplicate() ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignInterventionsFormView] + [ConsentItemFormViewModel]o-[FormControl] + [ConsentItemFormViewModel]o-[FormGroup] + [<abstract>ManagedFormViewModel]<:-[ConsentItemFormViewModel] - [StudyScheduleFormView + [ConsentItemFormView | - +formViewModel: StudyScheduleControls + +formViewModel: ConsentItemFormViewModel + ] + + [ConsentItemFormView]o-[ConsentItemFormViewModel] + + [<abstract>IScreenerQuestionLogicFormViewModel | - -FormTableRow _renderCustomSequence(); - +Widget build() + +isDirtyOptionsBannerVisible: bool ] - [StudyScheduleFormView]o-[<abstract>StudyScheduleControls] - [<abstract>FormConsumerWidget]<:-[StudyScheduleFormView] + [ScreenerQuestionLogicFormView + | + +formViewModel: ScreenerQuestionFormViewModel + | + +Widget build(); + -dynamic _buildInfoBanner(); + -dynamic _buildAnswerOptionsLogicControls(); + -List<Widget> _buildOptionLogicRow() + ] - [InterventionTaskFormViewModel + [ScreenerQuestionLogicFormView]o-[ScreenerQuestionFormViewModel] + [<abstract>FormConsumerWidget]<:-[ScreenerQuestionLogicFormView] + + [ScreenerQuestionFormViewModel | - +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>+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(); - +InterventionTaskFormData buildFormData(); - +InterventionTaskFormViewModel createDuplicate() + +QuestionFormData buildFormData(); + -List<FormControl<dynamic>> _copyFormControls(); + -AbstractControl<dynamic>? _findAssociatedLogicControlFor(); + -AbstractControl<dynamic>? _findAssociatedControlFor(); + +ScreenerQuestionFormViewModel createDuplicate() ] - [InterventionTaskFormViewModel]o-[FormControl] - [InterventionTaskFormViewModel]o-[FormGroup] - [<abstract>ManagedFormViewModel]<:-[InterventionTaskFormViewModel] - [<abstract>WithScheduleControls]<:-[InterventionTaskFormViewModel] + [ScreenerQuestionFormViewModel]o-[FormArray] + [QuestionFormViewModel]<:-[ScreenerQuestionFormViewModel] + [<abstract>IScreenerQuestionLogicFormViewModel]<:--[ScreenerQuestionFormViewModel] - [InterventionFormData - | - +interventionId: String; - +title: String; - +description: String?; - +tasksData: List<InterventionTaskFormData>?; - +iconName: String?; - <static>+kDefaultTitle: String; - +id: String + [StudyDesignEnrollmentFormView | - +Intervention toIntervention(); - +InterventionFormData copy() + +Widget build(); + -dynamic _showScreenerQuestionSidesheetWithArgs(); + -dynamic _showConsentItemSidesheetWithArgs() ] - [<abstract>IFormData]<:-[InterventionFormData] + [<abstract>StudyDesignPageWidget]<:-[StudyDesignEnrollmentFormView] - [InterventionTaskFormView + [ConsentItemFormData | - +formViewModel: InterventionTaskFormViewModel + +consentId: String; + +title: String; + +description: String; + +iconName: String?; + +id: String + | + +ConsentItem toConsentItem(); + +ConsentItemFormData copy() ] - [InterventionTaskFormView]o-[InterventionTaskFormViewModel] + [<abstract>IFormData]<:-[ConsentItemFormData] - [InterventionPreview + [EnrollmentFormViewModel | - +routeArgs: InterventionFormRouteArgs + +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() ] - [InterventionPreview]o-[InterventionFormRouteArgs] - [<abstract>ConsumerWidget]<:-[InterventionPreview] + [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] - [MeasurementSurveyFormView + [EnrollmentFormConsentItemDelegate | - +formViewModel: MeasurementSurveyFormViewModel + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData>; + +owner: EnrollmentFormViewModel; + +propagateOnSave: bool; + +validationSet: dynamic + | + +void onCancel(); + +dynamic onSave(); + +ConsentItemFormViewModel provide(); + +List<ModelAction<dynamic>> availableActions(); + +void onNewItem(); + +void onSelectItem() ] - [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] + [EnrollmentFormConsentItemDelegate]o-[FormViewModelCollection] + [EnrollmentFormConsentItemDelegate]o-[EnrollmentFormViewModel] + [<abstract>IFormViewModelDelegate]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IListActionProvider]<:--[EnrollmentFormConsentItemDelegate] + [<abstract>IProviderArgsResolver]<:--[EnrollmentFormConsentItemDelegate] - [SurveyPreview + [MeasurementsFormViewModel | - +routeArgs: MeasurementFormRouteArgs + +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() ] - [SurveyPreview]o-[MeasurementFormRouteArgs] - [<abstract>ConsumerWidget]<:-[SurveyPreview] + [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] [MeasurementSurveyFormData | @@ -730,6 +814,16 @@ [MeasurementSurveyFormData]o-[QuestionnaireFormData] [<abstract>IFormDataWithSchedule]<:-[MeasurementSurveyFormData] + [SurveyPreview + | + +routeArgs: MeasurementFormRouteArgs + | + +Widget build() + ] + + [SurveyPreview]o-[MeasurementFormRouteArgs] + [<abstract>ConsumerWidget]<:-[SurveyPreview] + [MeasurementSurveyFormViewModel | +study: Study; @@ -769,12 +863,12 @@ [<abstract>IListActionProvider]<:--[MeasurementSurveyFormViewModel] [<abstract>IProviderArgsResolver]<:--[MeasurementSurveyFormViewModel] - [StudyDesignMeasurementsFormView + [MeasurementSurveyFormView | - +Widget build() + +formViewModel: MeasurementSurveyFormViewModel ] - [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + [MeasurementSurveyFormView]o-[MeasurementSurveyFormViewModel] [MeasurementsFormData | @@ -787,48 +881,142 @@ [<abstract>IStudyFormData]<:--[MeasurementsFormData] - [MeasurementsFormViewModel + [StudyDesignMeasurementsFormView + | + +Widget build() + ] + + [<abstract>StudyDesignPageWidget]<:-[StudyDesignMeasurementsFormView] + + [<abstract>StudyDesignPageWidget + | + +Widget? banner() + ] + + [<abstract>StudyPageWidget]<:-[<abstract>StudyDesignPageWidget] + + [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] + + [StudyFormViewModel + | + +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] - [StudyFormValidationSet + [<abstract>IStudyFormData | - +index: int; - <static>+values: List<StudyFormValidationSet> + +Study apply() ] - [Enum]<:--[StudyFormValidationSet] + [<abstract>IFormData]<:--[<abstract>IStudyFormData] [ReportsFormData | @@ -852,20 +1040,18 @@ [ReportStatus]o-[ReportStatus] [Enum]<:--[ReportStatus] - [ReportItemFormView + [ReportItemFormData | - +formViewModel: ReportItemFormViewModel; - +studyId: String; - +reportSectionColumnWidth: dynamic; - +sectionTypeBodyBuilder: Widget Function(BuildContext) + +isPrimary: bool; + +section: ReportSection; + +id: String | - +Widget build(); - -dynamic _buildSectionText(); - -dynamic _buildSectionTypeHeader() + <static>+dynamic fromDomainModel(); + +ReportItemFormData copy() ] - [ReportItemFormView]o-[ReportItemFormViewModel] - [ReportItemFormView]o-[Widget Function(BuildContext)] + [ReportItemFormData]o-[<abstract>ReportSection] + [<abstract>IFormData]<:-[ReportItemFormData] [ReportItemFormViewModel | @@ -911,27 +1097,17 @@ [ReportItemFormViewModel]o-[FormGroup] [<abstract>ManagedFormViewModel]<:-[ReportItemFormViewModel] - [ReportItemFormData - | - +isPrimary: bool; - +section: ReportSection; - +id: String - | - <static>+dynamic fromDomainModel(); - +ReportItemFormData copy() - ] - - [ReportItemFormData]o-[<abstract>ReportSection] - [<abstract>IFormData]<:-[ReportItemFormData] - - [DataReferenceIdentifier + [LinearRegressionSectionFormView | - +hashCode: int + +formViewModel: ReportItemFormViewModel; + +studyId: String; + +reportSectionColumnWidth: Map<int, TableColumnWidth> | - +bool ==() + +Widget build() ] - [DataReference]<:-[DataReferenceIdentifier] + [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] + [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] [AverageSectionFormView | @@ -1005,17 +1181,29 @@ [DataReferenceEditor]o-[FormControl] [DataReferenceEditor]o-[ReactiveDropdownField] - [LinearRegressionSectionFormView + [DataReferenceIdentifier + | + +hashCode: int + | + +bool ==() + ] + + [DataReference]<:-[DataReferenceIdentifier] + + [ReportItemFormView | +formViewModel: ReportItemFormViewModel; +studyId: String; - +reportSectionColumnWidth: Map<int, TableColumnWidth> + +reportSectionColumnWidth: dynamic; + +sectionTypeBodyBuilder: Widget Function(BuildContext) | - +Widget build() + +Widget build(); + -dynamic _buildSectionText(); + -dynamic _buildSectionTypeHeader() ] - [LinearRegressionSectionFormView]o-[ReportItemFormViewModel] - [<abstract>ConsumerWidget]<:-[LinearRegressionSectionFormView] + [ReportItemFormView]o-[ReportItemFormViewModel] + [ReportItemFormView]o-[Widget Function(BuildContext)] [StudyDesignReportsFormView | @@ -1093,1265 +1281,1332 @@ [ReportBadge]o-[ReportStatus] [ReportBadge]o-[BadgeType] - [EnrollmentFormData - | - <static>+kDefaultEnrollmentType: Participation; - +enrollmentType: Participation; - +questionnaireFormData: QuestionnaireFormData; - +consentItemsFormData: List<ConsentItemFormData>?; - +id: String - | - +Study apply(); - +EnrollmentFormData copy() - ] - - [EnrollmentFormData]o-[Participation] - [EnrollmentFormData]o-[QuestionnaireFormData] - [<abstract>IStudyFormData]<:--[EnrollmentFormData] - - [ConsentItemFormData - | - +consentId: String; - +title: String; - +description: String; - +iconName: String?; - +id: String - | - +ConsentItem toConsentItem(); - +ConsentItemFormData copy() - ] - - [<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] - - + - - + + - + - - + + + - + + - - - - - - - - + - + + - + - + + + + + + + + + - + - - - + + + - + - + + + - + - + - + - + - - + + - + - - - + - + - + + + - - - - + - - - + + + + + - - + + + - + - - - - - - - - - + - + - - - + - + - - - + - + - + - + + + + + + - + + - + - + - + + + + + + + + - + + + + + + - + - - - + - - + + - + - + + + - + - - + + + - - + - + - - - + - + - + - + - - - + - + - - + + + + + + - + - - - - + + + - + + + + + + - + - - - + + + + + + - - + + + - + - + - + - + + + - + - + + + + + + + - + - + - + - + - + + + + + + + + + + + - + - + - + - + - + - + - + - + - - + + + + - + - - - - - - + + + + - + - - + + + + - + - + - + - + - + - + - + - - - + + - + + - + - + - + - + + + - + - - - - - - + + + - - - + + + + + - + + - + + + + + + + + + + - - + - + - + - + - + - + - + - + - + - + - - - - + + + - + + + + - + - + - - - - - - + + - + - - - - + + - + - - - + - + - - - - - - - - - - - - - + + - - - + + + - - - - - + + + - + + - + - - - + - + - - - + - + - + - + - + - - - - - - - - - - + - + + - + - + - + - - - + - + - - + + - + - + + + - + - + + + - + - + - + - + - + + + + + + + + + + - - + - + - + - + + + + + + - - + + + + + + + + + + + + - - + - + - + - - + + - + - - - - - + - + - + - + - + + + - + - + - + - + - + - - - + - + - - - - - + - + - - - + - + - + - + - + - + - + - + - + - + + + - + - - - - + + + - - - + + + - + + - + - - - - - - - + + - + + - + - + + + - + - + - + - + - + - + + + - + - - - - - - - - - - - + + + - + - + + + - - - - - - - - + - - - - - - + - + - + - + - + - + - + - + - + - - - - + + - + - + - + - - - + + + - + - - - - - + - - - - - - + - - + + + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + - + + - + - + - + - - - - - + - + - + - + - + - - + + - + - + - + - - + + + + + + + + + StudyFormScaffold + + + + + + +studyId: String + +formViewModelBuilder: T Function(WidgetRef) + +formViewBuilder: Widget Function(T) + + + + + + +Widget build() + + + - - - + + + + + + + T Function(WidgetRef) + + + - - - + + + + + + + Widget Function(T) + + + - - - - - - - - + + + - - - StudyInfoFormData + + + ConsumerWidget - - - +title: String - +description: String? - +iconName: String - +contactInfoFormData: StudyContactInfoFormData - +id: String + + + + + + + + + StudyFormValidationSet - - - +Study apply() - +StudyInfoFormData copy() + + + +index: int + <static>+values: List<StudyFormValidationSet> - - - - - + + + - - - StudyContactInfoFormData + + + Enum - - - +organization: String? - +institutionalReviewBoard: String? - +institutionalReviewBoardNumber: String? - +researchers: String? - +email: String? - +website: String? - +phone: String? - +additionalInfo: String? - +id: String + + + + + + + + + + QuestionFormData - - - +Study apply() - +StudyInfoFormData 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 + + + + + + +Question<dynamic> toQuestion() + +EligibilityCriterion toEligibilityCriterion() + +Answer<dynamic> constructAnswerFor() + +dynamic setResponseOptionsValidityFrom() + +QuestionFormData copy() + + + + + + + + + + + + SurveyQuestionType + + + + + + +index: int + <static>+values: List<SurveyQuestionType> + <static>+choice: SurveyQuestionType + <static>+bool: SurveyQuestionType + <static>+scale: SurveyQuestionType + <static>+freeText: SurveyQuestionType + + + + + + + + + + + IFormData + + + + + + + + + + + + + ChoiceQuestionFormData + + + + + + +isMultipleChoice: bool + +answerOptions: List<String> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +QuestionFormData copy() + -Choice _buildChoiceForValue() + +Answer<dynamic> constructAnswerFor() + + + + + + + + + + + + + BoolQuestionFormData + + + + + + <static>+kResponseOptions: Map<String, bool> + +responseOptions: List<String> + + + + + + +Question<dynamic> toQuestion() + +BoolQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() + + + + + + + + + + + + + ScaleQuestionFormData + + + + + + +minValue: double + +maxValue: double + +minLabel: String? + +maxLabel: String? + +midValues: List<double?> + +midLabels: List<String?> + +stepSize: double + +initialValue: double? + +minColor: Color? + +maxColor: Color? + +responseOptions: List<double> + +midAnnotations: List<Annotation> + + + + + + +ScaleQuestion toQuestion() + +QuestionFormData copy() + +Answer<dynamic> constructAnswerFor() + + + + + + + + + + + Color + + + + + + + + + + + + + FreeTextQuestionFormData - - - - - - - - - IStudyFormData + + + +textLengthRange: List<int> + +textType: FreeTextQuestionType + +textTypeExpression: String? + +responseOptions: List<String> - - - +Study apply() + + + +Question<dynamic> toQuestion() + +FreeTextQuestionFormData copy() + +Answer<dynamic> constructAnswerFor() - - - - - - - - StudyDesignInfoFormView - - + + + - - - +Widget build() + + + FreeTextQuestionType - - - - + + + + - - - StudyDesignPageWidget + + + SurveyQuestionFormView - - - +Widget? banner() + + + +formViewModel: QuestionFormViewModel + +isHtmlStyleable: bool - - - - - + + + + + - - - StudyInfoFormViewModel + + + QuestionFormViewModel - - - +study: Study - +titleControl: FormControl<String> - +iconControl: FormControl<IconOption> - +descriptionControl: FormControl<String> - +organizationControl: FormControl<String> - +reviewBoardControl: FormControl<String> - +reviewBoardNumberControl: FormControl<String> - +researchersControl: FormControl<String> - +emailControl: FormControl<String> - +websiteControl: FormControl<String> - +phoneControl: FormControl<String> - +additionalInfoControl: FormControl<String> - +form: FormGroup - +titles: Map<FormMode, String> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +descriptionRequired: dynamic - +iconRequired: dynamic - +organizationRequired: dynamic - +reviewBoardRequired: dynamic - +reviewBoardNumberRequired: dynamic - +researchersRequired: dynamic - +emailRequired: dynamic - +phoneRequired: dynamic - +emailFormat: dynamic - +websiteFormat: dynamic + + + <static>+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() - +StudyInfoFormData buildFormData() + + + +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 + + + IScaleQuestionFormViewModel - - - - - - - - FormControl + + + +isMidValuesClearedInfoVisible: bool - - - + + + + - - - FormGroup + + + ScaleQuestionFormView - - - - - - - - FormViewModel + + + +formViewModel: QuestionFormViewModel - - - - - + + + + + - - - WithScheduleControls + + + ChoiceQuestionFormView - - - +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: QuestionFormViewModel - - - +void setScheduleControlsFrom() - -dynamic _initReminderControl() + + + +Widget build() - - - + + + + + - - - StreamSubscription + + + BoolQuestionFormView - - - - - - + + + +formViewModel: QuestionFormViewModel + + - - - IFormDataWithSchedule + + + +Widget build() - - - +instanceId: String - +isTimeLocked: bool - +timeLockStart: StudyUTimeOfDay? - +timeLockEnd: StudyUTimeOfDay? - +hasReminder: bool - +reminderTime: StudyUTimeOfDay? + + + + + + + + + + FreeTextQuestionFormView - - - +Schedule toSchedule() + + + +formViewModel: QuestionFormViewModel + +generateLabelHelpTextMap: dynamic + + + + + + +Widget build() + +Widget disableOnReadonly() + +Widget generateRow() - - - + + + - - - StudyUTimeOfDay + + + FormControl - - - + + + - - - IFormData + + + FormArray - - - - - + + + - - - ScheduleControls + + + AbstractControl - - - +formViewModel: WithScheduleControls + + + + + + + + FormGroup - - - +Widget build() - -List<FormTableRow> _conditionalTimeRestrictions() + + + + + + + + ManagedFormViewModel - - - + + + - - - FormConsumerWidget + + + IListActionProvider - - - + + + - + WithQuestionnaireControls - + +questionsArray: FormArray<dynamic> +questionFormViewModels: FormViewModelCollection<Q, QuestionFormData> @@ -2362,7 +2617,7 @@ - + +void setQuestionnaireControlsFrom() +QuestionnaireFormData buildQuestionnaireFormData() @@ -2375,22 +2630,11 @@ - - - - - - - FormArray - - - - - + - + FormViewModelCollection @@ -2399,9 +2643,9 @@ - + - + IFormViewModelDelegate @@ -2410,1442 +2654,1474 @@ - + - + IProviderArgsResolver - - - - - + + + + + - - - QuestionFormData + + + QuestionnaireFormData - - - <static>+questionTypeFormDataFactories: Map<SurveyQuestionType, QuestionFormData Function(Question<dynamic>, List<EligibilityCriterion>)> - +questionId: String - +questionText: String - +questionInfoText: String? - +questionType: SurveyQuestionType - +responseOptionsValidity: Map<dynamic, bool> - +responseOptions: List<dynamic> - +id: String + + + +questionsData: List<QuestionFormData>? + +id: String - - - +Question<dynamic> toQuestion() - +EligibilityCriterion toEligibilityCriterion() - +Answer<dynamic> constructAnswerFor() - +dynamic setResponseOptionsValidityFrom() - +QuestionFormData copy() + + + +StudyUQuestionnaire toQuestionnaire() + +List<EligibilityCriterion> toEligibilityCriteria() + +QuestionnaireFormData copy() - - - - + + + + + - - - SurveyQuestionType + + + IFormDataWithSchedule - - - +index: int - <static>+values: List<SurveyQuestionType> - <static>+choice: SurveyQuestionType - <static>+bool: SurveyQuestionType - <static>+scale: SurveyQuestionType - <static>+freeText: SurveyQuestionType + + + +instanceId: String + +isTimeLocked: bool + +timeLockStart: StudyUTimeOfDay? + +timeLockEnd: StudyUTimeOfDay? + +hasReminder: bool + +reminderTime: StudyUTimeOfDay? - - - - - - - - - - ChoiceQuestionFormData + + + +Schedule toSchedule() - - - +isMultipleChoice: bool - +answerOptions: List<String> - +responseOptions: List<String> - - + + + + - - - +Question<dynamic> toQuestion() - +QuestionFormData copy() - -Choice _buildChoiceForValue() - +Answer<dynamic> constructAnswerFor() + + + StudyUTimeOfDay - - - - - + + + + + - - - BoolQuestionFormData + + + ScheduleControls - - - <static>+kResponseOptions: Map<String, bool> - +responseOptions: List<String> + + + +formViewModel: WithScheduleControls - - - +Question<dynamic> toQuestion() - +BoolQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +Widget build() + -List<FormTableRow> _conditionalTimeRestrictions() - - - - - + + + + + - - - ScaleQuestionFormData + + + WithScheduleControls - - - +minValue: double - +maxValue: double - +minLabel: String? - +maxLabel: String? - +midValues: List<double?> - +midLabels: List<String?> - +stepSize: double - +initialValue: double? - +minColor: Color? - +maxColor: Color? - +responseOptions: List<double> - +midAnnotations: List<Annotation> + + + +isTimeRestrictedControl: FormControl<bool> + +instanceID: FormControl<String> + +restrictedTimeStartControl: FormControl<Time> + +restrictedTimeStartPickerControl: FormControl<TimeOfDay> + +restrictedTimeEndControl: FormControl<Time> + +restrictedTimeEndPickerControl: FormControl<TimeOfDay> + +hasReminderControl: FormControl<bool> + +reminderTimeControl: FormControl<Time> + +reminderTimePickerControl: FormControl<TimeOfDay> + -_reminderControlStream: StreamSubscription<dynamic>? + +scheduleFormControls: Map<String, FormControl<Object>> + +hasReminder: bool + +isTimeRestricted: bool + +timeRestriction: List<Time>? - - - +ScaleQuestion toQuestion() - +QuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +void setScheduleControlsFrom() + -dynamic _initReminderControl() - - - + + + - - - Color + + + FormConsumerWidget - - - - - + + + - - - FreeTextQuestionFormData + + + StreamSubscription - - - +textLengthRange: List<int> - +textType: FreeTextQuestionType - +textTypeExpression: String? - +responseOptions: List<String> + + + + + + + + + + InterventionFormViewModel - - - +Question<dynamic> toQuestion() - +FreeTextQuestionFormData copy() - +Answer<dynamic> constructAnswerFor() + + + +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() - - - + + + - - - FreeTextQuestionType + + + Study - - - - - + + + + + - - - QuestionFormViewModel + + + StudyScheduleFormData - - - <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 + + + +sequenceType: PhaseSequence + +sequenceTypeCustom: String + +numCycles: int + +phaseDuration: int + +includeBaseline: bool + +id: String - - - +String? scaleMidLabelAt() - -dynamic _onScaleRangeChanged() - -dynamic _applyInputFormatters() - -dynamic _updateScaleMidValueControls() - -Map<String, dynamic>? _validateFreeText() - -dynamic _onFreeTextLengthChanged() - -List<FormControlValidation> _getValidationConfig() - +dynamic onQuestionTypeChanged() - +dynamic onResponseOptionsChanged() - -void _updateFormControls() - +void initControls() - +void setControlsFrom() - +QuestionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() - +dynamic save() - +QuestionFormViewModel createDuplicate() + + + +StudySchedule toStudySchedule() + +Study apply() + +StudyScheduleFormData copy() - - - + + + - - - AbstractControl + + + PhaseSequence - - - + + + + - - - ManagedFormViewModel + + + IStudyFormData - - - - - - - - IListActionProvider + + + +Study apply() - - - - + + + + + - - - SurveyQuestionFormView + + + StudyScheduleFormView - - - +formViewModel: QuestionFormViewModel - +isHtmlStyleable: bool + + + +formViewModel: StudyScheduleControls - - - - - - - - Enum + + + -FormTableRow _renderCustomSequence() + +Widget build() - - - - - + + + + + - - - FreeTextQuestionFormView + + + StudyScheduleControls - - - +formViewModel: QuestionFormViewModel - +generateLabelHelpTextMap: dynamic + + + <static>+defaultScheduleType: PhaseSequence + <static>+defaultScheduleTypeSequence: String + <static>+defaultNumCycles: int + <static>+defaultPeriodLength: int + +sequenceTypeControl: FormControl<PhaseSequence> + +sequenceTypeCustomControl: FormControl<String> + +phaseDurationControl: FormControl<int> + +numCyclesControl: FormControl<int> + +includeBaselineControl: FormControl<bool> + +studyScheduleControls: Map<String, FormControl<Object>> + <static>+kNumCyclesMin: int + <static>+kNumCyclesMax: int + <static>+kPhaseDurationMin: int + <static>+kPhaseDurationMax: int + +sequenceTypeControlOptions: List<FormControlOption<PhaseSequence>> + +studyScheduleValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +numCyclesRange: dynamic + +phaseDurationRange: dynamic + +customSequenceRequired: dynamic - - - +Widget build() - +Widget disableOnReadonly() - +Widget generateRow() + + + +void setStudyScheduleControlsFrom() + +StudyScheduleFormData buildStudyScheduleFormData() + +bool isSequencingCustom() - - - + + + + - - - ConsumerWidget + + + InterventionTaskFormView + + + + + + +formViewModel: InterventionTaskFormViewModel - - - - + + + + + - - - IScaleQuestionFormViewModel + + + InterventionTaskFormViewModel - - - +isMidValuesClearedInfoVisible: 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> - - - - - - - - - ScaleQuestionFormView + + + +void setControlsFrom() + +InterventionTaskFormData buildFormData() + +InterventionTaskFormViewModel createDuplicate() - - - +formViewModel: QuestionFormViewModel + + + + + + + + + + InterventionPreview - - - - - - - - - - ChoiceQuestionFormView + + + +routeArgs: InterventionFormRouteArgs - - - +formViewModel: QuestionFormViewModel + + + +Widget build() - - - +Widget build() + + + + + + + + InterventionFormRouteArgs - - - - - + + + + + - - - BoolQuestionFormView + + + InterventionsFormData - - - +formViewModel: QuestionFormViewModel + + + +interventionsData: List<InterventionFormData> + +studyScheduleData: StudyScheduleFormData + +id: String - - - +Widget build() + + + +Study apply() + +InterventionsFormData copy() - - - - - + + + + + - - - QuestionnaireFormData + + + InterventionTaskFormData - - - +questionsData: List<QuestionFormData>? - +id: String + + + +taskId: String + +taskTitle: String + +taskDescription: String? + <static>+kDefaultTitle: String + +id: String - - - +StudyUQuestionnaire toQuestionnaire() - +List<EligibilityCriterion> toEligibilityCriteria() - +QuestionnaireFormData copy() + + + +CheckmarkTask toTask() + +InterventionTaskFormData copy() - - - - - + + + + - - - StudyFormScaffold + + + InterventionFormView - - - +studyId: String - +formViewModelBuilder: T Function(WidgetRef) - +formViewBuilder: Widget Function(T) + + + +formViewModel: InterventionFormViewModel - - - +Widget build() + + + + + + + + + StudyDesignInterventionsFormView - - - - - - - - T Function(WidgetRef) + + + +Widget build() - - - + + + + - - - Widget Function(T) + + + StudyDesignPageWidget + + + + + + +Widget? banner() - - - - - + + + + + - - - StudyFormViewModel + + + InterventionsFormViewModel - - - +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> + + + +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 read() - +void setControlsFrom() - +Study buildFormData() - +void dispose() - +void onCancel() - +dynamic onSave() - -dynamic _applyAndSaveSubform() + + + +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() - - - + + + - - - IStudyRepository + + + GoRouter - - - + + + - - - IAuthRepository + + + FormViewModel - - - + + + + + - - - GoRouter + + + InterventionFormData + + + + + + +interventionId: String + +title: String + +description: String? + +tasksData: List<InterventionTaskFormData>? + +iconName: String? + <static>+kDefaultTitle: String + +id: String + + + + + + +Intervention toIntervention() + +InterventionFormData copy() - - - - - + + + + + - - - EnrollmentFormViewModel + + + EnrollmentFormData - - - +study: Study - +router: GoRouter - +consentItemDelegate: EnrollmentFormConsentItemDelegate - +enrollmentTypeControl: FormControl<Participation> - +consentItemArray: FormArray<dynamic> - +consentItemFormViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +form: FormGroup - +enrollmentTypeControlOptions: List<FormControlOption<Participation>> - +consentItemModels: List<ConsentItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestScreener: bool - +canTestConsent: bool - +questionTitles: Map<FormMode, String Function()> + + + <static>+kDefaultEnrollmentType: Participation + +enrollmentType: Participation + +questionnaireFormData: QuestionnaireFormData + +consentItemsFormData: List<ConsentItemFormData>? + +id: 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() + + + +Study apply() + +EnrollmentFormData copy() + + + + + + + + + + + Participation - - - - - + + + + + - - - MeasurementsFormViewModel + + + ConsentItemFormViewModel - - - +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> + + + +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 read() - +void setControlsFrom() - +MeasurementsFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +MeasurementSurveyFormViewModel provide() - +void onCancel() - +dynamic onSave() + + + +void setControlsFrom() + +ConsentItemFormData buildFormData() + +ConsentItemFormViewModel createDuplicate() - - - - - + + + + - - - ReportsFormViewModel + + + ConsentItemFormView - - - +study: Study - +router: GoRouter - +reportItemDelegate: ReportFormItemDelegate - +reportItemArray: FormArray<dynamic> - +reportItemFormViewModels: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> - +form: FormGroup - +reportItemModels: List<ReportItemFormViewModel> - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titles: Map<FormMode, String> - +canTestConsent: bool + + + +formViewModel: ConsentItemFormViewModel - - - +void setControlsFrom() - +ReportsFormData buildFormData() - +void read() - +ReportItemFormRouteArgs buildNewReportItemFormRouteArgs() - +ReportItemFormRouteArgs buildReportItemFormRouteArgs() - +dynamic testReport() - +void onCancel() - +dynamic onSave() - +ReportItemFormViewModel provide() + + + + + + + + + IScreenerQuestionLogicFormViewModel + + + + + + +isDirtyOptionsBannerVisible: bool - - - - - + + + + + - - - InterventionsFormViewModel + + + ScreenerQuestionLogicFormView - - - +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: ScreenerQuestionFormViewModel - - - +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() + -dynamic _buildInfoBanner() + -dynamic _buildAnswerOptionsLogicControls() + -List<Widget> _buildOptionLogicRow() - - - - - + + + + + - - - InterventionTaskFormData + + + ScreenerQuestionFormViewModel - - - +taskId: String - +taskTitle: String - +taskDescription: String? - <static>+kDefaultTitle: String - +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 - - - +CheckmarkTask toTask() - +InterventionTaskFormData copy() + + + +dynamic onResponseOptionsChanged() + +void setControlsFrom() + +QuestionFormData buildFormData() + -List<FormControl<dynamic>> _copyFormControls() + -AbstractControl<dynamic>? _findAssociatedLogicControlFor() + -AbstractControl<dynamic>? _findAssociatedControlFor() + +ScreenerQuestionFormViewModel createDuplicate() - - - - - - - - - StudyScheduleFormData - - + + + + - - - +sequenceType: PhaseSequence - +sequenceTypeCustom: String - +numCycles: int - +phaseDuration: int - +includeBaseline: bool - +id: String + + + StudyDesignEnrollmentFormView - - - +StudySchedule toStudySchedule() - +Study apply() - +StudyScheduleFormData copy() + + + +Widget build() + -dynamic _showScreenerQuestionSidesheetWithArgs() + -dynamic _showConsentItemSidesheetWithArgs() - - - + + + + + - - - PhaseSequence + + + ConsentItemFormData - - - - - - - - - InterventionFormView + + + +consentId: String + +title: String + +description: String + +iconName: String? + +id: String - - - +formViewModel: InterventionFormViewModel + + + +ConsentItem toConsentItem() + +ConsentItemFormData copy() - - - - - + + + + + - - - InterventionFormViewModel + + + EnrollmentFormViewModel - - - +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: 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() - +InterventionFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +void onCancel() - +dynamic onSave() - +InterventionTaskFormViewModel provide() - +InterventionTaskFormRouteArgs buildNewFormRouteArgs() - +InterventionTaskFormRouteArgs buildFormRouteArgs() - +InterventionFormViewModel createDuplicate() + + + +void 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() - - - - - + + + + + - - - StudyScheduleControls + + + EnrollmentFormConsentItemDelegate - - - <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 + + + +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> + +owner: EnrollmentFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +void setStudyScheduleControlsFrom() - +StudyScheduleFormData buildStudyScheduleFormData() - +bool isSequencingCustom() + + + +void onCancel() + +dynamic onSave() + +ConsentItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - + + + + + - - - InterventionsFormData + + + MeasurementsFormViewModel - - - +interventionsData: List<InterventionFormData> - +studyScheduleData: StudyScheduleFormData - +id: String + + + +study: Study + +router: GoRouter + +measurementsArray: FormArray<dynamic> + +surveyMeasurementFormViewModels: FormViewModelCollection<MeasurementSurveyFormViewModel, MeasurementSurveyFormData> + +form: FormGroup + +measurementViewModels: List<MeasurementSurveyFormViewModel> + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +measurementRequired: dynamic + +titles: Map<FormMode, String> - - - +Study apply() - +InterventionsFormData copy() + + + +void read() + +void setControlsFrom() + +MeasurementsFormData buildFormData() + +List<ModelAction<dynamic>> availableActions() + +List<ModelAction<dynamic>> availablePopupActions() + +List<ModelAction<dynamic>> availableInlineActions() + +void onSelectItem() + +void onNewItem() + +MeasurementSurveyFormViewModel provide() + +void onCancel() + +dynamic onSave() - - - - + + + + + - - - StudyDesignInterventionsFormView + + + MeasurementSurveyFormData - - - +Widget build() + + + +measurementId: String + +title: String + +introText: String? + +outroText: String? + +questionnaireFormData: QuestionnaireFormData + <static>+kDefaultTitle: String + +id: String + + + + + + +QuestionnaireTask toQuestionnaireTask() + +MeasurementSurveyFormData copy() - - - - - + + + + + - - - StudyScheduleFormView + + + SurveyPreview - - - +formViewModel: StudyScheduleControls + + + +routeArgs: MeasurementFormRouteArgs - - - -FormTableRow _renderCustomSequence() - +Widget build() + + + +Widget build() - - - - - + + + - - - InterventionTaskFormViewModel + + + MeasurementFormRouteArgs - - - +taskIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +taskTitleControl: FormControl<String> - +taskDescriptionControl: FormControl<String> - +markAsCompletedControl: FormControl<bool> - +form: FormGroup - +taskId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +titles: Map<FormMode, String> + + + + + + + + + + MeasurementSurveyFormViewModel - - - +void setControlsFrom() - +InterventionTaskFormData buildFormData() - +InterventionTaskFormViewModel createDuplicate() + + + +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> - - - - - - - - - - InterventionFormData + + + +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() - - - +interventionId: String - +title: String - +description: String? - +tasksData: List<InterventionTaskFormData>? - +iconName: String? - <static>+kDefaultTitle: String - +id: String + + + + + + + + + MeasurementSurveyFormView - - - +Intervention toIntervention() - +InterventionFormData copy() + + + +formViewModel: MeasurementSurveyFormViewModel - - - - + + + + + - - - InterventionTaskFormView + + + MeasurementsFormData - - - +formViewModel: InterventionTaskFormViewModel + + + +surveyMeasurements: List<MeasurementSurveyFormData> + +id: String - - - - - - - - - - InterventionPreview + + + +Study apply() + +MeasurementsFormData copy() - - - +routeArgs: InterventionFormRouteArgs + + + + + + + + + StudyDesignMeasurementsFormView - - - +Widget build() + + + +Widget build() - - - + + + - - - InterventionFormRouteArgs + + + StudyPageWidget - - - - + + + + - - - MeasurementSurveyFormView + + + StudyDesignInfoFormView - - - +formViewModel: MeasurementSurveyFormViewModel + + + +Widget build() - - - - - + + + + + - - - MeasurementSurveyFormViewModel + + + StudyInfoFormData - - - +study: Study - +measurementIdControl: FormControl<String> - +instanceIdControl: FormControl<String> - +surveyTitleControl: FormControl<String> - +surveyIntroTextControl: FormControl<String> - +surveyOutroTextControl: FormControl<String> - +form: FormGroup - +measurementId: String - +instanceId: String - +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> - +titleRequired: dynamic - +atLeastOneQuestion: dynamic - +breadcrumbsTitle: String - +titles: Map<FormMode, String> + + + +title: String + +description: String? + +iconName: String + +contactInfoFormData: StudyContactInfoFormData + +id: String - - - +void setControlsFrom() - +MeasurementSurveyFormData buildFormData() - +List<ModelAction<dynamic>> availableActions() - +List<ModelAction<dynamic>> availablePopupActions() - +List<ModelAction<dynamic>> availableInlineActions() - +void onSelectItem() - +void onNewItem() - +SurveyQuestionFormRouteArgs buildNewFormRouteArgs() - +SurveyQuestionFormRouteArgs buildFormRouteArgs() - +MeasurementSurveyFormViewModel createDuplicate() + + + +Study apply() + +StudyInfoFormData copy() - - - - - + + + + + - - - 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() - - - + + + + + - - - MeasurementFormRouteArgs + + + StudyInfoFormViewModel - - - - - - - - - - MeasurementSurveyFormData + + + +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 - - - +measurementId: String - +title: String - +introText: String? - +outroText: String? - +questionnaireFormData: QuestionnaireFormData - <static>+kDefaultTitle: String - +id: String + + + +void setControlsFrom() + +StudyInfoFormData buildFormData() - - - +QuestionnaireTask toQuestionnaireTask() - +MeasurementSurveyFormData copy() + + + + + + + + + + StudyFormViewModel - - - - - - - - - StudyDesignMeasurementsFormView + + + +studyDirtyCopy: Study? + +studyRepository: IStudyRepository + +authRepository: IAuthRepository + +router: GoRouter + +studyInfoFormViewModel: StudyInfoFormViewModel + +enrollmentFormViewModel: EnrollmentFormViewModel + +measurementsFormViewModel: MeasurementsFormViewModel + +reportsFormViewModel: ReportsFormViewModel + +interventionsFormViewModel: InterventionsFormViewModel + +form: FormGroup + +isStudyReadonly: bool + +sharedValidationConfig: Map<FormValidationSetEnum, List<FormControlValidation>> + +titles: Map<FormMode, String> - - - +Widget build() + + + +void read() + +void setControlsFrom() + +Study buildFormData() + +void dispose() + +void onCancel() + +dynamic onSave() + -dynamic _applyAndSaveSubform() - - - - - + + + - - - MeasurementsFormData + + + IStudyRepository - - - +surveyMeasurements: List<MeasurementSurveyFormData> - +id: String - - + + + + - - - +Study apply() - +MeasurementsFormData copy() + + + IAuthRepository - - - - + + + + + - - - StudyFormValidationSet + + + ReportsFormViewModel - - - +index: int - <static>+values: List<StudyFormValidationSet> + + + +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() - - - + + + - + ReportsFormData - + +reportItems: List<ReportItemFormData> +id: String - + +Study apply() +ReportsFormData copy() @@ -3855,16 +4131,16 @@ - - + + - + ReportStatus - + +index: int <static>+values: List<ReportStatus> @@ -3874,49 +4150,58 @@ - - - - - + + + + + - - - ReportItemFormView + + + ReportItemFormData + + + + + + +isPrimary: bool + +section: ReportSection + +id: String - - - +formViewModel: ReportItemFormViewModel - +studyId: String - +reportSectionColumnWidth: dynamic - +sectionTypeBodyBuilder: Widget Function(BuildContext) + + + <static>+dynamic fromDomainModel() + +ReportItemFormData copy() - - - +Widget build() - -dynamic _buildSectionText() - -dynamic _buildSectionTypeHeader() + + + + + + + + ReportSection - - - + + + - + ReportItemFormViewModel - + <static>+defaultSectionType: ReportSectionType +sectionIdControl: FormControl<String> @@ -3949,7 +4234,7 @@ - + -List<FormControlValidation> _getValidationConfig() +ReportItemFormData buildFormData() @@ -3961,29 +4246,18 @@ - - - - - - - Widget Function(BuildContext) - - - - - - + + - + ReportSectionType - + +index: int <static>+values: List<ReportSectionType> @@ -3993,94 +4267,46 @@ - - - - - - - - - ReportItemFormData - - - - - - +isPrimary: bool - +section: ReportSection - +id: String - - - - - - <static>+dynamic fromDomainModel() - +ReportItemFormData copy() - - - - - - - - - - - ReportSection - - - - - - - - - - - - - DataReferenceIdentifier - - + + + + + - - - +hashCode: int + + + LinearRegressionSectionFormView - - - +bool ==() + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: Map<int, TableColumnWidth> - - - - - - - - DataReference + + + +Widget build() - - - + + + - + AverageSectionFormView - + +formViewModel: ReportItemFormViewModel +studyId: String @@ -4088,7 +4314,7 @@ - + +Widget build() @@ -4097,17 +4323,17 @@ - - - + + + - + TemporalAggregationFormatted - + -_value: TemporalAggregation <static>+values: List<TemporalAggregationFormatted> @@ -4118,511 +4344,285 @@ - + +bool ==() +String toString() +String toJson() - <static>+TemporalAggregationFormatted fromJson() - - - - - - - - - - - TemporalAggregation - - - - - - - - - - - IconData - - - - - - - - - - - - - ImprovementDirectionFormatted - - - - - - -_value: ImprovementDirection - <static>+values: List<ImprovementDirectionFormatted> - +value: ImprovementDirection - +string: String - +icon: IconData? - +hashCode: int - - - - - - +bool ==() - +String toString() - +String toJson() - <static>+ImprovementDirectionFormatted fromJson() - - - - - - - - - - - ImprovementDirection - - - - - - - - - - - - - DataReferenceEditor - - - - - - +formControl: FormControl<DataReferenceIdentifier<T>> - +availableTasks: List<Task> - +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - - - - +FormTableRow buildFormTableRow() - -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - - - - - - - ReactiveDropdownField - - - - - - - - - - - - - LinearRegressionSectionFormView - - - - - - +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 + <static>+TemporalAggregationFormatted fromJson() - - - +Widget build() + + + + + + + + TemporalAggregation - - - + + + - - - BadgeType + + + IconData - - - - - + + + + + - - - EnrollmentFormData + + + ImprovementDirectionFormatted - - - <static>+kDefaultEnrollmentType: Participation - +enrollmentType: Participation - +questionnaireFormData: QuestionnaireFormData - +consentItemsFormData: List<ConsentItemFormData>? - +id: String + + + -_value: ImprovementDirection + <static>+values: List<ImprovementDirectionFormatted> + +value: ImprovementDirection + +string: String + +icon: IconData? + +hashCode: int - - - +Study apply() - +EnrollmentFormData copy() + + + +bool ==() + +String toString() + +String toJson() + <static>+ImprovementDirectionFormatted fromJson() - - - + + + - - - Participation + + + ImprovementDirection - - - - - + + + + + - - - ConsentItemFormData + + + DataReferenceEditor - - - +consentId: String - +title: String - +description: String - +iconName: String? - +id: String + + + +formControl: FormControl<DataReferenceIdentifier<T>> + +availableTasks: List<Task> + +buildReactiveDropdownField: ReactiveDropdownField<dynamic> - - - +ConsentItem toConsentItem() - +ConsentItemFormData copy() + + + +FormTableRow buildFormTableRow() + -List<DropdownMenuItem<DataReferenceIdentifier<dynamic>>> _dataReferenceItems() - - - - - + + + - - - ConsentItemFormViewModel + + + ReactiveDropdownField - - - +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> + + + + + + + + + + DataReferenceIdentifier - - - +void setControlsFrom() - +ConsentItemFormData buildFormData() - +ConsentItemFormViewModel createDuplicate() + + + +hashCode: int - - - - - - - - - IScreenerQuestionLogicFormViewModel + + + +bool ==() - - - +isDirtyOptionsBannerVisible: bool + + + + + + + + DataReference - - - - - + + + + + - - - ScreenerQuestionLogicFormView + + + ReportItemFormView - - - +formViewModel: ScreenerQuestionFormViewModel + + + +formViewModel: ReportItemFormViewModel + +studyId: String + +reportSectionColumnWidth: dynamic + +sectionTypeBodyBuilder: Widget Function(BuildContext) - - - +Widget build() - -dynamic _buildInfoBanner() - -dynamic _buildAnswerOptionsLogicControls() - -List<Widget> _buildOptionLogicRow() + + + +Widget build() + -dynamic _buildSectionText() + -dynamic _buildSectionTypeHeader() - - - - - + + + - - - ScreenerQuestionFormViewModel + + + Widget Function(BuildContext) - - - <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 + + + + + + + + + StudyDesignReportsFormView - - - +dynamic onResponseOptionsChanged() - +void setControlsFrom() - +QuestionFormData buildFormData() - -List<FormControl<dynamic>> _copyFormControls() - -AbstractControl<dynamic>? _findAssociatedLogicControlFor() - -AbstractControl<dynamic>? _findAssociatedControlFor() - +ScreenerQuestionFormViewModel createDuplicate() + + + +Widget build() + -dynamic _showReportItemSidesheetWithArgs() - - - - - - - - StudyDesignEnrollmentFormView - - + + + + + - - - +Widget build() - -dynamic _showScreenerQuestionSidesheetWithArgs() - -dynamic _showConsentItemSidesheetWithArgs() + + + ReportFormItemDelegate - - - - - - - - - ConsentItemFormView + + + +formViewModelCollection: FormViewModelCollection<ReportItemFormViewModel, ReportItemFormData> + +owner: ReportsFormViewModel + +propagateOnSave: bool + +validationSet: dynamic - - - +formViewModel: ConsentItemFormViewModel + + + +void onCancel() + +dynamic onSave() + +ReportItemFormViewModel provide() + +List<ModelAction<dynamic>> availableActions() + +void onNewItem() + +void onSelectItem() - - - - - + + + + + - - - EnrollmentFormConsentItemDelegate + + + ReportBadge - - - +formViewModels: FormViewModelCollection<ConsentItemFormViewModel, ConsentItemFormData> - +owner: EnrollmentFormViewModel - +propagateOnSave: bool - +validationSet: dynamic + + + +status: ReportStatus? + +type: BadgeType + +showPrefixIcon: bool + +showTooltip: bool - - - +void onCancel() - +dynamic onSave() - +ConsentItemFormViewModel provide() - +List<ModelAction<dynamic>> availableActions() - +void onNewItem() - +void onSelectItem() + + + +Widget build() - - - + + + - - - StudyPageWidget + + + BadgeType