@touchpoll/tp-survey 0.0.39 → 0.0.41

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.
@@ -1 +1 @@
1
- {"version":3,"file":"touchpoll-tp-survey.mjs","sources":["../../../projects/tp.survey/src/lib/tp.survey.config.ts","../../../projects/tp.survey/src/lib/icons/default.icons/default.icons.ts","../../../projects/tp.survey/src/lib/icons/default.icons/default.icons.module.ts","../../../projects/tp.survey/src/lib/tp.survey.module.ts","../../../projects/tp.survey/src/lib/component/question.caption/question.caption.component.ts","../../../projects/tp.survey/src/lib/component/question.caption/question.caption.component.html","../../../projects/tp.survey/src/lib/component/navigation.button/navigation.button.component.ts","../../../projects/tp.survey/src/lib/component/navigation.button/navigation.button.component.html","../../../projects/tp.survey/src/lib/tp.survey.const.ts","../../../projects/tp.survey/src/lib/component/answer/container.answer/container.answer.validator.ts","../../../projects/tp.survey/src/lib/core/tp.survey.logic/tp.survey.logic.service.ts","../../../projects/tp.survey/src/lib/pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe.ts","../../../projects/tp.survey/src/lib/tp.survey.enum.ts","../../../projects/tp.survey/src/lib/component/answer/answer.master/answer.master.component.ts","../../../projects/tp.survey/src/lib/directive/alternatives.container/alternatives.container.directive.ts","../../../projects/tp.survey/src/lib/pipe/get.question.image.background.size/get.question.image.background.css.size.pipe.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ss/answer.ss.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ss/answer.ss.component.html","../../../projects/tp.survey/src/lib/component/answer/answer.info/answer.info.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ms/answer.ms.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ms/answer.ms.component.html","../../../projects/tp.survey/src/lib/component/answer/answer.additional/directive/additional.answer.caption.position/additional.answer.caption.position.directive.ts","../../../projects/tp.survey/src/lib/component/answer/answer.additional/answer.additional.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.additional/answer.additional.component.html","../../../projects/tp.survey/src/lib/component/answer/answer.end/answer.end.component.ts","../../../projects/tp.survey/src/lib/directive/focus.and.select/focus.and.select.directive.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ol/answer.ol.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ol/answer.ol.component.html","../../../projects/tp.survey/src/lib/component/answer/answer.sl/pipe/as.form.array/as.form.array.pipe.ts","../../../projects/tp.survey/src/lib/component/answer/answer.sl/pipe/as.form.control/as.form.control.pipe.ts","../../../projects/tp.survey/src/lib/component/answer/answer.sl/answer.sl.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.sl/answer.sl.component.html","../../../projects/tp.survey/src/lib/component/answer/answer.od/answer.od.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.od/answer.od.component.html","../../../projects/tp.survey/src/lib/pipe/get.additional.value.by.value/get.additional.value.by.value.pipe.ts","../../../projects/tp.survey/src/lib/pipe/key.values/key.values.pipe.ts","../../../projects/tp.survey/src/lib/component/answer/answer.lang/answer.lang.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.lang/answer.lang.component.html","../../../projects/tp.survey/src/lib/component/answer/container.answer/container.answer.component.ts","../../../projects/tp.survey/src/lib/component/answer/container.answer/container.answer.component.html","../../../projects/tp.survey/src/lib/pipe/get.active.language/get.active.language.pipe.ts","../../../projects/tp.survey/src/lib/directive/update.font.size/update.font.size.directive.ts","../../../projects/tp.survey/src/lib/tp.survey.method.ts","../../../projects/tp.survey/src/lib/core/tp.servey.quota/tp.survey.quota.ts","../../../projects/tp.survey/src/lib/core/tp.survey.answer/tp.survey.answer.ts","../../../projects/tp.survey/src/lib/core/tp.survey.interview/tp.survey.interview.service.ts","../../../projects/tp.survey/src/lib/core/tp.survey.core/tp.survey.core.service.ts","../../../projects/tp.survey/src/lib/directive/survey.theme/survey.theme.directive.ts","../../../projects/tp.survey/src/lib/directive/image.position/image.position.directive.ts","../../../projects/tp.survey/src/lib/directive/image.site/image.size.directive.ts","../../../projects/tp.survey/src/lib/pipe/is.video/is.video.pipe.ts","../../../projects/tp.survey/src/lib/directive/insert.question.css/insert.question.css.directive.ts","../../../projects/tp.survey/src/lib/component/survey.play/survey.play.component.ts","../../../projects/tp.survey/src/lib/component/survey.play/survey.play.component.html","../../../projects/tp.survey/src/lib/pipe/generate.default.answer/generate.default.answer.pipe.ts","../../../projects/tp.survey/src/lib/component/survey.question.preview/survey.question.preview.component.ts","../../../projects/tp.survey/src/lib/component/survey.question.preview/survey.question.preview.component.html","../../../projects/tp.survey/src/public-api.ts","../../../projects/tp.survey/src/touchpoll-tp-survey.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\r\nimport {TpSurveyPlatform} from './tp.survey.type';\r\n\r\n\r\n\r\nexport interface TpSurveyConfig {\r\n tpPlatform: TpSurveyPlatform;\r\n}\r\n\r\n\r\n\r\n/**\r\n * A DI token for the survey service.\r\n *\r\n * @publicApi\r\n */\r\nexport const TP_SURVEY_CONFIGURATION = new InjectionToken<TpSurveyConfig>('__TOUCHPOLL_SURVEY_CONFIGURATION_TOKEN__')\r\n","export const defaultIcons = {\r\n 'iconButtonNext': `\r\n <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z\"/>\r\n `,\r\n 'iconButtonBack': `\r\n <path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z\"/>\r\n `,\r\n 'iconIsMute': `\r\n <path d=\"M7.6,4H4A3,3,0,0,0,1,7H1a3,3,0,0,0,3,3H7.6a7.9,7.9,0,0,1,3.9,1L15,13V1L11.4,3A7.9,7.9,0,0,1,7.6,4Z\" fill=\"none\" stroke=\"#444\" stroke-linejoin=\"round\" stroke-width=\"2\"/>\r\n <path d=\"M6,10v2.9a4,4,0,0,0,.3,1.5L7,17\" fill=\"none\" stroke=\"#444\" stroke-linejoin=\"round\" stroke-width=\"4\"/>\r\n <path d=\"M15,4h.1A1.9,1.9,0,0,1,17,5.9V8.1A1.9,1.9,0,0,1,15.1,10H15a0,0,0,0,1,0,0V4A0,0,0,0,1,15,4Z\" fill=\"none\" stroke=\"#444\" stroke-linejoin=\"round\" stroke-width=\"2\"/>\r\n <line x1=\"1\" y1=\"1\" x2=\"17\" y2=\"17\" fill=\"none\" stroke=\"#444\" stroke-linejoin=\"round\" stroke-width=\"2\"/>\r\n `,\r\n}\r\n","import {Inject, NgModule, PLATFORM_ID} from '@angular/core';\r\nimport {isPlatformServer} from '@angular/common';\r\nimport {DomSanitizer} from '@angular/platform-browser';\r\nimport {MatIconRegistry} from '@angular/material/icon';\r\nimport {defaultIcons} from './default.icons';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n})\r\nexport class DefaultIconsModule {\r\n constructor(private domSanitizer: DomSanitizer, private matIconRegistry: MatIconRegistry, @Inject(PLATFORM_ID) private platformId: string) {\r\n for (const [name, svgText] of Object.entries(defaultIcons)) {\r\n const iconText: string = `<svg viewBox=\"0 0 24 24\">${isPlatformServer(this.platformId) ? '' : svgText}</svg>`;\r\n this.matIconRegistry.addSvgIconLiteral(name, this.domSanitizer.bypassSecurityTrustHtml(iconText));\r\n }\r\n }\r\n}\r\n","import {ModuleWithProviders, NgModule} from '@angular/core';\r\nimport {TP_SURVEY_CONFIGURATION, TpSurveyConfig} from './tp.survey.config';\r\nimport {DefaultIconsModule} from './icons/default.icons/default.icons.module';\r\nimport {TpSurveyCoreService} from './core/tp.survey.core/tp.survey.core.service';\r\n\r\n@NgModule({\r\n imports: [\r\n DefaultIconsModule\r\n ]\r\n})\r\nexport class TpSurveyModule {\r\n // #docregion for-root\r\n static forRoot(config: TpSurveyConfig): ModuleWithProviders<TpSurveyModule> {\r\n return {\r\n ngModule: TpSurveyModule,\r\n providers: [\r\n {provide: TP_SURVEY_CONFIGURATION, useValue: config }\r\n ]\r\n };\r\n }\r\n}\r\n","import {ChangeDetectionStrategy, Component, input} from '@angular/core';\r\nimport {SafeHtml} from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'tp-survey-question-caption',\r\n templateUrl: './question.caption.component.html',\r\n styleUrls: ['./question.caption.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n})\r\nexport class QuestionCaptionComponent {\r\n caption = input<SafeHtml>();\r\n captionHelp = input<SafeHtml>();\r\n}\r\n","<div class=\"container-main\">\r\n <div [innerHTML]= \"caption()\" class=\"question-caption-font survey-object-caption\"></div>\r\n <div [innerHTML]= \"captionHelp()\" class=\"question-caption-helper-font survey-object-caption\"></div>\r\n</div>\r\n","import {ChangeDetectionStrategy, Component, input, output} from '@angular/core';\r\nimport {MatButton} from '@angular/material/button';\r\nimport {MatIcon} from '@angular/material/icon';\r\nimport {NavigationButtonDirection} from '../../tp.survey.type';\r\n\r\n@Component({\r\n selector: 'tp-survey-navigation-button',\r\n imports: [\r\n MatButton,\r\n MatIcon\r\n ],\r\n templateUrl: './navigation.button.component.html',\r\n styleUrl: './navigation.button.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class NavigationButtonComponent {\r\n direction = input.required<NavigationButtonDirection>()\r\n caption = input<string>();\r\n onClick = output<NavigationButtonDirection>()\r\n}\r\n\r\n","<button mat-flat-button (click)=\"onClick.emit(direction())\" class=\"navigation-button\">\r\n @if (direction() === 'back') {\r\n <mat-icon svgIcon=\"iconButtonBack\" aria-hidden=\"false\" class=\"navigation-button-icon\"/>\r\n }\r\n\r\n <span class=\"navigation-button-label\">{{ caption() }}</span>\r\n\r\n @if (direction() === 'next') {\r\n <mat-icon iconPositionEnd svgIcon=\"iconButtonNext\" aria-hidden=\"false\" class=\"navigation-button-icon\"/>\r\n }\r\n</button>\r\n\r\n","export const MISSING_VALUE = -97;\r\nexport const VIDEO_EXTENSION_LIST = ['.mpg','.webm','.ogv','.asx','.mpeg','.m4v', '.mp4', '.mov', '.avi', '.mkv', '.wmv', '.flv'];\r\n\r\n\r\nexport const BASE_WIDTH = 1280;\r\nexport const BASE_HEIGHT = 800;\r\n\r\nexport const LOGIC_FUNC_TEXT = `\r\n const self = this;\r\n var setVar = function(varName, value) {\r\n self[varName] = value\r\n };\r\n var FUNC_IN = function(varName, array) {\r\n return isNaN(parseInt(varName)) ? false : array.indexOf(varName) > -1\r\n };\r\n var FUNC_INTERSECT = function (var1, var2) {\r\n return Array.isArray(var1) && Array.isArray(var2) ? var1.some(function(el1) {\r\n return var2.some(function (el2) {\r\n return el2 === el1;\r\n });\r\n }) : false;\r\n };\r\n var value = function(varName, defaultValue) {\r\n const defVal = !defaultValue ? 0 : defaultValue;\r\n if ( (varName === -97) || (varName === null) || (varName === undefined) ) {\r\n return defVal\r\n } else {\r\n return varName\r\n }\r\n }\r\n for (var p in this) eval(\"var \" + p + \" = this[p];\"); `;\r\n","import {AbstractControl, ValidatorFn} from '@angular/forms';\r\nimport {MISSING_VALUE} from '../../../tp.survey.const';\r\nimport {IdbSection} from '../../../tp.survey.interface';\r\n\r\nexport const answerDefaultValidator = (): ValidatorFn => {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n //ответ не число, такого быть не может, это ошибка\r\n if ((control.value === null) || (control.value === MISSING_VALUE) ) {\r\n return {answerRequired: true}\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n };\r\n};\r\n\r\nexport const answerODValidator = (minValue: number | null, maxValue: number | null): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n //ответ не число, такого быть не может, это ошибка\r\n if (!Number.isSafeInteger(control.value)) {\r\n return {answerOdAnswerType: true}\r\n }\r\n //Нужно проверить 2 ситуации.\r\n //1 В настройках вопроса указали minValue, тогда введённое число должно быть больше minValue.\r\n //2 В настройках вопроса указали maxValue, тогда введённое число должно быть меньше maxValue.\r\n //Если эти условия не выполняются, то это ошибка.\r\n if ( (Number.isSafeInteger(minValue) && control.value < minValue!) || (Number.isSafeInteger(maxValue) && (maxValue ?? 0 > 0) && control.value > maxValue!) ) {\r\n return {answerOdAnswerError: true}\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n\r\nexport const answerOLValidator = (isPhoneNumber: boolean, canSkip: boolean): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n const text = typeof control.value !== 'string' ? '' : control.value.trim();\r\n //Нужно чтобы в поле ввели хоть что-то.\r\n if ( text.length === 0 && !canSkip) {\r\n return {answerOlAnswerError: true}\r\n }\r\n\r\n if (isPhoneNumber && !canSkip) {\r\n const res = text.length === 9 && !isNaN(Number(text));\r\n if (!res) {\r\n return {answerOlTelephoneFormatError: true}\r\n }\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n\r\n\r\nexport const answerSSValidator = (): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n //ответ не число, такого быть не может, это ошибка\r\n if (!Number.isSafeInteger(control.value)) {\r\n return {answerSsAnswerType: true}\r\n }\r\n\r\n //нет ответа\r\n if (control.value < 0) {\r\n return {answerMissing: true}\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n\r\n\r\nexport const answerMSValidator = (visibleAlternativeCount: number, minCount: number = 1, maxCount: number = 0): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n //visibleAlternativeCount - количество альтернатив на экране, если 0, то смысла показывать вопрос нет\r\n //minCount - Минимальное количество ответов, которое может выбрать респондент, по умолчанию 1.\r\n //maxCount - Максимальное количество ответов, которые может выбрать респондент. Если указано 0, количество не ограничено. По умолчанию 0\r\n\r\n if (visibleAlternativeCount === 0) {\r\n return null;\r\n }\r\n\r\n //ответ не массив, такого быть не может, это ошибка\r\n if (!Array.isArray(control.value)) {\r\n return {answerMsAnswerType: true}\r\n }\r\n\r\n //количество ответов\r\n const count = control.value.length;\r\n\r\n //проверяем minCount\r\n if (count < minCount) {\r\n return {answerMsMinCount: true}\r\n }\r\n\r\n //проверяем maxCount\r\n if (maxCount > 0 && count > maxCount) {\r\n return {answerMsMaxCount: true}\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n\r\nexport const answerSlValidator = (required: boolean, minAnswersCount: number, sectionList: Array<IdbSection>): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n //если ответы для каждой секции необязательны, ничего не проверяем и выходим.\r\n if (!required) {\r\n return null;\r\n }\r\n if (!control.value) {\r\n return {answerMissing: true};\r\n }\r\n\r\n //если хоть 1 сессия не имеет значения(или количество выбранных альтернатив меньше minAnswersCount), тогда ответ на вопрос не полный.\r\n const hasMissingAnswers = sectionList.some(section => {\r\n const sectionAnswers = control.value[section.SectionGuid.toString()];\r\n if (!sectionAnswers) {\r\n return true;\r\n } else{\r\n return Array.isArray(sectionAnswers) ? sectionAnswers.length === 0 || (minAnswersCount > 1 && sectionAnswers.length < minAnswersCount) : sectionAnswers === 0;\r\n }\r\n });\r\n if (hasMissingAnswers) {\r\n return {answerMissing: true};\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n\r\nexport const additionalAnswerDefaultValidator = (required: boolean): ValidatorFn => {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n if ( (control.value === null || (typeof control.value === 'string' && control.value.trim().length === 0)) && required) {\r\n return { additionalAnswerRequired: true}\r\n }\r\n //ошибок нет, всё корректно\r\n return null;\r\n };\r\n};\r\n\r\nexport const additionalAnswerNumberValidator = (required: boolean, minValue: number | null, maxValue: number | null): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n //ответ не обязательный, можно не контролировать\r\n if (!required) {\r\n return null;\r\n }\r\n\r\n //ответ не число, такого быть не может, это ошибка\r\n if (!Number.isSafeInteger(control.value)) {\r\n return {additionalAnswerType: true}\r\n }\r\n\r\n //Нужно проверить 2 ситуации.\r\n //1 В настройках вопроса указали minValue, тогда введённое число должно быть больше minValue.\r\n //2 В настройках вопроса указали maxValue, тогда введённое число должно быть меньше maxValue.\r\n //Если эти условия не выполняются, то это ошибка.\r\n if ( (Number.isSafeInteger(minValue) && control.value < minValue!) || (Number.isSafeInteger(maxValue) && control.value > maxValue!) ) {\r\n return {answerOdAnswerError: true}\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n","import {Injectable} from '@angular/core';\r\nimport {LOGIC_FUNC_TEXT} from '../../tp.survey.const';\r\nimport {LogicObject} from '../../tp.survey.type';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TpSurveyLogicService {\r\n #vars: LogicObject = Object.create(null);\r\n\r\n get vars(): object {\r\n return this.#vars;\r\n }\r\n\r\n setLogicValue(varName: string, value: any): void {\r\n this.#vars[varName] = value;\r\n }\r\n\r\n getLogicVars(): LogicObject{\r\n return {...this.#vars};\r\n }\r\n\r\n executeLogic(expression?: string): boolean {\r\n try {\r\n const textExpression = typeof expression !== 'string' ? '' : expression.trim();\r\n return !textExpression ? true : new Function(`${LOGIC_FUNC_TEXT} return ${textExpression}`).call(this.#vars);\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n executePostScript(expression?: string): void {\r\n try {\r\n const textExpression = typeof expression !== 'string' ? '' : expression.trim();\r\n new Function(`${LOGIC_FUNC_TEXT} ${textExpression}`).call(this.#vars);\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n }\r\n}\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {DomSanitizer, SafeHtml} from '@angular/platform-browser';\r\nimport {IdbLogicCaptionObject, IdbMultilangObject} from '../../tp.survey.interface';\r\nimport {TpSurveyLogicService} from '../../core/tp.survey.logic/tp.survey.logic.service';\r\nimport {TFindVariableVoid} from '../../tp.survey.type';\r\n\r\n@Pipe({\r\n name: 'multiLangObjectToHtml',\r\n standalone: true\r\n})\r\nexport class MultiLangObjectToHtmlPipe implements PipeTransform {\r\n\r\n constructor(private readonly _sanitizer: DomSanitizer, private readonly _logic: TpSurveyLogicService) {\r\n }\r\n\r\n transform(caption: Array<IdbMultilangObject>, language: number, logicCaptions?: Array<IdbLogicCaptionObject>, findVariable?: TFindVariableVoid): SafeHtml {\r\n //сначала проверим есть ли текст у которого выполняется Expression.\r\n if (Array.isArray(logicCaptions)){\r\n const correctLogicCaption = logicCaptions.find(logicCaption => this._logic.executeLogic(logicCaption.Expression));\r\n const correctLogicCaptionLangObj = correctLogicCaption?.MultiLangCaptions.find(capt => capt.lang === language);\r\n const text = correctLogicCaptionLangObj?._SYS_CaptionHTML ?? correctLogicCaptionLangObj?.CaptionHtml ?? '';\r\n\r\n //если есть хоть какой-то текст - показываем его\r\n if ((text ?? '').trim().length > 0){\r\n return this._sanitizer.bypassSecurityTrustHtml(text);\r\n }\r\n }\r\n\r\n //если основой текст не указан, выходим\r\n if (!Array.isArray(caption)) {\r\n return ''\r\n }\r\n\r\n //ищем основной текс с нужным языком\r\n const langObj = caption.find(capt => capt.lang === language);\r\n const dirtyHtmlText = langObj?._SYS_CaptionHTML ?? langObj?.CaptionHtml ?? '';\r\n \r\n const normalizeHtmlText = dirtyHtmlText.replace(/(q_\\w{16}_A_\\w{3}|q_\\w{16}|v_\\w{16})/gmi, sysName => {\r\n const caption = !!findVariable ? findVariable(sysName) : 'unknown';\r\n const newDiv = document.createElement(\"div\");\r\n newDiv.innerHTML = caption;\r\n newDiv.textContent;\r\n return newDiv.textContent ?? '';\r\n });\r\n\r\n\r\n const res = this._sanitizer.bypassSecurityTrustHtml(normalizeHtmlText);\r\n return res;\r\n }\r\n\r\n}\r\n","export enum ViewModel {\r\n vmDesktop = 1, // desktop view\r\n vmMobile = 2, // phone view\r\n vmTablet = 3, // tablet view\r\n}\r\n\r\nexport enum SurveyEvents {\r\n seSurveyStart = 'survey.start', // on start survey\r\n seSurveyViewModelUpdate = 'survey.view.model.update', // on viewmodel updated\r\n seSurveyDeveloperModeUpdate = 'survey.developer.mode.update', // on Developermode updated\r\n seSurveyEnd = 'survey.end', // on end survey\r\n seQuestionShow = 'question.show', // before question show\r\n seQuestionHide = 'question.hide', // before question hide\r\n seQuestionRefresh = 'question.refresh', // refresh question (after edit)\r\n seQuestionAnswersCompleted = 'answers.completed', // after all answers complete\r\n seQuestionAnswersChange = 'answers.change', // after answers change\r\n seSurveyLanguageUpdate = 'survey.language.update' // on survey language updated\r\n}\r\n\r\nexport enum AdditionalAnswerType {\r\n aatNumber = 1,\r\n aatText = 2,\r\n aatBoolean = 3,\r\n}\r\n\r\nexport enum QuestionsType {\r\n eqLANG = 'LANG',\r\n eqSS = 'SS',\r\n eqMS = 'MS',\r\n eqINFO = 'INFO',\r\n eqSL = 'SL',\r\n eqOL = 'OL',\r\n eqOD = 'OD',\r\n eqEND = 'END',\r\n}\r\n\r\n\r\nexport enum ResultativeStatus {\r\n rsUnset = -1,\r\n rsUnresultative = 0,\r\n rsResultative = 1,\r\n}\r\n\r\nexport enum ValidStatus {\r\n vsUnset = -1,\r\n vsUnValid = 0,\r\n vsValid = 1,\r\n vsDoubtful = 2\r\n}\r\n","import {ChangeDetectionStrategy, Component, DestroyRef, forwardRef, inject, input} from '@angular/core';\r\nimport {ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR} from '@angular/forms';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {AnswerT, TFindVariableVoid} from '../../../tp.survey.type';\r\nimport {ViewModel} from '../../../tp.survey.enum';\r\n\r\n@Component({\r\n selector: 'app-answer-master',\r\n template: '',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerMasterComponent),\r\n multi: true\r\n },\r\n ],\r\n\r\n})\r\nexport abstract class AnswerMasterComponent<T extends AnswerT> implements ControlValueAccessor {\r\n language = input.required<number>();\r\n viewModel = input.required<ViewModel>();\r\n findVariable = input.required<TFindVariableVoid>();\r\n repositoryPath = input<string>('');\r\n viewModelE = ViewModel;\r\n control: FormControl<T | null>;\r\n protected onModelChange = (data: T) => {};\r\n protected onModelTouched = () => {};\r\n protected readonly destroyRef = inject(DestroyRef);\r\n constructor() {\r\n this.control = new FormControl(null);\r\n this.control.valueChanges.pipe(\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe(res => {\r\n this.onModelChange(res!);\r\n })\r\n }\r\n \r\n registerOnChange(fn: (data: T) => void): void {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onModelTouched();\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n }\r\n \r\n writeValue(value: T): void {\r\n this.control.patchValue(value, {emitEvent: false});\r\n }\r\n \r\n skipClick(): void{\r\n this.control.patchValue( 'skip' as T, {emitEvent: true});\r\n }\r\n}\r\n","import {ContentChildren, DestroyRef, Directive, effect, ElementRef, inject, input, QueryList, Renderer2} from '@angular/core';\r\nimport {IdbQuestion} from '../../tp.survey.interface';\r\nimport {ViewModel} from '../../tp.survey.enum';\r\nimport {BASE_HEIGHT, BASE_WIDTH} from '../../tp.survey.const';\r\nimport {BreakpointObserver, BreakpointState} from '@angular/cdk/layout';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {map} from 'rxjs/operators';\r\n\r\n@Directive({\r\n selector: '[tpSurveyAlternativesContainer]',\r\n standalone: true\r\n})\r\nexport class AlternativesContainerDirective {\r\n question = input.required<IdbQuestion>( {alias: 'tpSurveyAlternativesContainer'});\r\n viewModel = input.required<ViewModel>({alias: 'containerViewModel'});\r\n @ContentChildren('tablet_alt', {read: ElementRef}) alternatives: QueryList<ElementRef<HTMLElement>> | undefined;\r\n readonly #destroyRef = inject(DestroyRef);\r\n constructor(private readonly _renderer: Renderer2,private readonly elementRef: ElementRef, private _breakpointObserver: BreakpointObserver) {\r\n effect(() => {\r\n if (this.viewModel() === ViewModel.vmTablet) {\r\n this.#updateTabletLayout();\r\n } else {\r\n this.#updateDesktopLayout();\r\n }\r\n })\r\n }\r\n\r\n #updateDesktopLayout(): void {\r\n this._breakpointObserver.observe([\"(max-width: 480px)\"]).pipe(\r\n map((result: BreakpointState) => result.matches),\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe((isMobile: boolean) => {\r\n let columnCount: number;\r\n if (isMobile) {\r\n columnCount = this.question().MobileViewAlternativeColumnCount || 1; //if 0 will be 1\r\n } else {\r\n columnCount = this.question().AlternativeColumnCount || 1; //if 0 will be 1\r\n }\r\n this._renderer.setStyle(this.elementRef.nativeElement, 'grid-template-columns', `repeat(${columnCount}, 10fr)`);\r\n });\r\n }\r\n \r\n #updateTabletLayout(): void {\r\n if (!this.alternatives) {\r\n return;\r\n }\r\n \r\n if (this.viewModel() === ViewModel.vmTablet) {\r\n const question = this.question();\r\n const transformToPer = (newVal: number, containerSideSize: number): number => newVal * 100 / containerSideSize; // превращает размер px в %\r\n \r\n const containerWidthFull = this.elementRef.nativeElement.offsetWidth;\r\n const containerHeightFull = this.elementRef.nativeElement.offsetHeight;\r\n \r\n const alternativeColumnCount = question.TabletViewAlternativeColumnCount ?? 1;\r\n \r\n const horizontalRatio = containerWidthFull / BASE_WIDTH;\r\n const verticalRatio = containerHeightFull / BASE_HEIGHT;\r\n \r\n const maxAlternativeWidth: number = containerWidthFull * 0.7; // для авторазмера установим максимальный размер альтернативы в 70% от доступной длинны контейнера\r\n \r\n const alternativesCount = Math.max(this.alternatives.length, 1);\r\n \r\n const horizontalDistance = question.AlternativeHorizontalDistance ?? 10 * horizontalRatio;\r\n const verticalDistance = (question.AlternativeVerticalDistance ?? 10) * verticalRatio;\r\n const marginTop = question.AlternativeMarginTop ?? 10 * verticalRatio;\r\n const marginLeft = (question.AlternativeMarginLeft ?? 0) * horizontalRatio;\r\n const columnCount: number = alternativeColumnCount > alternativesCount ? alternativesCount : alternativeColumnCount;\r\n const rowCount: number = Math.round(alternativesCount / columnCount);\r\n \r\n const defaultHorizontalPadding = 10 * horizontalRatio;\r\n \r\n let width = 0;\r\n let height = 0;\r\n \r\n if (question.AlternativeAutoSize ?? true) { // если авторазмер, то высоту и ширину считаем автоматом\r\n const marginsWidth = horizontalDistance * (columnCount - 1) + defaultHorizontalPadding * 2;\r\n width = Math.min((containerWidthFull - marginsWidth) / columnCount, maxAlternativeWidth);\r\n height = this.alternatives.reduce((maxHeight, alt) => { // узнаем максимальную высоту альтернативы\r\n const altWidthPercent = transformToPer(width, containerWidthFull);\r\n this._renderer.setStyle(alt.nativeElement, 'width', `${altWidthPercent}%`);\r\n return Math.max(maxHeight, alt.nativeElement.clientHeight) ;\r\n }, 0);\r\n } else { // если авторазмер отключён, размеры берём из настроек\r\n width = question.AlternativeWidth ?? 300;\r\n height = question.AlternativeHeight ?? 50;\r\n }\r\n \r\n const deltaVertical = containerHeightFull - height * rowCount - verticalDistance * (rowCount - 1);\r\n const deltaHorizontal = (containerWidthFull - width * columnCount - horizontalDistance * (columnCount - 1)) / 2 - defaultHorizontalPadding;\r\n let rowNum = -1;\r\n let colNum = 0;\r\n \r\n this.alternatives.forEach((alt, index) => {\r\n let left = 0;\r\n let top = 0;\r\n if (question.AlternativeAutoArrange) {\r\n const isNewRow = (index) % columnCount === 0;\r\n if (isNewRow) {\r\n rowNum++;\r\n colNum = 0;\r\n }\r\n left = marginLeft + colNum * width + colNum * horizontalDistance + deltaHorizontal + defaultHorizontalPadding ;\r\n top = marginTop + rowNum * height + rowNum * verticalDistance + deltaVertical / 2 ;\r\n colNum++;\r\n } else {\r\n const altObj = question.Alternativelist[index];\r\n if (!!altObj) {\r\n left = altObj.x;\r\n top = altObj.y;\r\n if (!question.AlternativeAutoSize) {\r\n width = altObj.width > 0 ? altObj.width : question.AlternativeWidth;\r\n height = altObj.height > 0 ? altObj.height : question.AlternativeHeight;\r\n }\r\n }\r\n }\r\n this._renderer.setStyle(alt.nativeElement, 'width', `${transformToPer(width, containerWidthFull)}%`);\r\n this._renderer.setStyle(alt.nativeElement, 'height', `${transformToPer(height, containerHeightFull)}%`);\r\n this._renderer.setStyle(alt.nativeElement, 'left', `${transformToPer(left, containerWidthFull)}%`);\r\n this._renderer.setStyle(alt.nativeElement, 'top', `${transformToPer(top, containerHeightFull)}%`);\r\n });\r\n } else {\r\n this.alternatives.forEach((alt) => {\r\n this._renderer.setStyle(alt.nativeElement, 'width', ``);\r\n this._renderer.setStyle(alt.nativeElement, 'height', ``);\r\n this._renderer.setStyle(alt.nativeElement, 'left', ``);\r\n this._renderer.setStyle(alt.nativeElement, 'top', ``);\r\n });\r\n }\r\n }\r\n\r\n}\r\n","import {inject, Pipe, PipeTransform} from '@angular/core';\r\nimport {IdbQuestion} from '../../tp.survey.interface';\r\nimport {BreakpointObserver} from '@angular/cdk/layout';\r\n\r\n@Pipe({\r\n name: 'getQuestionImageBackgroundCssSize',\r\n standalone: true\r\n})\r\nexport class GetQuestionImageBackgroundCssSizePipe implements PipeTransform {\r\n #breakpointObserver = inject(BreakpointObserver);\r\n \r\n transform(question: IdbQuestion): {height: string | null, width: string | null} {\r\n const isMobile= this.#breakpointObserver.isMatched(\"(max-width: 480px)\");\r\n const height = isMobile ? question.MobileViewAlternativeBackgroundImageHeight : question.AlternativeBackgroundImageHeight;\r\n const width = isMobile ? question.MobileViewAlternativeBackgroundImageWidth : question.AlternativeBackgroundImageWidth;\r\n\r\n return {\r\n height: this.#normalizeValue(height),\r\n width: this.#normalizeValue(width),\r\n };\r\n }\r\n \r\n #normalizeValue(value: string | null): string{\r\n if (!value || typeof value !== 'string' ) {\r\n return 'auto';\r\n } else {\r\n value = value.toLowerCase().trim();\r\n if (value.endsWith('%') || value.endsWith('px') || value.endsWith('vh') || value.endsWith('vw')) {\r\n return value;\r\n }else {\r\n return `${value}px`;\r\n }\r\n }\r\n \r\n }\r\n\r\n}\r\n","import {ChangeDetectionStrategy, Component, forwardRef, input, output,} from '@angular/core';\r\nimport {MatRadioButton, MatRadioGroup} from '@angular/material/radio';\r\nimport {NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {MatIcon} from '@angular/material/icon';\r\nimport {MultiLangObjectToHtmlPipe} from '../../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\nimport {IdbAlternative, IdbQuestion} from '../../../tp.survey.interface';\r\nimport {AlternativesContainerDirective} from '../../../directive/alternatives.container/alternatives.container.directive';\r\nimport {GetQuestionImageBackgroundCssSizePipe} from '../../../pipe/get.question.image.background.size/get.question.image.background.css.size.pipe';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-ss',\r\n templateUrl: './answer.ss.component.html',\r\n styleUrls: ['./answer.ss.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatRadioGroup,\r\n ReactiveFormsModule,\r\n MatRadioButton,\r\n MultiLangObjectToHtmlPipe,\r\n MatIcon,\r\n AlternativesContainerDirective,\r\n GetQuestionImageBackgroundCssSizePipe\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerSSComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerSSComponent extends AnswerMasterComponent<number>{\r\n question = input.required<IdbQuestion>();\r\n alternativeList = input.required<Array<IdbAlternative>>();\r\n onAlternativeClick = output<number>();\r\n}\r\n\r\n\r\n","<mat-radio-group\r\n class=\"container-ms-ss-alternatives\"\r\n [tpSurveyAlternativesContainer] = \"question()\"\r\n [containerViewModel]=\"viewModel()\"\r\n [formControl]=\"control\">\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <mat-radio-button\r\n #tablet_alt\r\n class=\"alternative-ss-ms tp-survey-radio-button\"\r\n [style.font-size.%]=\"viewModel() === viewModelE.vmTablet ? question().AlternativeTabletFontSize : undefined\"\r\n [value]=\"alt.Value\"\r\n (change)=\"onAlternativeClick.emit($event.value)\">\r\n @if (alt.IsMute) {\r\n <mat-icon class=\"icon-is-mute\" svgIcon=\"iconIsMute\"></mat-icon>\r\n }\r\n <div class=\"container-caption\" [class.container-image]=\"!!alt.BackGround.Image\">\r\n @if (alt.BackGround.Image) {\r\n @let imageSize = question() | getQuestionImageBackgroundCssSize;\r\n <img alt=\"answer logo\" [style.height]=\"imageSize.height\" [style.width]=\"imageSize.width\" [src]=\"repositoryPath()+'/' + alt.BackGround.Image\" importance=\"low\" loading=\"lazy\" class=\"answer-image\">\r\n }\r\n <span class=\"alternative-ss-ms-caption survey-object-caption\" [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </div>\r\n </mat-radio-button>\r\n }\r\n</mat-radio-group>\r\n\r\n","import {Component, forwardRef} from '@angular/core';\r\nimport {NG_VALUE_ACCESSOR} from '@angular/forms';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-info',\r\n template: '',\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerInfoComponent),\r\n multi: true\r\n },\r\n ],\r\n})\r\nexport class AnswerInfoComponent extends AnswerMasterComponent<number>{\r\n}\r\n\r\n\r\n","import {AfterViewInit, ChangeDetectorRef, Component, forwardRef, inject, input, output} from '@angular/core';\r\nimport {FormArray, FormControl, FormGroup, NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {MatCheckbox} from '@angular/material/checkbox';\r\nimport {map} from 'rxjs/operators';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {MatIcon} from '@angular/material/icon';\r\nimport {filter, tap} from 'rxjs';\r\nimport {MultiLangObjectToHtmlPipe} from '../../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\nimport {IdbAlternative, IdbQuestion} from '../../../tp.survey.interface';\r\nimport {AlternativesContainerDirective} from '../../../directive/alternatives.container/alternatives.container.directive';\r\nimport {GetQuestionImageBackgroundCssSizePipe} from '../../../pipe/get.question.image.background.size/get.question.image.background.css.size.pipe';\r\n\r\ninterface IAnswerMSForm {\r\n alternativeList: FormArray<FormControl<boolean>>;\r\n}\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-ms',\r\n templateUrl: './answer.ms.component.html',\r\n styleUrls: ['./answer.ms.component.scss'],\r\n imports: [\r\n ReactiveFormsModule,\r\n MatCheckbox,\r\n MultiLangObjectToHtmlPipe,\r\n MatIcon,\r\n AlternativesContainerDirective,\r\n GetQuestionImageBackgroundCssSizePipe,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerMSComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerMSComponent extends AnswerMasterComponent<Array<number>> implements AfterViewInit{\r\n question = input.required<IdbQuestion>();\r\n alternativeList = input.required<Array<IdbAlternative>>();\r\n alternativeMaxAnswersCount = input.required<number>();\r\n onAlternativeClick = output<number>();\r\n readonly answerMSForm: FormGroup<IAnswerMSForm>;\r\n readonly #ref = inject(ChangeDetectorRef);\r\n constructor() {\r\n super();\r\n this.answerMSForm = new FormGroup<IAnswerMSForm>({\r\n alternativeList: new FormArray<FormControl<boolean>>([])\r\n })\r\n }\r\n\r\n\r\n ngAfterViewInit(): void {\r\n const alternativeList = this.alternativeList();\r\n const answerAsArray: Array<number> = Array.isArray(this.control.value) ? this.control.value : [];\r\n const maxCount = this.alternativeMaxAnswersCount();\r\n this.answerMSForm.controls.alternativeList.clear({emitEvent: false});\r\n alternativeList.forEach( alt => {\r\n const control = new FormControl<boolean>( answerAsArray.includes(alt.Value), {nonNullable: true});\r\n\r\n //У альтернативы есть понятие \"Группа\". Группа это число. Если выбирают альтернативу с определённой группой, то альтернативы с другой группой должны быть отжаты.\r\n control.valueChanges.pipe(\r\n filter(value => value),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe( {\r\n next: () => this.#uncheckControlsWithOtherGroup(alt.GroupNo)\r\n });\r\n\r\n this.answerMSForm.controls.alternativeList.push(control, {emitEvent: false});\r\n });\r\n\r\n this.answerMSForm.controls.alternativeList.valueChanges.pipe(\r\n map((_) => {\r\n const checkedArray = this.answerMSForm.controls.alternativeList.controls.map(c => c.value) ?? [];\r\n return this.alternativeList()\r\n .map(alt => alt.Value)\r\n .filter((_, index) => checkedArray[index] )\r\n }),\r\n tap(answerArray => this.#disableExtraControls(answerArray.length, maxCount)),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe({\r\n next: res => this.control.patchValue(res, {emitEvent: true})\r\n });\r\n \r\n this.#ref.detectChanges();\r\n }\r\n\r\n //отжимает контролы у которых отличается номер группы\r\n #uncheckControlsWithOtherGroup(groupNumber: number): void {\r\n //сначала отбираем контролы у которых другая группа.\r\n const otherGroupAlternativesList = this.alternativeList()\r\n .map((alt, altIndex) => ({alternative: alt, index: altIndex}) ) //нужен индекс, по нему проще выбирать контролы в answerMSForm.controls.alternativeList\r\n .filter(data => data.alternative.GroupNo !== groupNumber); //контролы у которых другая группа\r\n\r\n //\"отжимаем галочку\"\r\n otherGroupAlternativesList.forEach(data => {\r\n const altControl = this.answerMSForm.controls.alternativeList.at(data.index);\r\n altControl.patchValue(false, {emitEvent: false})\r\n })\r\n }\r\n \r\n //дизейблит контроли если выбрали максимальное количество или енейблит если выбрали не максимальное количество\r\n #disableExtraControls(currentCount:number, maxCount: number): void{\r\n //если в настройках анкеты указали что максимальное возможное количество выбранных альтернатив = 0, но ничего контролировать не надо.\r\n if (maxCount === 0) {\r\n return\r\n }\r\n this.alternativeList().forEach((_, altIndex) => {\r\n const isDisable = currentCount >= maxCount;\r\n const control = this.answerMSForm.controls.alternativeList.at(altIndex);\r\n if (isDisable) {\r\n //надо дизейблить те которые не выбраны\r\n if (!control.value) {\r\n control.disable({emitEvent: false})\r\n }\r\n } else {\r\n //лимита нет, можно выбирать все\r\n control.enable({emitEvent: false})\r\n }\r\n })\r\n }\r\n}\r\n","<ng-container [formGroup]=\"answerMSForm\">\r\n\r\n <div\r\n class=\"container-ms-ss-alternatives\"\r\n [tpSurveyAlternativesContainer] = \"question()\"\r\n [containerViewModel]=\"viewModel()\"\r\n formArrayName=\"alternativeList\">\r\n @for (alt of answerMSForm.controls.alternativeList.controls; track alt; let indx = $index) {\r\n <mat-checkbox\r\n #tablet_alt\r\n [formControl]=\"alt\"\r\n [style.font-size.%]=\"viewModel() === viewModelE.vmTablet ? question().AlternativeTabletFontSize : undefined\"\r\n (change)=\"onAlternativeClick.emit(alternativeList()[indx].Value)\"\r\n class=\"alternative-ss-ms tp-survey-checkbox\">\r\n @if (alternativeList()[indx].IsMute) {\r\n <mat-icon class=\"icon-is-mute\" svgIcon=\"iconIsMute\"></mat-icon>\r\n }\r\n <div class=\"container-caption\" [class.container-image]=\"!!alternativeList()[indx].BackGround.Image\">\r\n @if (alternativeList()[indx].BackGround.Image) {\r\n @let imageSize = question() | getQuestionImageBackgroundCssSize;\r\n <img alt=\"answer logo\" [style.height]=\"imageSize.height\" [style.width]=\"imageSize.width\" [src]=\"repositoryPath()+'/' + alternativeList()[indx].BackGround.Image\" importance=\"low\" loading=\"lazy\" class=\"answer-image\">\r\n }\r\n <span class=\"alternative-ss-ms-caption survey-object-caption\" [innerHTML]= \"alternativeList()[indx].MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </div>\r\n </mat-checkbox>\r\n }\r\n </div>\r\n</ng-container>\r\n","import {Directive, HostBinding, input} from '@angular/core';\r\nimport {AdditionalAnswerCaptionPosition} from '../../../../../tp.survey.type';\r\nimport {AdditionalAnswerType} from '../../../../../tp.survey.enum';\r\n\r\n@Directive({\r\n selector: '[tpSurveyAdditionalAnswerCaptionPosition]',\r\n standalone: true\r\n})\r\nexport class AdditionalAnswerCaptionPositionDirective{\r\n tpSurveyAdditionalAnswerCaptionPosition = input<AdditionalAnswerCaptionPosition>();\r\n tpSurveyAdditionalAnswerType = input<AdditionalAnswerType>();\r\n @HostBinding(\"class.caption-align-bottom\") public get classBottom() {\r\n return this.tpSurveyAdditionalAnswerCaptionPosition() === 'bottom';\r\n }\r\n @HostBinding(\"class.caption-align-top\") public get classTop() {\r\n return this.tpSurveyAdditionalAnswerCaptionPosition() === 'top';\r\n }\r\n @HostBinding(\"class.caption-align-left\") public get classLeft() {\r\n return this.tpSurveyAdditionalAnswerCaptionPosition() === 'left';\r\n }\r\n @HostBinding(\"class.caption-align-right\") public get classRight() {\r\n return this.tpSurveyAdditionalAnswerCaptionPosition() === 'right';\r\n }\r\n \r\n @HostBinding(\"class.answer-type-number\") public get classTypeNumber() {\r\n return this.tpSurveyAdditionalAnswerType() === AdditionalAnswerType.aatNumber;\r\n }\r\n \r\n @HostBinding(\"class.answer-type-text\") public get classTypeText() {\r\n return this.tpSurveyAdditionalAnswerType() === AdditionalAnswerType.aatText;\r\n }\r\n \r\n @HostBinding(\"class.answer-type-boolean\") public get classTypeBoolean() {\r\n return this.tpSurveyAdditionalAnswerType() === AdditionalAnswerType.aatBoolean;\r\n }\r\n}\r\n","import {Component, forwardRef, input,} from '@angular/core';\r\nimport {FormControl, NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {MatFormField} from '@angular/material/form-field';\r\nimport {MatInput} from '@angular/material/input';\r\nimport {SafeHtml} from '@angular/platform-browser';\r\nimport {CdkTextareaAutosize} from '@angular/cdk/text-field';\r\nimport {MatCheckbox} from '@angular/material/checkbox';\r\nimport {AdditionalAnswerCaptionPositionDirective} from './directive/additional.answer.caption.position/additional.answer.caption.position.directive';\r\nimport {AdditionalAnswer, AdditionalAnswerCaptionPosition} from '../../../tp.survey.type';\r\nimport {AdditionalAnswerType} from '../../../tp.survey.enum';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-additional',\r\n templateUrl: './answer.additional.component.html',\r\n styleUrls: ['./answer.additional.component.scss'],\r\n imports: [\r\n MatFormField,\r\n MatInput,\r\n ReactiveFormsModule,\r\n AdditionalAnswerCaptionPositionDirective,\r\n CdkTextareaAutosize,\r\n MatCheckbox,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerAdditionalComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerAdditionalComponent { //ControlValueAccessor\r\n // control = input.required<FormControl<AdditionalAnswer>>();\r\n control = input.required<FormControl<AdditionalAnswer>>();\r\n answerType = input.required<AdditionalAnswerType>()\r\n caption = input<SafeHtml>('');\r\n numberMinValue = input<number | null>(null);\r\n numberMaxValue = input<number | null>(null);\r\n textMultiline = input<boolean>(false);\r\n captionPosition = input<AdditionalAnswerCaptionPosition>('top');\r\n additionalAnswerType = AdditionalAnswerType;\r\n}\r\n","<div class=\"container-main\" [tpSurveyAdditionalAnswerCaptionPosition]=\"captionPosition()\" [tpSurveyAdditionalAnswerType]=\"answerType()\" >\r\n <span [innerHTML]= \"caption()\" class=\"answer-caption survey-object-caption\"></span>\r\n @switch (answerType()) {\r\n @case (additionalAnswerType.aatNumber) {\r\n <mat-form-field class=\"tp-survey-input\" appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <input [formControl]=\"control()\" matInput [step]=\"1\" [min]=\"numberMinValue()\" [max]=\"numberMaxValue()\" type=\"number\">\r\n </mat-form-field>\r\n }\r\n\r\n @case (additionalAnswerType.aatText) {\r\n <mat-form-field appearance=\"outline\" class=\"tp-survey-input\" subscriptSizing=\"dynamic\">\r\n @if (textMultiline()) {\r\n <textarea\r\n [formControl]=\"control()\"\r\n cdkAutosizeMaxRows=\"5\"\r\n cdkAutosizeMinRows=\"3\"\r\n cdkTextareaAutosize matInput>\r\n </textarea>\r\n } @else {\r\n <input [formControl]=\"control()\" matInput type=\"text\">\r\n }\r\n </mat-form-field>\r\n }\r\n @case (additionalAnswerType.aatBoolean) {\r\n <mat-checkbox\r\n [formControl]=\"control()\"\r\n [class.answer-checkbox-center] = \"captionPosition() === 'left' || captionPosition() === 'right'\"\r\n class=\"tp-survey-checkbox\">\r\n </mat-checkbox>\r\n }\r\n }\r\n</div>\r\n","import {Component, forwardRef} from '@angular/core';\r\nimport {NG_VALUE_ACCESSOR} from '@angular/forms';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-end',\r\n template: '',\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerEndComponent),\r\n multi: true\r\n },\r\n ],\r\n})\r\n\r\nexport class AnswerEndComponent extends AnswerMasterComponent<number>{\r\n}\r\n","import {Directive, ElementRef, OnInit} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[tpSurveyFocusAndSelect]',\r\n standalone: true\r\n})\r\nexport class FocusAndSelectDirective implements OnInit{\r\n constructor(private el: ElementRef) {\r\n if (!el.nativeElement['focus']) {\r\n throw new Error('Element does not accept focus.');\r\n }\r\n }\r\n \r\n ngOnInit(): void {\r\n const input: HTMLInputElement = this.el.nativeElement as HTMLInputElement;\r\n if ('focus' in input) {\r\n input.focus();\r\n input.select();\r\n }\r\n }\r\n}\r\n","import {Component, forwardRef, input} from '@angular/core';\r\nimport {FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {MatFormField, MatPrefix} from '@angular/material/form-field';\r\nimport {MatInput} from '@angular/material/input';\r\nimport {FocusAndSelectDirective} from '../../../directive/focus.and.select/focus.and.select.directive';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\nimport {MatButton} from '@angular/material/button';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-ol',\r\n templateUrl: './answer.ol.component.html',\r\n styleUrls: ['./answer.ol.component.scss'],\r\n imports: [\r\n FocusAndSelectDirective,\r\n FormsModule,\r\n MatFormField,\r\n MatInput,\r\n ReactiveFormsModule,\r\n MatPrefix,\r\n MatButton\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerOLComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerOLComponent extends AnswerMasterComponent<number | 'skip'>{\r\n telephoneInput= input<boolean>(false);\r\n canSkip= input<boolean>(false);\r\n}\r\n","<div class=\"container-main\">\r\n @if (telephoneInput()) {\r\n <mat-form-field appearance=\"outline\">\r\n <input\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n matInput\r\n [formControl]=\"control\" tpSurveyFocusAndSelect>\r\n <span matTextPrefix>+380 &nbsp;</span>\r\n </mat-form-field>\r\n @if(canSkip()) {\r\n <button mat-button (click)=\"skipClick()\">Пропустити</button>\r\n }\r\n\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"input-text\">\r\n <textarea rows=\"10\" matInput [formControl]=\"control\" tpSurveyFocusAndSelect></textarea>\r\n </mat-form-field>\r\n\r\n<!-- <mat-form-field class=\"container-controls\" appearance=\"outline\">-->\r\n<!-- <textarea rows=\"10\" autofocus matInput [(ngModel)]=\"answer.AnswerValue\" (ngModelChange)=\"answerChange()\" appFocusAndSelect></textarea>-->\r\n<!-- </mat-form-field>-->\r\n }\r\n\r\n<!-- <mat-form-field appearance=\"outline\" class=\"input-od-number\">-->\r\n<!-- <input [formControl]=\"control\" tpSurveyFocusAndSelect matInput type=\"number\">-->\r\n<!-- </mat-form-field>-->\r\n</div>\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {FormArray, FormControl} from '@angular/forms';\r\n\r\n@Pipe({\r\n name: 'asFormArray',\r\n standalone: true\r\n})\r\nexport class AsFormArrayPipe implements PipeTransform {\r\n\r\n transform(value: any): FormArray<FormControl<boolean>> {\r\n return value;\r\n }\r\n\r\n}\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {FormControl} from '@angular/forms';\r\n\r\n@Pipe({\r\n name: 'asFormControl',\r\n standalone: true\r\n})\r\nexport class AsFormControlPipe implements PipeTransform {\r\n \r\n transform(value: any): FormControl<number> {\r\n return value;\r\n }\r\n\r\n}\r\n","import {AfterViewInit, booleanAttribute, ChangeDetectorRef, Component, forwardRef, inject, input, numberAttribute} from '@angular/core';\r\nimport {FormArray, FormControl, FormGroup, NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {MatCheckbox} from '@angular/material/checkbox';\r\nimport {KeyValuePipe} from '@angular/common';\r\nimport {MatRadioButton, MatRadioGroup} from '@angular/material/radio';\r\nimport {map} from 'rxjs/operators';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {filter, tap} from 'rxjs';\r\nimport {MultiLangObjectToHtmlPipe} from '../../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {AsFormArrayPipe} from './pipe/as.form.array/as.form.array.pipe';\r\nimport {AsFormControlPipe} from './pipe/as.form.control/as.form.control.pipe';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\nimport {AnswerSlType} from '../../../tp.survey.type';\r\nimport {IdbAlternative, IdbQuestion, IdbSection} from '../../../tp.survey.interface';\r\nimport {GetQuestionImageBackgroundCssSizePipe} from '../../../pipe/get.question.image.background.size/get.question.image.background.css.size.pipe';\r\n\r\ninterface IAnswerSLForm {\r\n [key: string]: FormArray<FormControl<boolean>> | FormControl<number> | FormControl<Array<number>>\r\n}\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-sl',\r\n templateUrl: './answer.sl.component.html',\r\n styleUrls: ['./answer.sl.component.scss'],\r\n imports: [\r\n MultiLangObjectToHtmlPipe,\r\n MatCheckbox,\r\n ReactiveFormsModule,\r\n KeyValuePipe,\r\n AsFormArrayPipe,\r\n MatRadioButton,\r\n MatRadioGroup,\r\n AsFormControlPipe,\r\n GetQuestionImageBackgroundCssSizePipe\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerSLComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerSLComponent extends AnswerMasterComponent<AnswerSlType> implements AfterViewInit{\r\n question = input.required<IdbQuestion>();\r\n alternativeList = input.required<Array<IdbAlternative>>();\r\n sectionList = input.required<Array<IdbSection>>();\r\n multiSelect = input(false, {transform: booleanAttribute});\r\n maxCount = input(0, {transform: numberAttribute});\r\n answerSLForm = new FormGroup<IAnswerSLForm>({})\r\n readonly #ref = inject(ChangeDetectorRef);\r\n ngAfterViewInit(): void {\r\n const multiSelect = this.multiSelect();\r\n const answer = this.control.value;\r\n this.sectionList().forEach(section => {\r\n const sectionAnswer = answer ? answer[section.SectionGuid] : [];\r\n const sectionControl = this.#createSectionRowControl(multiSelect, sectionAnswer );\r\n this.answerSLForm!.addControl(section.SectionGuid.toString(), sectionControl, );\r\n })\r\n\r\n this.answerSLForm.valueChanges.pipe(\r\n map((fullAnswer) => {\r\n let res: Record<string, Array<number> | number> = {};\r\n //Если в настройках указали мультивыбор для секции, то в данной реализации, при изменении форма возвращает массив boolean?, true/false, нажата отжата.\r\n //Этот массив нужно конвертировать в массив number, в котором будут только нажатые альтернативы.\r\n if (this.multiSelect()) {\r\n Object.entries(fullAnswer).forEach(([key]) => {\r\n const sectionAnswerCheckedArray = this.answerSLForm.get(key)?.value;\r\n res[key] = this.alternativeList()\r\n .map(alt => alt.Value)\r\n .filter((_, index) => sectionAnswerCheckedArray[index] )\r\n });\r\n } else {\r\n //если единичный выбор для секции, то ответ просто исходное значение.\r\n res = fullAnswer as Record<string, number>;\r\n }\r\n return res;\r\n }),\r\n tap(() => this.#disableExtraControls(this.maxCount())),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe({\r\n next: res => this.control.patchValue(res, {emitEvent: true})\r\n });\r\n this.#ref.detectChanges();\r\n }\r\n\r\n #createSectionRowControl(multiSelect: boolean, answers: number | Array<number>): FormArray<FormControl<boolean>> | FormControl<number> {\r\n if (multiSelect) {\r\n const msArray = new FormArray<FormControl<boolean>>([]);\r\n const answerAsArray = Array.isArray(answers) ? Array.from(answers) : [];\r\n\r\n this.alternativeList().forEach((alt) => {\r\n const control= new FormControl<boolean>( answerAsArray.includes(alt.Value), {nonNullable: true});\r\n msArray.push(control, {emitEvent: false});\r\n\r\n //В режиме multiSelect у альтернативы есть понятие \"Группа\". Группа это число. Если выбирают альтернативу с определённой группой, то альтернативы с другой группой должны быть отжаты.\r\n //Логика такая же как и в ms вопросе\r\n control.valueChanges.pipe(\r\n filter(value => value && this.multiSelect()),\r\n takeUntilDestroyed(this.destroyRef),\r\n ).subscribe({\r\n next: () => {\r\n //сначала отбираем контролы у которых другая группа.\r\n const otherGroupAlternativesList = this.alternativeList()\r\n .map((alt, altIndex) => ({alternative: alt, index: altIndex}) ) //нужен индекс, по нему проще выбирать контролы в msArray\r\n .filter(data => data.alternative.GroupNo !== alt.GroupNo); //контролы у которых другая группа\r\n\r\n //\"отжимаем галочку\"\r\n otherGroupAlternativesList.forEach(data => {\r\n const altControl = msArray.controls.at(data.index);\r\n altControl!.patchValue(false, {emitEvent: false})\r\n });\r\n }\r\n })\r\n });\r\n return msArray;\r\n } else {\r\n return new FormControl<number>(Number(answers), {nonNullable: true});\r\n }\r\n }\r\n\r\n //дизейблит контроли если выбрали максимальное количество или енейблит если выбрали не максимальное количество\r\n #disableExtraControls(maxCount: number): void{\r\n //если в настройках анкеты указали что максимальное возможное количество выбранных альтернатив = 0, но ничего контролировать не надо.\r\n if (maxCount === 0 || !this.multiSelect()) {\r\n return\r\n }\r\n\r\n this.sectionList().forEach(sec => {\r\n const sectionControlArray = this.answerSLForm.get(sec.SectionGuid.toString()) as FormArray<FormControl<boolean>>;\r\n const values = sectionControlArray.value;\r\n const checkedCount = values.filter(v => v).length;\r\n\r\n sectionControlArray.controls.forEach(control => {\r\n if (checkedCount >= maxCount && !control.value) {\r\n control.disable({emitEvent: false})\r\n } else {\r\n control.enable({emitEvent: false})\r\n }\r\n })\r\n\r\n })\r\n }\r\n}\r\n","<table class=\"default-view\" [formGroup]=\"answerSLForm\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <th class=\"SLAlternativeCaption\">\r\n <div class=\"container-caption-desktop\">\r\n <span [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\" class=\"survey-object-caption\"></span>\r\n @if (alt.BackGround.Image){\r\n @let imageSize = question() | getQuestionImageBackgroundCssSize;\r\n <img alt=\"answer logo\" [style.height]=\"imageSize.height\" [style.width]=\"imageSize.width\" [src]=\"repositoryPath()+'/' + alt.BackGround.Image\" importance=\"low\" loading=\"lazy\" class=\"answer-image\">\r\n }\r\n </div>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (secControl of answerSLForm.controls | keyvalue; track secControl.key; let sectionIndex = $index) {\r\n @if (multiSelect()){\r\n <tr>\r\n <td>\r\n <span [innerHTML]= \"sectionList()[sectionIndex].MultiLangCaptions | multiLangObjectToHtml:language()\" class=\"survey-object-caption\"></span>\r\n </td>\r\n @for (alternativeControl of (secControl.value | asFormArray).controls ; track alternativeControl) {\r\n <td>\r\n <mat-checkbox\r\n [formControl]=\"alternativeControl\"\r\n class=\"alternative-sl tp-survey-checkbox\"/>\r\n </td>\r\n }\r\n </tr>\r\n } @else {\r\n <mat-radio-group [formControl]=\"secControl.value | asFormControl\" class=\"single-select-row\">\r\n <td class=\"single-select-item\">\r\n <span [innerHTML]= \"sectionList()[sectionIndex].MultiLangCaptions | multiLangObjectToHtml:language()\" class=\"survey-object-caption\"></span>\r\n </td>\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <td class=\"single-select-item\">\r\n <mat-radio-button\r\n class=\"alternative-sl tp-survey-radio-button\"\r\n [value]=\"alt.Value\">\r\n </mat-radio-button>\r\n </td>\r\n }\r\n </mat-radio-group>\r\n }\r\n }\r\n </tbody>\r\n</table>\r\n\r\n<div class=\"mobile-view\" [formGroup]=\"answerSLForm\">\r\n @for (secControl of answerSLForm.controls | keyvalue; track secControl.key; let secIndex = $index) {\r\n <div class=\"mobile-view-section-row\" [formArrayName]=\"secControl.key\">\r\n <span [innerHTML]= \"sectionList()[secIndex].MultiLangCaptions | multiLangObjectToHtml:language()\" class=\"mobile-view-section-caption section-sl-caption survey-object-caption\"></span>\r\n @if (multiSelect()) {\r\n <div class=\"mobile-view-alternative-list\">\r\n @for (alternativeControl of (secControl.value | asFormArray).controls; track alternativeControl; let altIndex = $index) {\r\n <mat-checkbox\r\n [formControl]=\"alternativeControl\"\r\n class=\"alternative-sl tp-survey-checkbox\">\r\n <div class=\"container-caption-mobile\">\r\n @if (alternativeList()[altIndex].BackGround.Image){\r\n @let imageSize = question() | getQuestionImageBackgroundCssSize;\r\n <img alt=\"answer logo\" [style.height]=\"imageSize.height\" [style.width]=\"imageSize.width\" [src]=\"repositoryPath()+'/' + alternativeList()[altIndex].BackGround.Image\" importance=\"low\" loading=\"lazy\" class=\"answer-image\">\r\n }\r\n <span class=\"alternative-sl-caption survey-object-caption\" [innerHTML]= \"alternativeList()[altIndex].MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </div>\r\n </mat-checkbox>\r\n }\r\n </div>\r\n } @else {\r\n <mat-radio-group\r\n class=\"mobile-view-alternative-list\"\r\n [formControl]=\"secControl.value | asFormControl\">\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <mat-radio-button\r\n class=\"tp-survey-radio-button\"\r\n [value]=\"alt.Value\">\r\n <div class=\"container-caption-mobile\">\r\n @if (alt.BackGround.Image){\r\n @let imageSize = question() | getQuestionImageBackgroundCssSize;\r\n <img alt=\"answer logo\" [style.height]=\"imageSize.height\" [style.width]=\"imageSize.width\" [src]=\"repositoryPath()+'/' + alt.BackGround.Image\" importance=\"low\" loading=\"lazy\" class=\"answer-image\">\r\n }\r\n <span class=\"alternative-sl-caption survey-object-caption\" [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </div>\r\n\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {Component, forwardRef, input} from '@angular/core';\r\nimport {MatFormField} from '@angular/material/form-field';\r\nimport {MatInput} from '@angular/material/input';\r\nimport {NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {FocusAndSelectDirective} from '../../../directive/focus.and.select/focus.and.select.directive';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-od',\r\n templateUrl: './answer.od.component.html',\r\n styleUrls: ['./answer.od.component.scss'],\r\n imports: [\r\n MatFormField,\r\n ReactiveFormsModule,\r\n FocusAndSelectDirective,\r\n MatInput,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerODComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerODComponent extends AnswerMasterComponent<number> {\r\n minValue = input<number>(1);\r\n maxValue = input<number | null>(null);\r\n}\r\n","<div class=\"container-main\">\r\n <mat-form-field appearance=\"outline\" class=\"input-od-number\">\r\n <input [formControl]=\"control\" [min]=\"minValue()\" [max]=\"maxValue()\" tpSurveyFocusAndSelect matInput type=\"number\">\r\n </mat-form-field>\r\n</div>\r\n\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {IdbAdditionalAnswer} from '../../tp.survey.interface';\r\n\r\n@Pipe({\r\n name: 'getAdditionalValueByValue',\r\n standalone: true\r\n})\r\nexport class GetAdditionalValueByValuePipe implements PipeTransform {\r\n\r\n transform(value: number | string, additionalAnswerList: Array<IdbAdditionalAnswer>): IdbAdditionalAnswer | undefined {\r\n const val = (typeof value === 'string') ? Number(value): value;\r\n return additionalAnswerList.find(aa => aa.Value === val);\r\n }\r\n\r\n}\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {AbstractControl, FormControl, FormGroup} from '@angular/forms';\r\nimport {AdditionalAnswer} from '../../tp.survey.type';\r\n\r\n@Pipe({\r\n name: 'keyValues',\r\n standalone: true\r\n})\r\nexport class KeyValuesPipe implements PipeTransform {\r\n\r\n transform(controls: FormGroup<{[key: string]: AbstractControl<AdditionalAnswer>}>): Array<{name: string, control: FormControl<AdditionalAnswer>}> {\r\n return Object.entries(controls).map(([key, control]) =>({\r\n name: key,\r\n control: control,\r\n }));\r\n }\r\n\r\n}\r\n","import {Component, input, output} from '@angular/core';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\nimport {IdbBaseParamsLanguage} from '../../../tp.survey.interface';\r\nimport {MatButton} from '@angular/material/button';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-lang',\r\n templateUrl: './answer.lang.component.html',\r\n styleUrls: ['./answer.lang.component.scss'],\r\n imports: [\r\n MatButton,\r\n ]\r\n})\r\n\r\nexport class AnswerLangComponent extends AnswerMasterComponent<number>{\r\n languageList = input.required<Array<IdbBaseParamsLanguage>>();\r\n onLanguageChange = output<number>();\r\n}\r\n","@for (language of languageList(); track $index) {\r\n <button mat-button (click)=\"onLanguageChange.emit(language.Value)\">\r\n {{language.Caption}}\r\n </button>\r\n}\r\n","import {ChangeDetectionStrategy, Component, DestroyRef, inject, input, OnInit, output, signal} from '@angular/core';\r\n\r\nimport {\r\n additionalAnswerDefaultValidator,\r\n additionalAnswerNumberValidator,\r\n answerDefaultValidator,\r\n answerMSValidator,\r\n answerODValidator,\r\n answerOLValidator,\r\n answerSlValidator,\r\n answerSSValidator\r\n} from './container.answer.validator';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {AnswerSSComponent} from '../answer.ss/answer.ss.component';\r\nimport {AnswerInfoComponent} from '../answer.info/answer.info.component';\r\nimport {AnswerMSComponent} from '../answer.ms/answer.ms.component';\r\nimport {MultiLangObjectToHtmlPipe} from '../../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {AnswerAdditionalComponent} from '../answer.additional/answer.additional.component';\r\nimport {AnswerEndComponent} from '../answer.end/answer.end.component';\r\nimport {debounceTime, tap} from 'rxjs';\r\nimport {map} from 'rxjs/operators';\r\nimport {AnswerOLComponent} from '../answer.ol/answer.ol.component';\r\nimport {AnswerSLComponent} from '../answer.sl/answer.sl.component';\r\nimport {FormControl, FormGroup, ReactiveFormsModule} from '@angular/forms';\r\nimport {AdditionalAnswer, AnswerSlType, AnswerT, TFindVariableVoid} from '../../../tp.survey.type';\r\nimport {AnswerODComponent} from '../answer.od/answer.od.component';\r\nimport {AnswerChange, ICurrentQuestionAnswer, IdbAdditionalAnswer, IdbAlternative, IdbBaseParamsLanguage, IdbQuestion, IdbSection} from '../../../tp.survey.interface';\r\nimport {AdditionalAnswerType, QuestionsType, ViewModel} from '../../../tp.survey.enum';\r\nimport {TpSurveyLogicService} from '../../../core/tp.survey.logic/tp.survey.logic.service';\r\nimport {MISSING_VALUE} from '../../../tp.survey.const';\r\nimport {GetAdditionalValueByValuePipe} from '../../../pipe/get.additional.value.by.value/get.additional.value.by.value.pipe';\r\nimport {KeyValuesPipe} from '../../../pipe/key.values/key.values.pipe';\r\nimport {AnswerLangComponent} from '../answer.lang/answer.lang.component';\r\n\r\ninterface IAnswerForm {\r\n answer: FormControl<AnswerT>;\r\n additionalAnswers: FormGroup<{\r\n [key: string]: FormControl<AdditionalAnswer>\r\n }>;\r\n}\r\n\r\n@Component({\r\n selector: 'tp-survey-container-answer',\r\n imports: [\r\n AnswerODComponent,\r\n ReactiveFormsModule,\r\n AnswerSSComponent,\r\n AnswerInfoComponent,\r\n AnswerMSComponent,\r\n AnswerAdditionalComponent,\r\n MultiLangObjectToHtmlPipe,\r\n AnswerEndComponent,\r\n AnswerOLComponent,\r\n AnswerSLComponent,\r\n GetAdditionalValueByValuePipe,\r\n KeyValuesPipe,\r\n AnswerLangComponent\r\n ],\r\n templateUrl: './container.answer.component.html',\r\n styleUrl: './container.answer.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ContainerAnswerComponent implements OnInit{\r\n findVariable = input.required<TFindVariableVoid>();\r\n question = input.required<IdbQuestion>();\r\n language = input.required<number>();\r\n viewModel = input.required<ViewModel>();\r\n answers = input<ICurrentQuestionAnswer>();\r\n developerMode = input<boolean>(false);\r\n languageList = input.required<Array<IdbBaseParamsLanguage>>();\r\n repositoryPath = input<string>('');\r\n visibleAlternativeList = signal<Array<IdbAlternative>>([]);\r\n visibleSectionList = signal<Array<IdbSection>>([]);\r\n visibleAdditionalAnswerList = signal<Array<IdbAdditionalAnswer>>([]);\r\n logicChanged = output<Record<string, any>>();\r\n answerChanged = output<AnswerChange>();\r\n onLanguageChange = output<number>();\r\n questionsType = QuestionsType;\r\n answerForm: FormGroup<IAnswerForm>;\r\n readonly AdditionalAnswerType = AdditionalAnswerType;\r\n #alternativeSequenceClicks: Array<[number, number]> = [];\r\n readonly #logic = inject(TpSurveyLogicService);\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n constructor() {\r\n this.answerForm = new FormGroup<IAnswerForm>({\r\n answer: new FormControl<AnswerT>(null ),\r\n additionalAnswers: new FormGroup({}),\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n const answerValue = this.answers()?.question?.AnswerValue ?? null;\r\n const answerValueClear = answerValue === MISSING_VALUE ? null : answerValue;\r\n this.answerForm.patchValue({\r\n answer: answerValueClear,\r\n additionalAnswers: this.answers()?.question?.AnswerAdditional\r\n }, {emitEvent:false});\r\n\r\n this.#alternativeSequenceClicks = this.answers()?.question?.AlternativeSequenceClicks ?? [];\r\n this.#updateAlternativesAndSections();\r\n this.#updateAdditionalAnswers(true);\r\n this.#addValidator();\r\n\r\n this.answerForm.valueChanges.pipe(\r\n debounceTime(250),\r\n tap(() => this.#emitLogicChanged()), //шлём новые логические переменные(может обновиться список additionalAnswers)\r\n tap(() => this.#updateAdditionalAnswers(false)), //перестраиваем additionalAnswers\r\n map(values => {\r\n const formGroup = (this.answerForm.controls.additionalAnswers as FormGroup);\r\n const additionalAnswerNormalized: Record<number, AdditionalAnswer> = {};\r\n this.question().AdditionalAnswerlist.forEach(aa => {\r\n const isVisible = this.visibleAdditionalAnswerList().find(faa => faa.Value === aa.Value);\r\n if (isVisible) {\r\n additionalAnswerNormalized[aa.Value] = !!values.additionalAnswers ? values.additionalAnswers[aa.Value]! : MISSING_VALUE;\r\n formGroup.get(aa.Value.toString())?.enable({emitEvent: false})\r\n } else {\r\n additionalAnswerNormalized[aa.Value] = MISSING_VALUE;\r\n formGroup.get(aa.Value.toString())?.disable({emitEvent: false})\r\n }\r\n });\r\n return {\r\n answer:values.answer,\r\n additionalAnswers: additionalAnswerNormalized,\r\n }\r\n }),\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe(data => {\r\n this.answerChanged.emit({\r\n guid: this.question().QuestionGuid,\r\n isComplete: this.answerForm.valid,\r\n answer: data.answer!,\r\n additionalAnswers: data.additionalAnswers as Record<number, AdditionalAnswer>,\r\n logicVars: this.#getLogicVars(),\r\n viewedAlternativeValues: this.visibleAlternativeList().map(alt => alt.Value),\r\n viewedSectionGuids: this.visibleSectionList().map(alt => alt.SectionGuid),\r\n alternativeSequenceClicks: Array.from(this.#alternativeSequenceClicks)\r\n });\r\n });\r\n this.#setDefaultAnswers();\r\n \r\n /*Update 19.03.2025\r\n Когда нажимают кнопку back, ответы остаются, но логические переменные удаляются, см. TpSurveyCoreService.clearAnswerForCurrentQuestion\r\n Но если респондент ничего в ответе не меняет и нажимает кнопку далее, то логические переменные не обновляются.\r\n Поэтому если ответ на вопрос не равен MISSING_VALUE(-97), то нужно обновить логические переменные\r\n */\r\n if (answerValue !== MISSING_VALUE){\r\n this.#emitLogicChanged();\r\n }\r\n }\r\n\r\n #addValidator(): void{\r\n const question = this.question();\r\n this.answerForm.controls.answer.addValidators(answerDefaultValidator());\r\n\r\n switch (question.QuestionType){\r\n case QuestionsType.eqSS: {\r\n this.answerForm.controls.answer.addValidators(answerSSValidator());\r\n break;\r\n }\r\n\r\n case QuestionsType.eqMS: {\r\n this.answerForm.controls.answer.addValidators(answerMSValidator(this.visibleAlternativeList().length, this.question().AlternativeMinAnswersCount, this.question().AlternativeMaxAnswersCount));\r\n break;\r\n }\r\n\r\n case QuestionsType.eqOD: {\r\n this.answerForm.controls.answer.addValidators(answerODValidator(question.ODMinValue, question.ODMaxValue));\r\n break;\r\n }\r\n\r\n case QuestionsType.eqOL: {\r\n this.answerForm.controls.answer.addValidators(answerOLValidator(question.OLTypeTel, question.CanSkip ?? false));\r\n break;\r\n }\r\n\r\n case QuestionsType.eqSL: {\r\n this.answerForm.controls.answer.addValidators(answerSlValidator(this.question().RequireAllAnswers, this.question().SLSectionMinAnswersCount, this.visibleSectionList()));\r\n break;\r\n }\r\n }\r\n }\r\n\r\n #setDefaultAnswers(): void{\r\n const question = this.question();\r\n const isLang = question.QuestionType === QuestionsType.eqLANG;\r\n const isInfo = question.QuestionType === QuestionsType.eqINFO;\r\n const isEnd = question.QuestionType === QuestionsType.eqEND;\r\n const isSSMS = (question.QuestionType === QuestionsType.eqSS || question.QuestionType === QuestionsType.eqMS) && (this.visibleAlternativeList().length === 0);\r\n\r\n if (isInfo || isEnd || isSSMS || isLang) {\r\n let defaultAnswer;\r\n switch (question.QuestionType) {\r\n case QuestionsType.eqMS: defaultAnswer = []; break;\r\n case QuestionsType.eqSS: defaultAnswer = 0; break;\r\n default: defaultAnswer = 1;\r\n }\r\n\r\n //может возникнуть ситуация, когда нет альтернатив для отображения.в этом случае вопрос показывать не нужно, как ответ записываем 0 и переходим на следующий\r\n this.answerForm.patchValue({\r\n answer: defaultAnswer\r\n }, {emitEvent: true});\r\n }\r\n }\r\n\r\n\r\n //собираем все логические переменные, которые генерит вопрос\r\n #getLogicVars(): Record<string, any>{\r\n const questionType = this.question().QuestionType;\r\n const answer = this.answerForm.controls.answer.value;\r\n const logicObj: Record<string, any> = {};\r\n\r\n //переменная самого вопроса\r\n const questionSysName = this.question().SysName;\r\n\r\n //ответ на основной вопрос\r\n logicObj[questionSysName] = this.answerForm.value.answer;\r\n\r\n switch (questionType) {\r\n case QuestionsType.eqSS: {\r\n //каждая альтернатива имеет свою переменную, 1 нажата, 0 не нажата или скрыта(скрыта сомнительно, что это правильно)\r\n this.question().Alternativelist.forEach( alt => logicObj[`${questionSysName}${alt.SysName}`] = answer === alt.Value ? 1 : 0); // переменные альтернатив\r\n break;\r\n }\r\n\r\n case QuestionsType.eqMS: {\r\n const answers = Array.isArray(this.answerForm.value.answer) ? this.answerForm.value.answer : [];\r\n //каждая альтернатива имеет свою переменную, 1 нажата, 0 не нажата или скрыта(скрыта сомнительно, что это правильно)\r\n this.question().Alternativelist.forEach( alt => logicObj[`${questionSysName}${alt.SysName}`] = answers.find(val => val === alt.Value) ? 1 : 0); // переменные альтернатив\r\n break;\r\n }\r\n\r\n case QuestionsType.eqOL: {\r\n //логическая переменная для OL вопроса - 1, а не то что ввели\r\n logicObj[questionSysName] = 1;\r\n break;\r\n }\r\n\r\n case QuestionsType.eqSL: {\r\n /*Тут сложнее чем в остальных типах вопросов.\r\n * 1. Логическая переменная для SL вопроса\r\n * 2. Логическая переменная для каждой секции\r\n * 3. Логические переменные для каждой альтернативы + секции\r\n * */\r\n\r\n //1. Логическая переменная для SL вопроса - 1, а не то что ввели\r\n logicObj[questionSysName] = 1;\r\n\r\n //Каждая секция должны иметь свою логическую переменную, array<number> если multiselect, number если multiselect = false, -97 если секция не была показана.\r\n //+ для каждой секции нужно добавлять логические переменные для каждой альтернативы. 1 нажата, 0 отжата, -97 если альтернатива не была показана.\r\n const fullAnswers = this.answerForm.value.answer as AnswerSlType;\r\n const visibleAlternativeList = this.visibleAlternativeList().map(alt => alt.Value);\r\n this.question().Sectionlist.forEach(section => {\r\n const sectionSysName = section.SysName;\r\n\r\n //если undefined, то заменим на -97 это значит секция не была показана.\r\n const sectionAnswer = fullAnswers[section.SectionGuid.toString()] ?? MISSING_VALUE;\r\n\r\n //2. добавляем переменную самой секции.\r\n logicObj[sectionSysName] = sectionAnswer;\r\n this.question().Alternativelist.forEach(alternative => {\r\n\r\n const sectionAlternativeSysName = `${sectionSysName}${alternative.SysName}`;\r\n //секция не была показана, значит альтернативы тоже\r\n if (sectionAnswer === MISSING_VALUE) {\r\n logicObj[sectionAlternativeSysName] = MISSING_VALUE;\r\n } else {\r\n //сначала нужно проверить была ли показана альтернатива, если нет\r\n //альтернативы нет в списке показанных\r\n if (!visibleAlternativeList.find(visibleVal => visibleVal === alternative.Value)) {\r\n logicObj[sectionAlternativeSysName] = MISSING_VALUE;\r\n } else {\r\n //альтернативы есть в списке показанных, нужно узнать была нажата или нет.\r\n const isPressed = Array.isArray(sectionAnswer) ? sectionAnswer.includes(alternative.Value) : sectionAnswer === alternative.Value;\r\n logicObj[sectionAlternativeSysName] = isPressed ? 1 : 0;\r\n }\r\n }\r\n });\r\n });\r\n break;\r\n }\r\n }\r\n\r\n //логические переменные дополнительных вопросов.\r\n this.question().AdditionalAnswerlist.forEach(aa => {\r\n const additionalAnswer = !!this.answerForm.value.additionalAnswers ? this.answerForm.value.additionalAnswers![aa.Value.toString()] : MISSING_VALUE;\r\n const additionalAnswerSysName = `${questionSysName}${aa.SysName}`;\r\n if (additionalAnswer === MISSING_VALUE) {\r\n //дополнительный ответ не был показан, (скрыт по логике)\r\n logicObj[additionalAnswerSysName] = MISSING_VALUE;\r\n } else {\r\n //если на вопрос не отвечали(null), этот самый null и добавляем как ответ.\r\n if (additionalAnswer === null) {\r\n logicObj[additionalAnswerSysName] = null;\r\n } else {\r\n //если вопрос типа текст, как переменную добавим 1, в остальных случаях сам ответ.\r\n logicObj[additionalAnswerSysName] = aa.AnswerType === AdditionalAnswerType.aatText ? 1 : additionalAnswer;\r\n }\r\n }\r\n });\r\n return logicObj;\r\n }\r\n\r\n #updateAlternativesAndSections(): void{\r\n const developerMode = this.developerMode();\r\n //фильтруем альтернативы,\r\n const filteredAlternativeList = this.question().Alternativelist.filter(alt => developerMode || this.#logic.executeLogic(alt.EnableExpression));\r\n\r\n //фильтруем секции,\r\n const filteredSectionList = this.question().Sectionlist.filter(sec => developerMode || this.#logic.executeLogic(sec.EnableExpression));\r\n\r\n //меняем расположение тех, которые этого требуют и обновляем глобальную переменную\r\n this.visibleAlternativeList.set(this.#arrangeRotatedList(filteredAlternativeList));\r\n //для секций тоже самое\r\n this.visibleSectionList.set(this.#arrangeRotatedList(filteredSectionList));\r\n }\r\n\r\n #updateAdditionalAnswers(isInit: boolean): void{\r\n const developerMode = this.developerMode();\r\n const formGroup = (this.answerForm.controls.additionalAnswers as FormGroup);\r\n\r\n if (isInit) {\r\n this.question().AdditionalAnswerlist.forEach(aa => {\r\n switch (aa.AnswerType) {\r\n case AdditionalAnswerType.aatNumber: formGroup.addControl(aa.Value.toString(), new FormControl<number | null>(null,{validators: [additionalAnswerDefaultValidator(aa.IsRequired), additionalAnswerNumberValidator(aa.IsRequired, aa.NumberMinValue, aa.NumberMaxValue)]}), {emitEvent: false}); break;\r\n case AdditionalAnswerType.aatText: formGroup.addControl(aa.Value.toString(), new FormControl<string | null>(null,{validators: [additionalAnswerDefaultValidator(aa.IsRequired)]}), {emitEvent: false}); break;\r\n case AdditionalAnswerType.aatBoolean: formGroup.addControl(aa.Value.toString(), new FormControl<boolean | null>(null,{validators: [additionalAnswerDefaultValidator(aa.IsRequired)]}), {emitEvent: false}); break;\r\n }\r\n });\r\n return\r\n }\r\n\r\n //фильтруем,\r\n const filteredAdditionalAnswerList = this.question().AdditionalAnswerlist.filter(addAnswer => developerMode || this.#logic.executeLogic(addAnswer.EnableExpression));\r\n\r\n //обновляем глобальный список\r\n this.visibleAdditionalAnswerList.set(filteredAdditionalAnswerList);\r\n }\r\n\r\n onAlternativeClick(value: number) {\r\n this.#alternativeSequenceClicks.push([value, new Date().getTime()]);\r\n }\r\n\r\n #arrangeRotatedList<T extends IdbAlternative | IdbSection>(inputArray: Array<T>): Array <T> {\r\n //У каждой альтернативы и секции есть признак Rotation, который позволяем менять порядок отображения альтернативы или секции\r\n //если он true, то альтернатива и секция должна поменять расположение\r\n const resArray: Array<T | number> = [];\r\n\r\n //размер массива\r\n const inputArrayLength = inputArray.length;\r\n\r\n //проходимся по каждому элементу входного массива, и копируем в результирующий, Если Rotation, копируем его индекс, если Rotation не указан, копируем сам объект\r\n inputArray.forEach((obj, index) => resArray.push(obj.Rotation ? index : obj));\r\n\r\n //теперь с помощью рандома, расставим остальные эл-ты\r\n resArray.forEach((obj, index, array) => {\r\n if ((typeof obj === 'number') && (obj >= 0)) {\r\n while (true) {\r\n //если в новом массиве нет элемента из старого массива по random индексу, тогда копируем в новый массив старый елемент в новый адрес\r\n const newIndex = Math.floor( Math.random() * inputArrayLength );\r\n if (array.indexOf(inputArray[newIndex]) === -1) {\r\n array[index] = inputArray[newIndex];\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n return resArray as Array<T>;\r\n }\r\n \r\n #emitLogicChanged(): void{\r\n this.logicChanged.emit(this.#getLogicVars())\r\n }\r\n}\r\n","<div class=\"container-main\" [formGroup]=\"answerForm\">\r\n @switch (question().QuestionType) {\r\n\r\n @case (questionsType.eqLANG) {\r\n <tp-survey-answer-lang\r\n [languageList]=\"languageList()\"\r\n [findVariable]=\"findVariable()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [language]=\"2\"\r\n [viewModel]=\"viewModel()\"\r\n (onLanguageChange)=\"onLanguageChange.emit($event)\"/>\r\n }\r\n\r\n @case (questionsType.eqINFO) {\r\n <tp-survey-answer-info\r\n formControlName=\"answer\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [findVariable]=\"findVariable()\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"/>\r\n }\r\n\r\n @case (questionsType.eqSS) {\r\n <tp-survey-answer-ss\r\n formControlName=\"answer\"\r\n [question]=\"question()\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n [findVariable]=\"findVariable()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [alternativeList]=\"visibleAlternativeList()\"\r\n (onAlternativeClick)=\"onAlternativeClick($event)\"\r\n />\r\n }\r\n\r\n @case (questionsType.eqMS) {\r\n <tp-survey-answer-ms\r\n formControlName=\"answer\"\r\n [question]=\"question()\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n [findVariable]=\"findVariable()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [alternativeMaxAnswersCount]=\"question().AlternativeMaxAnswersCount\"\r\n [alternativeList]=\"visibleAlternativeList()\"\r\n (onAlternativeClick)=\"onAlternativeClick($event)\"/>\r\n }\r\n\r\n @case (questionsType.eqOD) {\r\n <tp-survey-answer-od\r\n formControlName=\"answer\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n [findVariable]=\"findVariable()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [minValue]=\"question().ODMinValue\"\r\n [maxValue]=\"question().ODMaxValue\"\r\n />\r\n }\r\n\r\n @case (questionsType.eqOL) {\r\n <tp-survey-answer-ol\r\n formControlName=\"answer\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [findVariable]=\"findVariable()\"\r\n [telephoneInput]=\"question().OLTypeTel\"\r\n [canSkip]=\"question().CanSkip\"/>\r\n }\r\n\r\n @case (questionsType.eqSL) {\r\n <tp-survey-answer-sl\r\n formControlName=\"answer\"\r\n [question]=\"question()\"\r\n [alternativeList]=\"visibleAlternativeList()\"\r\n [sectionList]=\"visibleSectionList()\"\r\n [multiSelect]=\"question().MultiSelect\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [findVariable]=\"findVariable()\"\r\n [maxCount]=\"this.question().SLSectionMaxAnswersCount\"\r\n />\r\n }\r\n\r\n @case (questionsType.eqEND) {\r\n <tp-survey-answer-end\r\n formControlName=\"answer\"\r\n [findVariable]=\"findVariable()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n />\r\n }\r\n }\r\n\r\n <div class=\"container-additional-answer\">\r\n @for (addAnswer of answerForm.controls.additionalAnswers.controls | keyValues; track addAnswer) {\r\n @if (addAnswer.name | getAdditionalValueByValue:visibleAdditionalAnswerList(); as additionalAnswerObject ) {\r\n <tp-survey-answer-additional\r\n [control]=\"addAnswer.control\"\r\n [class.full-width]=\"additionalAnswerObject.AnswerType===AdditionalAnswerType.aatText\"\r\n [answerType]=\"additionalAnswerObject.AnswerType\"\r\n [caption]=\"additionalAnswerObject.MultiLangCaptions | multiLangObjectToHtml:language()\"\r\n [numberMinValue]=\"additionalAnswerObject.NumberMinValue\"\r\n [numberMaxValue]=\"additionalAnswerObject.NumberMaxValue\"\r\n [textMultiline]=\"additionalAnswerObject.TextMultiline\"\r\n [captionPosition]=\"additionalAnswerObject.CaptionPosition\"/>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {IdbBaseParamsLanguage} from '../../tp.survey.interface';\r\n\r\n@Pipe({\r\n name: 'getActiveLanguage',\r\n standalone: true\r\n})\r\nexport class GetActiveLanguagePipe implements PipeTransform {\r\n\r\n transform(languageList?: Array<IdbBaseParamsLanguage>, languageId?: number): IdbBaseParamsLanguage | undefined {\r\n return Array.isArray(languageList) ? languageList.find(langObj => langObj.Value === languageId && langObj.isActive) : undefined;\r\n }\r\n\r\n}\r\n","import {Directive, effect, ElementRef, input} from '@angular/core';\r\nimport {ViewModel} from '../../tp.survey.enum';\r\nimport {BASE_HEIGHT, BASE_WIDTH} from '../../tp.survey.const';\r\n\r\n@Directive({\r\n selector: '[tpSurveyUpdateFontSize]',\r\n standalone: true\r\n})\r\nexport class UpdateFontSizeDirective{\r\n viewModel = input.required<ViewModel>( {alias: 'tpSurveyUpdateFontSize'});\r\n constructor(private readonly _element: ElementRef) {\r\n effect(() => {\r\n if (this.viewModel() === ViewModel.vmTablet) {\r\n const containerWidth = this._element.nativeElement.clientWidth;\r\n const containerHeight = this._element.nativeElement.clientHeight;\r\n const proportion: number = Math.min(containerWidth / BASE_WIDTH, containerHeight / BASE_HEIGHT );\r\n Array.from(this._element.nativeElement.children).forEach((el) => (el as HTMLElement).style.fontSize = `${proportion * 100}%`);\r\n }\r\n });\r\n }\r\n}\r\n\r\n","import {LOGIC_FUNC_TEXT} from './tp.survey.const';\r\n\r\nexport function executeLogicExpression(expression: string, vars: Record<string, unknown>): Function {\r\n return new Function(`${LOGIC_FUNC_TEXT} return ${expression}`).call(vars);\r\n}\r\n\r\n","import {IdbQuestionaryQuota, IdbQuestionaryQuota2dObject} from '../../tp.survey.interface';\r\nimport {Answer} from '../tp.survey.answer/tp.survey.answer';\r\nimport {executeLogicExpression} from '../../tp.survey.method';\r\nimport {LogicObject} from '../../tp.survey.type';\r\n\r\ntype QuotaCalculationResult = {\r\n name: string;\r\n guid: number;\r\n} | {\r\n name: null;\r\n guid2d: number;\r\n} | null;\r\n\r\nexport class SurveyQuotas {\r\n #completedQuota: {name: string | null; guid: number| null; guid2d: number| null} = {name: null, guid: null, guid2d: null};\r\n #quotas: Array<IdbQuestionaryQuota> = [];\r\n #quotas2d: Array<IdbQuestionaryQuota2dObject> = [];\r\n #quotaLimitDestinationQuestionGuid: number = -1;\r\n #quotaLimitDestinationQuestionNum: number = -1;\r\n\r\n setQuotas(quotas1d: Array<IdbQuestionaryQuota> = [], quotas2d: Array<IdbQuestionaryQuota2dObject> = [], quotaLimitDestinationQuestionGuid: number = -1, destinationQuestionNum: number = -1){\r\n this.#quotas = quotas1d;\r\n this.#quotas2d = quotas2d;\r\n this.#quotaLimitDestinationQuestionGuid = quotaLimitDestinationQuestionGuid;\r\n this.#quotaLimitDestinationQuestionNum = destinationQuestionNum;\r\n }\r\n\r\n guidIsDestinationQuestion(guid: number): boolean{\r\n return this.#quotaLimitDestinationQuestionGuid === guid;\r\n }\r\n\r\n\r\n get quotaIsCompleted(): boolean {\r\n return this.#completedQuota && (!!this.#completedQuota.guid || !!this.#completedQuota.guid2d) ;\r\n }\r\n\r\n get destinationQuestionGuid(): number {\r\n return this.#quotaLimitDestinationQuestionGuid\r\n }\r\n\r\n get quotaCount(): number {\r\n const quotas = this.#quotas && Array.isArray(this.#quotas) ? this.#quotas.length : 0;\r\n const quotas2d = this.#quotas2d && Array.isArray(this.#quotas2d) ? this.#quotas2d.length : 0;\r\n return quotas + quotas2d;\r\n }\r\n\r\n findFilledQuotas(currentQuestionNum: number, vars: LogicObject, interviewAnswers: Array<Answer>): void {\r\n /*\r\n * Поиск заполненной квоты это очень дорогой процесс. Его нужно оптимизировать по максимуму.\r\n * Перед поиском нужно выполнить ряд проверок.\r\n * Проверка currentQuestionNum <= this.#quotaLimitDestinationQuestionNum Нужна для оптимизации.\r\n * DestinationQuestion Желательно располагать после последнего квотного вопроса, потому что нет смысла постоянно проверять квоты, если вопросы которые используются для расчёта квоты меняться не будут.\r\n * например Квота Q1 + Q2 <= 25. DestinationQuestion нужно делать номером 3 или 4. Потому что как бы респондент не отвечал на последующие вопросы, результат квот не измениться и каждый раз их пересчитывать смысла нет.\r\n */\r\n if (\r\n (this.destinationQuestionGuid > 0) && //Глобально в настройках анкеты должен быть указан вопрос который должен отобразиться при достижении квоты, если его нет, то и искать квоты смысла нет.\r\n (this.quotaCount > 0) && //проверим если у нас вообще квоты\r\n (currentQuestionNum <= this.#quotaLimitDestinationQuestionNum) && // номер текущий вопроса меньше номера вопроса для перехода по достижении квот\r\n (!this.quotaIsCompleted) //и на финал проверим если ли уже заполненная квота, повторно не запускаем\r\n ) {\r\n\r\n new Promise<QuotaCalculationResult>((resolve, reject) => {\r\n if (Array.isArray(this.#quotas)) {\r\n const completedQuota = this.#quotas.find(quota => executeLogicExpression(quota.expression, vars));\r\n if (!!completedQuota) {\r\n return resolve({name: completedQuota.name, guid: completedQuota.quota_guid});\r\n }\r\n }\r\n\r\n if (Array.isArray(this.#quotas2d)) {\r\n const answers = this.#quotas2d.length > 0 ? interviewAnswers.map(a => ({av: a.AnswerValue, qg: a.QuestionGUID}) ) : [];\r\n\r\n const filledQuota2dArray = this.#quotas2d.filter(quotaValues => {\r\n /*\r\n * 2d квоты это всегда таблица. Но может быть иерархия, когда одно значение ответа может включать в себя один или несколько других ответов. Например \"Обл центр\" это 1, а город или село это другой ответ, хотя город и село это разные альтернативы\r\n * */\r\n if (Array.isArray(quotaValues.cqv) && quotaValues.cqv.length > 0) {\r\n /*\r\n * это ветка для случая с иерархией. Тут будет 2 массива.\r\n * В первом будут контролироваться те ответы которое должны совпадать полностью arrayEveryValues\r\n * Во втором arraySomeValue будет проверяться совпадение хотя бы 1 ответа\r\n * */\r\n\r\n const questionGuid = quotaValues.cqv[0].guid;\r\n\r\n const masterQuestion = quotaValues.qs.find( q => q.guid === questionGuid);\r\n const arrayEveryValues = quotaValues.qs.filter(q => q.guid != questionGuid);\r\n\r\n const arraySomeValue = [...quotaValues.cqv, ...[masterQuestion!]];\r\n\r\n const arrayEveryResult = arrayEveryValues.every(qvq => !!answers.find(intAnswer => intAnswer.qg === qvq.guid && intAnswer.av === qvq.value))\r\n const arraySomeResult = arraySomeValue.some(qvq => !!answers.find(intAnswer => intAnswer.qg === qvq.guid && intAnswer.av === qvq.value))\r\n //если в обоих массивах совпадают значения значит квота выполнилась\r\n return arrayEveryResult && arraySomeResult;\r\n } else {\r\n //обычный массив значений, в котором должны совпадать все значения\r\n return quotaValues.qs.every(qvq => !!answers.find(intAnswer => intAnswer.qg === qvq.guid && intAnswer.av === qvq.value))\r\n }\r\n });\r\n //если не нашли заполненных квот выходим\r\n if (filledQuota2dArray.length <= 0) {\r\n return;\r\n }\r\n\r\n //ищем квоту которая заполнена и у нее есть условие и оно выполняется.\r\n const quota2dWithExpression = filledQuota2dArray.find((q: IdbQuestionaryQuota2dObject) => !!q.exp && executeLogicExpression(q.exp, vars));\r\n\r\n //если квота есть сообщим\r\n if (!!quota2dWithExpression) {\r\n return resolve({name: null, guid2d: quota2dWithExpression.qvg});\r\n }\r\n\r\n //если квоты с Expression нет, ищем квоту которая заполнена и у нее нет условия\r\n const quota2dWithoutExpression = filledQuota2dArray.find((q: IdbQuestionaryQuota2dObject) => !q.exp || (typeof q.exp === 'string' && q.exp.trim().length === 0));\r\n if (!!quota2dWithoutExpression) {\r\n return resolve({name: null, guid2d: quota2dWithoutExpression.qvg});\r\n }\r\n }\r\n reject(null)\r\n }).then(quota => {\r\n if (!!quota) {\r\n this.#completedQuota = {\r\n name: quota.name,\r\n guid: 'guid' in quota ? quota.guid : null,\r\n guid2d: 'guid2d' in quota ? quota.guid2d : null,\r\n }\r\n }\r\n }).catch(err => {\r\n console.error(err);\r\n });\r\n }\r\n }\r\n}\r\n","import {IQuestionAnswer} from '../../tp.survey.interface';\r\nimport {AdditionalAnswer} from '../../tp.survey.type';\r\nimport {MISSING_VALUE} from '../../tp.survey.const';\r\n\r\nexport class Answer implements IQuestionAnswer {\r\n readonly QuestionGUID: number;\r\n readonly QuestionVersion: number;\r\n readonly AnswerAdditional: Record<string, AdditionalAnswer> = {};\r\n readonly ViewedAlternativeValues: Array<number> = [];\r\n readonly ViewedSectionGuids: Array<number> = [];\r\n readonly AlternativeSequenceClicks: Array<[number, number]> = [];\r\n StartedAt = 0;\r\n FinishedAt = 0;\r\n AnswerValue: any = MISSING_VALUE;\r\n answerIsComplete: boolean = false;\r\n constructor(guid: number, version: number = -1) {\r\n this.QuestionGUID = guid;\r\n this.QuestionVersion = version;\r\n }\r\n clear(): void {\r\n this.StartedAt = 0;\r\n this.FinishedAt = 0;\r\n this.AnswerValue = MISSING_VALUE;\r\n this.ViewedAlternativeValues.length = 0;\r\n this.ViewedSectionGuids.length = 0;\r\n this.AlternativeSequenceClicks.length = 0;\r\n for (const key of Object.keys(this.AnswerAdditional)) {\r\n this.AnswerAdditional[Number(key)] = null;\r\n }\r\n }\r\n}\r\n","import {Answer} from '../tp.survey.answer/tp.survey.answer';\r\nimport {IQuestionAnswer} from '../../tp.survey.interface';\r\nimport {MISSING_VALUE} from '../../tp.survey.const';\r\nimport {Injectable} from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TpSurveyInterviewService {\r\n #answerList: Array<Answer> = [];\r\n startedAt: number = 0;\r\n\r\n createAnswer(guid: number, version: number): Answer {\r\n //ишем ответ с таким же номером как и в вопросе\r\n let answer = this.findAnswerByGuid(guid);\r\n\r\n //если ответа с таким номером вопроса нет, создадим\r\n if (!answer) {\r\n answer = new Answer(guid, version)\r\n this.#answerList.push(answer);\r\n }\r\n //вернём то, что создали или то что нашли\r\n return answer;\r\n }\r\n\r\n findAnswerByGuid(guid: number): Answer | undefined {\r\n return this.#answerList.find(a => a.QuestionGUID === guid);\r\n }\r\n\r\n questionIsComplete(guid: number): boolean{\r\n const answer = this.findAnswerByGuid(guid);\r\n return !answer ? false : answer.answerIsComplete;\r\n }\r\n\r\n getAnswerList(): Array<Answer>{\r\n return this.#answerList;\r\n }\r\n\r\n overrideAnswers(answers: Array<IQuestionAnswer>): void{\r\n //не будем трогать вопросы которые = -97\r\n answers.filter(answer => answer.AnswerValue !== MISSING_VALUE).forEach(oldAnswer => {\r\n const newAnswer = this.#answerList.find(aa => aa.QuestionGUID === oldAnswer.QuestionGUID);\r\n if (!!newAnswer) {\r\n //вернём основной ответ\r\n newAnswer.AnswerValue = oldAnswer.AnswerValue;\r\n\r\n newAnswer.StartedAt = oldAnswer.StartedAt;\r\n newAnswer.FinishedAt = oldAnswer.FinishedAt;\r\n\r\n //С дополнительными ответами сложнее, они помечены readonly. Поэтому сначала удалим, потом добавим\r\n for (const prop of Object.getOwnPropertyNames(newAnswer.AnswerAdditional)) {\r\n delete newAnswer.AnswerAdditional[prop];\r\n }\r\n //добавляем старые значения\r\n for (const [key, value] of Object.entries(oldAnswer.AnswerAdditional)) {\r\n newAnswer.AnswerAdditional[key] = value;\r\n }\r\n\r\n //То же самое с ViewedAlternativeValues и ViewedSectionGuids и AlternativeSequenceClicks. Т.к. они readonly сначала удалим, потом добавим\r\n newAnswer.ViewedAlternativeValues.length = 0;\r\n oldAnswer.ViewedAlternativeValues.forEach(oa => newAnswer.ViewedAlternativeValues.push(oa));\r\n\r\n newAnswer.ViewedSectionGuids.length = 0;\r\n oldAnswer.ViewedSectionGuids.forEach(oa => newAnswer.ViewedSectionGuids.push(oa));\r\n\r\n newAnswer.AlternativeSequenceClicks.length = 0;\r\n oldAnswer.AlternativeSequenceClicks.forEach(oa => newAnswer.AlternativeSequenceClicks.push(oa));\r\n }\r\n });\r\n }\r\n}\r\n","import {DestroyRef, inject, Inject, Injectable, PLATFORM_ID} from '@angular/core';\r\nimport {BehaviorSubject, filter, Observable, Subject} from 'rxjs';\r\nimport {SurveyQuotas} from '../tp.servey.quota/tp.survey.quota';\r\nimport {TpSurveyLogicService} from '../tp.survey.logic/tp.survey.logic.service';\r\nimport {isPlatformBrowser} from '@angular/common';\r\nimport {map} from 'rxjs/operators';\r\nimport {AnswerChange, IdbQuestion, IdbQuestionary, IInterviewData, IInterviewLogicVar, IQuestionAnswer} from '../../tp.survey.interface';\r\nimport {TpSurveyInterviewService} from '../tp.survey.interview/tp.survey.interview.service';\r\nimport {QuestionsType, ResultativeStatus, SurveyEvents, ValidStatus} from '../../tp.survey.enum';\r\nimport {Answer} from '../tp.survey.answer/tp.survey.answer';\r\nimport {AnswerSlType, LogicObject} from '../../tp.survey.type';\r\nimport {MISSING_VALUE} from '../../tp.survey.const';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\n\r\ninterface BroadcastEvent {\r\n key: string;\r\n data?: any;\r\n}\r\n\r\ninterface ILogicVarContainer {\r\n [questionGuid: string]: Set<string>;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TpSurveyCoreService {\r\n readonly #eventBus = new Subject<BroadcastEvent>();\r\n readonly #currentQuestion = new BehaviorSubject<IdbQuestion | null>(null);\r\n #surveyQuotas = new SurveyQuotas();\r\n #questionary?: IdbQuestionary;\r\n #displayedQuestions: Array<number> = []; // нужно для навигации по кнопке back\r\n #questionLogicVarContainer: ILogicVarContainer = {}; //Нужно знать какая логическая переменная относится к какому вопросу. НапримерЮ когда нужно ее отчистить при переходе назад.\r\n readonly #destroyRef = inject(DestroyRef);\r\n constructor(@Inject(PLATFORM_ID) private readonly platformId: object, private readonly _logic: TpSurveyLogicService, private readonly _interview: TpSurveyInterviewService) {\r\n // запускам проверку квот, после скрытия каждого(почти) вопроса (seQuestionHide)\r\n this.#eventBus.asObservable().pipe(\r\n filter(ev => ev.key === SurveyEvents.seQuestionHide ),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe({\r\n next: () => this.#surveyQuotas.findFilledQuotas(this.#currentQuestion.value?.QuestionNum ?? -1, Object.assign({}, this._logic.getLogicVars()), this._interview.getAnswerList())\r\n });\r\n }\r\n\r\n setupSurvey(questionaryRawData: IdbQuestionary, logicVars?: Array<IInterviewLogicVar>, answerList?: Array<IQuestionAnswer>, questionGuid?: number) {\r\n //если анкеты нет, делать нечего.\r\n if (!questionaryRawData) {\r\n this.#currentQuestion.next(null);\r\n return;\r\n }\r\n\r\n this.#questionary = questionaryRawData;\r\n\r\n if (isPlatformBrowser(this.platformId)) {\r\n //узнаем есть ли вопрос который указали для перехода при заполнении квоты\r\n const destinationQuestion = this.#findQuestionByGuid(questionaryRawData.BaseParams.QuotaLimitDestinationQuestionGuid);\r\n\r\n //инициализируем квоты\r\n this.#surveyQuotas.setQuotas(questionaryRawData.Quotas, questionaryRawData.Quotas2d, destinationQuestion?.QuestionGuid ?? -1, destinationQuestion?.QuestionNum ?? -1);\r\n }\r\n\r\n //создадим ответы и логические переменные\r\n this.#initiateQuestions(this.#questionary.Questions)\r\n\r\n // Может быть 2 варианта запуска интервью, 1-новое интервью, 2-перезапуск старого интервью. В первом случае начало это lang или первый вопрос. Во втором, с последнего вопроса на который ответили.\r\n let startQuestionNum: number | undefined = undefined;\r\n \r\n //загружаем старые логические переменные и переменные которые указали из вне.\r\n this.#fillOldLogic(logicVars ?? []);\r\n\r\n //если загружаем ранее не законченное интервью, продолжаем с места последнего вопроса (случай номер 2)\r\n if (!!answerList && !!questionGuid) {\r\n //загружаем старые логические переменные и ответы\r\n this.#fillOldInterviewData(answerList);\r\n\r\n //ищем номер вопроса, который был последний перед сохранением.\r\n const questionLastSave = this.#findQuestionByGuid(questionGuid);\r\n\r\n //Вопрос могли удалить, тогда начнем сначала.\r\n if (!!questionLastSave) {\r\n startQuestionNum = questionLastSave.QuestionNum;\r\n }\r\n }\r\n \r\n if (startQuestionNum === undefined) {\r\n //Это новое интервью, без ранее сохранённых данных(случай 1). Запускаем опрос, первый экран это Lang вопрос, но если выбора языка нет, пропускаем и переходим на 1-й вопрос\r\n startQuestionNum = this.#activeLangCount > 1 ? 0 : this.#nextQuestionNum();\r\n }\r\n\r\n //пошлём событие о начале опроса\r\n this.#eventBus.next({key: SurveyEvents.seSurveyStart, data: {questionary: this.#questionary, interviewUuid: this._interview.startedAt}});\r\n\r\n //показываем вопрос\r\n this.#changeCurrentQuestion(this.#questionary!.Questions[startQuestionNum]);\r\n }\r\n\r\n on(...key: Array<string>): Observable<any> {\r\n return this.#eventBus.asObservable().pipe(\r\n filter(event => key.includes(event.key)),\r\n map(event => event.data)\r\n );\r\n }\r\n\r\n goToNextQuestion(): void {\r\n const currentQuestion = this.#currentQuestion.value;\r\n if (!currentQuestion) {\r\n return;\r\n }\r\n //если ответ на текущий вопрос не закончен, выходим\r\n if (!this._interview.questionIsComplete(currentQuestion.QuestionGuid)) {\r\n return ;\r\n }\r\n\r\n //если указан PostScript, выполним его\r\n if (!!currentQuestion.PostScript) {\r\n this._logic.executePostScript(currentQuestion.PostScript);\r\n }\r\n this.#changeCurrentQuestion(this.#questionary!.Questions[this.#nextQuestionNum()]);\r\n }\r\n\r\n goToBackQuestion(): void {\r\n this.#displayedQuestions.pop(); // удалим информацию о том что показывали этот вопрос\r\n const previousQuestionGuid = this.#displayedQuestions.pop(); // узнаем номер вопроса на который нам надо перейти, и удалим информацию что-бы не дублировать\r\n if (!!previousQuestionGuid) {\r\n const prevQuestion = this.#findQuestionByGuid(previousQuestionGuid);\r\n if (!!prevQuestion) {\r\n this.#clearAnswerForCurrentQuestion();// отчистим ответ на вопрос, если он уже есть.\r\n this.#changeCurrentQuestion(prevQuestion);\r\n }\r\n }\r\n }\r\n \r\n questionIsComplete(guid: number): boolean {\r\n const answer = this._interview.findAnswerByGuid(guid);\r\n return answer?.answerIsComplete ?? false\r\n }\r\n \r\n /*\r\n * функция по номеру вопроса, ищет ответ на этот guid, и возвращает ответ на этот вопрос.\r\n * если это ss ms, вместо номеров альтернатив подставляет текст.\r\n * работает только для eqOL, eqSS, eqMS\r\n * */\r\n guidToTextAnswer(guid: number, languageId: number): string {\r\n const answer = this.findAnswerByGuid(guid);\r\n const question = this.#findQuestionByGuid(guid);\r\n \r\n //если ответа нет, ревнём пустую строку\r\n if (!question || !answer || answer.AnswerValue === -97) {\r\n return ''\r\n }\r\n const questionType = question.QuestionType;\r\n \r\n switch (questionType) {\r\n \r\n case QuestionsType.eqOL: return answer.AnswerValue;\r\n case QuestionsType.eqSS: {\r\n //находим альтернативу и подставляем заголовок альтернативы с указанным языком, если заголовка нет, вернём alias\r\n const alternative = question.Alternativelist.find(alt => alt.Value === answer.AnswerValue);\r\n const altText = alternative?.MultiLangCaptions.find(obj => obj.lang === languageId);\r\n\r\n return (altText?.CaptionHtml || alternative?.alias) ?? '';\r\n }\r\n case QuestionsType.eqMS: {\r\n //всё то же самое, что и ss, только тут массив ответов,\r\n const answerArray = answer.AnswerValue as Array<number>;\r\n const alternativeArray = question.Alternativelist.filter(alt => answerArray.indexOf(alt.Value) > 0);\r\n const altTextArray = alternativeArray.map(alt => (alt.MultiLangCaptions.find(obj => obj.lang === languageId)?.CaptionHtml || alt.alias) ?? '');\r\n return altTextArray.join(', ');\r\n }\r\n default: return '';\r\n }\r\n }\r\n \r\n #fillOldLogic(logicVars: Array<IInterviewLogicVar>): void{\r\n //пропишем старые логические переменные\r\n if (Array.isArray(logicVars)) {\r\n logicVars.forEach(logicVarObj => {\r\n this._logic.setLogicValue(logicVarObj.nm, logicVarObj.vl);\r\n })\r\n }\r\n }\r\n \r\n #fillOldInterviewData(answerList: Array<IQuestionAnswer>): void{\r\n //пропишем старые ответы\r\n this._interview.overrideAnswers(answerList);\r\n\r\n //нужно вернуть время начала интервью, отдельно оно не сохраняется, поэтому возьмём минимальное время начала из ответов\r\n //фильтруем все вопросы у которых оно указано(>0) и трансформируем в число.\r\n const startedAtArray = answerList.filter(answer => answer.StartedAt > 0).map(answer => answer.StartedAt);\r\n\r\n //берём минимальное\r\n this._interview.startedAt = Math.min(...startedAtArray);\r\n }\r\n \r\n #changeCurrentQuestion(newQuestion: IdbQuestion): void {\r\n const currentQuestion = this.#currentQuestion.value;\r\n const currentTime = new Date().getTime();\r\n\r\n if (!!currentQuestion) {\r\n /*\r\n Сохраним время начала интервью. Фиксировать будем не с самого начала, а с ответа на первый вопрос.\r\n Потому что практика такая, открыть анкету на планшете и ходить искать респондентов и из-за этого длительность интервью может быть нерелевантно.\r\n * */\r\n if (this._interview.startedAt === 0 && currentQuestion.QuestionNum >= 0) {\r\n this._interview.startedAt = currentTime;\r\n }\r\n\r\n //нужно сохранить FinishedAt в ответах для старого вопроса\r\n const answer = this._interview.findAnswerByGuid(currentQuestion.QuestionGuid);\r\n if (!!answer) {\r\n answer.FinishedAt = currentTime;\r\n }\r\n this.#eventBus.next({key: SurveyEvents.seQuestionHide, data: currentQuestion});\r\n }\r\n this.#displayedQuestions.push(newQuestion.QuestionGuid);\r\n this.#currentQuestion.next(newQuestion);\r\n\r\n //нужно сохранить StartedAt в ответах для нового вопроса\r\n const answerNew = this._interview.findAnswerByGuid(newQuestion.QuestionGuid);\r\n if (!!answerNew) {\r\n answerNew.StartedAt = currentTime;\r\n }\r\n this.#eventBus.next({key: SurveyEvents.seQuestionShow, data: newQuestion});\r\n\r\n //если новый экран это end тогда завершаем интервью\r\n if (newQuestion.QuestionType === 'END') {\r\n this.#finishInterview();\r\n }\r\n \r\n //если это неявный вопрос и это ss или ms вопрос тогда посчитаем значения у этого вопроса\r\n if (newQuestion.Implicit) {\r\n this.#calculateImplicitQuestion(newQuestion);\r\n }\r\n }\r\n \r\n currentQuestion$(): Observable<IdbQuestion | null> {\r\n return this.#currentQuestion.asObservable();\r\n }\r\n\r\n findAnswerByGuid(guid: number): Answer | undefined {\r\n return this._interview.findAnswerByGuid(guid);\r\n }\r\n\r\n setLogicValue(varName: string, value: any): void {\r\n this._logic.setLogicValue(varName, value);\r\n }\r\n\r\n getLogicVars(): LogicObject {\r\n return this._logic.getLogicVars();\r\n }\r\n\r\n getAnswerList(): Array<Answer> {\r\n return this._interview.getAnswerList();\r\n }\r\n\r\n updateAnswer(eventData: AnswerChange): void {\r\n const answer = this._interview.findAnswerByGuid(eventData.guid);\r\n if (!answer) {\r\n return;\r\n }\r\n\r\n //вопросы которые в своем составе имеет секции, хранят ответы чуть по другому, точнее ответ на каждую секцию это отдельный объект в _interview.answerList\r\n //поэтому ответ для таких типов вопросов это [key: string]: Array<number> | number, где key(guid секции) это ответ на секцию, если key нет, секция не была показана\r\n if (this.#currentQuestion.value?.QuestionType === QuestionsType.eqSL) {\r\n const sectionList = this.#currentQuestion.value?.Sectionlist;\r\n \r\n //пройдёмся по каждой секции и если для неё есть ответ, запишем, в противном случае вместо ответа укажем -97(MISSING_VALUE)\r\n if (!!sectionList) {\r\n sectionList.forEach(section => {\r\n const sectionInterviewAnswer = this._interview.findAnswerByGuid(section.SectionGuid);\r\n if (!sectionInterviewAnswer){\r\n return\r\n }\r\n const sectionQuestionAnswer = eventData.answer ? (eventData.answer as AnswerSlType)[section.SectionGuid.toString()] : undefined;\r\n sectionInterviewAnswer.AnswerValue = sectionQuestionAnswer === undefined ? MISSING_VALUE : sectionQuestionAnswer;\r\n });\r\n }\r\n //ответ самого исходного вопроса\r\n answer.AnswerValue = eventData.answer;\r\n } else {\r\n //ответ на вопрос у которого нет секций\r\n answer.AnswerValue = eventData.answer;\r\n }\r\n \r\n //на вопрос ответили тогда когда есть все ответы и выполняется логика кнопки далее(если её указали)\r\n answer.answerIsComplete = eventData.isComplete && this.#nextButtonExpressionIsTrue();\r\n \r\n //ViewedAlternativeValues и ViewedSectionGuids. Т.к. они readonly сначала удалим, потом добавим\r\n answer.ViewedAlternativeValues.length = 0;\r\n eventData.viewedAlternativeValues.forEach(oa => answer.ViewedAlternativeValues.push(oa));\r\n \r\n answer.ViewedSectionGuids.length = 0;\r\n eventData.viewedSectionGuids.forEach(oa => answer.ViewedSectionGuids.push(oa));\r\n \r\n answer.AlternativeSequenceClicks.length = 0;\r\n eventData.alternativeSequenceClicks.forEach(oa => answer.AlternativeSequenceClicks.push(oa));\r\n \r\n \r\n Object.entries(answer.AnswerAdditional).forEach(([key]) => delete answer.AnswerAdditional[Number(key)]);\r\n Object.entries(eventData.additionalAnswers).forEach(([key, value]) => answer.AnswerAdditional[Number(key)] = value);\r\n\r\n this.updateLogic(eventData.logicVars);\r\n\r\n this.#eventBus.next({key: SurveyEvents.seQuestionAnswersChange, data: {question: this.#currentQuestion.value, answerIsComplete: answer.answerIsComplete}});\r\n\r\n //может возникнуть ситуация, когда нет ни одной альтернативы или секции для отображения.в этом случае вопрос показывать не нужно, как ответ записываем 0 и переходим на следующий\r\n const question = this.#findQuestionByGuid(eventData.guid);\r\n //ситуация когда можно сразу перейти на следующий вопрос для ss/ms вопросов и для неявных вопросов\r\n const canTransitionSSMS = (!!question && answer.answerIsComplete && (question.QuestionType === 'SS' || question.QuestionType === 'MS') && ( (eventData.viewedAlternativeValues.length === 0) || question.Implicit));\r\n\r\n const canTransitionOl = ((!!question && question?.QuestionType === QuestionsType.eqOL && (question.CanSkip ?? true) && answer.AnswerValue === 'skip'));\r\n if (canTransitionSSMS || canTransitionOl) {\r\n this.goToNextQuestion()\r\n }\r\n }\r\n\r\n updateLogic(logicVars: Record<string, any>): void{\r\n Object.entries(logicVars).forEach(([varName, value]) => {\r\n this.setLogicValue(varName, value)\r\n })\r\n }\r\n \r\n //возвращает количество активных языков\r\n get #activeLangCount(): number {\r\n //если анкета по какой-то причине ну указана, вернём 0\r\n return this.#questionary?.BaseParams.LanguageList.filter( langObj => langObj.isActive).length ?? 0;\r\n }\r\n \r\n //возвращает количество вопросов\r\n get #questionsCount(): number {\r\n return this.#questionary?.Questions.length ?? 0;\r\n }\r\n\r\n #finishInterview(): void {\r\n const currentTime = new Date();\r\n let resultDirty;\r\n try {\r\n resultDirty = this._logic.executeLogic(this.#questionary?.BaseParams.ResultativeScript ?? '');\r\n }catch (e) {\r\n resultDirty = false;\r\n }\r\n \r\n \r\n //если вопрос не был показан, удалим его ответы\r\n //такое может быть если не нажимали кнопку назад\r\n const answerList = this._interview.getAnswerList();\r\n this.#questionary?.Questions.forEach(question => {\r\n if (!this.#displayedQuestions.includes(question.QuestionGuid)) {\r\n answerList.find(answer => answer.QuestionGUID === question.QuestionGuid)?.clear();\r\n question.Sectionlist.forEach(section => {\r\n answerList.find(answer => answer.QuestionGUID === section.SectionGuid)?.clear();\r\n })\r\n }\r\n if (question.QuestionType === QuestionsType.eqSL) {\r\n const answer = answerList.find(answer => answer.QuestionGUID === question.QuestionGuid);\r\n if (answer && answer.AnswerValue !== MISSING_VALUE) {\r\n answer.AnswerValue = 1;\r\n }\r\n }\r\n })\r\n const interview: IInterviewData = {\r\n Language: 0, //todo lang\r\n SpotId: 0,\r\n DeviceId: 0,\r\n DeviceType: 0,\r\n Resultative: ResultativeStatus.rsUnset,\r\n Valid: ValidStatus.vsUnset,\r\n Wave: this.#questionary?.Info.current_wave ?? 0,\r\n QuestionaryName: this.#questionary?.Info.name ?? '',\r\n QuestionaryGuid: this.#questionary?.Info.questionary_guid ?? 0,\r\n StartedAt: this._interview.startedAt,\r\n FinishedAt: currentTime.getTime(),\r\n TineZoneBias: currentTime.getTimezoneOffset(),\r\n ResultatDirty: resultDirty,\r\n Answers: {\r\n AnsversList: Array.from(this._interview.getAnswerList())\r\n },\r\n additional_info: {\r\n QuestionaryUpdateTimestamp: new Date(this.#questionary?.Info.last_update_timestamp ?? 0).getTime() ,\r\n },\r\n ResultQuotaGuids: [],\r\n ResultQuota2dGuids: [],\r\n LogicVars: [],\r\n };\r\n\r\n const logicVars = this._logic.getLogicVars();\r\n Object.entries(logicVars).forEach(([key, value]) => interview.LogicVars.push({nm: key, vl: value}));\r\n\r\n this.#eventBus.next({key: SurveyEvents.seSurveyEnd, data: interview});\r\n }\r\n\r\n #nextQuestionNum(): number {\r\n const currentQuestion = this.#currentQuestion.value;\r\n // проверим квоты\r\n const currentGuid = currentQuestion?.QuestionGuid ?? 0;\r\n if (this.#surveyQuotas.quotaIsCompleted && !this.#surveyQuotas.guidIsDestinationQuestion(currentGuid)) {\r\n // у нас есть заполненная квота, найдем вопрос который нужно показать при заполнении квоты\r\n const destinationQ = this.#findQuestionByGuid(this.#surveyQuotas.destinationQuestionGuid);\r\n //если вопрос есть(его могли удалить из анкеты), показывает его\r\n if (!!destinationQ) {\r\n return destinationQ.QuestionNum;\r\n }\r\n }\r\n\r\n // если нет заполненной квоты, переходим на следующий вопрос, ищем следующий вопрос который мы можем отобразить (до логика может запретить показ вопроса)\r\n let nextQuestionNum = (currentQuestion?.QuestionNum ?? 0) + 1;\r\n \r\n // но сначала проверим после логику\r\n if (!!currentQuestion) {\r\n const destQ = currentQuestion.logiclist.find(logObj => (logObj.DestinationQuestionGuid > 0) && this._logic.executeLogic(logObj.LogicText) );\r\n if (!!destQ) {\r\n const destQNum = this.#findQuestionByGuid(destQ.DestinationQuestionGuid)?.QuestionNum;\r\n if (Number.isSafeInteger(destQNum)) { // вопрос мог быть удалён, а логику оставить\r\n nextQuestionNum = destQNum!;\r\n }\r\n }\r\n }\r\n\r\n // общее количество вопросов, цикл будет считать до этого количества\r\n const questionCount = this.#questionsCount;\r\n do {\r\n //потенциально следующий вопрос\r\n const q = this.#questionary!.Questions[nextQuestionNum];\r\n\r\n //если это последний вопрос или если выполняется BeforeExpression и этот вопрос не DestinationQuota, можем его показать\r\n if (q.QuestionType === QuestionsType.eqEND || (this._logic.executeLogic(q.BeforeExpression) && !this.#surveyQuotas.guidIsDestinationQuestion(q.QuestionGuid)) ) {\r\n return nextQuestionNum;\r\n }\r\n //вопрос нельзя показывать, увеличиваем счётчик текущего вопроса на 1\r\n nextQuestionNum++;\r\n } while (nextQuestionNum < questionCount - 1); // end вопрос должен всегда быть показан\r\n return nextQuestionNum;\r\n }\r\n\r\n #initiateQuestions(questionList: Array<IdbQuestion>): void{\r\n questionList.forEach(question => {\r\n //создаём пустой ответ для вопроса.\r\n const answer = this._interview.createAnswer(question.QuestionGuid, question.Version);\r\n \r\n //такого быть не должно, это ошибка\r\n if (!answer) {\r\n throw new Error('answer not found');\r\n }\r\n \r\n const logicVarSet = new Set<string>();\r\n this.#questionLogicVarContainer[question.QuestionGuid.toString()] = logicVarSet;\r\n \r\n logicVarSet.add(question.SysName);//привязываем переменную к вопросу\r\n this._logic.setLogicValue(question.SysName, MISSING_VALUE); // переменная самого вопроса\r\n\r\n //добавим доп ответы и логику для них\r\n question.AdditionalAnswerlist.forEach(aa => {\r\n const aaSysName = `${question.SysName}${aa.SysName}`;\r\n answer.AnswerAdditional[aa.Value] = null;\r\n this._logic.setLogicValue(aaSysName, MISSING_VALUE); // логика для переменных доп ответа\r\n logicVarSet.add(aaSysName); //привязываем переменную к вопросу\r\n });\r\n\r\n // если в тексте postScript есть запись типа setVar('varName', value); нужно инициализировать переменную varName значением -97.\r\n if (!!question.PostScript) {\r\n (question.PostScript.match(/(\\bsetvar\\b)\\(['|\"](.*?)['|\"]/gim) ?? []).map(scriptVar => scriptVar.match(/['|\"](.+)['|\"]/i)![1]).forEach(varName => {\r\n logicVarSet.add(varName);//привязываем переменную к вопросу\r\n this._logic.setLogicValue(varName, null)\r\n });\r\n }\r\n\r\n // для Вопросов SS/MS нужно прописать логику альтернатив sysname вопроса + sysname альтернативы\r\n if (question.Sectionlist.length <= 0) {// для Вопросов SS/MS\r\n question.Alternativelist.forEach(alt => {\r\n const aSysName = `${question.SysName}${alt.SysName}`\r\n this._logic.setLogicValue(aSysName, MISSING_VALUE);\r\n logicVarSet.add(aSysName); //привязываем переменную к вопросу\r\n });\r\n } else {\r\n //для вопросов у которых есть секции проинициализируем каждую секцию\r\n question.Sectionlist.forEach(section => {\r\n\r\n //создаём пустой ответ для секции.\r\n const answerForSection = this._interview.createAnswer(section.SectionGuid, 1);\r\n\r\n //такого быть не должно, это ошибка\r\n if (!answerForSection) {\r\n throw new Error('answer not found');\r\n }\r\n\r\n // для Вопросов SL нужно прописать логику альтернатив и секций sysname секции + sysname альтернативы\r\n this._logic.setLogicValue(section.SysName, MISSING_VALUE); // переменная самой секции\r\n logicVarSet.add(section.SysName); //привязываем переменную к вопросу\r\n\r\n //логика альтернатив SL вопроса\r\n question.Alternativelist.forEach(alt => {\r\n const aSysName = `${section.SysName}${alt.SysName}`;\r\n this._logic.setLogicValue(aSysName, MISSING_VALUE);\r\n logicVarSet.add(aSysName); //привязываем переменную к вопросу\r\n });\r\n })\r\n }\r\n })\r\n }\r\n\r\n //ищет вопрос на guid\r\n #findQuestionByGuid(guid: number): IdbQuestion | undefined {\r\n if (!this.#questionary) {\r\n return undefined;\r\n }\r\n return this.#questionary.Questions.find(q => q.QuestionGuid === guid);\r\n }\r\n \r\n #nextButtonExpressionIsTrue(): boolean{\r\n const buttonNextExpression = this.#currentQuestion.value?.BtnNextExpression ?? '';\r\n //если скрипта для кнопки далее нет, вернём true\r\n if (buttonNextExpression.trim() === '') {\r\n return true;\r\n }\r\n try {\r\n return this._logic.executeLogic(buttonNextExpression);\r\n } catch (e) {\r\n console.error(e);\r\n return false;\r\n }\r\n }\r\n\r\n #calculateImplicitQuestion(question: IdbQuestion): void {\r\n if (question.Implicit && (question.QuestionType === QuestionsType.eqSS || question.QuestionType === QuestionsType.eqMS) ) {\r\n let questionAnswer: number | Array<number>;\r\n\r\n if (question.QuestionType === QuestionsType.eqSS) {\r\n const alt = question.Alternativelist.find(alt => this._logic.executeLogic(alt.EnableExpression));\r\n questionAnswer = !!alt ? alt.Value : 0;\r\n }\r\n\r\n if (question.QuestionType === QuestionsType.eqMS) {\r\n questionAnswer = question.Alternativelist\r\n .filter(alt => this._logic.executeLogic(alt.EnableExpression))\r\n .map(alt => alt.Value);\r\n }\r\n\r\n const answerChange: AnswerChange = {\r\n guid: question.QuestionGuid,\r\n isComplete: true,\r\n answer: questionAnswer!,\r\n additionalAnswers: {},\r\n logicVars: {},\r\n viewedAlternativeValues: Array.isArray(questionAnswer!) ? questionAnswer : [questionAnswer!],\r\n viewedSectionGuids: [],\r\n alternativeSequenceClicks: []\r\n }\r\n this.updateAnswer(answerChange);\r\n }\r\n }\r\n \r\n #clearAnswerForCurrentQuestion(): void {\r\n const currentQuestionGuid = this.#currentQuestion.value?.QuestionGuid ?? -1;\r\n \r\n //удаляем сам ответ на вопрос\r\n //25.02.2023 не будем удалять ответ, будем удалять только логические переменные, а ответы на не показанные вопросы удалим при финализации интервью\r\n // this._interview.findAnswerByGuid(currentQuestionGuid)?.clear();\r\n\r\n //удаляем переменные которые относятся к этому вопросу\r\n const logicSet = this.#questionLogicVarContainer[currentQuestionGuid];\r\n if (!!logicSet) {\r\n logicSet.forEach(sysName =>this._logic.setLogicValue(sysName, MISSING_VALUE));\r\n }\r\n }\r\n}\r\n","import {Directive, HostBinding, input} from '@angular/core';\r\nimport {TpSurveyTheme} from '../../tp.survey.type';\r\n\r\n@Directive({\r\n selector: '[tpSurveyTheme]',\r\n standalone: true\r\n})\r\nexport class SurveyThemeDirective {\r\n theme = input<TpSurveyTheme>('touchpoll-light',{alias: 'tpSurveyTheme'});\r\n @HostBinding(\"class.survey-theme-touchpoll-light\") public get classTouchpollLight() {\r\n return this.theme() === 'touchpoll-light';\r\n }\r\n \r\n @HostBinding(\"class.survey-theme-cyan-orange-light\") public get classCyanOrangeLight() {\r\n return this.theme() === 'cyan-orange-light';\r\n }\r\n @HostBinding(\"class.survey-theme-cyan-orange-dark\") public get classCyanOrangeDark() {\r\n return this.theme() === 'cyan-orange-dark';\r\n }\r\n\r\n @HostBinding(\"class.survey-theme-rose-red-light\") public get classRoseRedLight() {\r\n return this.theme() === 'rose-red-light';\r\n }\r\n\r\n @HostBinding(\"class.survey-theme-rose-red-dark\") public get classRoseRedDark() {\r\n return this.theme() === 'rose-red-dark';\r\n }\r\n\r\n @HostBinding(\"class.survey-theme-azure-blue-light\") public get classAzureBlueLight() {\r\n return this.theme() === 'azure-blue-light';\r\n }\r\n\r\n @HostBinding(\"class.survey-theme-azure-blue-dark\") public get classAzureBlueDark() {\r\n return this.theme() === 'azure-blue-dark';\r\n }\r\n}\r\n\r\n","import {Directive, effect, ElementRef, inject, input, Renderer2} from '@angular/core';\r\nimport {IdbTpBackGround} from '../../tp.survey.interface';\r\n\r\n@Directive({\r\n selector: '[tpImagePosition]'\r\n})\r\nexport class ImagePositionDirective {\r\n imageBackground = input.required<IdbTpBackGround>({alias: 'tpImagePosition'});\r\n constructor() {\r\n const nativeElement = inject(ElementRef).nativeElement;\r\n const renderer = inject(Renderer2);\r\n\r\n effect(() => {\r\n switch (this.imageBackground().PositionHorizontal) {\r\n case \"left\": renderer.setStyle(nativeElement, 'grid-column', '1 / 1'); renderer.setStyle(nativeElement, 'justify-self', 'flex-start'); break;\r\n case \"center\": renderer.setStyle(nativeElement, 'grid-column', '2 / 2'); renderer.setStyle(nativeElement, 'justify-self', 'anchor-center'); break;\r\n case \"right\": renderer.setStyle(nativeElement, 'grid-column', '3 / 3'); renderer.setStyle(nativeElement, 'justify-self', 'flex-end'); break;\r\n default: renderer.setStyle(nativeElement, 'grid-column-start', 1); break;\r\n }\r\n\r\n switch (this.imageBackground().PositionVertical) {\r\n case \"top\": renderer.setStyle(nativeElement, 'grid-row', '1 / 1');break;\r\n case \"center\": renderer.setStyle(nativeElement, 'grid-row-start', 2); renderer.setStyle(nativeElement, 'align-self', 'center'); break;\r\n case \"bottom\": renderer.setStyle(nativeElement, 'grid-row', '3 / 3'); renderer.setStyle(nativeElement, 'align-self', 'flex-end'); break;\r\n default: renderer.setStyle(nativeElement, 'grid-row-start', 1); break;\r\n }\r\n });\r\n }\r\n}\r\n","import {Directive, effect, ElementRef, inject, input, Renderer2} from '@angular/core';\r\nimport {IdbTpBackGround} from '../../tp.survey.interface';\r\nimport {BreakpointObserver} from '@angular/cdk/layout';\r\n\r\n@Directive({\r\n selector: '[tpImageSize]'\r\n})\r\nexport class ImageSizeDirective {\r\n imageBackground = input.required<IdbTpBackGround>({alias: 'tpImageSize'});\r\n \r\n constructor() {\r\n const nativeElement = inject(ElementRef).nativeElement;\r\n const renderer = inject(Renderer2);\r\n const breakpointObserver = inject(BreakpointObserver);\r\n const isMobile= breakpointObserver.isMatched(\"(max-width: 480px)\");\r\n effect(() => {\r\n const height = isMobile ? this.imageBackground().MobileHeight : this.imageBackground().DesktopHeight;\r\n const width = isMobile ? this.imageBackground().MobileWidth : this.imageBackground().DesktopWidth;\r\n\r\n const normalizeHeight = this.#normalizeValue(height);\r\n const normalizeWidth = this.#normalizeValue(width);\r\n\r\n renderer.setStyle(nativeElement, 'height', normalizeHeight);\r\n renderer.setStyle(nativeElement, 'width', normalizeWidth);\r\n });\r\n }\r\n \r\n #normalizeValue(value?: number | string | 'auto' | null): string{\r\n if (!value || value === 'auto') {\r\n return 'auto';\r\n }\r\n \r\n //по умолчанию, если ввели только число, то это будет px\r\n if (typeof value === 'number') {\r\n return `${value}px`;\r\n }\r\n \r\n if (typeof value === 'string') {\r\n const stringValue = value.toLowerCase().trim();\r\n if (stringValue.endsWith('%') || stringValue.endsWith('px') || stringValue.endsWith('vh') || stringValue.endsWith('vw')) {\r\n return value;\r\n }else {\r\n return `${value}px`;\r\n }\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport {VIDEO_EXTENSION_LIST} from '../../tp.survey.const';\r\n\r\n\r\n@Pipe({\r\n name: 'isVideo'\r\n})\r\nexport class IsVideoPipe implements PipeTransform {\r\n\r\n transform(fileName: string): boolean {\r\n if (typeof fileName !== 'string') {\r\n return false;\r\n } else {\r\n const ext = (fileName.split('.').pop())?.toLowerCase() ?? '';\r\n return VIDEO_EXTENSION_LIST.includes(`.${ext}`)\r\n }\r\n\r\n }\r\n\r\n}\r\n","import {Directive, effect, ElementRef, inject, input, OnDestroy, Renderer2} from '@angular/core';\r\nimport {IdbQuestion} from '../../tp.survey.interface';\r\nimport {DOCUMENT} from '@angular/common';\r\n\r\n@Directive({\r\n selector: '[tpSurveyInsertQuestionCss]',\r\n standalone: true,\r\n})\r\nexport class InsertQuestionCssDirective {\r\n question = input.required<IdbQuestion | null>({alias: 'tpSurveyInsertQuestionCss'});\r\n constructor() {\r\n const nativeElement = inject(ElementRef).nativeElement as HTMLInputElement;\r\n const renderer = inject(Renderer2);\r\n const document = inject(DOCUMENT);\r\n\r\n //у каждого вопроса будет свой css класс, чтобы можно было переопределить стили в свойстве вопроса Css\r\n effect(() => {\r\n //если вопрос не указан, то удаляем все классы, которые начинаются с question-\r\n if (this.question()) {\r\n renderer.addClass(nativeElement, `question-${this.question()?.QuestionNum}`)\r\n } else {\r\n nativeElement.classList.forEach(className => {\r\n if (className.startsWith('question-')) {\r\n renderer.removeClass(nativeElement, className)\r\n }\r\n });\r\n }\r\n });\r\n\r\n //Если у вопроса указан Css, то добавляем его в head страницы. С селектором div.question-N. Где N - номер вопроса\r\n effect(() => {\r\n if (this.question()?.Css) {\r\n document.head.insertAdjacentHTML('beforeend',\r\n `<style>\r\n div.question-${this.question()?.QuestionNum} {\r\n ${this.question()?.Css}\r\n }\r\n </style>\r\n `);\r\n }\r\n });\r\n }\r\n}\r\n","import {ChangeDetectionStrategy, Component, computed, DestroyRef, inject, input, OnInit, output, Signal, signal, TemplateRef} from '@angular/core';\r\nimport {concatMap, delay, distinctUntilChanged, filter, from, merge, mergeMap, of} from 'rxjs';\r\nimport {NgTemplateOutlet} from '@angular/common';\r\nimport {map} from 'rxjs/operators';\r\nimport {takeUntilDestroyed, toSignal} from '@angular/core/rxjs-interop';\r\nimport {AnswerChange, ICurrentQuestionAnswer, IdbQuestion, IdbQuestionary, IInterviewAutoSaveData, IInterviewData, IInterviewProgressEvent} from '../../tp.survey.interface';\r\nimport {QuestionCaptionComponent} from '../question.caption/question.caption.component';\r\nimport {NavigationButtonComponent} from '../navigation.button/navigation.button.component';\r\nimport {ContainerAnswerComponent} from '../answer/container.answer/container.answer.component';\r\nimport {GetActiveLanguagePipe} from '../../pipe/get.active.language/get.active.language.pipe';\r\nimport {UpdateFontSizeDirective} from '../../directive/update.font.size/update.font.size.directive';\r\nimport {TpSurveyCoreService} from '../../core/tp.survey.core/tp.survey.core.service';\r\nimport {NavigationButtonDirection, TpSurveyTheme} from '../../tp.survey.type';\r\nimport {QuestionsType, SurveyEvents, ViewModel} from '../../tp.survey.enum';\r\nimport {MultiLangObjectToHtmlPipe} from '../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {SurveyThemeDirective} from '../../directive/survey.theme/survey.theme.directive';\r\nimport {ImagePositionDirective} from '../../directive/image.position/image.position.directive';\r\nimport {ImageSizeDirective} from '../../directive/image.site/image.size.directive';\r\nimport {IsVideoPipe} from '../../pipe/is.video/is.video.pipe';\r\nimport {InsertQuestionCssDirective} from '../../directive/insert.question.css/insert.question.css.directive';\r\n\r\ninterface ICurrentQuestionViewData {\r\n question: IdbQuestion | null;\r\n answers?: ICurrentQuestionAnswer;\r\n}\r\n\r\n@Component({\r\n selector: 'tp-survey-play',\r\n templateUrl: './survey.play.component.html',\r\n styleUrls: ['./survey.play.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n QuestionCaptionComponent,\r\n NavigationButtonComponent,\r\n ContainerAnswerComponent,\r\n GetActiveLanguagePipe,\r\n UpdateFontSizeDirective,\r\n NgTemplateOutlet,\r\n MultiLangObjectToHtmlPipe,\r\n SurveyThemeDirective,\r\n ImagePositionDirective,\r\n ImageSizeDirective,\r\n IsVideoPipe,\r\n InsertQuestionCssDirective\r\n ]\r\n})\r\nexport class SurveyPlayComponent implements OnInit{\r\n questionary = input.required<IdbQuestionary>();\r\n viewModel = input.required<ViewModel>();\r\n interviewAutoSaveData = input<IInterviewAutoSaveData>();\r\n theme = input<TpSurveyTheme>('cyan-orange-light');\r\n language = input<number>(2);\r\n templateNavigationRef = input<TemplateRef<any> | null>();\r\n interviewStarted = output<void>();\r\n interviewFinished = output<IInterviewData>();\r\n interviewProgress = output<IInterviewProgressEvent>();\r\n // readonly currentQuestionViewData$: Observable<ICurrentQuestionViewData>;\r\n readonly currentQuestionViewData: Signal<ICurrentQuestionViewData>;\r\n readonly question: Signal<IdbQuestion | null>;\r\n readonly activeLanguage = signal<number>(this.language())\r\n readonly viewModelE = ViewModel;\r\n readonly backButtonAvailable;\r\n readonly nextButtonAvailable;\r\n readonly #core = inject(TpSurveyCoreService);\r\n readonly #destroyRef = inject(DestroyRef);\r\n constructor() {\r\n //Проблема в том, что если идёт подряд 2 вопроса с одинаковым типом, то не удаляется. Нужно пробросить null с небольшой задержкой, чтобы движок angular`а удалял старые компоненты\r\n this.currentQuestionViewData = toSignal(this.#core.currentQuestion$().pipe(\r\n filter(res => !res?.Implicit), //если это неявный вопрос, тогда его показывать не нужно\r\n mergeMap(currentQuestion => from([null, currentQuestion]).pipe(\r\n concatMap(val => of(val).pipe(\r\n delay(val === null ? 0 : 500),\r\n )),\r\n )),\r\n //будем реагировать только когда null => вопрос и наоборот вопрос => null.\r\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\r\n map(currentQuestion => ({\r\n question: currentQuestion,\r\n answers: !currentQuestion ? undefined : {\r\n question: this.#core.findAnswerByGuid(currentQuestion.QuestionGuid),\r\n sections: currentQuestion.Sectionlist.map(section => this.#core.findAnswerByGuid(section.SectionGuid)),\r\n }\r\n })),\r\n ), { initialValue: { question: null, answers: undefined } });\r\n\r\n this.question = computed(() => this.currentQuestionViewData().question)\r\n\r\n /*\r\n * кнопка далее нужно проверять при показе вопроса и при изменении ответа. При показе она может быть доступна сразу(например info).\r\n * Кнопка доступна если ответ корректно заполнен(questionIsComplete) и это не eqEND вопрос\r\n * */\r\n this.nextButtonAvailable = toSignal(merge(\r\n this.#core.on(SurveyEvents.seQuestionAnswersChange).pipe(map(data => data.question)),\r\n this.#core.on(SurveyEvents.seQuestionShow).pipe(map(data => data))\r\n ).pipe(\r\n map(question => this.#core.questionIsComplete(question.QuestionGuid) && question.QuestionType !== QuestionsType.eqEND && question.QuestionType !== QuestionsType.eqLANG),\r\n delay(1),\r\n ), { initialValue: false });\r\n\r\n //кнопку Назад можно показывать если в настройках указали ShowBtnBack и это не eqEND вопрос\r\n this.backButtonAvailable = toSignal(this.#core.on(SurveyEvents.seQuestionShow).pipe(\r\n filter(question => !!question),\r\n map((question: IdbQuestion) => question.QuestionNum > 1 && question.ShowBtnBack && question.QuestionType !== QuestionsType.eqEND && question.QuestionType !== QuestionsType.eqLANG),\r\n delay(1),\r\n ));\r\n\r\n this.#core.on(SurveyEvents.seSurveyEnd).pipe(\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe({\r\n next: interview => {\r\n interview.Language = this.activeLanguage()\r\n this.interviewFinished.emit(interview)\r\n }\r\n });\r\n\r\n this.#core.on(SurveyEvents.seSurveyStart).pipe(\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe({\r\n next: _ => this.interviewStarted.emit()\r\n });\r\n\r\n this.#core.on(SurveyEvents.seQuestionShow).pipe(\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe({\r\n next: q => this.interviewProgress.emit({\r\n currentNum: q.QuestionNum,\r\n questionsCount: this.questionary().Questions.length,\r\n questionGuid: q.QuestionGuid,\r\n interviewData: {\r\n logicVars: this.#core.getLogicVars(),\r\n answerList: this.#core.getAnswerList(),\r\n }\r\n })\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.#core.setupSurvey(this.questionary(), this.interviewAutoSaveData()?.logic_vars, this.interviewAutoSaveData()?.answer_list, this.interviewAutoSaveData()?.question_guid, );\r\n }\r\n\r\n onNavigationButtonClick(direction: NavigationButtonDirection) {\r\n if (direction === 'next') {\r\n this.#core.goToNextQuestion()\r\n } else {\r\n this.#core.goToBackQuestion()\r\n }\r\n }\r\n\r\n onAnswerChanged(eventData: AnswerChange) {\r\n this.#core.updateAnswer(eventData);\r\n }\r\n\r\n onLogicChanged(logicVars: Record<string, any>) {\r\n this.#core.updateLogic(logicVars);\r\n }\r\n\r\n onLanguageChange(language: number) {\r\n this.activeLanguage.set(language);\r\n this.#core.goToNextQuestion();\r\n }\r\n\r\n findVariable(sysName: string): string{\r\n //Сюда могут заехать как переменные логические, типа Q_00000000000391A9, так и Q_00000000000391A9_A_001, так и \"переменные для ответов\" типа V_00000000000391A9\r\n //Переменные для ответов ищут ответ на данный вопрос, а потом подставляют туда значения (это всё пока только для SS, MS, OL вопросов)\r\n // мы можем брать значения только из заголовка вопроса, альтернативы или секции т.е. На вход могут прийти только Q1 или q1A1 или q1r1 в системном формате\r\n try {\r\n if (sysName.search(/^v_/gmi) >= 0) { // переменные для ответов типа V1\r\n const guid = Number(`0x${sysName.replace(/^v_/gmi, '')}`);\r\n return this.#core.guidToTextAnswer(guid, this.language());\r\n }\r\n //todo q_var\r\n return '';\r\n } catch (e) {\r\n return '';\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"survey-container-main survey-typography\"\r\n [tpSurveyUpdateFontSize]=\"viewModel()\"\r\n [tpSurveyTheme]=\"theme()\"\r\n [style.background-color]=\"question()?.BackgroundColor\"\r\n [tpSurveyInsertQuestionCss]=\"question()\"\r\n\r\n [class.tp-view-desktop]=\"viewModel() === viewModelE.vmDesktop\"\r\n [class.tp-view-tablet]=\"viewModel() === viewModelE.vmTablet\">\r\n\r\n @if (currentQuestionViewData(); as currentQuestionViewData) {\r\n @if (question(); as question) {\r\n <tp-survey-question-caption\r\n [caption]=\"question.MultiLangCaptions | multiLangObjectToHtml:activeLanguage():question.LogicCaptionsList: findVariable.bind(this)\"\r\n [captionHelp]=\"question.MultiLangCaptionsHelper | multiLangObjectToHtml:activeLanguage()\"/>\r\n\r\n @if (question.ImageList?.length > 0) {\r\n <div\r\n class=\"container-image\"\r\n [class.container-image-desktop]=\"viewModel() === viewModelE.vmDesktop\">\r\n @for (image of question.ImageList; track $index) {\r\n @if (image.Image.Image | isVideo) {\r\n <video [controls]=\"false\" [autoplay]=\"true\" [loop]=\"true\" [muted]=\"true\" class=\"question-video\">\r\n <source [src]=\"questionary().Info.repository_path+'/' + image.Image.Image\" type=\"video/mp4\">\r\n </video>\r\n } @else {\r\n <img\r\n alt=\"answer logo\"\r\n [tpImagePosition]=\"image.Image\"\r\n [tpImageSize]=\"image.Image\"\r\n [src]=\"questionary().Info.repository_path+'/' + image.Image.Image\"\r\n importance=\"low\" loading=\"lazy\"\r\n class=\"question-image\">\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n <tp-survey-container-answer\r\n [question]=\"question\"\r\n [language]=\"activeLanguage()\"\r\n [viewModel]=\"viewModel()\"\r\n [findVariable]=\"findVariable.bind(this)\"\r\n [answers]=\"currentQuestionViewData.answers\"\r\n [languageList]=\"questionary().BaseParams.LanguageList\"\r\n [repositoryPath]=\"questionary().Info.repository_path\"\r\n (logicChanged)=\"onLogicChanged($event)\"\r\n (onLanguageChange)=\"onLanguageChange($event)\"\r\n (answerChanged)=\"onAnswerChanged($event)\"/>\r\n }\r\n }\r\n\r\n <div class=\"container-navigation\">\r\n <div class=\"container-navigation-back\">\r\n @if (backButtonAvailable()) {\r\n <tp-survey-navigation-button\r\n direction=\"back\"\r\n [caption]=\"(questionary().BaseParams.LanguageList | getActiveLanguage: activeLanguage())?.back_button_caption\"\r\n (click)=\"onNavigationButtonClick('back')\"/>\r\n }\r\n </div>\r\n\r\n <ng-container\r\n [ngTemplateOutlet]=\"templateNavigationRef() ?? null\">\r\n </ng-container>\r\n\r\n <div class=\"container-navigation-next\">\r\n @if (nextButtonAvailable()){\r\n <tp-survey-navigation-button\r\n [caption]=\"(questionary().BaseParams.LanguageList | getActiveLanguage: activeLanguage())?.next_button_caption\"\r\n direction=\"next\"\r\n (onClick)=\"onNavigationButtonClick('next')\"/>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {Answer} from '../../core/tp.survey.answer/tp.survey.answer';\r\n\r\n@Pipe({\r\n name: 'generateDefaultAnswer'\r\n})\r\nexport class GenerateDefaultAnswerPipe implements PipeTransform {\r\n\r\n transform(guid: number): Answer {\r\n return new Answer(guid);\r\n }\r\n\r\n}\r\n","import {ChangeDetectionStrategy, Component, input, TemplateRef} from '@angular/core';\r\nimport {ContainerAnswerComponent} from '../answer/container.answer/container.answer.component';\r\nimport {QuestionCaptionComponent} from '../question.caption/question.caption.component';\r\nimport {UpdateFontSizeDirective} from '../../directive/update.font.size/update.font.size.directive';\r\nimport {TpSurveyTheme} from '../../tp.survey.type';\r\nimport {ViewModel} from '../../tp.survey.enum';\r\nimport {IdbBaseParamsLanguage, IdbQuestion} from '../../tp.survey.interface';\r\nimport {TpSurveyLogicService} from '../../core/tp.survey.logic/tp.survey.logic.service';\r\nimport {MultiLangObjectToHtmlPipe} from '../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {SurveyThemeDirective} from '../../directive/survey.theme/survey.theme.directive';\r\nimport {ImagePositionDirective} from '../../directive/image.position/image.position.directive';\r\nimport {ImageSizeDirective} from '../../directive/image.site/image.size.directive';\r\nimport {GenerateDefaultAnswerPipe} from '../../pipe/generate.default.answer/generate.default.answer.pipe';\r\n\r\n@Component({\r\n selector: 'tp-survey-question-preview',\r\n imports: [\r\n ContainerAnswerComponent,\r\n QuestionCaptionComponent,\r\n UpdateFontSizeDirective,\r\n MultiLangObjectToHtmlPipe,\r\n SurveyThemeDirective,\r\n ImagePositionDirective,\r\n ImageSizeDirective,\r\n GenerateDefaultAnswerPipe\r\n ],\r\n templateUrl: './survey.question.preview.component.html',\r\n styleUrl: './survey.question.preview.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n TpSurveyLogicService,\r\n ]\r\n})\r\nexport class SurveyQuestionPreviewComponent {\r\n question = input.required<IdbQuestion | null>();\r\n language = input.required<number>();\r\n viewModel = input.required<ViewModel>();\r\n languageList = input.required<Array<IdbBaseParamsLanguage>>();\r\n theme = input<TpSurveyTheme>('cyan-orange-light');\r\n repositoryPath = input<string>('');\r\n templateNavigationRef = input<TemplateRef<any> | null>();\r\n ViewModel = ViewModel;\r\n\r\n findVariable(sysName: string): string{\r\n //Сюда могут заехать как переменные логические, типа Q_00000000000391A9, так и Q_00000000000391A9_A_001, так и \"переменные для ответов\" типа V_00000000000391A9\r\n //Переменные для ответов ищут ответ на данный вопрос, а потом подставляют туда значения (это всё пока только для SS, MS, OL вопросов)\r\n // мы можем брать значения только из заголовка вопроса, альтернативы или секции т.е. на вход могут прийти только Q1 или q1A1 или q1r1 в системном формате\r\n try {\r\n if (sysName.search(/^v_/gmi) >= 0) { // переменные для ответов типа V1\r\n return '{value}'\r\n }\r\n //todo q_var\r\n return '';\r\n } catch (e) {\r\n return '';\r\n }\r\n }\r\n \r\n protected readonly viewModelE = ViewModel;\r\n}\r\n","<div\r\n class=\"survey-container-main survey-typography\"\r\n [tpSurveyUpdateFontSize]=\"viewModel()\"\r\n [tpSurveyTheme]=\"theme()\"\r\n [class.tp-view-desktop]=\"viewModel() === ViewModel.vmDesktop\"\r\n [class.tp-view-tablet]=\"viewModel() === ViewModel.vmTablet\">\r\n\r\n @if (question(); as question) {\r\n <tp-survey-question-caption\r\n [caption]=\"question.MultiLangCaptions | multiLangObjectToHtml:language()\"\r\n [captionHelp]=\"question.MultiLangCaptionsHelper | multiLangObjectToHtml:language()\"/>\r\n\r\n @if (question.ImageList?.length > 0) {\r\n <div\r\n class=\"container-image\"\r\n [class.container-image-desktop]=\"viewModel() === viewModelE.vmDesktop\">\r\n @for (image of question.ImageList; track $index) {\r\n <img\r\n alt=\"answer logo\"\r\n [tpImagePosition]=\"image.Image\"\r\n [tpImageSize]=\"image.Image\"\r\n [src]=\"repositoryPath() + '/' + image.Image.Image\"\r\n importance=\"low\" loading=\"lazy\"\r\n class=\"question-image\">\r\n }\r\n </div>\r\n }\r\n\r\n <tp-survey-container-answer\r\n [question]=\"question\"\r\n [language]=\"language()\"\r\n [answers]=\"{question:question.QuestionGuid | generateDefaultAnswer, sections: []}\"\r\n [findVariable]=\"findVariable.bind(this)\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [developerMode]=\"true\"\r\n [viewModel]=\"viewModel()\"\r\n [languageList]=\"languageList()\"/>\r\n }\r\n</div>\r\n","/*\r\n * Public API Surface of tp.survey\r\n */\r\n\r\n// export * from './lib/tp.survey.service';\r\n\r\nexport * from './lib/tp.survey.module';\r\nexport * from './lib/component/survey.play/survey.play.component';\r\nexport * from './lib/component/survey.question.preview/survey.question.preview.component';\r\nexport * from './lib/tp.survey.config';\r\nexport * from './lib/tp.survey.const';\r\nexport * from './lib/tp.survey.type';\r\nexport * from './lib/tp.survey.interface';\r\nexport * from './lib/tp.survey.enum';\r\nexport * from './lib/tp.survey.method';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.TpSurveyLogicService","i1","i1.TpSurveyLogicService","i2.TpSurveyInterviewService"],"mappings":"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"}
1
+ {"version":3,"file":"touchpoll-tp-survey.mjs","sources":["../../../projects/tp.survey/src/lib/tp.survey.config.ts","../../../projects/tp.survey/src/lib/icons/default.icons/default.icons.ts","../../../projects/tp.survey/src/lib/icons/default.icons/default.icons.module.ts","../../../projects/tp.survey/src/lib/tp.survey.module.ts","../../../projects/tp.survey/src/lib/component/question.caption/question.caption.component.ts","../../../projects/tp.survey/src/lib/component/question.caption/question.caption.component.html","../../../projects/tp.survey/src/lib/component/navigation.button/navigation.button.component.ts","../../../projects/tp.survey/src/lib/component/navigation.button/navigation.button.component.html","../../../projects/tp.survey/src/lib/tp.survey.const.ts","../../../projects/tp.survey/src/lib/component/answer/container.answer/container.answer.validator.ts","../../../projects/tp.survey/src/lib/core/tp.survey.logic/tp.survey.logic.service.ts","../../../projects/tp.survey/src/lib/pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe.ts","../../../projects/tp.survey/src/lib/tp.survey.enum.ts","../../../projects/tp.survey/src/lib/component/answer/answer.master/answer.master.component.ts","../../../projects/tp.survey/src/lib/directive/alternatives.container/alternatives.container.directive.ts","../../../projects/tp.survey/src/lib/pipe/get.question.image.background.size/get.question.image.background.css.size.pipe.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ss/answer.ss.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ss/answer.ss.component.html","../../../projects/tp.survey/src/lib/component/answer/answer.info/answer.info.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ms/answer.ms.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ms/answer.ms.component.html","../../../projects/tp.survey/src/lib/component/answer/answer.additional/directive/additional.answer.caption.position/additional.answer.caption.position.directive.ts","../../../projects/tp.survey/src/lib/component/answer/answer.additional/answer.additional.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.additional/answer.additional.component.html","../../../projects/tp.survey/src/lib/component/answer/answer.end/answer.end.component.ts","../../../projects/tp.survey/src/lib/directive/focus.and.select/focus.and.select.directive.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ol/answer.ol.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.ol/answer.ol.component.html","../../../projects/tp.survey/src/lib/component/answer/answer.sl/pipe/as.form.array/as.form.array.pipe.ts","../../../projects/tp.survey/src/lib/component/answer/answer.sl/pipe/as.form.control/as.form.control.pipe.ts","../../../projects/tp.survey/src/lib/component/answer/answer.sl/answer.sl.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.sl/answer.sl.component.html","../../../projects/tp.survey/src/lib/component/answer/answer.od/answer.od.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.od/answer.od.component.html","../../../projects/tp.survey/src/lib/pipe/get.additional.value.by.value/get.additional.value.by.value.pipe.ts","../../../projects/tp.survey/src/lib/pipe/key.values/key.values.pipe.ts","../../../projects/tp.survey/src/lib/component/answer/answer.lang/answer.lang.component.ts","../../../projects/tp.survey/src/lib/component/answer/answer.lang/answer.lang.component.html","../../../projects/tp.survey/src/lib/component/answer/container.answer/container.answer.component.ts","../../../projects/tp.survey/src/lib/component/answer/container.answer/container.answer.component.html","../../../projects/tp.survey/src/lib/pipe/get.active.language/get.active.language.pipe.ts","../../../projects/tp.survey/src/lib/directive/update.font.size/update.font.size.directive.ts","../../../projects/tp.survey/src/lib/tp.survey.method.ts","../../../projects/tp.survey/src/lib/core/tp.servey.quota/tp.survey.quota.ts","../../../projects/tp.survey/src/lib/core/tp.survey.answer/tp.survey.answer.ts","../../../projects/tp.survey/src/lib/core/tp.survey.interview/tp.survey.interview.service.ts","../../../projects/tp.survey/src/lib/core/tp.survey.core/tp.survey.core.service.ts","../../../projects/tp.survey/src/lib/directive/survey.theme/survey.theme.directive.ts","../../../projects/tp.survey/src/lib/directive/image.position/image.position.directive.ts","../../../projects/tp.survey/src/lib/directive/image.site/image.size.directive.ts","../../../projects/tp.survey/src/lib/pipe/is.video/is.video.pipe.ts","../../../projects/tp.survey/src/lib/directive/insert.question.css/insert.question.css.directive.ts","../../../projects/tp.survey/src/lib/component/survey.play/survey.play.component.ts","../../../projects/tp.survey/src/lib/component/survey.play/survey.play.component.html","../../../projects/tp.survey/src/lib/pipe/generate.default.answer/generate.default.answer.pipe.ts","../../../projects/tp.survey/src/lib/component/survey.question.preview/survey.question.preview.component.ts","../../../projects/tp.survey/src/lib/component/survey.question.preview/survey.question.preview.component.html","../../../projects/tp.survey/src/public-api.ts","../../../projects/tp.survey/src/touchpoll-tp-survey.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\r\nimport {TpSurveyPlatform} from './tp.survey.type';\r\n\r\n\r\n\r\nexport interface TpSurveyConfig {\r\n tpPlatform: TpSurveyPlatform;\r\n}\r\n\r\n\r\n\r\n/**\r\n * A DI token for the survey service.\r\n *\r\n * @publicApi\r\n */\r\nexport const TP_SURVEY_CONFIGURATION = new InjectionToken<TpSurveyConfig>('__TOUCHPOLL_SURVEY_CONFIGURATION_TOKEN__')\r\n","export const defaultIcons = {\r\n 'iconButtonNext': `\r\n <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z\"/>\r\n `,\r\n 'iconButtonBack': `\r\n <path d=\"M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z\"/>\r\n `,\r\n 'iconIsMute': `\r\n <path d=\"M7.6,4H4A3,3,0,0,0,1,7H1a3,3,0,0,0,3,3H7.6a7.9,7.9,0,0,1,3.9,1L15,13V1L11.4,3A7.9,7.9,0,0,1,7.6,4Z\" fill=\"none\" stroke=\"#444\" stroke-linejoin=\"round\" stroke-width=\"2\"/>\r\n <path d=\"M6,10v2.9a4,4,0,0,0,.3,1.5L7,17\" fill=\"none\" stroke=\"#444\" stroke-linejoin=\"round\" stroke-width=\"4\"/>\r\n <path d=\"M15,4h.1A1.9,1.9,0,0,1,17,5.9V8.1A1.9,1.9,0,0,1,15.1,10H15a0,0,0,0,1,0,0V4A0,0,0,0,1,15,4Z\" fill=\"none\" stroke=\"#444\" stroke-linejoin=\"round\" stroke-width=\"2\"/>\r\n <line x1=\"1\" y1=\"1\" x2=\"17\" y2=\"17\" fill=\"none\" stroke=\"#444\" stroke-linejoin=\"round\" stroke-width=\"2\"/>\r\n `,\r\n}\r\n","import {Inject, NgModule, PLATFORM_ID} from '@angular/core';\r\nimport {isPlatformServer} from '@angular/common';\r\nimport {DomSanitizer} from '@angular/platform-browser';\r\nimport {MatIconRegistry} from '@angular/material/icon';\r\nimport {defaultIcons} from './default.icons';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n})\r\nexport class DefaultIconsModule {\r\n constructor(private domSanitizer: DomSanitizer, private matIconRegistry: MatIconRegistry, @Inject(PLATFORM_ID) private platformId: string) {\r\n for (const [name, svgText] of Object.entries(defaultIcons)) {\r\n const iconText: string = `<svg viewBox=\"0 0 24 24\">${isPlatformServer(this.platformId) ? '' : svgText}</svg>`;\r\n this.matIconRegistry.addSvgIconLiteral(name, this.domSanitizer.bypassSecurityTrustHtml(iconText));\r\n }\r\n }\r\n}\r\n","import {ModuleWithProviders, NgModule} from '@angular/core';\r\nimport {TP_SURVEY_CONFIGURATION, TpSurveyConfig} from './tp.survey.config';\r\nimport {DefaultIconsModule} from './icons/default.icons/default.icons.module';\r\nimport {TpSurveyCoreService} from './core/tp.survey.core/tp.survey.core.service';\r\n\r\n@NgModule({\r\n imports: [\r\n DefaultIconsModule\r\n ]\r\n})\r\nexport class TpSurveyModule {\r\n // #docregion for-root\r\n static forRoot(config: TpSurveyConfig): ModuleWithProviders<TpSurveyModule> {\r\n return {\r\n ngModule: TpSurveyModule,\r\n providers: [\r\n {provide: TP_SURVEY_CONFIGURATION, useValue: config }\r\n ]\r\n };\r\n }\r\n}\r\n","import {ChangeDetectionStrategy, Component, input} from '@angular/core';\r\nimport {SafeHtml} from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'tp-survey-question-caption',\r\n templateUrl: './question.caption.component.html',\r\n styleUrls: ['./question.caption.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n})\r\nexport class QuestionCaptionComponent {\r\n caption = input<SafeHtml>();\r\n captionHelp = input<SafeHtml>();\r\n}\r\n","<div class=\"container-main\">\r\n <div [innerHTML]= \"caption()\" class=\"question-caption-font survey-object-caption\"></div>\r\n <div [innerHTML]= \"captionHelp()\" class=\"question-caption-helper-font survey-object-caption\"></div>\r\n</div>\r\n","import {ChangeDetectionStrategy, Component, input, output} from '@angular/core';\r\nimport {MatButton} from '@angular/material/button';\r\nimport {MatIcon} from '@angular/material/icon';\r\nimport {NavigationButtonDirection} from '../../tp.survey.type';\r\n\r\n@Component({\r\n selector: 'tp-survey-navigation-button',\r\n imports: [\r\n MatButton,\r\n MatIcon\r\n ],\r\n templateUrl: './navigation.button.component.html',\r\n styleUrl: './navigation.button.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class NavigationButtonComponent {\r\n direction = input.required<NavigationButtonDirection>()\r\n caption = input<string>();\r\n onClick = output<NavigationButtonDirection>()\r\n}\r\n\r\n","<button mat-flat-button (click)=\"onClick.emit(direction())\" class=\"navigation-button\">\r\n @if (direction() === 'back') {\r\n <mat-icon svgIcon=\"iconButtonBack\" aria-hidden=\"false\" class=\"navigation-button-icon\"/>\r\n }\r\n\r\n <span class=\"navigation-button-label\">{{ caption() }}</span>\r\n\r\n @if (direction() === 'next') {\r\n <mat-icon iconPositionEnd svgIcon=\"iconButtonNext\" aria-hidden=\"false\" class=\"navigation-button-icon\"/>\r\n }\r\n</button>\r\n\r\n","export const MISSING_VALUE = -97;\r\nexport const VIDEO_EXTENSION_LIST = ['.mpg','.webm','.ogv','.asx','.mpeg','.m4v', '.mp4', '.mov', '.avi', '.mkv', '.wmv', '.flv'];\r\n\r\n\r\nexport const BASE_WIDTH = 1280;\r\nexport const BASE_HEIGHT = 800;\r\n\r\nexport const LOGIC_FUNC_TEXT = `\r\n const self = this;\r\n var setVar = function(varName, value) {\r\n self[varName] = value\r\n };\r\n var FUNC_IN = function(varName, array) {\r\n return isNaN(parseInt(varName)) ? false : array.indexOf(varName) > -1\r\n };\r\n var FUNC_INTERSECT = function (var1, var2) {\r\n return Array.isArray(var1) && Array.isArray(var2) ? var1.some(function(el1) {\r\n return var2.some(function (el2) {\r\n return el2 === el1;\r\n });\r\n }) : false;\r\n };\r\n var value = function(varName, defaultValue) {\r\n const defVal = !defaultValue ? 0 : defaultValue;\r\n if ( (varName === -97) || (varName === null) || (varName === undefined) ) {\r\n return defVal\r\n } else {\r\n return varName\r\n }\r\n }\r\n for (var p in this) eval(\"var \" + p + \" = this[p];\"); `;\r\n","import {AbstractControl, ValidatorFn} from '@angular/forms';\r\nimport {MISSING_VALUE} from '../../../tp.survey.const';\r\nimport {IdbSection} from '../../../tp.survey.interface';\r\n\r\nexport const answerDefaultValidator = (): ValidatorFn => {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n //ответ не число, такого быть не может, это ошибка\r\n if ((control.value === null) || (control.value === MISSING_VALUE) ) {\r\n return {answerRequired: true}\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n };\r\n};\r\n\r\nexport const answerODValidator = (minValue: number | null, maxValue: number | null): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n //ответ не число, такого быть не может, это ошибка\r\n if (!Number.isSafeInteger(control.value)) {\r\n return {answerOdAnswerType: true}\r\n }\r\n //Нужно проверить 2 ситуации.\r\n //1 В настройках вопроса указали minValue, тогда введённое число должно быть больше minValue.\r\n //2 В настройках вопроса указали maxValue, тогда введённое число должно быть меньше maxValue.\r\n //Если эти условия не выполняются, то это ошибка.\r\n if ( (Number.isSafeInteger(minValue) && control.value < minValue!) || (Number.isSafeInteger(maxValue) && (maxValue ?? 0 > 0) && control.value > maxValue!) ) {\r\n return {answerOdAnswerError: true}\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n\r\nexport const answerOLValidator = (isPhoneNumber: boolean, canSkip: boolean): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n const text = typeof control.value !== 'string' ? '' : control.value.trim();\r\n //Нужно, чтобы в поле ввели хоть что-то.\r\n if ( text.length === 0 && !canSkip) {\r\n return {answerOlAnswerError: true}\r\n }\r\n\r\n if (isPhoneNumber) {\r\n const res = text.length === 9 && !isNaN(Number(text)) || text === 'skip';\r\n if (!res) {\r\n return {answerOlTelephoneFormatError: true}\r\n }\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n\r\n\r\nexport const answerSSValidator = (): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n //ответ не число, такого быть не может, это ошибка\r\n if (!Number.isSafeInteger(control.value)) {\r\n return {answerSsAnswerType: true}\r\n }\r\n\r\n //нет ответа\r\n if (control.value < 0) {\r\n return {answerMissing: true}\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n\r\n\r\nexport const answerMSValidator = (visibleAlternativeCount: number, minCount: number = 1, maxCount: number = 0): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n //visibleAlternativeCount - количество альтернатив на экране, если 0, то смысла показывать вопрос нет\r\n //minCount - Минимальное количество ответов, которое может выбрать респондент, по умолчанию 1.\r\n //maxCount - Максимальное количество ответов, которые может выбрать респондент. Если указано 0, количество не ограничено. По умолчанию 0\r\n\r\n if (visibleAlternativeCount === 0) {\r\n return null;\r\n }\r\n\r\n //ответ не массив, такого быть не может, это ошибка\r\n if (!Array.isArray(control.value)) {\r\n return {answerMsAnswerType: true}\r\n }\r\n\r\n //количество ответов\r\n const count = control.value.length;\r\n\r\n //проверяем minCount\r\n if (count < minCount) {\r\n return {answerMsMinCount: true}\r\n }\r\n\r\n //проверяем maxCount\r\n if (maxCount > 0 && count > maxCount) {\r\n return {answerMsMaxCount: true}\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n\r\nexport const answerSlValidator = (required: boolean, minAnswersCount: number, sectionList: Array<IdbSection>): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n //если ответы для каждой секции необязательны, ничего не проверяем и выходим.\r\n if (!required) {\r\n return null;\r\n }\r\n if (!control.value) {\r\n return {answerMissing: true};\r\n }\r\n\r\n //если хоть 1 сессия не имеет значения(или количество выбранных альтернатив меньше minAnswersCount), тогда ответ на вопрос не полный.\r\n const hasMissingAnswers = sectionList.some(section => {\r\n const sectionAnswers = control.value[section.SectionGuid.toString()];\r\n if (!sectionAnswers) {\r\n return true;\r\n } else{\r\n return Array.isArray(sectionAnswers) ? sectionAnswers.length === 0 || (minAnswersCount > 1 && sectionAnswers.length < minAnswersCount) : sectionAnswers === 0;\r\n }\r\n });\r\n if (hasMissingAnswers) {\r\n return {answerMissing: true};\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n\r\nexport const additionalAnswerDefaultValidator = (required: boolean): ValidatorFn => {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n if ( (control.value === null || (typeof control.value === 'string' && control.value.trim().length === 0)) && required) {\r\n return { additionalAnswerRequired: true}\r\n }\r\n //ошибок нет, всё корректно\r\n return null;\r\n };\r\n};\r\n\r\nexport const additionalAnswerNumberValidator = (required: boolean, minValue: number | null, maxValue: number | null): ValidatorFn => (control: AbstractControl): {[key: string]: any} | null => {\r\n //ответ не обязательный, можно не контролировать\r\n if (!required) {\r\n return null;\r\n }\r\n\r\n //ответ не число, такого быть не может, это ошибка\r\n if (!Number.isSafeInteger(control.value)) {\r\n return {additionalAnswerType: true}\r\n }\r\n\r\n //Нужно проверить 2 ситуации.\r\n //1 В настройках вопроса указали minValue, тогда введённое число должно быть больше minValue.\r\n //2 В настройках вопроса указали maxValue, тогда введённое число должно быть меньше maxValue.\r\n //Если эти условия не выполняются, то это ошибка.\r\n if ( (Number.isSafeInteger(minValue) && control.value < minValue!) || (Number.isSafeInteger(maxValue) && control.value > maxValue!) ) {\r\n return {answerOdAnswerError: true}\r\n }\r\n\r\n //ошибок нет, всё корректно\r\n return null;\r\n};\r\n","import {Injectable} from '@angular/core';\r\nimport {LOGIC_FUNC_TEXT} from '../../tp.survey.const';\r\nimport {LogicObject} from '../../tp.survey.type';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TpSurveyLogicService {\r\n #vars: LogicObject = Object.create(null);\r\n\r\n get vars(): object {\r\n return this.#vars;\r\n }\r\n\r\n setLogicValue(varName: string, value: any): void {\r\n this.#vars[varName] = value;\r\n }\r\n\r\n getLogicVars(): LogicObject{\r\n return {...this.#vars};\r\n }\r\n\r\n executeLogic(expression?: string): boolean {\r\n try {\r\n const textExpression = typeof expression !== 'string' ? '' : expression.trim();\r\n return !textExpression ? true : new Function(`${LOGIC_FUNC_TEXT} return ${textExpression}`).call(this.#vars);\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n executePostScript(expression?: string): void {\r\n try {\r\n const textExpression = typeof expression !== 'string' ? '' : expression.trim();\r\n new Function(`${LOGIC_FUNC_TEXT} ${textExpression}`).call(this.#vars);\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n }\r\n}\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {DomSanitizer, SafeHtml} from '@angular/platform-browser';\r\nimport {IdbLogicCaptionObject, IdbMultilangObject} from '../../tp.survey.interface';\r\nimport {TpSurveyLogicService} from '../../core/tp.survey.logic/tp.survey.logic.service';\r\nimport {TFindVariableVoid} from '../../tp.survey.type';\r\n\r\n@Pipe({\r\n name: 'multiLangObjectToHtml',\r\n standalone: true\r\n})\r\nexport class MultiLangObjectToHtmlPipe implements PipeTransform {\r\n\r\n constructor(private readonly _sanitizer: DomSanitizer, private readonly _logic: TpSurveyLogicService) {\r\n }\r\n\r\n transform(caption: Array<IdbMultilangObject>, language: number, logicCaptions?: Array<IdbLogicCaptionObject>, findVariable?: TFindVariableVoid): SafeHtml {\r\n //сначала проверим есть ли текст у которого выполняется Expression.\r\n if (Array.isArray(logicCaptions)){\r\n const correctLogicCaption = logicCaptions.find(logicCaption => this._logic.executeLogic(logicCaption.Expression));\r\n const correctLogicCaptionLangObj = correctLogicCaption?.MultiLangCaptions.find(capt => capt.lang === language);\r\n const text = correctLogicCaptionLangObj?._SYS_CaptionHTML ?? correctLogicCaptionLangObj?.CaptionHtml ?? '';\r\n\r\n //если есть хоть какой-то текст - показываем его\r\n if ((text ?? '').trim().length > 0){\r\n return this._sanitizer.bypassSecurityTrustHtml(text);\r\n }\r\n }\r\n\r\n //если основой текст не указан, выходим\r\n if (!Array.isArray(caption)) {\r\n return ''\r\n }\r\n\r\n //ищем основной текс с нужным языком\r\n const langObj = caption.find(capt => capt.lang === language);\r\n const dirtyHtmlText = langObj?._SYS_CaptionHTML ?? langObj?.CaptionHtml ?? '';\r\n \r\n const normalizeHtmlText = dirtyHtmlText.replace(/(q_\\w{16}_A_\\w{3}|q_\\w{16}|v_\\w{16})/gmi, sysName => {\r\n const caption = !!findVariable ? findVariable(sysName) : 'unknown';\r\n const newDiv = document.createElement(\"div\");\r\n newDiv.innerHTML = caption;\r\n newDiv.textContent;\r\n return newDiv.textContent ?? '';\r\n });\r\n\r\n\r\n const res = this._sanitizer.bypassSecurityTrustHtml(normalizeHtmlText);\r\n return res;\r\n }\r\n\r\n}\r\n","export enum ViewModel {\r\n vmDesktop = 1, // desktop view\r\n vmMobile = 2, // phone view\r\n vmTablet = 3, // tablet view\r\n}\r\n\r\nexport enum SurveyEvents {\r\n seSurveyStart = 'survey.start', // on start survey\r\n seSurveyViewModelUpdate = 'survey.view.model.update', // on viewmodel updated\r\n seSurveyDeveloperModeUpdate = 'survey.developer.mode.update', // on Developermode updated\r\n seSurveyEnd = 'survey.end', // on end survey\r\n seQuestionShow = 'question.show', // before question show\r\n seQuestionHide = 'question.hide', // before question hide\r\n seQuestionRefresh = 'question.refresh', // refresh question (after edit)\r\n seQuestionAnswersCompleted = 'answers.completed', // after all answers complete\r\n seQuestionAnswersChange = 'answers.change', // after answers change\r\n seSurveyLanguageUpdate = 'survey.language.update' // on survey language updated\r\n}\r\n\r\nexport enum AdditionalAnswerType {\r\n aatNumber = 1,\r\n aatText = 2,\r\n aatBoolean = 3,\r\n}\r\n\r\nexport enum QuestionsType {\r\n eqLANG = 'LANG',\r\n eqSS = 'SS',\r\n eqMS = 'MS',\r\n eqINFO = 'INFO',\r\n eqSL = 'SL',\r\n eqOL = 'OL',\r\n eqOD = 'OD',\r\n eqEND = 'END',\r\n}\r\n\r\n\r\nexport enum ResultativeStatus {\r\n rsUnset = -1,\r\n rsUnresultative = 0,\r\n rsResultative = 1,\r\n}\r\n\r\nexport enum ValidStatus {\r\n vsUnset = -1,\r\n vsUnValid = 0,\r\n vsValid = 1,\r\n vsDoubtful = 2\r\n}\r\n","import {ChangeDetectionStrategy, Component, DestroyRef, forwardRef, inject, input} from '@angular/core';\r\nimport {ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR} from '@angular/forms';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {AnswerT, TFindVariableVoid} from '../../../tp.survey.type';\r\nimport {ViewModel} from '../../../tp.survey.enum';\r\n\r\n@Component({\r\n selector: 'app-answer-master',\r\n template: '',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerMasterComponent),\r\n multi: true\r\n },\r\n ],\r\n\r\n})\r\nexport abstract class AnswerMasterComponent<T extends AnswerT> implements ControlValueAccessor {\r\n language = input.required<number>();\r\n viewModel = input.required<ViewModel>();\r\n findVariable = input.required<TFindVariableVoid>();\r\n repositoryPath = input<string>('');\r\n viewModelE = ViewModel;\r\n control: FormControl<T | null>;\r\n protected onModelChange = (data: T) => {};\r\n protected onModelTouched = () => {};\r\n protected readonly destroyRef = inject(DestroyRef);\r\n constructor() {\r\n this.control = new FormControl(null);\r\n this.control.valueChanges.pipe(\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe(res => {\r\n this.onModelChange(res!);\r\n })\r\n }\r\n \r\n registerOnChange(fn: (data: T) => void): void {\r\n this.onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onModelTouched();\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n }\r\n \r\n writeValue(value: T): void {\r\n this.control.patchValue(value, {emitEvent: false});\r\n }\r\n \r\n skipClick(): void{\r\n this.control.patchValue( 'skip' as T, {emitEvent: true});\r\n }\r\n}\r\n","import {ContentChildren, DestroyRef, Directive, effect, ElementRef, inject, input, QueryList, Renderer2} from '@angular/core';\r\nimport {IdbQuestion} from '../../tp.survey.interface';\r\nimport {ViewModel} from '../../tp.survey.enum';\r\nimport {BASE_HEIGHT, BASE_WIDTH} from '../../tp.survey.const';\r\nimport {BreakpointObserver, BreakpointState} from '@angular/cdk/layout';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {map} from 'rxjs/operators';\r\n\r\n@Directive({\r\n selector: '[tpSurveyAlternativesContainer]',\r\n standalone: true\r\n})\r\nexport class AlternativesContainerDirective {\r\n question = input.required<IdbQuestion>( {alias: 'tpSurveyAlternativesContainer'});\r\n viewModel = input.required<ViewModel>({alias: 'containerViewModel'});\r\n @ContentChildren('tablet_alt', {read: ElementRef}) alternatives: QueryList<ElementRef<HTMLElement>> | undefined;\r\n readonly #destroyRef = inject(DestroyRef);\r\n constructor(private readonly _renderer: Renderer2,private readonly elementRef: ElementRef, private _breakpointObserver: BreakpointObserver) {\r\n effect(() => {\r\n if (this.viewModel() === ViewModel.vmTablet) {\r\n this.#updateTabletLayout();\r\n } else {\r\n this.#updateDesktopLayout();\r\n }\r\n })\r\n }\r\n\r\n #updateDesktopLayout(): void {\r\n this._breakpointObserver.observe([\"(max-width: 480px)\"]).pipe(\r\n map((result: BreakpointState) => result.matches),\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe((isMobile: boolean) => {\r\n let columnCount: number;\r\n if (isMobile) {\r\n columnCount = this.question().MobileViewAlternativeColumnCount || 1; //if 0 will be 1\r\n } else {\r\n columnCount = this.question().AlternativeColumnCount || 1; //if 0 will be 1\r\n }\r\n this._renderer.setStyle(this.elementRef.nativeElement, 'grid-template-columns', `repeat(${columnCount}, 10fr)`);\r\n });\r\n }\r\n \r\n #updateTabletLayout(): void {\r\n if (!this.alternatives) {\r\n return;\r\n }\r\n \r\n if (this.viewModel() === ViewModel.vmTablet) {\r\n const question = this.question();\r\n const transformToPer = (newVal: number, containerSideSize: number): number => newVal * 100 / containerSideSize; // превращает размер px в %\r\n \r\n const containerWidthFull = this.elementRef.nativeElement.offsetWidth;\r\n const containerHeightFull = this.elementRef.nativeElement.offsetHeight;\r\n \r\n const alternativeColumnCount = question.TabletViewAlternativeColumnCount ?? 1;\r\n \r\n const horizontalRatio = containerWidthFull / BASE_WIDTH;\r\n const verticalRatio = containerHeightFull / BASE_HEIGHT;\r\n \r\n const maxAlternativeWidth: number = containerWidthFull * 0.7; // для авторазмера установим максимальный размер альтернативы в 70% от доступной длинны контейнера\r\n \r\n const alternativesCount = Math.max(this.alternatives.length, 1);\r\n \r\n const horizontalDistance = question.AlternativeHorizontalDistance ?? 10 * horizontalRatio;\r\n const verticalDistance = (question.AlternativeVerticalDistance ?? 10) * verticalRatio;\r\n const marginTop = question.AlternativeMarginTop ?? 10 * verticalRatio;\r\n const marginLeft = (question.AlternativeMarginLeft ?? 0) * horizontalRatio;\r\n const columnCount: number = alternativeColumnCount > alternativesCount ? alternativesCount : alternativeColumnCount;\r\n const rowCount: number = Math.round(alternativesCount / columnCount);\r\n \r\n const defaultHorizontalPadding = 10 * horizontalRatio;\r\n \r\n let width = 0;\r\n let height = 0;\r\n \r\n if (question.AlternativeAutoSize ?? true) { // если авторазмер, то высоту и ширину считаем автоматом\r\n const marginsWidth = horizontalDistance * (columnCount - 1) + defaultHorizontalPadding * 2;\r\n width = Math.min((containerWidthFull - marginsWidth) / columnCount, maxAlternativeWidth);\r\n height = this.alternatives.reduce((maxHeight, alt) => { // узнаем максимальную высоту альтернативы\r\n const altWidthPercent = transformToPer(width, containerWidthFull);\r\n this._renderer.setStyle(alt.nativeElement, 'width', `${altWidthPercent}%`);\r\n return Math.max(maxHeight, alt.nativeElement.clientHeight) ;\r\n }, 0);\r\n } else { // если авторазмер отключён, размеры берём из настроек\r\n width = question.AlternativeWidth ?? 300;\r\n height = question.AlternativeHeight ?? 50;\r\n }\r\n \r\n const deltaVertical = containerHeightFull - height * rowCount - verticalDistance * (rowCount - 1);\r\n const deltaHorizontal = (containerWidthFull - width * columnCount - horizontalDistance * (columnCount - 1)) / 2 - defaultHorizontalPadding;\r\n let rowNum = -1;\r\n let colNum = 0;\r\n \r\n this.alternatives.forEach((alt, index) => {\r\n let left = 0;\r\n let top = 0;\r\n if (question.AlternativeAutoArrange) {\r\n const isNewRow = (index) % columnCount === 0;\r\n if (isNewRow) {\r\n rowNum++;\r\n colNum = 0;\r\n }\r\n left = marginLeft + colNum * width + colNum * horizontalDistance + deltaHorizontal + defaultHorizontalPadding ;\r\n top = marginTop + rowNum * height + rowNum * verticalDistance + deltaVertical / 2 ;\r\n colNum++;\r\n } else {\r\n const altObj = question.Alternativelist[index];\r\n if (!!altObj) {\r\n left = altObj.x;\r\n top = altObj.y;\r\n if (!question.AlternativeAutoSize) {\r\n width = altObj.width > 0 ? altObj.width : question.AlternativeWidth;\r\n height = altObj.height > 0 ? altObj.height : question.AlternativeHeight;\r\n }\r\n }\r\n }\r\n this._renderer.setStyle(alt.nativeElement, 'width', `${transformToPer(width, containerWidthFull)}%`);\r\n this._renderer.setStyle(alt.nativeElement, 'height', `${transformToPer(height, containerHeightFull)}%`);\r\n this._renderer.setStyle(alt.nativeElement, 'left', `${transformToPer(left, containerWidthFull)}%`);\r\n this._renderer.setStyle(alt.nativeElement, 'top', `${transformToPer(top, containerHeightFull)}%`);\r\n });\r\n } else {\r\n this.alternatives.forEach((alt) => {\r\n this._renderer.setStyle(alt.nativeElement, 'width', ``);\r\n this._renderer.setStyle(alt.nativeElement, 'height', ``);\r\n this._renderer.setStyle(alt.nativeElement, 'left', ``);\r\n this._renderer.setStyle(alt.nativeElement, 'top', ``);\r\n });\r\n }\r\n }\r\n\r\n}\r\n","import {inject, Pipe, PipeTransform} from '@angular/core';\r\nimport {IdbQuestion} from '../../tp.survey.interface';\r\nimport {BreakpointObserver} from '@angular/cdk/layout';\r\n\r\n@Pipe({\r\n name: 'getQuestionImageBackgroundCssSize',\r\n standalone: true\r\n})\r\nexport class GetQuestionImageBackgroundCssSizePipe implements PipeTransform {\r\n #breakpointObserver = inject(BreakpointObserver);\r\n \r\n transform(question: IdbQuestion): {height: string | null, width: string | null} {\r\n const isMobile= this.#breakpointObserver.isMatched(\"(max-width: 480px)\");\r\n const height = isMobile ? question.MobileViewAlternativeBackgroundImageHeight : question.AlternativeBackgroundImageHeight;\r\n const width = isMobile ? question.MobileViewAlternativeBackgroundImageWidth : question.AlternativeBackgroundImageWidth;\r\n\r\n return {\r\n height: this.#normalizeValue(height),\r\n width: this.#normalizeValue(width),\r\n };\r\n }\r\n \r\n #normalizeValue(value: string | null): string{\r\n if (!value || typeof value !== 'string' ) {\r\n return 'auto';\r\n } else {\r\n value = value.toLowerCase().trim();\r\n if (value.endsWith('%') || value.endsWith('px') || value.endsWith('vh') || value.endsWith('vw')) {\r\n return value;\r\n }else {\r\n return `${value}px`;\r\n }\r\n }\r\n \r\n }\r\n\r\n}\r\n","import {ChangeDetectionStrategy, Component, forwardRef, input, output,} from '@angular/core';\r\nimport {MatRadioButton, MatRadioGroup} from '@angular/material/radio';\r\nimport {NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {MatIcon} from '@angular/material/icon';\r\nimport {MultiLangObjectToHtmlPipe} from '../../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\nimport {IdbAlternative, IdbQuestion} from '../../../tp.survey.interface';\r\nimport {AlternativesContainerDirective} from '../../../directive/alternatives.container/alternatives.container.directive';\r\nimport {GetQuestionImageBackgroundCssSizePipe} from '../../../pipe/get.question.image.background.size/get.question.image.background.css.size.pipe';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-ss',\r\n templateUrl: './answer.ss.component.html',\r\n styleUrls: ['./answer.ss.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatRadioGroup,\r\n ReactiveFormsModule,\r\n MatRadioButton,\r\n MultiLangObjectToHtmlPipe,\r\n MatIcon,\r\n AlternativesContainerDirective,\r\n GetQuestionImageBackgroundCssSizePipe\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerSSComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerSSComponent extends AnswerMasterComponent<number>{\r\n question = input.required<IdbQuestion>();\r\n alternativeList = input.required<Array<IdbAlternative>>();\r\n onAlternativeClick = output<number>();\r\n}\r\n\r\n\r\n","<mat-radio-group\r\n class=\"container-ms-ss-alternatives\"\r\n [tpSurveyAlternativesContainer] = \"question()\"\r\n [containerViewModel]=\"viewModel()\"\r\n [formControl]=\"control\">\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <mat-radio-button\r\n #tablet_alt\r\n class=\"alternative-ss-ms tp-survey-radio-button\"\r\n [style.font-size.%]=\"viewModel() === viewModelE.vmTablet ? question().AlternativeTabletFontSize : undefined\"\r\n [value]=\"alt.Value\"\r\n (change)=\"onAlternativeClick.emit($event.value)\">\r\n @if (alt.IsMute) {\r\n <mat-icon class=\"icon-is-mute\" svgIcon=\"iconIsMute\"></mat-icon>\r\n }\r\n <div class=\"container-caption\" [class.container-image]=\"!!alt.BackGround.Image\">\r\n @if (alt.BackGround.Image) {\r\n @let imageSize = question() | getQuestionImageBackgroundCssSize;\r\n <img alt=\"answer logo\" [style.height]=\"imageSize.height\" [style.width]=\"imageSize.width\" [src]=\"repositoryPath()+'/' + alt.BackGround.Image\" importance=\"low\" loading=\"lazy\" class=\"answer-image\">\r\n }\r\n <span class=\"alternative-ss-ms-caption survey-object-caption\" [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </div>\r\n </mat-radio-button>\r\n }\r\n</mat-radio-group>\r\n\r\n","import {Component, forwardRef} from '@angular/core';\r\nimport {NG_VALUE_ACCESSOR} from '@angular/forms';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-info',\r\n template: '',\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerInfoComponent),\r\n multi: true\r\n },\r\n ],\r\n})\r\nexport class AnswerInfoComponent extends AnswerMasterComponent<number>{\r\n}\r\n\r\n\r\n","import {AfterViewInit, ChangeDetectorRef, Component, forwardRef, inject, input, output} from '@angular/core';\r\nimport {FormArray, FormControl, FormGroup, NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {MatCheckbox} from '@angular/material/checkbox';\r\nimport {map} from 'rxjs/operators';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {MatIcon} from '@angular/material/icon';\r\nimport {filter, tap} from 'rxjs';\r\nimport {MultiLangObjectToHtmlPipe} from '../../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\nimport {IdbAlternative, IdbQuestion} from '../../../tp.survey.interface';\r\nimport {AlternativesContainerDirective} from '../../../directive/alternatives.container/alternatives.container.directive';\r\nimport {GetQuestionImageBackgroundCssSizePipe} from '../../../pipe/get.question.image.background.size/get.question.image.background.css.size.pipe';\r\n\r\ninterface IAnswerMSForm {\r\n alternativeList: FormArray<FormControl<boolean>>;\r\n}\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-ms',\r\n templateUrl: './answer.ms.component.html',\r\n styleUrls: ['./answer.ms.component.scss'],\r\n imports: [\r\n ReactiveFormsModule,\r\n MatCheckbox,\r\n MultiLangObjectToHtmlPipe,\r\n MatIcon,\r\n AlternativesContainerDirective,\r\n GetQuestionImageBackgroundCssSizePipe,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerMSComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerMSComponent extends AnswerMasterComponent<Array<number>> implements AfterViewInit{\r\n question = input.required<IdbQuestion>();\r\n alternativeList = input.required<Array<IdbAlternative>>();\r\n alternativeMaxAnswersCount = input.required<number>();\r\n onAlternativeClick = output<number>();\r\n readonly answerMSForm: FormGroup<IAnswerMSForm>;\r\n readonly #ref = inject(ChangeDetectorRef);\r\n constructor() {\r\n super();\r\n this.answerMSForm = new FormGroup<IAnswerMSForm>({\r\n alternativeList: new FormArray<FormControl<boolean>>([])\r\n })\r\n }\r\n\r\n\r\n ngAfterViewInit(): void {\r\n const alternativeList = this.alternativeList();\r\n const answerAsArray: Array<number> = Array.isArray(this.control.value) ? this.control.value : [];\r\n const maxCount = this.alternativeMaxAnswersCount();\r\n this.answerMSForm.controls.alternativeList.clear({emitEvent: false});\r\n alternativeList.forEach( alt => {\r\n const control = new FormControl<boolean>( answerAsArray.includes(alt.Value), {nonNullable: true});\r\n\r\n //У альтернативы есть понятие \"Группа\". Группа это число. Если выбирают альтернативу с определённой группой, то альтернативы с другой группой должны быть отжаты.\r\n control.valueChanges.pipe(\r\n filter(value => value),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe( {\r\n next: () => this.#uncheckControlsWithOtherGroup(alt.GroupNo)\r\n });\r\n\r\n this.answerMSForm.controls.alternativeList.push(control, {emitEvent: false});\r\n });\r\n\r\n this.answerMSForm.controls.alternativeList.valueChanges.pipe(\r\n map((_) => {\r\n const checkedArray = this.answerMSForm.controls.alternativeList.controls.map(c => c.value) ?? [];\r\n return this.alternativeList()\r\n .map(alt => alt.Value)\r\n .filter((_, index) => checkedArray[index] )\r\n }),\r\n tap(answerArray => this.#disableExtraControls(answerArray.length, maxCount)),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe({\r\n next: res => this.control.patchValue(res, {emitEvent: true})\r\n });\r\n \r\n this.#ref.detectChanges();\r\n }\r\n\r\n //отжимает контролы у которых отличается номер группы\r\n #uncheckControlsWithOtherGroup(groupNumber: number): void {\r\n //сначала отбираем контролы у которых другая группа.\r\n const otherGroupAlternativesList = this.alternativeList()\r\n .map((alt, altIndex) => ({alternative: alt, index: altIndex}) ) //нужен индекс, по нему проще выбирать контролы в answerMSForm.controls.alternativeList\r\n .filter(data => data.alternative.GroupNo !== groupNumber); //контролы у которых другая группа\r\n\r\n //\"отжимаем галочку\"\r\n otherGroupAlternativesList.forEach(data => {\r\n const altControl = this.answerMSForm.controls.alternativeList.at(data.index);\r\n altControl.patchValue(false, {emitEvent: false})\r\n })\r\n }\r\n \r\n //дизейблит контроли если выбрали максимальное количество или енейблит если выбрали не максимальное количество\r\n #disableExtraControls(currentCount:number, maxCount: number): void{\r\n //если в настройках анкеты указали что максимальное возможное количество выбранных альтернатив = 0, но ничего контролировать не надо.\r\n if (maxCount === 0) {\r\n return\r\n }\r\n this.alternativeList().forEach((_, altIndex) => {\r\n const isDisable = currentCount >= maxCount;\r\n const control = this.answerMSForm.controls.alternativeList.at(altIndex);\r\n if (isDisable) {\r\n //надо дизейблить те которые не выбраны\r\n if (!control.value) {\r\n control.disable({emitEvent: false})\r\n }\r\n } else {\r\n //лимита нет, можно выбирать все\r\n control.enable({emitEvent: false})\r\n }\r\n })\r\n }\r\n}\r\n","<ng-container [formGroup]=\"answerMSForm\">\r\n\r\n <div\r\n class=\"container-ms-ss-alternatives\"\r\n [tpSurveyAlternativesContainer] = \"question()\"\r\n [containerViewModel]=\"viewModel()\"\r\n formArrayName=\"alternativeList\">\r\n @for (alt of answerMSForm.controls.alternativeList.controls; track alt; let indx = $index) {\r\n <mat-checkbox\r\n #tablet_alt\r\n [formControl]=\"alt\"\r\n [style.font-size.%]=\"viewModel() === viewModelE.vmTablet ? question().AlternativeTabletFontSize : undefined\"\r\n (change)=\"onAlternativeClick.emit(alternativeList()[indx].Value)\"\r\n class=\"alternative-ss-ms tp-survey-checkbox\">\r\n @if (alternativeList()[indx].IsMute) {\r\n <mat-icon class=\"icon-is-mute\" svgIcon=\"iconIsMute\"></mat-icon>\r\n }\r\n <div class=\"container-caption\" [class.container-image]=\"!!alternativeList()[indx].BackGround.Image\">\r\n @if (alternativeList()[indx].BackGround.Image) {\r\n @let imageSize = question() | getQuestionImageBackgroundCssSize;\r\n <img alt=\"answer logo\" [style.height]=\"imageSize.height\" [style.width]=\"imageSize.width\" [src]=\"repositoryPath()+'/' + alternativeList()[indx].BackGround.Image\" importance=\"low\" loading=\"lazy\" class=\"answer-image\">\r\n }\r\n <span class=\"alternative-ss-ms-caption survey-object-caption\" [innerHTML]= \"alternativeList()[indx].MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </div>\r\n </mat-checkbox>\r\n }\r\n </div>\r\n</ng-container>\r\n","import {Directive, HostBinding, input} from '@angular/core';\r\nimport {AdditionalAnswerCaptionPosition} from '../../../../../tp.survey.type';\r\nimport {AdditionalAnswerType} from '../../../../../tp.survey.enum';\r\n\r\n@Directive({\r\n selector: '[tpSurveyAdditionalAnswerCaptionPosition]',\r\n standalone: true\r\n})\r\nexport class AdditionalAnswerCaptionPositionDirective{\r\n tpSurveyAdditionalAnswerCaptionPosition = input<AdditionalAnswerCaptionPosition>();\r\n tpSurveyAdditionalAnswerType = input<AdditionalAnswerType>();\r\n @HostBinding(\"class.caption-align-bottom\") public get classBottom() {\r\n return this.tpSurveyAdditionalAnswerCaptionPosition() === 'bottom';\r\n }\r\n @HostBinding(\"class.caption-align-top\") public get classTop() {\r\n return this.tpSurveyAdditionalAnswerCaptionPosition() === 'top';\r\n }\r\n @HostBinding(\"class.caption-align-left\") public get classLeft() {\r\n return this.tpSurveyAdditionalAnswerCaptionPosition() === 'left';\r\n }\r\n @HostBinding(\"class.caption-align-right\") public get classRight() {\r\n return this.tpSurveyAdditionalAnswerCaptionPosition() === 'right';\r\n }\r\n \r\n @HostBinding(\"class.answer-type-number\") public get classTypeNumber() {\r\n return this.tpSurveyAdditionalAnswerType() === AdditionalAnswerType.aatNumber;\r\n }\r\n \r\n @HostBinding(\"class.answer-type-text\") public get classTypeText() {\r\n return this.tpSurveyAdditionalAnswerType() === AdditionalAnswerType.aatText;\r\n }\r\n \r\n @HostBinding(\"class.answer-type-boolean\") public get classTypeBoolean() {\r\n return this.tpSurveyAdditionalAnswerType() === AdditionalAnswerType.aatBoolean;\r\n }\r\n}\r\n","import {Component, forwardRef, input,} from '@angular/core';\r\nimport {FormControl, NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {MatFormField} from '@angular/material/form-field';\r\nimport {MatInput} from '@angular/material/input';\r\nimport {SafeHtml} from '@angular/platform-browser';\r\nimport {CdkTextareaAutosize} from '@angular/cdk/text-field';\r\nimport {MatCheckbox} from '@angular/material/checkbox';\r\nimport {AdditionalAnswerCaptionPositionDirective} from './directive/additional.answer.caption.position/additional.answer.caption.position.directive';\r\nimport {AdditionalAnswer, AdditionalAnswerCaptionPosition} from '../../../tp.survey.type';\r\nimport {AdditionalAnswerType} from '../../../tp.survey.enum';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-additional',\r\n templateUrl: './answer.additional.component.html',\r\n styleUrls: ['./answer.additional.component.scss'],\r\n imports: [\r\n MatFormField,\r\n MatInput,\r\n ReactiveFormsModule,\r\n AdditionalAnswerCaptionPositionDirective,\r\n CdkTextareaAutosize,\r\n MatCheckbox,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerAdditionalComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerAdditionalComponent { //ControlValueAccessor\r\n // control = input.required<FormControl<AdditionalAnswer>>();\r\n control = input.required<FormControl<AdditionalAnswer>>();\r\n answerType = input.required<AdditionalAnswerType>()\r\n caption = input<SafeHtml>('');\r\n numberMinValue = input<number | null>(null);\r\n numberMaxValue = input<number | null>(null);\r\n textMultiline = input<boolean>(false);\r\n captionPosition = input<AdditionalAnswerCaptionPosition>('top');\r\n additionalAnswerType = AdditionalAnswerType;\r\n}\r\n","<div class=\"container-main\" [tpSurveyAdditionalAnswerCaptionPosition]=\"captionPosition()\" [tpSurveyAdditionalAnswerType]=\"answerType()\" >\r\n <span [innerHTML]= \"caption()\" class=\"answer-caption survey-object-caption\"></span>\r\n @switch (answerType()) {\r\n @case (additionalAnswerType.aatNumber) {\r\n <mat-form-field class=\"tp-survey-input\" appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <input [formControl]=\"control()\" matInput [step]=\"1\" [min]=\"numberMinValue()\" [max]=\"numberMaxValue()\" type=\"number\">\r\n </mat-form-field>\r\n }\r\n\r\n @case (additionalAnswerType.aatText) {\r\n <mat-form-field appearance=\"outline\" class=\"tp-survey-input\" subscriptSizing=\"dynamic\">\r\n @if (textMultiline()) {\r\n <textarea\r\n [formControl]=\"control()\"\r\n cdkAutosizeMaxRows=\"5\"\r\n cdkAutosizeMinRows=\"3\"\r\n cdkTextareaAutosize matInput>\r\n </textarea>\r\n } @else {\r\n <input [formControl]=\"control()\" matInput type=\"text\">\r\n }\r\n </mat-form-field>\r\n }\r\n @case (additionalAnswerType.aatBoolean) {\r\n <mat-checkbox\r\n [formControl]=\"control()\"\r\n [class.answer-checkbox-center] = \"captionPosition() === 'left' || captionPosition() === 'right'\"\r\n class=\"tp-survey-checkbox\">\r\n </mat-checkbox>\r\n }\r\n }\r\n</div>\r\n","import {Component, forwardRef} from '@angular/core';\r\nimport {NG_VALUE_ACCESSOR} from '@angular/forms';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-end',\r\n template: '',\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerEndComponent),\r\n multi: true\r\n },\r\n ],\r\n})\r\n\r\nexport class AnswerEndComponent extends AnswerMasterComponent<number>{\r\n}\r\n","import {Directive, ElementRef, OnInit} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[tpSurveyFocusAndSelect]',\r\n standalone: true\r\n})\r\nexport class FocusAndSelectDirective implements OnInit{\r\n constructor(private el: ElementRef) {\r\n if (!el.nativeElement['focus']) {\r\n throw new Error('Element does not accept focus.');\r\n }\r\n }\r\n \r\n ngOnInit(): void {\r\n const input: HTMLInputElement = this.el.nativeElement as HTMLInputElement;\r\n if ('focus' in input) {\r\n input.focus();\r\n input.select();\r\n }\r\n }\r\n}\r\n","import {Component, forwardRef, input} from '@angular/core';\r\nimport {FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {MatFormField, MatPrefix} from '@angular/material/form-field';\r\nimport {MatInput} from '@angular/material/input';\r\nimport {FocusAndSelectDirective} from '../../../directive/focus.and.select/focus.and.select.directive';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\nimport {MatButton} from '@angular/material/button';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-ol',\r\n templateUrl: './answer.ol.component.html',\r\n styleUrls: ['./answer.ol.component.scss'],\r\n imports: [\r\n FocusAndSelectDirective,\r\n FormsModule,\r\n MatFormField,\r\n MatInput,\r\n ReactiveFormsModule,\r\n MatPrefix,\r\n MatButton\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerOLComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerOLComponent extends AnswerMasterComponent<number | 'skip'>{\r\n telephoneInput= input<boolean>(false);\r\n canSkip= input<boolean>(false);\r\n}\r\n","<div class=\"container-main\">\r\n @if (telephoneInput()) {\r\n <mat-form-field appearance=\"outline\">\r\n <input\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n matInput\r\n [formControl]=\"control\" tpSurveyFocusAndSelect>\r\n <span matTextPrefix>+380 &nbsp;</span>\r\n </mat-form-field>\r\n @if(canSkip()) {\r\n <button mat-button (click)=\"skipClick()\">Пропустити</button>\r\n }\r\n\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"input-text\">\r\n <textarea rows=\"10\" matInput [formControl]=\"control\" tpSurveyFocusAndSelect></textarea>\r\n </mat-form-field>\r\n\r\n<!-- <mat-form-field class=\"container-controls\" appearance=\"outline\">-->\r\n<!-- <textarea rows=\"10\" autofocus matInput [(ngModel)]=\"answer.AnswerValue\" (ngModelChange)=\"answerChange()\" appFocusAndSelect></textarea>-->\r\n<!-- </mat-form-field>-->\r\n }\r\n\r\n<!-- <mat-form-field appearance=\"outline\" class=\"input-od-number\">-->\r\n<!-- <input [formControl]=\"control\" tpSurveyFocusAndSelect matInput type=\"number\">-->\r\n<!-- </mat-form-field>-->\r\n</div>\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {FormArray, FormControl} from '@angular/forms';\r\n\r\n@Pipe({\r\n name: 'asFormArray',\r\n standalone: true\r\n})\r\nexport class AsFormArrayPipe implements PipeTransform {\r\n\r\n transform(value: any): FormArray<FormControl<boolean>> {\r\n return value;\r\n }\r\n\r\n}\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {FormControl} from '@angular/forms';\r\n\r\n@Pipe({\r\n name: 'asFormControl',\r\n standalone: true\r\n})\r\nexport class AsFormControlPipe implements PipeTransform {\r\n \r\n transform(value: any): FormControl<number> {\r\n return value;\r\n }\r\n\r\n}\r\n","import {AfterViewInit, booleanAttribute, ChangeDetectorRef, Component, forwardRef, inject, input, numberAttribute} from '@angular/core';\r\nimport {FormArray, FormControl, FormGroup, NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {MatCheckbox} from '@angular/material/checkbox';\r\nimport {KeyValuePipe} from '@angular/common';\r\nimport {MatRadioButton, MatRadioGroup} from '@angular/material/radio';\r\nimport {map} from 'rxjs/operators';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {filter, tap} from 'rxjs';\r\nimport {MultiLangObjectToHtmlPipe} from '../../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {AsFormArrayPipe} from './pipe/as.form.array/as.form.array.pipe';\r\nimport {AsFormControlPipe} from './pipe/as.form.control/as.form.control.pipe';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\nimport {AnswerSlType} from '../../../tp.survey.type';\r\nimport {IdbAlternative, IdbQuestion, IdbSection} from '../../../tp.survey.interface';\r\nimport {GetQuestionImageBackgroundCssSizePipe} from '../../../pipe/get.question.image.background.size/get.question.image.background.css.size.pipe';\r\n\r\ninterface IAnswerSLForm {\r\n [key: string]: FormArray<FormControl<boolean>> | FormControl<number> | FormControl<Array<number>>\r\n}\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-sl',\r\n templateUrl: './answer.sl.component.html',\r\n styleUrls: ['./answer.sl.component.scss'],\r\n imports: [\r\n MultiLangObjectToHtmlPipe,\r\n MatCheckbox,\r\n ReactiveFormsModule,\r\n KeyValuePipe,\r\n AsFormArrayPipe,\r\n MatRadioButton,\r\n MatRadioGroup,\r\n AsFormControlPipe,\r\n GetQuestionImageBackgroundCssSizePipe\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerSLComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerSLComponent extends AnswerMasterComponent<AnswerSlType> implements AfterViewInit{\r\n question = input.required<IdbQuestion>();\r\n alternativeList = input.required<Array<IdbAlternative>>();\r\n sectionList = input.required<Array<IdbSection>>();\r\n multiSelect = input(false, {transform: booleanAttribute});\r\n maxCount = input(0, {transform: numberAttribute});\r\n answerSLForm = new FormGroup<IAnswerSLForm>({})\r\n readonly #ref = inject(ChangeDetectorRef);\r\n ngAfterViewInit(): void {\r\n const multiSelect = this.multiSelect();\r\n const answer = this.control.value;\r\n this.sectionList().forEach(section => {\r\n const sectionAnswer = answer ? answer[section.SectionGuid] : [];\r\n const sectionControl = this.#createSectionRowControl(multiSelect, sectionAnswer );\r\n this.answerSLForm!.addControl(section.SectionGuid.toString(), sectionControl, );\r\n })\r\n\r\n this.answerSLForm.valueChanges.pipe(\r\n map((fullAnswer) => {\r\n let res: Record<string, Array<number> | number> = {};\r\n //Если в настройках указали мультивыбор для секции, то в данной реализации, при изменении форма возвращает массив boolean?, true/false, нажата отжата.\r\n //Этот массив нужно конвертировать в массив number, в котором будут только нажатые альтернативы.\r\n if (this.multiSelect()) {\r\n Object.entries(fullAnswer).forEach(([key]) => {\r\n const sectionAnswerCheckedArray = this.answerSLForm.get(key)?.value;\r\n res[key] = this.alternativeList()\r\n .map(alt => alt.Value)\r\n .filter((_, index) => sectionAnswerCheckedArray[index] )\r\n });\r\n } else {\r\n //если единичный выбор для секции, то ответ просто исходное значение.\r\n res = fullAnswer as Record<string, number>;\r\n }\r\n return res;\r\n }),\r\n tap(() => this.#disableExtraControls(this.maxCount())),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe({\r\n next: res => this.control.patchValue(res, {emitEvent: true})\r\n });\r\n this.#ref.detectChanges();\r\n }\r\n\r\n #createSectionRowControl(multiSelect: boolean, answers: number | Array<number>): FormArray<FormControl<boolean>> | FormControl<number> {\r\n if (multiSelect) {\r\n const msArray = new FormArray<FormControl<boolean>>([]);\r\n const answerAsArray = Array.isArray(answers) ? Array.from(answers) : [];\r\n\r\n this.alternativeList().forEach((alt) => {\r\n const control= new FormControl<boolean>( answerAsArray.includes(alt.Value), {nonNullable: true});\r\n msArray.push(control, {emitEvent: false});\r\n\r\n //В режиме multiSelect у альтернативы есть понятие \"Группа\". Группа это число. Если выбирают альтернативу с определённой группой, то альтернативы с другой группой должны быть отжаты.\r\n //Логика такая же как и в ms вопросе\r\n control.valueChanges.pipe(\r\n filter(value => value && this.multiSelect()),\r\n takeUntilDestroyed(this.destroyRef),\r\n ).subscribe({\r\n next: () => {\r\n //сначала отбираем контролы у которых другая группа.\r\n const otherGroupAlternativesList = this.alternativeList()\r\n .map((alt, altIndex) => ({alternative: alt, index: altIndex}) ) //нужен индекс, по нему проще выбирать контролы в msArray\r\n .filter(data => data.alternative.GroupNo !== alt.GroupNo); //контролы у которых другая группа\r\n\r\n //\"отжимаем галочку\"\r\n otherGroupAlternativesList.forEach(data => {\r\n const altControl = msArray.controls.at(data.index);\r\n altControl!.patchValue(false, {emitEvent: false})\r\n });\r\n }\r\n })\r\n });\r\n return msArray;\r\n } else {\r\n return new FormControl<number>(Number(answers), {nonNullable: true});\r\n }\r\n }\r\n\r\n //дизейблит контроли если выбрали максимальное количество или енейблит если выбрали не максимальное количество\r\n #disableExtraControls(maxCount: number): void{\r\n //если в настройках анкеты указали что максимальное возможное количество выбранных альтернатив = 0, но ничего контролировать не надо.\r\n if (maxCount === 0 || !this.multiSelect()) {\r\n return\r\n }\r\n\r\n this.sectionList().forEach(sec => {\r\n const sectionControlArray = this.answerSLForm.get(sec.SectionGuid.toString()) as FormArray<FormControl<boolean>>;\r\n const values = sectionControlArray.value;\r\n const checkedCount = values.filter(v => v).length;\r\n\r\n sectionControlArray.controls.forEach(control => {\r\n if (checkedCount >= maxCount && !control.value) {\r\n control.disable({emitEvent: false})\r\n } else {\r\n control.enable({emitEvent: false})\r\n }\r\n })\r\n\r\n })\r\n }\r\n}\r\n","<table class=\"default-view\" [formGroup]=\"answerSLForm\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <th class=\"SLAlternativeCaption\">\r\n <div class=\"container-caption-desktop\">\r\n <span [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\" class=\"survey-object-caption\"></span>\r\n @if (alt.BackGround.Image){\r\n @let imageSize = question() | getQuestionImageBackgroundCssSize;\r\n <img alt=\"answer logo\" [style.height]=\"imageSize.height\" [style.width]=\"imageSize.width\" [src]=\"repositoryPath()+'/' + alt.BackGround.Image\" importance=\"low\" loading=\"lazy\" class=\"answer-image\">\r\n }\r\n </div>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (secControl of answerSLForm.controls | keyvalue; track secControl.key; let sectionIndex = $index) {\r\n @if (multiSelect()){\r\n <tr>\r\n <td>\r\n <span [innerHTML]= \"sectionList()[sectionIndex].MultiLangCaptions | multiLangObjectToHtml:language()\" class=\"survey-object-caption\"></span>\r\n </td>\r\n @for (alternativeControl of (secControl.value | asFormArray).controls ; track alternativeControl) {\r\n <td>\r\n <mat-checkbox\r\n [formControl]=\"alternativeControl\"\r\n class=\"alternative-sl tp-survey-checkbox\"/>\r\n </td>\r\n }\r\n </tr>\r\n } @else {\r\n <mat-radio-group [formControl]=\"secControl.value | asFormControl\" class=\"single-select-row\">\r\n <td class=\"single-select-item\">\r\n <span [innerHTML]= \"sectionList()[sectionIndex].MultiLangCaptions | multiLangObjectToHtml:language()\" class=\"survey-object-caption\"></span>\r\n </td>\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <td class=\"single-select-item\">\r\n <mat-radio-button\r\n class=\"alternative-sl tp-survey-radio-button\"\r\n [value]=\"alt.Value\">\r\n </mat-radio-button>\r\n </td>\r\n }\r\n </mat-radio-group>\r\n }\r\n }\r\n </tbody>\r\n</table>\r\n\r\n<div class=\"mobile-view\" [formGroup]=\"answerSLForm\">\r\n @for (secControl of answerSLForm.controls | keyvalue; track secControl.key; let secIndex = $index) {\r\n <div class=\"mobile-view-section-row\" [formArrayName]=\"secControl.key\">\r\n <span [innerHTML]= \"sectionList()[secIndex].MultiLangCaptions | multiLangObjectToHtml:language()\" class=\"mobile-view-section-caption section-sl-caption survey-object-caption\"></span>\r\n @if (multiSelect()) {\r\n <div class=\"mobile-view-alternative-list\">\r\n @for (alternativeControl of (secControl.value | asFormArray).controls; track alternativeControl; let altIndex = $index) {\r\n <mat-checkbox\r\n [formControl]=\"alternativeControl\"\r\n class=\"alternative-sl tp-survey-checkbox\">\r\n <div class=\"container-caption-mobile\">\r\n @if (alternativeList()[altIndex].BackGround.Image){\r\n @let imageSize = question() | getQuestionImageBackgroundCssSize;\r\n <img alt=\"answer logo\" [style.height]=\"imageSize.height\" [style.width]=\"imageSize.width\" [src]=\"repositoryPath()+'/' + alternativeList()[altIndex].BackGround.Image\" importance=\"low\" loading=\"lazy\" class=\"answer-image\">\r\n }\r\n <span class=\"alternative-sl-caption survey-object-caption\" [innerHTML]= \"alternativeList()[altIndex].MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </div>\r\n </mat-checkbox>\r\n }\r\n </div>\r\n } @else {\r\n <mat-radio-group\r\n class=\"mobile-view-alternative-list\"\r\n [formControl]=\"secControl.value | asFormControl\">\r\n @for (alt of alternativeList(); track alt.Value; let index = $index) {\r\n <mat-radio-button\r\n class=\"tp-survey-radio-button\"\r\n [value]=\"alt.Value\">\r\n <div class=\"container-caption-mobile\">\r\n @if (alt.BackGround.Image){\r\n @let imageSize = question() | getQuestionImageBackgroundCssSize;\r\n <img alt=\"answer logo\" [style.height]=\"imageSize.height\" [style.width]=\"imageSize.width\" [src]=\"repositoryPath()+'/' + alt.BackGround.Image\" importance=\"low\" loading=\"lazy\" class=\"answer-image\">\r\n }\r\n <span class=\"alternative-sl-caption survey-object-caption\" [innerHTML]= \"alt.MultiLangCaptions | multiLangObjectToHtml:language()\"></span>\r\n </div>\r\n\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import {Component, forwardRef, input} from '@angular/core';\r\nimport {MatFormField} from '@angular/material/form-field';\r\nimport {MatInput} from '@angular/material/input';\r\nimport {NG_VALUE_ACCESSOR, ReactiveFormsModule} from '@angular/forms';\r\nimport {FocusAndSelectDirective} from '../../../directive/focus.and.select/focus.and.select.directive';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-od',\r\n templateUrl: './answer.od.component.html',\r\n styleUrls: ['./answer.od.component.scss'],\r\n imports: [\r\n MatFormField,\r\n ReactiveFormsModule,\r\n FocusAndSelectDirective,\r\n MatInput,\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AnswerODComponent),\r\n multi: true\r\n },\r\n ]\r\n})\r\nexport class AnswerODComponent extends AnswerMasterComponent<number> {\r\n minValue = input<number>(1);\r\n maxValue = input<number | null>(null);\r\n}\r\n","<div class=\"container-main\">\r\n <mat-form-field appearance=\"outline\" class=\"input-od-number\">\r\n <input [formControl]=\"control\" [min]=\"minValue()\" [max]=\"maxValue()\" tpSurveyFocusAndSelect matInput type=\"number\">\r\n </mat-form-field>\r\n</div>\r\n\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {IdbAdditionalAnswer} from '../../tp.survey.interface';\r\n\r\n@Pipe({\r\n name: 'getAdditionalValueByValue',\r\n standalone: true\r\n})\r\nexport class GetAdditionalValueByValuePipe implements PipeTransform {\r\n\r\n transform(value: number | string, additionalAnswerList: Array<IdbAdditionalAnswer>): IdbAdditionalAnswer | undefined {\r\n const val = (typeof value === 'string') ? Number(value): value;\r\n return additionalAnswerList.find(aa => aa.Value === val);\r\n }\r\n\r\n}\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {AbstractControl, FormControl, FormGroup} from '@angular/forms';\r\nimport {AdditionalAnswer} from '../../tp.survey.type';\r\n\r\n@Pipe({\r\n name: 'keyValues',\r\n standalone: true\r\n})\r\nexport class KeyValuesPipe implements PipeTransform {\r\n\r\n transform(controls: FormGroup<{[key: string]: AbstractControl<AdditionalAnswer>}>): Array<{name: string, control: FormControl<AdditionalAnswer>}> {\r\n return Object.entries(controls).map(([key, control]) =>({\r\n name: key,\r\n control: control,\r\n }));\r\n }\r\n\r\n}\r\n","import {Component, input, output} from '@angular/core';\r\nimport {AnswerMasterComponent} from '../answer.master/answer.master.component';\r\nimport {IdbBaseParamsLanguage} from '../../../tp.survey.interface';\r\nimport {MatButton} from '@angular/material/button';\r\n\r\n@Component({\r\n selector: 'tp-survey-answer-lang',\r\n templateUrl: './answer.lang.component.html',\r\n styleUrls: ['./answer.lang.component.scss'],\r\n imports: [\r\n MatButton,\r\n ]\r\n})\r\n\r\nexport class AnswerLangComponent extends AnswerMasterComponent<number>{\r\n languageList = input.required<Array<IdbBaseParamsLanguage>>();\r\n onLanguageChange = output<number>();\r\n}\r\n","@for (language of languageList(); track $index) {\r\n <button mat-button (click)=\"onLanguageChange.emit(language.Value)\">\r\n {{language.Caption}}\r\n </button>\r\n}\r\n","import {ChangeDetectionStrategy, Component, DestroyRef, inject, input, OnInit, output, signal} from '@angular/core';\r\n\r\nimport {\r\n additionalAnswerDefaultValidator,\r\n additionalAnswerNumberValidator,\r\n answerDefaultValidator,\r\n answerMSValidator,\r\n answerODValidator,\r\n answerOLValidator,\r\n answerSlValidator,\r\n answerSSValidator\r\n} from './container.answer.validator';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {AnswerSSComponent} from '../answer.ss/answer.ss.component';\r\nimport {AnswerInfoComponent} from '../answer.info/answer.info.component';\r\nimport {AnswerMSComponent} from '../answer.ms/answer.ms.component';\r\nimport {MultiLangObjectToHtmlPipe} from '../../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {AnswerAdditionalComponent} from '../answer.additional/answer.additional.component';\r\nimport {AnswerEndComponent} from '../answer.end/answer.end.component';\r\nimport {debounceTime, tap} from 'rxjs';\r\nimport {map} from 'rxjs/operators';\r\nimport {AnswerOLComponent} from '../answer.ol/answer.ol.component';\r\nimport {AnswerSLComponent} from '../answer.sl/answer.sl.component';\r\nimport {FormControl, FormGroup, ReactiveFormsModule} from '@angular/forms';\r\nimport {AdditionalAnswer, AnswerSlType, AnswerT, TFindVariableVoid} from '../../../tp.survey.type';\r\nimport {AnswerODComponent} from '../answer.od/answer.od.component';\r\nimport {AnswerChange, ICurrentQuestionAnswer, IdbAdditionalAnswer, IdbAlternative, IdbBaseParamsLanguage, IdbQuestion, IdbSection} from '../../../tp.survey.interface';\r\nimport {AdditionalAnswerType, QuestionsType, ViewModel} from '../../../tp.survey.enum';\r\nimport {TpSurveyLogicService} from '../../../core/tp.survey.logic/tp.survey.logic.service';\r\nimport {MISSING_VALUE} from '../../../tp.survey.const';\r\nimport {GetAdditionalValueByValuePipe} from '../../../pipe/get.additional.value.by.value/get.additional.value.by.value.pipe';\r\nimport {KeyValuesPipe} from '../../../pipe/key.values/key.values.pipe';\r\nimport {AnswerLangComponent} from '../answer.lang/answer.lang.component';\r\n\r\ninterface IAnswerForm {\r\n answer: FormControl<AnswerT>;\r\n additionalAnswers: FormGroup<{\r\n [key: string]: FormControl<AdditionalAnswer>\r\n }>;\r\n}\r\n\r\n@Component({\r\n selector: 'tp-survey-container-answer',\r\n imports: [\r\n AnswerODComponent,\r\n ReactiveFormsModule,\r\n AnswerSSComponent,\r\n AnswerInfoComponent,\r\n AnswerMSComponent,\r\n AnswerAdditionalComponent,\r\n MultiLangObjectToHtmlPipe,\r\n AnswerEndComponent,\r\n AnswerOLComponent,\r\n AnswerSLComponent,\r\n GetAdditionalValueByValuePipe,\r\n KeyValuesPipe,\r\n AnswerLangComponent\r\n ],\r\n templateUrl: './container.answer.component.html',\r\n styleUrl: './container.answer.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ContainerAnswerComponent implements OnInit{\r\n findVariable = input.required<TFindVariableVoid>();\r\n question = input.required<IdbQuestion>();\r\n language = input.required<number>();\r\n viewModel = input.required<ViewModel>();\r\n answers = input<ICurrentQuestionAnswer>();\r\n developerMode = input<boolean>(false);\r\n languageList = input.required<Array<IdbBaseParamsLanguage>>();\r\n repositoryPath = input<string>('');\r\n visibleAlternativeList = signal<Array<IdbAlternative>>([]);\r\n visibleSectionList = signal<Array<IdbSection>>([]);\r\n visibleAdditionalAnswerList = signal<Array<IdbAdditionalAnswer>>([]);\r\n logicChanged = output<Record<string, any>>();\r\n answerChanged = output<AnswerChange>();\r\n onLanguageChange = output<number>();\r\n questionsType = QuestionsType;\r\n answerForm: FormGroup<IAnswerForm>;\r\n readonly AdditionalAnswerType = AdditionalAnswerType;\r\n #alternativeSequenceClicks: Array<[number, number]> = [];\r\n readonly #logic = inject(TpSurveyLogicService);\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n constructor() {\r\n this.answerForm = new FormGroup<IAnswerForm>({\r\n answer: new FormControl<AnswerT>(null ),\r\n additionalAnswers: new FormGroup({}),\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n const answerValue = this.answers()?.question?.AnswerValue ?? null;\r\n const answerValueClear = answerValue === MISSING_VALUE ? null : answerValue;\r\n this.answerForm.patchValue({\r\n answer: answerValueClear,\r\n additionalAnswers: this.answers()?.question?.AnswerAdditional\r\n }, {emitEvent:false});\r\n\r\n this.#alternativeSequenceClicks = this.answers()?.question?.AlternativeSequenceClicks ?? [];\r\n this.#updateAlternativesAndSections();\r\n this.#updateAdditionalAnswers(true);\r\n this.#addValidator();\r\n\r\n this.answerForm.valueChanges.pipe(\r\n debounceTime(250),\r\n tap(() => this.#emitLogicChanged()), //шлём новые логические переменные(может обновиться список additionalAnswers)\r\n tap(() => this.#updateAdditionalAnswers(false)), //перестраиваем additionalAnswers\r\n map(values => {\r\n const formGroup = (this.answerForm.controls.additionalAnswers as FormGroup);\r\n const additionalAnswerNormalized: Record<number, AdditionalAnswer> = {};\r\n this.question().AdditionalAnswerlist.forEach(aa => {\r\n const isVisible = this.visibleAdditionalAnswerList().find(faa => faa.Value === aa.Value);\r\n if (isVisible) {\r\n additionalAnswerNormalized[aa.Value] = !!values.additionalAnswers ? values.additionalAnswers[aa.Value]! : MISSING_VALUE;\r\n formGroup.get(aa.Value.toString())?.enable({emitEvent: false})\r\n } else {\r\n additionalAnswerNormalized[aa.Value] = MISSING_VALUE;\r\n formGroup.get(aa.Value.toString())?.disable({emitEvent: false})\r\n }\r\n });\r\n return {\r\n answer:values.answer,\r\n additionalAnswers: additionalAnswerNormalized,\r\n }\r\n }),\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe(data => {\r\n this.answerChanged.emit({\r\n guid: this.question().QuestionGuid,\r\n isComplete: this.answerForm.valid,\r\n answer: data.answer!,\r\n additionalAnswers: data.additionalAnswers as Record<number, AdditionalAnswer>,\r\n logicVars: this.#getLogicVars(),\r\n viewedAlternativeValues: this.visibleAlternativeList().map(alt => alt.Value),\r\n viewedSectionGuids: this.visibleSectionList().map(alt => alt.SectionGuid),\r\n alternativeSequenceClicks: Array.from(this.#alternativeSequenceClicks)\r\n });\r\n });\r\n this.#setDefaultAnswers();\r\n \r\n /*Update 19.03.2025\r\n Когда нажимают кнопку back, ответы остаются, но логические переменные удаляются, см. TpSurveyCoreService.clearAnswerForCurrentQuestion\r\n Но если респондент ничего в ответе не меняет и нажимает кнопку далее, то логические переменные не обновляются.\r\n Поэтому если ответ на вопрос не равен MISSING_VALUE(-97), то нужно обновить логические переменные\r\n */\r\n if (answerValue !== MISSING_VALUE){\r\n this.#emitLogicChanged();\r\n }\r\n }\r\n\r\n #addValidator(): void{\r\n const question = this.question();\r\n this.answerForm.controls.answer.addValidators(answerDefaultValidator());\r\n\r\n switch (question.QuestionType){\r\n case QuestionsType.eqSS: {\r\n this.answerForm.controls.answer.addValidators(answerSSValidator());\r\n break;\r\n }\r\n\r\n case QuestionsType.eqMS: {\r\n this.answerForm.controls.answer.addValidators(answerMSValidator(this.visibleAlternativeList().length, this.question().AlternativeMinAnswersCount, this.question().AlternativeMaxAnswersCount));\r\n break;\r\n }\r\n\r\n case QuestionsType.eqOD: {\r\n this.answerForm.controls.answer.addValidators(answerODValidator(question.ODMinValue, question.ODMaxValue));\r\n break;\r\n }\r\n\r\n case QuestionsType.eqOL: {\r\n this.answerForm.controls.answer.addValidators(answerOLValidator(question.OLTypeTel, question.CanSkip ?? false));\r\n break;\r\n }\r\n\r\n case QuestionsType.eqSL: {\r\n this.answerForm.controls.answer.addValidators(answerSlValidator(this.question().RequireAllAnswers, this.question().SLSectionMinAnswersCount, this.visibleSectionList()));\r\n break;\r\n }\r\n }\r\n }\r\n\r\n #setDefaultAnswers(): void{\r\n const question = this.question();\r\n const isLang = question.QuestionType === QuestionsType.eqLANG;\r\n const isInfo = question.QuestionType === QuestionsType.eqINFO;\r\n const isEnd = question.QuestionType === QuestionsType.eqEND;\r\n const isSSMS = (question.QuestionType === QuestionsType.eqSS || question.QuestionType === QuestionsType.eqMS) && (this.visibleAlternativeList().length === 0);\r\n\r\n if (isInfo || isEnd || isSSMS || isLang) {\r\n let defaultAnswer;\r\n switch (question.QuestionType) {\r\n case QuestionsType.eqMS: defaultAnswer = []; break;\r\n case QuestionsType.eqSS: defaultAnswer = 0; break;\r\n default: defaultAnswer = 1;\r\n }\r\n\r\n //может возникнуть ситуация, когда нет альтернатив для отображения.в этом случае вопрос показывать не нужно, как ответ записываем 0 и переходим на следующий\r\n this.answerForm.patchValue({\r\n answer: defaultAnswer\r\n }, {emitEvent: true});\r\n }\r\n }\r\n\r\n\r\n //собираем все логические переменные, которые генерит вопрос\r\n #getLogicVars(): Record<string, any>{\r\n const questionType = this.question().QuestionType;\r\n const answer = this.answerForm.controls.answer.value;\r\n const logicObj: Record<string, any> = {};\r\n\r\n //переменная самого вопроса\r\n const questionSysName = this.question().SysName;\r\n\r\n //ответ на основной вопрос\r\n logicObj[questionSysName] = this.answerForm.value.answer;\r\n\r\n switch (questionType) {\r\n case QuestionsType.eqSS: {\r\n //каждая альтернатива имеет свою переменную, 1 нажата, 0 не нажата или скрыта(скрыта сомнительно, что это правильно)\r\n this.question().Alternativelist.forEach( alt => logicObj[`${questionSysName}${alt.SysName}`] = answer === alt.Value ? 1 : 0); // переменные альтернатив\r\n break;\r\n }\r\n\r\n case QuestionsType.eqMS: {\r\n const answers = Array.isArray(this.answerForm.value.answer) ? this.answerForm.value.answer : [];\r\n //каждая альтернатива имеет свою переменную, 1 нажата, 0 не нажата или скрыта(скрыта сомнительно, что это правильно)\r\n this.question().Alternativelist.forEach( alt => logicObj[`${questionSysName}${alt.SysName}`] = answers.find(val => val === alt.Value) ? 1 : 0); // переменные альтернатив\r\n break;\r\n }\r\n\r\n case QuestionsType.eqOL: {\r\n //логическая переменная для OL вопроса - 1, а не то что ввели\r\n logicObj[questionSysName] = 1;\r\n break;\r\n }\r\n\r\n case QuestionsType.eqSL: {\r\n /*Тут сложнее чем в остальных типах вопросов.\r\n * 1. Логическая переменная для SL вопроса\r\n * 2. Логическая переменная для каждой секции\r\n * 3. Логические переменные для каждой альтернативы + секции\r\n * */\r\n\r\n //1. Логическая переменная для SL вопроса - 1, а не то что ввели\r\n logicObj[questionSysName] = 1;\r\n\r\n //Каждая секция должны иметь свою логическую переменную, array<number> если multiselect, number если multiselect = false, -97 если секция не была показана.\r\n //+ для каждой секции нужно добавлять логические переменные для каждой альтернативы. 1 нажата, 0 отжата, -97 если альтернатива не была показана.\r\n const fullAnswers = this.answerForm.value.answer as AnswerSlType;\r\n const visibleAlternativeList = this.visibleAlternativeList().map(alt => alt.Value);\r\n this.question().Sectionlist.forEach(section => {\r\n const sectionSysName = section.SysName;\r\n\r\n //если undefined, то заменим на -97 это значит секция не была показана.\r\n const sectionAnswer = fullAnswers[section.SectionGuid.toString()] ?? MISSING_VALUE;\r\n\r\n //2. добавляем переменную самой секции.\r\n logicObj[sectionSysName] = sectionAnswer;\r\n this.question().Alternativelist.forEach(alternative => {\r\n\r\n const sectionAlternativeSysName = `${sectionSysName}${alternative.SysName}`;\r\n //секция не была показана, значит альтернативы тоже\r\n if (sectionAnswer === MISSING_VALUE) {\r\n logicObj[sectionAlternativeSysName] = MISSING_VALUE;\r\n } else {\r\n //сначала нужно проверить была ли показана альтернатива, если нет\r\n //альтернативы нет в списке показанных\r\n if (!visibleAlternativeList.find(visibleVal => visibleVal === alternative.Value)) {\r\n logicObj[sectionAlternativeSysName] = MISSING_VALUE;\r\n } else {\r\n //альтернативы есть в списке показанных, нужно узнать была нажата или нет.\r\n const isPressed = Array.isArray(sectionAnswer) ? sectionAnswer.includes(alternative.Value) : sectionAnswer === alternative.Value;\r\n logicObj[sectionAlternativeSysName] = isPressed ? 1 : 0;\r\n }\r\n }\r\n });\r\n });\r\n break;\r\n }\r\n }\r\n\r\n //логические переменные дополнительных вопросов.\r\n this.question().AdditionalAnswerlist.forEach(aa => {\r\n const additionalAnswer = !!this.answerForm.value.additionalAnswers ? this.answerForm.value.additionalAnswers![aa.Value.toString()] : MISSING_VALUE;\r\n const additionalAnswerSysName = `${questionSysName}${aa.SysName}`;\r\n if (additionalAnswer === MISSING_VALUE) {\r\n //дополнительный ответ не был показан, (скрыт по логике)\r\n logicObj[additionalAnswerSysName] = MISSING_VALUE;\r\n } else {\r\n //если на вопрос не отвечали(null), этот самый null и добавляем как ответ.\r\n if (additionalAnswer === null) {\r\n logicObj[additionalAnswerSysName] = null;\r\n } else {\r\n //если вопрос типа текст, как переменную добавим 1, в остальных случаях сам ответ.\r\n logicObj[additionalAnswerSysName] = aa.AnswerType === AdditionalAnswerType.aatText ? 1 : additionalAnswer;\r\n }\r\n }\r\n });\r\n return logicObj;\r\n }\r\n\r\n #updateAlternativesAndSections(): void{\r\n const developerMode = this.developerMode();\r\n //фильтруем альтернативы,\r\n const filteredAlternativeList = this.question().Alternativelist.filter(alt => developerMode || this.#logic.executeLogic(alt.EnableExpression));\r\n\r\n //фильтруем секции,\r\n const filteredSectionList = this.question().Sectionlist.filter(sec => developerMode || this.#logic.executeLogic(sec.EnableExpression));\r\n\r\n //меняем расположение тех, которые этого требуют и обновляем глобальную переменную\r\n this.visibleAlternativeList.set(this.#arrangeRotatedList(filteredAlternativeList));\r\n //для секций тоже самое\r\n this.visibleSectionList.set(this.#arrangeRotatedList(filteredSectionList));\r\n }\r\n\r\n #updateAdditionalAnswers(isInit: boolean): void{\r\n const developerMode = this.developerMode();\r\n const formGroup = (this.answerForm.controls.additionalAnswers as FormGroup);\r\n\r\n if (isInit) {\r\n this.question().AdditionalAnswerlist.forEach(aa => {\r\n switch (aa.AnswerType) {\r\n case AdditionalAnswerType.aatNumber: formGroup.addControl(aa.Value.toString(), new FormControl<number | null>(null,{validators: [additionalAnswerDefaultValidator(aa.IsRequired), additionalAnswerNumberValidator(aa.IsRequired, aa.NumberMinValue, aa.NumberMaxValue)]}), {emitEvent: false}); break;\r\n case AdditionalAnswerType.aatText: formGroup.addControl(aa.Value.toString(), new FormControl<string | null>(null,{validators: [additionalAnswerDefaultValidator(aa.IsRequired)]}), {emitEvent: false}); break;\r\n case AdditionalAnswerType.aatBoolean: formGroup.addControl(aa.Value.toString(), new FormControl<boolean | null>(null,{validators: [additionalAnswerDefaultValidator(aa.IsRequired)]}), {emitEvent: false}); break;\r\n }\r\n });\r\n return\r\n }\r\n\r\n //фильтруем,\r\n const filteredAdditionalAnswerList = this.question().AdditionalAnswerlist.filter(addAnswer => developerMode || this.#logic.executeLogic(addAnswer.EnableExpression));\r\n\r\n //обновляем глобальный список\r\n this.visibleAdditionalAnswerList.set(filteredAdditionalAnswerList);\r\n }\r\n\r\n onAlternativeClick(value: number) {\r\n this.#alternativeSequenceClicks.push([value, new Date().getTime()]);\r\n }\r\n\r\n #arrangeRotatedList<T extends IdbAlternative | IdbSection>(inputArray: Array<T>): Array <T> {\r\n //У каждой альтернативы и секции есть признак Rotation, который позволяем менять порядок отображения альтернативы или секции\r\n //если он true, то альтернатива и секция должна поменять расположение\r\n const resArray: Array<T | number> = [];\r\n\r\n //размер массива\r\n const inputArrayLength = inputArray.length;\r\n\r\n //проходимся по каждому элементу входного массива, и копируем в результирующий, Если Rotation, копируем его индекс, если Rotation не указан, копируем сам объект\r\n inputArray.forEach((obj, index) => resArray.push(obj.Rotation ? index : obj));\r\n\r\n //теперь с помощью рандома, расставим остальные эл-ты\r\n resArray.forEach((obj, index, array) => {\r\n if ((typeof obj === 'number') && (obj >= 0)) {\r\n while (true) {\r\n //если в новом массиве нет элемента из старого массива по random индексу, тогда копируем в новый массив старый елемент в новый адрес\r\n const newIndex = Math.floor( Math.random() * inputArrayLength );\r\n if (array.indexOf(inputArray[newIndex]) === -1) {\r\n array[index] = inputArray[newIndex];\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n return resArray as Array<T>;\r\n }\r\n \r\n #emitLogicChanged(): void{\r\n this.logicChanged.emit(this.#getLogicVars())\r\n }\r\n}\r\n","<div class=\"container-main\" [formGroup]=\"answerForm\">\r\n @switch (question().QuestionType) {\r\n\r\n @case (questionsType.eqLANG) {\r\n <tp-survey-answer-lang\r\n [languageList]=\"languageList()\"\r\n [findVariable]=\"findVariable()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [language]=\"2\"\r\n [viewModel]=\"viewModel()\"\r\n (onLanguageChange)=\"onLanguageChange.emit($event)\"/>\r\n }\r\n\r\n @case (questionsType.eqINFO) {\r\n <tp-survey-answer-info\r\n formControlName=\"answer\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [findVariable]=\"findVariable()\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"/>\r\n }\r\n\r\n @case (questionsType.eqSS) {\r\n <tp-survey-answer-ss\r\n formControlName=\"answer\"\r\n [question]=\"question()\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n [findVariable]=\"findVariable()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [alternativeList]=\"visibleAlternativeList()\"\r\n (onAlternativeClick)=\"onAlternativeClick($event)\"\r\n />\r\n }\r\n\r\n @case (questionsType.eqMS) {\r\n <tp-survey-answer-ms\r\n formControlName=\"answer\"\r\n [question]=\"question()\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n [findVariable]=\"findVariable()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [alternativeMaxAnswersCount]=\"question().AlternativeMaxAnswersCount\"\r\n [alternativeList]=\"visibleAlternativeList()\"\r\n (onAlternativeClick)=\"onAlternativeClick($event)\"/>\r\n }\r\n\r\n @case (questionsType.eqOD) {\r\n <tp-survey-answer-od\r\n formControlName=\"answer\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n [findVariable]=\"findVariable()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [minValue]=\"question().ODMinValue\"\r\n [maxValue]=\"question().ODMaxValue\"\r\n />\r\n }\r\n\r\n @case (questionsType.eqOL) {\r\n <tp-survey-answer-ol\r\n formControlName=\"answer\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [findVariable]=\"findVariable()\"\r\n [telephoneInput]=\"question().OLTypeTel\"\r\n [canSkip]=\"question().CanSkip\"/>\r\n }\r\n\r\n @case (questionsType.eqSL) {\r\n <tp-survey-answer-sl\r\n formControlName=\"answer\"\r\n [question]=\"question()\"\r\n [alternativeList]=\"visibleAlternativeList()\"\r\n [sectionList]=\"visibleSectionList()\"\r\n [multiSelect]=\"question().MultiSelect\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [findVariable]=\"findVariable()\"\r\n [maxCount]=\"this.question().SLSectionMaxAnswersCount\"\r\n />\r\n }\r\n\r\n @case (questionsType.eqEND) {\r\n <tp-survey-answer-end\r\n formControlName=\"answer\"\r\n [findVariable]=\"findVariable()\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [language]=\"language()\"\r\n [viewModel]=\"viewModel()\"\r\n />\r\n }\r\n }\r\n\r\n <div class=\"container-additional-answer\">\r\n @for (addAnswer of answerForm.controls.additionalAnswers.controls | keyValues; track addAnswer) {\r\n @if (addAnswer.name | getAdditionalValueByValue:visibleAdditionalAnswerList(); as additionalAnswerObject ) {\r\n <tp-survey-answer-additional\r\n [control]=\"addAnswer.control\"\r\n [class.full-width]=\"additionalAnswerObject.AnswerType===AdditionalAnswerType.aatText\"\r\n [answerType]=\"additionalAnswerObject.AnswerType\"\r\n [caption]=\"additionalAnswerObject.MultiLangCaptions | multiLangObjectToHtml:language()\"\r\n [numberMinValue]=\"additionalAnswerObject.NumberMinValue\"\r\n [numberMaxValue]=\"additionalAnswerObject.NumberMaxValue\"\r\n [textMultiline]=\"additionalAnswerObject.TextMultiline\"\r\n [captionPosition]=\"additionalAnswerObject.CaptionPosition\"/>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {IdbBaseParamsLanguage} from '../../tp.survey.interface';\r\n\r\n@Pipe({\r\n name: 'getActiveLanguage',\r\n standalone: true\r\n})\r\nexport class GetActiveLanguagePipe implements PipeTransform {\r\n\r\n transform(languageList?: Array<IdbBaseParamsLanguage>, languageId?: number): IdbBaseParamsLanguage | undefined {\r\n return Array.isArray(languageList) ? languageList.find(langObj => langObj.Value === languageId && langObj.isActive) : undefined;\r\n }\r\n\r\n}\r\n","import {Directive, effect, ElementRef, input} from '@angular/core';\r\nimport {ViewModel} from '../../tp.survey.enum';\r\nimport {BASE_HEIGHT, BASE_WIDTH} from '../../tp.survey.const';\r\n\r\n@Directive({\r\n selector: '[tpSurveyUpdateFontSize]',\r\n standalone: true\r\n})\r\nexport class UpdateFontSizeDirective{\r\n viewModel = input.required<ViewModel>( {alias: 'tpSurveyUpdateFontSize'});\r\n constructor(private readonly _element: ElementRef) {\r\n effect(() => {\r\n if (this.viewModel() === ViewModel.vmTablet) {\r\n const containerWidth = this._element.nativeElement.clientWidth;\r\n const containerHeight = this._element.nativeElement.clientHeight;\r\n const proportion: number = Math.min(containerWidth / BASE_WIDTH, containerHeight / BASE_HEIGHT );\r\n Array.from(this._element.nativeElement.children).forEach((el) => (el as HTMLElement).style.fontSize = `${proportion * 100}%`);\r\n }\r\n });\r\n }\r\n}\r\n\r\n","import {LOGIC_FUNC_TEXT} from './tp.survey.const';\r\n\r\nexport function executeLogicExpression(expression: string, vars: Record<string, unknown>): Function {\r\n return new Function(`${LOGIC_FUNC_TEXT} return ${expression}`).call(vars);\r\n}\r\n\r\n","import {IdbQuestionaryQuota, IdbQuestionaryQuota2dObject} from '../../tp.survey.interface';\r\nimport {Answer} from '../tp.survey.answer/tp.survey.answer';\r\nimport {executeLogicExpression} from '../../tp.survey.method';\r\nimport {LogicObject} from '../../tp.survey.type';\r\n\r\ntype QuotaCalculationResult = {\r\n name: string;\r\n guid: number;\r\n} | {\r\n name: null;\r\n guid2d: number;\r\n} | null;\r\n\r\nexport class SurveyQuotas {\r\n #completedQuota: {name: string | null; guid: number| null; guid2d: number| null} = {name: null, guid: null, guid2d: null};\r\n #quotas: Array<IdbQuestionaryQuota> = [];\r\n #quotas2d: Array<IdbQuestionaryQuota2dObject> = [];\r\n #quotaLimitDestinationQuestionGuid: number = -1;\r\n #quotaLimitDestinationQuestionNum: number = -1;\r\n\r\n setQuotas(quotas1d: Array<IdbQuestionaryQuota> = [], quotas2d: Array<IdbQuestionaryQuota2dObject> = [], quotaLimitDestinationQuestionGuid: number = -1, destinationQuestionNum: number = -1){\r\n this.#quotas = quotas1d;\r\n this.#quotas2d = quotas2d;\r\n this.#quotaLimitDestinationQuestionGuid = quotaLimitDestinationQuestionGuid;\r\n this.#quotaLimitDestinationQuestionNum = destinationQuestionNum;\r\n }\r\n\r\n guidIsDestinationQuestion(guid: number): boolean{\r\n return this.#quotaLimitDestinationQuestionGuid === guid;\r\n }\r\n\r\n\r\n get quotaIsCompleted(): boolean {\r\n return this.#completedQuota && (!!this.#completedQuota.guid || !!this.#completedQuota.guid2d) ;\r\n }\r\n\r\n get destinationQuestionGuid(): number {\r\n return this.#quotaLimitDestinationQuestionGuid\r\n }\r\n\r\n get quotaCount(): number {\r\n const quotas = this.#quotas && Array.isArray(this.#quotas) ? this.#quotas.length : 0;\r\n const quotas2d = this.#quotas2d && Array.isArray(this.#quotas2d) ? this.#quotas2d.length : 0;\r\n return quotas + quotas2d;\r\n }\r\n\r\n findFilledQuotas(currentQuestionNum: number, vars: LogicObject, interviewAnswers: Array<Answer>): void {\r\n /*\r\n * Поиск заполненной квоты это очень дорогой процесс. Его нужно оптимизировать по максимуму.\r\n * Перед поиском нужно выполнить ряд проверок.\r\n * Проверка currentQuestionNum <= this.#quotaLimitDestinationQuestionNum Нужна для оптимизации.\r\n * DestinationQuestion Желательно располагать после последнего квотного вопроса, потому что нет смысла постоянно проверять квоты, если вопросы которые используются для расчёта квоты меняться не будут.\r\n * например Квота Q1 + Q2 <= 25. DestinationQuestion нужно делать номером 3 или 4. Потому что как бы респондент не отвечал на последующие вопросы, результат квот не измениться и каждый раз их пересчитывать смысла нет.\r\n */\r\n if (\r\n (this.destinationQuestionGuid > 0) && //Глобально в настройках анкеты должен быть указан вопрос который должен отобразиться при достижении квоты, если его нет, то и искать квоты смысла нет.\r\n (this.quotaCount > 0) && //проверим если у нас вообще квоты\r\n (currentQuestionNum <= this.#quotaLimitDestinationQuestionNum) && // номер текущий вопроса меньше номера вопроса для перехода по достижении квот\r\n (!this.quotaIsCompleted) //и на финал проверим если ли уже заполненная квота, повторно не запускаем\r\n ) {\r\n\r\n new Promise<QuotaCalculationResult>((resolve, reject) => {\r\n if (Array.isArray(this.#quotas)) {\r\n const completedQuota = this.#quotas.find(quota => executeLogicExpression(quota.expression, vars));\r\n if (!!completedQuota) {\r\n return resolve({name: completedQuota.name, guid: completedQuota.quota_guid});\r\n }\r\n }\r\n\r\n if (Array.isArray(this.#quotas2d)) {\r\n const answers = this.#quotas2d.length > 0 ? interviewAnswers.map(a => ({av: a.AnswerValue, qg: a.QuestionGUID}) ) : [];\r\n\r\n const filledQuota2dArray = this.#quotas2d.filter(quotaValues => {\r\n /*\r\n * 2d квоты это всегда таблица. Но может быть иерархия, когда одно значение ответа может включать в себя один или несколько других ответов. Например \"Обл центр\" это 1, а город или село это другой ответ, хотя город и село это разные альтернативы\r\n * */\r\n if (Array.isArray(quotaValues.cqv) && quotaValues.cqv.length > 0) {\r\n /*\r\n * это ветка для случая с иерархией. Тут будет 2 массива.\r\n * В первом будут контролироваться те ответы которое должны совпадать полностью arrayEveryValues\r\n * Во втором arraySomeValue будет проверяться совпадение хотя бы 1 ответа\r\n * */\r\n\r\n const questionGuid = quotaValues.cqv[0].guid;\r\n\r\n const masterQuestion = quotaValues.qs.find( q => q.guid === questionGuid);\r\n const arrayEveryValues = quotaValues.qs.filter(q => q.guid != questionGuid);\r\n\r\n const arraySomeValue = [...quotaValues.cqv, ...[masterQuestion!]];\r\n\r\n const arrayEveryResult = arrayEveryValues.every(qvq => !!answers.find(intAnswer => intAnswer.qg === qvq.guid && intAnswer.av === qvq.value))\r\n const arraySomeResult = arraySomeValue.some(qvq => !!answers.find(intAnswer => intAnswer.qg === qvq.guid && intAnswer.av === qvq.value))\r\n //если в обоих массивах совпадают значения значит квота выполнилась\r\n return arrayEveryResult && arraySomeResult;\r\n } else {\r\n //обычный массив значений, в котором должны совпадать все значения\r\n return quotaValues.qs.every(qvq => !!answers.find(intAnswer => intAnswer.qg === qvq.guid && intAnswer.av === qvq.value))\r\n }\r\n });\r\n //если не нашли заполненных квот выходим\r\n if (filledQuota2dArray.length <= 0) {\r\n return;\r\n }\r\n\r\n //ищем квоту которая заполнена и у нее есть условие и оно выполняется.\r\n const quota2dWithExpression = filledQuota2dArray.find((q: IdbQuestionaryQuota2dObject) => !!q.exp && executeLogicExpression(q.exp, vars));\r\n\r\n //если квота есть сообщим\r\n if (!!quota2dWithExpression) {\r\n return resolve({name: null, guid2d: quota2dWithExpression.qvg});\r\n }\r\n\r\n //если квоты с Expression нет, ищем квоту которая заполнена и у нее нет условия\r\n const quota2dWithoutExpression = filledQuota2dArray.find((q: IdbQuestionaryQuota2dObject) => !q.exp || (typeof q.exp === 'string' && q.exp.trim().length === 0));\r\n if (!!quota2dWithoutExpression) {\r\n return resolve({name: null, guid2d: quota2dWithoutExpression.qvg});\r\n }\r\n }\r\n reject(null)\r\n }).then(quota => {\r\n if (!!quota) {\r\n this.#completedQuota = {\r\n name: quota.name,\r\n guid: 'guid' in quota ? quota.guid : null,\r\n guid2d: 'guid2d' in quota ? quota.guid2d : null,\r\n }\r\n }\r\n }).catch(err => {\r\n console.error(err);\r\n });\r\n }\r\n }\r\n}\r\n","import {IQuestionAnswer} from '../../tp.survey.interface';\r\nimport {AdditionalAnswer} from '../../tp.survey.type';\r\nimport {MISSING_VALUE} from '../../tp.survey.const';\r\n\r\nexport class Answer implements IQuestionAnswer {\r\n readonly QuestionGUID: number;\r\n readonly QuestionVersion: number;\r\n readonly AnswerAdditional: Record<string, AdditionalAnswer> = {};\r\n readonly ViewedAlternativeValues: Array<number> = [];\r\n readonly ViewedSectionGuids: Array<number> = [];\r\n readonly AlternativeSequenceClicks: Array<[number, number]> = [];\r\n StartedAt = 0;\r\n FinishedAt = 0;\r\n AnswerValue: any = MISSING_VALUE;\r\n answerIsComplete: boolean = false;\r\n constructor(guid: number, version: number = -1) {\r\n this.QuestionGUID = guid;\r\n this.QuestionVersion = version;\r\n }\r\n clear(): void {\r\n this.StartedAt = 0;\r\n this.FinishedAt = 0;\r\n this.AnswerValue = MISSING_VALUE;\r\n this.ViewedAlternativeValues.length = 0;\r\n this.ViewedSectionGuids.length = 0;\r\n this.AlternativeSequenceClicks.length = 0;\r\n for (const key of Object.keys(this.AnswerAdditional)) {\r\n this.AnswerAdditional[Number(key)] = null;\r\n }\r\n }\r\n}\r\n","import {Answer} from '../tp.survey.answer/tp.survey.answer';\r\nimport {IQuestionAnswer} from '../../tp.survey.interface';\r\nimport {MISSING_VALUE} from '../../tp.survey.const';\r\nimport {Injectable} from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TpSurveyInterviewService {\r\n #answerList: Array<Answer> = [];\r\n startedAt: number = 0;\r\n\r\n createAnswer(guid: number, version: number): Answer {\r\n //ишем ответ с таким же номером как и в вопросе\r\n let answer = this.findAnswerByGuid(guid);\r\n\r\n //если ответа с таким номером вопроса нет, создадим\r\n if (!answer) {\r\n answer = new Answer(guid, version)\r\n this.#answerList.push(answer);\r\n }\r\n //вернём то, что создали или то что нашли\r\n return answer;\r\n }\r\n\r\n findAnswerByGuid(guid: number): Answer | undefined {\r\n return this.#answerList.find(a => a.QuestionGUID === guid);\r\n }\r\n\r\n questionIsComplete(guid: number): boolean{\r\n const answer = this.findAnswerByGuid(guid);\r\n return !answer ? false : answer.answerIsComplete;\r\n }\r\n\r\n getAnswerList(): Array<Answer>{\r\n return this.#answerList;\r\n }\r\n\r\n overrideAnswers(answers: Array<IQuestionAnswer>): void{\r\n //не будем трогать вопросы которые = -97\r\n answers.filter(answer => answer.AnswerValue !== MISSING_VALUE).forEach(oldAnswer => {\r\n const newAnswer = this.#answerList.find(aa => aa.QuestionGUID === oldAnswer.QuestionGUID);\r\n if (!!newAnswer) {\r\n //вернём основной ответ\r\n newAnswer.AnswerValue = oldAnswer.AnswerValue;\r\n\r\n newAnswer.StartedAt = oldAnswer.StartedAt;\r\n newAnswer.FinishedAt = oldAnswer.FinishedAt;\r\n\r\n //С дополнительными ответами сложнее, они помечены readonly. Поэтому сначала удалим, потом добавим\r\n for (const prop of Object.getOwnPropertyNames(newAnswer.AnswerAdditional)) {\r\n delete newAnswer.AnswerAdditional[prop];\r\n }\r\n //добавляем старые значения\r\n for (const [key, value] of Object.entries(oldAnswer.AnswerAdditional)) {\r\n newAnswer.AnswerAdditional[key] = value;\r\n }\r\n\r\n //То же самое с ViewedAlternativeValues и ViewedSectionGuids и AlternativeSequenceClicks. Т.к. они readonly сначала удалим, потом добавим\r\n newAnswer.ViewedAlternativeValues.length = 0;\r\n oldAnswer.ViewedAlternativeValues.forEach(oa => newAnswer.ViewedAlternativeValues.push(oa));\r\n\r\n newAnswer.ViewedSectionGuids.length = 0;\r\n oldAnswer.ViewedSectionGuids.forEach(oa => newAnswer.ViewedSectionGuids.push(oa));\r\n\r\n newAnswer.AlternativeSequenceClicks.length = 0;\r\n oldAnswer.AlternativeSequenceClicks.forEach(oa => newAnswer.AlternativeSequenceClicks.push(oa));\r\n }\r\n });\r\n }\r\n}\r\n","import {DestroyRef, inject, Inject, Injectable, PLATFORM_ID} from '@angular/core';\r\nimport {BehaviorSubject, filter, Observable, Subject} from 'rxjs';\r\nimport {SurveyQuotas} from '../tp.servey.quota/tp.survey.quota';\r\nimport {TpSurveyLogicService} from '../tp.survey.logic/tp.survey.logic.service';\r\nimport {isPlatformBrowser} from '@angular/common';\r\nimport {map} from 'rxjs/operators';\r\nimport {AnswerChange, IdbQuestion, IdbQuestionary, IInterviewData, IInterviewLogicVar, IQuestionAnswer} from '../../tp.survey.interface';\r\nimport {TpSurveyInterviewService} from '../tp.survey.interview/tp.survey.interview.service';\r\nimport {QuestionsType, ResultativeStatus, SurveyEvents, ValidStatus} from '../../tp.survey.enum';\r\nimport {Answer} from '../tp.survey.answer/tp.survey.answer';\r\nimport {AnswerSlType, LogicObject} from '../../tp.survey.type';\r\nimport {MISSING_VALUE} from '../../tp.survey.const';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\n\r\ninterface BroadcastEvent {\r\n key: string;\r\n data?: any;\r\n}\r\n\r\ninterface ILogicVarContainer {\r\n [questionGuid: string]: Set<string>;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TpSurveyCoreService {\r\n readonly #eventBus = new Subject<BroadcastEvent>();\r\n readonly #currentQuestion = new BehaviorSubject<IdbQuestion | null>(null);\r\n #surveyQuotas = new SurveyQuotas();\r\n #questionary?: IdbQuestionary;\r\n #displayedQuestions: Array<number> = []; // нужно для навигации по кнопке back\r\n #questionLogicVarContainer: ILogicVarContainer = {}; //Нужно знать какая логическая переменная относится к какому вопросу. НапримерЮ когда нужно ее отчистить при переходе назад.\r\n readonly #destroyRef = inject(DestroyRef);\r\n constructor(@Inject(PLATFORM_ID) private readonly platformId: object, private readonly _logic: TpSurveyLogicService, private readonly _interview: TpSurveyInterviewService) {\r\n // запускам проверку квот, после скрытия каждого(почти) вопроса (seQuestionHide)\r\n this.#eventBus.asObservable().pipe(\r\n filter(ev => ev.key === SurveyEvents.seQuestionHide ),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe({\r\n next: () => this.#surveyQuotas.findFilledQuotas(this.#currentQuestion.value?.QuestionNum ?? -1, Object.assign({}, this._logic.getLogicVars()), this._interview.getAnswerList())\r\n });\r\n }\r\n\r\n setupSurvey(questionaryRawData: IdbQuestionary, logicVars?: Array<IInterviewLogicVar>, answerList?: Array<IQuestionAnswer>, questionGuid?: number) {\r\n //если анкеты нет, делать нечего.\r\n if (!questionaryRawData) {\r\n this.#currentQuestion.next(null);\r\n return;\r\n }\r\n\r\n this.#questionary = questionaryRawData;\r\n\r\n if (isPlatformBrowser(this.platformId)) {\r\n //узнаем есть ли вопрос который указали для перехода при заполнении квоты\r\n const destinationQuestion = this.#findQuestionByGuid(questionaryRawData.BaseParams.QuotaLimitDestinationQuestionGuid);\r\n\r\n //инициализируем квоты\r\n this.#surveyQuotas.setQuotas(questionaryRawData.Quotas, questionaryRawData.Quotas2d, destinationQuestion?.QuestionGuid ?? -1, destinationQuestion?.QuestionNum ?? -1);\r\n }\r\n\r\n //создадим ответы и логические переменные\r\n this.#initiateQuestions(this.#questionary.Questions)\r\n\r\n // Может быть 2 варианта запуска интервью, 1-новое интервью, 2-перезапуск старого интервью. В первом случае начало это lang или первый вопрос. Во втором, с последнего вопроса на который ответили.\r\n let startQuestionNum: number | undefined = undefined;\r\n \r\n //загружаем старые логические переменные и переменные которые указали из вне.\r\n this.#fillOldLogic(logicVars ?? []);\r\n\r\n //если загружаем ранее не законченное интервью, продолжаем с места последнего вопроса (случай номер 2)\r\n if (!!answerList && !!questionGuid) {\r\n //загружаем старые логические переменные и ответы\r\n this.#fillOldInterviewData(answerList);\r\n\r\n //ищем номер вопроса, который был последний перед сохранением.\r\n const questionLastSave = this.#findQuestionByGuid(questionGuid);\r\n\r\n //Вопрос могли удалить, тогда начнем сначала.\r\n if (!!questionLastSave) {\r\n startQuestionNum = questionLastSave.QuestionNum;\r\n }\r\n }\r\n \r\n if (startQuestionNum === undefined) {\r\n //Это новое интервью, без ранее сохранённых данных(случай 1). Запускаем опрос, первый экран это Lang вопрос, но если выбора языка нет, пропускаем и переходим на 1-й вопрос\r\n startQuestionNum = this.#activeLangCount > 1 ? 0 : this.#nextQuestionNum();\r\n }\r\n\r\n //пошлём событие о начале опроса\r\n this.#eventBus.next({key: SurveyEvents.seSurveyStart, data: {questionary: this.#questionary, interviewUuid: this._interview.startedAt}});\r\n\r\n //показываем вопрос\r\n this.#changeCurrentQuestion(this.#questionary!.Questions[startQuestionNum]);\r\n }\r\n\r\n on(...key: Array<string>): Observable<any> {\r\n return this.#eventBus.asObservable().pipe(\r\n filter(event => key.includes(event.key)),\r\n map(event => event.data)\r\n );\r\n }\r\n\r\n goToNextQuestion(): void {\r\n const currentQuestion = this.#currentQuestion.value;\r\n if (!currentQuestion) {\r\n return;\r\n }\r\n //если ответ на текущий вопрос не закончен, выходим\r\n if (!this._interview.questionIsComplete(currentQuestion.QuestionGuid)) {\r\n return ;\r\n }\r\n\r\n //если указан PostScript, выполним его\r\n if (!!currentQuestion.PostScript) {\r\n this._logic.executePostScript(currentQuestion.PostScript);\r\n }\r\n this.#changeCurrentQuestion(this.#questionary!.Questions[this.#nextQuestionNum()]);\r\n }\r\n\r\n goToBackQuestion(): void {\r\n this.#displayedQuestions.pop(); // удалим информацию о том что показывали этот вопрос\r\n const previousQuestionGuid = this.#displayedQuestions.pop(); // узнаем номер вопроса на который нам надо перейти, и удалим информацию что-бы не дублировать\r\n if (!!previousQuestionGuid) {\r\n const prevQuestion = this.#findQuestionByGuid(previousQuestionGuid);\r\n if (!!prevQuestion) {\r\n this.#clearAnswerForCurrentQuestion();// отчистим ответ на вопрос, если он уже есть.\r\n this.#changeCurrentQuestion(prevQuestion);\r\n }\r\n }\r\n }\r\n \r\n questionIsComplete(guid: number): boolean {\r\n const answer = this._interview.findAnswerByGuid(guid);\r\n return answer?.answerIsComplete ?? false\r\n }\r\n \r\n /*\r\n * функция по номеру вопроса, ищет ответ на этот guid, и возвращает ответ на этот вопрос.\r\n * если это ss ms, вместо номеров альтернатив подставляет текст.\r\n * работает только для eqOL, eqSS, eqMS\r\n * */\r\n guidToTextAnswer(guid: number, languageId: number): string {\r\n const answer = this.findAnswerByGuid(guid);\r\n const question = this.#findQuestionByGuid(guid);\r\n \r\n //если ответа нет, ревнём пустую строку\r\n if (!question || !answer || answer.AnswerValue === -97) {\r\n return ''\r\n }\r\n const questionType = question.QuestionType;\r\n \r\n switch (questionType) {\r\n \r\n case QuestionsType.eqOL: return answer.AnswerValue;\r\n case QuestionsType.eqSS: {\r\n //находим альтернативу и подставляем заголовок альтернативы с указанным языком, если заголовка нет, вернём alias\r\n const alternative = question.Alternativelist.find(alt => alt.Value === answer.AnswerValue);\r\n const altText = alternative?.MultiLangCaptions.find(obj => obj.lang === languageId);\r\n\r\n return (altText?.CaptionHtml || alternative?.alias) ?? '';\r\n }\r\n case QuestionsType.eqMS: {\r\n //всё то же самое, что и ss, только тут массив ответов,\r\n const answerArray = answer.AnswerValue as Array<number>;\r\n const alternativeArray = question.Alternativelist.filter(alt => answerArray.indexOf(alt.Value) > 0);\r\n const altTextArray = alternativeArray.map(alt => (alt.MultiLangCaptions.find(obj => obj.lang === languageId)?.CaptionHtml || alt.alias) ?? '');\r\n return altTextArray.join(', ');\r\n }\r\n default: return '';\r\n }\r\n }\r\n \r\n #fillOldLogic(logicVars: Array<IInterviewLogicVar>): void{\r\n //пропишем старые логические переменные\r\n if (Array.isArray(logicVars)) {\r\n logicVars.forEach(logicVarObj => {\r\n this._logic.setLogicValue(logicVarObj.nm, logicVarObj.vl);\r\n })\r\n }\r\n }\r\n \r\n #fillOldInterviewData(answerList: Array<IQuestionAnswer>): void{\r\n //пропишем старые ответы\r\n this._interview.overrideAnswers(answerList);\r\n\r\n //нужно вернуть время начала интервью, отдельно оно не сохраняется, поэтому возьмём минимальное время начала из ответов\r\n //фильтруем все вопросы у которых оно указано(>0) и трансформируем в число.\r\n const startedAtArray = answerList.filter(answer => answer.StartedAt > 0).map(answer => answer.StartedAt);\r\n\r\n //берём минимальное\r\n this._interview.startedAt = Math.min(...startedAtArray);\r\n }\r\n \r\n #changeCurrentQuestion(newQuestion: IdbQuestion): void {\r\n const currentQuestion = this.#currentQuestion.value;\r\n const currentTime = new Date().getTime();\r\n\r\n if (!!currentQuestion) {\r\n /*\r\n Сохраним время начала интервью. Фиксировать будем не с самого начала, а с ответа на первый вопрос.\r\n Потому что практика такая, открыть анкету на планшете и ходить искать респондентов и из-за этого длительность интервью может быть нерелевантно.\r\n * */\r\n if (this._interview.startedAt === 0 && currentQuestion.QuestionNum >= 0) {\r\n this._interview.startedAt = currentTime;\r\n }\r\n\r\n //нужно сохранить FinishedAt в ответах для старого вопроса\r\n const answer = this._interview.findAnswerByGuid(currentQuestion.QuestionGuid);\r\n if (!!answer) {\r\n answer.FinishedAt = currentTime;\r\n }\r\n this.#eventBus.next({key: SurveyEvents.seQuestionHide, data: currentQuestion});\r\n }\r\n this.#displayedQuestions.push(newQuestion.QuestionGuid);\r\n this.#currentQuestion.next(newQuestion);\r\n\r\n //нужно сохранить StartedAt в ответах для нового вопроса\r\n const answerNew = this._interview.findAnswerByGuid(newQuestion.QuestionGuid);\r\n if (!!answerNew) {\r\n answerNew.StartedAt = currentTime;\r\n }\r\n this.#eventBus.next({key: SurveyEvents.seQuestionShow, data: newQuestion});\r\n\r\n //если новый экран это end тогда завершаем интервью\r\n if (newQuestion.QuestionType === 'END') {\r\n this.#finishInterview();\r\n }\r\n \r\n //если это неявный вопрос и это ss или ms вопрос тогда посчитаем значения у этого вопроса\r\n if (newQuestion.Implicit) {\r\n this.#calculateImplicitQuestion(newQuestion);\r\n }\r\n }\r\n \r\n currentQuestion$(): Observable<IdbQuestion | null> {\r\n return this.#currentQuestion.asObservable();\r\n }\r\n\r\n findAnswerByGuid(guid: number): Answer | undefined {\r\n return this._interview.findAnswerByGuid(guid);\r\n }\r\n\r\n setLogicValue(varName: string, value: any): void {\r\n this._logic.setLogicValue(varName, value);\r\n }\r\n\r\n getLogicVars(): LogicObject {\r\n return this._logic.getLogicVars();\r\n }\r\n\r\n getAnswerList(): Array<Answer> {\r\n return this._interview.getAnswerList();\r\n }\r\n\r\n updateAnswer(eventData: AnswerChange): void {\r\n const answer = this._interview.findAnswerByGuid(eventData.guid);\r\n if (!answer) {\r\n return;\r\n }\r\n\r\n //вопросы которые в своем составе имеет секции, хранят ответы чуть по другому, точнее ответ на каждую секцию это отдельный объект в _interview.answerList\r\n //поэтому ответ для таких типов вопросов это [key: string]: Array<number> | number, где key(guid секции) это ответ на секцию, если key нет, секция не была показана\r\n if (this.#currentQuestion.value?.QuestionType === QuestionsType.eqSL) {\r\n const sectionList = this.#currentQuestion.value?.Sectionlist;\r\n \r\n //пройдёмся по каждой секции и если для неё есть ответ, запишем, в противном случае вместо ответа укажем -97(MISSING_VALUE)\r\n if (!!sectionList) {\r\n sectionList.forEach(section => {\r\n const sectionInterviewAnswer = this._interview.findAnswerByGuid(section.SectionGuid);\r\n if (!sectionInterviewAnswer){\r\n return\r\n }\r\n const sectionQuestionAnswer = eventData.answer ? (eventData.answer as AnswerSlType)[section.SectionGuid.toString()] : undefined;\r\n sectionInterviewAnswer.AnswerValue = sectionQuestionAnswer === undefined ? MISSING_VALUE : sectionQuestionAnswer;\r\n });\r\n }\r\n //ответ самого исходного вопроса\r\n answer.AnswerValue = eventData.answer;\r\n } else {\r\n //ответ на вопрос у которого нет секций\r\n answer.AnswerValue = eventData.answer;\r\n }\r\n \r\n //на вопрос ответили тогда когда есть все ответы и выполняется логика кнопки далее(если её указали)\r\n answer.answerIsComplete = eventData.isComplete && this.#nextButtonExpressionIsTrue();\r\n \r\n //ViewedAlternativeValues и ViewedSectionGuids. Т.к. они readonly сначала удалим, потом добавим\r\n answer.ViewedAlternativeValues.length = 0;\r\n eventData.viewedAlternativeValues.forEach(oa => answer.ViewedAlternativeValues.push(oa));\r\n \r\n answer.ViewedSectionGuids.length = 0;\r\n eventData.viewedSectionGuids.forEach(oa => answer.ViewedSectionGuids.push(oa));\r\n \r\n answer.AlternativeSequenceClicks.length = 0;\r\n eventData.alternativeSequenceClicks.forEach(oa => answer.AlternativeSequenceClicks.push(oa));\r\n \r\n \r\n Object.entries(answer.AnswerAdditional).forEach(([key]) => delete answer.AnswerAdditional[Number(key)]);\r\n Object.entries(eventData.additionalAnswers).forEach(([key, value]) => answer.AnswerAdditional[Number(key)] = value);\r\n\r\n this.updateLogic(eventData.logicVars);\r\n\r\n this.#eventBus.next({key: SurveyEvents.seQuestionAnswersChange, data: {question: this.#currentQuestion.value, answerIsComplete: answer.answerIsComplete}});\r\n\r\n //может возникнуть ситуация, когда нет ни одной альтернативы или секции для отображения.в этом случае вопрос показывать не нужно, как ответ записываем 0 и переходим на следующий\r\n const question = this.#findQuestionByGuid(eventData.guid);\r\n //ситуация когда можно сразу перейти на следующий вопрос для ss/ms вопросов и для неявных вопросов\r\n const canTransitionSSMS = (!!question && answer.answerIsComplete && (question.QuestionType === 'SS' || question.QuestionType === 'MS') && ( (eventData.viewedAlternativeValues.length === 0) || question.Implicit));\r\n\r\n const canTransitionOl = ((!!question && question?.QuestionType === QuestionsType.eqOL && (question.CanSkip ?? true) && answer.AnswerValue === 'skip'));\r\n if (canTransitionSSMS || canTransitionOl) {\r\n this.goToNextQuestion()\r\n }\r\n }\r\n\r\n updateLogic(logicVars: Record<string, any>): void{\r\n Object.entries(logicVars).forEach(([varName, value]) => {\r\n this.setLogicValue(varName, value)\r\n })\r\n }\r\n \r\n //возвращает количество активных языков\r\n get #activeLangCount(): number {\r\n //если анкета по какой-то причине ну указана, вернём 0\r\n return this.#questionary?.BaseParams.LanguageList.filter( langObj => langObj.isActive).length ?? 0;\r\n }\r\n \r\n //возвращает количество вопросов\r\n get #questionsCount(): number {\r\n return this.#questionary?.Questions.length ?? 0;\r\n }\r\n\r\n #finishInterview(): void {\r\n const currentTime = new Date();\r\n let resultDirty;\r\n try {\r\n resultDirty = this._logic.executeLogic(this.#questionary?.BaseParams.ResultativeScript ?? '');\r\n }catch (e) {\r\n resultDirty = false;\r\n }\r\n \r\n \r\n //если вопрос не был показан, удалим его ответы\r\n //такое может быть если не нажимали кнопку назад\r\n const answerList = this._interview.getAnswerList();\r\n this.#questionary?.Questions.forEach(question => {\r\n if (!this.#displayedQuestions.includes(question.QuestionGuid)) {\r\n answerList.find(answer => answer.QuestionGUID === question.QuestionGuid)?.clear();\r\n question.Sectionlist.forEach(section => {\r\n answerList.find(answer => answer.QuestionGUID === section.SectionGuid)?.clear();\r\n })\r\n }\r\n if (question.QuestionType === QuestionsType.eqSL) {\r\n const answer = answerList.find(answer => answer.QuestionGUID === question.QuestionGuid);\r\n if (answer && answer.AnswerValue !== MISSING_VALUE) {\r\n answer.AnswerValue = 1;\r\n }\r\n }\r\n })\r\n const interview: IInterviewData = {\r\n Language: 0, //todo lang\r\n SpotId: 0,\r\n DeviceId: 0,\r\n DeviceType: 0,\r\n Resultative: ResultativeStatus.rsUnset,\r\n Valid: ValidStatus.vsUnset,\r\n Wave: this.#questionary?.Info.current_wave ?? 0,\r\n QuestionaryName: this.#questionary?.Info.name ?? '',\r\n QuestionaryGuid: this.#questionary?.Info.questionary_guid ?? 0,\r\n StartedAt: this._interview.startedAt,\r\n FinishedAt: currentTime.getTime(),\r\n TineZoneBias: currentTime.getTimezoneOffset(),\r\n ResultatDirty: resultDirty,\r\n Answers: {\r\n AnsversList: Array.from(this._interview.getAnswerList())\r\n },\r\n additional_info: {\r\n QuestionaryUpdateTimestamp: new Date(this.#questionary?.Info.last_update_timestamp ?? 0).getTime() ,\r\n },\r\n ResultQuotaGuids: [],\r\n ResultQuota2dGuids: [],\r\n LogicVars: [],\r\n };\r\n\r\n const logicVars = this._logic.getLogicVars();\r\n Object.entries(logicVars).forEach(([key, value]) => interview.LogicVars.push({nm: key, vl: value}));\r\n\r\n this.#eventBus.next({key: SurveyEvents.seSurveyEnd, data: interview});\r\n }\r\n\r\n #nextQuestionNum(): number {\r\n const currentQuestion = this.#currentQuestion.value;\r\n // проверим квоты\r\n const currentGuid = currentQuestion?.QuestionGuid ?? 0;\r\n if (this.#surveyQuotas.quotaIsCompleted && !this.#surveyQuotas.guidIsDestinationQuestion(currentGuid)) {\r\n // у нас есть заполненная квота, найдем вопрос который нужно показать при заполнении квоты\r\n const destinationQ = this.#findQuestionByGuid(this.#surveyQuotas.destinationQuestionGuid);\r\n //если вопрос есть(его могли удалить из анкеты), показывает его\r\n if (!!destinationQ) {\r\n return destinationQ.QuestionNum;\r\n }\r\n }\r\n\r\n // если нет заполненной квоты, переходим на следующий вопрос, ищем следующий вопрос который мы можем отобразить (до логика может запретить показ вопроса)\r\n let nextQuestionNum = (currentQuestion?.QuestionNum ?? 0) + 1;\r\n \r\n // но сначала проверим после логику\r\n if (!!currentQuestion) {\r\n const destQ = currentQuestion.logiclist.find(logObj => (logObj.DestinationQuestionGuid > 0) && this._logic.executeLogic(logObj.LogicText) );\r\n if (!!destQ) {\r\n const destQNum = this.#findQuestionByGuid(destQ.DestinationQuestionGuid)?.QuestionNum;\r\n if (Number.isSafeInteger(destQNum)) { // вопрос мог быть удалён, а логику оставить\r\n nextQuestionNum = destQNum!;\r\n }\r\n }\r\n }\r\n\r\n // общее количество вопросов, цикл будет считать до этого количества\r\n const questionCount = this.#questionsCount;\r\n do {\r\n //потенциально следующий вопрос\r\n const q = this.#questionary!.Questions[nextQuestionNum];\r\n\r\n //если это последний вопрос или если выполняется BeforeExpression и этот вопрос не DestinationQuota, можем его показать\r\n if (q.QuestionType === QuestionsType.eqEND || (this._logic.executeLogic(q.BeforeExpression) && !this.#surveyQuotas.guidIsDestinationQuestion(q.QuestionGuid)) ) {\r\n return nextQuestionNum;\r\n }\r\n //вопрос нельзя показывать, увеличиваем счётчик текущего вопроса на 1\r\n nextQuestionNum++;\r\n } while (nextQuestionNum < questionCount - 1); // end вопрос должен всегда быть показан\r\n return nextQuestionNum;\r\n }\r\n\r\n #initiateQuestions(questionList: Array<IdbQuestion>): void{\r\n questionList.forEach(question => {\r\n //создаём пустой ответ для вопроса.\r\n const answer = this._interview.createAnswer(question.QuestionGuid, question.Version);\r\n \r\n //такого быть не должно, это ошибка\r\n if (!answer) {\r\n throw new Error('answer not found');\r\n }\r\n \r\n const logicVarSet = new Set<string>();\r\n this.#questionLogicVarContainer[question.QuestionGuid.toString()] = logicVarSet;\r\n \r\n logicVarSet.add(question.SysName);//привязываем переменную к вопросу\r\n this._logic.setLogicValue(question.SysName, MISSING_VALUE); // переменная самого вопроса\r\n\r\n //добавим доп ответы и логику для них\r\n question.AdditionalAnswerlist.forEach(aa => {\r\n const aaSysName = `${question.SysName}${aa.SysName}`;\r\n answer.AnswerAdditional[aa.Value] = null;\r\n this._logic.setLogicValue(aaSysName, MISSING_VALUE); // логика для переменных доп ответа\r\n logicVarSet.add(aaSysName); //привязываем переменную к вопросу\r\n });\r\n\r\n // если в тексте postScript есть запись типа setVar('varName', value); нужно инициализировать переменную varName значением -97.\r\n if (!!question.PostScript) {\r\n (question.PostScript.match(/(\\bsetvar\\b)\\(['|\"](.*?)['|\"]/gim) ?? []).map(scriptVar => scriptVar.match(/['|\"](.+)['|\"]/i)![1]).forEach(varName => {\r\n logicVarSet.add(varName);//привязываем переменную к вопросу\r\n this._logic.setLogicValue(varName, null)\r\n });\r\n }\r\n\r\n // для Вопросов SS/MS нужно прописать логику альтернатив sysname вопроса + sysname альтернативы\r\n if (question.Sectionlist.length <= 0) {// для Вопросов SS/MS\r\n question.Alternativelist.forEach(alt => {\r\n const aSysName = `${question.SysName}${alt.SysName}`\r\n this._logic.setLogicValue(aSysName, MISSING_VALUE);\r\n logicVarSet.add(aSysName); //привязываем переменную к вопросу\r\n });\r\n } else {\r\n //для вопросов у которых есть секции проинициализируем каждую секцию\r\n question.Sectionlist.forEach(section => {\r\n\r\n //создаём пустой ответ для секции.\r\n const answerForSection = this._interview.createAnswer(section.SectionGuid, 1);\r\n\r\n //такого быть не должно, это ошибка\r\n if (!answerForSection) {\r\n throw new Error('answer not found');\r\n }\r\n\r\n // для Вопросов SL нужно прописать логику альтернатив и секций sysname секции + sysname альтернативы\r\n this._logic.setLogicValue(section.SysName, MISSING_VALUE); // переменная самой секции\r\n logicVarSet.add(section.SysName); //привязываем переменную к вопросу\r\n\r\n //логика альтернатив SL вопроса\r\n question.Alternativelist.forEach(alt => {\r\n const aSysName = `${section.SysName}${alt.SysName}`;\r\n this._logic.setLogicValue(aSysName, MISSING_VALUE);\r\n logicVarSet.add(aSysName); //привязываем переменную к вопросу\r\n });\r\n })\r\n }\r\n })\r\n }\r\n\r\n //ищет вопрос на guid\r\n #findQuestionByGuid(guid: number): IdbQuestion | undefined {\r\n if (!this.#questionary) {\r\n return undefined;\r\n }\r\n return this.#questionary.Questions.find(q => q.QuestionGuid === guid);\r\n }\r\n \r\n #nextButtonExpressionIsTrue(): boolean{\r\n const buttonNextExpression = this.#currentQuestion.value?.BtnNextExpression ?? '';\r\n //если скрипта для кнопки далее нет, вернём true\r\n if (buttonNextExpression.trim() === '') {\r\n return true;\r\n }\r\n try {\r\n return this._logic.executeLogic(buttonNextExpression);\r\n } catch (e) {\r\n console.error(e);\r\n return false;\r\n }\r\n }\r\n\r\n #calculateImplicitQuestion(question: IdbQuestion): void {\r\n if (question.Implicit && (question.QuestionType === QuestionsType.eqSS || question.QuestionType === QuestionsType.eqMS) ) {\r\n let questionAnswer: number | Array<number>;\r\n\r\n if (question.QuestionType === QuestionsType.eqSS) {\r\n const alt = question.Alternativelist.find(alt => this._logic.executeLogic(alt.EnableExpression));\r\n questionAnswer = !!alt ? alt.Value : 0;\r\n }\r\n\r\n if (question.QuestionType === QuestionsType.eqMS) {\r\n questionAnswer = question.Alternativelist\r\n .filter(alt => this._logic.executeLogic(alt.EnableExpression))\r\n .map(alt => alt.Value);\r\n }\r\n\r\n const answerChange: AnswerChange = {\r\n guid: question.QuestionGuid,\r\n isComplete: true,\r\n answer: questionAnswer!,\r\n additionalAnswers: {},\r\n logicVars: {},\r\n viewedAlternativeValues: Array.isArray(questionAnswer!) ? questionAnswer : [questionAnswer!],\r\n viewedSectionGuids: [],\r\n alternativeSequenceClicks: []\r\n }\r\n this.updateAnswer(answerChange);\r\n }\r\n }\r\n \r\n #clearAnswerForCurrentQuestion(): void {\r\n const currentQuestionGuid = this.#currentQuestion.value?.QuestionGuid ?? -1;\r\n \r\n //удаляем сам ответ на вопрос\r\n //25.02.2023 не будем удалять ответ, будем удалять только логические переменные, а ответы на не показанные вопросы удалим при финализации интервью\r\n // this._interview.findAnswerByGuid(currentQuestionGuid)?.clear();\r\n\r\n //удаляем переменные которые относятся к этому вопросу\r\n const logicSet = this.#questionLogicVarContainer[currentQuestionGuid];\r\n if (!!logicSet) {\r\n logicSet.forEach(sysName =>this._logic.setLogicValue(sysName, MISSING_VALUE));\r\n }\r\n }\r\n}\r\n","import {Directive, HostBinding, input} from '@angular/core';\r\nimport {TpSurveyTheme} from '../../tp.survey.type';\r\n\r\n@Directive({\r\n selector: '[tpSurveyTheme]',\r\n standalone: true\r\n})\r\nexport class SurveyThemeDirective {\r\n theme = input<TpSurveyTheme>('touchpoll-light',{alias: 'tpSurveyTheme'});\r\n @HostBinding(\"class.survey-theme-touchpoll-light\") public get classTouchpollLight() {\r\n return this.theme() === 'touchpoll-light';\r\n }\r\n \r\n @HostBinding(\"class.survey-theme-cyan-orange-light\") public get classCyanOrangeLight() {\r\n return this.theme() === 'cyan-orange-light';\r\n }\r\n @HostBinding(\"class.survey-theme-cyan-orange-dark\") public get classCyanOrangeDark() {\r\n return this.theme() === 'cyan-orange-dark';\r\n }\r\n\r\n @HostBinding(\"class.survey-theme-rose-red-light\") public get classRoseRedLight() {\r\n return this.theme() === 'rose-red-light';\r\n }\r\n\r\n @HostBinding(\"class.survey-theme-rose-red-dark\") public get classRoseRedDark() {\r\n return this.theme() === 'rose-red-dark';\r\n }\r\n\r\n @HostBinding(\"class.survey-theme-azure-blue-light\") public get classAzureBlueLight() {\r\n return this.theme() === 'azure-blue-light';\r\n }\r\n\r\n @HostBinding(\"class.survey-theme-azure-blue-dark\") public get classAzureBlueDark() {\r\n return this.theme() === 'azure-blue-dark';\r\n }\r\n}\r\n\r\n","import {Directive, effect, ElementRef, inject, input, Renderer2} from '@angular/core';\r\nimport {IdbTpBackGround} from '../../tp.survey.interface';\r\n\r\n@Directive({\r\n selector: '[tpImagePosition]'\r\n})\r\nexport class ImagePositionDirective {\r\n imageBackground = input.required<IdbTpBackGround>({alias: 'tpImagePosition'});\r\n constructor() {\r\n const nativeElement = inject(ElementRef).nativeElement;\r\n const renderer = inject(Renderer2);\r\n\r\n effect(() => {\r\n switch (this.imageBackground().PositionHorizontal) {\r\n case \"left\": renderer.setStyle(nativeElement, 'grid-column', '1 / 1'); renderer.setStyle(nativeElement, 'justify-self', 'flex-start'); break;\r\n case \"center\": renderer.setStyle(nativeElement, 'grid-column', '2 / 2'); renderer.setStyle(nativeElement, 'justify-self', 'anchor-center'); break;\r\n case \"right\": renderer.setStyle(nativeElement, 'grid-column', '3 / 3'); renderer.setStyle(nativeElement, 'justify-self', 'flex-end'); break;\r\n default: renderer.setStyle(nativeElement, 'grid-column-start', 1); break;\r\n }\r\n\r\n switch (this.imageBackground().PositionVertical) {\r\n case \"top\": renderer.setStyle(nativeElement, 'grid-row', '1 / 1');break;\r\n case \"center\": renderer.setStyle(nativeElement, 'grid-row-start', 2); renderer.setStyle(nativeElement, 'align-self', 'center'); break;\r\n case \"bottom\": renderer.setStyle(nativeElement, 'grid-row', '3 / 3'); renderer.setStyle(nativeElement, 'align-self', 'flex-end'); break;\r\n default: renderer.setStyle(nativeElement, 'grid-row-start', 1); break;\r\n }\r\n });\r\n }\r\n}\r\n","import {Directive, effect, ElementRef, inject, input, Renderer2} from '@angular/core';\r\nimport {IdbTpBackGround} from '../../tp.survey.interface';\r\nimport {BreakpointObserver} from '@angular/cdk/layout';\r\n\r\n@Directive({\r\n selector: '[tpImageSize]'\r\n})\r\nexport class ImageSizeDirective {\r\n imageBackground = input.required<IdbTpBackGround>({alias: 'tpImageSize'});\r\n \r\n constructor() {\r\n const nativeElement = inject(ElementRef).nativeElement;\r\n const renderer = inject(Renderer2);\r\n const breakpointObserver = inject(BreakpointObserver);\r\n const isMobile= breakpointObserver.isMatched(\"(max-width: 480px)\");\r\n effect(() => {\r\n const height = isMobile ? this.imageBackground().MobileHeight : this.imageBackground().DesktopHeight;\r\n const width = isMobile ? this.imageBackground().MobileWidth : this.imageBackground().DesktopWidth;\r\n\r\n const normalizeHeight = this.#normalizeValue(height);\r\n const normalizeWidth = this.#normalizeValue(width);\r\n\r\n renderer.setStyle(nativeElement, 'height', normalizeHeight);\r\n renderer.setStyle(nativeElement, 'width', normalizeWidth);\r\n });\r\n }\r\n \r\n #normalizeValue(value?: number | string | 'auto' | null): string{\r\n if (!value || value === 'auto') {\r\n return 'auto';\r\n }\r\n \r\n //по умолчанию, если ввели только число, то это будет px\r\n if (typeof value === 'number') {\r\n return `${value}px`;\r\n }\r\n \r\n if (typeof value === 'string') {\r\n const stringValue = value.toLowerCase().trim();\r\n if (stringValue.endsWith('%') || stringValue.endsWith('px') || stringValue.endsWith('vh') || stringValue.endsWith('vw')) {\r\n return value;\r\n }else {\r\n return `${value}px`;\r\n }\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport {VIDEO_EXTENSION_LIST} from '../../tp.survey.const';\r\n\r\n\r\n@Pipe({\r\n name: 'isVideo'\r\n})\r\nexport class IsVideoPipe implements PipeTransform {\r\n\r\n transform(fileName: string): boolean {\r\n if (typeof fileName !== 'string') {\r\n return false;\r\n } else {\r\n const ext = (fileName.split('.').pop())?.toLowerCase() ?? '';\r\n return VIDEO_EXTENSION_LIST.includes(`.${ext}`)\r\n }\r\n\r\n }\r\n\r\n}\r\n","import {Directive, effect, ElementRef, inject, input, OnDestroy, Renderer2} from '@angular/core';\r\nimport {IdbQuestion} from '../../tp.survey.interface';\r\nimport {DOCUMENT} from '@angular/common';\r\n\r\n@Directive({\r\n selector: '[tpSurveyInsertQuestionCss]',\r\n standalone: true,\r\n})\r\nexport class InsertQuestionCssDirective {\r\n question = input.required<IdbQuestion | null>({alias: 'tpSurveyInsertQuestionCss'});\r\n constructor() {\r\n const nativeElement = inject(ElementRef).nativeElement as HTMLInputElement;\r\n const renderer = inject(Renderer2);\r\n const document = inject(DOCUMENT);\r\n\r\n //у каждого вопроса будет свой css класс, чтобы можно было переопределить стили в свойстве вопроса Css\r\n effect(() => {\r\n //если вопрос не указан, то удаляем все классы, которые начинаются с question-\r\n if (this.question()) {\r\n renderer.addClass(nativeElement, `question-${this.question()?.QuestionNum}`)\r\n } else {\r\n nativeElement.classList.forEach(className => {\r\n if (className.startsWith('question-')) {\r\n renderer.removeClass(nativeElement, className)\r\n }\r\n });\r\n }\r\n });\r\n\r\n //Если у вопроса указан Css, то добавляем его в head страницы. С селектором div.question-N. Где N - номер вопроса\r\n effect(() => {\r\n if (this.question()?.Css) {\r\n document.head.insertAdjacentHTML('beforeend',\r\n `<style>\r\n div.question-${this.question()?.QuestionNum} {\r\n ${this.question()?.Css}\r\n }\r\n </style>\r\n `);\r\n }\r\n });\r\n }\r\n}\r\n","import {ChangeDetectionStrategy, Component, computed, DestroyRef, inject, input, OnInit, output, Signal, signal, TemplateRef} from '@angular/core';\r\nimport {concatMap, delay, distinctUntilChanged, filter, from, merge, mergeMap, of} from 'rxjs';\r\nimport {NgTemplateOutlet} from '@angular/common';\r\nimport {map} from 'rxjs/operators';\r\nimport {takeUntilDestroyed, toSignal} from '@angular/core/rxjs-interop';\r\nimport {AnswerChange, ICurrentQuestionAnswer, IdbQuestion, IdbQuestionary, IInterviewAutoSaveData, IInterviewData, IInterviewProgressEvent} from '../../tp.survey.interface';\r\nimport {QuestionCaptionComponent} from '../question.caption/question.caption.component';\r\nimport {NavigationButtonComponent} from '../navigation.button/navigation.button.component';\r\nimport {ContainerAnswerComponent} from '../answer/container.answer/container.answer.component';\r\nimport {GetActiveLanguagePipe} from '../../pipe/get.active.language/get.active.language.pipe';\r\nimport {UpdateFontSizeDirective} from '../../directive/update.font.size/update.font.size.directive';\r\nimport {TpSurveyCoreService} from '../../core/tp.survey.core/tp.survey.core.service';\r\nimport {NavigationButtonDirection, TpSurveyTheme} from '../../tp.survey.type';\r\nimport {QuestionsType, SurveyEvents, ViewModel} from '../../tp.survey.enum';\r\nimport {MultiLangObjectToHtmlPipe} from '../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {SurveyThemeDirective} from '../../directive/survey.theme/survey.theme.directive';\r\nimport {ImagePositionDirective} from '../../directive/image.position/image.position.directive';\r\nimport {ImageSizeDirective} from '../../directive/image.site/image.size.directive';\r\nimport {IsVideoPipe} from '../../pipe/is.video/is.video.pipe';\r\nimport {InsertQuestionCssDirective} from '../../directive/insert.question.css/insert.question.css.directive';\r\n\r\ninterface ICurrentQuestionViewData {\r\n question: IdbQuestion | null;\r\n answers?: ICurrentQuestionAnswer;\r\n}\r\n\r\n@Component({\r\n selector: 'tp-survey-play',\r\n templateUrl: './survey.play.component.html',\r\n styleUrls: ['./survey.play.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n QuestionCaptionComponent,\r\n NavigationButtonComponent,\r\n ContainerAnswerComponent,\r\n GetActiveLanguagePipe,\r\n UpdateFontSizeDirective,\r\n NgTemplateOutlet,\r\n MultiLangObjectToHtmlPipe,\r\n SurveyThemeDirective,\r\n ImagePositionDirective,\r\n ImageSizeDirective,\r\n IsVideoPipe,\r\n InsertQuestionCssDirective\r\n ]\r\n})\r\nexport class SurveyPlayComponent implements OnInit{\r\n questionary = input.required<IdbQuestionary>();\r\n viewModel = input.required<ViewModel>();\r\n interviewAutoSaveData = input<IInterviewAutoSaveData>();\r\n theme = input<TpSurveyTheme>('cyan-orange-light');\r\n language = input<number>(2);\r\n templateNavigationRef = input<TemplateRef<any> | null>();\r\n interviewStarted = output<void>();\r\n interviewFinished = output<IInterviewData>();\r\n interviewProgress = output<IInterviewProgressEvent>();\r\n // readonly currentQuestionViewData$: Observable<ICurrentQuestionViewData>;\r\n readonly currentQuestionViewData: Signal<ICurrentQuestionViewData>;\r\n readonly question: Signal<IdbQuestion | null>;\r\n readonly activeLanguage = signal<number>(this.language())\r\n readonly viewModelE = ViewModel;\r\n readonly backButtonAvailable;\r\n readonly nextButtonAvailable;\r\n readonly #core = inject(TpSurveyCoreService);\r\n readonly #destroyRef = inject(DestroyRef);\r\n constructor() {\r\n //Проблема в том, что если идёт подряд 2 вопроса с одинаковым типом, то не удаляется. Нужно пробросить null с небольшой задержкой, чтобы движок angular`а удалял старые компоненты\r\n this.currentQuestionViewData = toSignal(this.#core.currentQuestion$().pipe(\r\n filter(res => !res?.Implicit), //если это неявный вопрос, тогда его показывать не нужно\r\n mergeMap(currentQuestion => from([null, currentQuestion]).pipe(\r\n concatMap(val => of(val).pipe(\r\n delay(val === null ? 0 : 500),\r\n )),\r\n )),\r\n //будем реагировать только когда null => вопрос и наоборот вопрос => null.\r\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\r\n map(currentQuestion => ({\r\n question: currentQuestion,\r\n answers: !currentQuestion ? undefined : {\r\n question: this.#core.findAnswerByGuid(currentQuestion.QuestionGuid),\r\n sections: currentQuestion.Sectionlist.map(section => this.#core.findAnswerByGuid(section.SectionGuid)),\r\n }\r\n })),\r\n ), { initialValue: { question: null, answers: undefined } });\r\n\r\n this.question = computed(() => this.currentQuestionViewData().question)\r\n\r\n /*\r\n * кнопка далее нужно проверять при показе вопроса и при изменении ответа. При показе она может быть доступна сразу(например info).\r\n * Кнопка доступна если ответ корректно заполнен(questionIsComplete) и это не eqEND вопрос\r\n * */\r\n this.nextButtonAvailable = toSignal(merge(\r\n this.#core.on(SurveyEvents.seQuestionAnswersChange).pipe(map(data => data.question)),\r\n this.#core.on(SurveyEvents.seQuestionShow).pipe(map(data => data))\r\n ).pipe(\r\n map(question => this.#core.questionIsComplete(question.QuestionGuid) && question.QuestionType !== QuestionsType.eqEND && question.QuestionType !== QuestionsType.eqLANG),\r\n delay(1),\r\n ), { initialValue: false });\r\n\r\n //кнопку Назад можно показывать если в настройках указали ShowBtnBack и это не eqEND вопрос\r\n this.backButtonAvailable = toSignal(this.#core.on(SurveyEvents.seQuestionShow).pipe(\r\n filter(question => !!question),\r\n map((question: IdbQuestion) => question.QuestionNum > 1 && question.ShowBtnBack && question.QuestionType !== QuestionsType.eqEND && question.QuestionType !== QuestionsType.eqLANG),\r\n delay(1),\r\n ));\r\n\r\n this.#core.on(SurveyEvents.seSurveyEnd).pipe(\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe({\r\n next: interview => {\r\n interview.Language = this.activeLanguage()\r\n this.interviewFinished.emit(interview)\r\n }\r\n });\r\n\r\n this.#core.on(SurveyEvents.seSurveyStart).pipe(\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe({\r\n next: _ => this.interviewStarted.emit()\r\n });\r\n\r\n this.#core.on(SurveyEvents.seQuestionShow).pipe(\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe({\r\n next: q => this.interviewProgress.emit({\r\n currentNum: q.QuestionNum,\r\n questionsCount: this.questionary().Questions.length,\r\n questionGuid: q.QuestionGuid,\r\n interviewData: {\r\n logicVars: this.#core.getLogicVars(),\r\n answerList: this.#core.getAnswerList(),\r\n }\r\n })\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.#core.setupSurvey(this.questionary(), this.interviewAutoSaveData()?.logic_vars, this.interviewAutoSaveData()?.answer_list, this.interviewAutoSaveData()?.question_guid, );\r\n }\r\n\r\n onNavigationButtonClick(direction: NavigationButtonDirection) {\r\n if (direction === 'next') {\r\n this.#core.goToNextQuestion()\r\n } else {\r\n this.#core.goToBackQuestion()\r\n }\r\n }\r\n\r\n onAnswerChanged(eventData: AnswerChange) {\r\n this.#core.updateAnswer(eventData);\r\n }\r\n\r\n onLogicChanged(logicVars: Record<string, any>) {\r\n this.#core.updateLogic(logicVars);\r\n }\r\n\r\n onLanguageChange(language: number) {\r\n this.activeLanguage.set(language);\r\n this.#core.goToNextQuestion();\r\n }\r\n\r\n findVariable(sysName: string): string{\r\n //Сюда могут заехать как переменные логические, типа Q_00000000000391A9, так и Q_00000000000391A9_A_001, так и \"переменные для ответов\" типа V_00000000000391A9\r\n //Переменные для ответов ищут ответ на данный вопрос, а потом подставляют туда значения (это всё пока только для SS, MS, OL вопросов)\r\n // мы можем брать значения только из заголовка вопроса, альтернативы или секции т.е. На вход могут прийти только Q1 или q1A1 или q1r1 в системном формате\r\n try {\r\n if (sysName.search(/^v_/gmi) >= 0) { // переменные для ответов типа V1\r\n const guid = Number(`0x${sysName.replace(/^v_/gmi, '')}`);\r\n return this.#core.guidToTextAnswer(guid, this.language());\r\n }\r\n //todo q_var\r\n return '';\r\n } catch (e) {\r\n return '';\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"survey-container-main survey-typography\"\r\n [tpSurveyUpdateFontSize]=\"viewModel()\"\r\n [tpSurveyTheme]=\"theme()\"\r\n [style.background-color]=\"question()?.BackgroundColor\"\r\n [tpSurveyInsertQuestionCss]=\"question()\"\r\n\r\n [class.tp-view-desktop]=\"viewModel() === viewModelE.vmDesktop\"\r\n [class.tp-view-tablet]=\"viewModel() === viewModelE.vmTablet\">\r\n\r\n @if (currentQuestionViewData(); as currentQuestionViewData) {\r\n @if (question(); as question) {\r\n <tp-survey-question-caption\r\n [caption]=\"question.MultiLangCaptions | multiLangObjectToHtml:activeLanguage():question.LogicCaptionsList: findVariable.bind(this)\"\r\n [captionHelp]=\"question.MultiLangCaptionsHelper | multiLangObjectToHtml:activeLanguage()\"/>\r\n\r\n @if (question.ImageList?.length > 0) {\r\n <div\r\n class=\"container-image\"\r\n [class.container-image-desktop]=\"viewModel() === viewModelE.vmDesktop\">\r\n @for (image of question.ImageList; track $index) {\r\n @if (image.Image.Image | isVideo) {\r\n <video [controls]=\"false\" [autoplay]=\"true\" [loop]=\"true\" [muted]=\"true\" class=\"question-video\">\r\n <source [src]=\"questionary().Info.repository_path+'/' + image.Image.Image\" type=\"video/mp4\">\r\n </video>\r\n } @else {\r\n <img\r\n alt=\"answer logo\"\r\n [tpImagePosition]=\"image.Image\"\r\n [tpImageSize]=\"image.Image\"\r\n [src]=\"questionary().Info.repository_path+'/' + image.Image.Image\"\r\n importance=\"low\" loading=\"lazy\"\r\n class=\"question-image\">\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n <tp-survey-container-answer\r\n [question]=\"question\"\r\n [language]=\"activeLanguage()\"\r\n [viewModel]=\"viewModel()\"\r\n [findVariable]=\"findVariable.bind(this)\"\r\n [answers]=\"currentQuestionViewData.answers\"\r\n [languageList]=\"questionary().BaseParams.LanguageList\"\r\n [repositoryPath]=\"questionary().Info.repository_path\"\r\n (logicChanged)=\"onLogicChanged($event)\"\r\n (onLanguageChange)=\"onLanguageChange($event)\"\r\n (answerChanged)=\"onAnswerChanged($event)\"/>\r\n }\r\n }\r\n\r\n <div class=\"container-navigation\">\r\n <div class=\"container-navigation-back\">\r\n @if (backButtonAvailable()) {\r\n <tp-survey-navigation-button\r\n direction=\"back\"\r\n [caption]=\"(questionary().BaseParams.LanguageList | getActiveLanguage: activeLanguage())?.back_button_caption\"\r\n (click)=\"onNavigationButtonClick('back')\"/>\r\n }\r\n </div>\r\n\r\n <ng-container\r\n [ngTemplateOutlet]=\"templateNavigationRef() ?? null\">\r\n </ng-container>\r\n\r\n <div class=\"container-navigation-next\">\r\n @if (nextButtonAvailable()){\r\n <tp-survey-navigation-button\r\n [caption]=\"(questionary().BaseParams.LanguageList | getActiveLanguage: activeLanguage())?.next_button_caption\"\r\n direction=\"next\"\r\n (onClick)=\"onNavigationButtonClick('next')\"/>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\nimport {Answer} from '../../core/tp.survey.answer/tp.survey.answer';\r\n\r\n@Pipe({\r\n name: 'generateDefaultAnswer'\r\n})\r\nexport class GenerateDefaultAnswerPipe implements PipeTransform {\r\n\r\n transform(guid: number): Answer {\r\n return new Answer(guid);\r\n }\r\n\r\n}\r\n","import {ChangeDetectionStrategy, Component, input, TemplateRef} from '@angular/core';\r\nimport {ContainerAnswerComponent} from '../answer/container.answer/container.answer.component';\r\nimport {QuestionCaptionComponent} from '../question.caption/question.caption.component';\r\nimport {UpdateFontSizeDirective} from '../../directive/update.font.size/update.font.size.directive';\r\nimport {TpSurveyTheme} from '../../tp.survey.type';\r\nimport {ViewModel} from '../../tp.survey.enum';\r\nimport {IdbBaseParamsLanguage, IdbQuestion} from '../../tp.survey.interface';\r\nimport {TpSurveyLogicService} from '../../core/tp.survey.logic/tp.survey.logic.service';\r\nimport {MultiLangObjectToHtmlPipe} from '../../pipe/multi.lang.object.to.html/multi.lang.object.to.html.pipe';\r\nimport {SurveyThemeDirective} from '../../directive/survey.theme/survey.theme.directive';\r\nimport {ImagePositionDirective} from '../../directive/image.position/image.position.directive';\r\nimport {ImageSizeDirective} from '../../directive/image.site/image.size.directive';\r\nimport {GenerateDefaultAnswerPipe} from '../../pipe/generate.default.answer/generate.default.answer.pipe';\r\n\r\n@Component({\r\n selector: 'tp-survey-question-preview',\r\n imports: [\r\n ContainerAnswerComponent,\r\n QuestionCaptionComponent,\r\n UpdateFontSizeDirective,\r\n MultiLangObjectToHtmlPipe,\r\n SurveyThemeDirective,\r\n ImagePositionDirective,\r\n ImageSizeDirective,\r\n GenerateDefaultAnswerPipe\r\n ],\r\n templateUrl: './survey.question.preview.component.html',\r\n styleUrl: './survey.question.preview.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n TpSurveyLogicService,\r\n ]\r\n})\r\nexport class SurveyQuestionPreviewComponent {\r\n question = input.required<IdbQuestion | null>();\r\n language = input.required<number>();\r\n viewModel = input.required<ViewModel>();\r\n languageList = input.required<Array<IdbBaseParamsLanguage>>();\r\n theme = input<TpSurveyTheme>('cyan-orange-light');\r\n repositoryPath = input<string>('');\r\n templateNavigationRef = input<TemplateRef<any> | null>();\r\n ViewModel = ViewModel;\r\n\r\n findVariable(sysName: string): string{\r\n //Сюда могут заехать как переменные логические, типа Q_00000000000391A9, так и Q_00000000000391A9_A_001, так и \"переменные для ответов\" типа V_00000000000391A9\r\n //Переменные для ответов ищут ответ на данный вопрос, а потом подставляют туда значения (это всё пока только для SS, MS, OL вопросов)\r\n // мы можем брать значения только из заголовка вопроса, альтернативы или секции т.е. на вход могут прийти только Q1 или q1A1 или q1r1 в системном формате\r\n try {\r\n if (sysName.search(/^v_/gmi) >= 0) { // переменные для ответов типа V1\r\n return '{value}'\r\n }\r\n //todo q_var\r\n return '';\r\n } catch (e) {\r\n return '';\r\n }\r\n }\r\n \r\n protected readonly viewModelE = ViewModel;\r\n}\r\n","<div\r\n class=\"survey-container-main survey-typography\"\r\n [tpSurveyUpdateFontSize]=\"viewModel()\"\r\n [tpSurveyTheme]=\"theme()\"\r\n [class.tp-view-desktop]=\"viewModel() === ViewModel.vmDesktop\"\r\n [class.tp-view-tablet]=\"viewModel() === ViewModel.vmTablet\">\r\n\r\n @if (question(); as question) {\r\n <tp-survey-question-caption\r\n [caption]=\"question.MultiLangCaptions | multiLangObjectToHtml:language()\"\r\n [captionHelp]=\"question.MultiLangCaptionsHelper | multiLangObjectToHtml:language()\"/>\r\n\r\n @if (question.ImageList?.length > 0) {\r\n <div\r\n class=\"container-image\"\r\n [class.container-image-desktop]=\"viewModel() === viewModelE.vmDesktop\">\r\n @for (image of question.ImageList; track $index) {\r\n <img\r\n alt=\"answer logo\"\r\n [tpImagePosition]=\"image.Image\"\r\n [tpImageSize]=\"image.Image\"\r\n [src]=\"repositoryPath() + '/' + image.Image.Image\"\r\n importance=\"low\" loading=\"lazy\"\r\n class=\"question-image\">\r\n }\r\n </div>\r\n }\r\n\r\n <tp-survey-container-answer\r\n [question]=\"question\"\r\n [language]=\"language()\"\r\n [answers]=\"{question:question.QuestionGuid | generateDefaultAnswer, sections: []}\"\r\n [findVariable]=\"findVariable.bind(this)\"\r\n [repositoryPath]=\"repositoryPath()\"\r\n [developerMode]=\"true\"\r\n [viewModel]=\"viewModel()\"\r\n [languageList]=\"languageList()\"/>\r\n }\r\n</div>\r\n","/*\r\n * Public API Surface of tp.survey\r\n */\r\n\r\n// export * from './lib/tp.survey.service';\r\n\r\nexport * from './lib/tp.survey.module';\r\nexport * from './lib/component/survey.play/survey.play.component';\r\nexport * from './lib/component/survey.question.preview/survey.question.preview.component';\r\nexport * from './lib/tp.survey.config';\r\nexport * from './lib/tp.survey.const';\r\nexport * from './lib/tp.survey.type';\r\nexport * from './lib/tp.survey.interface';\r\nexport * from './lib/tp.survey.enum';\r\nexport * from './lib/tp.survey.method';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.TpSurveyLogicService","i1","i1.TpSurveyLogicService","i2.TpSurveyInterviewService"],"mappings":"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"}