mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-12-27 21:38:51 +00:00
137 lines
3.5 KiB
Dart
137 lines
3.5 KiB
Dart
import 'package:comunic/helpers/survey_helper.dart';
|
|
import 'package:comunic/models/survey.dart';
|
|
import 'package:comunic/models/survey_choice.dart';
|
|
import 'package:comunic/utils/intl_utils.dart';
|
|
import 'package:comunic/utils/ui_utils.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:pie_chart/pie_chart.dart';
|
|
|
|
/// Survey widget
|
|
///
|
|
/// @author Pierre HUBERT
|
|
|
|
class SurveyWidget extends StatefulWidget {
|
|
final Survey survey;
|
|
|
|
const SurveyWidget({Key key, @required this.survey})
|
|
: assert(survey != null),
|
|
super(key: key);
|
|
|
|
@override
|
|
_SurveyWidgetState createState() => _SurveyWidgetState();
|
|
}
|
|
|
|
class _SurveyWidgetState extends State<SurveyWidget> {
|
|
final SurveyHelper _helper = SurveyHelper();
|
|
|
|
Survey get survey => widget.survey;
|
|
|
|
Map<String, double> _buildDataMap() {
|
|
Map<String, double> data = Map();
|
|
widget.survey.choices.forEach((e) => data.putIfAbsent(
|
|
e.name + " (" + e.responses.toString() + ")", () => 1.0 * e.responses));
|
|
return data;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Column(
|
|
children: <Widget>[
|
|
Text(
|
|
widget.survey.question,
|
|
style: TextStyle(fontWeight: FontWeight.bold),
|
|
),
|
|
_buildUserResponse(),
|
|
survey.hasResponses ? _buildChart() : _buildNoResponseNotice(),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget _buildUserResponse() {
|
|
if (survey.hasResponded) return _buildUserRespondedWidget();
|
|
return _buildUserResponseFormWidget();
|
|
}
|
|
|
|
Widget _buildUserRespondedWidget() {
|
|
return Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: <Widget>[
|
|
Flexible(
|
|
child: Text(
|
|
tr("Your response: %response%",
|
|
args: {"response": survey.userResponse.name}),
|
|
textAlign: TextAlign.center,
|
|
),
|
|
),
|
|
MaterialButton(
|
|
child: Text(tr("Cancel").toUpperCase()),
|
|
onPressed: _cancelUserResponse,
|
|
)
|
|
],
|
|
);
|
|
}
|
|
|
|
Future<void> _cancelUserResponse() async {
|
|
if (!await showConfirmDialog(
|
|
context: context,
|
|
title: tr("Cancel response to survey"),
|
|
message:
|
|
tr("Do you really want to cancel your response to this survey ?"),
|
|
)) return;
|
|
|
|
if (!await _helper.cancelResponse(survey)) {
|
|
showSimpleSnack(
|
|
context, tr("Could not cancel your response to the survey !"));
|
|
return;
|
|
}
|
|
|
|
setState(() {
|
|
survey.cancelUserResponse();
|
|
});
|
|
}
|
|
|
|
Widget _buildUserResponseFormWidget() {
|
|
return ConstrainedBox(
|
|
constraints: BoxConstraints(maxWidth: 300),
|
|
child: DropdownButton<SurveyChoice>(
|
|
isExpanded: true,
|
|
hint: Text(tr("Respond to survey")),
|
|
items: survey.choices
|
|
.map(
|
|
(f) => DropdownMenuItem<SurveyChoice>(
|
|
value: f,
|
|
child: Text(f.name),
|
|
),
|
|
)
|
|
.toList(),
|
|
onChanged: _respondToSurvey,
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildChart() {
|
|
return PieChart(
|
|
dataMap: _buildDataMap(),
|
|
);
|
|
}
|
|
|
|
Widget _buildNoResponseNotice() {
|
|
return Padding(
|
|
padding: const EdgeInsets.all(16.0),
|
|
child: Text(tr("No response yet to this survey.")),
|
|
);
|
|
}
|
|
|
|
/// Respond to survey
|
|
Future<void> _respondToSurvey(SurveyChoice choice) async {
|
|
// Send the response to the server
|
|
if (!await _helper.respondToSurvey(survey: survey, choice: choice))
|
|
return showSimpleSnack(
|
|
context, tr("Could not send your response to the survey!"));
|
|
|
|
setState(() {
|
|
survey.setUserResponse(choice);
|
|
});
|
|
}
|
|
}
|