Skip to content

Commit

Permalink
ufal/fe-item-view-license-box (DSpace#427)
Browse files Browse the repository at this point in the history
* Do not show licenses if the Item doesn't have any file.
  • Loading branch information
milanmajchrak committed Dec 19, 2023
1 parent ee0e746 commit bb8ed5f
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 25 deletions.
44 changes: 23 additions & 21 deletions src/app/item-page/simple/item-page.component.html
Expand Up @@ -10,29 +10,31 @@
<ds-view-tracker [object]="item"></ds-view-tracker>
<ds-listable-object-component-loader *ngIf="!item.isWithdrawn || (isAdmin$|async)" [object]="item" [viewMode]="viewMode"></ds-listable-object-component-loader>
<ds-item-versions class="mt-2" [item]="item" [displayActions]="false"></ds-item-versions>
<ds-clarin-license-info class="mt-3 d-block" [item]="item"></ds-clarin-license-info>
<h6><i class="fa fa-paperclip">&nbsp;</i>{{'item.page.files.head' | translate}}</h6>
<div class="pb-3">
<span class="pr-1">
<a class="btn btn-download" (click)="setCommandline()" style="text-decoration: none"
*ngIf="canShowCurlDownload">
<i class="fa fa-download fa-3x" style="display: block">&nbsp;</i>
{{'item.page.download.button.command.line' | translate}}
</a>
</span>
<div id="command-div" *ngIf="isCommandLineVisible">
<button class="repo-copy-btn pull-right" data-clipboard-target="#command-div"></button>
<pre style="background-color: #d9edf7; color: #3a87ad">{{ command }}</pre>
<div *ngIf="(hasFiles | async) === true">
<ds-clarin-license-info class="mt-3 d-block" [item]="item"></ds-clarin-license-info>
<h6><i class="fa fa-paperclip">&nbsp;</i>{{'item.page.files.head' | translate}}</h6>
<div class="pb-3">
<span class="pr-1">
<a class="btn btn-download" (click)="setCommandline()" style="text-decoration: none"
*ngIf="canShowCurlDownload">
<i class="fa fa-download fa-3x" style="display: block">&nbsp;</i>
{{'item.page.download.button.command.line' | translate}}
</a>
</span>
<div id="command-div" *ngIf="isCommandLineVisible">
<button class="repo-copy-btn pull-right" data-clipboard-target="#command-div"></button>
<pre style="background-color: #d9edf7; color: #3a87ad">{{ command }}</pre>
</div>
<span>
<a *ngIf="canDownloadAllFiles" class="btn btn-download" id="download-all-button" (click)="downloadFiles()"
style="visibility: visible">
<i style="display: block" class="fa fa-download fa-3x">&nbsp;</i>
{{'item.page.download.button.all.files.zip' | translate}} ({{ totalFileSizes }})
</a>
</span>
</div>
<span>
<a *ngIf="canDownloadAllFiles" class="btn btn-download" id="download-all-button" (click)="downloadFiles()"
style="visibility: visible">
<i style="display: block" class="fa fa-download fa-3x">&nbsp;</i>
{{'item.page.download.button.all.files.zip' | translate}} ({{ totalFileSizes }})
</a>
</span>
<ds-preview-section [item]="item"></ds-preview-section>
</div>
<ds-preview-section [item]="item"></ds-preview-section>
</div>
</div>
<ds-error *ngIf="itemRD?.hasFailed" message="{{'error.item' | translate}}"></ds-error>
Expand Down
20 changes: 19 additions & 1 deletion src/app/item-page/simple/item-page.component.spec.ts
Expand Up @@ -31,10 +31,16 @@ import { MetadataBitstreamDataService } from 'src/app/core/data/metadata-bitstre
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
import { ConfigurationProperty } from '../../core/shared/configuration-property.model';
import { HALEndpointService } from '../../core/shared/hal-endpoint.service';
import { MetadataValue } from '../../core/shared/metadata.models';

const mockItem: Item = Object.assign(new Item(), {
bundles: createSuccessfulRemoteDataObject$(createPaginatedList([])),
metadata: [],
metadata: {
'local.has.files': [Object.assign(new MetadataValue(), {
value: 'yes',
language: undefined
})]
},
relationships: createRelationshipsObservable()
});

Expand Down Expand Up @@ -207,4 +213,16 @@ describe('ItemPageComponent', () => {
});
});

describe('when the item has the file', () => {
it('should display license and files section', waitForAsync(async () => {
comp.itemRD$ = createSuccessfulRemoteDataObject$(mockItem);
fixture.detectChanges();

void fixture.whenStable().then(() => {
const objectLoader = fixture.debugElement.query(By.css('ds-clarin-license-info'));
expect(objectLoader.nativeElement).toBeDefined();
});
}));
});

});
25 changes: 22 additions & 3 deletions src/app/item-page/simple/item-page.component.ts
Expand Up @@ -18,7 +18,7 @@ import { AuthorizationDataService } from '../../core/data/feature-authorization/
import { redirectOn4xx } from '../../core/shared/authorized.operators';
import { RegistryService } from 'src/app/core/registry/registry.service';
import { MetadataBitstream } from 'src/app/core/metadata/metadata-bitstream.model';
import { Observable} from 'rxjs';
import { BehaviorSubject, Observable } from 'rxjs';
import { HALEndpointService } from '../../core/shared/hal-endpoint.service';

/**
Expand Down Expand Up @@ -103,6 +103,11 @@ export class ItemPageComponent implements OnInit {

canShowCurlDownload = false;

/**
* True if the item has files, false otherwise.
*/
hasFiles: BehaviorSubject<boolean> = new BehaviorSubject(false);

constructor(
protected route: ActivatedRoute,
private router: Router,
Expand All @@ -127,7 +132,7 @@ export class ItemPageComponent implements OnInit {
map((item) => getItemPageRoute(item))
);

this.showTombstone();
this.processItem();

this.registryService
.getMetadataBitstream(this.itemHandle, 'ORIGINAL,TEXT,THUMBNAIL')
Expand All @@ -139,6 +144,14 @@ export class ItemPageComponent implements OnInit {
});
}

/**
* Check if the item has files and assign the result into the `hasFiles` variable.
* */
private checkIfItemHasFiles(item: Item) {
const hasFilesMetadata = item.metadata?.['local.has.files']?.[0]?.value;
this.hasFiles.next(hasFilesMetadata !== 'no');
}

sumFileSizes() {
const sizeUnits = {
B: 1,
Expand Down Expand Up @@ -167,7 +180,10 @@ export class ItemPageComponent implements OnInit {
this.totalFileSizes = totalBytes.toFixed(2) + ' ' + finalUnit;
}

showTombstone() {
/**
* Process the tombstone of the Item and check if it has files or not.
*/
processItem() {
// if the item is withdrawn
let isWithdrawn = false;
// metadata value from `dc.relation.isreplacedby`
Expand All @@ -181,6 +197,9 @@ export class ItemPageComponent implements OnInit {
this.itemHandle = item.handle;
isWithdrawn = item.isWithdrawn;
isReplaced = item.metadata['dc.relation.isreplacedby']?.[0]?.value;

// check if the item has files
this.checkIfItemHasFiles(item);
});

// do not show tombstone for non withdrawn items
Expand Down

0 comments on commit bb8ed5f

Please sign in to comment.