Fixes after review

This commit is contained in:
Piotr Pekala 2018-12-19 07:25:09 -08:00
parent 79f174faea
commit 085b099e96
20 changed files with 152 additions and 56 deletions

View File

@ -75,6 +75,8 @@ import { MatSidenavModule } from '@angular/material';
import { NodeSelectInterfaceComponent } from './components/project-map/node-select-interface/node-select-interface.component'; import { NodeSelectInterfaceComponent } from './components/project-map/node-select-interface/node-select-interface.component';
import { DrawLinkToolComponent } from './components/project-map/draw-link-tool/draw-link-tool.component'; import { DrawLinkToolComponent } from './components/project-map/draw-link-tool/draw-link-tool.component';
import { AddDrawingComponent } from './components/project-map/add-drawing/add-drawing.component'; import { AddDrawingComponent } from './components/project-map/add-drawing/add-drawing.component';
import { DrawingResizedComponent } from './components/drawings-listeners/drawing-resized/drawing-resized.component';
import { TextEditedComponent } from './components/drawings-listeners/text-edited/text-edited.component';
if (environment.production) { if (environment.production) {
@ -118,7 +120,9 @@ if (environment.production) {
ServerDiscoveryComponent, ServerDiscoveryComponent,
NodeSelectInterfaceComponent, NodeSelectInterfaceComponent,
DrawLinkToolComponent, DrawLinkToolComponent,
AddDrawingComponent AddDrawingComponent,
DrawingResizedComponent,
TextEditedComponent
], ],
imports: [ imports: [
BrowserModule, BrowserModule,

View File

@ -4,7 +4,7 @@ import { MatMenuModule, MatIconModule } from '@angular/material';
import { CssFixer } from './helpers/css-fixer'; import { CssFixer } from './helpers/css-fixer';
import { FontFixer } from './helpers/font-fixer'; import { FontFixer } from './helpers/font-fixer';
import { DrawingsFactory } from './helpers/drawings-factory'; import { DefaultDrawingsFactory } from './helpers/default-drawings-factory';
import { MultiLinkCalculatorHelper } from './helpers/multi-link-calculator-helper'; import { MultiLinkCalculatorHelper } from './helpers/multi-link-calculator-helper';
import { SvgToDrawingConverter } from './helpers/svg-to-drawing-converter'; import { SvgToDrawingConverter } from './helpers/svg-to-drawing-converter';
import { QtDasharrayFixer } from './helpers/qt-dasharray-fixer'; import { QtDasharrayFixer } from './helpers/qt-dasharray-fixer';
@ -46,6 +46,10 @@ import { TextAddingComponent } from './components/text-adding/text-adding.compon
import { TextEditingComponent } from './components/text-editing/text-editing.component'; import { TextEditingComponent } from './components/text-editing/text-editing.component';
import { FontBBoxCalculator } from './helpers/font-bbox-calculator'; import { FontBBoxCalculator } from './helpers/font-bbox-calculator';
import { StylesToFontConverter } from './converters/styles-to-font-converter'; import { StylesToFontConverter } from './converters/styles-to-font-converter';
import { TextElementFactory } from './helpers/drawings-factory/text-element-factory';
import { EllipseElementFactory } from './helpers/drawings-factory/ellipse-element-factory';
import { RectangleElementFactory } from './helpers/drawings-factory/rectangle-element-factory';
import { LineElementFactory } from './helpers/drawings-factory/line-element-factory';
@NgModule({ @NgModule({
@ -68,7 +72,11 @@ import { StylesToFontConverter } from './converters/styles-to-font-converter';
providers: [ providers: [
CssFixer, CssFixer,
FontFixer, FontFixer,
DrawingsFactory, DefaultDrawingsFactory,
TextElementFactory,
EllipseElementFactory,
RectangleElementFactory,
LineElementFactory,
MultiLinkCalculatorHelper, MultiLinkCalculatorHelper,
SvgToDrawingConverter, SvgToDrawingConverter,
QtDasharrayFixer, QtDasharrayFixer,

View File

@ -7,17 +7,26 @@ import { DrawingElementFactory } from './drawings-factory/drawing-element-factor
import { MapDrawing } from '../models/map/map-drawing'; import { MapDrawing } from '../models/map/map-drawing';
@Injectable() @Injectable()
export class DrawingsFactory { export class DefaultDrawingsFactory {
private factory: DrawingElementFactory; private factory: DrawingElementFactory;
private availablefactories = { private availableFactories: {[ key: string]: DrawingElementFactory};
'text': new TextElementFactory,
'ellipse': new EllipseElementFactory, constructor(
'rectangle': new RectangleElementFactory, private textElementFactory: TextElementFactory,
'line': new LineElementFactory private ellipseElementFactory: EllipseElementFactory,
}; private rectangleElementFactory: RectangleElementFactory,
private lineElementFactory: LineElementFactory
){
this.availableFactories = {
'text': this.textElementFactory,
'ellipse': this.ellipseElementFactory,
'rectangle': this.rectangleElementFactory,
'line': this.lineElementFactory
};
}
getDrawingMock(drawingType: string){ getDrawingMock(drawingType: string){
this.factory = this.availablefactories[drawingType]; this.factory = this.availableFactories[drawingType];
let mapDrawing = new MapDrawing(); let mapDrawing = new MapDrawing();
mapDrawing.element = this.factory.getDrawingElement(); mapDrawing.element = this.factory.getDrawingElement();

View File

@ -1,7 +1,9 @@
import { DrawingElementFactory } from './drawing-element-factory'; import { DrawingElementFactory } from './drawing-element-factory';
import { DrawingElement } from '../../models/drawings/drawing-element'; import { DrawingElement } from '../../models/drawings/drawing-element';
import { EllipseElement } from '../../models/drawings/ellipse-element'; import { EllipseElement } from '../../models/drawings/ellipse-element';
import { Injectable } from '@angular/core';
@Injectable()
export class EllipseElementFactory implements DrawingElementFactory{ export class EllipseElementFactory implements DrawingElementFactory{
getDrawingElement(): DrawingElement{ getDrawingElement(): DrawingElement{

View File

@ -1,7 +1,9 @@
import { DrawingElementFactory } from './drawing-element-factory'; import { DrawingElementFactory } from './drawing-element-factory';
import { DrawingElement } from '../../models/drawings/drawing-element'; import { DrawingElement } from '../../models/drawings/drawing-element';
import { LineElement } from '../../models/drawings/line-element'; import { LineElement } from '../../models/drawings/line-element';
import { Injectable } from '@angular/core';
@Injectable()
export class LineElementFactory implements DrawingElementFactory{ export class LineElementFactory implements DrawingElementFactory{
getDrawingElement(): DrawingElement{ getDrawingElement(): DrawingElement{

View File

@ -1,7 +1,9 @@
import { DrawingElementFactory } from './drawing-element-factory'; import { DrawingElementFactory } from './drawing-element-factory';
import { DrawingElement } from '../../models/drawings/drawing-element'; import { DrawingElement } from '../../models/drawings/drawing-element';
import { RectElement } from '../../models/drawings/rect-element'; import { RectElement } from '../../models/drawings/rect-element';
import { Injectable } from '@angular/core';
@Injectable()
export class RectangleElementFactory implements DrawingElementFactory{ export class RectangleElementFactory implements DrawingElementFactory{
getDrawingElement() : DrawingElement { getDrawingElement() : DrawingElement {

View File

@ -1,7 +1,9 @@
import { DrawingElementFactory } from './drawing-element-factory'; import { DrawingElementFactory } from './drawing-element-factory';
import { DrawingElement } from '../../models/drawings/drawing-element'; import { DrawingElement } from '../../models/drawings/drawing-element';
import { TextElement } from '../../models/drawings/text-element'; import { TextElement } from '../../models/drawings/text-element';
import { Injectable } from '@angular/core';
@Injectable()
export class TextElementFactory implements DrawingElementFactory{ export class TextElementFactory implements DrawingElementFactory{
getDrawingElement(): DrawingElement { getDrawingElement(): DrawingElement {

View File

@ -0,0 +1,47 @@
import { Component, Input, OnInit, OnDestroy } from "@angular/core";
import { DrawingService } from '../../../services/drawing.service';
import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource';
import { DrawingsEventSource } from '../../../cartography/events/drawings-event-source';
import { MapDrawingToSvgConverter } from '../../../cartography/converters/map/map-drawing-to-svg-converter';
import { Server } from '../../../models/server';
import { ResizedDataEvent } from '../../../cartography/events/event-source';
import { MapDrawing } from '../../../cartography/models/map/map-drawing';
import { Drawing } from '../../../cartography/models/drawing';
import { Subscription } from 'rxjs';
@Component({
selector: 'app-drawing-resized',
templateUrl: './drawing-resized.component.html',
styleUrls: ['./drawing-resized.component.css']
})
export class DrawingResizedComponent implements OnInit, OnDestroy{
@Input() server: Server;
private drawingResized: Subscription;
constructor(
private drawingService: DrawingService,
private drawingsDataSource: DrawingsDataSource,
private drawingsEventSource: DrawingsEventSource,
private mapDrawingToSvgConverter: MapDrawingToSvgConverter
){}
ngOnInit(){
this.drawingResized = this.drawingsEventSource.resized.subscribe((evt) => this.onDrawingResized(evt))
}
public onDrawingResized(resizedEvent: ResizedDataEvent<MapDrawing>) {
const drawing = this.drawingsDataSource.get(resizedEvent.datum.id);
let svgString = this.mapDrawingToSvgConverter.convert(resizedEvent.datum);
this.drawingService
.updateSizeAndPosition(this.server, drawing, resizedEvent.x, resizedEvent.y, svgString)
.subscribe((serverDrawing: Drawing) => {
this.drawingsDataSource.update(serverDrawing);
});
}
ngOnDestroy(){
this.drawingResized.unsubscribe();
}
}

View File

@ -0,0 +1,53 @@
import { Component, OnInit, OnDestroy, Input } from "@angular/core";
import { TextEditedDataEvent } from '../../../cartography/events/event-source';
import { MapDrawing } from '../../../cartography/models/map/map-drawing';
import { TextElement } from '../../../cartography/models/drawings/text-element';
import { Drawing } from '../../../cartography/models/drawing';
import { Server } from '../../../models/server';
import { Subscription } from 'rxjs';
import { DrawingService } from '../../../services/drawing.service';
import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource';
import { DrawingsEventSource } from '../../../cartography/events/drawings-event-source';
import { MapDrawingToSvgConverter } from '../../../cartography/converters/map/map-drawing-to-svg-converter';
@Component({
selector: 'app-text-edited',
templateUrl: './text-edited.component.html',
styleUrls: ['./text-edited.component.css']
})
export class TextEditedComponent implements OnInit, OnDestroy{
@Input() server: Server;
private textEdited: Subscription;
constructor(
private drawingService: DrawingService,
private drawingsDataSource: DrawingsDataSource,
private drawingsEventSource: DrawingsEventSource,
private mapDrawingToSvgConverter: MapDrawingToSvgConverter
){}
ngOnInit(){
this.textEdited = this.drawingsEventSource.textEdited.subscribe((evt) => this.onTextEdited(evt));
}
public onTextEdited(evt: TextEditedDataEvent){
let mapDrawing: MapDrawing = new MapDrawing();
mapDrawing.element = evt.textElement;
(mapDrawing.element as TextElement).text = evt.editedText;
let svgString = this.mapDrawingToSvgConverter.convert(mapDrawing);
let drawing = this.drawingsDataSource.get(evt.textDrawingId);
this.drawingService
.updateText(this.server, drawing, svgString)
.subscribe((serverDrawing: Drawing) => {
this.drawingsDataSource.update(serverDrawing);
this.drawingsEventSource.textSaved.emit(true);
});
}
ngOnDestroy(){
this.textEdited.unsubscribe();
}
}

View File

@ -1,6 +1,6 @@
import { AddDrawingComponent } from "./add-drawing.component"; import { AddDrawingComponent } from "./add-drawing.component";
import { ComponentFixture, TestBed, async } from '@angular/core/testing'; import { ComponentFixture, TestBed, async } from '@angular/core/testing';
import { DrawingsFactory } from '../../../cartography/helpers/drawings-factory'; import { DefaultDrawingsFactory } from '../../../cartography/helpers/default-drawings-factory';
import { DrawingService } from '../../../services/drawing.service'; import { DrawingService } from '../../../services/drawing.service';
import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource'; import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource';
import { MapDrawingToSvgConverter } from '../../../cartography/converters/map/map-drawing-to-svg-converter'; import { MapDrawingToSvgConverter } from '../../../cartography/converters/map/map-drawing-to-svg-converter';
@ -15,7 +15,7 @@ describe('AddDrawingComponent', () => {
providers: [ providers: [
{ provide: DrawingService }, { provide: DrawingService },
{ provide: DrawingsDataSource }, { provide: DrawingsDataSource },
{ provide: DrawingsFactory }, { provide: DefaultDrawingsFactory },
{ provide: MapDrawingToSvgConverter }, { provide: MapDrawingToSvgConverter },
{ provide: Context } { provide: Context }
], ],

View File

@ -1,7 +1,7 @@
import { Component, Input, OnChanges, SimpleChange, Output, EventEmitter } from "@angular/core"; import { Component, Input, OnChanges, SimpleChange, Output, EventEmitter } from "@angular/core";
import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource'; import { DrawingsDataSource } from '../../../cartography/datasources/drawings-datasource';
import { DrawingService } from '../../../services/drawing.service'; import { DrawingService } from '../../../services/drawing.service';
import { DrawingsFactory } from '../../../cartography/helpers/drawings-factory'; import { DefaultDrawingsFactory } from '../../../cartography/helpers/default-drawings-factory';
import { MapDrawingToSvgConverter } from '../../../cartography/converters/map/map-drawing-to-svg-converter'; import { MapDrawingToSvgConverter } from '../../../cartography/converters/map/map-drawing-to-svg-converter';
import { Project } from '../../../models/project'; import { Project } from '../../../models/project';
import { Server } from '../../../models/server'; import { Server } from '../../../models/server';
@ -27,7 +27,7 @@ export class AddDrawingComponent implements OnChanges {
constructor( constructor(
private drawingService: DrawingService, private drawingService: DrawingService,
private drawingsDataSource: DrawingsDataSource, private drawingsDataSource: DrawingsDataSource,
private drawingsFactory: DrawingsFactory, private drawingsFactory: DefaultDrawingsFactory,
private mapDrawingToSvgConverter: MapDrawingToSvgConverter, private mapDrawingToSvgConverter: MapDrawingToSvgConverter,
private context: Context private context: Context
){} ){}

View File

@ -154,3 +154,6 @@
[selectedDrawing]="selectedDrawing" [selectedDrawing]="selectedDrawing"
(drawingSaved)="onDrawingSaved($event)"> (drawingSaved)="onDrawingSaved($event)">
</app-add-drawing> </app-add-drawing>
<app-drawing-resized [server]="server"></app-drawing-resized>
<app-text-edited [server]="server"></app-text-edited>

View File

@ -42,7 +42,7 @@ import { HttpServer } from '../../services/http-server.service';
import { Server } from '../../models/server'; import { Server } from '../../models/server';
import { ResizedDataEvent } from '../../cartography/events/event-source'; import { ResizedDataEvent } from '../../cartography/events/event-source';
import { MapLabelToLabelConverter } from '../../cartography/converters/map/map-label-to-label-converter'; import { MapLabelToLabelConverter } from '../../cartography/converters/map/map-label-to-label-converter';
import { DrawingsFactory } from '../../cartography/helpers/drawings-factory'; import { DefaultDrawingsFactory } from '../../cartography/helpers/default-drawings-factory';
export class MockedProgressService { export class MockedProgressService {
public activate() {} public activate() {}
@ -117,7 +117,7 @@ describe('ProjectMapComponent', () => {
{ provide: NodesEventSource }, { provide: NodesEventSource },
{ provide: DrawingsEventSource }, { provide: DrawingsEventSource },
{ provide: LinksEventSource }, { provide: LinksEventSource },
{ provide: DrawingsFactory }, { provide: DefaultDrawingsFactory },
{ provide: MapDrawingToSvgConverter, useValue: { { provide: MapDrawingToSvgConverter, useValue: {
convert: () => { return ''} convert: () => { return ''}
} }, } },

View File

@ -26,7 +26,7 @@ import { MapChangeDetectorRef } from '../../cartography/services/map-change-dete
import { NodeContextMenu } from '../../cartography/events/nodes'; import { NodeContextMenu } from '../../cartography/events/nodes';
import { MapLinkCreated } from '../../cartography/events/links'; import { MapLinkCreated } from '../../cartography/events/links';
import { NodeWidget } from '../../cartography/widgets/node'; import { NodeWidget } from '../../cartography/widgets/node';
import { DraggedDataEvent, ResizedDataEvent, TextEditedDataEvent, TextAddedDataEvent } from '../../cartography/events/event-source'; import { DraggedDataEvent } from '../../cartography/events/event-source';
import { DrawingService } from '../../services/drawing.service'; import { DrawingService } from '../../services/drawing.service';
import { MapNodeToNodeConverter } from '../../cartography/converters/map/map-node-to-node-converter'; import { MapNodeToNodeConverter } from '../../cartography/converters/map/map-node-to-node-converter';
import { NodesEventSource } from '../../cartography/events/nodes-event-source'; import { NodesEventSource } from '../../cartography/events/nodes-event-source';
@ -40,9 +40,8 @@ import { SettingsService, Settings } from '../../services/settings.service';
import { MapLabel } from '../../cartography/models/map/map-label'; import { MapLabel } from '../../cartography/models/map/map-label';
import { D3MapComponent } from '../../cartography/components/d3-map/d3-map.component'; import { D3MapComponent } from '../../cartography/components/d3-map/d3-map.component';
import { MapLinkNode } from '../../cartography/models/map/map-link-node'; import { MapLinkNode } from '../../cartography/models/map/map-link-node';
import { TextElement } from '../../cartography/models/drawings/text-element';
import { MapLabelToLabelConverter } from '../../cartography/converters/map/map-label-to-label-converter'; import { MapLabelToLabelConverter } from '../../cartography/converters/map/map-label-to-label-converter';
import { DrawingsFactory } from '../../cartography/helpers/drawings-factory'; import { DefaultDrawingsFactory } from '../../cartography/helpers/default-drawings-factory';
@Component({ @Component({
@ -109,7 +108,7 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
private mapDrawingToSvgConverter: MapDrawingToSvgConverter, private mapDrawingToSvgConverter: MapDrawingToSvgConverter,
private settingsService: SettingsService, private settingsService: SettingsService,
private mapLabelToLabel: MapLabelToLabelConverter, private mapLabelToLabel: MapLabelToLabelConverter,
private drawingsFactory: DrawingsFactory private drawingsFactory: DefaultDrawingsFactory
) {} ) {}
ngOnInit() { ngOnInit() {
@ -187,14 +186,6 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
this.drawingsEventSource.dragged.subscribe((evt) => this.onDrawingDragged(evt)) this.drawingsEventSource.dragged.subscribe((evt) => this.onDrawingDragged(evt))
); );
this.subscriptions.push(
this.drawingsEventSource.resized.subscribe((evt) => this.onDrawingResized(evt))
);
this.subscriptions.push(
this.drawingsEventSource.textEdited.subscribe((evt) => this.onTextEdited(evt))
);
this.subscriptions.push( this.subscriptions.push(
this.linksEventSource.created.subscribe((evt) => this.onLinkCreated(evt)) this.linksEventSource.created.subscribe((evt) => this.onLinkCreated(evt))
); );
@ -338,37 +329,10 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
}); });
} }
public onDrawingResized(resizedEvent: ResizedDataEvent<MapDrawing>) {
const drawing = this.drawingsDataSource.get(resizedEvent.datum.id);
let svgString = this.mapDrawingToSvgConverter.convert(resizedEvent.datum);
this.drawingService
.updateSizeAndPosition(this.server, drawing, resizedEvent.x, resizedEvent.y, svgString)
.subscribe((serverDrawing: Drawing) => {
this.drawingsDataSource.update(serverDrawing);
});
}
public onDrawingSaved(evt: boolean){ public onDrawingSaved(evt: boolean){
this.resetDrawToolChoice(); this.resetDrawToolChoice();
} }
public onTextEdited(evt: TextEditedDataEvent){
let mapDrawing: MapDrawing = new MapDrawing();
mapDrawing.element = evt.textElement;
(mapDrawing.element as TextElement).text = evt.editedText;
let svgString = this.mapDrawingToSvgConverter.convert(mapDrawing);
let drawing = this.drawingsDataSource.get(evt.textDrawingId);
this.drawingService
.updateText(this.server, drawing, svgString)
.subscribe((serverDrawing: Drawing) => {
this.drawingsDataSource.update(serverDrawing);
this.drawingsEventSource.textSaved.emit(true);
});
}
public set readonly(value) { public set readonly(value) {
this.inReadOnlyMode = value; this.inReadOnlyMode = value;
if (value) { if (value) {