dojo und xpages - assono.de

56
Innovative Software-Lösungen. www.assono.de & Pages EntwicklerCamp 22. Februar 2011 Mit zu einer erstklassigen User-Experience

Upload: others

Post on 21-Jul-2022

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: dojo und XPages - assono.de

Innovative Software-Lösungen.

www.assono.de

& Pages

EntwicklerCamp22. Februar 2011

Mit

zu einer erstklassigen User-Experience

Page 2: dojo und XPages - assono.de

Seite 2www.assono.de

Diplom-Informatiker, Universität Hamburg

seit 1995 entwickle ich Lotus Notes Anwendungen

IBM Certified Application Developer,System Administrator & Instructor

Sprecher auf diversen Konferenzen & Lotusphere 2008

[email protected]://www.assono.de/blog040/73 44 28-315

Bernd Hort

Page 3: dojo und XPages - assono.de

Seite 3www.assono.de

Agenda

- Motivation

- Einführung in dojo

- dojo und XPages

- Dialoge in XPages

- dojo Widgets in XPages

- DataGrids

- dojo Charting

- Fragen & Antworten

&

Page 4: dojo und XPages - assono.de

Seite 4www.assono.de

Was haben alle diese Webseiten gemeineseim?

RichUser

Experience

Page 5: dojo und XPages - assono.de

Seite 5www.assono.de

Motivation – Warum dojo?

- Open Source

- Browserunterstützung

- Vielfältige UI Elemente

- Internationalisierung

- Integraler Bestandteil von Xpages

- Performance

Page 6: dojo und XPages - assono.de

Seite 6www.assono.de

Dojo besteht aus drei Teilen

Page 7: dojo und XPages - assono.de

Seite 7www.assono.de

core - base

- Browser-Erkennung

- JSON encoding / decoding

- Laden von Packages

- Eventhandling

- Animation effects

- AJAX

- CSS Utilities

- OOP Unterstützung

- Firebug Integration

Page 8: dojo und XPages - assono.de

Seite 8www.assono.de

core – Ergänzung

- Drag & Drop

- I18N Support

- Datumsformatierung

- Zahlenformatierung

- String Utils

- Cookie Handling

- Extended Animations

- Back Button Handling

Page 9: dojo und XPages - assono.de

Seite 9www.assono.de

dijit

- Oberflächen Elemente (interface widgets)

- „Theme“ Unterstützung

- Internationalisierung

- Keyboard Unterstützung

Page 10: dojo und XPages - assono.de

Seite 10www.assono.de

dojoX

- „quasi“ experimentell - „The future, today“

- Vieles stabil und produktiv einsetzbar

- Charts

- SVG Unterstützung

- DojoX Offline – Integration mit Gears

- DojoX Widgets

Page 11: dojo und XPages - assono.de

04. 03. 2009 11 © assono 2009

«Page» dojo-Hello World

Page 12: dojo und XPages - assono.de

Seite 12www.assono.de

Hello World<html> <head> <title>My First Dojo App</title> <link rel="StyleSheet" type="text/css" href="/domjs/dojo-1.3.2/dojo/resources/dojo.css"> <link rel="StyleSheet" type="text/css" href="/domjs/dojo-1.3.2/dijit/themes/tundra/tundra.css">

<script type="text/javascript"> var djConfig = { baseScriptUri : "/domjs/dojo-1.3.2/", parseOnLoad : true }; </script>

<script type="text/javascript" src="js/dojo/dojo/dojo.js"></script> <script language="JavaScript" type="text/javascript"> dojo.require("dojo.parser"); dojo.require("dijit.form.DateTextBox"); </script>

</head>

Basis CSS

Theme CSS

dojo.js (Base)

Basis Konfigurationmuss vor dem Laden von dojo.js erfolgen!

Nachladen von Packages

Page 13: dojo und XPages - assono.de

Seite 13www.assono.de

Hello World <body class="tundra">

<form action="" method="get">

<input type="text" name="date1" id="date1" value="2011-02-22" dojoType="dijit.form.DateTextBox"required="true" />

