diff --git a/docs/release-notes-player.txt b/docs/release-notes-player.txt index 3183f9dfd0a76e0a155a246e6e077fda101e4caa..28f2381bec79b1f46f032334b2255bb8d316b401 100644 --- a/docs/release-notes-player.txt +++ b/docs/release-notes-player.txt @@ -2,6 +2,7 @@ Player ====== 1.20.0 - Fix dimensions of images with dynamicPositioning and fixedSize +- Fix display of fixed size dynamic elements on iPad 1.19.0 - Remove border of slider rectangle in number line mode at position 0 diff --git a/projects/common/ui-elements/audio/audio.component.ts b/projects/common/ui-elements/audio/audio.component.ts index 91ccb75be28bb33b4ad2ec03d6e837be14d91aaa..767c8eb6b4541190e9a78269612d9e8c81aaab79 100644 --- a/projects/common/ui-elements/audio/audio.component.ts +++ b/projects/common/ui-elements/audio/audio.component.ts @@ -5,25 +5,27 @@ import { MediaPlayerElementComponent } from '../../directives/media-player-eleme @Component({ selector: 'aspect-audio', template: ` - <div [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [class.center-content]="elementModel.positionProps.dynamicPositioning && - elementModel.positionProps.fixedSize"> - <audio #player - (playing)="onMediaPlayStatusChanged.emit(this.elementModel.id)" - (pause)="onMediaPlayStatusChanged.emit(null)" - [style.width.%]="100" - [src]="elementModel.src | safeResourceUrl"> - </audio> - <aspect-control-bar [player]="player" - [project]="project" - [id]="elementModel.id" - [playerProperties]="elementModel.playerProps" - [active]="active" - [dependencyDissolved]="dependencyDissolved" - (onMediaValidStatusChanged)="onMediaValidStatusChanged.emit($event)" - (elementValueChanged)="elementValueChanged.emit($event)"> - </aspect-control-bar> + <div class="element-content-wrapper"> + <div [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [class.center-content]="elementModel.positionProps.dynamicPositioning && + elementModel.positionProps.fixedSize"> + <audio #player + (playing)="onMediaPlayStatusChanged.emit(this.elementModel.id)" + (pause)="onMediaPlayStatusChanged.emit(null)" + [style.width.%]="100" + [src]="elementModel.src | safeResourceUrl"> + </audio> + <aspect-control-bar [player]="player" + [project]="project" + [id]="elementModel.id" + [playerProperties]="elementModel.playerProps" + [active]="active" + [dependencyDissolved]="dependencyDissolved" + (onMediaValidStatusChanged)="onMediaValidStatusChanged.emit($event)" + (elementValueChanged)="elementValueChanged.emit($event)"> + </aspect-control-bar> + </div> </div> ` }) diff --git a/projects/common/ui-elements/button/button.component.ts b/projects/common/ui-elements/button/button.component.ts index 660e7ccea12dbf983e5d5bfaef9d593833c868ed..f626bed06af14a8b3a9506e7d3d3f3141dba8793 100644 --- a/projects/common/ui-elements/button/button.component.ts +++ b/projects/common/ui-elements/button/button.component.ts @@ -7,39 +7,42 @@ import { ButtonElement } from './button-element'; @Component({ selector: 'aspect-button', template: ` - <button *ngIf="!elementModel.imageSrc" mat-button - type='button' - [class.center-content]="elementModel.positionProps.dynamicPositioning && - elementModel.positionProps.fixedSize" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [style.background-color]="elementModel.surfaceProps.backgroundColor" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" - [style.border-radius.px]="elementModel.borderRadius" - (click)="elementModel.action ? navigationRequested.emit(elementModel.action) : false"> - {{elementModel.label}} - </button> - <input *ngIf="elementModel.imageSrc" type="image" - [src]="elementModel.imageSrc | safeResourceUrl" - [class.center-content]="elementModel.positionProps.dynamicPositioning && - elementModel.positionProps.fixedSize" - [class.fixed-size-dynamic-image]="elementModel.positionProps.dynamicPositioning && - elementModel.positionProps.fixedSize" - [class]="elementModel.positionProps.dynamicPositioning ? 'dynamic-image' : 'static-image'" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : null" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : null" - [alt]="'imageNotFound' | translate" - (click)="elementModel.action ? navigationRequested.emit(elementModel.action) : false"> + <div class="element-content-wrapper"> + <button *ngIf="!elementModel.imageSrc" mat-button + type='button' + [class.center-content]="elementModel.positionProps.dynamicPositioning && + elementModel.positionProps.fixedSize" + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [style.background-color]="elementModel.surfaceProps.backgroundColor" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" + [style.border-radius.px]="elementModel.borderRadius" + (click)="elementModel.action ? navigationRequested.emit(elementModel.action) : false"> + {{elementModel.label}} + </button> + <input *ngIf="elementModel.imageSrc" type="image" + [src]="elementModel.imageSrc | safeResourceUrl" + [class.center-content]="elementModel.positionProps.dynamicPositioning && + elementModel.positionProps.fixedSize" + [class.fixed-size-dynamic-image]="elementModel.positionProps.dynamicPositioning && + elementModel.positionProps.fixedSize" + [class]="elementModel.positionProps.dynamicPositioning ? 'dynamic-image' : 'static-image'" + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : null" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : null" + [alt]="'imageNotFound' | translate" + (click)="elementModel.action ? navigationRequested.emit(elementModel.action) : false"> + </div> `, styles: [ '.dynamic-image {width: 100%; height: fit-content;}', '.static-image {max-width: 100%; max-height: 100%; display: grid;}', // grid: to prevent scrollbars - '.fixed-size-dynamic-image {position: relative; object-fit: scale-down;}' + '.fixed-size-dynamic-image {position: relative; object-fit: scale-down;}', + '.center-content {margin: auto !important;}' // overwrite: margin of mat-button ] }) export class ButtonComponent extends ElementComponent { diff --git a/projects/common/ui-elements/checkbox/checkbox.component.ts b/projects/common/ui-elements/checkbox/checkbox.component.ts index 0c609cce6ff0d4152b8f6605ea43205031d08cda..c9bb53122a6a4d2118597a5ef5edd9702e52627f 100644 --- a/projects/common/ui-elements/checkbox/checkbox.component.ts +++ b/projects/common/ui-elements/checkbox/checkbox.component.ts @@ -6,28 +6,30 @@ import { CheckboxElement } from './checkbox-element'; @Component({ selector: 'aspect-checkbox', template: ` - <div class="mat-form-field" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [class.center-content]="elementModel.positionProps.dynamicPositioning && + <div class="element-content-wrapper"> + <div class="mat-form-field" + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize" - [style.background-color]="elementModel.surfaceProps.backgroundColor"> - <mat-checkbox #checkbox class="example-margin" - [formControl]="elementFormControl" - [checked]="$any(elementModel.value)" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" - (click)="elementModel.readOnly ? $event.preventDefault() : null"> - <div [style.line-height.%]="elementModel.lineHeight" [innerHTML]="elementModel.label"></div> - </mat-checkbox> - <mat-error *ngIf="elementFormControl.errors && elementFormControl.touched" - class="error-message"> - {{elementFormControl.errors | errorTransform: elementModel}} - </mat-error> + [style.background-color]="elementModel.surfaceProps.backgroundColor"> + <mat-checkbox #checkbox class="example-margin" + [formControl]="elementFormControl" + [checked]="$any(elementModel.value)" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" + (click)="elementModel.readOnly ? $event.preventDefault() : null"> + <div [style.line-height.%]="elementModel.lineHeight" [innerHTML]="elementModel.label"></div> + </mat-checkbox> + <mat-error *ngIf="elementFormControl.errors && elementFormControl.touched" + class="error-message"> + {{elementFormControl.errors | errorTransform: elementModel}} + </mat-error> + </div> </div> `, styles: [ diff --git a/projects/common/ui-elements/cloze/cloze.component.ts b/projects/common/ui-elements/cloze/cloze.component.ts index d26c3e82b2f7446bae369ef4f67bf6430b0b9859..9d7c10d283cfb2d5962cf1180b01a5fb3db31d6e 100644 --- a/projects/common/ui-elements/cloze/cloze.component.ts +++ b/projects/common/ui-elements/cloze/cloze.component.ts @@ -13,38 +13,40 @@ import { ElementComponent } from '../../directives/element-component.directive'; <ng-container *ngIf="elementModel.document.content.length == 0"> Kein Dokument vorhanden </ng-container> - <div [class.center-content]="elementModel.positionProps.dynamicPositioning && - elementModel.positionProps.fixedSize" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : 'auto'"> - <ng-container *ngFor="let part of elementModel.document.content"> - <ul *ngIf="part.type === 'bulletList'" - [style.font-size]="part.attrs.fontSize" - [style.list-style]="part.attrs.listStyle"> - <li *ngFor="let listItem of part.content"> - <ng-container *ngFor="let listItemPart of $any(listItem).content" + <div class="element-content-wrapper"> + <div [class.center-content]="elementModel.positionProps.dynamicPositioning && + elementModel.positionProps.fixedSize" + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : 'auto'"> + <ng-container *ngFor="let part of elementModel.document.content"> + <ul *ngIf="part.type === 'bulletList'" + [style.font-size]="part.attrs.fontSize" + [style.list-style]="part.attrs.listStyle"> + <li *ngFor="let listItem of part.content"> + <ng-container *ngFor="let listItemPart of $any(listItem).content" + [ngTemplateOutlet]="paragraphs" + [ngTemplateOutletContext]="{ $implicit: listItemPart }"></ng-container> + </li> + </ul> + <ol *ngIf="part.type === 'orderedList'" + [style.font-size]="part.attrs.fontSize" + [style.list-style]="part.attrs.listStyle"> + <li *ngFor="let listItem of part.content"> + <ng-container *ngFor="let listItemPart of $any(listItem).content" + [ngTemplateOutlet]="paragraphs" + [ngTemplateOutletContext]="{ $implicit: listItemPart }"></ng-container> + </li> + </ol> + <blockquote *ngIf="part.type === 'blockquote'"> + <ng-container *ngFor="let blockquotePart of $any(part).content" [ngTemplateOutlet]="paragraphs" - [ngTemplateOutletContext]="{ $implicit: listItemPart }"></ng-container> - </li> - </ul> - <ol *ngIf="part.type === 'orderedList'" - [style.font-size]="part.attrs.fontSize" - [style.list-style]="part.attrs.listStyle"> - <li *ngFor="let listItem of part.content"> - <ng-container *ngFor="let listItemPart of $any(listItem).content" - [ngTemplateOutlet]="paragraphs" - [ngTemplateOutletContext]="{ $implicit: listItemPart }"></ng-container> - </li> - </ol> - <blockquote *ngIf="part.type === 'blockquote'"> - <ng-container *ngFor="let blockquotePart of $any(part).content" + [ngTemplateOutletContext]="{ $implicit: blockquotePart }"></ng-container> + </blockquote> + <ng-container *ngIf="part.type === 'paragraph' || part.type === 'heading'" [ngTemplateOutlet]="paragraphs" - [ngTemplateOutletContext]="{ $implicit: blockquotePart }"></ng-container> - </blockquote> - <ng-container *ngIf="part.type === 'paragraph' || part.type === 'heading'" - [ngTemplateOutlet]="paragraphs" - [ngTemplateOutletContext]="{ $implicit: part }"></ng-container> - </ng-container> + [ngTemplateOutletContext]="{ $implicit: part }"></ng-container> + </ng-container> + </div> </div> <ng-template #paragraphs let-part> diff --git a/projects/common/ui-elements/drop-list/drop-list.component.ts b/projects/common/ui-elements/drop-list/drop-list.component.ts index cf7ddce3c2b0b64451de934d3ede27e9da09a62b..d2ebf53643beba0a6edf507093b4e9dc23d82fdb 100644 --- a/projects/common/ui-elements/drop-list/drop-list.component.ts +++ b/projects/common/ui-elements/drop-list/drop-list.component.ts @@ -10,7 +10,7 @@ import { DragNDropValueObject } from '../../models/uI-element'; @Component({ selector: 'aspect-drop-list', template: ` - <div class="list-container"> + <div class="element-content-wrapper"> <!-- Border width is a workaround to enable/disable the Material cdk-drop-list-receiving--> <!-- class style.--> <div class="list" @@ -69,7 +69,6 @@ import { DragNDropValueObject } from '../../models/uI-element'; </div> `, styles: [ - '.list-container {display: flex; flex-direction: column; width: 100%; height: 100%;}', '.list {border-radius: 10px; margin-bottom: 3px;}', // extra margin to reserve for outline '.text-item {border-radius: 10px; padding: 10px;}', '.item {cursor: grab}', @@ -85,8 +84,7 @@ import { DragNDropValueObject } from '../../models/uI-element'; '.dropList-highlight.cdk-drop-list-receiving {outline: solid;}', '.dropList-highlight.cdk-drop-list-dragging {outline: solid;}', - '.align-flex {flex: 1 1 auto; flex-flow: row wrap; display: flex; place-content: center space-around; gap: 10px}', - '.center-content {top: unset; transform: unset;}' + '.align-flex {flex: 1 1 auto; flex-flow: row wrap; display: flex; place-content: center space-around; gap: 10px}' ] }) export class DropListComponent extends FormElementComponent { diff --git a/projects/common/ui-elements/dropdown/dropdown.component.ts b/projects/common/ui-elements/dropdown/dropdown.component.ts index ec3b4e38b200d028429c238dd641d5d9d0b3d8ef..72e842f3057ce91cc01c5b33e2ffdb071031847c 100644 --- a/projects/common/ui-elements/dropdown/dropdown.component.ts +++ b/projects/common/ui-elements/dropdown/dropdown.component.ts @@ -5,34 +5,36 @@ import { DropdownElement } from './dropdown-element'; @Component({ selector: 'aspect-dropdown', template: ` - <mat-form-field appearance="fill" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [class.center-content]="elementModel.positionProps.dynamicPositioning && + <div class="element-content-wrapper"> + <mat-form-field appearance="fill" + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize" - aspectInputBackgroundColor [backgroundColor]="elementModel.surfaceProps.backgroundColor"> - <mat-label [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> - {{$any(elementModel).label}} - </mat-label> - <mat-select [formControl]="elementFormControl" [value]="elementModel.value"> - <mat-option *ngIf="elementModel.allowUnset" value="" - [style.pointer-events]="elementModel.readOnly ? 'none' : 'unset'" - (click)="$event.preventDefault()"> - </mat-option> - <mat-option *ngFor="let option of elementModel.options; let i = index" [value]="i + 1" - [style.pointer-events]="elementModel.readOnly ? 'none' : 'unset'"> - {{option}} - </mat-option> - </mat-select> - <mat-error *ngIf="elementFormControl.errors"> - {{elementFormControl.errors | errorTransform: elementModel}} - </mat-error> - </mat-form-field> + aspectInputBackgroundColor [backgroundColor]="elementModel.surfaceProps.backgroundColor"> + <mat-label [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> + {{$any(elementModel).label}} + </mat-label> + <mat-select [formControl]="elementFormControl" [value]="elementModel.value"> + <mat-option *ngIf="elementModel.allowUnset" value="" + [style.pointer-events]="elementModel.readOnly ? 'none' : 'unset'" + (click)="$event.preventDefault()"> + </mat-option> + <mat-option *ngFor="let option of elementModel.options; let i = index" [value]="i + 1" + [style.pointer-events]="elementModel.readOnly ? 'none' : 'unset'"> + {{option}} + </mat-option> + </mat-select> + <mat-error *ngIf="elementFormControl.errors"> + {{elementFormControl.errors | errorTransform: elementModel}} + </mat-error> + </mat-form-field> + </div> ` }) export class DropdownComponent extends FormElementComponent { diff --git a/projects/common/ui-elements/frame/frame.component.ts b/projects/common/ui-elements/frame/frame.component.ts index 798adf02535007155719196f4d029fb251faf913..587ed875c29503604c905aa82cbeffcc53bf2ad7 100644 --- a/projects/common/ui-elements/frame/frame.component.ts +++ b/projects/common/ui-elements/frame/frame.component.ts @@ -5,20 +5,22 @@ import { ElementComponent } from '../../directives/element-component.directive'; @Component({ selector: 'aspect-frame', template: ` - <div [class.center-content]="elementModel.positionProps.dynamicPositioning && - elementModel.positionProps.fixedSize" - [style.width]="elementModel.positionProps.fixedSize ? - elementModel.width + 'px' : - 'calc(100% - ' + (elementModel.borderWidth * 2) + 'px)'" - [style.height]="elementModel.positionProps.fixedSize ? - elementModel.height + 'px' : - 'calc(100% - ' + (elementModel.borderWidth * 2) + 'px)'" - [style.border-style]="elementModel.borderStyle" - [style.border-width.px]="elementModel.borderWidth" - [style.border-color]="elementModel.borderColor" - [style.border-radius.px]="elementModel.borderRadius" - [style.background-color]="elementModel.surfaceProps.backgroundColor"> - </div> + <div class="element-content-wrapper"> + <div [class.center-content]="elementModel.positionProps.dynamicPositioning && + elementModel.positionProps.fixedSize" + [style.width]="elementModel.positionProps.fixedSize ? + elementModel.width + 'px' : + 'calc(100% - ' + (elementModel.borderWidth * 2) + 'px)'" + [style.height]="elementModel.positionProps.fixedSize ? + elementModel.height + 'px' : + 'calc(100% - ' + (elementModel.borderWidth * 2) + 'px)'" + [style.border-style]="elementModel.borderStyle" + [style.border-width.px]="elementModel.borderWidth" + [style.border-color]="elementModel.borderColor" + [style.border-radius.px]="elementModel.borderRadius" + [style.background-color]="elementModel.surfaceProps.backgroundColor"> + </div> + </div> ` }) export class FrameComponent extends ElementComponent { diff --git a/projects/common/ui-elements/image/image.component.ts b/projects/common/ui-elements/image/image.component.ts index 10442fd7f9dcd5d61f8251592fa706c4ef87bdd5..e9bbb468ec5c128e2f62d9eb738ea1387d8602dc 100644 --- a/projects/common/ui-elements/image/image.component.ts +++ b/projects/common/ui-elements/image/image.component.ts @@ -8,9 +8,8 @@ import { ValueChangeElement } from '../../models/uI-element'; @Component({ selector: 'aspect-image', template: ` - <!-- Display Flex ensures that the image container is centered and - that image and magnifier are displayed properly.--> - <div [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + <div class="element-content-wrapper"> + <div [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize" @@ -31,6 +30,7 @@ import { ValueChangeElement } from '../../models/uI-element'; (elementValueChanged)="elementValueChanged.emit($event)"> </aspect-magnifier> </div> + </div> `, styles: [ '.image-container {position: relative}', diff --git a/projects/common/ui-elements/likert/likert.component.ts b/projects/common/ui-elements/likert/likert.component.ts index d1688939aa76d92a33fedba99a03476c48a2282c..cdb3d0c1c0c759af601839352f828b0b759ce72f 100644 --- a/projects/common/ui-elements/likert/likert.component.ts +++ b/projects/common/ui-elements/likert/likert.component.ts @@ -13,52 +13,55 @@ import { ElementComponent } from '../../directives/element-component.directive'; <div *ngIf="elementModel.rows.length === 0 && elementModel.columns.length === 0"> Keine Zeilen oder Spalten vorhanden </div> - <div [class.center-content]="elementModel.positionProps.dynamicPositioning && + <div class="element-content-wrapper"> + <div [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'"> - <div class="mat-typography" - [style.display]="'grid'" - [style.grid-template-columns]="elementModel.firstColumnSizeRatio + 'fr ' + + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'"> + <div class="mat-typography" + [style.display]="'grid'" + [style.grid-template-columns]="elementModel.firstColumnSizeRatio + 'fr ' + '1fr '.repeat(elementModel.columns.length)" - [style.background-color]="elementModel.surfaceProps.backgroundColor" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.line-height.%]="elementModel.fontProps.lineHeight" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> - <div *ngFor="let column of elementModel.columns; let i = index" - class="columns" fxLayout="column" fxLayoutAlign="end center" - [style.grid-column-start]="2 + i" - [style.grid-column-end]="3 + i" - [style.grid-row-start]="1" - [style.grid-row-end]="2"> - <img *ngIf="column.imgSrc && column.position === 'above'" - [src]="column.imgSrc | safeResourceUrl" alt="Image Placeholder" - [style.object-fit]="'scale-down'"> - {{column.text}} - <img *ngIf="column.imgSrc && column.position === 'below'" - [src]="column.imgSrc | safeResourceUrl" alt="Image Placeholder" - [style.object-fit]="'scale-down'"> - </div> + [style.background-color]="elementModel.surfaceProps.backgroundColor" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.line-height.%]="elementModel.fontProps.lineHeight" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> + <div *ngFor="let column of elementModel.columns; let i = index" + class="columns" fxLayout="column" fxLayoutAlign="end center" + [style.grid-column-start]="2 + i" + [style.grid-column-end]="3 + i" + [style.grid-row-start]="1" + [style.grid-row-end]="2"> + <img *ngIf="column.imgSrc && column.position === 'above'" + [src]="column.imgSrc | safeResourceUrl" alt="Image Placeholder" + [style.object-fit]="'scale-down'"> + {{column.text}} + <img *ngIf="column.imgSrc && column.position === 'below'" + [src]="column.imgSrc | safeResourceUrl" alt="Image Placeholder" + [style.object-fit]="'scale-down'"> + </div> - <ng-container *ngFor="let row of elementModel.rows; let i = index"> - <aspect-likert-radio-button-group - [style.background-color]="elementModel.lineColoring && i % 2 === 0 ? elementModel.lineColoringColor : ''" - [style.grid-column-start]="1" - [style.grid-column-end]="elementModel.columns.length + 2" - [style.grid-row-start]="2 + i" - [style.grid-row-end]="3 + i" - [style.padding.px]="3" - [elementModel]="row" - [firstColumnSizeRatio]="elementModel.firstColumnSizeRatio" - [parentForm]="parentForm" - (elementValueChanged)="elementValueChanged.emit($event)"> - </aspect-likert-radio-button-group> - </ng-container> - </div> + <ng-container *ngFor="let row of elementModel.rows; let i = index"> + <aspect-likert-radio-button-group + [style.background-color]="elementModel.lineColoring && i % 2 === 0 ? + elementModel.lineColoringColor : ''" + [style.grid-column-start]="1" + [style.grid-column-end]="elementModel.columns.length + 2" + [style.grid-row-start]="2 + i" + [style.grid-row-end]="3 + i" + [style.padding.px]="3" + [elementModel]="row" + [firstColumnSizeRatio]="elementModel.firstColumnSizeRatio" + [parentForm]="parentForm" + (elementValueChanged)="elementValueChanged.emit($event)"> + </aspect-likert-radio-button-group> + </ng-container> + </div> + </div> </div> `, styles: [ diff --git a/projects/common/ui-elements/radio-with-images/radio-group-images.component.ts b/projects/common/ui-elements/radio-with-images/radio-group-images.component.ts index e7da1b453581f5232222e51da34eaa072d7ad778..61a3719fc3390bb5b6355f1dbbdbd9c5af63de83 100644 --- a/projects/common/ui-elements/radio-with-images/radio-group-images.component.ts +++ b/projects/common/ui-elements/radio-with-images/radio-group-images.component.ts @@ -5,66 +5,68 @@ import { FormElementComponent } from '../../directives/form-element-component.di @Component({ selector: 'aspect-radio-group-images', template: ` - <div [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [class.center-content]="elementModel.positionProps.dynamicPositioning && + <div class="element-content-wrapper"> + <div [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize" - [style.display]="'grid !important'" - [style.grid-template-columns]="'1fr '.repeat(elementModel.columns.length)" - [style.background-color]="elementModel.surfaceProps.backgroundColor" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> - <label id="radio-group-label" class="label" - [style.grid-column-start]="1" - [style.grid-column-end]="2 + elementModel.columns.length" - [style.grid-row-start]="1" - [style.grid-row-end]="2" - [innerHTML]="elementModel.label"> - </label> - <div *ngFor="let option of elementModel.columns; let i = index" - class="columns" fxLayout="column" fxLayoutAlign="center center" - [style.grid-column-start]="1 + i" - [style.grid-column-end]="2 + i" - [style.grid-row-start]="2" - [style.grid-row-end]="3" - (click)="selectOption(i + 1)"> - <img *ngIf="option.imgSrc && option.position === 'above'" - [style.object-fit]="'scale-down'" - [style.max-width.%]="100" - [src]="option.imgSrc | safeResourceUrl" alt="Image Placeholder"> - <div>{{option.text}}</div> - <img *ngIf="option.imgSrc && option.position === 'below'" - [style.object-fit]="'scale-down'" - [style.max-width.%]="100" - [src]="option.imgSrc | safeResourceUrl" alt="Image Placeholder"> + [style.display]="'grid !important'" + [style.grid-template-columns]="'1fr '.repeat(elementModel.columns.length)" + [style.background-color]="elementModel.surfaceProps.backgroundColor" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> + <label id="radio-group-label" class="label" + [style.grid-column-start]="1" + [style.grid-column-end]="2 + elementModel.columns.length" + [style.grid-row-start]="1" + [style.grid-row-end]="2" + [innerHTML]="elementModel.label"> + </label> + <div *ngFor="let option of elementModel.columns; let i = index" + class="columns" fxLayout="column" fxLayoutAlign="center center" + [style.grid-column-start]="1 + i" + [style.grid-column-end]="2 + i" + [style.grid-row-start]="2" + [style.grid-row-end]="3" + (click)="selectOption(i + 1)"> + <img *ngIf="option.imgSrc && option.position === 'above'" + [style.object-fit]="'scale-down'" + [style.max-width.%]="100" + [src]="option.imgSrc | safeResourceUrl" alt="Image Placeholder"> + <div>{{option.text}}</div> + <img *ngIf="option.imgSrc && option.position === 'below'" + [style.object-fit]="'scale-down'" + [style.max-width.%]="100" + [src]="option.imgSrc | safeResourceUrl" alt="Image Placeholder"> + </div> + <mat-radio-group aria-labelledby="radio-group-label" + [formControl]="elementFormControl" + [style.display]="'grid'" + [style.grid-template-columns]="'1fr '.repeat(elementModel.columns.length)" + [style.grid-column-start]="1" + [style.grid-column-end]="2 + elementModel.columns.length" + [style.grid-row-start]="3" + [style.grid-row-end]="4" + [value]="elementModel.value"> + <mat-radio-button *ngFor="let option of elementModel.columns; let i = index" + aria-labelledby="radio-group-label" + [style.pointer-events]="elementModel.readOnly ? 'none' : 'unset'" + [value]="i + 1" + [style.grid-column-start]="1 + i" + [style.grid-column-end]="2 + i" + [style.grid-row-start]="1" + [style.grid-row-end]="2"> + </mat-radio-button> + </mat-radio-group> + <mat-error *ngIf="elementFormControl.errors && elementFormControl.touched" + class="error-message"> + {{elementFormControl.errors | errorTransform: elementModel}} + </mat-error> </div> - <mat-radio-group aria-labelledby="radio-group-label" - [formControl]="elementFormControl" - [style.display]="'grid'" - [style.grid-template-columns]="'1fr '.repeat(elementModel.columns.length)" - [style.grid-column-start]="1" - [style.grid-column-end]="2 + elementModel.columns.length" - [style.grid-row-start]="3" - [style.grid-row-end]="4" - [value]="elementModel.value"> - <mat-radio-button *ngFor="let option of elementModel.columns; let i = index" - aria-labelledby="radio-group-label" - [style.pointer-events]="elementModel.readOnly ? 'none' : 'unset'" - [value]="i + 1" - [style.grid-column-start]="1 + i" - [style.grid-column-end]="2 + i" - [style.grid-row-start]="1" - [style.grid-row-end]="2"> - </mat-radio-button> - </mat-radio-group> - <mat-error *ngIf="elementFormControl.errors && elementFormControl.touched" - class="error-message"> - {{elementFormControl.errors | errorTransform: elementModel}} - </mat-error> </div> `, styles: [ diff --git a/projects/common/ui-elements/radio/radio-button-group.component.ts b/projects/common/ui-elements/radio/radio-button-group.component.ts index 9ec65927ecf1580627c85c823e75256b61e1dbd4..33afd113628489e69e0d4caa8e76a02841cf94f3 100644 --- a/projects/common/ui-elements/radio/radio-button-group.component.ts +++ b/projects/common/ui-elements/radio/radio-button-group.component.ts @@ -5,40 +5,42 @@ import { RadioButtonGroupElement } from './radio-button-group-element'; @Component({ selector: 'aspect-radio-button-group', template: ` - <div class="mat-form-field" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [class.center-content]="elementModel.positionProps.dynamicPositioning && + <div class="element-content-wrapper"> + <div class="mat-form-field" + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize" - [style.background-color]="elementModel.surfaceProps.backgroundColor" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> - <label id="radio-group-label" - [innerHTML]="elementModel.label"> - </label> - <mat-radio-group aria-labelledby="radio-group-label" - [fxLayout]="elementModel.alignment" - [formControl]="elementFormControl" - [value]="elementModel.value" - [style.margin-top.px]="elementModel.label !== '' ? 10 : 0"> - <mat-radio-button *ngFor="let option of elementModel.options; let i = index" - [ngClass]="{ 'strike' : elementModel.strikeOtherOptions && + [style.background-color]="elementModel.surfaceProps.backgroundColor" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> + <label id="radio-group-label" + [innerHTML]="elementModel.label"> + </label> + <mat-radio-group aria-labelledby="radio-group-label" + [fxLayout]="elementModel.alignment" + [formControl]="elementFormControl" + [value]="elementModel.value" + [style.margin-top.px]="elementModel.label !== '' ? 10 : 0"> + <mat-radio-button *ngFor="let option of elementModel.options; let i = index" + [ngClass]="{ 'strike' : elementModel.strikeOtherOptions && elementFormControl.value !== null && elementFormControl.value !== i + 1 }" - [value]="i + 1" - [style.pointer-events]="elementModel.readOnly ? 'none' : 'unset'" - [style.line-height.%]="elementModel.fontProps.lineHeight"> - {{option}} - </mat-radio-button> - <mat-error *ngIf="elementFormControl.errors && elementFormControl.touched" - class="error-message"> - {{elementFormControl.errors | errorTransform: elementModel}} - </mat-error> - </mat-radio-group> + [value]="i + 1" + [style.pointer-events]="elementModel.readOnly ? 'none' : 'unset'" + [style.line-height.%]="elementModel.fontProps.lineHeight"> + {{option}} + </mat-radio-button> + <mat-error *ngIf="elementFormControl.errors && elementFormControl.touched" + class="error-message"> + {{elementFormControl.errors | errorTransform: elementModel}} + </mat-error> + </mat-radio-group> + </div> </div> `, styles: [ diff --git a/projects/common/ui-elements/slider/slider.component.ts b/projects/common/ui-elements/slider/slider.component.ts index 44cbded714e327ee1e1f9e82eb402777e8374339..8ef6e415106cc0cd7a1d0bd54e139c036d3499b4 100644 --- a/projects/common/ui-elements/slider/slider.component.ts +++ b/projects/common/ui-elements/slider/slider.component.ts @@ -7,88 +7,90 @@ import { FormElementComponent } from '../../directives/form-element-component.di @Component({ selector: 'aspect-slider', template: ` - <div fxLayout="column" - [style.background-color]="elementModel.surfaceProps.backgroundColor" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [class.center-content]="elementModel.positionProps.dynamicPositioning && + <div class="element-content-wrapper"> + <div fxLayout="column" + [style.background-color]="elementModel.surfaceProps.backgroundColor" + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize"> - <div *ngIf="elementModel.label" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.line-height.%]="elementModel.fontProps.lineHeight" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> - {{elementModel.label}} - </div> - <div #valueContainer - [class.values]="elementModel.label && !elementModel.showValues"> - <div fxFlex fxLayout="row" fxLayoutAlign="space-between"> - <div #valueMin - class="value-container-min"> - <div *ngIf="elementModel.showValues" - class="value-container"> - <div - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.line-height.%]="elementModel.fontProps.lineHeight" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> - {{elementModel.minValue | number:'':'de'}} + <div *ngIf="elementModel.label" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.line-height.%]="elementModel.fontProps.lineHeight" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> + {{elementModel.label}} + </div> + <div #valueContainer + [class.values]="elementModel.label && !elementModel.showValues"> + <div fxFlex fxLayout="row" fxLayoutAlign="space-between"> + <div #valueMin + class="value-container-min"> + <div *ngIf="elementModel.showValues" + class="value-container"> + <div + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.line-height.%]="elementModel.fontProps.lineHeight" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> + {{elementModel.minValue | number:'':'de'}} + </div> + <div *ngIf="elementModel.barStyle" class="number-marker"></div> </div> - <div *ngIf="elementModel.barStyle" class="number-marker"></div> </div> - </div> - <div #valueMax - [class.value-container-max]="elementModel.barStyle"> - <div *ngIf="elementModel.showValues" - class="value-container"> - <div - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.line-height.%]="elementModel.fontProps.lineHeight" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> - {{elementModel.maxValue | number:'':'de'}} - </div> - <div *ngIf="elementModel.barStyle" - class="number-marker"> + <div #valueMax + [class.value-container-max]="elementModel.barStyle"> + <div *ngIf="elementModel.showValues" + class="value-container"> + <div + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.line-height.%]="elementModel.fontProps.lineHeight" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''"> + {{elementModel.maxValue | number:'':'de'}} + </div> + <div *ngIf="elementModel.barStyle" + class="number-marker"> + </div> </div> </div> </div> </div> - </div> - <div *ngIf="elementModel.barStyle" - fxFlex fxLayout="row" fxLayoutAlign="space-between center" - [style.margin-top.px]="elementModel.showValues ? -18 : 0" - [style.margin-left.px]="valueMin.offsetWidth/2"> - <div class="arrow-line"></div> - <div class="arrow-head"></div> - </div> - <div *ngIf="valueMax && valueMin" - [style.display]="'flex'" - [style.flex-direction]="'column'" - [style.height.%]="100" - [style.margin-right.px]="elementModel.barStyle ? valueMax.offsetWidth/2 - 8 : valueMax.offsetWidth" - [style.margin-left.px]="elementModel.barStyle ? valueMin.offsetWidth/2 - 8: valueMin.offsetWidth" - [style.margin-top.px]="elementModel.barStyle ? -32 : -valueContainer.offsetHeight"> - <mat-slider - [class]="elementModel.barStyle ? 'bar-style' : ''" - [thumbLabel]="elementModel.thumbLabel" - [formControl]="elementFormControl" - [style.width.%]="100" - [max]="elementModel.maxValue" - [min]="elementModel.minValue"> - </mat-slider> - <mat-error *ngIf="elementFormControl.touched && elementFormControl.errors"> - {{elementModel.requiredWarnMessage}} - </mat-error> + <div *ngIf="elementModel.barStyle" + fxFlex fxLayout="row" fxLayoutAlign="space-between center" + [style.margin-top.px]="elementModel.showValues ? -18 : 0" + [style.margin-left.px]="valueMin.offsetWidth/2"> + <div class="arrow-line"></div> + <div class="arrow-head"></div> + </div> + <div *ngIf="valueMax && valueMin" + [style.display]="'flex'" + [style.flex-direction]="'column'" + [style.height.%]="100" + [style.margin-right.px]="elementModel.barStyle ? valueMax.offsetWidth/2 - 8 : valueMax.offsetWidth" + [style.margin-left.px]="elementModel.barStyle ? valueMin.offsetWidth/2 - 8: valueMin.offsetWidth" + [style.margin-top.px]="elementModel.barStyle ? -32 : -valueContainer.offsetHeight"> + <mat-slider + [class]="elementModel.barStyle ? 'bar-style' : ''" + [thumbLabel]="elementModel.thumbLabel" + [formControl]="elementFormControl" + [style.width.%]="100" + [max]="elementModel.maxValue" + [min]="elementModel.minValue"> + </mat-slider> + <mat-error *ngIf="elementFormControl.touched && elementFormControl.errors"> + {{elementModel.requiredWarnMessage}} + </mat-error> + </div> </div> </div> `, diff --git a/projects/common/ui-elements/spell-correct/spell-correct.component.ts b/projects/common/ui-elements/spell-correct/spell-correct.component.ts index 03db7709b3c64afaf067fe7ae7fb96b529f3cf9d..d065da2db3a884b69228651954b82cf8f6270a20 100644 --- a/projects/common/ui-elements/spell-correct/spell-correct.component.ts +++ b/projects/common/ui-elements/spell-correct/spell-correct.component.ts @@ -6,52 +6,55 @@ import { SpellCorrectElement } from './spell-correct-element'; @Component({ selector: 'aspect-spell-correct', template: ` - <div [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize"> - <div fxFlex - fxLayout="column" - aspectInputBackgroundColor [backgroundColor]="elementModel.surfaceProps.backgroundColor" - [style.width.%]="100" - [style.height.%]="100"> - <mat-form-field class="small-input"> - <input matInput type="text" - [style.text-align]="'center'" - autocomplete="off" - [readonly]="elementModel.readOnly" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" - [value]="elementModel.value" - [formControl]="elementFormControl"> - </mat-form-field> - <button #buttonElement - mat-button - type="button" - [disabled]="elementModel.readOnly" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : '400'" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" - [style.width.%]="100" - [style.margin-top]="'-20px'" - [style.text-decoration-line]= - "(inputElement && inputElement.focused) || - (inputElement && !!inputElement.value) || - (elementFormControl && elementFormControl.value === '') ? 'line-through' : ''" - (click)=" - elementFormControl.value === null ? - inputElement.focus() : - buttonElement.focus(); - elementFormControl.value === null ? - (elementFormControl.setValue('')) : - elementFormControl.setValue(null)">{{elementModel.label}} - </button> + <div class="element-content-wrapper"> + <div [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [class.center-content]="elementModel.positionProps.dynamicPositioning && + elementModel.positionProps.fixedSize"> + <div fxFlex + fxLayout="column" + aspectInputBackgroundColor [backgroundColor]="elementModel.surfaceProps.backgroundColor" + [style.width.%]="100" + [style.height.%]="100"> + <mat-form-field class="small-input"> + <input matInput type="text" + [style.text-align]="'center'" + autocomplete="off" + [readonly]="elementModel.readOnly" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" + [value]="elementModel.value" + [formControl]="elementFormControl"> + </mat-form-field> + <button #buttonElement + mat-button + type="button" + [disabled]="elementModel.readOnly" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : '400'" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" + [style.width.%]="100" + [style.margin-top]="'-20px'" + [style.text-decoration-line]= + "(inputElement && inputElement.focused) || + (inputElement && !!inputElement.value) || + (elementFormControl && elementFormControl.value === '') ? 'line-through' : ''" + (click)=" + elementFormControl.value === null ? + inputElement.focus() : + buttonElement.focus(); + elementFormControl.value === null ? + (elementFormControl.setValue('')) : + elementFormControl.setValue(null)">{{elementModel.label}} + </button> + </div> </div> </div> `, diff --git a/projects/common/ui-elements/text-area/text-area.component.ts b/projects/common/ui-elements/text-area/text-area.component.ts index 30c1f17e51fcc7872ed810b411fe4b5b8b7a7536..ccde78777fbd9d568368d6c256706c8eb7b294a2 100644 --- a/projects/common/ui-elements/text-area/text-area.component.ts +++ b/projects/common/ui-elements/text-area/text-area.component.ts @@ -7,35 +7,37 @@ import { TextAreaElement } from './text-area-element'; @Component({ selector: 'aspect-text-area', template: ` - <mat-form-field [ngClass]="{ 'no-label' : !elementModel.label}" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.min-height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [class.center-content]="elementModel.positionProps.dynamicPositioning && + <div class="element-content-wrapper"> + <mat-form-field [ngClass]="{ 'no-label' : !elementModel.label}" + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.min-height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize" - aspectInputBackgroundColor [backgroundColor]="elementModel.surfaceProps.backgroundColor" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" - [appearance]="$any(elementModel.appearance)"> - <mat-label *ngIf="elementModel.label">{{elementModel.label}}</mat-label> - <textarea matInput #input - autocomplete="off" rows="{{elementModel.rowCount}}" - [formControl]="elementFormControl" - [value]="$any(elementModel.value)" - [readonly]="elementModel.readOnly" - [style.min-width.%]="100" - [style.line-height.%]="elementModel.fontProps.lineHeight" - [style.resize]="elementModel.resizeEnabled ? 'both' : 'none'" - (focus)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(input) : null" - (blur)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(null): null"> + aspectInputBackgroundColor [backgroundColor]="elementModel.surfaceProps.backgroundColor" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" + [appearance]="$any(elementModel.appearance)"> + <mat-label *ngIf="elementModel.label">{{elementModel.label}}</mat-label> + <textarea matInput #input + autocomplete="off" rows="{{elementModel.rowCount}}" + [formControl]="elementFormControl" + [value]="$any(elementModel.value)" + [readonly]="elementModel.readOnly" + [style.min-width.%]="100" + [style.line-height.%]="elementModel.fontProps.lineHeight" + [style.resize]="elementModel.resizeEnabled ? 'both' : 'none'" + (focus)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(input) : null" + (blur)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(null): null"> </textarea> - <mat-error *ngIf="elementFormControl.errors"> - {{elementFormControl.errors | errorTransform: elementModel}} - </mat-error> - </mat-form-field> + <mat-error *ngIf="elementFormControl.errors"> + {{elementFormControl.errors | errorTransform: elementModel}} + </mat-error> + </mat-form-field> + </div> `, styles: [ ':host ::ng-deep div.mat-form-field-infix {padding-top: 0.2em; padding-bottom: 0.2em;}', diff --git a/projects/common/ui-elements/text-field/text-field.component.ts b/projects/common/ui-elements/text-field/text-field.component.ts index fc743ea0645a36841b5be35ecd05155094bc3963..c7cada8e96a178f7d4ef1070c82c8f96743e82ea 100644 --- a/projects/common/ui-elements/text-field/text-field.component.ts +++ b/projects/common/ui-elements/text-field/text-field.component.ts @@ -8,70 +8,71 @@ import { TextFieldElement } from './text-field-element'; @Component({ selector: 'aspect-text-field', template: ` - <mat-form-field *ngIf="elementModel.label !== ''" - [class.center-content]="elementModel.positionProps.dynamicPositioning && + <div class="element-content-wrapper"> + <mat-form-field *ngIf="elementModel.label !== ''" + [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" - aspectInputBackgroundColor [backgroundColor]="elementModel.surfaceProps.backgroundColor" - [appearance]="$any(elementModel.appearance)"> - <mat-label>{{elementModel.label}}</mat-label> - <input matInput type="text" #input autocomplete="off" - [formControl]="elementFormControl" - [value]="$any(elementModel.value)" - [pattern]="elementModel.pattern" - [readonly]="elementModel.readOnly" - (focus)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(input) : null" - (blur)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(null): null"> - <button *ngIf="elementModel.clearable" - type="button" - matSuffix mat-icon-button aria-label="Clear" - (click)="this.elementFormControl.setValue('')"> - <mat-icon>close</mat-icon> - </button> - <mat-error *ngIf="elementFormControl.errors"> - {{elementFormControl.errors | errorTransform: elementModel}} - </mat-error> - </mat-form-field> - <mat-form-field *ngIf="elementModel.label === ''" class="small-input" - [class.center-content]="elementModel.positionProps.dynamicPositioning && + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" + aspectInputBackgroundColor [backgroundColor]="elementModel.surfaceProps.backgroundColor" + [appearance]="$any(elementModel.appearance)"> + <mat-label>{{elementModel.label}}</mat-label> + <input matInput type="text" #input autocomplete="off" + [formControl]="elementFormControl" + [value]="$any(elementModel.value)" + [pattern]="elementModel.pattern" + [readonly]="elementModel.readOnly" + (focus)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(input) : null" + (blur)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(null): null"> + <button *ngIf="elementModel.clearable" + type="button" + matSuffix mat-icon-button aria-label="Clear" + (click)="this.elementFormControl.setValue('')"> + <mat-icon>close</mat-icon> + </button> + <mat-error *ngIf="elementFormControl.errors"> + {{elementFormControl.errors | errorTransform: elementModel}} + </mat-error> + </mat-form-field> + <mat-form-field *ngIf="elementModel.label === ''" class="small-input" + [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" - aspectInputBackgroundColor [backgroundColor]="elementModel.surfaceProps.backgroundColor" - [appearance]="$any(elementModel.appearance)"> - <input matInput type="text" #input autocomplete="off" - [formControl]="elementFormControl" - [value]="$any(elementModel.value)" - [readonly]="elementModel.readOnly" - [pattern]="elementModel.pattern" - (focus)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(input) : null" - (blur)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(null): null"> - <button *ngIf="elementModel.clearable" - type="button" - matSuffix mat-icon-button aria-label="Clear" - (click)="this.elementFormControl.setValue('')"> - <mat-icon>close</mat-icon> - </button> - <mat-error *ngIf="elementFormControl.errors"> - {{elementFormControl.errors | errorTransform: elementModel}} - </mat-error> - </mat-form-field> + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" + aspectInputBackgroundColor [backgroundColor]="elementModel.surfaceProps.backgroundColor" + [appearance]="$any(elementModel.appearance)"> + <input matInput type="text" #input autocomplete="off" + [formControl]="elementFormControl" + [value]="$any(elementModel.value)" + [readonly]="elementModel.readOnly" + [pattern]="elementModel.pattern" + (focus)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(input) : null" + (blur)="elementModel.inputAssistancePreset !== 'none' ? onFocusChanged.emit(null): null"> + <button *ngIf="elementModel.clearable" + type="button" + matSuffix mat-icon-button aria-label="Clear" + (click)="this.elementFormControl.setValue('')"> + <mat-icon>close</mat-icon> + </button> + <mat-error *ngIf="elementFormControl.errors"> + {{elementFormControl.errors | errorTransform: elementModel}} + </mat-error> + </mat-form-field> + </div> `, styles: [ - '.center-content {display: block; margin: auto; top: 50%; transform: translateY(-50%);}', '::ng-deep app-text-field .small-input div.mat-form-field-infix {border-top: none; padding: 0.55em 0 0.25em 0;}' // TODO ] }) diff --git a/projects/common/ui-elements/text/text.component.ts b/projects/common/ui-elements/text/text.component.ts index 28acbcc8ae6abcbc13efaffeac380943569ff327..19b3a43a6ce5dfaddd9859d312ee316d0f147831 100644 --- a/projects/common/ui-elements/text/text.component.ts +++ b/projects/common/ui-elements/text/text.component.ts @@ -8,34 +8,36 @@ import { ValueChangeElement } from '../../models/uI-element'; @Component({ selector: 'aspect-text', template: ` - <div [class.center-content]="elementModel.positionProps.dynamicPositioning && - elementModel.positionProps.fixedSize" - [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : 'auto'"> - <aspect-marking-bar - *ngIf="elementModel.highlightableYellow || - elementModel.highlightableTurquoise || - elementModel.highlightableOrange" - [elementModel]="elementModel" - (selectionChanged)="onSelectionChanged($event)"> - </aspect-marking-bar> - <div #textContainerRef class="text-container" - [class.orange-selection]="selectedColor === 'orange'" - [class.yellow-selection]="selectedColor === 'yellow'" - [class.turquoise-selection]="selectedColor === 'turquoise'" - [class.delete-selection]="selectedColor === 'delete'" - [style.background-color]="elementModel.surfaceProps.backgroundColor" - [style.color]="elementModel.fontProps.fontColor" - [style.font-family]="elementModel.fontProps.font" - [style.font-size.px]="elementModel.fontProps.fontSize" - [style.line-height.%]="elementModel.fontProps.lineHeight" - [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" - [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" - [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" - [innerHTML]="elementModel.text | safeResourceHTML" - (mousedown)="elementModel.highlightableYellow || - elementModel.highlightableTurquoise || - elementModel.highlightableOrange ? startSelection.emit($event) : null"> + <div class="element-content-wrapper"> + <div [class.center-content]="elementModel.positionProps.dynamicPositioning && + elementModel.positionProps.fixedSize" + [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : 'auto'"> + <aspect-marking-bar + *ngIf="elementModel.highlightableYellow || + elementModel.highlightableTurquoise || + elementModel.highlightableOrange" + [elementModel]="elementModel" + (selectionChanged)="onSelectionChanged($event)"> + </aspect-marking-bar> + <div #textContainerRef class="text-container" + [class.orange-selection]="selectedColor === 'orange'" + [class.yellow-selection]="selectedColor === 'yellow'" + [class.turquoise-selection]="selectedColor === 'turquoise'" + [class.delete-selection]="selectedColor === 'delete'" + [style.background-color]="elementModel.surfaceProps.backgroundColor" + [style.color]="elementModel.fontProps.fontColor" + [style.font-family]="elementModel.fontProps.font" + [style.font-size.px]="elementModel.fontProps.fontSize" + [style.line-height.%]="elementModel.fontProps.lineHeight" + [style.font-weight]="elementModel.fontProps.bold ? 'bold' : ''" + [style.font-style]="elementModel.fontProps.italic ? 'italic' : ''" + [style.text-decoration]="elementModel.fontProps.underline ? 'underline' : ''" + [innerHTML]="elementModel.text | safeResourceHTML" + (mousedown)="elementModel.highlightableYellow || + elementModel.highlightableTurquoise || + elementModel.highlightableOrange ? startSelection.emit($event) : null"> + </div> </div> </div> `, @@ -51,7 +53,8 @@ import { ValueChangeElement } from '../../models/uI-element'; '::ng-deep .text-container h3 {font-weight: bold; font-size: 16px;}', '::ng-deep .text-container h4 {font-weight: normal; font-size: 16px;}', ':host ::ng-deep mark {color: inherit}', - 'sup, sub {line-height: 0;}' + 'sup, sub {line-height: 0;}', + '.list-container {display: flex; flex-direction: column; width: 100%; height: 100%;}' ] }) export class TextComponent extends ElementComponent { diff --git a/projects/common/ui-elements/video/video.component.ts b/projects/common/ui-elements/video/video.component.ts index faf7d9ad3529adb3db915f1ab2e1a959b783ba2e..57af17b86f99fea61ce278050a8b9e8b56c59fb3 100644 --- a/projects/common/ui-elements/video/video.component.ts +++ b/projects/common/ui-elements/video/video.component.ts @@ -5,26 +5,29 @@ import { MediaPlayerElementComponent } from '../../directives/media-player-eleme @Component({ selector: 'aspect-video', template: ` - <div [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" - [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" - [class.center-content]="elementModel.positionProps.dynamicPositioning && elementModel.positionProps.fixedSize" - [class]="elementModel.scale ? 'fit-video' : 'max-size-video'"> - <video #player - (playing)="onMediaPlayStatusChanged.emit(this.elementModel.id)" - (pause)="onMediaPlayStatusChanged.emit(null)" - [style.width.%]="100" - [src]="elementModel.src | safeResourceUrl"> - </video> - <aspect-control-bar class="correct-position" - [player]="player" - [project]="project" - [active]="active" - [id]="elementModel.id" - [playerProperties]="elementModel.playerProps" - [dependencyDissolved]="dependencyDissolved" - (onMediaValidStatusChanged)="onMediaValidStatusChanged.emit($event)" - (elementValueChanged)="elementValueChanged.emit($event)"> - </aspect-control-bar> + <div class="element-content-wrapper"> + <div [style.width]="elementModel.positionProps.fixedSize ? elementModel.width + 'px' : '100%'" + [style.height]="elementModel.positionProps.fixedSize ? elementModel.height + 'px' : '100%'" + [class.center-content]="elementModel.positionProps.dynamicPositioning && + elementModel.positionProps.fixedSize" + [class]="elementModel.scale ? 'fit-video' : 'max-size-video'"> + <video #player + (playing)="onMediaPlayStatusChanged.emit(this.elementModel.id)" + (pause)="onMediaPlayStatusChanged.emit(null)" + [style.width.%]="100" + [src]="elementModel.src | safeResourceUrl"> + </video> + <aspect-control-bar class="correct-position" + [player]="player" + [project]="project" + [active]="active" + [id]="elementModel.id" + [playerProperties]="elementModel.playerProps" + [dependencyDissolved]="dependencyDissolved" + (onMediaValidStatusChanged)="onMediaValidStatusChanged.emit($event)" + (elementValueChanged)="elementValueChanged.emit($event)"> + </aspect-control-bar> + </div> </div> `, styles: [ diff --git a/projects/editor/src/styles.css b/projects/editor/src/styles.css index 3b245ccca1cea8b3f9e22b54c2ae11ef71e9219b..8e757eded61fe134ffa727be16ea73c9f7de119d 100644 --- a/projects/editor/src/styles.css +++ b/projects/editor/src/styles.css @@ -70,10 +70,11 @@ blockquote p { display: inline; } +.element-content-wrapper { + display: flex; + height: 100%; +} + .center-content { - position: relative; - display: block !important; - margin: auto !important; - top: 50%; - transform: translateY(-50%); + margin: auto; } diff --git a/projects/player/src/styles.css b/projects/player/src/styles.css index 55548925de6fc461dd0e34db43c30e6854039e54..d427ca0bb505c93184a089b96a1130b9ee0a3217 100644 --- a/projects/player/src/styles.css +++ b/projects/player/src/styles.css @@ -37,10 +37,12 @@ blockquote p { display: inline; } +.element-content-wrapper { + display: flex; + width: 100%; + height: 100%; +} + .center-content { - position: relative; - display: block !important; - margin: auto !important; - top: 50%; - transform: translateY(-50%); + margin: auto }