re base code
[sdc.git] / catalog-ui / src / app / models / graph / zones / zone-instance.ts
1 import {PolicyInstance} from "app/models/graph/zones/policy-instance";
2 import {GroupInstance} from "./group-instance";
3 import {Component as TopologyTemplate} from "app/models";
4 import {IUiBaseObject} from "../../ui-models/ui-base-object";
5 import { Subject } from "rxjs";
6
7 export enum ZoneInstanceMode {
8     NONE,
9     HOVER,
10     SELECTED,
11     TAG
12 }
13
14 export enum ZoneInstanceType {
15     GROUP,
16     POLICY
17 }
18
19 export enum ZoneInstanceAssignmentType {
20     COMPONENT_INSTANCES,
21     GROUPS
22 }
23
24 export interface IZoneInstanceMethod {
25
26     getSavedAssignments():Array<IZoneInstanceAssignment>;
27     setSavedAssignments(newAssignments:Array<IZoneInstanceAssignment>):void;
28 }
29
30 export interface IZoneInstanceAssignment extends IUiBaseObject{
31     type: ZoneInstanceAssignmentType
32 }
33
34 export class ZoneInstance {
35
36     parentComponentType:string;
37     parentComponentID:string;
38     instanceData: PolicyInstance | GroupInstance;
39     mode:ZoneInstanceMode;
40     type:ZoneInstanceType;
41     handle:string;
42     assignments:Array<IZoneInstanceAssignment>; //temp assignments visible on the UI; not the saved values on the BE
43     hidden:boolean;
44     forceSave:Subject<Function>;
45
46     constructor(instance: PolicyInstance | GroupInstance, topologyTemplate:TopologyTemplate) {
47
48         this.instanceData = instance;
49         this.parentComponentType = topologyTemplate.componentType;
50         this.parentComponentID = topologyTemplate.uniqueId;
51
52         if (instance instanceof PolicyInstance) {
53             this.type = ZoneInstanceType.POLICY;
54         } else {
55             this.type = ZoneInstanceType.GROUP;
56         }
57
58         this.assignments = this.instanceData.getSavedAssignments();
59         this.mode = ZoneInstanceMode.NONE;
60         this.hidden = false;
61         this.forceSave = new Subject();
62     }
63
64     public isAlreadyAssigned = (nodeId:string):boolean => {
65         let matchingAssignments = this.assignments.filter((assignment) => {
66             return assignment.uniqueId == nodeId;
67         });
68         return matchingAssignments && matchingAssignments.length > 0;
69     }
70
71     public addOrRemoveAssignment = (nodeId:string, nodeType:ZoneInstanceAssignmentType)=> { //change temp assignments, unsaved but visible in UI.
72
73         if (!this.isAlreadyAssigned(nodeId)) {
74             this.assignments.push(<IZoneInstanceAssignment>{uniqueId: nodeId, type: nodeType});
75         } else {
76             this.assignments = this.assignments.filter(assignment => assignment.uniqueId != nodeId);
77         }
78     }
79     
80     public isZoneAssignmentChanged(oldAssignments:Array<IZoneInstanceAssignment>, newAssignments:Array<IZoneInstanceAssignment>):boolean {
81         if (oldAssignments.length != newAssignments.length) {
82             return true;
83         }
84         let difference:Array<IZoneInstanceAssignment> = oldAssignments.filter((oldAssignment) => {
85             return !newAssignments.find(newAssignment => newAssignment.uniqueId == oldAssignment.uniqueId);
86         });
87         if (difference.length) {
88             return true;
89         }
90
91         return false;
92     }
93
94     public updateInstanceData (instanceData:  PolicyInstance | GroupInstance):void {
95         this.instanceData = instanceData;
96         this.assignments = this.instanceData.getSavedAssignments();
97     }
98
99     public showHandle = (handleId:string) => {
100         this.handle = handleId;
101     }
102
103     public hideHandle = ():void => {
104         this.handle = null;
105     }
106 }