</form>

</body></html>

DateTextBox

Page 14: dojo und XPages - assono.de

Seite 14www.assono.de

base – dojo.addOnLoad()

- Registriert eine Funktion, die aufgerufen wird, sobald das DOM geladen ist und alle Widgets intialisiert sind

- dojo.addOnLoad(functionPointer);Einfacher Funktionsaufruf

- dojo.addOnLoad(object, "functionName");Aufruf einer Methode eines Objektes

- dojo.addOnLoad(object, function(){ /* ... */});Definition einer neuen Methode in dem Objekt

Page 15: dojo und XPages - assono.de

Seite 15www.assono.de

base – CSS Klassen

- dojo.addClass(DomNode|NodeId, ClassName)fügt dem DOM-Knoten eine CSS-Klasse hinzu

- dojo.removeClass(DomNode|NodeId, ClassName)entfernt eine CSS-Klasse von einem DOM-Knoten

- dojo.hasClass(DomNode|NodeId, ClassName)prüft einem DOM-Knoten eine CSS-Klasse zugewiesen wurde

Page 16: dojo und XPages - assono.de

Seite 16www.assono.de

base – DOM Knoten

- dojo.byId(NodeId)liefert den DOM-Knoten mit der gegebenen Id zurück

- dojo.clone(Object)klont ein Objekt, auch DOM-Knoten, inklusive aller Kinder

- dojo.isDescendant(ChildDomNode, ParentDomNode)prüft einem DOM-Knoten Kind eines anderen DOM-Knoten ist

Page 17: dojo und XPages - assono.de

Seite 17www.assono.de

base – dojo.query() (1)

- dojo.query(CSS3-Selector)liefert alle DOM-Knoten, die dem CSS3-Selektor entsprechen- Klassenname, z.B. „.foo“- HTML-Elemente, z.B. „span“- CSS Hierarchien, z.B. „table div“- Direkte Kindelemente (>), z.B.

„#tabular_data > div“- Universal Selektor (*) - Unmittelbar vorangestellte

Geschwisterknoten (~)- vorangestellte Geschwisterknoten (+)

Page 18: dojo und XPages - assono.de

Seite 18www.assono.de

base – dojo.query() (2)

- dojo.query(CSS3-Selector)Abfrage nach Attributen- [foo] Attribut ist vorhanden- [foo='bar'] Attributwert stimmt genau

überein- [foo~='bar'] Attributwert stimmt mit

einem Eintrag in der Liste der Werte überein

- [foo^='bar'] Attributwert beginnt mit- [foo$='bar'] Attributwert endet mit- [foo*='bar'] Attributwert enthält

Page 19: dojo und XPages - assono.de

Seite 19www.assono.de

base – dojo.query() (3)

- dojo.query(CSS3-Selector)Pseudoklassen- :first-child – erstes Kind- :last-child – letztes Kind- :only-child – nur ein Kind- :empty – kein Kind- :checked – aktivierte Radiobuttons &

Checkboxes- :nth-child(n) – n-te Kind- :nth-child(even) – alle „geraden“ Kinder- :nth-child(odd) – alle „ungeraden“ Kinder - :not(...) - Umkehrungen

Page 20: dojo und XPages - assono.de

Seite 20www.assono.de

base – Aspektorientierte Programmierung – connect

- Ruft eine Methode / Funktion auf, sobald ein Event ausgelöst wurde oder eine Methode eines anderen Objektes aufgerufen wurde.dojo.connect(object: Object|null, event: String, context: Object|null, method: String|Function);

- Verknüpfung mit DOM-Knotendojo.connect(dojo.byId(„foo“), „onmouseover“, function(evt){console.log(evt)});

Page 21: dojo und XPages - assono.de

Seite 21www.assono.de

base – Aspektorientierte Programmierung – connect

- Das Event kann auch einfach ein Methodenaufruf eines anderen Objektes sein.function MyClass(){ this.sayHello = function(inName){ alert("Hello, " + inName)}}function AnotherClass(){ this.echo = function(message){ alert(message + " has been greeted.")}}foo = new MyClass();bar = new AnotherClass();var handle = dojo.connect(foo, "sayHello", bar, "echo");foo.sayHello ("EntwicklerCamp");

