Project

General

Profile

1
import {Component, Input, Output, EventEmitter} from '@angular/core';
2
import {Metrics} from '../../utils/entities/metrics';
3
import {MetricsService } from '../../services/metrics.service';
4
import {ErrorCodes} from '../../utils/properties/errorCodes';
5

    
6
import { Subscription }   from 'rxjs';
7
import{EnvProperties} from '../../utils/properties/env-properties';
8

    
9
@Component({
10
    selector: 'metrics',
11
    template: `
12
    <div *ngIf="!shortView">
13
      <errorMessages [status]="[status]" [type]="'metrics'" tab_error_class=true></errorMessages>
14

    
15
      <div *ngIf="metrics && pageViews == 0 && metrics.totalViews == 0 && metrics.totalDownloads == 0" class="uk-alert uk-alert-primary">
16
        No metrics available
17
      </div>
18
      <div *ngIf="metrics != undefined  && (pageViews >0 || metrics.totalViews > 0|| metrics.totalDownloads >0)" class="uk-child-width-1-3@m uk-grid-small uk-grid-match uk-grid" uk-grid="">
19
          <div *ngIf="entityType == 'projects'" class="uk-width-1-1 uk-text-center uk-text-meta uk-margin">Project metrics are derived from aggregating individual research results metrics.</div>
20
          <div class="metrics-openaire uk-first-column">
21
              <div class="uk-tile uk-tile-default uk-padding-small">
22
                <div class="uk-text-center">{{pageViews | number}}</div>
23
                <div class="uk-text-center">views in OpenAIRE</div>
24
              </div>
25
          </div>
26
          <div class="metrics-views">
27
              <div class="uk-tile uk-tile-muted uk-padding-small">
28
                  <div class="uk-text-center">  {{metrics.totalViews | number}}
29
                  <span *ngIf="metrics.totalViews > 0 && metrics.totalOpenaireViews > 0">
30
                  ( {{metrics.totalOpenaireViews | number}} from OpenAIRE )
31
                  </span></div>
32
                  <div  class="uk-text-center">views in local repository</div>
33
              </div>
34
          </div>
35
          <div class="metrics-downloads">
36
              <div class="uk-tile uk-tile-primary uk-padding-small">
37
                  <div class="uk-text-center">  {{metrics.totalDownloads | number}}
38
                  <span *ngIf="metrics.totalDownloads > 0 && metrics.totalOpenaireDownloads > 0">
39
                  ( {{metrics.totalOpenaireDownloads | number}} from OpenAIRE )
40
                  </span></div>
41
                  <div class="uk-text-center">downloads in local repository</div>
42
              </div>
43
          </div>
44

    
45
      </div>
46

    
47
      <p *ngIf="metrics != undefined && metrics.infos.size > 0" >The information is available from the following content providers: </p>
48
      <table *ngIf="metrics != undefined && metrics.infos.size > 0"
49
              class="uk-table uk-table-small uk-table-striped">
50
          <thead>
51
              <tr>
52
                  <th class="uk-text-center uk-text-bold">From</th>
53
                  <th class="uk-text-center  uk-text-bold">Number Of Views</th>
54
                  <th class="uk-text-center  uk-text-bold">Number Of Downloads</th>
55
              </tr>
56
          </thead>
57
          <tbody>
58
              <tr *ngFor="let key of getKeys(metrics.infos)">
59
                  <td class="uk-text-center">
60
                      <a href="{{metrics.infos.get(key).url}}">
61
                          {{metrics.infos.get(key).name}}
62
                      </a>
63
                  </td>
64
                  <td class="uk-text-center">
65
                      {{metrics.infos.get(key).numOfViews | number}}
66
                      <span *ngIf="metrics.infos.get(key).numOfViews > 0 && metrics.infos.get(key).openaireViews > 0">
67
                        ( {{metrics.infos.get(key).openaireViews | number}} from OpenAIRE )
68
                      </span>
69
                  </td>
70
                  <td class="uk-text-center">
71
                      {{metrics.infos.get(key).numOfDownloads | number}}
72
                      <span *ngIf="metrics.infos.get(key).numOfDownloads > 0 && metrics.infos.get(key).openaireDownloads > 0">
73
                        ( {{metrics.infos.get(key).openaireDownloads | number}} from OpenAIRE )
74
                      </span>
75
                  </td>
76
              </tr>
77
          </tbody>
78
      </table>
79
    </div>
80
    <div *ngIf="shortView && metrics && (metrics.pageViews >0 || metrics.totalViews > 0|| metrics.totalDownloads >0)">
81
      <dl *ngIf="metrics" class="uk-description-list-line">
82
        <dt class="sideInfoTitle">Metrics</dt>
83
        <dd class="line" >
84
          {{metrics.pageViews | number}} views in OpenAIRE
85
        </dd>
86
        <dd class="line">
87
           {{metrics.totalViews | number}}
88
          <span *ngIf="metrics.totalViews > 0 && metrics.totalOpenaireViews > 0">
89
          ( {{metrics.totalOpenaireViews | number}} from OpenAIRE )
90
          </span>
91
          views in local repository
92
        </dd>
93
        <dd class="line">
94
          {{metrics.totalDownloads | number}}
95
          <span *ngIf="metrics.totalDownloads > 0 && metrics.totalOpenaireDownloads > 0">
96
          ( {{metrics.totalOpenaireDownloads | number}} from OpenAIRE )
97
          </span> downloads in local repository
98
        </dd>
99
      </dl>
100
    </div>
101
    `
102
    })
