2021-11-29 17:02:01 +01:00
|
|
|
import {Component, OnDestroy, OnInit, ViewChild} from '@angular/core';
|
2021-05-19 13:40:29 +02:00
|
|
|
import {Session, User} from '../../openaireLibrary/login/utils/helper.class';
|
|
|
|
import {EnvProperties} from '../../openaireLibrary/utils/properties/env-properties';
|
|
|
|
import {ActivatedRoute} from '@angular/router';
|
|
|
|
import {CommunitiesService} from '../../openaireLibrary/connect/communities/communities.service';
|
|
|
|
import {CommunityInfo} from '../../openaireLibrary/connect/community/communityInfo';
|
|
|
|
import {UserManagementService} from '../../openaireLibrary/services/user-management.service';
|
|
|
|
import {Title} from '@angular/platform-browser';
|
|
|
|
import {properties} from "../../../environments/environment";
|
|
|
|
import {Subscription} from "rxjs";
|
2021-11-29 17:02:01 +01:00
|
|
|
import {SearchInputComponent} from '../../openaireLibrary/sharedComponents/search-input/search-input.component';
|
|
|
|
import {FormBuilder, FormGroup} from '@angular/forms';
|
|
|
|
import {SearchUtilsClass} from '../../openaireLibrary/searchPages/searchUtils/searchUtils.class';
|
|
|
|
import {ErrorCodes} from '../../openaireLibrary/utils/properties/errorCodes';
|
2021-05-19 13:40:29 +02:00
|
|
|
|
|
|
|
type Tab = 'all' | 'communities' | 'ris';
|
|
|
|
|
|
|
|
@Component({
|
|
|
|
selector: 'manage-communities',
|
|
|
|
template: `
|
2022-06-23 18:48:02 +02:00
|
|
|
<div page-content [id]="tab" (stickyEmitter)="stickyPageHeader = $event">
|
2021-05-19 13:40:29 +02:00
|
|
|
<div header>
|
2022-06-23 18:48:02 +02:00
|
|
|
<div class="uk-flex uk-flex-middle uk-margin-top info" [class.uk-active]="stickyPageHeader">
|
|
|
|
<div>
|
|
|
|
<div class="uk-margin-remove uk-text-background uk-text-bold uk-h6">
|
2022-06-26 22:33:02 +02:00
|
|
|
Admin Dashboard - Manage Communities
|
2022-06-23 18:48:02 +02:00
|
|
|
</div>
|
2022-06-26 22:33:02 +02:00
|
|
|
<h1 class="uk-h4 uk-margin-remove">Research Communities & Initiatives</h1>
|
2022-06-23 18:48:02 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<ul class="uk-tab uk-margin-top" uk-tab>
|
2022-06-26 22:33:02 +02:00
|
|
|
<li [class.uk-active]="tab === 'all'"><a (click)="tab = 'all'"><span class="title">All</span></a></li>
|
|
|
|
<li [class.uk-active]="tab === 'communities'"><a (click)="tab = 'communities'"><span class="title">Research Communities</span></a>
|
2021-05-19 13:40:29 +02:00
|
|
|
</li>
|
2022-06-26 22:33:02 +02:00
|
|
|
<li [class.uk-active]="tab === 'ris'"><a (click)="tab = 'ris'"><span class="title">Research Initiatives</span></a>
|
2021-05-19 13:40:29 +02:00
|
|
|
</li>
|
|
|
|
</ul>
|
2022-06-23 18:48:02 +02:00
|
|
|
</div>
|
2021-05-19 13:40:29 +02:00
|
|
|
<div inner>
|
2022-06-23 18:48:02 +02:00
|
|
|
<div class="uk-flex uk-flex-right@m uk-flex-center uk-flex-wrap uk-flex-middle uk-margin-top">
|
|
|
|
<div search-input [searchControl]="filterForm.get('keyword')" [expandable]="true"
|
|
|
|
placeholder="Search Communities" searchInputClass="outer"
|
|
|
|
class="uk-width-1-3@xl uk-width-2-5@l uk-width-1-2@m uk-width-1-1 uk-flex uk-flex-right"></div>
|
|
|
|
</div>
|
2022-06-30 17:23:14 +02:00
|
|
|
<div class="uk-section uk-section-small uk-position-relative" style="min-height: 60vh">
|
|
|
|
<div *ngIf="loading" class="uk-position-center">
|
|
|
|
<loading></loading>
|
|
|
|
</div>
|
|
|
|
<div *ngIf="!loading" uk-height-match="target: .titleContainer; row: false">
|
|
|
|
<div *ngIf="noResults" class="uk-section uk-padding-remove-top">
|
|
|
|
<div class="uk-card uk-card-default uk-padding-large uk-text-center uk-margin-bottom uk-text-bold">
|
|
|
|
<div>No communities to manage yet</div>
|
2022-06-23 18:48:02 +02:00
|
|
|
</div>
|
2021-05-19 13:40:29 +02:00
|
|
|
</div>
|
2022-06-30 17:23:14 +02:00
|
|
|
<div uk-height-match="target: .logoContainer; row: false">
|
|
|
|
<div *ngIf="tab != 'ris' && communities.length > 0" class="uk-section uk-padding-remove-top">
|
|
|
|
<h4>Research Communities</h4>
|
|
|
|
<div class="uk-grid uk-child-width-1-4@xl uk-child-width-1-3@l uk-child-width-1-2@m uk-grid-match" uk-grid>
|
|
|
|
<ng-template ngFor [ngForOf]="filteredCommunities" let-community let-i="index">
|
|
|
|
<ng-container *ngTemplateOutlet="communityBox; context: {community:community}"></ng-container>
|
|
|
|
</ng-template>
|
|
|
|
</div>
|
|
|
|
<div *ngIf="filteredCommunities.length == 0"
|
|
|
|
class="uk-card uk-card-default uk-card-no-height uk-padding-large uk-text-center uk-margin-bottom uk-text-bold">
|
|
|
|
No communities found
|
|
|
|
</div>
|
2022-06-23 18:48:02 +02:00
|
|
|
</div>
|
2022-06-30 17:23:14 +02:00
|
|
|
<div *ngIf="tab != 'communities' && ris.length > 0" [class.uk-padding-remove-top]="tab == 'ris'" class="uk-section">
|
|
|
|
<h4>Research Initiatives</h4>
|
|
|
|
<div class="uk-grid uk-grid-match uk-child-width-1-4@xl uk-child-width-1-3@l uk-child-width-1-2@m" uk-grid>
|
|
|
|
<ng-template ngFor [ngForOf]="filteredRis" let-community let-i="index">
|
|
|
|
<ng-container *ngTemplateOutlet="communityBox; context: {community:community}"></ng-container>
|
|
|
|
</ng-template>
|
|
|
|
</div>
|
|
|
|
<div *ngIf="filteredRis.length == 0"
|
|
|
|
class="uk-card uk-card-default uk-card-no-height uk-padding-large uk-text-center uk-margin-bottom uk-text-bold">
|
|
|
|
No initiatives found
|
|
|
|
</div>
|
2022-06-23 18:48:02 +02:00
|
|
|
</div>
|
2021-05-19 13:40:29 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<ng-template #communityBox let-community="community">
|
|
|
|
<div *ngIf="community">
|
|
|
|
<div class="uk-card uk-card-default uk-card-body uk-position-relative">
|
2022-06-23 18:48:02 +02:00
|
|
|
<div class="uk-position-top-right uk-margin-small-right uk-margin-small-top">
|
|
|
|
<div class="uk-flex uk-flex-middle">
|
|
|
|
<icon [flex]="true" [name]="community.status == 'all'?'earth':(community.status == 'manager'?'restricted':'incognito')" ratio="0.6"></icon>
|
2021-05-19 13:40:29 +02:00
|
|
|
</div>
|
2022-06-23 18:48:02 +02:00
|
|
|
</div>
|
|
|
|
<a class="uk-display-block uk-text-center uk-link-reset" [routerLink]="community.communityId">
|
|
|
|
<div class="titleContainer uk-h6 uk-margin-remove-bottom uk-margin-top multi-line-ellipsis lines-2">
|
|
|
|
<p *ngIf="community.shortTitle" class="uk-margin-remove">
|
|
|
|
{{community.shortTitle}}
|
|
|
|
</p>
|
2021-05-19 13:40:29 +02:00
|
|
|
</div>
|
2022-06-23 18:48:02 +02:00
|
|
|
<div class="logoContainer uk-margin-top uk-flex uk-flex-column uk-flex-center uk-flex-middle">
|
2022-06-26 22:33:02 +02:00
|
|
|
<img [src]="community | logoUrl" class="uk-blend-multiply"
|
2022-06-23 18:48:02 +02:00
|
|
|
style="max-height: 80px;">
|
2021-05-19 13:40:29 +02:00
|
|
|
</div>
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</ng-template>
|
2022-06-23 18:48:02 +02:00
|
|
|
`
|
2021-05-19 13:40:29 +02:00
|
|
|
})
|
|
|
|
export class ManageCommunitiesComponent implements OnInit, OnDestroy {
|
|
|
|
public properties: EnvProperties = properties;
|
|
|
|
public communities: CommunityInfo[] = [];
|
2022-06-23 18:48:02 +02:00
|
|
|
public filteredCommunities: CommunityInfo[] = [];
|
2021-05-19 13:40:29 +02:00
|
|
|
public ris: CommunityInfo[] = [];
|
2022-06-23 18:48:02 +02:00
|
|
|
public filteredRis: CommunityInfo[] = [];
|
2021-05-19 13:40:29 +02:00
|
|
|
public loading: boolean;
|
|
|
|
public user: User;
|
2022-06-23 18:48:02 +02:00
|
|
|
public stickyPageHeader: boolean = false;
|
2021-05-19 13:40:29 +02:00
|
|
|
public tab: Tab = "all";
|
|
|
|
private subscriptions: any[] = [];
|
2022-06-23 18:48:02 +02:00
|
|
|
public communitySearchUtils: SearchUtilsClass = new SearchUtilsClass();
|
|
|
|
public errorCodes: ErrorCodes;
|
|
|
|
// Search
|
|
|
|
@ViewChild('searchInputComponent') searchInputComponent: SearchInputComponent;
|
|
|
|
filterForm: FormGroup;
|
|
|
|
private searchText: string = '';
|
2021-05-19 13:40:29 +02:00
|
|
|
|
2022-06-23 18:48:02 +02:00
|
|
|
constructor(private route: ActivatedRoute,
|
|
|
|
private _fb: FormBuilder,
|
2021-05-19 13:40:29 +02:00
|
|
|
private communitiesService: CommunitiesService,
|
|
|
|
private title: Title,
|
|
|
|
private userManagementService: UserManagementService) {
|
2022-06-23 18:48:02 +02:00
|
|
|
this.errorCodes = new ErrorCodes();
|
2021-11-29 17:02:01 +01:00
|
|
|
this.communitySearchUtils.status = this.errorCodes.LOADING;
|
2021-05-19 13:40:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
ngOnInit() {
|
2022-06-23 18:48:02 +02:00
|
|
|
this.communitySearchUtils.keyword = "";
|
|
|
|
|
2021-11-29 17:02:01 +01:00
|
|
|
this.filterForm = this._fb.group({
|
|
|
|
keyword: [''],
|
|
|
|
});
|
2022-06-23 18:48:02 +02:00
|
|
|
|
|
|
|
this.subscriptions.push(this.filterForm.get('keyword').valueChanges.subscribe(value => {
|
|
|
|
this.searchText = value ? value.toLowerCase() : '';
|
|
|
|
this.applyFilters();
|
2021-11-29 17:02:01 +01:00
|
|
|
}));
|
2022-06-23 18:48:02 +02:00
|
|
|
|
2021-05-19 13:40:29 +02:00
|
|
|
this.loading = true;
|
|
|
|
this.title.setTitle('Administrator Dashboard | Manage Communities');
|
|
|
|
this.subscriptions.push(this.userManagementService.getUserInfo().subscribe(user => {
|
|
|
|
this.user = user;
|
|
|
|
if (this.user) {
|
|
|
|
this.subscriptions.push(this.communitiesService.getCommunities(this.properties, this.properties.communityAPI + 'communities').subscribe(
|
|
|
|
communities => {
|
|
|
|
this.communities = [];
|
2022-06-23 18:48:02 +02:00
|
|
|
this.filteredCommunities = [];
|
2021-05-19 13:40:29 +02:00
|
|
|
this.ris = [];
|
2022-06-23 18:48:02 +02:00
|
|
|
this.filteredRis = [];
|
2021-05-19 13:40:29 +02:00
|
|
|
communities.forEach(community => {
|
|
|
|
if (Session.isPortalAdministrator(this.user) || Session.isCommunityCurator(this.user) || Session.isManager('community', community.communityId, this.user)) {
|
|
|
|
if (community.type === 'community') {
|
|
|
|
this.communities.push(community);
|
2022-06-23 18:48:02 +02:00
|
|
|
this.filteredCommunities.push(community);
|
2021-05-19 13:40:29 +02:00
|
|
|
} else {
|
|
|
|
this.ris.push(community);
|
2022-06-23 18:48:02 +02:00
|
|
|
this.filteredRis.push(community);
|
2021-05-19 13:40:29 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
this.loading = false;
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
|
|
|
|
ngOnDestroy() {
|
|
|
|
this.subscriptions.forEach(subscription => {
|
|
|
|
if (subscription instanceof Subscription) {
|
|
|
|
subscription.unsubscribe();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
public get noResults(): boolean {
|
|
|
|
return (this.tab === "all" && this.communities.length === 0 && this.ris.length === 0) ||
|
|
|
|
(this.tab === "communities" && this.communities.length === 0) ||
|
|
|
|
(this.tab === "ris" && this.ris.length === 0);
|
|
|
|
}
|
|
|
|
|
2022-06-23 18:48:02 +02:00
|
|
|
public applyFilters() {
|
2021-11-30 11:51:48 +01:00
|
|
|
this.filteredCommunities = this.communities.filter(community => community.shortTitle.toLowerCase().includes(this.searchText) || community.title.toLowerCase().includes(this.searchText) || community.communityId.toLowerCase().includes(this.searchText));
|
2022-06-23 18:48:02 +02:00
|
|
|
this.filteredRis = this.ris.filter(community => community.shortTitle.toLowerCase().includes(this.searchText) || community.title.toLowerCase().includes(this.searchText) || community.communityId.toLowerCase().includes(this.searchText));
|
2021-11-29 17:02:01 +01:00
|
|
|
}
|
2022-06-23 18:48:02 +02:00
|
|
|
|
|
|
|
public onSearchClose() {
|
2021-11-29 17:02:01 +01:00
|
|
|
this.communitySearchUtils.keyword = this.filterForm.get('keyword').value;
|
|
|
|
}
|
2022-06-23 18:48:02 +02:00
|
|
|
|
2021-11-29 17:02:01 +01:00
|
|
|
public resetInput() {
|
|
|
|
this.communitySearchUtils.keyword = null;
|
|
|
|
this.searchInputComponent.reset()
|
2021-05-19 13:40:29 +02:00
|
|
|
}
|
|
|
|
}
|