Page 22: dojo und XPages - assono.de

Seite 22www.assono.de

Dojo in XPages

Erweiterungen

Page 23: dojo und XPages - assono.de

Seite 23www.assono.de

Dojo in XPages

- Verzeichnis „js“ unterhalb von{Domino Data}/domino

- Referenziert als /domjs/

- 8.5.0 = Dojo 1.1.1

- 8.5.1 = Dojo 1.3.2

- 8.5.2 = Dojo 1.4.3

- 8.5.3 = Dojo 1.5.0 *) *) Beta – kann sich noch ändern (theoretisch)

Page 24: dojo und XPages - assono.de

Seite 24www.assono.de

Dojo in XPages – Standardelemente

- Dojo ist integraler Bestandteil von XPages

- Partial Refresh

- Type ahead

- Date/Time Picker

- Richtext Editor in den Versionen 8.5 und 8.5.1

- XSP-Object in Clientside JavaScript

Page 25: dojo und XPages - assono.de

Seite 25www.assono.de

Zugriff auf HTML-Elemente via ID

- Dojo arbeitet vielfach der ID eines HTML-Elementes

- XPages erzeugen die IDs automatisch

- Bestimmen der aktuellen ID via #{id:mycontrol}

- Funktioniert auch in Repeat-Elementen

Page 26: dojo und XPages - assono.de

Seite 26www.assono.de

Dialoge in XPages

- Basis ist das dijit DialogBox (dijit.Dialog)

- Dojo-Ressource dijit.Dialog zur XPage hinzufügen

- Dojo Theme aktivieren

- GegebenenfallsParseOnLoad aktivieren

Page 27: dojo und XPages - assono.de

04. 03. 2009 27 © assono 2009

«XPage» SimpleDialogDemo

Page 28: dojo und XPages - assono.de

Seite 28www.assono.de

Achtung! Positionierung Dialogbox

- Eine Dialogbox wird automatisch direkt unterhalb des Body Elementes positioniert.

- Damit „Partial Refresh“ und andere Interaktion mit dem Server funktionieren kann, muss sie sich aber innerhalb des Form Elementes befinden.

- Entweder einfach per JavaScript dort positionieren oder dojo Erweiterung von Jermey Hodge nutzen.http://xpagesblog.com/xpages-blog/2010/4/10/xpages-compatible-dojo-dialog-reusable-component.html

Page 29: dojo und XPages - assono.de

Seite 29www.assono.de

Picklist mit dojo

- XPage Button hinzufügen- CSJS: Dialog erzeugen

- Custom Control mit Ansicht erstellen und einbetten- 1. Spalte mit CheckBoxes versehen- Button hinzufügen

- CSJS: Selektierte Werte in Felder schreiben und Dialog schließen

- Alternativ- SSJS: Selektierte Ids auslesen und in den

sessionScope schreiben- CSJS: Dialog schließen- http://xpageswiki.com/web/youatnotes/wiki-

xpages.nsf/dx/How_to_create_a_picklist_style_dialog

Page 30: dojo und XPages - assono.de

04. 03. 2009 30 © assono 2009

«XPage» PicklistDemo

Page 31: dojo und XPages - assono.de

Seite 31www.assono.de

XPages Name Picker

- Tim Tripcony – Erweiterung des Type Ahead„XPages namepicker using standard typeahead“http://www.timtripcony.com/blog.nsf/d6plinks/TTRY-7XD5P9

- OpenNTF – XPages Namepicker - Julian Buss (GPL!)http://www.openntf.org/Projects/pmt.nsf/0/BB49635F04CB3924862575B1002D5F9C

- Kommerzielle Version verfügbar

- OpenNTF Extension Library – Name Picker Controlhttp://extlib.openntf.org

Page 32: dojo und XPages - assono.de

Seite 32www.assono.de

dojo Widgets in Xpages – Accordion Container

