diff --git a/resources/i18n/en.json b/resources/i18n/en.json
index 2174e0c2bf..7838bfdd25 100644
--- a/resources/i18n/en.json
+++ b/resources/i18n/en.json
@@ -175,7 +175,7 @@
},
"view": {
"head": "View Item",
- "title": "Item Edit - Item"
+ "title": "Item Edit - View"
},
"curate": {
"head": "Curate",
diff --git a/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html b/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html
index e20b2a5c84..05eb03dd12 100644
--- a/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html
+++ b/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html
@@ -7,19 +7,20 @@
{{"item.edit.metadata.metadatafield.invalid" | translate}}
+ *ngIf="(valid | async) === false">{{"item.edit.metadata.metadatafield.invalid" | translate}}
diff --git a/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts b/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts
index 7d4922de43..47bcc66537 100644
--- a/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts
+++ b/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts
@@ -11,7 +11,7 @@ import { FieldChangeType } from '../../../../core/data/object-updates/object-upd
import { FieldUpdate } from '../../../../core/data/object-updates/object-updates.reducer';
import { ObjectUpdatesService } from '../../../../core/data/object-updates/object-updates.service';
import { getSucceededRemoteData } from '../../../../core/shared/operators';
-import { FormControl } from '@angular/forms';
+import { NgModel } from '@angular/forms';
@Component({
// tslint:disable-next-line:component-selector
@@ -27,14 +27,22 @@ export class EditInPlaceFieldComponent implements OnInit, OnChanges {
* The current field, value and state of the metadatum
*/
@Input() fieldUpdate: FieldUpdate;
+
/**
* The current url of this page
*/
@Input() url: string;
+
+ /**
+ * List of strings with all metadata field keys available
+ */
+ @Input() metadataFields: string[];
+
/**
* The metadatum of this field
*/
metadata: Metadatum;
+
/**
* Emits whether or not this field is currently editable
*/
@@ -50,11 +58,6 @@ export class EditInPlaceFieldComponent implements OnInit, OnChanges {
*/
metadataFieldSuggestions: BehaviorSubject = new BehaviorSubject([]);
- /**
- * List of strings with all metadata field keys available
- */
- metadataFields: Observable;
-
constructor(
private metadataFieldService: RegistryService,
private objectUpdatesService: ObjectUpdatesService,
@@ -67,26 +70,26 @@ export class EditInPlaceFieldComponent implements OnInit, OnChanges {
ngOnInit(): void {
this.editable = this.objectUpdatesService.isEditable(this.url, this.metadata.uuid);
this.valid = this.objectUpdatesService.isValid(this.url, this.metadata.uuid);
- this.metadataFields = this.findMetadataFields()
}
/**
* Sends a new change update for this field to the object updates service
*/
- update(control?: FormControl) {
+ update(ngModel?: NgModel) {
this.objectUpdatesService.saveChangeFieldUpdate(this.url, this.metadata);
- if (hasValue(control)) {
- this.checkValidity(control);
+ if (hasValue(ngModel)) {
+ this.checkValidity(ngModel);
}
}
/**
* Method to check the validity of a form control
- * @param control The form control to check
+ * @param ngModel
*/
- private checkValidity(control: FormControl) {
- control.updateValueAndValidity();
- this.objectUpdatesService.setValidFieldUpdate(this.url, this.metadata.uuid, control.valid);
+ private checkValidity(ngModel: NgModel) {
+ ngModel.control.setValue(ngModel.viewModel);
+ ngModel.control.updateValueAndValidity();
+ this.objectUpdatesService.setValidFieldUpdate(this.url, this.metadata.uuid, ngModel.control.valid);
}
/**
@@ -124,30 +127,24 @@ export class EditInPlaceFieldComponent implements OnInit, OnChanges {
* @param query The query to look for
*/
findMetadataFieldSuggestions(query: string): void {
- this.metadataFieldService.queryMetadataFields(query).pipe(
- // getSucceededRemoteData(),
- take(1),
- map((data) => data.payload.page)
- ).subscribe(
- (fields: MetadataField[]) => this.metadataFieldSuggestions.next(
- fields.map((field: MetadataField) => {
- return {
- displayValue: field.toString().split('.').join('.'),
- value: field.toString()
- }
- })
- )
- );
- }
-
- /**
- * Method to request all metadata fields and convert them to a list of strings
- */
- findMetadataFields(): Observable {
- return this.metadataFieldService.getAllMetadataFields().pipe(
- getSucceededRemoteData(),
- take(1),
- map((remoteData$) => remoteData$.payload.page.map((field: MetadataField) => field.toString())));
+ if (isNotEmpty(query)) {
+ this.metadataFieldService.queryMetadataFields(query).pipe(
+ // getSucceededRemoteData(),
+ take(1),
+ map((data) => data.payload.page)
+ ).subscribe(
+ (fields: MetadataField[]) => this.metadataFieldSuggestions.next(
+ fields.map((field: MetadataField) => {
+ return {
+ displayValue: field.toString().split('.').join('.'),
+ value: field.toString()
+ };
+ })
+ )
+ );
+ } else {
+ this.metadataFieldSuggestions.next([]);
+ }
}
/**
diff --git a/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.html b/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.html
index 03b0e143b4..496429a3ba 100644
--- a/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.html
+++ b/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.html
@@ -33,6 +33,7 @@
;
+
constructor(
private itemService: ItemDataService,
private objectUpdatesService: ObjectUpdatesService,
@@ -54,7 +61,8 @@ export class ItemMetadataComponent implements OnInit {
private notificationsService: NotificationsService,
private translateService: TranslateService,
@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
- private route: ActivatedRoute
+ private route: ActivatedRoute,
+ private metadataFieldService: RegistryService,
) {
}
@@ -63,6 +71,7 @@ export class ItemMetadataComponent implements OnInit {
* Set up and initialize all fields
*/
ngOnInit(): void {
+ this.metadataFields$ = this.findMetadataFields()
this.route.parent.data.pipe(map((data) => data.item))
.pipe(
first(),
@@ -208,4 +217,14 @@ export class ItemMetadataComponent implements OnInit {
return this.translateService.instant(this.notitifactionPrefix + key + '.content');
}
+
+ /**
+ * Method to request all metadata fields and convert them to a list of strings
+ */
+ findMetadataFields(): Observable {
+ return this.metadataFieldService.getAllMetadataFields().pipe(
+ getSucceededRemoteData(),
+ take(1),
+ map((remoteData$) => remoteData$.payload.page.map((field: MetadataField) => field.toString())));
+ }
}
diff --git a/src/app/core/data/object-updates/object-updates.reducer.ts b/src/app/core/data/object-updates/object-updates.reducer.ts
index bb870dcc41..c0f10ff92a 100644
--- a/src/app/core/data/object-updates/object-updates.reducer.ts
+++ b/src/app/core/data/object-updates/object-updates.reducer.ts
@@ -78,7 +78,7 @@ const initialFieldState = { editable: false, isNew: false, isValid: true };
/**
* Initial state for a newly added field
*/
-const initialNewFieldState = { editable: true, isNew: true, isValid: true };
+const initialNewFieldState = { editable: true, isNew: true, isValid: undefined };
// Object.create(null) ensures the object has no default js properties (e.g. `__proto__`)
const initialState = Object.create(null);
diff --git a/src/app/shared/input-suggestions/input-suggestions.component.html b/src/app/shared/input-suggestions/input-suggestions.component.html
index 1bd3cde22e..49e4c0a1d5 100644
--- a/src/app/shared/input-suggestions/input-suggestions.component.html
+++ b/src/app/shared/input-suggestions/input-suggestions.component.html
@@ -2,13 +2,12 @@
[action]="action" (keydown)="onKeydown($event)"
(keydown.arrowdown)="shiftFocusDown($event)"
(keydown.arrowup)="shiftFocusUp($event)" (keydown.esc)="close()"
- (dsClickOutside)="close()">
+ (dsClickOutside)="close();">
|