Project

General

Profile

1
import {Component, OnDestroy, OnInit, ViewChild} from "@angular/core";
2
import {StakeholderService} from "../openaireLibrary/monitor/services/stakeholder.service";
3
import {EnvProperties} from "../openaireLibrary/utils/properties/env-properties";
4
import {EnvironmentSpecificService} from "../openaireLibrary/utils/properties/environment-specific.service";
5
import {Stakeholder} from "../openaireLibrary/monitor/entities/stakeholder";
6
import {Subscriber, zip} from "rxjs";
7
import {StakeholderUtils} from "../utils/indicator-utils";
8
import {FormBuilder, FormGroup, Validators} from "@angular/forms";
9
import {AlertModal} from "../openaireLibrary/utils/modal/alert";
10
import {StakeholderCreator} from "../utils/entities/stakeholderCreator";
11
import {Option} from "../openaireLibrary/dashboard/sharedComponents/input/input.component";
12
import {Title} from "@angular/platform-browser";
13

    
14
declare var UIkit;
15

    
16
@Component({
17
  selector: 'home',
18
  templateUrl: "./manageStakeholders.component.html"
19
})
20
export class ManageStakeholdersComponent implements OnInit, OnDestroy {
21
  
22
  public properties: EnvProperties;
23
  public loading: boolean = true;
24
  public stakeholderUtils: StakeholderUtils = new StakeholderUtils();
25
  public defaultStakeholders: Stakeholder[];
26
  public stakeholders: Stakeholder[];
27
  public stakeholder: Stakeholder;
28
  public stakeholderFb: FormGroup;
29
  public index: number;
30
  
31
  /**
32
   *  Filtered Stakeholders
33
   */
34
  public displayDefaultStakeholders: Stakeholder[];
35
  public displayStakeholders: Stakeholder[];
36
  
37
  public defaultStakeholdersOptions: Option[] = [];
38
  
39
  /**
40
   * Top filters
41
   */
42
  public filters: FormGroup;
43
  public all: Option = {
44
    value: 'all',
45
    label: 'All'
46
  };
47
  
48
  /**
49
   * Grid or List View
50
   */
51
  public grid: boolean = true;
52
  private subscriptions: any[] = [];
53
  
54
  @ViewChild('editStakeholderModal') editStakeholderModal: AlertModal;
55
  @ViewChild('deleteStakeholderModal') deleteStakeholderModal: AlertModal;
56
  
57
  constructor(private stakeholderService: StakeholderService,
58
              private propertiesService: EnvironmentSpecificService,
59
              private title: Title,
60
              private fb: FormBuilder) {
61
  }
62
  
63
  ngOnInit(): void {
64
    this.buildFilters();
65
    this.propertiesService.loadEnvironment()
66
      .then(properties => {
67
        this.properties = properties;
68
        this.title.setTitle('Manage Stakeholders');
69
        let data = zip(
70
          this.stakeholderService.getDefaultStakeholders(this.properties.monitorServiceAPIURL),
71
          this.stakeholderService.getStakeholders(this.properties.monitorServiceAPIURL)
72
        );
73
        data.subscribe(res => {
74
          this.defaultStakeholders = res[0];
75
          this.stakeholders = res[1];
76
          this.displayDefaultStakeholders = res[0];
77
          this.displayStakeholders = res[1];
78
          this.loading = false;
79
        });
80
      });
81
  }
82
  
83
  ngOnDestroy(): void {
84
    this.subscriptions.forEach(value => {
85
      if (value instanceof Subscriber) {
86
        value.unsubscribe();
87
      }
88
    });
89
  }
90
  
91
  hide(element: any) {
92
    UIkit.dropdown(element).hide();
93
  }
94
  
95
  public changeGrid(value) {
96
    this.grid = value;
97
  }
98
  
99
  private buildFilters() {
100
    this.filters = this.fb.group({
101
      privacy: this.fb.control('all'),
102
      status: this.fb.control('all'),
103
      keyword: this.fb.control('')
104
    });
105
    this.subscriptions.push(this.filters.get('privacy').valueChanges.subscribe(value => {
106
      this.onPrivacyChange(value);
107
    }));
108
    this.subscriptions.push(this.filters.get('status').valueChanges.subscribe(value => {
109
      this.onStatusChange(value);
110
    }));
111
    this.subscriptions.push(this.filters.get('keyword').valueChanges.subscribe(value => {
112
      this.onKeywordChange(value);
113
    }));
114
  }
115
  
116
  onPrivacyChange(value) {
117
    this.displayDefaultStakeholders = this.filterPrivacy(this.defaultStakeholders, value);
118
    this.displayStakeholders = this.filterPrivacy(this.stakeholders, value);
119
  }
120
  
121
  onStatusChange(value) {
122
    this.displayDefaultStakeholders = this.filterStatus(this.defaultStakeholders, value);
123
    this.displayStakeholders = this.filterStatus(this.stakeholders, value);
124
  }
125
  
126
  onKeywordChange(value) {
127
    this.displayDefaultStakeholders = this.filterByKeyword(this.defaultStakeholders, value);
128
    this.displayStakeholders = this.filterByKeyword(this.stakeholders, value);
129
  }
130
  
131
  onTypeChange(value) {
132
    this.defaultStakeholdersOptions = [{
133
      label: 'New blank profile',
134
      value: '-1'
135
    }];
136
    this.defaultStakeholders.filter(stakeholder => stakeholder.type === value).forEach(stakeholder => {
137
      this.defaultStakeholdersOptions.push({
138
        label: 'Use ' +  stakeholder.name + ' profile',
139
        value: stakeholder._id
140
      })
141
    });
142
  }
143
  
144
  
145
  private filterPrivacy(stakeholders: Stakeholder[], value): Stakeholder[] {
146
    if (value === 'all') {
147
      return stakeholders;
148
    } else {
149
      return stakeholders.filter(stakeholder => stakeholder.isPublic === value);
150
    }
151
  }
152
  
153
  private filterStatus(stakeholders: Stakeholder[], value): Stakeholder[] {
154
    if (value === 'all') {
155
      return stakeholders;
156
    } else {
157
      return stakeholders.filter(stakeholder => stakeholder.isActive === value);
158
    }
159
  }
160
  
161
  private filterByKeyword(stakeholders: Stakeholder[], value): Stakeholder[] {
162
    if (value === null || value === '') {
163
      return stakeholders;
164
    } else {
165
      return stakeholders.filter(stakeholder => (
166
        stakeholder.index_id && stakeholder.index_id.toLowerCase().includes(value.toLowerCase())) ||
167
        stakeholder.index_shortName && stakeholder.index_shortName.toLowerCase().includes(value.toLowerCase()) ||
168
        stakeholder.index_name && stakeholder.index_name.toLowerCase().includes(value.toLowerCase())
169
      );
170
    }
171
  }
172
  
173
  public editStakeholder(stakeholder: Stakeholder = null, isDefault: boolean = false) {
174
    if (isDefault) {
175
      this.index = (stakeholder) ? this.defaultStakeholders.findIndex(value => value._id === stakeholder._id) : -1;
176
    } else {
177
      this.index = (stakeholder) ? this.stakeholders.findIndex(value => value._id === stakeholder._id) : -1;
178
    }
179
    if (!stakeholder) {
180
      this.stakeholder = new Stakeholder(null, null, null,
181
        null, null, null, false, false, null);
182
    } else {
183
      this.stakeholder = stakeholder;
184
    }
185
    this.stakeholderFb = this.fb.group({
186
      _id: this.fb.control(this.stakeholder._id),
187
      defaultId: this.fb.control(this.stakeholder.defaultId),
188
      name: this.fb.control(this.stakeholder.name, Validators.required),
189
      index_name: this.fb.control(this.stakeholder.index_name, Validators.required),
190
      index_id: this.fb.control(this.stakeholder.index_id, Validators.required),
191
      index_shortName: this.fb.control(this.stakeholder.index_shortName, Validators.required),
192
      creationDate: this.fb.control(this.stakeholder.creationDate),
193
      alias: this.fb.control(this.stakeholder.alias,
194
        [
195
          Validators.required,
196
          this.stakeholderUtils.aliasValidator(
197
            (isDefault) ?
198
              this.defaultStakeholders.filter(stakeholder => stakeholder.alias !== this.stakeholder.alias) :
199
              this.stakeholders.filter(stakeholder => stakeholder.alias !== this.stakeholder.alias)
200
          )]
201
      ),
202
      isDefault: this.fb.control(isDefault),
203
      isPublic: this.fb.control(this.stakeholder.isPublic),
204
      isActive: this.fb.control(this.stakeholder.isActive),
205
      type: this.fb.control(this.stakeholder.type, Validators.required),
206
      topics: this.fb.control(this.stakeholder.topics),
207
      managers: this.fb.control(this.stakeholder.managers),
208
      logoUrl: this.fb.control(this.stakeholder.logoUrl),
209
    });
210
    this.subscriptions.push(this.stakeholderFb.get('type').valueChanges.subscribe(value => {
211
      this.onTypeChange(value);
212
    }));
213
    if(!isDefault) {
214
      this.stakeholderFb.setControl('defaultId', this.fb.control(this.stakeholder.defaultId, Validators.required));
215
    }
216
    if (this.index !== -1) {
217
      if (this.stakeholderFb.value.type) {
218
        setTimeout(() => {
219
          this.stakeholderFb.get('type').disable();
220
        }, 0);
221
      } else {
222
        setTimeout(() => {
223
          this.stakeholderFb.get('type').enable();
224
        }, 0);
225
      }
226
      this.editStakeholderModal.okButtonText = 'Save Changes';
227
    } else {
228
      setTimeout(() => {
229
        this.stakeholderFb.get('type').enable();
230
      }, 0);
231
      this.editStakeholderModal.okButtonText = 'Create';
232
    }
233
    this.editStakeholderModal.cancelButtonText = 'Cancel';
234
    this.editStakeholderModal.okButtonLeft = false;
235
    this.editStakeholderModal.alertMessage = false;
236
    this.editStakeholderModal.open();
237
  }
238
  
239
  public saveStakeholder() {
240
    if (this.index === -1) {
241
      if (!this.stakeholderFb.value.isDefault) {
242
        let stakeholder = this.defaultStakeholders.find(value => value._id === this.stakeholderFb.value.defaultId);
243
        this.stakeholderFb.setValue(this.stakeholderUtils.createFunderFromDefaultProfile(this.stakeholderFb.value,
244
          (stakeholder?stakeholder.topics:[])));
245
      } /*else {
246
        this.stakeholderFb.setValue(StakeholderCreator.createFunderDefaultProfile(this.stakeholderFb.value));
247
      }*/
248
      this.stakeholderService.buildStakeholder(this.properties.monitorServiceAPIURL,
249
        this.stakeholderFb.value).subscribe(stakeholder => {
250
        if (stakeholder.defaultId === null) {
251
          this.defaultStakeholders.push(stakeholder);
252
        } else {
253
          this.stakeholders.push(stakeholder);
254
        }
255
      });
256
    } else {
257
      this.stakeholderFb.get('type').enable();
258
      this.stakeholderService.saveElement(this.properties.monitorServiceAPIURL, this.stakeholderFb.value).subscribe(stakeholder => {
259
        if (stakeholder.defaultId == null) {
260
          this.defaultStakeholders[this.index] = stakeholder;
261
        } else {
262
          this.stakeholders[this.index] = stakeholder;
263
        }
264
      });
265
    }
266
  }
267
  
268
  public deleteStakeholderOpen(stakeholder: Stakeholder) {
269
    this.stakeholder = stakeholder;
270
    this.deleteStakeholderModal.alertTitle = 'Delete ' + this.stakeholder.index_name;
271
    this.deleteStakeholderModal.cancelButtonText = 'No';
272
    this.deleteStakeholderModal.okButtonText = 'Yes';
273
    this.deleteStakeholderModal.message = 'This stakeholder will permanently be deleted. Are you sure you want to proceed?';
274
    this.deleteStakeholderModal.open();
275
  }
276
  
277
  public deleteStakeholder() {
278
    if (!this.stakeholder.defaultId) {
279
      this.index = (this.stakeholder) ? this.defaultStakeholders.findIndex(value => value._id === this.stakeholder._id) : -1;
280
    } else {
281
      this.index = (this.stakeholder) ? this.stakeholders.findIndex(value => value._id === this.stakeholder._id) : -1;
282
    }
283
    this.stakeholderService.deleteElement(this.properties.monitorServiceAPIURL, [this.stakeholder._id]).subscribe(() => {
284
      if (!this.stakeholder.defaultId) {
285
        this.defaultStakeholders.splice(this.index, 1);
286
      } else {
287
        this.stakeholders.splice(this.index, 1);
288
      }
289
    });
290
  }
291
  
292
  toggleStakeholderStatus(stakeholder: Stakeholder) {
293
    let path = [
294
      stakeholder._id
295
    ];
296
    this.stakeholderService.toggleStatus(this.properties.monitorServiceAPIURL, path).subscribe(isActive => {
297
      stakeholder.isActive = isActive;
298
    });
299
  }
300
  
301
  toggleStakeholderAccess(stakeholder: Stakeholder) {
302
    let path = [
303
      stakeholder._id
304
    ];
305
    this.stakeholderService.toggleAccess(this.properties.monitorServiceAPIURL, path).subscribe(isPublic => {
306
      stakeholder.isPublic = isPublic;
307
    });
308
  }
309
}
(3-3/4)