103

    
104
export class MetricsComponent {
105
    @Output() metricsResults = new EventEmitter();
106
    @Input() id: string;
107
    @Input() entityType: string;
108
    @Input() entity: string;
109
    //@Input() name: string = "";
110
    @Input() pageViews: number = 0;
111
    @Input() properties:EnvProperties;
112
    @Input() shortView:boolean = false;
113

    
114
    public metrics: Metrics;
115
    public errorCodes:ErrorCodes;
116
    private sub: Subscription;
117

    
118
    public status: number;
119

    
120
    constructor (private _metricsService: MetricsService) {}
121

    
122
    ngOnInit() {
123
        this.errorCodes = new ErrorCodes();
124
        this.status = this.errorCodes.LOADING;
125
        this.getMetrics();
126
    }
127

    
128
    ngOnDestroy() {
129
        this.sub.unsubscribe();
130
    }
131

    
132
    private getMetrics() {
133
        //if(this.id == undefined || this.id == "") {
134
        //    console.log("supplied id in metrics is not acceptable");
135
        //}
136
        //if(this.type == undefined || this.type == "") {
137
        //    console.log("supplied id in metrics is not acceptable");
138
        //}
139

    
140
        this.sub = this._metricsService.getMetrics(this.id, this.entityType, this.properties).subscribe(
141
         data => {
142
             this.metrics = data;
143
             this.status = this.errorCodes.DONE;
144
             this.metricsResults.emit({
145
                 totalViews: this.metrics.totalViews,
146
                 totalDownloads: this.metrics.totalDownloads,
147
                 pageViews: this.metrics.pageViews
148
             });
149
         },
150
         err => {
151
           console.log(err);
152
           if(err.status == '404') {
153
             this.status = this.errorCodes.NOT_FOUND;
154
           } else if(err.status == '500') {
155
             this.status = this.errorCodes.ERROR;
156
           } else {
157
             this.status = this.errorCodes.NOT_AVAILABLE;
158
           }
159
           this.metricsResults.emit({
160
               totalViews: 0,
161
               totalDownloads: 0
162
           });
163
         }
164
       );
165
    }
166

    
167
    public getKeys( map) {
168
      return Array.from(map.keys());
169
    }
170
}
(5-5/18)