Skip to content

Commit c4de31e

Browse files
97742: Removing old item-metadata component & adding support for itemtemplate dso-edit-metadata
1 parent 533d833 commit c4de31e

16 files changed

Lines changed: 114 additions & 1329 deletions

src/app/collection-page/collection-page.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { StatisticsModule } from '../statistics/statistics.module';
1515
import { CollectionFormModule } from './collection-form/collection-form.module';
1616
import { ThemedCollectionPageComponent } from './themed-collection-page.component';
1717
import { ComcolModule } from '../shared/comcol/comcol.module';
18+
import { DsoSharedModule } from '../dso-shared/dso-shared.module';
1819

1920
@NgModule({
2021
imports: [
@@ -24,7 +25,8 @@ import { ComcolModule } from '../shared/comcol/comcol.module';
2425
StatisticsModule.forRoot(),
2526
EditItemPageModule,
2627
CollectionFormModule,
27-
ComcolModule
28+
ComcolModule,
29+
DsoSharedModule,
2830
],
2931
declarations: [
3032
CollectionPageComponent,

src/app/collection-page/edit-item-template-page/edit-item-template-page.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<div class="col-12" *ngVar="(itemRD$ | async) as itemRD">
44
<ng-container *ngIf="itemRD?.hasSucceeded">
55
<h2 class="border-bottom">{{ 'collection.edit.template.head' | translate:{ collection: collection?.name } }}</h2>
6-
<ds-item-metadata [updateService]="itemTemplateService" [item]="itemRD?.payload"></ds-item-metadata>
6+
<ds-dso-edit-metadata [updateDataService]="itemTemplateService" [dso]="itemRD?.payload"></ds-dso-edit-metadata>
77
<button [routerLink]="getCollectionEditUrl(collection)" class="btn btn-outline-secondary">{{ 'collection.edit.template.cancel' | translate }}</button>
88
</ng-container>
99
<ds-loading *ngIf="itemRD?.isLoading" [message]="'collection.edit.template.loading' | translate"></ds-loading>

src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
</ds-dso-edit-metadata-field-values>
5959
</div>
6060

61-
<div *ngIf="isEmpty">
61+
<div *ngIf="isEmpty && !form.newValue">
6262
<ds-alert [content]="dsoType + '.edit.metadata.empty'" [type]="AlertTypeEnum.Info"></ds-alert>
6363
</div>
6464
<div class="button-row bottom d-inline-block w-100">

src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export class DsoEditMetadataComponent implements OnInit, OnDestroy {
4545
* Resolved update data-service for the given DSpaceObject (depending on its type, e.g. ItemDataService for an Item)
4646
* Used to send the PATCH request
4747
*/
48-
updateDataService: UpdateDataService<DSpaceObject>;
48+
@Input() updateDataService: UpdateDataService<DSpaceObject>;
4949

5050
/**
5151
* Type of the DSpaceObject in String
@@ -143,11 +143,13 @@ export class DsoEditMetadataComponent implements OnInit, OnDestroy {
143143
} else {
144144
type = this.dso.type;
145145
}
146-
const provider = getDataServiceFor(type);
147-
this.updateDataService = Injector.create({
148-
providers: [],
149-
parent: this.parentInjector
150-
}).get(provider);
146+
if (hasNoValue(this.updateDataService)) {
147+
const provider = getDataServiceFor(type);
148+
this.updateDataService = Injector.create({
149+
providers: [],
150+
parent: this.parentInjector
151+
}).get(provider);
152+
}
151153
this.dsoType = type.value;
152154
}
153155

src/app/dso-shared/dso-edit-metadata/metadata-field-selector/metadata-field-selector.component.spec.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,18 @@ import { NO_ERRORS_SCHEMA } from '@angular/core';
77
import { RegistryService } from '../../../core/registry/registry.service';
88
import { MetadataField } from '../../../core/metadata/metadata-field.model';
99
import { MetadataSchema } from '../../../core/metadata/metadata-schema.model';
10-
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
10+
import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
1111
import { createPaginatedList } from '../../../shared/testing/utils.test';
1212
import { followLink } from '../../../shared/utils/follow-link-config.model';
1313
import { By } from '@angular/platform-browser';
14+
import { NotificationsService } from '../../../shared/notifications/notifications.service';
1415

1516
describe('MetadataFieldSelectorComponent', () => {
1617
let component: MetadataFieldSelectorComponent;
1718
let fixture: ComponentFixture<MetadataFieldSelectorComponent>;
1819

1920
let registryService: RegistryService;
21+
let notificationsService: NotificationsService;
2022

2123
let metadataSchema: MetadataSchema;
2224
let metadataFields: MetadataField[];
@@ -45,12 +47,14 @@ describe('MetadataFieldSelectorComponent', () => {
4547
registryService = jasmine.createSpyObj('registryService', {
4648
queryMetadataFields: createSuccessfulRemoteDataObject$(createPaginatedList(metadataFields)),
4749
});
50+
notificationsService = jasmine.createSpyObj('notificationsService', ['error', 'success']);
4851

4952
TestBed.configureTestingModule({
5053
declarations: [MetadataFieldSelectorComponent, VarDirective],
5154
imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([])],
5255
providers: [
5356
{ provide: RegistryService, useValue: registryService },
57+
{ provide: NotificationsService, useValue: notificationsService },
5458
],
5559
schemas: [NO_ERRORS_SCHEMA]
5660
}).compileComponents();
@@ -99,5 +103,20 @@ describe('MetadataFieldSelectorComponent', () => {
99103
done();
100104
});
101105
});
106+
107+
describe('when querying the metadata fields returns an error response', () => {
108+
beforeEach(() => {
109+
(registryService.queryMetadataFields as jasmine.Spy).and.returnValue(createFailedRemoteDataObject$('Failed'));
110+
});
111+
112+
it('should return an observable false and show a notification', (done) => {
113+
component.mdField = 'dc.description.abstract';
114+
component.validate().subscribe((result) => {
115+
expect(result).toBeFalse();
116+
expect(notificationsService.error).toHaveBeenCalled();
117+
done();
118+
});
119+
});
120+
});
102121
});
103122
});

src/app/dso-shared/dso-edit-metadata/metadata-field-selector/metadata-field-selector.component.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
import { switchMap, debounceTime, distinctUntilChanged, map, tap, take } from 'rxjs/operators';
1313
import { followLink } from '../../../shared/utils/follow-link-config.model';
1414
import {
15-
getAllSucceededRemoteData, getFirstSucceededRemoteData,
15+
getAllSucceededRemoteData, getFirstCompletedRemoteData, getFirstSucceededRemoteData,
1616
metadataFieldsToString
1717
} from '../../../core/shared/operators';
1818
import { Observable } from 'rxjs/internal/Observable';
@@ -21,6 +21,9 @@ import { FormControl } from '@angular/forms';
2121
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
2222
import { hasValue } from '../../../shared/empty.util';
2323
import { Subscription } from 'rxjs/internal/Subscription';
24+
import { of } from 'rxjs/internal/observable/of';
25+
import { NotificationsService } from '../../../shared/notifications/notifications.service';
26+
import { TranslateService } from '@ngx-translate/core';
2427

2528
@Component({
2629
selector: 'ds-metadata-field-selector',
@@ -97,7 +100,9 @@ export class MetadataFieldSelectorComponent implements OnInit, OnDestroy, AfterV
97100
*/
98101
subs: Subscription[] = [];
99102

100-
constructor(protected registryService: RegistryService) {
103+
constructor(protected registryService: RegistryService,
104+
protected notificationsService: NotificationsService,
105+
protected translate: TranslateService) {
101106
}
102107

103108
/**
@@ -148,11 +153,20 @@ export class MetadataFieldSelectorComponent implements OnInit, OnDestroy, AfterV
148153
*/
149154
validate(): Observable<boolean> {
150155
return this.registryService.queryMetadataFields(this.mdField, null, true, false, followLink('schema')).pipe(
151-
getFirstSucceededRemoteData(),
152-
metadataFieldsToString(),
153-
take(1),
154-
map((fields: string[]) => fields.indexOf(this.mdField) > -1),
155-
tap((exists: boolean) => this.showInvalid = !exists),
156+
getFirstCompletedRemoteData(),
157+
switchMap((rd) => {
158+
if (rd.hasSucceeded) {
159+
return of(rd).pipe(
160+
metadataFieldsToString(),
161+
take(1),
162+
map((fields: string[]) => fields.indexOf(this.mdField) > -1),
163+
tap((exists: boolean) => this.showInvalid = !exists),
164+
);
165+
} else {
166+
this.notificationsService.error(this.translate.instant(`${this.dsoType}.edit.metadata.metadatafield.error`), rd.errorMessage);
167+
return [false];
168+
}
169+
}),
156170
);
157171
}
158172

src/app/item-page/edit-item-page/edit-item-page.module.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import { AbstractSimpleItemActionComponent } from './simple-item-action/abstract
1414
import { ItemPrivateComponent } from './item-private/item-private.component';
1515
import { ItemPublicComponent } from './item-public/item-public.component';
1616
import { ItemDeleteComponent } from './item-delete/item-delete.component';
17-
import { ItemMetadataComponent } from './item-metadata/item-metadata.component';
18-
import { EditInPlaceFieldComponent } from './item-metadata/edit-in-place-field/edit-in-place-field.component';
1917
import { ItemBitstreamsComponent } from './item-bitstreams/item-bitstreams.component';
2018
import { ItemEditBitstreamComponent } from './item-bitstreams/item-edit-bitstream/item-edit-bitstream.component';
2119
import { SearchPageModule } from '../../search-page/search-page.module';
@@ -63,15 +61,12 @@ import { DsoSharedModule } from '../../dso-shared/dso-shared.module';
6361
ItemPublicComponent,
6462
ItemDeleteComponent,
6563
ItemStatusComponent,
66-
ItemMetadataComponent,
6764
ItemRelationshipsComponent,
6865
ItemBitstreamsComponent,
6966
ItemVersionHistoryComponent,
70-
EditInPlaceFieldComponent,
7167
ItemEditBitstreamComponent,
7268
ItemEditBitstreamBundleComponent,
7369
PaginatedDragAndDropBitstreamListComponent,
74-
EditInPlaceFieldComponent,
7570
EditRelationshipComponent,
7671
EditRelationshipListComponent,
7772
ItemCollectionMapperComponent,
@@ -84,9 +79,6 @@ import { DsoSharedModule } from '../../dso-shared/dso-shared.module';
8479
BundleDataService,
8580
ObjectValuesPipe
8681
],
87-
exports: [
88-
ItemMetadataComponent
89-
]
9082
})
9183
export class EditItemPageModule {
9284

src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html

Lines changed: 0 additions & 71 deletions
This file was deleted.

src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.scss

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)