Skip to content

Commit

Permalink
fix: form control for fitbit question
Browse files Browse the repository at this point in the history
  • Loading branch information
ibrahimozkn committed Dec 11, 2024
1 parent da5b18d commit 5fd3fcc
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -309,16 +309,15 @@ class QuestionFormViewModel extends ManagedFormViewModel<QuestionFormData>
}

// Fitbit
final FormControl<List<FitbitQuestionType>> fitbitQuestionTypesControl =
CustomFormControl<List<FitbitQuestionType>>(value: []);

final Map<FitbitQuestionType, FormControl<bool>> fitbitTypeControls = {
for (final type in FitbitQuestionType.values)
type: FormControl<bool>(value: false),
};
final FormControl<Map<FitbitQuestionType, bool>> fitbitQuestionTypesControl =
FormControl<Map<FitbitQuestionType, bool>>(
value: Map.fromEntries(
FitbitQuestionType.values.map((e) => MapEntry(e, false)),
),
);

late final FormArray fitbitResponseOptionsArray = FormArray([
...fitbitTypeControls.values,
fitbitQuestionTypesControl,
]);

// - Form fields (question type-specific) - end
Expand Down Expand Up @@ -556,8 +555,9 @@ class QuestionFormViewModel extends ManagedFormViewModel<QuestionFormData>
customRegexControl.value = data.textTypeExpression;
case SurveyQuestionType.fitbit:
//TODO: Some kind of error is throwing when saving survey, check it since its having parsing issues?
fitbitQuestionTypesControl.value =
(data as FitbitQuestionFormData).types;
fitbitQuestionTypesControl.value = Map.fromEntries(
(data as FitbitQuestionFormData).types.map((e) => MapEntry(e, true)),
);
}
}

Expand Down Expand Up @@ -641,7 +641,10 @@ class QuestionFormViewModel extends ManagedFormViewModel<QuestionFormData>
questionText: questionTextControl.value!, // required
questionType: questionTypeControl.value!, // required
questionInfoText: questionInfoTextControl.value,
types: fitbitQuestionTypesControl.value!,
types: fitbitQuestionTypesControl.value!.entries
.where((e) => e.value)
.map((e) => e.key)
.toList(),
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,52 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:reactive_forms/reactive_forms.dart';
import 'package:studyu_core/core.dart';
import 'package:studyu_designer_v2/features/design/shared/questionnaire/question/question_form_controller.dart';

import '../question_form_controller.dart';

class FitbitQuestionFormView extends ConsumerWidget {
const FitbitQuestionFormView({required this.formViewModel, super.key});
const FitbitQuestionFormView({required this.formViewModel, Key? key})
: super(key: key);

final QuestionFormViewModel formViewModel;

@override
Widget build(BuildContext context, WidgetRef ref) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
...FitbitQuestionType.values.map((type) {
return ReactiveCheckboxListTile(
formControl: formViewModel.fitbitTypeControls[type],
title: Text(type.name),
onChanged: (value) {
final currentTypes =
formViewModel.fitbitQuestionTypesControl.value ??
<FitbitQuestionType>[];

final FitbitQuestionType typeEnum = FitbitQuestionType.values
.firstWhere((element) => element.name == type.name);
if (value.value == true) {
currentTypes.add(typeEnum);
} else {
currentTypes.remove(typeEnum);
}

formViewModel.fitbitQuestionTypesControl
.updateValue(currentTypes);
},
);
})
Text(
'Fitbit Question Types',
),
ReactiveFormField<Map<FitbitQuestionType, bool>,
Map<FitbitQuestionType, bool>>(
formControl: formViewModel.fitbitQuestionTypesControl,
builder: (field) {
final value = field.value ?? {};
return Column(
children: FitbitQuestionType.values.map((type) {
return CheckboxListTile(
title: Text(type.name),
value: value[type] ?? false,
onChanged: (checked) {
field.didChange({
...value,
type: checked ?? false,
});
},
controlAffinity: ListTileControlAffinity.leading,
);
}).toList(),
);
},
),
if (formViewModel.fitbitQuestionTypesControl.hasErrors)
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Text(
'Please select at least one Fitbit question type.',
),
),
],
);
}
Expand Down

0 comments on commit 5fd3fcc

Please sign in to comment.