diff --git a/designer_v2/lib/features/design/shared/questionnaire/question/controllers/question_form_controller.dart b/designer_v2/lib/features/design/shared/questionnaire/question/controllers/question_form_controller.dart index c5f3a081c..ea7fe1125 100644 --- a/designer_v2/lib/features/design/shared/questionnaire/question/controllers/question_form_controller.dart +++ b/designer_v2/lib/features/design/shared/questionnaire/question/controllers/question_form_controller.dart @@ -1,7 +1,6 @@ import 'package:flutter/widgets.dart'; import 'package:reactive_forms/reactive_forms.dart'; import 'package:studyu_designer_v2/domain/question.dart'; -import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/controllers/scale_question_form_controller.dart'; import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/models/question_form_data.dart'; import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/question_type.dart'; import 'package:studyu_designer_v2/features/design/study_form_validation.dart'; @@ -21,13 +20,6 @@ abstract class QuestionFormViewModel extends Managed super.validationSet = StudyFormValidationSet.draft, }); - static defaultType({ - formData, - delegate, - validationSet = StudyFormValidationSet.draft, - titles, - }) => ScaleQuestionFormViewModel(formData: formData, delegate: delegate, validationSet: validationSet, titles: titles); - SurveyQuestionType get questionType; /// Customized titles (if any) depending on the context of use diff --git a/designer_v2/lib/features/design/shared/questionnaire/question/controllers/question_type_controller.dart b/designer_v2/lib/features/design/shared/questionnaire/question/controllers/question_type_controller.dart new file mode 100644 index 000000000..431a2292e --- /dev/null +++ b/designer_v2/lib/features/design/shared/questionnaire/question/controllers/question_type_controller.dart @@ -0,0 +1,34 @@ +import 'package:reactive_forms/reactive_forms.dart'; +import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/controllers/bool_question_form_controller.dart'; +import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/controllers/choice_question_form_controller.dart'; +import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/controllers/question_form_controller.dart'; +import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/controllers/scale_question_form_controller.dart'; +import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/question_type.dart'; +import 'package:studyu_designer_v2/features/forms/form_control.dart'; + +class QuestionTypeController { + + QuestionTypeController(QuestionFormViewModel initial): formViewModel = initial; + + QuestionFormViewModel formViewModel; + SurveyQuestionType get type => formViewModel.questionType; + + late final FormControl questionTypeControl = CustomFormControl( + value: formViewModel.questionType, + onValueChanged: _onQuestionTypeChanged, + ); + + _onQuestionTypeChanged(SurveyQuestionType? newType) { + switch (type) { + case SurveyQuestionType.bool: + formViewModel = BoolQuestionFormViewModel(delegate: formViewModel.delegate, validationSet: formViewModel.validationSet); + break; + case SurveyQuestionType.scale: + formViewModel = ScaleQuestionFormViewModel(delegate: formViewModel.delegate, validationSet: formViewModel.validationSet); + break; + case SurveyQuestionType.choice: + formViewModel = ChoiceQuestionFormViewModel(delegate: formViewModel.delegate, validationSet: formViewModel.validationSet); + break; + } + } +} diff --git a/designer_v2/lib/features/design/shared/questionnaire/question/views/question_form_view.dart b/designer_v2/lib/features/design/shared/questionnaire/question/views/question_form_view.dart index a65dbb273..be9f843fe 100644 --- a/designer_v2/lib/features/design/shared/questionnaire/question/views/question_form_view.dart +++ b/designer_v2/lib/features/design/shared/questionnaire/question/views/question_form_view.dart @@ -9,12 +9,14 @@ import 'package:studyu_designer_v2/common_views/text_paragraph.dart'; import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/controllers/bool_question_form_controller.dart'; import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/controllers/choice_question_form_controller.dart'; import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/controllers/question_form_controller.dart'; +import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/controllers/question_type_controller.dart'; import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/controllers/scale_question_form_controller.dart'; import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/models/question_form_data.dart'; import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/views/bool_question_form_view.dart'; import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/views/choice_question_form_view.dart'; import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/question_type.dart'; import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/views/scale_question_form_view.dart'; +import 'package:studyu_designer_v2/features/forms/form_control.dart'; import 'package:studyu_designer_v2/features/forms/form_validation.dart'; import 'package:studyu_designer_v2/features/forms/form_view_model.dart'; import 'package:studyu_designer_v2/localization/app_translation.dart'; @@ -23,9 +25,9 @@ import 'package:studyu_designer_v2/theme.dart'; /// Wrapper that dispatches to the appropriate widget for the corresponding /// [SurveyQuestionType] as given by [formViewModel.questionType] class SurveyQuestionFormView extends ConsumerStatefulWidget { - const SurveyQuestionFormView({required this.formViewModel, this.isHtmlStyleable = true, super.key}); + SurveyQuestionFormView({required QuestionFormViewModel formViewModel, this.isHtmlStyleable = true, super.key}): typeController = QuestionTypeController(formViewModel); - final QuestionFormViewModel formViewModel; + final QuestionTypeController typeController; final bool isHtmlStyleable; @override @@ -38,7 +40,8 @@ class _SurveyQuestionFormViewState extends ConsumerState .map((questionType) => FormControlOption(questionType, questionType.string)) .toList(); - QuestionFormViewModel get formViewModel => widget.formViewModel; + QuestionTypeController get controller => widget.typeController; + QuestionFormViewModel get formViewModel => controller.formViewModel; late bool isQuestionHelpTextFieldVisible = formViewModel.questionInfoTextControl.value?.isNotEmpty ?? false; bool isStylingInformationDismissed = true; @@ -53,7 +56,7 @@ class _SurveyQuestionFormViewState extends ConsumerState SurveyQuestionType.bool: (_) => BoolQuestionFormView(formViewModel: formViewModel as BoolQuestionFormViewModel), SurveyQuestionType.scale: (_) => ScaleQuestionFormView(formViewModel: formViewModel as ScaleQuestionFormViewModel), }; - final questionType = formViewModel.questionType; + final questionType = controller.type; if (!questionTypeWidgets.containsKey(questionType)) { throw Exception("Failed to build widget for SurveyQuestionType $questionType because" @@ -98,6 +101,10 @@ class _SurveyQuestionFormViewState extends ConsumerState }); } + String? getEnv(String name) { + return null; + } + _buildResponseTypeHeader(BuildContext context) { final theme = Theme.of(context); @@ -113,7 +120,7 @@ class _SurveyQuestionFormViewState extends ConsumerState input: Theme( data: theme.copyWith(inputDecorationTheme: ThemeConfig.dropdownInputDecorationTheme(theme)), child: ReactiveDropdownField( - formControl: formViewModel.questionTypeControl, + formControl: controller.questionTypeControl, items: _questionTypeControlOptions.map((option) { final menuItemTheme = ThemeConfig.dropdownMenuItemTheme(theme); final iconTheme = menuItemTheme.iconTheme ?? theme.iconTheme;