diff --git a/projects/common/app.module.ts b/projects/common/app.module.ts index 14b81ebc05302c82d4595569fa5a8f78d250da79..40932a2f2d2cac47179e678265aea7d8612bcecc 100644 --- a/projects/common/app.module.ts +++ b/projects/common/app.module.ts @@ -14,7 +14,6 @@ import { MatExpansionModule } from '@angular/material/expansion'; import { MatRadioModule } from '@angular/material/radio'; import { DragDropModule } from '@angular/cdk/drag-drop'; import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatDialogModule } from '@angular/material/dialog'; import { MatTabsModule } from '@angular/material/tabs'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSnackBarModule } from '@angular/material/snack-bar'; @@ -71,7 +70,6 @@ import { DropdownComponent } from './element-components/dropdown.component'; MatListModule, MatExpansionModule, MatSidenavModule, - MatDialogModule, MatFormFieldModule, ButtonComponent, TextComponent, diff --git a/projects/editor/src/app/app.module.ts b/projects/editor/src/app/app.module.ts index 24db55503250d35e7bbb594182fe987107c872f1..91008b27603c0e19b86f1ea8de663528f20771a0 100644 --- a/projects/editor/src/app/app.module.ts +++ b/projects/editor/src/app/app.module.ts @@ -4,11 +4,13 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { CommonModule } from '@angular/common'; import { createCustomElement } from '@angular/elements'; +import { MatDialogModule } from '@angular/material/dialog'; + import { AppComponent } from './app.component'; import { ToolbarComponent } from './components/toolbar/toolbar.component'; import { UiElementToolboxComponent } from './components/unit-view/page-view/ui-element-toolbox/ui-element-toolbox.component'; import { PropertiesComponent } from './components/unit-view/page-view/properties/properties.component'; -import { ConfirmationDialog, UnitViewComponent } from './components/unit-view/unit-view.component'; +import { UnitViewComponent } from './components/unit-view/unit-view.component'; import { PageViewComponent } from './components/unit-view/page-view/page-view.component'; import { PageCanvasComponent } from './components/unit-view/page-view/canvas/page-canvas.component'; import { CanvasToolbarComponent } from './components/unit-view/page-view/canvas/canvas.toolbar.component'; @@ -16,6 +18,7 @@ import { CanvasSectionComponent } from './components/unit-view/page-view/canvas/ import { CanvasSectionToolbarComponent } from './components/unit-view/page-view/canvas/canvas-section-toolbar.component'; import { CanvasDragOverlayComponent } from './components/unit-view/page-view/canvas/canvas-drag-overlay.component'; import { SharedModule } from '../../../common/app.module'; +import { ConfirmationDialog, MultilineTextEditDialog, TextEditDialog } from './dialog.service'; @NgModule({ declarations: [ @@ -29,14 +32,17 @@ import { SharedModule } from '../../../common/app.module'; CanvasToolbarComponent, CanvasSectionComponent, CanvasSectionToolbarComponent, + CanvasDragOverlayComponent, ConfirmationDialog, - CanvasDragOverlayComponent + TextEditDialog, + MultilineTextEditDialog ], imports: [ BrowserModule, BrowserAnimationsModule, CommonModule, - SharedModule + SharedModule, + MatDialogModule ], providers: [] }) diff --git a/projects/editor/src/app/components/unit-view/page-view/canvas/canvas-drag-overlay.component.ts b/projects/editor/src/app/components/unit-view/page-view/canvas/canvas-drag-overlay.component.ts index dae87a5651141fc78eb429d66fbd720b08f68eb8..e67b53b63353f5c5ff4eaa9e3a252a8c41aed453 100644 --- a/projects/editor/src/app/components/unit-view/page-view/canvas/canvas-drag-overlay.component.ts +++ b/projects/editor/src/app/components/unit-view/page-view/canvas/canvas-drag-overlay.component.ts @@ -12,7 +12,8 @@ import { UnitService } from '../../../../unit.service'; <!-- Needs extra div because styling can interfere with drag and drop--> <div class="draggable-element" [class.draggable-element-selected]="selected" cdkDrag [cdkDragData]="this.element" [cdkDragDisabled]="!selected" - (click)="click($event)"> + (click)="click($event)" + (dblclick)="openEditDialog()"> <div [style.position]="'absolute'" [style.border]="selected ? '2px solid' : ''" [style.width.px]="element.width" @@ -91,4 +92,8 @@ export class CanvasDragOverlayComponent implements OnInit { this.unitService.updateSelectedElementProperty('width', Math.max(this.oldX + event.distance.x, 0)); this.unitService.updateSelectedElementProperty('height', Math.max(this.oldY + event.distance.y, 0)); } + + openEditDialog(): void { + this.unitService.showDefaultEditDialog(this.element); + } } diff --git a/projects/editor/src/app/components/unit-view/unit-view.component.ts b/projects/editor/src/app/components/unit-view/unit-view.component.ts index 848d0692d959201996aa3f36b4e0c7c7be980fa1..49454d1522ddb9109fbc7185c53687599312d6a0 100644 --- a/projects/editor/src/app/components/unit-view/unit-view.component.ts +++ b/projects/editor/src/app/components/unit-view/unit-view.component.ts @@ -3,9 +3,9 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { Observable, Subscription } from 'rxjs'; -import { MatDialog } from '@angular/material/dialog'; import { UnitService } from '../../unit.service'; import { Unit } from '../../../../../common/unit'; +import { DialogService } from '../../dialog.service'; @Component({ selector: 'app-unit-view', @@ -22,7 +22,7 @@ import { Unit } from '../../../../../common/unit'; ] }) export class UnitViewComponent { - constructor(public unitService: UnitService, public dialog: MatDialog) { } + constructor(public unitService: UnitService, private dialogService: DialogService) { } addPage(): void { this.unitService.addPage(); @@ -33,25 +33,10 @@ export class UnitViewComponent { } showConfirmDialog(): void { - const dialogRef = this.dialog.open(ConfirmationDialog); - dialogRef.afterClosed().subscribe((result: boolean) => { + this.dialogService.showConfirmDialog().subscribe((result: boolean) => { if (result) { this.unitService.deletePage(); } }); } } - -@Component({ - selector: 'app-confirmation-dialog', - template: ` - <mat-dialog-content> - Seite wirklich löschen? - </mat-dialog-content> - <mat-dialog-actions> - <button mat-button [mat-dialog-close]="true">Okay</button> - <button mat-button mat-dialog-close>Abbruch</button> - </mat-dialog-actions> - ` -}) -export class ConfirmationDialog {} diff --git a/projects/editor/src/app/dialog.service.ts b/projects/editor/src/app/dialog.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..5b019bbcdf5705e72158e5386c9ea543038b4a88 --- /dev/null +++ b/projects/editor/src/app/dialog.service.ts @@ -0,0 +1,88 @@ +// eslint-disable-next-line max-classes-per-file +import { Component, Inject, Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog'; + +@Injectable({ + providedIn: 'root' +}) +export class DialogService { + constructor(private dialog: MatDialog) { } + + showConfirmDialog(): Observable<boolean> { + const dialogRef = this.dialog.open(ConfirmationDialog); + return dialogRef.afterClosed(); + } + + showTextEditDialog(oldText: string, multiline: boolean = false): Observable<string> { + let dialogRef = null; + if (multiline) { + dialogRef = this.dialog.open(MultilineTextEditDialog, { + width: '600px', + data: { + oldText: oldText + } + }); + } else { + dialogRef = this.dialog.open(TextEditDialog, { + data: { + oldText: oldText + } + }); + } + return dialogRef.afterClosed(); + } +} + +@Component({ + selector: 'app-confirmation-dialog', + template: ` + <mat-dialog-content> + Seite wirklich löschen? + </mat-dialog-content> + <mat-dialog-actions> + <button mat-button [mat-dialog-close]="true">Okay</button> + <button mat-button mat-dialog-close>Abbruch</button> + </mat-dialog-actions> + ` +}) +export class ConfirmationDialog {} + +@Component({ + selector: 'app-text-edit-dialog', + template: ` + <mat-dialog-content> + <mat-form-field> + <mat-label>Text</mat-label> + <input #inputElement matInput type="text" [value]="data.oldText"> + </mat-form-field> + </mat-dialog-content> + <mat-dialog-actions> + <button mat-button [mat-dialog-close]="inputElement.value">Okay</button> + <button mat-button mat-dialog-close>Abbruch</button> + </mat-dialog-actions> + ` +}) +export class TextEditDialog { + constructor(@Inject(MAT_DIALOG_DATA) public data: { oldText: string }) { } +} + +@Component({ + selector: 'app-multiline-text-edit-dialog', + template: ` + <mat-dialog-content> + <mat-form-field [style.width.%]="100"> + <mat-label>Text</mat-label> + <textarea #inputElement matInput type="text" [value]="data.oldText"> + </textarea> + </mat-form-field> + </mat-dialog-content> + <mat-dialog-actions> + <button mat-button [mat-dialog-close]="inputElement.value">Okay</button> + <button mat-button mat-dialog-close>Abbruch</button> + </mat-dialog-actions> + ` +}) +export class MultilineTextEditDialog { + constructor(@Inject(MAT_DIALOG_DATA) public data: { oldText: string }) { } +} diff --git a/projects/editor/src/app/unit.service.ts b/projects/editor/src/app/unit.service.ts index 22651cd756569090a6343431784521c20cb6b2cb..60a3617949f1a0b82d40eea75309f251334ff953 100644 --- a/projects/editor/src/app/unit.service.ts +++ b/projects/editor/src/app/unit.service.ts @@ -3,12 +3,14 @@ import { BehaviorSubject, Observable } from 'rxjs'; import { + ButtonElement, TextElement, Unit, UnitPage, UnitPageSection, UnitUIElement } from '../../../common/unit'; import { FileService } from '../../../common/file.service'; import * as UnitFactory from './model/UnitFactory'; import { MessageService } from '../../../common/message.service'; import { IdService } from './id.service'; +import { DialogService } from './dialog.service'; @Injectable({ providedIn: 'root' @@ -22,7 +24,9 @@ export class UnitService { private _selectedElements: BehaviorSubject<UnitUIElement[]>; - constructor(private messageService: MessageService, private idService: IdService) { + constructor(private messageService: MessageService, + private idService: IdService, + private dialogService: DialogService) { const initialUnit = UnitFactory.createUnit(); const initialPage = UnitFactory.createUnitPage(); const initialSection = UnitFactory.createUnitPageSection(); @@ -219,4 +223,20 @@ export class UnitService { selectPageSection(index: number): void { this._selectedPageSectionIndex.next(index); } + + showDefaultEditDialog(element: UnitUIElement): void { + if (Object.prototype.hasOwnProperty.call(element, 'label')) { + this.dialogService.showTextEditDialog((element as any).label).subscribe((result: string) => { + if (result) { + this.updateSelectedElementProperty('label', result); + } + }); + } else if (Object.prototype.hasOwnProperty.call(element, 'text')) { + this.dialogService.showTextEditDialog((element as any).text, true).subscribe((result: string) => { + if (result) { + this.updateSelectedElementProperty('text', result); + } + }); + } + } }