1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-22 21:09:21 +00:00

Can block the creation of new responses on a survey

This commit is contained in:
Pierre HUBERT 2020-05-18 18:19:07 +02:00
parent b4465cc70c
commit acc81acdea
3 changed files with 45 additions and 2 deletions

View File

@ -34,6 +34,12 @@ class SurveyHelper {
.isOK; .isOK;
} }
/// Prevent new choices from being created on a survey
static Future<void> blockNewChoicesCreation(int postID) async =>
await APIRequest.withLogin("surveys/block_new_choices_creation")
.addInt("postID", postID)
.execWithThrow();
/// Turn an API entry into a [Survey] object /// Turn an API entry into a [Survey] object
static Survey apiToSurvey(Map<String, dynamic> map) { static Survey apiToSurvey(Map<String, dynamic> map) {
// Parse survey responses // Parse survey responses
@ -50,6 +56,7 @@ class SurveyHelper {
question: map["question"], question: map["question"],
userChoice: map["user_choice"], userChoice: map["user_choice"],
choices: choices, choices: choices,
allowNewChoicesCreation: map["allowNewChoices"],
); );
} }
} }

View File

@ -1,4 +1,5 @@
import 'package:comunic/models/survey_choice.dart'; import 'package:comunic/models/survey_choice.dart';
import 'package:comunic/utils/account_utils.dart' as account;
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
/// Survey information /// Survey information
@ -13,6 +14,7 @@ class Survey {
final String question; final String question;
int userChoice; int userChoice;
final Set<SurveyChoice> choices; final Set<SurveyChoice> choices;
bool allowNewChoicesCreation;
Survey({ Survey({
@required this.id, @required this.id,
@ -22,6 +24,7 @@ class Survey {
@required this.question, @required this.question,
@required this.userChoice, @required this.userChoice,
@required this.choices, @required this.choices,
@required this.allowNewChoicesCreation,
}) : assert(id != null), }) : assert(id != null),
assert(userID != null), assert(userID != null),
assert(postID != null), assert(postID != null),
@ -29,13 +32,17 @@ class Survey {
assert(question != null), assert(question != null),
assert(userChoice != null), assert(userChoice != null),
assert(choices != null), assert(choices != null),
assert(choices.length > 0); assert(choices.length > 0),
assert(allowNewChoicesCreation != null);
bool get hasResponded => this.userChoice != null && this.userChoice > 0; bool get hasResponded => this.userChoice != null && this.userChoice > 0;
bool get hasResponses => bool get hasResponses =>
this.choices.where((f) => f.responses > 0).length > 0; this.choices.where((f) => f.responses > 0).length > 0;
bool get canBlockNewChoicesCreation =>
allowNewChoicesCreation && account.userID() == this.userID;
SurveyChoice get userResponse { SurveyChoice get userResponse {
if (!hasResponded) return null; if (!hasResponded) return null;

View File

@ -1,6 +1,7 @@
import 'package:comunic/helpers/survey_helper.dart'; import 'package:comunic/helpers/survey_helper.dart';
import 'package:comunic/models/survey.dart'; import 'package:comunic/models/survey.dart';
import 'package:comunic/models/survey_choice.dart'; import 'package:comunic/models/survey_choice.dart';
import 'package:comunic/ui/widgets/safe_state.dart';
import 'package:comunic/utils/intl_utils.dart'; import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart'; import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -21,7 +22,7 @@ class SurveyWidget extends StatefulWidget {
_SurveyWidgetState createState() => _SurveyWidgetState(); _SurveyWidgetState createState() => _SurveyWidgetState();
} }
class _SurveyWidgetState extends State<SurveyWidget> { class _SurveyWidgetState extends SafeState<SurveyWidget> {
final SurveyHelper _helper = SurveyHelper(); final SurveyHelper _helper = SurveyHelper();
Survey get survey => widget.survey; Survey get survey => widget.survey;
@ -42,6 +43,12 @@ class _SurveyWidgetState extends State<SurveyWidget> {
style: TextStyle(fontWeight: FontWeight.bold), style: TextStyle(fontWeight: FontWeight.bold),
), ),
_buildUserResponse(), _buildUserResponse(),
// Offer to block the creation of new responses, if possible
survey.allowNewChoicesCreation
? _buildBlockNewResponsesLink()
: Container(),
survey.hasResponses ? _buildChart() : _buildNoResponseNotice(), survey.hasResponses ? _buildChart() : _buildNoResponseNotice(),
], ],
); );
@ -109,6 +116,11 @@ class _SurveyWidgetState extends State<SurveyWidget> {
); );
} }
Widget _buildBlockNewResponsesLink() => InkWell(
onTap: _blockNewChoices,
child: Text(tr("Block the creation of new responses")),
);
Widget _buildChart() { Widget _buildChart() {
return PieChart( return PieChart(
dataMap: _buildDataMap(), dataMap: _buildDataMap(),
@ -133,4 +145,21 @@ class _SurveyWidgetState extends State<SurveyWidget> {
survey.setUserResponse(choice); survey.setUserResponse(choice);
}); });
} }
/// Block the creation of new choices on this survey
void _blockNewChoices() async {
try {
if (!await showConfirmDialog(
context: context,
message: tr("Do you really want to block new responses ?"))) return;
await SurveyHelper.blockNewChoicesCreation(survey.postID);
setState(() => survey.allowNewChoicesCreation = false);
} catch (e, s) {
print("Could not block the creation of new choices! $e\n$s");
showSimpleSnack(
context, tr("Could not block the creation of new choices!"));
}
}
} }