- Navigationsleiste mit AccordionContainer- Zusammenklappbare Bereiche- Inhalte statisch oder Custom Control

- Bestandteile- Package dijit.layout.AccordionContainer- Package dijit.layout.ContentPane- Verschachtelte DIVs

<div dojoType="dijit.layout.AccordionContainer" style="height: 300px;"> <div dojoType="dijit.layout.ContentPane" title="Panel 1">Content 1</div><div dojoType="dijit.layout.ContentPane" title="Panel 2">Content 2</div> <div dojoType="dijit.layout.ContentPane" title="Panel 3">Content 3</div>

</div>

Page 33: dojo und XPages - assono.de

Seite 33www.assono.de

dojo Widgets in Xpages – dojox.widget.Rating (1)

- Rating anhand von Sternen

- Sterne sind an ein DIV und nicht an ein Feld gebunden

- Wert aus dem Dijit auslesen und in ein verstecktes Feld schreiben

- Zusätzliches CSS benötigt<xp:styleSheet href=”/.ibmxpres/dojoroot/dojox/form/resources/Rating.css”></xp:styleSheet>

- Package dojox.form.Rating

Page 34: dojo und XPages - assono.de

Seite 34www.assono.de

dojo Widgets in Xpages – dojox.widget.Rating (2)

<div id="rateControl" dojoType="dojox.form.Rating" numStars="5" value="2"onChange="dojo.byId('#{id:editControlName}').value = dijit.byId('#{id:rateControl}').value">

</div>

Page 35: dojo und XPages - assono.de

Seite 35www.assono.de

dojo Widgets in Xpages – dijit.layout.TabContainer (1)

- Standard XPages Tab Container - Rendered nur aktiven Tab- Andere Tabs stehen für Client Side JavaScript nicht

zur Verfügung- Jeder Tab-Wechsel bedeutet Serveraufruf - Eher langsam

- Dojo's Tab Container- Alle Tabs werden gerendered- Dojo übernimmt Verstecken/Anzeigen- Sehr schnell

Page 36: dojo und XPages - assono.de

Seite 36www.assono.de

dojo Widgets in Xpages – dijit.layout.TabContainer (2)

- Bestandteile- Package dijit.layout.TabContainer- Package dijit.layout.ContentPane- Verschachtelte DIVs oder Panel

<xp:panel dojoType="dijit.layout.TabContainer" style="width: 350px; height: 300px">

<xp:panel dojoType="dijit.layout.ContentPane" title="dojo Tab 1">Content Tab 1

</xp:panel><xp:panel dojoType="dijit.layout.ContentPane" title="dojo Tab 2">

Content Tab 2 </xp:panel><xp:panel dojoType="dijit.layout.ContentPane" title="dojo Tab 3">

Content Tab 3 </xp:panel>

</xp:panel>

Page 37: dojo und XPages - assono.de

04. 03. 2009 37 © assono 2009

«XPage» WidgetsDemo

Page 38: dojo und XPages - assono.de

Seite 38www.assono.de

dojo DataGrids

- Darstellung von Datenmengen in Tabellen

- dojox.grid.DataGrid (dojo 1.1)- Einfache Darstellung- Dynamisches Sortieren- Vertauschen von Spalten- Dynamische Filter

- dojox.grid.EnhancedGrid (dojo 1.4)- Checkboxes und dynamische Selektion- Kontextmenüs

- Daten können aus vielfältigen Quellen stammen- JSON, XML, CSV und weitere

Page 39: dojo und XPages - assono.de

Seite 39www.assono.de

DojoX DataGrid - Ressourcen

<xp:this.resources><xp:dojoModule name="dojox.grid.DataGrid"></xp:dojoModule><xp:dojoModule name="dojox.data.XmlStore"></xp:dojoModule><xp:styleSheet

href="/.ibmxspres/dojoroot/dojox/grid/resources/Grid.css"></xp:styleSheet><xp:styleSheet

href="/.ibmxspres/dojoroot/dojox/grid/resources/tundraGrid.css"></xp:styleSheet>

