aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-ui/src/app/ng2/components/logic/attributes-table/attributes-table.component.ts
blob: 000e2cc6e93946cb0cd6519aedcaf573926cbde4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*-
 * ============LICENSE_START=======================================================
 * SDC
 * ================================================================================
 * Copyright (C) 2021 Nordix Foundation. All rights reserved.
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 */

import {Component, EventEmitter, Input, OnChanges, Output, SimpleChanges} from '@angular/core';
import {InstanceFeDetails} from '../../../../models/instance-fe-details';
import {InstanceFeAttributesMap} from "../../../../models/attributes-outputs/attribute-fe-map";
import {AttributeFEModel} from "../../../../models/attributes-outputs/attribute-fe-model";
import {AttributesService} from "../../../services/attributes.service";
import {DerivedFEAttribute} from "../../../../models/attributes-outputs/derived-fe-attribute";

@Component({
  selector: 'attributes-table',
  templateUrl: './attributes-table.component.html',
  styleUrls: ['./attributes-table.component.less']
})
export class AttributesTableComponent implements OnChanges {

  @Input() feAttributesMap: InstanceFeAttributesMap;
  @Input() feInstanceNamesMap: Map<string, InstanceFeDetails>;
  @Input() selectedAttributeId: string;
  @Input() attributeNameSearchText: string;
  @Input() searchTerm: string;
  @Input() readonly: boolean;
  @Input() isLoading: boolean;
  @Input() hasDeclareOption: boolean;
  @Input() hideAttributeType: boolean;
  @Input() showDelete: boolean;

  @Output('attributeChanged') emitter: EventEmitter<AttributeFEModel> = new EventEmitter<AttributeFEModel>();
  @Output() selectAttributeRow: EventEmitter<AttributeRowSelectedEvent> = new EventEmitter<AttributeRowSelectedEvent>();
  @Output() updateCheckedAttributeCount: EventEmitter<boolean> = new EventEmitter<boolean>(); // only for hasDeclareOption
  @Output() updateCheckedChildAttributeCount: EventEmitter<boolean> = new EventEmitter<boolean>();//only for hasDeclareListOption
  @Output() deleteAttribute: EventEmitter<AttributeFEModel> = new EventEmitter<AttributeFEModel>();

  sortBy: string;
  reverse: boolean;
  direction: number;
  path: string[];

  readonly ascUpperLettersFirst = 1;
  readonly descLowerLettersFirst = -1;

  constructor(private attributesService: AttributesService) {
  }

  ngOnChanges(changes: SimpleChanges): void {
    if (changes.fePropertiesMap) {
      this.sortBy = '';
      this.sort('name');
    }
  }

  sort(sortBy) {
    this.reverse = (this.sortBy === sortBy) ? !this.reverse : true;
    this.direction = this.reverse ? this.ascUpperLettersFirst : this.descLowerLettersFirst;
    this.sortBy = sortBy;
    this.path = sortBy.split('.');
  }

  onAttributeChanged = (attribute) => {
    this.emitter.emit(attribute);
  }

  // Click on main row (row of AttributeFEModel)
  onClickAttributeRow = (attribute: AttributeFEModel, instanceName: string) => {
    this.selectedAttributeId = attribute.name;
    const attributeRowSelectedEvent: AttributeRowSelectedEvent = new AttributeRowSelectedEvent(attribute, instanceName);
    this.selectAttributeRow.emit(attributeRowSelectedEvent);
  }

  // Click on inner row (row of DerivedFEAttribute)
  onClickAttributeInnerRow = (attribute: DerivedFEAttribute, instanceName: string) => {
    const attributeRowSelectedEvent: AttributeRowSelectedEvent = new AttributeRowSelectedEvent(attribute, instanceName);
    this.selectAttributeRow.emit(attributeRowSelectedEvent);
  }

  attributeChecked = (attrib: AttributeFEModel, childAttribName?: string) => {
    const isChecked: boolean = (!childAttribName) ? attrib.isSelected : attrib.flattenedChildren.find((attrib) => attrib.attributesName == childAttribName).isSelected;

    if (isChecked) {
      this.attributesService.disableRelatedAttributes(attrib, childAttribName);
    } else {
      this.attributesService.undoDisableRelatedAttributes(attrib, childAttribName);
    }
    this.updateCheckedAttributeCount.emit(isChecked);

  }

}

export class AttributeRowSelectedEvent {
  attributeModel: AttributeFEModel | DerivedFEAttribute;
  instanceName: string;

  constructor(attributeModel: AttributeFEModel | DerivedFEAttribute, instanceName: string) {
    this.attributeModel = attributeModel;
    this.instanceName = instanceName;
  }
}