Catalog alignment
[sdc.git] / catalog-ui / src / app / ng2 / pages / composition / graph / canvas-zone / zone-instance / zone-instance.component.ts
1 import { Component, Input, Output, EventEmitter, ViewEncapsulation, OnInit, SimpleChange, ElementRef, ViewChild, SimpleChanges } from '@angular/core';
2 import {
3     ZoneInstance, ZoneInstanceMode, ZoneInstanceType,
4     IZoneInstanceAssignment
5 } from 'app/models/graph/zones/zone-instance';
6 import { PoliciesService } from 'app/ng2/services/policies.service';
7 import { GroupsService } from 'app/ng2/services/groups.service';
8 import { IZoneService } from "app/models/graph/zones/zone";
9 import { EventListenerService } from 'app/services';
10 import { GRAPH_EVENTS } from 'app/utils';
11 import { Subject } from 'rxjs';
12 import { Store } from "@ngxs/store";
13 import { CompositionService } from "app/ng2/pages/composition/composition.service";
14 import { PolicyInstance } from "app/models";
15 import {SelectedComponentType, SetSelectedComponentAction} from "../../../common/store/graph.actions";
16
17
18 @Component({
19     selector: 'zone-instance',
20     templateUrl: './zone-instance.component.html',
21     styleUrls: ['./zone-instance.component.less'],
22     encapsulation: ViewEncapsulation.None
23 })
24 export class ZoneInstanceComponent implements OnInit {
25
26     @Input() zoneInstance:ZoneInstance;
27     @Input() defaultIconText:string;
28     @Input() isActive:boolean;
29     @Input() isViewOnly:boolean;
30     @Input() activeInstanceMode: ZoneInstanceMode;
31     @Input() hidden:boolean;
32     @Input() forceSave:Subject<Function>;
33     @Output() modeChange: EventEmitter<any> = new EventEmitter<any>();
34     @Output() assignmentSaveStart: EventEmitter<void> = new EventEmitter<void>();
35     @Output() assignmentSaveComplete: EventEmitter<boolean> = new EventEmitter<boolean>();
36     @Output() tagHandleClick: EventEmitter<ZoneInstance> = new EventEmitter<ZoneInstance>();
37     @ViewChild('currentComponent') currentComponent: ElementRef;
38     private MODE = ZoneInstanceMode;
39     private zoneService:IZoneService;
40
41     constructor(private policiesService:PoliciesService, private groupsService:GroupsService, private eventListenerService:EventListenerService, private compositionService:CompositionService, private store:Store){}
42
43     ngOnInit(){
44         if(this.zoneInstance.type == ZoneInstanceType.POLICY){
45             this.zoneService = this.policiesService;
46         } else {
47             this.zoneService = this.groupsService;
48         }
49         if(this.forceSave) {
50             this.forceSave.subscribe((afterSaveFunction:Function) => {
51                 this.setMode(ZoneInstanceMode.TAG, null, afterSaveFunction);
52             })
53         }
54     }
55
56     ngOnChanges(changes:SimpleChanges) {
57         if(changes.hidden){
58             this.currentComponent.nativeElement.scrollIntoView({behavior: "smooth", block: "nearest", inline:"end"});
59         }
60     }
61
62     ngOnDestroy() {
63         if(this.forceSave) {
64             this.forceSave.unsubscribe();
65         }
66     }
67
68     private setMode = (mode:ZoneInstanceMode, event?:any, afterSaveCallback?:Function):void => {
69         
70         if(event){ //prevent event from handle and then repeat event from zone instance
71             event.stopPropagation();
72         }
73
74         if(!this.isActive && this.activeInstanceMode === ZoneInstanceMode.TAG) {
75             return; //someone else is tagging. No events allowed
76         }
77
78         if(this.isActive && this.zoneInstance.mode === ZoneInstanceMode.TAG){
79             if(mode !== ZoneInstanceMode.TAG) {
80                 return; //ignore all other events. The only valid option is saving changes.
81             }
82
83             let oldAssignments:Array<IZoneInstanceAssignment> = this.zoneInstance.instanceData.getSavedAssignments();
84             if(this.zoneInstance.isZoneAssignmentChanged(oldAssignments, this.zoneInstance.assignments)) {
85
86                 this.assignmentSaveStart.emit();
87                 
88                 this.zoneService.updateZoneInstanceAssignments(this.zoneInstance.parentComponentType, this.zoneInstance.parentComponentID, this.zoneInstance.instanceData.uniqueId, this.zoneInstance.assignments).subscribe(
89                     (success) => {
90                         this.zoneInstance.instanceData.setSavedAssignments(this.zoneInstance.assignments);
91                         
92                         if(this.zoneInstance.instanceData instanceof PolicyInstance){
93                             this.compositionService.updatePolicy(this.zoneInstance.instanceData);
94                             this.eventListenerService.notifyObservers(GRAPH_EVENTS.ON_POLICY_INSTANCE_UPDATE, this.zoneInstance.instanceData);
95                             this.store.dispatch(new SetSelectedComponentAction({component: this.zoneInstance.instanceData, type: SelectedComponentType.POLICY}));
96                         } else {
97                             this.compositionService.updateGroup(this.zoneInstance.instanceData);
98                             this.eventListenerService.notifyObservers(GRAPH_EVENTS.ON_GROUP_INSTANCE_UPDATE, this.zoneInstance.instanceData);
99                             this.store.dispatch(new SetSelectedComponentAction({component: this.zoneInstance.instanceData, type: SelectedComponentType.GROUP}));
100                         }
101
102                         this.assignmentSaveComplete.emit(true);
103                         if(afterSaveCallback) afterSaveCallback();
104                     }, (error) => {
105                         this.zoneInstance.assignments = oldAssignments;
106                         this.assignmentSaveComplete.emit(false);
107                 });
108             } else {
109                 if(afterSaveCallback) afterSaveCallback();
110             }
111             this.modeChange.emit({newMode: ZoneInstanceMode.NONE, instance: this.zoneInstance});
112             // this.store.dispatch(new unsavedChangesActions.RemoveUnsavedChange(this.zoneInstance.instanceData.uniqueId));
113
114
115         } else {
116             this.modeChange.emit({newMode: mode, instance: this.zoneInstance});
117             if(mode == ZoneInstanceMode.TAG){
118                 // this.store.dispatch(new unsavedChangesActions.AddUnsavedChange(this.zoneInstance.instanceData.uniqueId));
119             }
120         }         
121     } 
122
123     private tagHandleClicked = (event:Event) => {
124         this.tagHandleClick.emit(this.zoneInstance);
125         event.stopPropagation();
126     };
127
128 }