diff --git a/projects/quml-library/src/lib/asq/asq-options/asq-options.component.html b/projects/quml-library/src/lib/asq/asq-options/asq-options.component.html index 9c390a22..813fd7e7 100644 --- a/projects/quml-library/src/lib/asq/asq-options/asq-options.component.html +++ b/projects/quml-library/src/lib/asq/asq-options/asq-options.component.html @@ -24,8 +24,4 @@ - - - - - + \ No newline at end of file diff --git a/projects/quml-library/src/lib/asq/asq.component.ts b/projects/quml-library/src/lib/asq/asq.component.ts index 3359a14a..659ed803 100644 --- a/projects/quml-library/src/lib/asq/asq.component.ts +++ b/projects/quml-library/src/lib/asq/asq.component.ts @@ -1,5 +1,6 @@ -import { Component,Input,Output,EventEmitter} from '@angular/core'; -import {AsqOptions,AsqInteractions} from '../interfaces/asq-interface'; +import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { AsqOptions, AsqInteractions } from '../interfaces/asq-interface'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; @Component({ selector: 'quml-asq', @@ -13,17 +14,35 @@ export class AsqComponent { @Output() optionsReordered = new EventEmitter(); public interactions?: AsqInteractions; - public questionBody?: string; + public questionBody?: SafeHtml; public layout: 'VERTICAL' | 'HORIZONTAL' | 'DEFAULT'; + constructor(private sanitizer: DomSanitizer) {} + ngOnInit(): void { this.initialize(); } initialize(): void { this.setLayout(); - this.interactions = this.question?.interactions; - this.questionBody = this.question?.body; + + // Sanitize question body + this.questionBody = this.sanitizeHtml(this.question?.body); + console.log('ASQ this.questionBody', this.questionBody); + + // Modify interactions with sanitized labels + if (this.question?.interactions) { + this.interactions = { ...this.question.interactions }; + + if (this.interactions.response1?.options) { + this.interactions.response1.options = this.interactions.response1.options.map(option => ({ + ...option, + label: this.sanitizeHtml(option.label) + })); + } + } + + console.log('ASQ this.interactions', this.interactions); } setLayout(): void { @@ -41,4 +60,9 @@ export class AsqComponent { handleReorderedOptions(reorderedOptions: AsqOptions) { this.optionsReordered.emit(reorderedOptions); } + + // Helper function to sanitize HTML + sanitizeHtml(html: any): SafeHtml { + return this.sanitizer.bypassSecurityTrustHtml(html); + } } diff --git a/projects/quml-library/src/lib/interfaces/asq-interface.ts b/projects/quml-library/src/lib/interfaces/asq-interface.ts index cb0e0b98..ce239d97 100644 --- a/projects/quml-library/src/lib/interfaces/asq-interface.ts +++ b/projects/quml-library/src/lib/interfaces/asq-interface.ts @@ -1,5 +1,7 @@ +import { SafeHtml } from "@angular/platform-browser"; + export interface AsqOptions { - label: string; + label: string | SafeHtml; value: number; } diff --git a/projects/quml-library/src/lib/interfaces/mtf-interface.ts b/projects/quml-library/src/lib/interfaces/mtf-interface.ts index 4257a551..16d3a802 100644 --- a/projects/quml-library/src/lib/interfaces/mtf-interface.ts +++ b/projects/quml-library/src/lib/interfaces/mtf-interface.ts @@ -1,5 +1,7 @@ +import { SafeHtml } from "@angular/platform-browser"; + export interface MtfOption { - label: string; + label: string | SafeHtml; value: number; } diff --git a/projects/quml-library/src/lib/mtf/mtf.component.ts b/projects/quml-library/src/lib/mtf/mtf.component.ts index 7bf22429..58287f87 100644 --- a/projects/quml-library/src/lib/mtf/mtf.component.ts +++ b/projects/quml-library/src/lib/mtf/mtf.component.ts @@ -1,5 +1,6 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { MtfInteractions, MtfOptions } from '../interfaces/mtf-interface'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; @Component({ selector: 'quml-mtf', @@ -14,17 +15,40 @@ export class MtfComponent implements OnInit { @Output() optionsReordered = new EventEmitter(); public interactions?: MtfInteractions; - public questionBody?: string; + public questionBody?: SafeHtml; public layout: 'VERTICAL' | 'HORIZONTAL' | 'DEFAULT'; + constructor(private sanitizer: DomSanitizer) {} + ngOnInit(): void { this.initialize(); } initialize(): void { this.setLayout(); - this.interactions = this.question?.interactions; - this.questionBody = this.question?.body; + + // Sanitize the question body + this.questionBody = this.sanitizeHtml(this.question?.body); + console.log('MTF this.questionBody', this.questionBody); + + // Sanitize interactions if available + if (this.question?.interactions) { + this.interactions = { ...this.question.interactions }; + + if (this.interactions.response1?.options) { + this.interactions.response1.options.left = this.interactions.response1.options.left.map(option => ({ + ...option, + label: this.sanitizeHtml(option.label) + })); + + this.interactions.response1.options.right = this.interactions.response1.options.right.map(option => ({ + ...option, + label: this.sanitizeHtml(option.label) + })); + } + } + + console.log('MTF this.interactions', this.interactions); } setLayout(): void { @@ -42,4 +66,9 @@ export class MtfComponent implements OnInit { handleReorderedOptions(reorderedOptions: MtfOptions) { this.optionsReordered.emit(reorderedOptions); } + + // Sanitize HTML content + sanitizeHtml(html: any): SafeHtml { + return this.sanitizer.bypassSecurityTrustHtml(html); + } }