diff --git a/projects/editor/src/app/app.module.ts b/projects/editor/src/app/app.module.ts index 019bd19aa3caac239887caf70167bb84dada2eb7..8c6fbc5d93e5d8f254c34bd9111c6a5ad96b24b7 100644 --- a/projects/editor/src/app/app.module.ts +++ b/projects/editor/src/app/app.module.ts @@ -130,6 +130,8 @@ import { RadioWizardDialogComponent } from 'editor/src/app/components/dialogs/wi import { TextWizardDialogComponent } from 'editor/src/app/components/dialogs/wizards/text.dialog.component'; import { LikertWizardDialogComponent } from 'editor/src/app/components/dialogs/wizards/likert.dialog.component'; import { InputWizardDialogComponent } from 'editor/src/app/components/dialogs/wizards/input.dialog.component'; +import { RadioImagesWizardDialogComponent } from 'editor/src/app/components/dialogs/wizards/radio2.dialog.component'; +import { Text2WizardDialogComponent } from 'editor/src/app/components/dialogs/wizards/text2.dialog.component'; /** Custom options the configure the tooltip's default show/hide delays. */ export const myCustomTooltipDefaults: MatTooltipDefaultOptions = { @@ -194,7 +196,9 @@ export const myCustomTooltipDefaults: MatTooltipDefaultOptions = { GetValidAudioVideoIDsPipe, InputAssistancePropertiesComponent, RadioWizardDialogComponent, + RadioImagesWizardDialogComponent, TextWizardDialogComponent, + Text2WizardDialogComponent, LikertWizardDialogComponent, InputWizardDialogComponent ], diff --git a/projects/editor/src/app/components/dialogs/wizards/likert.dialog.component.ts b/projects/editor/src/app/components/dialogs/wizards/likert.dialog.component.ts index 72eaa7e614049b427579fc21984a458a43e46f99..a0f80e1267dd8abf1dbbfef94afc6de4f1860f53 100644 --- a/projects/editor/src/app/components/dialogs/wizards/likert.dialog.component.ts +++ b/projects/editor/src/app/components/dialogs/wizards/likert.dialog.component.ts @@ -1,18 +1,32 @@ import { Component } from '@angular/core'; +import { TextImageLabel } from 'common/models/elements/label-interfaces'; +import { LikertRowElement } from 'common/models/elements/compound-elements/likert/likert-row'; @Component({ selector: 'aspect-editor-likert-wizard-dialog', template: ` <div mat-dialog-title>Richtig/Falsch-Assistent</div> <div mat-dialog-content> - Text + <h3>Text</h3> <aspect-rich-text-editor [(content)]="text1"></aspect-rich-text-editor> - Satzanfang + <h3>Satzanfang</h3> <mat-form-field appearance="fill"> <textarea matInput type="text" [(ngModel)]="text2"></textarea> </mat-form-field> + <h3>Optionen</h3> + <aspect-option-list-panel class="options" [textFieldLabel]="'Neue Option'" + [itemList]="options" + [localMode]="true"> + </aspect-option-list-panel> + + <h3>Zeilen</h3> + <aspect-option-list-panel class="options" [textFieldLabel]="'Neue Zeile'" + [itemList]="rows" + [localMode]="true"> + </aspect-option-list-panel> + </div> <div mat-dialog-actions> @@ -22,6 +36,12 @@ import { Component } from '@angular/core'; ` }) export class LikertWizardDialogComponent { - text1: string = 'Testtext 1'; + text1: string = 'Hier steht die Frage der fünften Teilaufgabe mit Complex-Multiple-Choice (CMC). ' + + '[Optionentabelle] Bei einer Tabelle mit vielen' + + 'Zeilen kann ein Häkchen bei „haftende Kopfzeile“ gesetzt werden, damit die Spaltenüberschriften beim ' + + 'Scrollen sichtbar bleiben.'; + text2: string = 'Testtext 2'; + options: TextImageLabel[] = []; + rows: TextImageLabel[] = []; } diff --git a/projects/editor/src/app/components/dialogs/wizards/radio.dialog.component.ts b/projects/editor/src/app/components/dialogs/wizards/radio.dialog.component.ts index cd660876c88b14e12ae8d285a9758870e2f41089..481708a61372fa19a5056f3c91305429fe3ea4f5 100644 --- a/projects/editor/src/app/components/dialogs/wizards/radio.dialog.component.ts +++ b/projects/editor/src/app/components/dialogs/wizards/radio.dialog.component.ts @@ -12,7 +12,7 @@ import { Label } from 'common/models/elements/label-interfaces'; <mat-divider></mat-divider> - <h3>Satzanfang</h3> + <h3>Satzanfang (optional)</h3> <mat-form-field appearance="fill"> <textarea matInput type="text" [(ngModel)]="label2"></textarea> </mat-form-field> @@ -38,6 +38,6 @@ import { Label } from 'common/models/elements/label-interfaces'; }) export class RadioWizardDialogComponent { label1: string = 'Hier steht die Frage der Teilaufgabe mit Multiple Choice (MC).'; - label2: string = 'Hier könnte ein Satzanfang stehen ...'; + label2: string = ''; options: Label[] = []; } diff --git a/projects/editor/src/app/components/dialogs/wizards/radio2.dialog.component.ts b/projects/editor/src/app/components/dialogs/wizards/radio2.dialog.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..9511625d526b8d48bc179964f564f77d57d01d9f --- /dev/null +++ b/projects/editor/src/app/components/dialogs/wizards/radio2.dialog.component.ts @@ -0,0 +1,42 @@ +import { Component } from '@angular/core'; +import { TextImageLabel } from 'common/models/elements/label-interfaces'; + +@Component({ + selector: 'aspect-editor-radio-images-wizard-dialog', + template: ` + <div mat-dialog-title>Assistent: MC mit Bild</div> + <div mat-dialog-content> + <h3>Frage</h3> + <aspect-rich-text-editor class="input1" [(content)]="label1" [showReducedControls]="true"> + </aspect-rich-text-editor> + + <mat-divider></mat-divider> + + <h3>Optionen</h3> + <aspect-option-list-panel class="options" [textFieldLabel]="'Neue Option'" + [itemList]="options" + [showImageButton]="true" + [localMode]="true"> + </aspect-option-list-panel> + + <h3>Bilder je Zeile</h3> + <mat-form-field class="align-start"> + <input matInput type="number" min="1" maxlength="1" [(ngModel)]="itemsPerRow"> + </mat-form-field> + </div> + <div mat-dialog-actions> + <button mat-button [mat-dialog-close]="{ label1, options, itemsPerRow }">{{'confirm' | translate }}</button> + <button mat-button mat-dialog-close>{{'cancel' | translate }}</button> + </div> + `, + styles: ` + .mat-mdc-dialog-content {display: flex; flex-direction: column;} + /*.mat-mdc-dialog-content *:not(h3, mat-divider) {padding-left: 30px;}*/ + .input1 {min-height: 200px;} + ` +}) +export class RadioImagesWizardDialogComponent { + label1: string = 'Hier steht die Frage der Teilaufgabe mit Multiple Choice (MC).'; + options: TextImageLabel[] = []; + itemsPerRow: number = 4; +} diff --git a/projects/editor/src/app/components/dialogs/wizards/text.dialog.component.ts b/projects/editor/src/app/components/dialogs/wizards/text.dialog.component.ts index 6bba087b842b1773baa84efff76a747184062dd5..0c13d553e59cc07dad71fe3a123b6e734b68e2d3 100644 --- a/projects/editor/src/app/components/dialogs/wizards/text.dialog.component.ts +++ b/projects/editor/src/app/components/dialogs/wizards/text.dialog.component.ts @@ -48,7 +48,7 @@ import { Component } from '@angular/core'; }) export class TextWizardDialogComponent { text1: string = 'Lorem ipsum dolor sit amet'; - text2: string = 'Lorem ipsum dolor sit amet'; + text2: string = 'Platzhalter Quelle'; highlightableOrange: boolean = false; highlightableTurquoise: boolean = false; highlightableYellow: boolean = false; diff --git a/projects/editor/src/app/components/dialogs/wizards/text2.dialog.component.ts b/projects/editor/src/app/components/dialogs/wizards/text2.dialog.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..abf279e1e0f72609937d716b8c140a34f4b7214c --- /dev/null +++ b/projects/editor/src/app/components/dialogs/wizards/text2.dialog.component.ts @@ -0,0 +1,34 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'aspect-editor-text2-wizard-dialog', + template: ` + <div mat-dialog-title>Assistent: Markieren</div> + <div mat-dialog-content> + <h3>Text</h3> + <aspect-rich-text-editor class="input1" [(content)]="text1"></aspect-rich-text-editor> + + <h3>Tooltip</h3> + <mat-checkbox [(ngModel)]="showHelper" [style]="'margin-bottom: 20px;'"> + Anzeigen + </mat-checkbox> + </div> + <div mat-dialog-actions> + <button mat-button + [mat-dialog-close]="{ text1, showHelper }"> + {{'confirm' | translate }} + </button> + <button mat-button mat-dialog-close>{{'cancel' | translate }}</button> + </div> + `, + styles: ` + .mat-mdc-dialog-content {display: flex; flex-direction: column;} + .mat-mdc-dialog-content *:not(h3, mat-divider) {padding-left: 30px;} + h3 {text-decoration: underline;} + .input1 {min-height: 400px;} + ` +}) +export class Text2WizardDialogComponent { + text1: string = '[Frage] Markiere eine Stelle im Text, an der du das erkennst.'; + showHelper: boolean = true; +} diff --git a/projects/editor/src/app/components/new-ui-element-panel/ui-element-toolbox.component.html b/projects/editor/src/app/components/new-ui-element-panel/ui-element-toolbox.component.html index 66096a09fe22392260bb68f0ef59dbab78f80d3f..2013fe5198f8ae6ff01d85e2f0578ac092e80461 100644 --- a/projects/editor/src/app/components/new-ui-element-panel/ui-element-toolbox.component.html +++ b/projects/editor/src/app/components/new-ui-element-panel/ui-element-toolbox.component.html @@ -211,14 +211,20 @@ <button mat-stroked-button (click)="applyTemplate('text')"> Stimulus: Text </button> + <button mat-stroked-button (click)="applyTemplate('text2')"> + Markieren + </button> <button mat-stroked-button (click)="applyTemplate('input')"> Antwortfeld(er) </button> <button mat-stroked-button (click)="applyTemplate('radio')"> MC mit Text </button> + <button mat-stroked-button (click)="applyTemplate('radio_images')"> + MC mit Bild + </button> <button mat-stroked-button (click)="applyTemplate('likert')"> - Likert + Richtig/Falsch-Aufgaben </button> </div> </mat-tab> diff --git a/projects/editor/src/app/services/template.service.ts b/projects/editor/src/app/services/template.service.ts index d2a3c22033adf1507dadad471d88ec69a115dc01..0ee8d251945126f9e41e7d385f59ffdeafcc4966 100644 --- a/projects/editor/src/app/services/template.service.ts +++ b/projects/editor/src/app/services/template.service.ts @@ -6,11 +6,14 @@ import { PositionProperties, PropertyGroupGenerators } from 'common/models/eleme import { Section, SectionProperties } from 'common/models/section'; import { UnitService } from 'editor/src/app/services/unit-services/unit.service'; import { IDService } from 'editor/src/app/services/id.service'; -import { TextLabel } from 'common/models/elements/label-interfaces'; +import { TextImageLabel, TextLabel } from 'common/models/elements/label-interfaces'; import { PositionedUIElement, UIElement, UIElementType } from 'common/models/elements/element'; import { TextWizardDialogComponent } from 'editor/src/app/components/dialogs/wizards/text.dialog.component'; import { LikertWizardDialogComponent } from 'editor/src/app/components/dialogs/wizards/likert.dialog.component'; import { InputWizardDialogComponent } from 'editor/src/app/components/dialogs/wizards/input.dialog.component'; +import { RadioImagesWizardDialogComponent } from 'editor/src/app/components/dialogs/wizards/radio2.dialog.component'; +import { Text2WizardDialogComponent } from 'editor/src/app/components/dialogs/wizards/text2.dialog.component'; +import { LikertRowElement, LikertRowProperties } from 'common/models/elements/compound-elements/likert/likert-row'; @Injectable({ providedIn: 'root' @@ -41,6 +44,12 @@ export class TemplateService { if (result) resolve(this.createTextSection(result)); }); break; + case 'text2': + this.dialog.open(Text2WizardDialogComponent, {}) + .afterClosed().subscribe((result: { text1: string, showHelper: boolean }) => { + if (result) resolve(this.createText2Section(result)); + }); + break; case 'input': this.dialog.open(InputWizardDialogComponent, {}) .afterClosed().subscribe((result: { @@ -60,10 +69,16 @@ export class TemplateService { if (result) resolve(this.createRadioSection(result)); }); break; + case 'radio_images': + this.dialog.open(RadioImagesWizardDialogComponent, {}) + .afterClosed().subscribe((result: { label1: string, options: TextLabel[], itemsPerRow: number }) => { + if (result) resolve(this.createRadioImagesSection(result)); + }); + break; case 'likert': this.dialog.open(LikertWizardDialogComponent, {}) - .afterClosed().subscribe(() => { - resolve(this.createLikertSection()); + .afterClosed().subscribe((result: { text1: string, text2: string, options: TextImageLabel[], rows: TextImageLabel[] }) => { + if (result) resolve(this.createLikertSection(result)); }); break; default: @@ -94,6 +109,35 @@ export class TemplateService { } as SectionProperties); } + private createText2Section(config: { text1: string, showHelper: boolean }): Section { + const sectionElements: UIElement[] = [ + this.createElement( + 'text', + { gridRow: 1, gridColumn: 1, gridRowRange: 2, marginBottom: { value: 40, unit: 'px' } }, + { + text: config.text1 + }) + ]; + if (config.showHelper) { + sectionElements.push( + this.createElement( + 'button', + { gridRow: 1, gridColumn: 2 }, + { + imageSrc: 'data:image/png;base64,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', + tooltipText: 'Drücke kurz auf den Knopf mit dem Stift. Drücke danach auf den Anfang' + + 'eines Wortes. Halte gedrückt und ziehe im Text so weit, wie du markieren möchtest.', + tooltipPosition: 'left' + }) + ); + } + return new Section({ + elements: sectionElements, + ...config.showHelper && { autoColumnSize: false }, + ...config.showHelper && { gridColumnSizes: [{ value: 1, unit: 'fr' }, { value: 45, unit: 'px' }] } + } as SectionProperties); + } + private createInputSection(config: { text: string, answerCount: number, useTextAreas: boolean, numbering: 'latin' | 'decimal' | 'bullets' | 'none', fieldLength: 'very-small' | 'small' | 'medium' | 'large', expectedCharsCount: number }): Section { @@ -118,7 +162,7 @@ export class TemplateService { sectionElements.push( this.createElement( 'text', - { gridRow: i + 2, gridColumn: 1, marginTop: { value: 16, unit: 'px' }}, + { gridRow: i + 2, gridColumn: 1, marginTop: { value: 16, unit: 'px' } }, { text: `${numberingChars[i]}` } ) ); @@ -197,9 +241,45 @@ export class TemplateService { } as SectionProperties); } - private createLikertSection(): Section { + private createRadioImagesSection(config: { label1: string, options: TextLabel[], itemsPerRow: number }): Section { return new Section({ - // elements: [] + elements: [ + this.createElement( + 'text', + { gridRow: 1, gridColumn: 1, marginBottom: { value: 5, unit: 'px' } }, + { text: config.label1 }), + this.createElement( + 'radio-group-images', + { gridRow: 2, gridColumn: 1 }, + { options: config.options, itemsPerRow: config.itemsPerRow }) + ] + } as SectionProperties); + } + + private createLikertSection(config: { text1: string, text2: string, options: TextImageLabel[], rows: TextImageLabel[] }): Section { + return new Section({ + elements: [ + this.createElement( + 'text', + { gridRow: 1, gridColumn: 1, marginBottom: { value: 10, unit: 'px' } }, + { text: config.text1 }), + this.createElement( + 'likert', + { gridRow: 2, gridColumn: 1 }, + { + options: config.options, + rows: config.rows.map(row => new LikertRowElement({ + id: this.idService.getAndRegisterNewID('likert-row'), + rowLabel: { + ...row + }, + columnCount: config.options.length + } as LikertRowProperties)), + label: config.text2, + stickyHeader: true, + firstColumnSizeRatio: 3 + }) + ] } as SectionProperties); }