@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.
@@ -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(`${question.SysName}${aa.SysName}`, MISSING_VALUE); // логика для переменных доп ответа
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 => this._logic.setLogicValue(varName, null));
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 => this._logic.setLogicValue(`${question.SysName}${alt.SysName}`, MISSING_VALUE));
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 => this._logic.setLogicValue(`${section.SysName}${alt.SysName}`, MISSING_VALUE));
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
  }