// IDL class hint (e.g. "aou")
@Input() idlClass: string;
- recId: any;
-
- // IDL record we are editing
- record: IdlObject;
-
// Permissions extracted from the permacrud defs in the IDL
// for the current IDL class
modePerms: {[mode: string]: string};
// Record ID to view/update. Value is dynamic. Records are not
// fetched until .open() is called.
+ _recordId: any;
@Input() set recordId(id: any) {
- if (id) { this.recId = id; }
+ if (id) {
+ if (id !== this._recordId) {
+ this._recordId = id;
+ this.handleRecordChange();
+ }
+ } else {
+ this._recordId = null;
+ this.record = null;
+ }
}
+ // IDL record we are editing
+ _record: IdlObject;
+
+ @Input() set record(r: IdlObject) {
+ if (r) {
+ if (!this.idl.pkeyMatches(this.record, r)) {
+ this._record = r;
+ this.handleRecordChange();
+ }
+ } else {
+ this.recordId = null;
+ this._record = null;
+ }
+ }
+
+ get record(): IdlObject {
+ return this._record;
+ }
+
+ initDone: boolean;
+
// Comma-separated list of field names defining the order in which
// fields should be rendered in the form. Any fields not represented
// will be rendered alphabetically by label after the named fields.
} else {
this.initRecord();
}
+ this.initDone = true;
+ }
+
+ // If the record ID changes after ngOnInit has been called
+ // and we're using displayMode=inline, force the data to
+ // resync in real time
+ handleRecordChange() {
+ if (this.initDone && !this.isDialog()) {
+ this.initRecord();
+ }
}
isDialog(): boolean {
return this.displayMode === 'dialog';
}
- // Set the record value and clear the recId value to
- // indicate the record is our current source of data.
+ // DEPRECATED: This is a duplicate of set record(...)
setRecord(record: IdlObject) {
- this.record = record;
- this.recId = null;
- if (!this.isDialog()) {
- // in inline mode, update the display immediately to reflect
- // the change in source record.
- this.initRecord();
- }
+ console.warn('fm-editor:setRecord() is deprecated. ' +
+ 'Use editor.record = abc or [record]="abc" instead');
+ this.record = record; // this calls the setter
}
// Translate comma-separated string versions of various inputs
if (this.mode === 'update' || this.mode === 'view') {
let promise;
- if (this.record && this.recId === null) {
+ if (this.record && this.recordId === null) {
promise = Promise.resolve(this.record);
} else {
promise =
- this.pcrud.retrieve(this.idlClass, this.recId).toPromise();
+ this.pcrud.retrieve(this.idlClass, this.recordId).toPromise();
}
return promise.then(rec => {
if (!rec) {
return Promise.reject(`No '${this.idlClass}'
- record found with id ${this.recId}`);
+ record found with id ${this.recordId}`);
}
this.record = rec;
// Create a new record from the stub record provided by the
// caller or a new from-scratch record
this.record = this.record || this.idl.create(this.idlClass);
- this.recId = null; // avoid future confusion
+ this.recordId = null; // avoid future confusion
return this.getFieldList();
}
showEditDialog(idlThing: IdlObject): Promise<any> {
this.editDialog.mode = 'update';
- this.editDialog.recId = idlThing[this.pkeyField]();
+ this.editDialog.recordId = idlThing[this.pkeyField]();
return new Promise((resolve, reject) => {
this.editDialog.open({size: this.dialogSize}).subscribe(
result => {
this.editDialog.mode = 'create';
// We reuse the same editor for all actions. Be sure
// create action does not try to modify an existing record.
- this.editDialog.recId = null;
+ this.editDialog.recordId = null;
this.editDialog.record = null;
this.editDialog.open({size: this.dialogSize}).subscribe(
ok => {