Skip to content

Commit

Permalink
refactor(#451): question type controller
Browse files Browse the repository at this point in the history
  • Loading branch information
jannis-baum committed Jul 5, 2023
1 parent 5acd3e8 commit 477c254
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -21,13 +20,6 @@ abstract class QuestionFormViewModel<D extends QuestionFormData> 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
Expand Down
Original file line number Diff line number Diff line change
@@ -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<SurveyQuestionType> 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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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
Expand All @@ -38,7 +40,8 @@ class _SurveyQuestionFormViewState extends ConsumerState<SurveyQuestionFormView>
.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;
Expand All @@ -53,7 +56,7 @@ class _SurveyQuestionFormViewState extends ConsumerState<SurveyQuestionFormView>
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"
Expand Down Expand Up @@ -98,6 +101,10 @@ class _SurveyQuestionFormViewState extends ConsumerState<SurveyQuestionFormView>
});
}

String? getEnv(String name) {
return null;
}

_buildResponseTypeHeader(BuildContext context) {
final theme = Theme.of(context);

Expand All @@ -113,7 +120,7 @@ class _SurveyQuestionFormViewState extends ConsumerState<SurveyQuestionFormView>
input: Theme(
data: theme.copyWith(inputDecorationTheme: ThemeConfig.dropdownInputDecorationTheme(theme)),
child: ReactiveDropdownField<SurveyQuestionType>(
formControl: formViewModel.questionTypeControl,
formControl: controller.questionTypeControl,
items: _questionTypeControlOptions.map((option) {
final menuItemTheme = ThemeConfig.dropdownMenuItemTheme(theme);
final iconTheme = menuItemTheme.iconTheme ?? theme.iconTheme;
Expand Down

0 comments on commit 477c254

Please sign in to comment.