@touchpoll/tp-survey 0.0.49 → 0.0.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -199,21 +199,28 @@ const answerSSValidator = () => (control) => {
|
|
|
199
199
|
//ошибок нет, всё корректно
|
|
200
200
|
return null;
|
|
201
201
|
};
|
|
202
|
-
const answerMSValidator = (
|
|
203
|
-
//
|
|
202
|
+
const answerMSValidator = (visibleAlternativeList, minCount = 1, maxCount = 0) => (control) => {
|
|
203
|
+
//visibleAlternativeList - альтернативы на экране, если их 0, то смысла показывать вопрос нет
|
|
204
204
|
//minCount - Минимальное количество ответов, которое может выбрать респондент, по умолчанию 1.
|
|
205
205
|
//maxCount - Максимальное количество ответов, которые может выбрать респондент. Если указано 0, количество не ограничено. По умолчанию 0
|
|
206
|
-
if (
|
|
206
|
+
if (visibleAlternativeList.length === 0) {
|
|
207
207
|
return null;
|
|
208
208
|
}
|
|
209
209
|
//ответ не массив, такого быть не может, это ошибка
|
|
210
210
|
if (!Array.isArray(control.value)) {
|
|
211
211
|
return { answerMsAnswerType: true };
|
|
212
212
|
}
|
|
213
|
+
//Проблема минимального количества ответов - если доступных на экране альтернатив меньше, чем настройка "минимальное количество ответов", то это нужно учитывать.
|
|
214
|
+
//Поэтому вычисляем минимально возможное количество ответов, которое может выбрать респондент и если оно меньше значения из настроек, возьмем его.
|
|
215
|
+
let minPossibleCount = minCount;
|
|
216
|
+
if (control.value.length > 0) {
|
|
217
|
+
const currentAlternativeGroup = visibleAlternativeList.find(alternative => alternative.Value === control.value[0])?.GroupNo ?? 1;
|
|
218
|
+
minPossibleCount = Math.min(visibleAlternativeList.filter(alternative => alternative.GroupNo === currentAlternativeGroup).length, minCount);
|
|
219
|
+
}
|
|
213
220
|
//количество ответов
|
|
214
221
|
const count = control.value.length;
|
|
215
222
|
//проверяем minCount
|
|
216
|
-
if (count <
|
|
223
|
+
if (count < minPossibleCount) {
|
|
217
224
|
return { answerMsMinCount: true };
|
|
218
225
|
}
|
|
219
226
|
//проверяем maxCount
|
|
@@ -1297,7 +1304,7 @@ class ContainerAnswerComponent {
|
|
|
1297
1304
|
break;
|
|
1298
1305
|
}
|
|
1299
1306
|
case QuestionsType.eqMS: {
|
|
1300
|
-
this.answerForm.controls.answer.addValidators(answerMSValidator(this.visibleAlternativeList()
|
|
1307
|
+
this.answerForm.controls.answer.addValidators(answerMSValidator(this.visibleAlternativeList(), this.question().AlternativeMinAnswersCount, this.question().AlternativeMaxAnswersCount));
|
|
1301
1308
|
break;
|
|
1302
1309
|
}
|
|
1303
1310
|
case QuestionsType.eqOD: {
|