Durchsuchbare Dokumentation aufrufen | Zurück zur Dokumentationsübersicht
Navigation: Dokumentationen agorum core > agorum.composite.form
Dieses Element bietet dieselben Steuerungselemente für Oberflächen wie metadataEdit, mit dem Unterschied, dass Sie das Speichern und Laden selbst implementieren und somit steuern können, was beim Speichern und Laden passiert. Dies ist etwa für Bearbeitungsoberflächen von Objekten geeignet, die nicht auf Metadaten basieren.
Damit können Sie etwa Oberflächen umsetzen, um Benutzer anzulegen oder andere Objekte zu steuern.
Das System zeigt eine Oberfläche mit den definierten Metadaten an. Abhängig davon, ob die Oberfläche im Bearbeitungs- oder Ansichtsmodus ist (über den Parameter readOnly einstellbar), steuern Sie in einer Toolbar die Zustände der Schaltflächen:
Zustand | Beschreibung |
---|---|
Bearbeiten | Aktiv, wenn die Oberfläche im Ansichtsmodus ist und der Benutzer Schreibrechte auf das Objekt besitzt. |
Speichern | Aktiv, wenn die Oberfläche im Bearbeitungsmodus ist. |
Abbrechen | Aktiv, wenn die Oberfläche im Bearbeitungsmodus ist. |
Ändert ein Benutzer Daten und klickt auf die Schaltfläche Abbrechen, so erhält der Benutzer einen Hinweis, dass sich Daten geändert haben. Er muss dann das Abbrechen nochmals bestätigen.
Dieses Beispiel zeigt das Grundgerüst für die eigene Bearbeitungsoberfläche. Für ein vollständiges Beispiel zur Bearbeitung / Erstellung eines Benutzers siehe Beispiel: Benutzer erstellen/ändern.
let aguila = require('common/aguila'); let form = aguila.create({ type: 'agorum.composite.form.edit', properties: [ 'id' ], width: 500, height: 500, toolbar: 'top', validation: [ { required: true } ], elements: [ { type: 'agorum.composite.form.element.text', name: 'userName', label: 'Name' } ] }); form.on('idChanged', () => { if (form.id !== null) { // load information and set to form.value ... // .... } // tell that the load is finished form.fire('loaded'); }); form.on('save', () => { // save event, save the data // .... // tell, that the save has finished form.fire('saved'); }); form;
Alle Parameter in metadataEdit gelten. Zusätzlich gelten die folgenden Parameter.
Der type ist immer agorum.composite.form.edit.
Setzt die Werte des jeweils definierten Elements form.
Definiert die Id als Property, sodass das System über das Event idChanged auf die Änderung der id hört und dort dann die Lade-Funktion implementiert.
Alle Events in metadataEdit gelten. Zusätzlich gelten die folgenden Events.
Löst aus, sobald Sie den Parameter id setzen. Das eigene Widget reagiert dann und lädt alle notwendigen Daten.
form.on('idChanged', () => { if (form.id !== null) { // load information and set to form.value ... // .... } // tell that the load is finished form.fire('loaded'); // zwingend notwendig });
Hinweis: Klickt ein Benutzer auf die Schaltfläche Bearbeiten, setzt das System die id kurzzeitig auf null und dann wieder auf den ursprünglichen Wert der id, damit die Daten beim Wechsel in den Bearbeitungsmodus neu laden. Das System ruft dabei das Event idChanged zweimal auf:
einmal mit id = null
einmal mit id = Wert
Wenn Sie bei id = null etwas verändern und einen fork verwenden, achten Sie auf diesen Umstand des zweimaligen Aufrufens, da sonst Seiteneffekte entstehen und 2 parallele Threads versuchen, die UI-Elemente zu verändern. Das Beispiel zu idChanged fragt daher explizit ab, ob id !== null ist.
Löst aus, sobald ein Benutzer auf der Oberfläche auf Speichern klickt und alle Daten valide sind. Hiermit implementieren Sie das eigene Speichern.
Beispiel
form.on('save', () => { // save event, save the data // .... // tell, that the save has finished form.fire('saved'); //zwingend notwendig });
Löst aus, sobald ein Benutzer auf der Oberfläche auf Abbrechen klickt.
Verwenden Sie dieses Event, um das umliegende Fenster zu schließen, wenn es sich um eine Neuanlage handelt.
Beispiel
form.on('canceled', () => { if (!form.id) { form.form.close(); } });
let aguila = require('common/aguila'); let objects = require('common/objects'); /** * sample for creating a custom edit form for a user, simplified, but functional, for demonstrating */ let form = aguila.create({ type: 'agorum.composite.form.edit', properties: [ 'id' ], width: 500, height: 500, toolbar: 'top', readOnly: true, validation: [ { required: true } ], elements: [ { type: 'agorum.composite.form.element.text', name: 'userName', label: 'Name' }, { type: 'agorum.composite.form.element.text', name: 'givenName', label: 'Vorname' }, { type: 'agorum.composite.form.element.text', name: 'familyName', label: 'Nachname' }, { type: 'agorum.composite.form.element.text', name: 'mail', label: 'E-Mail', validation: [ { regex: '/^.*@.*\\..*', errorText: 'E-Mail Adresse falsch' } ] }, { type: 'agorum.composite.form.element.text', name: 'password', label: 'Passwort', password: true } ] }); let userName = form.down('userName'); let password = form.down('password'); form.on('idChanged', () => { if (form.id !== null) { // load information aguila.fork(() => { let user = objects.find(form.id); let iup = user.infoUserProfile; return { userName: user.name, givenName: iup.givenName, familyName: iup.familyName, mail: user.emailAddresses ? user.emailAddresses.join(';') : '' }; }).then(data => { // set values to the form form.value = data; // tell, that load has finished form.fire('loaded'); }); } else { // tell, that load has finished form.fire('loaded'); } prepareForm(); }); function prepareForm() { if (form.id) { // id, so in update mode, password is optional password.validation = [ { required: false } ]; } else { // no id, so in create mode, password is require password.validation = [ { required: true } ]; form.readOnly = false; } } // Ab agorum core 9.2.3 form.on('canceled', () => { // close form, on abort, when no ID is given if (!form.id) { form.form.close(); } }); form.on('save', () => { aguila.fork(() => { if (form.id !== null) { // update let otherUser = objects.tryFind('user:' + form.value.userName); if (otherUser && otherUser.ID !== form.id) { throw new Error('Es existiert bereits ein anderer Benutzer mit demselben Namen'); } let data = { name: form.value.userName, password: form.value.password, admin: false, givenName: form.value.givenName, familyName: form.value.familyName, language: 'de', emailAddresses: form.value.mail.split(';').map(v => v.trim()) }; // filter out, values, that are not set, cause update of user, does not like empty values for (let k in data) { if (data[k] === null || data[k] === undefined) delete data[k]; } let user = objects.update('user', objects.find(form.id), data); return user.ID; } else { // create if (objects.tryFind('user:' + form.value.userName)) { throw new Error('user ist bereits vorhanden'); } let user = objects.create('user', { name: form.value.userName, password: form.value.password, path: '', admin: false, givenName: form.value.givenName, familyName: form.value.familyName, language: 'de', emailAddresses: form.value.mail.split(';').map(v => v.trim()) }); return user.ID; } }).then(id => { // set the id to the form (for newly created user) form.id = id; // tell, that the save has finished form.fire('saved'); }).catch(err => { // something went wrong, tell that the save has failed form.fire('failed', '' + err); // throw the error further for displaying throw err; }); }); setImmediate(() => { // test: load data of demo user, if a new user should be created, just comment out the next line. form.id = objects.find('user:demo').ID; prepareForm(); }); form;