forked from UoEMainLibrary/dspace-datashare-angular
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaccess-status-badge.component.ts
More file actions
133 lines (120 loc) · 3.87 KB
/
Copy pathaccess-status-badge.component.ts
File metadata and controls
133 lines (120 loc) · 3.87 KB
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import { AsyncPipe } from '@angular/common';
import {
Component,
Input,
OnDestroy,
OnInit,
} from '@angular/core';
import { TranslateModule } from '@ngx-translate/core';
import {
Observable,
of as observableOf,
Subscription,
} from 'rxjs';
import {
catchError,
map,
} from 'rxjs/operators';
import { environment } from 'src/environments/environment';
import { LinkService } from '../../../../../core/cache/builders/link.service';
import { Bitstream } from '../../../../../core/shared/bitstream.model';
import { Item } from '../../../../../core/shared/item.model';
import { getFirstSucceededRemoteDataPayload } from '../../../../../core/shared/operators';
import { hasValue } from '../../../../empty.util';
import { followLink } from '../../../../utils/follow-link-config.model';
import { AccessStatusObject } from './access-status.model';
@Component({
selector: 'ds-base-access-status-badge',
templateUrl: './access-status-badge.component.html',
styleUrls: ['./access-status-badge.component.scss'],
standalone: true,
imports: [AsyncPipe, TranslateModule],
})
/**
* Component rendering the access status of an item or bitstream as a badge
*/
export class AccessStatusBadgeComponent implements OnDestroy, OnInit {
@Input() object: Item | Bitstream;
accessStatus$: Observable<string>;
embargoDate$: Observable<string>;
/**
* Whether to show the access status badge or not
*/
showAccessStatus: boolean;
/**
* Value based stylesheet class for access status badge
*/
accessStatusClass: string;
/**
* List of subscriptions
*/
subs: Subscription[] = [];
constructor(
private linkService: LinkService,
) { }
ngOnInit(): void {
if (!hasValue(this.object)) {
return;
}
if (!hasValue(this.object.accessStatus)) {
// In case the access status has not been loaded, do it individually.
this.linkService.resolveLink(this.object, followLink('accessStatus'));
}
switch ((this.object as any).type) {
case Item.type.value:
this.handleItem();
break;
case Bitstream.type.value:
this.handleBitstream();
break;
}
}
/**
* Method to handle the object type Item
*/
private handleItem() {
this.showAccessStatus = environment.item.showAccessStatuses;
if (!this.showAccessStatus) {
return;
}
this.accessStatus$ = this.object.accessStatus.pipe(
getFirstSucceededRemoteDataPayload(),
map((accessStatus: AccessStatusObject) => hasValue(accessStatus.status) ? accessStatus.status : 'unknown'),
map((status: string) => `access-status.${status.toLowerCase()}.listelement.badge`),
catchError(() => observableOf('access-status.unknown.listelement.badge')),
);
// stylesheet based on the access status value
this.subs.push(
this.accessStatus$.pipe(
map((accessStatusClass: string) => accessStatusClass.replace(/\./g, '-')),
).subscribe((accessStatusClass: string) => {
this.accessStatusClass = accessStatusClass;
}),
);
}
/**
* Method to handle the object type Bitstream
*/
private handleBitstream() {
this.showAccessStatus = environment.item.bitstream.showAccessStatuses;
if (!this.showAccessStatus) {
return;
}
this.embargoDate$ = this.object.accessStatus.pipe(
getFirstSucceededRemoteDataPayload(),
map((accessStatus: AccessStatusObject) => hasValue(accessStatus.embargoDate) ? accessStatus.embargoDate : null),
catchError(() => observableOf(null)),
);
this.accessStatus$ = this.embargoDate$.pipe(
map(date => hasValue(date) ? 'embargo.listelement.badge' : null),
);
this.subs.push(
this.embargoDate$.subscribe(date => {
this.accessStatusClass = hasValue(date) ? 'embargo-listelement-badge' : '';
}),
);
}
ngOnDestroy(): void {
this.subs.filter((sub) => hasValue(sub)).forEach((sub) => sub.unsubscribe());
}
}