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";
11 deleteGenericModalhelper,
12 deleteGenericModalTableDataHelper,
13 updateGenericModalhelper, updateGenericModalTableDataHelper
14 } from "../../../storeUtil/utils/global/global.actions";
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;
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();
33 get staticUniqObjectField() { return ElementsTableService.uniqObjectField; }
35 constructor(private _store: NgRedux<AppState>, private dataFilter: DataFilterPipe){
36 this.resetAll(ElementsTableService.uniqObjectField, this.maxSelectedRow);
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));
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;
62 changeAllCheckboxStatus = (status : boolean) : void =>{
63 for(const member of this.filteredMembers){
64 this.allElementsStatusMap[member[this.modalInformation.uniqObjectField]].isSelected = status;
66 this._store.dispatch(updateGenericModalhelper(`selected${this.modalInformation.type}`, this.allElementsStatusMap[member[this.modalInformation.uniqObjectField]], this.modalInformation.uniqObjectField));
68 this._store.dispatch(deleteGenericModalhelper(`selected${this.modalInformation.type}`,this.allElementsStatusMap[member[this.modalInformation.uniqObjectField]][this.modalInformation.uniqObjectField]));
71 this.updateAmountsAndCheckAll(ElementsTableService.uniqObjectField, this.modalInformation, this.maxSelectedRow);
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));
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));
85 this._store.dispatch(deleteGenericModalhelper(`selected${this.modalInformation.type}`, this.modalInformation.uniqObjectField));
86 this._store.dispatch(deleteGenericModalhelper(`selected${this.modalInformation.type}`, vnfInstanceId));
88 this._store.dispatch(deleteGenericModalTableDataHelper(`${this.modalInformation.type}_TABLE_DATA`));
92 this.updateAmountsAndCheckAll(ElementsTableService.uniqObjectField, this.modalInformation, this.maxSelectedRow);
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);
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
109 return _.keyBy(tableData as ElementTableRowModel[],this.staticUniqObjectField);
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];})
119 /********************************
120 table columns headers and key's
121 ********************************/
122 static getHeaders(type: string) : CustomTableColumnDefinition[] {
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']}
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']]);
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);
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;
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;
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;
170 calculateNotSelectedAndNotHide() : number {
171 return _.filter(this.filteredMembers, (item) => { if ( !this.allElementsStatusMap[item[ElementsTableService.uniqObjectField]].isSelected) return item }).length;
175 isRowDisabled(currentRowIsSelected : boolean, maxSelectRow?: number) : boolean {
176 return _.isNil(maxSelectRow) || currentRowIsSelected || maxSelectRow === 1 ? false : maxSelectRow <= this.calculateSelectedRows();
179 isCheckAllDisabled(maxSelectRow?: number) : boolean{
180 if(_.isNil(maxSelectRow)) return false;
182 return this.numberOfNotSelectedAndNotHideRows > maxSelectRow;