Skip to content

Commit bc585a8

Browse files
committed
Merge pull request #483 from dpalou/MOBILE-1577
Mobile 1577
2 parents 31f092b + 80d1aa6 commit bc585a8

File tree

27 files changed

+352
-179
lines changed

27 files changed

+352
-179
lines changed

www/addons/mod_quiz/controllers/player.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,15 +201,14 @@ angular.module('mm.addons.mod_quiz')
201201
function loadSummary() {
202202
$scope.showSummary = true;
203203
$scope.summaryQuestions = [];
204+
204205
return $mmaModQuiz.getAttemptSummary(attempt.id, $scope.preflightData, offline, true, true).then(function(questions) {
205206
$scope.summaryQuestions = questions;
206207
$scope.canReturn = attempt.state == $mmaModQuiz.ATTEMPT_IN_PROGRESS && !attempt.finishedOffline;
208+
$scope.preventSubmitMessages = $mmaModQuiz.getPreventSubmitMessages(questions);
207209

208210
attempt.dueDateWarning = $mmaModQuiz.getAttemptDueDateWarning(quiz, attempt);
209211

210-
// Remove all answers stored since the questions aren't rendered anymore.
211-
$mmUtil.emptyObject($scope.answers);
212-
213212
// Log summary as viewed.
214213
$mmaModQuiz.logViewAttemptSummary(attempt.id);
215214
}).catch(function(message) {

www/addons/mod_quiz/lang/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"attemptnumber": "Attempt",
55
"attemptquiznow": "Attempt quiz now",
66
"attemptstate": "State",
7+
"cannotsubmitquizdueto": "This quiz cannot be submitted due to the following reasons:",
78
"comment": "Comment",
89
"completedon": "Completed on",
910
"confirmclose": "Once you submit, you will no longer be able to change your answers for this attempt.",

www/addons/mod_quiz/services/quiz.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,28 @@ angular.module('mm.addons.mod_quiz')
749749
}
750750
};
751751

752+
/**
753+
* Given a list of questions, check if the quiz can be submitted.
754+
* Will return an array with the messages to prevent the submit. Empty array if quiz can be submitted.
755+
*
756+
* @module mm.addons.mod_quiz
757+
* @ngdoc method
758+
* @name $mmaModQuiz#getPreventSubmitMessages
759+
* @param {Object[]} questions Questions.
760+
* @return {String[]} List of prevent submit messages. Empty array if quiz can be submitted.
761+
*/
762+
self.getPreventSubmitMessages = function(questions) {
763+
var messages = [];
764+
angular.forEach(questions, function(question) {
765+
var message = $mmQuestionDelegate.getPreventSubmitMessage(question);
766+
if (message) {
767+
message = $translate.instant(message);
768+
messages.push($translate.instant('mm.question.questionmessage', {$a: question.slot, $b: message}));
769+
}
770+
});
771+
return messages;
772+
};
773+
752774
/**
753775
* Get cache key for Quiz data WS calls.
754776
*

www/addons/mod_quiz/templates/player.html

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ <h2>{{ 'mma.mod_quiz.summaryofattempt' | translate }}</h2>
5454
<p class="col col-25 text-center">{{ question.number }}</p>
5555
<p class="col col-65 text-center">{{ question.status }}</p>
5656
<p class="col col-10 text-center" ng-if="!quiz.isSequential && canReturn">
57-
<a class="button button-block button-icon ion-ios-arrow-forward" ng-click="loadPage(question.page, false, question.number)" aria-label="{{ 'mma.mod_quiz.questionno' | translate:{$a: question.number} }}"></a>
57+
<a class="button button-block button-icon ion-ios-arrow-forward" ng-click="loadPage(question.page, false, question.slot)" aria-label="{{ 'mma.mod_quiz.questionno' | translate:{$a: question.number} }}"></a>
5858
</p>
5959
</div>
6060
<div class="item" ng-if="canReturn">
@@ -64,7 +64,12 @@ <h2>{{ 'mma.mod_quiz.summaryofattempt' | translate }}</h2>
6464
{{ attempt.dueDateWarning }}
6565
</div>
6666
<mm-timer ng-if="endTime" class="item item-text-wrap" end-time="endTime" finished="timeUp()" timer-text="{{ 'mma.mod_quiz.timeleft' | translate }}"></mm-timer>
67-
<div class="item" ng-if="!attempt.finishedOffline">
67+
<div class="item item-text-wrap" ng-if="preventSubmitMessages.length">
68+
<p class="item-heading">{{ 'mma.mod_quiz.cannotsubmitquizdueto' | translate }}</p>
69+
<p ng-repeat="message in preventSubmitMessages">{{message}}</p>
70+
<a class="button button-block" ng-href="{{moduleUrl}}" mm-browser>{{ 'mm.core.openinbrowser' | translate }}</a>
71+
</div>
72+
<div class="item" ng-if="!attempt.finishedOffline && !preventSubmitMessages.length">
6873
<a class="button button-block" ng-click="finishAttempt()">{{ 'mma.mod_quiz.submitallandfinish' | translate }}</a>
6974
</div>
7075
</div>

www/addons/qtype/calculated/handlers.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@ angular.module('mm.addons.qtype_calculated')
2828
/**
2929
* Check if a response is complete.
3030
*
31-
* @param {Object} answers Question answers (without prefix).
32-
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
31+
* @param {Object} question Question.
32+
* @param {Object} answers Question answers (without prefix).
33+
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
3334
*/
34-
self.isCompleteResponse = function(answers) {
35+
self.isCompleteResponse = function(question, answers) {
3536
// This question type depends on numerical.
36-
return $mmaQtypeNumericalHandler.isCompleteResponse(answers);
37+
return $mmaQtypeNumericalHandler.isCompleteResponse(question, answers);
3738
};
3839

3940
/**
@@ -49,24 +50,26 @@ angular.module('mm.addons.qtype_calculated')
4950
* Check if a student has provided enough of an answer for the question to be graded automatically,
5051
* or whether it must be considered aborted.
5152
*
52-
* @param {Object} answers Question answers (without prefix).
53-
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
53+
* @param {Object} question Question.
54+
* @param {Object} answers Question answers (without prefix).
55+
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
5456
*/
55-
self.isGradableResponse = function(answers) {
57+
self.isGradableResponse = function(question, answers) {
5658
// This question type depends on numerical.
57-
return $mmaQtypeNumericalHandler.isGradableResponse(answers);
59+
return $mmaQtypeNumericalHandler.isGradableResponse(question, answers);
5860
};
5961

6062
/**
6163
* Check if two responses are the same.
6264
*
65+
* @param {Object} question Question.
6366
* @param {Object} prevAnswers Previous answers.
6467
* @param {Object} newAnswers New answers.
6568
* @return {Boolean} True if same, false otherwise.
6669
*/
67-
self.isSameResponse = function(prevAnswers, newAnswers) {
70+
self.isSameResponse = function(question, prevAnswers, newAnswers) {
6871
// This question type depends on numerical.
69-
return $mmaQtypeNumericalHandler.isSameResponse(prevAnswers, newAnswers);
72+
return $mmaQtypeNumericalHandler.isSameResponse(question, prevAnswers, newAnswers);
7073
};
7174

7275
/**

www/addons/qtype/calculatedmulti/handlers.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ angular.module('mm.addons.qtype_calculatedmulti')
2828
/**
2929
* Check if a response is complete.
3030
*
31-
* @param {Object} answers Question answers (without prefix).
32-
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
31+
* @param {Object} question Question.
32+
* @param {Object} answers Question answers (without prefix).
33+
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
3334
*/
34-
self.isCompleteResponse = function(answers) {
35+
self.isCompleteResponse = function(question, answers) {
3536
// This question type depends on multichoice.
3637
return $mmaQtypeMultichoiceHandler.isCompleteResponseSingle(answers);
3738
};
@@ -49,22 +50,24 @@ angular.module('mm.addons.qtype_calculatedmulti')
4950
* Check if a student has provided enough of an answer for the question to be graded automatically,
5051
* or whether it must be considered aborted.
5152
*
52-
* @param {Object} answers Question answers (without prefix).
53-
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
53+
* @param {Object} question Question.
54+
* @param {Object} answers Question answers (without prefix).
55+
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
5456
*/
55-
self.isGradableResponse = function(answers) {
57+
self.isGradableResponse = function(question, answers) {
5658
// This question type depends on multichoice.
5759
return $mmaQtypeMultichoiceHandler.isGradableResponseSingle(answers);
5860
};
5961

6062
/**
6163
* Check if two responses are the same.
6264
*
65+
* @param {Object} question Question.
6366
* @param {Object} prevAnswers Previous answers.
6467
* @param {Object} newAnswers New answers.
6568
* @return {Boolean} True if same, false otherwise.
6669
*/
67-
self.isSameResponse = function(prevAnswers, newAnswers) {
70+
self.isSameResponse = function(question, prevAnswers, newAnswers) {
6871
// This question type depends on multichoice.
6972
return $mmaQtypeMultichoiceHandler.isSameResponseSingle(prevAnswers, newAnswers);
7073
};

www/addons/qtype/calculatedsimple/handlers.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@ angular.module('mm.addons.qtype_calculatedsimple')
2828
/**
2929
* Check if a response is complete.
3030
*
31-
* @param {Object} answers Question answers (without prefix).
32-
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
31+
* @param {Object} question Question.
32+
* @param {Object} answers Question answers (without prefix).
33+
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
3334
*/
34-
self.isCompleteResponse = function(answers) {
35+
self.isCompleteResponse = function(question, answers) {
3536
// This question type depends on calculated.
36-
return $mmaQtypeCalculatedHandler.isCompleteResponse(answers);
37+
return $mmaQtypeCalculatedHandler.isCompleteResponse(question, answers);
3738
};
3839

3940
/**
@@ -49,24 +50,26 @@ angular.module('mm.addons.qtype_calculatedsimple')
4950
* Check if a student has provided enough of an answer for the question to be graded automatically,
5051
* or whether it must be considered aborted.
5152
*
52-
* @param {Object} answers Question answers (without prefix).
53-
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
53+
* @param {Object} question Question.
54+
* @param {Object} answers Question answers (without prefix).
55+
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
5456
*/
55-
self.isGradableResponse = function(answers) {
57+
self.isGradableResponse = function(question, answers) {
5658
// This question type depends on calculated.
57-
return $mmaQtypeCalculatedHandler.isGradableResponse(answers);
59+
return $mmaQtypeCalculatedHandler.isGradableResponse(question, answers);
5860
};
5961

6062
/**
6163
* Check if two responses are the same.
6264
*
65+
* @param {Object} question Question.
6366
* @param {Object} prevAnswers Previous answers.
6467
* @param {Object} newAnswers New answers.
6568
* @return {Boolean} True if same, false otherwise.
6669
*/
67-
self.isSameResponse = function(prevAnswers, newAnswers) {
70+
self.isSameResponse = function(question, prevAnswers, newAnswers) {
6871
// This question type depends on calculated.
69-
return $mmaQtypeCalculatedHandler.isSameResponse(prevAnswers, newAnswers);
72+
return $mmaQtypeCalculatedHandler.isSameResponse(question, prevAnswers, newAnswers);
7073
};
7174

7275
/**

www/addons/qtype/ddimageortext/handlers.js

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,20 @@ angular.module('mm.addons.qtype_ddimageortext')
2828
/**
2929
* Check if a response is complete.
3030
*
31-
* @param {Object} answers Question answers (without prefix).
32-
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
31+
* @param {Object} question Question.
32+
* @param {Object} answers Question answers (without prefix).
33+
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
3334
*/
34-
self.isCompleteResponse = function(answers) {
35-
// An answer is complete if all drop zones have an answer. Since we don't have the list of drop zones
36-
// we cannot determine if the answer is complete, only if it's unanswered.
37-
var hasReponse = false;
35+
self.isCompleteResponse = function(question, answers) {
36+
// An answer is complete if all drop zones have an answer.
37+
// We should always receive all the drop zones with their value ('' if not answered).
38+
var isComplete = true;
3839
angular.forEach(answers, function(value) {
39-
if (value && value !== '0') {
40-
hasReponse = true;
40+
if (!value || value === '0') {
41+
isComplete = false;
4142
}
4243
});
43-
return hasReponse ? -1 : false;
44+
return isComplete;
4445
};
4546

4647
/**
@@ -56,10 +57,11 @@ angular.module('mm.addons.qtype_ddimageortext')
5657
* Check if a student has provided enough of an answer for the question to be graded automatically,
5758
* or whether it must be considered aborted.
5859
*
59-
* @param {Object} answers Question answers (without prefix).
60-
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
60+
* @param {Object} question Question.
61+
* @param {Object} answers Question answers (without prefix).
62+
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
6163
*/
62-
self.isGradableResponse = function(answers) {
64+
self.isGradableResponse = function(question, answers) {
6365
var hasReponse = false;
6466
angular.forEach(answers, function(value) {
6567
if (value && value !== '0') {
@@ -72,11 +74,12 @@ angular.module('mm.addons.qtype_ddimageortext')
7274
/**
7375
* Check if two responses are the same.
7476
*
77+
* @param {Object} question Question.
7578
* @param {Object} prevAnswers Previous answers.
7679
* @param {Object} newAnswers New answers.
7780
* @return {Boolean} True if same, false otherwise.
7881
*/
79-
self.isSameResponse = function(prevAnswers, newAnswers) {
82+
self.isSameResponse = function(question, prevAnswers, newAnswers) {
8083
return $mmQuestion.compareAllAnswers(prevAnswers, newAnswers);
8184
};
8285

www/addons/qtype/ddmarker/handlers.js

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,12 @@ angular.module('mm.addons.qtype_ddmarker')
2828
/**
2929
* Check if a response is complete.
3030
*
31-
* @param {Object} answers Question answers (without prefix).
32-
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
31+
* @param {Object} question Question.
32+
* @param {Object} answers Question answers (without prefix).
33+
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
3334
*/
34-
self.isCompleteResponse = function(answers) {
35-
// We should always get a value for each dragitem so we can assume we receive all the possible answers.
35+
self.isCompleteResponse = function(question, answers) {
36+
// If 1 dragitem is set we assume the answer is complete (like Moodle does).
3637
var hasReponse = false;
3738
angular.forEach(answers, function(value) {
3839
if (value) {
@@ -55,21 +56,23 @@ angular.module('mm.addons.qtype_ddmarker')
5556
* Check if a student has provided enough of an answer for the question to be graded automatically,
5657
* or whether it must be considered aborted.
5758
*
58-
* @param {Object} answers Question answers (without prefix).
59-
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
59+
* @param {Object} question Question.
60+
* @param {Object} answers Question answers (without prefix).
61+
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
6062
*/
61-
self.isGradableResponse = function(answers) {
62-
return self.isCompleteResponse(answers);
63+
self.isGradableResponse = function(question, answers) {
64+
return self.isCompleteResponse(question, answers);
6365
};
6466

6567
/**
6668
* Check if two responses are the same.
6769
*
70+
* @param {Object} question Question.
6871
* @param {Object} prevAnswers Previous answers.
6972
* @param {Object} newAnswers New answers.
7073
* @return {Boolean} True if same, false otherwise.
7174
*/
72-
self.isSameResponse = function(prevAnswers, newAnswers) {
75+
self.isSameResponse = function(question, prevAnswers, newAnswers) {
7376
return $mmQuestion.compareAllAnswers(prevAnswers, newAnswers);
7477
};
7578

www/addons/qtype/ddwtos/handlers.js

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,20 @@ angular.module('mm.addons.qtype_ddwtos')
2828
/**
2929
* Check if a response is complete.
3030
*
31-
* @param {Object} answers Question answers (without prefix).
32-
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
31+
* @param {Object} question Question.
32+
* @param {Object} answers Question answers (without prefix).
33+
* @return {Mixed} True if complete, false if not complete, -1 if cannot determine.
3334
*/
34-
self.isCompleteResponse = function(answers) {
35-
// An answer is complete if all drop zones have an answer. Since we don't have the list of drop zones
36-
// we cannot determine if the answer is complete, only if it's unanswered.
37-
var hasReponse = false;
35+
self.isCompleteResponse = function(question, answers) {
36+
// An answer is complete if all drop zones have an answer.
37+
// We should always receive all the drop zones with their value ('0' if not answered).
38+
var isComplete = true;
3839
angular.forEach(answers, function(value) {
39-
if (value && value !== '0') {
40-
hasReponse = true;
40+
if (!value || value === '0') {
41+
isComplete = false;
4142
}
4243
});
43-
return hasReponse ? -1 : false;
44+
return isComplete;
4445
};
4546

4647
/**
@@ -56,10 +57,11 @@ angular.module('mm.addons.qtype_ddwtos')
5657
* Check if a student has provided enough of an answer for the question to be graded automatically,
5758
* or whether it must be considered aborted.
5859
*
59-
* @param {Object} answers Question answers (without prefix).
60-
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
60+
* @param {Object} question Question.
61+
* @param {Object} answers Question answers (without prefix).
62+
* @return {Mixed} True if gradable, false if not gradable, -1 if cannot determine.
6163
*/
62-
self.isGradableResponse = function(answers) {
64+
self.isGradableResponse = function(question, answers) {
6365
var hasReponse = false;
6466
angular.forEach(answers, function(value) {
6567
if (value && value !== '0') {
@@ -72,11 +74,12 @@ angular.module('mm.addons.qtype_ddwtos')
7274
/**
7375
* Check if two responses are the same.
7476
*
77+
* @param {Object} question Question.
7578
* @param {Object} prevAnswers Previous answers.
7679
* @param {Object} newAnswers New answers.
7780
* @return {Boolean} True if same, false otherwise.
7881
*/
79-
self.isSameResponse = function(prevAnswers, newAnswers) {
82+
self.isSameResponse = function(question, prevAnswers, newAnswers) {
8083
return $mmQuestion.compareAllAnswers(prevAnswers, newAnswers);
8184
};
8285

0 commit comments

Comments
 (0)