Merge from ecomp 718fd196 - Modern UI
[vid.git] / vid-webpack-master / src / app / shared / components / searchMembersModal / members-table / elements-table.service.ts
1 import {Injectable} from "@angular/core";;
2 import {NgRedux} from "@angular-redux/store";
3 import {AppState} from "../../../store/reducers";
4 import {DataFilterPipe} from "../../../pipes/dataFilter/data-filter.pipe";
5 import {ElementTableRowModel, ModalInformation} from "./element-table-row.model";
6 import {Level1Instance} from "../../../models/level1Instance";
7 import * as _ from 'lodash';
8 import {Subject} from "rxjs";
9 import {CustomTableColumnDefinition} from "./elements-table.component";
10 import {
11   deleteGenericModalhelper,
12   deleteGenericModalTableDataHelper,
13   updateGenericModalhelper, updateGenericModalTableDataHelper
14 } from "../../../storeUtil/utils/global/global.actions";
15
16 @Injectable()
17 export class ElementsTableService {
18   allElementsStatusMap : { [key:string]: ElementTableRowModel; };
19   filteredMembers :  any[];
20   allCheckboxAreSelected : boolean;
21   numberOfNotHideRows : number;
22   numberOfSelectedRows : number;
23   numberOfSelectedAndNotHideRows : number;
24   numberOfNotSelectedAndNotHideRows : number;
25   maxSelectedRow : number;
26   modalInformation : ModalInformation;
27
28   static uniqObjectField : string;
29   static changeFnTableDataTrigger : Subject<any> = new Subject();
30   static changeModalInformationDataTrigger : Subject<{modalInformation, selectedRowsIds}> = new Subject();
31   static selectRowsTrigger : Subject<string[]> = new Subject();
32
33   get staticUniqObjectField() { return ElementsTableService.uniqObjectField; }
34
35   constructor(private _store: NgRedux<AppState>, private dataFilter: DataFilterPipe){
36     this.resetAll(ElementsTableService.uniqObjectField, this.maxSelectedRow);
37   }
38
39   updateAmountsAndCheckAll = (uniqObjectField: string, modalInformation : ModalInformation, maxSelectedRow? : number) : void => {
40     this.maxSelectedRow = maxSelectedRow;
41     this.modalInformation = modalInformation;
42     ElementsTableService.uniqObjectField = uniqObjectField;
43     this.numberOfSelectedRows = this.calculateSelectedRows();
44     this.numberOfNotHideRows = this.calculateNotHideRows();
45     this.numberOfSelectedAndNotHideRows = this.calculateSelectedAndNotHide();
46     this.numberOfNotSelectedAndNotHideRows = this.calculateNotSelectedAndNotHide();
47     this.allCheckboxAreSelected = this.numberOfNotHideRows > 0 && ((this.numberOfNotHideRows === this.numberOfSelectedAndNotHideRows) ||  (this.numberOfSelectedAndNotHideRows  === this.maxSelectedRow));
48   };
49
50   resetAll = (uniqObjectField: string, maxSelectedRow? : number) : void => {
51     this.allElementsStatusMap = {};
52     this.filteredMembers = [];
53     this.numberOfSelectedRows = 0;
54     this.numberOfNotHideRows = 0;
55     this.numberOfSelectedAndNotHideRows = 0;
56     this.numberOfNotSelectedAndNotHideRows = 0;
57     this.allCheckboxAreSelected = false;
58     this.maxSelectedRow = maxSelectedRow;
59     ElementsTableService.uniqObjectField = uniqObjectField;
60   };
61
62   changeAllCheckboxStatus = (status : boolean) : void =>{
63     for(const member of this.filteredMembers){
64         this.allElementsStatusMap[member[this.modalInformation.uniqObjectField]].isSelected = status;
65         if(status){
66           this._store.dispatch(updateGenericModalhelper(`selected${this.modalInformation.type}`, this.allElementsStatusMap[member[this.modalInformation.uniqObjectField]], this.modalInformation.uniqObjectField));
67         }else {
68           this._store.dispatch(deleteGenericModalhelper(`selected${this.modalInformation.type}`,this.allElementsStatusMap[member[this.modalInformation.uniqObjectField]][this.modalInformation.uniqObjectField]));
69         }
70     }
71     this.updateAmountsAndCheckAll(ElementsTableService.uniqObjectField, this.modalInformation, this.maxSelectedRow);
72   };
73
74   changeCheckboxStatus = (vnfInstanceId : string, tableData) : void => {
75     if(_.isNil(this.allElementsStatusMap[vnfInstanceId].isSelected)){
76       this.allElementsStatusMap[vnfInstanceId].isSelected = true;
77       this._store.dispatch(updateGenericModalhelper(`selected${this.modalInformation.type}`, this.allElementsStatusMap[vnfInstanceId], this.modalInformation.uniqObjectField));
78       this._store.dispatch(updateGenericModalTableDataHelper(`${this.modalInformation.type}_TABLE_DATA`, tableData));
79     }else {
80       this.allElementsStatusMap[vnfInstanceId].isSelected = !this.allElementsStatusMap[vnfInstanceId].isSelected;
81       if(this.allElementsStatusMap[vnfInstanceId].isSelected){
82         this._store.dispatch(updateGenericModalhelper(`selected${this.modalInformation.type}`, this.allElementsStatusMap[vnfInstanceId], this.modalInformation.uniqObjectField));
83         this._store.dispatch(updateGenericModalTableDataHelper(`${this.modalInformation.type}_TABLE_DATA`, tableData));
84       }else {
85         this._store.dispatch(deleteGenericModalhelper(`selected${this.modalInformation.type}`, this.modalInformation.uniqObjectField));
86         this._store.dispatch(deleteGenericModalhelper(`selected${this.modalInformation.type}`, vnfInstanceId));
87
88         this._store.dispatch(deleteGenericModalTableDataHelper(`${this.modalInformation.type}_TABLE_DATA`));
89       }
90     }
91
92     this.updateAmountsAndCheckAll(ElementsTableService.uniqObjectField, this.modalInformation,  this.maxSelectedRow);
93   };
94
95   filterMembers(searchStr: string, type :string): void {
96     const keys: string[][] =  this.getDataKeys(type);
97     const types :string[] = this.getDataType(type);
98     this.filteredMembers = this.dataFilter.transform(_.values(this.allElementsStatusMap), searchStr || '', keys, types);
99     this.updateAmountsAndCheckAll(ElementsTableService.uniqObjectField, this.modalInformation, this.maxSelectedRow);
100   }
101
102   /**************************************************
103    generate elements data for select/ unselect rows
104    **************************************************/
105    generateAllMembersStatus(tableData : Level1Instance[]) : { [key:string]: ElementTableRowModel; }{
106     tableData.map((item) => {
107       item['isSelected'] = false
108     });
109     return _.keyBy(tableData as ElementTableRowModel[],this.staticUniqObjectField);
110   }
111
112    sortElementsByName(list : Level1Instance[], keyName : string) :Level1Instance[]{
113     if(!_.isNil(list) && !_.isNil(keyName)) {
114       return list.sort(function(itemA, itemB) { return itemA[keyName]- itemB[keyName];})
115     }
116     return [];
117   }
118
119   /********************************
120    table columns headers and key's
121    ********************************/
122   static getHeaders(type: string) : CustomTableColumnDefinition[] {
123     return  [
124       {displayName: `${type} instance name`, key: ['instanceName']},
125       {displayName: `${type} version`, key: ['modelInfo', 'modelVersion']},
126       {displayName: `${type} model name`, key: ['modelInfo', 'modelName']},
127       {displayName: 'Prov Status', key: ['provStatus']},
128       {displayName: 'Service instance name', key: ['serviceInstanceName']},
129       {displayName: 'Cloud Region', key: ['lcpCloudRegionId']},
130       {displayName: 'Tenant Name', key: ['tenantName']}
131     ];
132   }
133
134   getDataKeys(type: string): string[][]{
135     const headers = (!_.isNil(this.modalInformation) && !_.isNil(this.modalInformation.tableHeaders)) ? this.modalInformation.tableHeaders : ElementsTableService.getHeaders(type);
136     return headers.map((header)=> header.key).concat([[ElementsTableService.uniqObjectField]],[['serviceInstanceId']]);
137   }
138
139   getDataType(type: string): string[]{
140     const headers = (!_.isNil(this.modalInformation) && !_.isNil(this.modalInformation.tableHeaders)) ? this.modalInformation.tableHeaders : ElementsTableService.getHeaders(type);
141     return headers.map((header)=> header.type);
142
143   }
144
145   /*************************************************************************************
146    calculate the number of selected vnf members - include not visible and visible rows
147    @allElementsStatusMap: current vnf member status
148    *************************************************************************************/
149   calculateSelectedRows() : number {
150     const flatObject = _.values(this.allElementsStatusMap);
151     return  _.filter(flatObject, (item) => { if (item.isSelected) return item }).length;
152   }
153
154   /************************************************
155    calculate the number of display vnf members
156    @allElementsStatusMap: current vnf member status
157    ************************************************/
158   calculateNotHideRows() : number {
159     return  this.filteredMembers ? this.filteredMembers.length : 0;
160   }
161
162   /************************************************
163    calculate the number of display vnf members
164    @allElementsStatusMap: current vnf member status
165    ************************************************/
166   calculateSelectedAndNotHide() : number {
167     return  _.filter(this.filteredMembers, (item) => { if ( this.allElementsStatusMap[item[ElementsTableService.uniqObjectField]].isSelected) return item }).length;
168   }
169
170   calculateNotSelectedAndNotHide() : number {
171     return  _.filter(this.filteredMembers, (item) => { if ( !this.allElementsStatusMap[item[ElementsTableService.uniqObjectField]].isSelected) return item }).length;
172   }
173
174
175   isRowDisabled(currentRowIsSelected : boolean, maxSelectRow?: number) : boolean {
176     return _.isNil(maxSelectRow) || currentRowIsSelected || maxSelectRow === 1 ? false : maxSelectRow <= this.calculateSelectedRows();
177   }
178
179   isCheckAllDisabled(maxSelectRow?: number) : boolean{
180     if(_.isNil(maxSelectRow)) return false;
181     else {
182       return this.numberOfNotSelectedAndNotHideRows  > maxSelectRow;
183     }
184   }
185
186
187 }