diff --git a/docs/release-notes-editor.txt b/docs/release-notes-editor.txt index e3c859fb3fd161ae76b1edc2ab89406dafc48245..afb2f7936a11a17d77558a632d8b2205a78047c8 100644 --- a/docs/release-notes-editor.txt +++ b/docs/release-notes-editor.txt @@ -7,6 +7,9 @@ Editor Die Bereiche können als Ellipsen, Rechtecke und Dreiecke angelegt werden. Ihre Position, Größe, Drehung, Farbe und Rahmenbreite kann eingestellt werden. Das Element kann als Pflichtfeld ausgezeichnet werden. +- Ermöglicht für Eingabebereichen die dynamische Anpassung der Anzahl von Zeilen + Auf Grundlage der Angabe der erwarteten Zeichen für die Antwort des Users wird + für das gegebene Seitenformat die Anzahl der Zeilen berechnet. 1.34.0 - Implement GeoGebra applet element diff --git a/docs/unit_definition_changelog.txt b/docs/unit_definition_changelog.txt index e1191b805040d424d86b9407584363c06c1bde89..0cd16e5749302460dc69be6a6b4830a6928056b2 100644 --- a/docs/unit_definition_changelog.txt +++ b/docs/unit_definition_changelog.txt @@ -41,3 +41,5 @@ iqb-aspect-definition@1.0.0 3.8.0 - +HotspotImageElement +- Textarea: +hasDynamicRowCount: boolean; + +expectedCharactersCount: number; diff --git a/projects/common/components/input-elements/text-area.component.ts b/projects/common/components/input-elements/text-area.component.ts index 05670801d691c783b9c54547ccc9113ea8e14368..f50ec9c48e8b4aec3a9d833b1eb8f35f2015f358 100644 --- a/projects/common/components/input-elements/text-area.component.ts +++ b/projects/common/components/input-elements/text-area.component.ts @@ -26,8 +26,12 @@ import { FormElementComponent } from '../../directives/form-element-component.di autocapitalize="none" autocorrect="off" spellcheck="false" - rows="{{elementModel.rowCount}}" value="{{elementModel.value}}" + [rows]="elementModel.rowCount | updateTextareaRows : + elementModel.expectedCharactersCount : + elementModel.hasDynamicRowCount : + input.offsetWidth : + elementModel.styling.fontSize" [attr.inputmode]="elementModel.showSoftwareKeyboard ? 'none' : 'text'" [formControl]="elementFormControl" [readonly]="elementModel.readOnly" diff --git a/projects/common/models/elements/input-elements/text-area.ts b/projects/common/models/elements/input-elements/text-area.ts index 2c4505c84f9e5a1255935f9c7eb3d8ddf583b699..aa7166cd4f483526574fc579da3a51ee8ab371a2 100644 --- a/projects/common/models/elements/input-elements/text-area.ts +++ b/projects/common/models/elements/input-elements/text-area.ts @@ -12,7 +12,9 @@ import { TextAreaComponent } from 'common/components/input-elements/text-area.co export class TextAreaElement extends InputElement implements PositionedUIElement { appearance: 'fill' | 'outline' = 'outline'; resizeEnabled: boolean = false; + hasDynamicRowCount: boolean = false; rowCount: number = 3; + expectedCharactersCount: number = 300; inputAssistancePreset: InputAssistancePreset = null; inputAssistancePosition: 'floating' | 'right' = 'floating'; hasArrowKeys: boolean = false; @@ -30,6 +32,8 @@ export class TextAreaElement extends InputElement implements PositionedUIElement if (element.appearance) this.appearance = element.appearance; if (element.resizeEnabled) this.resizeEnabled = element.resizeEnabled; if (element.rowCount) this.rowCount = element.rowCount; + if (element.hasDynamicRowCount) this.hasDynamicRowCount = element.hasDynamicRowCount; + if (element.expectedCharactersCount) this.expectedCharactersCount = element.expectedCharactersCount; if (element.inputAssistancePreset) this.inputAssistancePreset = element.inputAssistancePreset; if (element.inputAssistancePosition) this.inputAssistancePosition = element.inputAssistancePosition; if (element.restrictedToInputAssistanceChars !== undefined) { diff --git a/projects/common/pipes/update-textarea-rows.pipe.spec.ts b/projects/common/pipes/update-textarea-rows.pipe.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..0c99a0bbe05b4cdcf742515fa2f4e3867342e74f --- /dev/null +++ b/projects/common/pipes/update-textarea-rows.pipe.spec.ts @@ -0,0 +1,8 @@ +import { UpdateTextareaRowsPipe } from './update-textarea-rows.pipe'; + +describe('UpdateRowsPipe', () => { + it('create an instance', () => { + const pipe = new UpdateTextareaRowsPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/projects/common/pipes/update-textarea-rows.pipe.ts b/projects/common/pipes/update-textarea-rows.pipe.ts new file mode 100644 index 0000000000000000000000000000000000000000..24f6119a04e4baac6d35dbbf65e756c8945a770d --- /dev/null +++ b/projects/common/pipes/update-textarea-rows.pipe.ts @@ -0,0 +1,19 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'updateTextareaRows' +}) +export class UpdateTextareaRowsPipe implements PipeTransform { + transform(staticRowCount: number, + expectedCharactersCount: number, + hasDynamicRowCount: boolean, + inputWidth: number, + fontSize: number + ): number { + if (hasDynamicRowCount && expectedCharactersCount && inputWidth) { + const averageCharWidth = fontSize / 2; // s. AverageCharWidth of dotNet + return (Math.ceil((expectedCharactersCount * averageCharWidth) / inputWidth)); + } + return staticRowCount; + } +} diff --git a/projects/common/shared.module.ts b/projects/common/shared.module.ts index 36c93011c6af052077b3ac52af643984a6dc9948..d17113c90777573943c5406c71d14eecb071f280 100644 --- a/projects/common/shared.module.ts +++ b/projects/common/shared.module.ts @@ -71,6 +71,7 @@ import { GeometryComponent } from './components/geometry/geometry.component'; import { MathAtanPipe } from './pipes/math-atan.pipe'; import { MathDegreesPipe } from './pipes/math-degrees.pipe'; import { ArrayIncludesPipe } from './pipes/array-includes.pipe'; +import { UpdateTextareaRowsPipe } from './pipes/update-textarea-rows.pipe'; @NgModule({ imports: [ @@ -132,7 +133,8 @@ import { ArrayIncludesPipe } from './pipes/array-includes.pipe'; GeometryComponent, MathAtanPipe, MathDegreesPipe, - ArrayIncludesPipe + ArrayIncludesPipe, + UpdateTextareaRowsPipe ], exports: [ CommonModule, diff --git a/projects/editor/src/app/components/properties-panel/model-properties-tab/element-model-properties.component.html b/projects/editor/src/app/components/properties-panel/model-properties-tab/element-model-properties.component.html index 1c3ca293ce2a0d014a11860393b711410e5e6d51..8a1c6eff58f33795d8c4f4275b2d13910ba0936c 100644 --- a/projects/editor/src/app/components/properties-panel/model-properties-tab/element-model-properties.component.html +++ b/projects/editor/src/app/components/properties-panel/model-properties-tab/element-model-properties.component.html @@ -82,13 +82,26 @@ {{'propertiesPanel.resizeEnabled' | translate }} </mat-checkbox> - <mat-form-field *ngIf="combinedProperties.rowCount != null" + <mat-checkbox *ngIf="combinedProperties.hasDynamicRowCount !== undefined" + [checked]="$any(combinedProperties.hasDynamicRowCount)" + (change)="updateModel.emit({ property: 'hasDynamicRowCount', value: $event.checked })"> + {{'propertiesPanel.hasDynamicRowCount' | translate }} + </mat-checkbox> + + <mat-form-field *ngIf="combinedProperties.rowCount != null && combinedProperties.hasDynamicRowCount === false" appearance="fill" class="mdInput textsingleline"> <mat-label>{{'rows' | translate }}</mat-label> <input matInput type="number" [value]="$any(combinedProperties.rowCount)" (input)="updateModel.emit({ property: 'rowCount', value: $any($event.target).value })"> </mat-form-field> + <mat-form-field *ngIf="combinedProperties.expectedCharactersCount != null && combinedProperties.hasDynamicRowCount" + appearance="fill" class="mdInput textsingleline"> + <mat-label>{{'propertiesPanel.expectedCharactersCount' | translate }}</mat-label> + <input matInput type="number" [value]="$any(combinedProperties.expectedCharactersCount)" + (input)="updateModel.emit({ property: 'expectedCharactersCount', value: $any($event.target).value })"> + </mat-form-field> + <aspect-button-properties [combinedProperties]="combinedProperties" (updateModel)="updateModel.emit($event)"> </aspect-button-properties> diff --git a/projects/editor/src/assets/i18n/de.json b/projects/editor/src/assets/i18n/de.json index d68588678a97129fb22e07fb0aed9205017021c5..43bc4abb1167a4ab194e87529416c777f1a0dc02 100644 --- a/projects/editor/src/assets/i18n/de.json +++ b/projects/editor/src/assets/i18n/de.json @@ -179,7 +179,9 @@ "customToolBar": "Anpassung Werkzeugleiste", "customToolbarHelp": "Hier kann definiert werden, welche Elemente auf der Werkzeigleiste angezeigt werden sollen. Für Details bitte die Dokumentation konsultieren.", "hotspots": "Aktive Bereiche", - "newHotspot": "Neuer Bereich" + "newHotspot": "Neuer Bereich", + "hasDynamicRowCount": "Dynamische Zeilen", + "expectedCharactersCount": "Erwartete Zeichenanzahl" }, "hotspot": { "top": "Abstand von oben",