-
Notifications
You must be signed in to change notification settings - Fork 11
Code structure of EditMOM3
Im Editor-Widget (XRX/src/mom/app/collection/widget/my-collection-charter-edit.widget.xml) sind eine XRX-Instanz (Datenlieferant) und ein Binding zwischen HTML-div und XPath aus der XRX-Instanz definiert:
Eine XRX-instance,
<xrx:instances>
<xrx:instance id="icharter">{ $entry-as-string }</xrx:instance>
</xrx:instances>
deren Eigenschaften und Methoden in XRX/res/xml/src/model/instance.js
(class) beschrieben werden.
Die XRX-Instance ist der Datenlieferant für die angebundenen Controlls. Diese beinhaltet das XML-Objekt (<cei:text>
) einer Urkunde in Textform. Alle Änderungen, die während der Laufzeit des Editors vorgenommen werden, werden demnach nicht direkt in die korrespondierende XML-Datei in der Datenbank geschrieben. Sondern es erfolgt eine Änderung innerhalb der Variable $entry-as-string
. Erst während der Speicherung werden die Änderungen serialisiert und in die XML-Datei zurück geschrieben.
XRX-bind (data-binding),
<xrx:binds>
<!-- abstract -->
<xrx:bind id="bidno" nodeset="/descendant::cei:body/child::cei:idno"/>
</xrx:binds>
<xrx:view>
<xrx:layout>
<xrx:center>
<div data-demoid="26331a1b-46ff-40f0-b0d0-5208019bc30a">
<xrx:visualxml attributes="no" bind="bidno" elements="no"/>
</div>
</xrx:center>
</xrx:layout>
</xrx:view>
dessen Eigenschaften und Methoden werden in XRX/res/xml/src/model/bind.js
(class) beschrieben.
Über <XRX:bind>
werden Referenzen zu den Daten in der <XRX:instance>
geschaffen. Über eine Zuordnung der Controls zu den Bindings erhalten die Controls schließlich den Zugriff auf die Daten und sind darüber in der Lage, Änderungen an die korrekten CEI-Felder zu übertragen.
Mit XRX/res/xml/src/model/controller.js
werden xml-Daten synchronisiert.
CODEMIRROR-Bibliothek und JQuery UI-Features werden in das Widget eingebunden:
<xrx:resource>tag:www.monasterium.net,2011:/xrx/resource/js/codemirror/lib/codemirror</xrx:resource>
<xrx:resource>tag:www.monasterium.net,2011:/xrx/resource/jquery/ui/draggable</xrx:resource>
Durch das JQUERY UI Widget aus XRX/jquery.ui.visualxml.js
wird codemirror initialsiert.
_create: function() {
var self = this, textarea = self.element[0];
if(self.options.repeatflag) {
var ref = $(textarea).attr('data-xrx-ref');
var index = $(textarea).attr('data-xrx-index');
$(textarea).val(self._transformXml(self.options.xml));
self._codemirrorInstance(textarea);
$(self.codemirror.getInputField()).attr('data-xrx-ref', ref);
$(self.codemirror.getInputField()).attr('data-xrx-index', index);
…
}
Durch Service my-collection-charter-new.service.xml
wird eine neue Urkunde in der Datenbank in db/mom-data/xrx:user/[userl]/metadata.charter/[ID-Collection]/[ID-Urkunde]
angelegt.
<xrx:variable>
<xrx:name>$charter-name</xrx:name>
<xrx:expression>i18n:translate(<xrx:i18n><xrx:key>new-charter</xrx:key><xrx:default>New Charter</xrx:default></xrx:i18n>)
</xrx:expression>
</xrx:variable>
<xrx:variable>
<xrx:name>$entry</xrx:name>
<xrx:expression>mycollection:charter-new-empty($atomid, $uuid, $charter-name)</xrx:expression>
</xrx:variable>
<xrx:body>
{
let $post := atom:POST($feed, $entryname, $entry)
return
$post
}
</xrx:body>
Zusammensetzung von $entry:
In mycollection.xqm gibt es eine Funktion ´my-collection-charter-new-empty´ wird Template einer leeren (Urkunden)-Instanz angefragt:
let $template := template:get('tag:www.monasterium.net,2011:/mom/template/mycollection-charter', false())
my-collection-charter-edit.widget.xml
Benutze ich den Editor werden alle Änderungen mit der Funktion autosave()
über POST dem Server übermittelt.
z.B. ein Attribut wird eingefügt:
Drag and drop durch JQuery UI aus xrx/js/jquery.ui.xrxAttribute.js
: _attributeDroppable: function(droppableAttribute)
{… $('.xrx-instance').xrxInstance().insertAttributes(contextId, attributes);}
Das JQuery UI widget Objekt ruft die Funktion aus xrx/js/xrxinstance.js
auf
$.fn.insertAttributes = function(contextId, attributes) {
$(this).text(window.XML.insertAttributes($(this).text(), contextId, attributes));
autosave();
};
function autosave() {
clearTimeout(onautosave);
$("#autoSaveStatus").text("Saving ...");
onautosave = setTimeout( function() {
// TODO: replace with event handler
$(document).xmleditor("save");
$(".xrx-report").xrxReport("validate");
$("#autoSaveStatus").text("All changes saved.");
}, 1000);
};
xmleditor/js/jquery.ui.xmleditor.js
save: function() {
var self = this;
$.ajax({url: self.options.requestRoot + serviceMyCollectionSave,
type: "POST",
contentType: "application/xml",
data: $(".xrx-instance").text()
});
Das XRX-Framework ist eine Kodierungsform, die lediglich zum Zeitpunkt der Kompilierung relevant ist. Während des Kompilierungsprozesses werden alle XRX-Tags in HTML-konforme Anweisungen umgesetzt. Dies bedeutet, dass während der Kompilierung der Aufbau des Editors etc. bereits statisch festgelegt worden ist, während der Inhalt dynamisch über die Instanzen geladen wird (seit EditMOM3.1; siehe >Aufbau des Editors<).
Zentrale Stelle für die Umsetzung ist die Datei widget.xqm.
Für eine Übersicht der umgesetzten XRX-Tags und deren Entsprechungen, siehe: Translation of XRX-Tags
https://github.com/icaruseu/mom-ca/blob/master/my/XRX/src/mom/app/xmleditor/xsd/cei-collection-editor.xsd.xml definiert, welche Elemente in welchen Menüs aufscheinen. Elemente, die hier nicht aufgelistet werden, sind über unbezeichnete Menüs zugänglich.
Seit dem Commit #9009b29 zum Issue #340 ist der Editor in seinem Aufbau nicht länger statisch. Dieses wurde notwendig, da der Editor zwangsläufig davon ausging, dass alle Urkundenobjekte ein Mindestmaß an Daten beinhalten. Insbesondere Altdaten oder Importe über die Schnittstellen weisen allerdings oft weniger Inhalt aus. Das hatte zur Folge, dass der Editor für solche Urkunden nicht mehr nutzbar war.
Der Editor folgt nun folgendem Aufbau:
-
- Bei dem ersten Aufruf der Urkunde im Editor werden fehlende Felder aus dem Template (
XRX/src/mom/app/collection/template/mycollection-charter.template.xml
) in die Urkunde integriert.
- Bei dem ersten Aufruf der Urkunde im Editor werden fehlende Felder aus dem Template (
-
- Der Aufbau des Editors ergibt sich aus der Beschreibungsdatei
XRX/src/mom/app/collection/template/mycollection-charter-editor.template.xml
.
- Der Aufbau des Editors ergibt sich aus der Beschreibungsdatei
-
2.1) In der
mycollection-charter-editor.template.xml
müssen nun alle Felder hinterlegt werden, die im Editor angezeigt werden sollen. Der Aufbau erfolgt nach folgendem Muster:
<id> contains the XML-Node as a key : string
<mult_occurence> triggers if <xrx:repeat> or not : bool
<target_field> Just important, if <mult_occurence> is true. Contains Name of Childnode for Textarea : string
<tab_page> contains the number of the Tabpage to which the Node belongs to : string
<active> contains the current status of the Node : bool
<message> contains the field which is important for the i18n-Module ("self" / "target") : string
<groups> contains the groups for which the Field should be enabled : element group with string
Als Beispiel:
<editor_field> <id>cei:idno</id> <parent>cei:body</parent> <mult_occurence>false</mult_occurence> <target_field></target_field> <tab_page>1</tab_page> <active>true</active> <message>self</message> <groups> <group>full</group> <group>transcription</group> <group>google</group> <group>date</group> </groups> </editor_field>
Dem Editor wird ein Feld "cei:idno" hinzugefügt. Das Parent-Element hierzu ist
cei:body
. Dieses Feld kommt maximal einmal in der Urkunde vor (<mult_occurence>
). Im Editor soll die Eingabe auf der ersten Tabpage erlaubt werden. Das Feld ist aktiv und als Anzeige für die Feldübersetzung soll die Übersetzung vonidno
angezeigt werden (<message>self</message>
).Weiterhin ist es noch immer möglich auch Mehrfachvorkommen zu verarbeiten. Beispiel:
<editor_field> <id>cei:sourceDescVolltext</id> <parent>cei:sourceDesc</parent> <mult_occurence>true</mult_occurence> <target_field>cei:bibl</target_field> <tab_page>3</tab_page> <active>true</active> <message>self</message> <groups> <group>full</group> <group>frontEditor</group> <group>google</group> </groups> </editor_field>
Im folgenden Beispiel ist es nun möglich mehrfache Eingaben zu der Bibliografie von Volltexten zu hinterlegen. Der Unterschied zu dem vorherigen Beispiel liegt darin, dass der Parameter<mult_occurence>
jetzt auftrue
gesetzt worden ist. Zusätzlich ist noch angegeben worden, auf welches Feld sich das Mehrfachvorkommen bezieht<target_field>
. Im Editor wird also auf das Feld<cei:sourceDescVolltext>
referenziert, was mehrfach das Feld<cei:bibl>
enthalten kann. Als Bezeichnung des Feldes soll auch wieder die Überschrift aus dem<id>
-Element, also die Übersetzung zusourceDescVolltext
herangezogen werden (<message>self</message>
). -
2.2) Eine weitere Erneuerung des Editors ist, dass dieser je nach Anforderung nur einen bestimmten Teil der Anzeige einblenden kann. Die Steuerung hierüber erfolgt über den Aufrufparameter
mode
. Standardmäßig erfolgt die volle Anzeige aller Eingabemöglichkeiten. Sollen aber zum Beispiel nur alle Felder, die wichtig für eine Transkription sind, angezeigt werden, kann der Aufruf mit dem Parametermode=transcription
erfolgen. Im Folgenden werden nur die Felder eingeblendet, bei denen in der Kategorie<groups>
der entsprechende Wert hinterlegt worden ist. Je Feld können beliebig viele Gruppen hinterlegt werden. -
2.3) Sollen Felder zu einer Gruppe gebündelt werden, erfolgt die Gruppierung innerhalb der Datei
XRX/src/mom/app/collection/template/mycollection-charter-editor-fieldset.template.xml
. Der Aufbau hier sieht wie folgt aus:<fieldset> <tab_page>4</tab_page> <legend>cei_auth</legend> <fields> <field>cei:notariusDesc</field> <field>cei:sealDesc</field> </fields> </fieldset>
Die Eingabe der Tabpage, auf welchem die Gruppierung erscheinen soll, ist als Erstes einzutragen. Schließlich erfolgt die Angabe über die Legende der Gruppierung. Hier wird kein Feldname, sondern der korrespondierende i18n-Schlüssel erwartet. Schließlich müssen noch alle Felder, die in der Gruppierung angezeigt werden sollen, eingetragen werden. Hierbei ist zu beachten, dass es sich hierbei um die Angaben aus<id>
handelt. Weiterhin müssen sich auch die Felder auf einer Tabpage befinden, da ansonsten eine Ansicht an der gewünschten Stelle nicht möglich ist. -
2.4) Veränderungen am Editor, die in den beschriebenen Templates gemacht worden sind, sind nach Eingabe über eXide sofort wirksam. Es muss keine neue Kompilierung erfolgen. Zu beachten ist lediglich, dass die Änderungen auch im lokalen Sourcecode gemacht werden müssen. Ansonsten werden bei einem späteren Kompilierungsvorgang alle eingetragenen Änderungen auf dem Server überschrieben. Sollten bei einer Veranstaltung o.a. spontan ein Feld in der Eingabe ergänzt werden müssen, ist dieses nun ohne großen Mehraufwand schnell realisierbar.