Skip to content
Snippets Groups Projects
likert.component.ts 3.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { Component, EventEmitter, Output } from '@angular/core';
    
    import { FormGroup } from '@angular/forms';
    
    rhenck's avatar
    rhenck committed
    import { LikertElement } from '../../models/compound-elements/likert-element';
    
    import { ValueChangeElement } from '../../form';
    import { InputElementValue } from '../../models/uI-element';
    import { LikertElementRow } from '../../models/compound-elements/likert-element-row';
    
    
    @Component({
      selector: 'app-likert',
      template: `
    
    rhenck's avatar
    rhenck committed
        <div class="mat-typography"
    
             [style.display]="'grid'" [style.grid-template-columns]="'5fr ' + '2fr '.repeat(elementModel.answers.length)"
             [style.background-color]="elementModel.backgroundColor"
             [style.color]="elementModel.fontColor"
             [style.font-family]="elementModel.font"
             [style.font-size.px]="elementModel.fontSize"
             [style.font-weight]="elementModel.bold ? 'bold' : ''"
             [style.font-style]="elementModel.italic ? 'italic' : ''"
             [style.text-decoration]="elementModel.underline ? 'underline' : ''"
             [style.height.px]="100">
    
    rhenck's avatar
    rhenck committed
          <div class="headings" [style.display]="'grid'"
               [style.grid-template-columns]="'5fr ' + '2fr '.repeat(elementModel.answers.length)"
    
               [style.grid-column-start]="1"
               [style.grid-column-end]="elementModel.answers.length + 2"
               [style.grid-row-start]="1"
               [style.grid-row-end]="2">
            <div *ngFor="let answer of elementModel.answers; let i = index" class="answers"
                 [style.grid-column-start]="2 + i"
                 [style.grid-column-end]="3 + i"
                 [style.grid-row-start]="1"
                 [style.grid-row-end]="2">
              <img *ngIf="answer.imgSrc && answer.position === 'above'" [src]="answer.imgSrc" alt="Image Placeholder"
                   [style.object-fit]="'scale-down'"
                   [width]="200">
              {{answer.text}}
              <img *ngIf="answer.imgSrc && answer.position === 'below'" [src]="answer.imgSrc" alt="Image Placeholder"
                   [style.object-fit]="'scale-down'"
                   [width]="200">
            </div>
          </div>
    
          <ng-container *ngFor="let question of elementModel.questions; let i = index">
    
            <app-likert-radio-button-group
    
    rhenck's avatar
    rhenck committed
                 [ngClass]="{ 'odd': elementModel.lineColoring && i % 2 === 0 }"
    
                 [style.display]="'grid'"
    
                 [style.grid-column-start]="1"
                 [style.grid-column-end]="elementModel.answers.length + 2"
                 [style.grid-row-start]="2 + i"
                 [style.grid-row-end]="3 + i"
    
                 [style.padding.px]="3"
    
                 [elementModel]="elementModel.questions[i]"
    
                 [parentForm]="parentForm"
                 (formValueChanged)="formValueChanged.emit($event)">
    
            </app-likert-radio-button-group>
          </ng-container>
        </div>
      `,
      styles: [
    
    rhenck's avatar
    rhenck committed
        '.headings {padding-bottom: 10px}',
    
        '.odd {background-color: #D0F6E7;}',
        '.answers {text-align: center;}',
        '::ng-deep app-likert mat-radio-button span.mat-radio-container {left: calc(50% - 10px)}'
      ]
    })
    export class LikertComponent {
    
      @Output() formValueChanged = new EventEmitter<ValueChangeElement>();
    
      elementModel!: LikertElement;
      parentForm!: FormGroup;
    
    
      getChildElementValues(): { id: string, value: InputElementValue }[] {
        return this.elementModel.questions
          .map((question: LikertElementRow): { id: string, value: InputElementValue } => (
            { id: question.id, value: question.value }
          ));
      }