mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00
64574: Update mantis item pages with new template
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { Component, HostBinding, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import { Item } from '../../../core/shared/item.model';
|
||||
import { ItemViewMode } from '../../../shared/items/item-type-decorator';
|
||||
import { Observable } from 'rxjs/internal/Observable';
|
||||
@@ -6,6 +6,9 @@ import { RemoteData } from '../../../core/data/remote-data';
|
||||
import { PaginatedList } from '../../../core/data/paginated-list';
|
||||
import { RelationshipService } from '../../../core/data/relationship.service';
|
||||
import { FindAllOptions } from '../../../core/data/request.models';
|
||||
import { getRemoteDataPayload, getSucceededRemoteData } from '../../../core/shared/operators';
|
||||
import { hasNoValue, hasValueOperator } from '../../../shared/empty.util';
|
||||
import { Subscription } from 'rxjs/internal/Subscription';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-related-items',
|
||||
@@ -16,7 +19,7 @@ import { FindAllOptions } from '../../../core/data/request.models';
|
||||
* This component is used for displaying relations between items
|
||||
* It expects a parent item and relationship type, as well as a label to display on top
|
||||
*/
|
||||
export class RelatedItemsComponent implements OnInit {
|
||||
export class RelatedItemsComponent implements OnInit, OnDestroy {
|
||||
/**
|
||||
* The parent of the list of related items to display
|
||||
*/
|
||||
@@ -39,6 +42,11 @@ export class RelatedItemsComponent implements OnInit {
|
||||
*/
|
||||
@Input() label: string;
|
||||
|
||||
/**
|
||||
* Completely hide the component until there's at least one item visible
|
||||
*/
|
||||
@HostBinding('class.d-none') hidden = true;
|
||||
|
||||
/**
|
||||
* The list of related items
|
||||
*/
|
||||
@@ -60,11 +68,19 @@ export class RelatedItemsComponent implements OnInit {
|
||||
*/
|
||||
showingAll = false;
|
||||
|
||||
/**
|
||||
* Subscription on items used to update the "hidden" property of this component
|
||||
*/
|
||||
itemSub: Subscription;
|
||||
|
||||
constructor(public relationshipService: RelationshipService) {
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.items$ = this.relationshipService.getRelatedItemsByLabel(this.parentItem, this.relationType, this.options);
|
||||
this.itemSub = this.items$.subscribe((itemsRD: RemoteData<PaginatedList<Item>>) => {
|
||||
this.hidden = !(itemsRD.hasSucceeded && itemsRD.payload && itemsRD.payload.page.length > 0);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,4 +98,13 @@ export class RelatedItemsComponent implements OnInit {
|
||||
this.items$ = this.relationshipService.getRelatedItemsByLabel(this.parentItem, this.relationType, this.options);
|
||||
this.showingAll = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsubscribe from the item subscription
|
||||
*/
|
||||
ngOnDestroy(): void {
|
||||
if (this.itemSub) {
|
||||
this.itemSub.unsubscribe();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -61,27 +61,24 @@
|
||||
<div class="relationships-item-page">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-4">
|
||||
<ds-related-items
|
||||
[parentItem]="item"
|
||||
[relationType]="'isProjectOfPublication'"
|
||||
[label]="'relationships.isProjectOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<div class="col-12 col-md-4">
|
||||
<ds-related-items
|
||||
[parentItem]="item"
|
||||
[relationType]="'isOrgUnitOfPublication'"
|
||||
[label]="'relationships.isOrgUnitOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<div class="col-12 col-md-4">
|
||||
<ds-related-items
|
||||
[parentItem]="item"
|
||||
[relationType]="'isJournalIssueOfPublication'"
|
||||
[label]="'relationships.isJournalIssueOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isProjectOfPublication'"
|
||||
[label]="'relationships.isProjectOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isOrgUnitOfPublication'"
|
||||
[label]="'relationships.isOrgUnitOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isJournalIssueOfPublication'"
|
||||
[label]="'relationships.isJournalIssueOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -26,25 +26,29 @@
|
||||
[label]="'journalissue.page.journal-title'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalissue.identifier.number']"
|
||||
[fields]="['publicationvolume.volumeNumber']"
|
||||
[label]="'journalvolume.page.volume'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['publicationissue.issueNumber']"
|
||||
[label]="'journalissue.page.number'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journal.identifier.issn']"
|
||||
[fields]="['creativeworkseries.issn']"
|
||||
[label]="'journalissue.page.journal-issn'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalissue.issuedate']"
|
||||
[fields]="['creativework.datePublished']"
|
||||
[label]="'journalissue.page.issuedate'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalissue.identifier.description']"
|
||||
[fields]="['dc.description']"
|
||||
[label]="'journalissue.page.description'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalissue.identifier.keyword']"
|
||||
[fields]="['creativework.keywords']"
|
||||
[label]="'journalissue.page.keyword'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
@@ -53,21 +57,21 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="relationships-item-page" *ngIf="(volumes$ | async) || (publications$ | async)">
|
||||
<div class="relationships-item-page">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-4" *ngIf="volumes$ | async">
|
||||
<ds-related-items
|
||||
[items]="volumes$ | async"
|
||||
[label]="'relationships.isSingleVolumeOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<div class="col-12 col-md-4" *ngIf="publications$ | async">
|
||||
<ds-related-items
|
||||
[items]="publications$ | async"
|
||||
[label]="'relationships.isPublicationOfJournalIssue' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isJournalVolumeOfIssue'"
|
||||
[label]="'relationships.isSingleVolumeOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-related-items
|
||||
class="mb-1 mt-1 col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isPublicationOfJournalIssue'"
|
||||
[label]="'relationships.isPublicationOfJournalIssue' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -23,17 +23,17 @@
|
||||
<div class="col-12 col-md-6">
|
||||
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalvolume.identifier.volume']"
|
||||
[fields]="['publicationvolume.volumeNumber']"
|
||||
[label]="'journalvolume.page.volume'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalvolume.issuedate']"
|
||||
[fields]="['creativework.datePublished']"
|
||||
[label]="'journalvolume.page.issuedate'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalvolume.identifier.description']"
|
||||
[fields]="['dc.description']"
|
||||
[label]="'journalvolume.page.description'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
@@ -42,21 +42,21 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="relationships-item-page" *ngIf="(journals$ | async) || (issues$ | async)">
|
||||
<div class="relationships-item-page">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-4" *ngIf="journals$ | async">
|
||||
<ds-related-items
|
||||
[items]="journals$ | async"
|
||||
[label]="'relationships.isSingleJournalOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<div class="col-12 col-md-4" *ngIf="issues$ | async">
|
||||
<ds-related-items
|
||||
[items]="issues$ | async"
|
||||
[label]="'relationships.isIssueOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isJournalOfVolume'"
|
||||
[label]="'relationships.isSingleJournalOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isIssueOfJournalVolume'"
|
||||
[label]="'relationships.isIssueOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -22,21 +22,21 @@
|
||||
<div class="col-12 col-md-6">
|
||||
|
||||
<ds-generic-item-page-field class="item-page-fields" [item]="item"
|
||||
[fields]="['journal.identifier.issn']"
|
||||
[fields]="['creativeworkseries.issn']"
|
||||
[label]="'journal.page.issn'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field class="item-page-fields" [item]="item"
|
||||
[fields]="['journal.publisher']"
|
||||
[fields]="['creativework.publisher']"
|
||||
[label]="'journal.page.publisher'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journal.contributor.editor']"
|
||||
[fields]="['creativework.editor']"
|
||||
[label]="'journal.page.editor'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<ds-generic-item-page-field class="item-page-fields" [item]="item"
|
||||
[fields]="['journal.identifier.description']"
|
||||
[fields]="['dc.description']"
|
||||
[label]="'journal.page.description'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
@@ -45,15 +45,15 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="relationships-item-page" *ngIf="volumes$ | async">
|
||||
<div class="relationships-item-page">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-4" *ngIf="volumes$ | async">
|
||||
<ds-related-items
|
||||
[items]="volumes$ | async"
|
||||
[label]="'relationships.isVolumeOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isVolumeOfJournal'"
|
||||
[label]="'relationships.isVolumeOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -23,25 +23,25 @@
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-6">
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['orgunit.identifier.city']"
|
||||
[fields]="['organization.address.addressLocality']"
|
||||
[label]="'orgunit.page.city'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['orgunit.identifier.country']"
|
||||
[fields]="['organization.adress.addressCountry']"
|
||||
[label]="'orgunit.page.country'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['orgunit.identifier.id']"
|
||||
[fields]="['dc.identifier']"
|
||||
[label]="'orgunit.page.id'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['orgunit.identifier.dateestablished']"
|
||||
[fields]="['organization.foundingDate']"
|
||||
[label]="'orgunit.page.dateestablished'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['orgunit.identifier.description']"
|
||||
[fields]="['dc.description']"
|
||||
[label]="'orgunit.page.description'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
@@ -50,27 +50,27 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="relationships-item-page" *ngIf="(people$ | async) || (projects$ | async) || (publications$ | async)">
|
||||
<div class="relationships-item-page">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-4" *ngIf="people$ | async">
|
||||
<ds-related-items
|
||||
[items]="people$ | async"
|
||||
[label]="'relationships.isPersonOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<div class="col-12 col-md-4" *ngIf="projects$ | async">
|
||||
<ds-related-items
|
||||
[items]="projects$ | async"
|
||||
[label]="'relationships.isProjectOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<div class="col-12 col-md-4" *ngIf="publications$ | async">
|
||||
<ds-related-items
|
||||
[items]="publications$ | async"
|
||||
[label]="'relationships.isPublicationOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isPersonOfOrgUnit'"
|
||||
[label]="'relationships.isPersonOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isProjectOfOrgUnit'"
|
||||
[label]="'relationships.isProjectOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isPublicationOfOrgUnit'"
|
||||
[label]="'relationships.isPublicationOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -17,38 +17,30 @@
|
||||
<div class="col-12 col-md-10">
|
||||
<h2 class="item-page-title-field">
|
||||
{{'person.page.titleprefix' | translate}}<ds-metadata-values
|
||||
[mdValues]="item?.allMetadata(['dc.contributor.author'])"></ds-metadata-values>
|
||||
[mdValues]="[item?.firstMetadata('person.familyName'), item?.firstMetadata('person.givenName')]" [separator]="', '"></ds-metadata-values>
|
||||
</h2>
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-6">
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.email']"
|
||||
[fields]="['person.email']"
|
||||
[label]="'person.page.email'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.orcid']"
|
||||
[label]="'person.page.orcid'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.birthdate']"
|
||||
[fields]="['person.birthDate']"
|
||||
[label]="'person.page.birthdate'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.staffid']"
|
||||
[label]="'person.page.staffid'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.jobtitle']"
|
||||
[fields]="['person.jobTitle']"
|
||||
[label]="'person.page.jobtitle'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.lastname']"
|
||||
[fields]="['person.familyName']"
|
||||
[label]="'person.page.lastname'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.firstname']"
|
||||
[fields]="['person.givenName']"
|
||||
[label]="'person.page.firstname'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
@@ -57,21 +49,21 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="relationships-item-page" *ngIf="(projects$ | async) || (orgUnits$ | async)">
|
||||
<div class="relationships-item-page">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-4" *ngIf="projects$ | async">
|
||||
<ds-related-items
|
||||
[items]="projects$ | async"
|
||||
[label]="'relationships.isProjectOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<div class="col-12 col-md-4" *ngIf="orgUnits$ | async">
|
||||
<ds-related-items
|
||||
[items]="orgUnits$ | async"
|
||||
[label]="'relationships.isOrgUnitOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isProjectOfPerson'"
|
||||
[label]="'relationships.isProjectOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isOrgUnitOfPerson'"
|
||||
[label]="'relationships.isOrgUnitOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -22,9 +22,10 @@
|
||||
</h2>
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-6">
|
||||
<ds-metadata-representation-list
|
||||
[label]="'project.page.contributor' | translate"
|
||||
[representations]="contributors$ | async">
|
||||
<ds-metadata-representation-list [parentItem]="item"
|
||||
[itemType]="'OrgUnit'"
|
||||
[metadataField]="'project.contributor.other'"
|
||||
[label]="'project.page.contributor' | translate">
|
||||
</ds-metadata-representation-list>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['project.identifier.funder']"
|
||||
@@ -41,15 +42,15 @@
|
||||
</div>
|
||||
<div class="col-12 col-md-6">
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['project.identifier.id']"
|
||||
[fields]="['dc.identifier']"
|
||||
[label]="'project.page.id'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['project.identifier.description']"
|
||||
[fields]="['dc.description']"
|
||||
[label]="'project.page.description'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['project.identifier.keyword']"
|
||||
[fields]="['dc.subject']"
|
||||
[label]="'project.page.keyword'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
@@ -58,27 +59,27 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="relationships-item-page" *ngIf="(people$ | async) || (publications$ | async) || (orgUnits$ | async)">
|
||||
<div class="relationships-item-page">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-4" *ngIf="people$ | async">
|
||||
<ds-related-items
|
||||
[items]="people$ | async"
|
||||
[label]="'relationships.isPersonOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<div class="col-12 col-md-4" *ngIf="publications$ | async">
|
||||
<ds-related-items
|
||||
[items]="publications$ | async"
|
||||
[label]="'relationships.isPublicationOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<div class="col-12 col-md-4" *ngIf="orgUnits$ | async">
|
||||
<ds-related-items
|
||||
[items]="orgUnits$ | async"
|
||||
[label]="'relationships.isOrgUnitOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isPersonOfProject'"
|
||||
[label]="'relationships.isPersonOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isPublicationOfProject'"
|
||||
[label]="'relationships.isPublicationOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-related-items
|
||||
class="col-12 col-md-4"
|
||||
[parentItem]="item"
|
||||
[relationType]="'isOrgUnitOfProject'"
|
||||
[label]="'relationships.isOrgUnitOf' | translate">
|
||||
</ds-related-items>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
Reference in New Issue
Block a user