</xp:this.resources>

Page 40: dojo und XPages - assono.de

Seite 40www.assono.de

DataGrid – Einrichtung (1)

- Datenquelle definieren

- Layout definieren

var store = new dojox.data.XmlStore({ url: '#{javascript:facesContext.getExternalContext().getRequestContextPath();}/CustomersInXml.xsp'});

var layout = [{field: 'customername', name: 'Kundenname', width: '200px'}, { field: 'customernr', name: 'Kundennr.', width: '50px'}, {field: 'country', name: 'Land', width: '200px'}];

Page 41: dojo und XPages - assono.de

Seite 41www.assono.de

DataGrid – Einrichtung (2)

- Grid definierengrid = new dojox.grid.DataGrid({

query: { customername: '*'},store: store,

autoHeight: 10,autoWidth:true,columnReordering: true,noDataMessage: "<span class='dojoxGridNoData'>Keine passenden Daten gefunden!</span>",structure: layout},

"#{id:gridContainer}");// Grid rendern

grid.startup();

Page 42: dojo und XPages - assono.de

04. 03. 2009 42 © assono 2009

«XPage» DataGridDemo

Page 43: dojo und XPages - assono.de

Seite 43www.assono.de

dojo Charts

- Darstellung von Daten in Diagrammen

- Reichhaltige Darstellungsform

- Interaktivität

- Daten werden als JSON übergeben

- Intec Blog - Dojox Charting Tutorialhttp://hermes.intec.co.uk/Intec/Blog.nsf/archive?openview&title=Dojox%20Charting%20Tutorial&type=cat&cat=Dojox%20Charting%20Tutorial

Page 44: dojo und XPages - assono.de

Seite 44www.assono.de

DojoX Charts - Ressourcen<xp:this.resources>

<xp:dojoModule name="dojox.charting.Chart2D"></xp:dojoModule><xp:dojoModule name="dojox.charting.plot2d.Pie"></xp:dojoModule><xp:dojoModule name="dojox.charting.action2d.Highlight"></xp:dojoModule><xp:dojoModule name="dojox.charting.action2d.MoveSlice"></xp:dojoModule><xp:dojoModule name="dojox.charting.action2d.Tooltip"></xp:dojoModule><xp:dojoModule name="dojox.charting.themes.PlotKit.blue"></xp:dojoModule><xp:dojoModule name="dojox.charting.widget.Legend"></xp:dojoModule><xp:script src="/dojoXChartingData.jss" clientSide="false"></xp:script>

</xp:this.resources>

Page 45: dojo und XPages - assono.de

Seite 45www.assono.de

DojoX Chart – Daten als JSON

- Serverside JavaScript Funktion erstellen, um die Daten im JSON Format zu liefern{y: [Wert], text: "[Beschreibung]", stroke: "black", tooltip: "[Hinweis]"}

