@touchpoll/tp-survey 0.0.18 → 0.0.20
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.
- package/esm2022/lib/core/tp.survey.answer/tp.survey.answer.mjs +1 -4
- package/esm2022/lib/core/tp.survey.core/tp.survey.core.service.mjs +45 -9
- package/esm2022/lib/core/tp.survey.interview/tp.survey.interview.service.mjs +1 -1
- package/fesm2022/touchpoll-tp-survey.mjs +44 -11
- package/fesm2022/touchpoll-tp-survey.mjs.map +1 -1
- package/lib/core/tp.survey.answer/tp.survey.answer.d.ts +1 -2
- package/package.json +1 -1
|
@@ -1613,9 +1613,6 @@ class Answer {
|
|
|
1613
1613
|
this.AnswerAdditional[Number(key)] = null;
|
|
1614
1614
|
}
|
|
1615
1615
|
}
|
|
1616
|
-
addAnswer(answerValue, answerAdditional, asComplete) {
|
|
1617
|
-
this.AnswerValue = answerValue;
|
|
1618
|
-
}
|
|
1619
1616
|
}
|
|
1620
1617
|
|
|
1621
1618
|
class TpSurveyInterviewService {
|
|
@@ -1688,6 +1685,7 @@ class TpSurveyCoreService {
|
|
|
1688
1685
|
#surveyQuotas = new SurveyQuotas();
|
|
1689
1686
|
#questionary;
|
|
1690
1687
|
#displayedQuestions = []; // нужно для навигации по кнопке back
|
|
1688
|
+
#questionLogicVarContainer = {}; //Нужно знать какая логическая переменная относится к какому вопросу. НапримерЮ когда нужно ее отчистить при переходе назад.
|
|
1691
1689
|
#destroyRef = inject(DestroyRef);
|
|
1692
1690
|
constructor(platformId, _logic, _interview) {
|
|
1693
1691
|
this.platformId = platformId;
|
|
@@ -1759,6 +1757,7 @@ class TpSurveyCoreService {
|
|
|
1759
1757
|
if (!!previousQuestionNum) {
|
|
1760
1758
|
const prevQuestion = this.#questionary?.Questions[previousQuestionNum];
|
|
1761
1759
|
if (!!prevQuestion) {
|
|
1760
|
+
this.#clearAnswerForCurrentQuestion(); // отчистим ответ на вопрос, если он уже есть.
|
|
1762
1761
|
this.#changeCurrentQuestion(prevQuestion);
|
|
1763
1762
|
}
|
|
1764
1763
|
}
|
|
@@ -1767,22 +1766,29 @@ class TpSurveyCoreService {
|
|
|
1767
1766
|
const answer = this._interview.findAnswerByGuid(guid);
|
|
1768
1767
|
return answer?.answerIsComplete ?? false;
|
|
1769
1768
|
}
|
|
1769
|
+
/*
|
|
1770
|
+
* функция по номеру вопроса, ищет ответ на этот guid, и возвращает ответ на этот вопрос.
|
|
1771
|
+
* если это ss ms, вместо номеров альтернатив подставляет текст.
|
|
1772
|
+
* работает только для eqOL, eqSS, eqMS
|
|
1773
|
+
* */
|
|
1770
1774
|
guidToTextAnswer(guid, languageId) {
|
|
1771
1775
|
const answer = this.findAnswerByGuid(guid);
|
|
1772
1776
|
const question = this.#findQuestionByGuid(guid);
|
|
1777
|
+
//если ответа нет, ревнём пустую строку
|
|
1773
1778
|
if (!question || !answer || answer.AnswerValue === -97) {
|
|
1774
1779
|
return '';
|
|
1775
1780
|
}
|
|
1776
1781
|
const questionType = question.QuestionType;
|
|
1777
|
-
console.log(0);
|
|
1778
1782
|
switch (questionType) {
|
|
1779
1783
|
case QuestionsType.eqOL: return answer.AnswerValue;
|
|
1780
1784
|
case QuestionsType.eqSS: {
|
|
1785
|
+
//находим альтернативу и подставляем заголовок альтернативы с указанным языком, если заголовка нет, вернём alias
|
|
1781
1786
|
const alternative = question.Alternativelist.find(alt => alt.Value === answer.AnswerValue);
|
|
1782
1787
|
const altText = alternative?.MultiLangCaptions.find(obj => obj.lang === languageId);
|
|
1783
1788
|
return (altText?.CaptionHtml || alternative?.alias) ?? '';
|
|
1784
1789
|
}
|
|
1785
1790
|
case QuestionsType.eqMS: {
|
|
1791
|
+
//всё то же самое, что и ss, только тут массив ответов,
|
|
1786
1792
|
const answerArray = answer.AnswerValue;
|
|
1787
1793
|
const alternativeArray = question.Alternativelist.filter(alt => answerArray.indexOf(alt.Value) > 0);
|
|
1788
1794
|
const altTextArray = alternativeArray.map(alt => (alt.MultiLangCaptions.find(obj => obj.lang === languageId)?.CaptionHtml || alt.alias) ?? '');
|
|
@@ -1898,8 +1904,8 @@ class TpSurveyCoreService {
|
|
|
1898
1904
|
this.#eventBus.next({ key: SurveyEvents.seQuestionAnswersChange, data: { question: this.#currentQuestion.value, answerIsComplete: answer.answerIsComplete } });
|
|
1899
1905
|
//может возникнуть ситуация, когда нет ни одной альтернативы или секции для отображения.в этом случае вопрос показывать не нужно, как ответ записываем 0 и переходим на следующий
|
|
1900
1906
|
const question = this.#findQuestionByGuid(eventData.guid);
|
|
1901
|
-
//ситуация для ss/ms
|
|
1902
|
-
if (!!question && answer.answerIsComplete && (question.QuestionType === 'SS' || question.QuestionType === 'MS') && (eventData.viewedAlternativeValues.length === 0)) {
|
|
1907
|
+
//ситуация для ss/ms вопросов и для неявных вопросов
|
|
1908
|
+
if (!!question && answer.answerIsComplete && (question.QuestionType === 'SS' || question.QuestionType === 'MS') && ((eventData.viewedAlternativeValues.length === 0) || question.Implicit)) {
|
|
1903
1909
|
this.goToNextQuestion();
|
|
1904
1910
|
}
|
|
1905
1911
|
}
|
|
@@ -2000,19 +2006,31 @@ class TpSurveyCoreService {
|
|
|
2000
2006
|
if (!answer) {
|
|
2001
2007
|
throw new Error('answer not found');
|
|
2002
2008
|
}
|
|
2009
|
+
const logicVarSet = new Set();
|
|
2010
|
+
this.#questionLogicVarContainer[question.QuestionGuid.toString()] = logicVarSet;
|
|
2011
|
+
logicVarSet.add(question.SysName); //привязываем переменную к вопросу
|
|
2003
2012
|
this._logic.setLogicValue(question.SysName, MISSING_VALUE); // переменная самого вопроса
|
|
2004
2013
|
//добавим доп ответы и логику для них
|
|
2005
2014
|
question.AdditionalAnswerlist.forEach(aa => {
|
|
2015
|
+
const aaSysName = `${question.SysName}${aa.SysName}`;
|
|
2006
2016
|
answer.AnswerAdditional[aa.Value] = null;
|
|
2007
|
-
this._logic.setLogicValue(
|
|
2017
|
+
this._logic.setLogicValue(aaSysName, MISSING_VALUE); // логика для переменных доп ответа
|
|
2018
|
+
logicVarSet.add(aaSysName); //привязываем переменную к вопросу
|
|
2008
2019
|
});
|
|
2009
2020
|
// если в тексте postScript есть запись типа setVar('varName', value); нужно инициализировать переменную varName значением -97.
|
|
2010
2021
|
if (!!question.PostScript) {
|
|
2011
|
-
(question.PostScript.match(/(\bsetvar\b)\(['|"](.*?)['|"]/gim) ?? []).map(scriptVar => scriptVar.match(/['|"](.+)['|"]/i)[1]).forEach(varName =>
|
|
2022
|
+
(question.PostScript.match(/(\bsetvar\b)\(['|"](.*?)['|"]/gim) ?? []).map(scriptVar => scriptVar.match(/['|"](.+)['|"]/i)[1]).forEach(varName => {
|
|
2023
|
+
logicVarSet.add(varName); //привязываем переменную к вопросу
|
|
2024
|
+
this._logic.setLogicValue(varName, null);
|
|
2025
|
+
});
|
|
2012
2026
|
}
|
|
2013
2027
|
// для Вопросов SS/MS нужно прописать логику альтернатив sysname вопроса + sysname альтернативы
|
|
2014
2028
|
if (question.Sectionlist.length <= 0) { // для Вопросов SS/MS
|
|
2015
|
-
question.Alternativelist.forEach(alt =>
|
|
2029
|
+
question.Alternativelist.forEach(alt => {
|
|
2030
|
+
const aSysName = `${question.SysName}${alt.SysName}`;
|
|
2031
|
+
this._logic.setLogicValue(aSysName, MISSING_VALUE);
|
|
2032
|
+
logicVarSet.add(aSysName); //привязываем переменную к вопросу
|
|
2033
|
+
});
|
|
2016
2034
|
}
|
|
2017
2035
|
else {
|
|
2018
2036
|
//для вопросов у которых есть секции проинициализируем каждую секцию
|
|
@@ -2025,8 +2043,13 @@ class TpSurveyCoreService {
|
|
|
2025
2043
|
}
|
|
2026
2044
|
// для Вопросов SL нужно прописать логику альтернатив и секций sysname секции + sysname альтернативы
|
|
2027
2045
|
this._logic.setLogicValue(section.SysName, MISSING_VALUE); // переменная самой секции
|
|
2046
|
+
logicVarSet.add(section.SysName); //привязываем переменную к вопросу
|
|
2028
2047
|
//логика альтернатив SL вопроса
|
|
2029
|
-
question.Alternativelist.forEach(alt =>
|
|
2048
|
+
question.Alternativelist.forEach(alt => {
|
|
2049
|
+
const aSysName = `${section.SysName}${alt.SysName}`;
|
|
2050
|
+
this._logic.setLogicValue(aSysName, MISSING_VALUE);
|
|
2051
|
+
logicVarSet.add(aSysName); //привязываем переменную к вопросу
|
|
2052
|
+
});
|
|
2030
2053
|
});
|
|
2031
2054
|
}
|
|
2032
2055
|
});
|
|
@@ -2070,13 +2093,23 @@ class TpSurveyCoreService {
|
|
|
2070
2093
|
answer: questionAnswer,
|
|
2071
2094
|
additionalAnswers: {},
|
|
2072
2095
|
logicVars: {},
|
|
2073
|
-
viewedAlternativeValues: [],
|
|
2096
|
+
viewedAlternativeValues: Array.isArray(questionAnswer) ? questionAnswer : [questionAnswer],
|
|
2074
2097
|
viewedSectionGuids: [],
|
|
2075
2098
|
alternativeSequenceClicks: []
|
|
2076
2099
|
};
|
|
2077
2100
|
this.updateAnswer(answerChange);
|
|
2078
2101
|
}
|
|
2079
2102
|
}
|
|
2103
|
+
#clearAnswerForCurrentQuestion() {
|
|
2104
|
+
const currentQuestionGuid = this.#currentQuestion.value?.QuestionGuid ?? -1;
|
|
2105
|
+
//удаляем сам ответ на вопрос
|
|
2106
|
+
this._interview.findAnswerByGuid(currentQuestionGuid)?.clear();
|
|
2107
|
+
//удаляем переменные которые относятся к этому вопросу
|
|
2108
|
+
const logicSet = this.#questionLogicVarContainer[currentQuestionGuid];
|
|
2109
|
+
if (!!logicSet) {
|
|
2110
|
+
logicSet.forEach(sysName => this._logic.setLogicValue(sysName, MISSING_VALUE));
|
|
2111
|
+
}
|
|
2112
|
+
}
|
|
2080
2113
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: TpSurveyCoreService, deps: [{ token: PLATFORM_ID }, { token: TpSurveyLogicService }, { token: TpSurveyInterviewService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2081
2114
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: TpSurveyCoreService, providedIn: 'root' }); }
|
|
2082
2115
|
}
|