From f792671ae247a931f34d902e9276202b5016ef9a Mon Sep 17 00:00:00 2001 From: Ittay Stern Date: Sun, 7 Jul 2019 19:23:03 +0300 Subject: Merge from ecomp 718fd196 - Modern UI Issue-ID: VID-378 Change-Id: I2736b98426e324ec3aa233b034229ba84d99839f Signed-off-by: Ittay Stern --- .../dragAndDrop/dragAndDrop.service.spec.ts | 24 ++-- .../drawing-board-tree.component.ts | 30 ++++- .../drawing-board-tree/drawing-board-tree.html | 95 +++++++++----- .../drawing-board-tree/drawing-board-tree.scss | 146 +++++++++++++++++++-- .../drawing-board-tree.service.spec.ts | 139 ++++++++++---------- .../drawing-board-tree.service.ts | 3 +- 6 files changed, 301 insertions(+), 136 deletions(-) (limited to 'vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree') diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts index 1221cef5f..8b7f1a4f5 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/dragAndDrop/dragAndDrop.service.spec.ts @@ -83,11 +83,11 @@ describe('Drag and drop service', () => { "action": "Create", "inMaint": false, "name": "yoav2_001", - "modelName": "VF_vMee 0", + "modelName": "VF_vGeraldine 0", "type": "VF", "isEcompGeneratedNaming": true, - "networkStoreKey": "VF_vMee 0:0001", - "vnfStoreKey": "VF_vMee 0:0001", + "networkStoreKey": "VF_vGeraldine 0:0001", + "vnfStoreKey": "VF_vGeraldine 0:0001", "typeName": "VNF", "menuActions": {"edit": {}, "showAuditInfo": {}, "duplicate": {}, "remove": {}, "delete": {}, "undoDelete": {}}, "isFailed": false, @@ -106,11 +106,11 @@ describe('Drag and drop service', () => { "id": 6654971919519, "action": "Create", "name": "VFModule1", - "modelName": "vf_vmee0..VfVmee..base_vmme..module-0", + "modelName": "vf_vgeraldine0..VfVgeraldine..base_vflorence..module-0", "type": "VFmodule", "isEcompGeneratedNaming": true, "dynamicInputs": [], - "dynamicModelName": "vf_vmee0..VfVmee..base_vmme..module-0bykqx", + "dynamicModelName": "vf_vgeraldine0..VfVgeraldine..base_vflorence..module-0bykqx", "typeName": "M", "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}}, "isFailed": false, @@ -130,11 +130,11 @@ describe('Drag and drop service', () => { "id": 987761655742, "action": "Create", "name": "VNFModule3", - "modelName": "vf_vmee0..VfVmee..vmme_gpb..module-2", + "modelName": "vf_vgeraldine0..VfVgeraldine..vflorence_gpb..module-2", "type": "VFmodule", "isEcompGeneratedNaming": true, "dynamicInputs": [], - "dynamicModelName": "vf_vmee0..VfVmee..vmme_gpb..module-2fjrrc", + "dynamicModelName": "vf_vgeraldine0..VfVgeraldine..vflorence_gpb..module-2fjrrc", "typeName": "M", "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}}, "isFailed": false, @@ -154,11 +154,11 @@ describe('Drag and drop service', () => { "id": 873798901625, "action": "Create", "name": "VFModule2", - "modelName": "vf_vmee0..VfVmee..vmme_vlc..module-1", + "modelName": "vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1", "type": "VFmodule", "isEcompGeneratedNaming": true, "dynamicInputs": [], - "dynamicModelName": "vf_vmee0..VfVmee..vmme_vlc..module-1djjni", + "dynamicModelName": "vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1djjni", "typeName": "M", "menuActions": {"edit": {}, "showAuditInfo": {}, "remove": {}, "delete": {}, "undoDelete": {}}, "isFailed": false, @@ -181,11 +181,11 @@ describe('Drag and drop service', () => { "action": "Create", "inMaint": false, "name": "yoav2", - "modelName": "VF_vMee 0", + "modelName": "VF_vGeraldine 0", "type": "VF", "isEcompGeneratedNaming": true, - "networkStoreKey": "VF_vMee 0", - "vnfStoreKey": "VF_vMee 0", + "networkStoreKey": "VF_vGeraldine 0", + "vnfStoreKey": "VF_vGeraldine 0", "typeName": "VNF", "menuActions": {"edit": {}, "showAuditInfo": {}, "duplicate": {}, "remove": {}, "delete": {}, "undoDelete": {}}, "isFailed": false, diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts index d0715982c..6be5036b2 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.component.ts @@ -1,4 +1,4 @@ -import {AfterViewInit, Component, EventEmitter, OnInit, Output, ViewChild,} from '@angular/core'; +import {AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild,} from '@angular/core'; import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu'; import {Constants} from '../../../shared/utils/constants'; import {IDType, ITreeNode} from "angular-tree-component/dist/defs/api"; @@ -24,7 +24,10 @@ import * as _ from 'lodash'; import {ErrorMsgService} from "../../../shared/components/error-msg/error-msg.service"; import {DragAndDropService} from "./dragAndDrop/dragAndDrop.service"; import {FeatureFlagsService, Features} from "../../../shared/services/featureFlag/feature-flags.service"; -import {PopoverPlacement} from "../../../shared/components/popover/popover.component"; +import {ComponentInfoService} from "../component-info/component-info.service"; +import {ComponentInfoModel} from "../component-info/component-info-model"; +import {ObjectToModelTreeService} from "../objectsToTree/objectToModelTree/objectToModelTree.service"; +import {DrawingBoardModes} from "../drawing-board.modes"; @Component({ selector: 'drawing-board-tree', @@ -37,10 +40,14 @@ export class DrawingBoardTreeComponent implements OnInit, AfterViewInit { _store: NgRedux; duplicateService: DuplicateService; drawingBoardTreeService: DrawingBoardTreeService; + objectToModelTreeService : ObjectToModelTreeService; + objectToInstanceTreeService : ObjectToInstanceTreeService; errorMsgService: ErrorMsgService; isFilterEnabled: boolean = false; filterValue: string = ''; contextMenuOptions: TreeNodeContextMenuModel[]; + + @Input() pageMode : DrawingBoardModes; static triggerDeleteActionService: Subject = new Subject(); static triggerUndoDeleteActionService: Subject = new Subject(); static triggerreCalculateIsDirty: Subject = new Subject(); @@ -62,13 +69,16 @@ export class DrawingBoardTreeComponent implements OnInit, AfterViewInit { private _highlightPipe: HighlightPipe, private _objectToInstanceTreeService: ObjectToInstanceTreeService, private _sharedTreeService: SharedTreeService, - private _dragAndDropService : DragAndDropService) { + private _dragAndDropService : DragAndDropService, + private _objectToModelTreeService : ObjectToModelTreeService, + private _componentInfoService: ComponentInfoService) { this.errorMsgService = _errorMsgService; this.duplicateService = _duplicateService; this.drawingBoardTreeService = _drawingBoardTreeService; this.contextMenuOptions = _drawingBoardTreeService.generateContextMenuOptions(); - + this.objectToModelTreeService = _objectToModelTreeService; + this.objectToInstanceTreeService = _objectToInstanceTreeService; DrawingBoardTreeComponent.triggerDeleteActionService.subscribe((serviceModelId) => { this._sharedTreeService.shouldShowDeleteInstanceWithChildrenModal(this.nodes, serviceModelId, (node, serviceModelId)=>{ this.drawingBoardTreeService.deleteActionService(this.nodes, serviceModelId); @@ -102,6 +112,10 @@ export class DrawingBoardTreeComponent implements OnInit, AfterViewInit { this.filterValue = updateData.filterValue; } + isLinkedInstance = (node) : boolean => { + return !_.isNil(node) && node.parentType === "VRF" || node.parentType === "VnfGroup"; + }; + @Output() highlightNode: EventEmitter = new EventEmitter(); @@ -138,7 +152,7 @@ export class DrawingBoardTreeComponent implements OnInit, AfterViewInit { updateTree() { const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId]; - this.nodes = this._objectToInstanceTreeService.convertServiceInstanceToTreeData(serviceInstance, this.store.getState().service.serviceHierarchy[this.serviceModelId]); + this.nodes = this._objectToInstanceTreeService.convertServiceInstanceToTreeData(serviceInstance, this.store.getState().service.serviceHierarchy[this.serviceModelId]).filter((item) => item !== null); console.log('right nodes', this.nodes); } @@ -194,7 +208,11 @@ export class DrawingBoardTreeComponent implements OnInit, AfterViewInit { this._sharedTreeService.setSelectedVNF(node); this.highlightNode.emit(node.data.modelUniqueId); if (FeatureFlagsService.getFlagState(Features.FLAG_1906_COMPONENT_INFO, this.store)) { - node.data.onSelectedNode(node); + const serviceHierarchy = this._store.getState().service.serviceHierarchy[this.serviceModelId]; + const model = node.data.getModel(node.data.modelName, node.data, serviceHierarchy); + const modelInfoItems = node.data.getInfo(model, node.data); + const componentInfoModel: ComponentInfoModel = this._sharedTreeService.addGeneralInfoItems(modelInfoItems, node.data.componentInfoType, model, node.data); + ComponentInfoService.triggerComponentInfoChange.next(componentInfoModel); } } diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html index 8af909ffc..e1d88a696 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.html @@ -1,33 +1,54 @@
- + +
Instance:
+ [nodes]="nodes" [tree]="tree" + [inputTestId]="'search-right-tree'" + *ngIf="drawingBoardTreeService.isViewEditFlagTrue()">
- -
- -
Failed
-
-
-
-
{{node?.data?.typeName}}
+ +
+ +
Failed +
+
+
+
+
{{node?.data?.typeName}}
+
+ +
-
+
+
- -
-
- Limit{{node?.data?.limitMembers}} -
-
+ +
+
+ Limit{{node?.data?.limitMembers}} +
+
@@ -66,12 +88,12 @@ - + + +
- - - - -
-
-
+
+ Delete +
+ +
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.scss index be9f9f2d4..e08e69e2e 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.scss +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.scss @@ -36,6 +36,11 @@ } } + +.icon-browse.isLinked { + display: none !important; +} + #RETRY_EDIT drawing-board-tree tree-node-collection > div, #RETRY drawing-board-tree tree-node-collection > div { margin-top: 0px; @@ -98,11 +103,54 @@ drawing-board-tree { @include highlight-toggle-children; .node-content-wrapper-focused, .node-content-wrapper-active { + background: transparent !important; + .main-row { + //background-color: #E6F6FB; + //color: #009FDB; + //border-right: none !important; + //border: #009FDB 1px solid; + } + .instance-type { + background-color: #E6F6FB; + color: #009FDB; + border-right: none !important; + border: #009FDB 1px solid !important; + } + + .isLinked { + .model-info { + border-top: 1px #009FDB dashed !important; + border-bottom: 1px #009FDB dashed !important; + } + .model-info.rightBorder { + border-right: 1px #009FDB dashed !important ; + } + } + .model-info { + background-color: #E6F6FB; + color: #009FDB; + border-right: none !important; + border: #009FDB 1px solid; + } + + .model-info.rightBorder { + border-right: #009FDB 1px solid !important; + } + + .model-actions { + background-color: #E6F6FB; + color: #009FDB; + color: #009FDB; + border-left: none !important; + border: #009FDB 1px solid; + } + @include highlight-toggle-children; - @include highlight(#E6F6FB, #009FDB); .property-name,.instance-type { color: #009FDB !important; position: relative; + background-color: #E6F6FB; + color: #009FDB !important; } .status-properties { .status-property-value,.status-property-name { @@ -119,7 +167,7 @@ drawing-board-tree { } & .tree-node-expanded { > tree-node-wrapper .node-wrapper { - box-shadow: 0 0px 2px rgba(90,90,90,0.24); + } } @@ -136,7 +184,7 @@ drawing-board-tree { } .tree-node.tree-node-expanded > tree-node-wrapper{ - box-shadow: 0 2px 2px 0 rgba(0,0,0,.1); + position: relative; z-index: 1; display: block; @@ -146,7 +194,11 @@ drawing-board-tree { height: 45px; &:hover { .node-content-wrapper:not(.node-content-wrapper-focused) { - background: #F2F2F2; + .instance-type , + .model-info , + .model-actions { + background: #F2F2F2; + } .icon-browse:before { color: #5A5A5A; } @@ -164,11 +216,12 @@ drawing-board-tree { display: block; height: 100%; span.toggle-children { + height: 43px; display: flex; width: 45px; + margin-top: 1px; padding: 0; top: 0; - height: inherit; background-image: none; background-color: white; border: 1px solid #D2D2D2; @@ -196,18 +249,44 @@ drawing-board-tree { width:45px; } } + .node-content-wrapper-active, + .node-content-wrapper.node-content-wrapper-active:hover, + .node-content-wrapper-active.node-content-wrapper-focused { + background: white !important; + } + .node-content-wrapper-active.node-content-wrapper-focused { + background: white !important; + } .node-content-wrapper { + padding: 0; background: none; box-shadow: none; border-radius: 0; - border: 1px solid #D2D2D2; + border: 1px solid white; height: 100%; flex: 1; .resourceGroup { border: 1px dashed #D2D2D2 !important; } + + .isLinked { + .instance-type { + border-style: dashed !important; + } + + .model-info { + border: 1px #D2D2CD dashed !important; + border-right: none !important; + } + + .model-actions { + border-style: dashed !important; + border-left-style: none !important; + } + } + tree-node-content { > div { height: 100%; @@ -217,14 +296,18 @@ drawing-board-tree { .instance-type { width: 40px; height: 100%; - padding-top: 16px; text-transform: uppercase; - text-align: center; border-right: 1px solid #D2D2D2; word-break: break-all; color: #959595; font-size: 13px; font-family: OpenSans-SemiBold; + display: flex; + text-align: center; + flex-direction: column; + align-items: center; + justify-content: center; + .newIcon { background: #45B16D; position: absolute; @@ -247,9 +330,42 @@ drawing-board-tree { display: block; } } + .node-content-wrapper-active { + .action-status { + background-color: white !important; + } + } + .action-status { + padding-left: 10px; + background-color: white !important; + line-height: 42px; + width: 95px; + min-width: 95px; + .action-status-type.delete { + background: transparent; + font-family: OpenSans-SemiBold; + font-size: 12px; + color: red; + border-radius: 50px; + border: 1px solid gray; + padding: 5px 20px; + } + } + + .model-info.rightBorder { + border-right: 1px solid #D2D2CD !important; + } .model-info { + border: 1px solid #D2D2CD; + line-height: normal; padding-left: 16px; width: 100%; + height: 100%; + flex-direction: column; + display: flex; + justify-content: center; + border-right: none; + .property-name { font-family: OpenSans-SemiBold; font-size: 13px; @@ -285,9 +401,17 @@ drawing-board-tree { margin-right: 3px; } } + .model-actions { + :hover { + background: transparent !important; + } display: flex; align-items: center; + border: 1px solid #D2D2CD; + line-height: normal; + height: 100%; + border-left: none; .icon-browse { padding: 0; width: 30px; @@ -298,11 +422,11 @@ drawing-board-tree { display: none; } &:hover:before { - color: #009FDB; + //color: #009FDB; } &:focus:before, &:active:before { - color: #009FDB; + //color: #009FDB; } } @@ -319,7 +443,7 @@ drawing-board-tree { .tree-children { padding-left: 45px; .model-info span:first-child { - flex: 1.1 !important; + //flex: 1.1 !important; } } } diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts index 1b913cfe9..b804342c6 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.spec.ts @@ -7,39 +7,39 @@ import {NgRedux} from "@angular-redux/store"; import {DrawingBoardTreeService, TreeNodeContextMenuModel} from "./drawing-board-tree.service"; import {ITreeNode} from "angular-tree-component/dist/defs/api"; - class MockAppStore{ - getState() { +class MockAppStore { + getState() { return { - service : { - serviceInstance : { - "serviceInstanceId" : { - vnfs : { - "vnfStoreKey" : { - isMissingData : true, - vfModules : { - "vfModulesName" : { - "vfModulesName" : { - isMissingData : true - } - } - } - }, - - "vnfStoreKey1" : { - isMissingData : false, - vfModules : { - "vfModulesName" : { - "vfModulesName" : { - isMissingData : false - } - } - } - } - } - } - } - } - } + service: { + serviceInstance: { + "serviceInstanceId": { + vnfs: { + "vnfStoreKey": { + isMissingData: true, + vfModules: { + "vfModulesName": { + "vfModulesName": { + isMissingData: true + } + } + } + }, + + "vnfStoreKey1": { + isMissingData: false, + vfModules: { + "vfModulesName": { + "vfModulesName": { + isMissingData: false + } + } + } + } + } + } + } + } + } } } @@ -65,82 +65,81 @@ describe('Drawing board tree Service', () => { })().then(done).catch(done.fail)); - - test('generateContextMenuOptions should return list of optional context menu', () => { - const options : TreeNodeContextMenuModel[] = service.generateContextMenuOptions(); - const expected : TreeNodeContextMenuModel[] = [ + const options: TreeNodeContextMenuModel[] = service.generateContextMenuOptions(); + const expected: TreeNodeContextMenuModel[] = [ new TreeNodeContextMenuModel('edit', 'context-menu-edit', 'Edit', 'edit-file-o'), new TreeNodeContextMenuModel('duplicate', 'context-menu-duplicate', 'Duplicate', 'copy-o'), new TreeNodeContextMenuModel('showAuditInfo', 'context-menu-showAuditInfo', 'Show audit info', 'eye-o'), new TreeNodeContextMenuModel('addGroupMember', 'context-menu-addGroupMember', 'Add group members', 'plus'), new TreeNodeContextMenuModel('delete', 'context-menu-delete', 'Delete', 'trash-o'), new TreeNodeContextMenuModel('remove', 'context-menu-remove', 'Remove', 'trash-o'), - new TreeNodeContextMenuModel('undoDelete', 'context-menu-undoDelete', 'Undo Delete', 'undo-delete') + new TreeNodeContextMenuModel('undoDelete', 'context-menu-undoDelete', 'Undo Delete', 'undo-delete'), + new TreeNodeContextMenuModel('changeAssociations', 'context-menu-changeAssociations', 'Change Associations', 'edit-file-o') ]; - expect(options.length).toEqual(7); + expect(options.length).toEqual(8); expect(options).toEqual(expected); }); test('isVNFMissingData should return true if vnf isMissingData = true', () => { - let node : ITreeNode = { - data : { - type : 'VF', - vnfStoreKey : "vnfStoreKey" + let node: ITreeNode = { + data: { + type: 'VF', + vnfStoreKey: "vnfStoreKey" } }; - let result : boolean = service.isVNFMissingData(node, "serviceInstanceId"); + let result: boolean = service.isVNFMissingData(node, "serviceInstanceId"); expect(result).toBeTruthy(); }); test('isVNFMissingData should return false if vnf has isMissingData = false', () => { - let node : ITreeNode = { - data : { - type : 'VFModule', - modelName : "vfModulesName", - dynamicModelName : "vfModulesName", - parent : { - vnfStoreKey : "vnfStoreKey1", - type : 'VF' + let node: ITreeNode = { + data: { + type: 'VFModule', + modelName: "vfModulesName", + dynamicModelName: "vfModulesName", + parent: { + vnfStoreKey: "vnfStoreKey1", + type: 'VF' } } }; - let result : boolean = service.isVNFMissingData(node, "serviceInstanceId"); + let result: boolean = service.isVNFMissingData(node, "serviceInstanceId"); expect(result).toBeFalsy(); }); test('isVFModuleMissingData should return true if vnfModule has isMissingData = true', () => { - let node : ITreeNode = { - data : { - type : 'VFModule', - modelName : "vfModulesName", - dynamicModelName : "vfModulesName", - parent : { - vnfStoreKey : "vnfStoreKey", - type : 'VF' + let node: ITreeNode = { + data: { + type: 'VFModule', + modelName: "vfModulesName", + dynamicModelName: "vfModulesName", + parent: { + vnfStoreKey: "vnfStoreKey", + type: 'VF' } } }; - let result : boolean = service.isVFModuleMissingData(node, "serviceInstanceId"); + let result: boolean = service.isVFModuleMissingData(node, "serviceInstanceId"); expect(result).toBeFalsy(); }); test('isVFModuleMissingData should return false if vnfModule has isMissingData = false', () => { - let node : ITreeNode = { - data : { - type : 'VFModule', - modelName : "vfModulesName", - dynamicModelName : "vfModulesName", - parent : { - vnfStoreKey : "vnfStoreKey1", - type : 'VF' + let node: ITreeNode = { + data: { + type: 'VFModule', + modelName: "vfModulesName", + dynamicModelName: "vfModulesName", + parent: { + vnfStoreKey: "vnfStoreKey1", + type: 'VF' } } }; - let result : boolean = service.isVFModuleMissingData(node, "serviceInstanceId"); + let result: boolean = service.isVFModuleMissingData(node, "serviceInstanceId"); expect(result).toBeFalsy(); }); diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts index 17f761c41..acf622463 100644 --- a/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts +++ b/vid-webpack-master/src/app/drawingBoard/service-planning/drawing-board-tree/drawing-board-tree.service.ts @@ -42,7 +42,8 @@ export class DrawingBoardTreeService { new TreeNodeContextMenuModel('addGroupMember', 'context-menu-addGroupMember', 'Add group members', 'plus'), new TreeNodeContextMenuModel('delete', 'context-menu-delete', 'Delete', 'trash-o'), new TreeNodeContextMenuModel('remove', 'context-menu-remove', 'Remove', 'trash-o'), - new TreeNodeContextMenuModel('undoDelete', 'context-menu-undoDelete', 'Undo Delete', 'undo-delete') + new TreeNodeContextMenuModel('undoDelete', 'context-menu-undoDelete', 'Undo Delete', 'undo-delete'), + new TreeNodeContextMenuModel('changeAssociations', 'context-menu-changeAssociations', 'Change Associations', 'edit-file-o') ]; } -- cgit 1.2.3-korg