- Im Script-Output-Block die Funktion aufrufen und in eine Variable schreibenvar chartData = [#{javascript:getDojoXChartData();}];

Page 46: dojo und XPages - assono.de

Seite 46www.assono.de

DojoX Chart – Chart erzeugenvar dc = dojox.charting;var chartTwo = new dc.Chart2D("#{id:chartTwo}");chartTwo.setTheme(dc.themes.PlotKit.blue).addPlot("default", { type: "Pie", font: "normal normal 11pt Tahoma", fontColor: "black", labelOffset: -30, radius: 80 }).addSeries("Series A", chartData);var anim_a = new dc.action2d.MoveSlice(chartTwo, "default");var anim_b = new dc.action2d.Highlight(chartTwo, "default");var anim_c = new dc.action2d.Tooltip(chartTwo, "default");chartTwo.render();var legendTwo = new dojox.charting.widget.Legend({chart: chartTwo}, "#{id:legendTwo}");

Page 47: dojo und XPages - assono.de

04. 03. 2009 47 © assono 2009

«XPage» ChartDemo

Page 48: dojo und XPages - assono.de

Seite 48www.assono.de

Ressourcen

Offizielle Webseitehttp://www.dojotoolkit.org

API Dokumentationhttp://api.dojotoolkit.org

Demoshttp://demos.dojotoolkit.org

DojoCampushttp://dojocampus.org/

Dojo Dokumentationhttp://docs.dojocampus.org/

Alte Webseitehttp://o.dojotoolkit.org

Page 49: dojo und XPages - assono.de

Seite 49www.assono.de

Ressourcen

- IBM Widget Galleryhttp://www-01.ibm.com/software/ucd/widgetgallery/widget_home.html

- OpenNTF CodeBin - Dojo - Easy As 123http://www.openntf.org/Projects/codebin/codebin.nsf/0/A2A3F3DB69E21F2A8625740E005B8EC9

- Dojomino – Dojo Domino Frameworkhttp://dojomino.com/

- Sitepen Labs Dojohttp://o.sitepen.com/labs/dojo.php

- Dojo Toolbox – Adobe AIR Anwendung mit Offline APIhttp://o.sitepen.com/labs/toolbox/

Page 50: dojo und XPages - assono.de

Seite 50www.assono.de

Bücher

- Frank W. Zammetti“Practical Dojo Projects“Apress Verlag

- Matthew A. Russell“Dojo – The Definitive Guide“O´Reilly Verlag

Page 51: dojo und XPages - assono.de

Seite 51www.assono.de

Fragen?

jetzt stellen – oder später:

[email protected]://www.assono.de/blog040/73 44 28-315

Folien & Beispieldatenbank unterhttp://www.assono.de/blog/d6plinks/EntwicklerCamp-2011-dojo-XPages

Page 52: dojo und XPages - assono.de

Seite 52www.assono.de

dijit - Einführung

- Dijit bezeichnet zwei Dinge- Das Widget Framework basierend

auf den base und core Elementen- Ein einzelnes Widget wird auch als

dijit bezeichnet

- Dijits sind voll „theme-able“ - können im Aussehen angepasst werden- Gewünschtes „Theme“ als CSS einbinden- <body class=“{Theme}“> - Beliebtestes „Theme“ ist „Tundra“

Page 53: dojo und XPages - assono.de

Seite 53www.assono.de

Zwei Arten dijits einzubinden

- Dijits können auf zwei Arten eingebunden werden- Deklarativ- Programmatisch

- Beim deklarativen Ansatz wird der HTML-Code nach Attributen „dojoType“ abgesucht

- Gefundene Elemente werden automatisch um die notwendigen JavaScript-Aufrufe ergänzt

- Vorsicht! HTML Validierungs-Services melden den HTML-Code als nicht valide!

Page 54: dojo und XPages - assono.de

Seite 54www.assono.de

- var djConfig = {baseScriptUri : "js/dojo/",

parseOnLoad : true };Konfiguration zum Parsen des HTML-Codesbeim Laden

- dojo.require("dojo.parser");Notwendiges Package zum Parsen

- dojo.require("dijit.form.Button");Das zum dijit gehörige Package laden

- <button dojoType="dijit.form.Button">ok</button>Dojo Attribute hinzufügen

Dijits deklarativ einbinden

Page 55: dojo und XPages - assono.de

Seite 55www.assono.de

Dijit programmatisch einbinden

- dojo.require("dijit.form.Button");Das zum dijit gehörige Package laden

- var myDijit = new dijit.form.Button(

{label : "Ok"});dojo.byId("divButton").appendChild(myDijit.domNode);

- Der programmatische Ansatz ist der performantere Ansatz. - Nur bei großen HTML-Dokumenten wichtig- Oder bei hoch dynamischen Webseiten

Page 56: dojo und XPages - assono.de

Seite 56www.assono.de

Zugriff auf dijits

- Jedes dijit wird vom dijit Manager verwaltet

- Jedes dijit hat eine eindeutige Id- Entweder manuell definiert- Oder automatisch generiert

- Die Methode dijit.byId(<someID>); liefert das dijit Objekt zurück

- Nicht zu verwechseln mit dojo.byId(<someID>);- Die Methode liefert den DOM-Knoten zurück