openaire-library/monitor/services/resources.service.ts

99 lines
3.8 KiB
TypeScript

import {Injectable} from "@angular/core";
import {MenuItem} from "../../sharedComponents/menu";
import {Option} from "../../sharedComponents/input/input.component";
import {StakeholderEntities} from "../entities/stakeholder";
import {from, Subscription} from "rxjs";
import {HttpClient} from "@angular/common/http";
import {properties} from "../../../../environments/environment";
import {Page} from "../../utils/entities/adminTool/page";
import {map} from "rxjs/operators";
@Injectable({
providedIn: 'root'
})
export class ResourcesService {
private subscription: Subscription;
private routes = ResourcesService.types.map(type => '/indicators/' + type.value);
public static readonly types: Option[] = [
{value: 'funder', label: StakeholderEntities.FUNDERS},
{value: 'ri', label: StakeholderEntities.RIS},
{value: 'project', label: StakeholderEntities.PROJECTS},
{value: 'organization', label: StakeholderEntities.ORGANIZATIONS}
];
constructor(private http: HttpClient) {
}
private async getResourcesItemsAsync(prefix = '', portal: string = null, target = '_self'): Promise<MenuItem[]> {
let items = [
new MenuItem("methodology", "Methodology", "", "", false, [],
null, {}, null, null, null, null, '_self'),
ResourcesService.setLink(new MenuItem("methodological-approach", "Methodological Approach",
"", "", false, [], null, {}, null, null, null, null, target),
prefix + "/methodology/methodological-approach", portal),
ResourcesService.setLink(new MenuItem("terminology", "Terminology and construction",
"", "", false, [], null, {}, null, null, null, null, target),
prefix + "/methodology/terminology", portal)];
items.push(new MenuItem("indicators-page", "Indicators",
"", "", false, [], null, {}));
items.push(ResourcesService.setLink(new MenuItem("indicator-themes", "Indicator Themes",
"", "", false, [], null, {}, null, null, null, null, target), prefix + "/indicators/themes", portal));
let promise = new Promise<void>(resolve => {
this.isPagesEnabled().subscribe(status => {
ResourcesService.types.forEach((type, index) => {
if (status[index]) {
items.push(ResourcesService.setLink(
new MenuItem("indicators-" + type.value, type.label,
"", "", false, [], null, {}, null, null, null, null, target),
prefix + "/indicators/" + type.value, portal)
);
}
});
resolve();
}, error => {
console.error(error);
resolve();
});
})
await promise;
return items;
}
setResources(items: MenuItem[], prefix = '', portal: string = null, target = '_self') {
if (this.subscription) {
this.subscription.unsubscribe();
}
let resources = new MenuItem('resources', 'Resources', "", "", false, [], null, {});
let index = items.push(resources) - 1;
this.subscription = from(this.getResourcesItemsAsync(prefix, portal, target)).subscribe(resourcesItems => {
items[index].items = resourcesItems;
});
}
public isPagesEnabled() {
let url = properties.adminToolsAPIURL + "/monitor/monitor/pages";
return this.http.get<Page[]>((properties.useLongCache) ? (properties.cacheUrl + encodeURIComponent(url)) : url)
.pipe(map(pages => {
let result = this.routes.map(() => false);
pages.forEach(page => {
let index = this.routes.findIndex(route => route === page.route && page.isEnabled);
if (index !== -1) {
result[index] = true;
}
});
return result;
}));
}
private static setLink(item: MenuItem, route: string, portal: string = null) {
if (portal) {
item.url = portal + route + (item.fragment ? '#' + item.fragment : '');
} else {
item.route = route;
}
return item;
}
}