diff options
Diffstat (limited to 'includes/js/dijit/demos/mail.html')
-rw-r--r-- | includes/js/dijit/demos/mail.html | 426 |
1 files changed, 426 insertions, 0 deletions
diff --git a/includes/js/dijit/demos/mail.html b/includes/js/dijit/demos/mail.html new file mode 100644 index 0000000..0eae49f --- /dev/null +++ b/includes/js/dijit/demos/mail.html @@ -0,0 +1,426 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + <title>Demo Mail Application</title> + + <style type="text/css"> + @import "../../dojo/resources/dojo.css"; + @import "../themes/soria/soria.css"; + @import "mail/mail.css"; + </style> + <style type="text/css"> + #inbox .dijitSplitterH { height: 5px } + #inbox .dijitSplitterV { width: 5px } + </style> + + <script type="text/javascript" src="../../dojo/dojo.js" + djConfig="isDebug: false, parseOnLoad: true, defaultTestTheme: 'soria'"></script> + <script type="text/javascript" src="../tests/_testCommon.js"></script> + <!-- + <script type="text/javascript" src="../dijit.js"></script> + <script type="text/javascript" src="../dijit-all.js" charset="utf-8"></script> + --> + <script type="text/javascript"> + // Use profile builds, if available. Since we use pretty much all of the widgets, just use dijit-all. + // A custom profile would provide some additional savings. + dojo.require("dijit.dijit"); + dojo.require("dijit.dijit-all"); + + dojo.require("dojo.parser"); + dojo.require("dojo.data.ItemFileWriteStore"); + + dojo.require("dijit.dijit"); + dojo.require("dijit.Declaration"); + dojo.require("dijit.form.Button"); + dojo.require("dijit.Menu"); + dojo.require("dijit.Tree"); + dojo.require("dijit.Tooltip"); + dojo.require("dijit.Dialog"); + dojo.require("dijit.Toolbar"); + dojo.require("dijit._Calendar"); + dojo.require("dijit.ColorPalette"); + dojo.require("dijit.Editor"); + dojo.require("dijit._editor.plugins.LinkDialog"); + dojo.require("dijit.ProgressBar"); + + dojo.require("dijit.form.ComboBox"); + dojo.require("dijit.form.CheckBox"); + dojo.require("dijit.form.FilteringSelect"); + dojo.require("dijit.form.Textarea"); + + dojo.require("dijit.layout.BorderContainer"); + dojo.require("dijit.layout.AccordionContainer"); + dojo.require("dijit.layout.TabContainer"); + dojo.require("dijit.layout.ContentPane"); + + dojo.addOnLoad(function(){ + dijit.setWaiRole(dojo.body(), "application"); + }); + + var paneId=1; + + // for "new message" tab closing + function testClose(pane,tab){ + return confirm("Are you sure you want to leave your changes?"); + } + + // fake mail download code: + var numMails; + var updateFetchStatus = function(x){ + if (x == 0) { + dijit.byId('fakeFetch').update({ indeterminate: false }); + return; + } + dijit.byId('fakeFetch').update({ progress: x }); + if (x == numMails){ + dojo.fadeOut({ node: 'fetchMail', duration:800, + // set progress back to indeterminate. we're cheating, because this + // doesn't actually have any data to "progress" + onEnd: function(){ + dijit.byId('fakeFetch').update({ indeterminate: true }); + dojo.byId('fetchMail').style.visibility='hidden'; // remove progress bar from tab order + } + }).play(); + } + } + var fakeReport = function(percent){ + // FIXME: can't set a label on an indeterminate progress bar + // like if(this.indeterminate) { return " connecting."; } + return dojo.string.substitute("Fetching: ${0} of ${1} messages.", [percent*this.maximum, this.maximum]); + } + var fakeDownload = function(){ + dojo.byId('fetchMail').style.visibility='visible'; + numMails = Math.floor(Math.random()*10)+1; + dijit.byId('fakeFetch').update({ maximum: numMails, progress:0 }); + dojo.fadeIn({ node: 'fetchMail', duration:300 }).play(); + for (var i=0; i<=numMails; i++){ + setTimeout(function(){updateFetchStatus(i);},((i+1)*(Math.floor(Math.random()*100)+400))); + } + } + // fake sending dialog progress bar + var stopSendBar = function(){ + dijit.byId('fakeSend').update({indeterminate: false}); + dijit.byId('sendDialog').hide(); + tabs.selectedChildWidget.onClose = function(){return true;}; // don't want confirm message + tabs.closeChild(tabs.selectedChildWidget); + } + + var showSendBar = function(){ + dijit.byId('fakeSend').update({ indeterminate: true }); + dijit.byId('sendDialog').show(); + setTimeout(function(){stopSendBar();}, 3000); + } + + </script> +</head> +<body class="soria"> + <div dojoType="dojo.data.ItemFileWriteStore" jsId="mailStore" + url="mail/mail.json"></div> + + <!-- Inline declaration of a table widget (thanks Alex!) --> + + <table dojoType="dijit.Declaration" + widgetClass="demo.Table" class="demoTable" + defaults="{ store: null, query: { query: { type: 'message' } }, columns: [ { name: 'From', attribute: 'sender' }, { name: 'Subject', attribute: 'label' }, { name: 'Sent on', attribute: 'sent', + format: function(v){ return dojo.date.locale.format(dojo.date.stamp.fromISOString(v), {selector: 'date'}); } + } ] }"> + <thead dojoAttachPoint="head"> + <tr dojoAttachPoint="headRow"></tr> + </thead> + <tbody dojoAttachPoint="body"> + <tr dojoAttachPoint="row"></tr> + </tbody> + + <script type="dojo/method"> + dojo.forEach(this.columns, function(item, idx){ + var icn = item.className||""; + // add a header for each column + var tth = document.createElement("th"); + tth.innerHTML = "<span class='arrowNode'></span> "+ item.name; + tth.className = icn; + dojo.connect(tth, "onclick", dojo.hitch(this, "onSort", idx)); + this.headRow.appendChild(tth); + + // and fill in the column cell in the template row + this.row.appendChild(document.createElement("td")); + this.row.lastChild.className = icn; + }, this); + this.runQuery(); + </script> + <script type="dojo/method" event="onSort" args="index"> + var ca = this.columns[index].attribute; + var qs = this.query.sort; + // clobber an existing sort arrow + dojo.query("> th", this.headRow).removeClass("arrowUp").removeClass("arrowDown"); + if(qs && qs[0].attribute == ca){ + qs[0].descending = !qs[0].descending; + }else{ + this.query.sort = [{ + attribute: ca, + descending: false + }]; + } + var th = dojo.query("> th", this.headRow)[index]; + dojo.addClass(th, (this.query.sort[0].descending ? "arrowUp" : "arrowDown")); + this.runQuery(); + </script> + <script type="dojo/method" event="runQuery"> + this.query.onBegin = dojo.hitch(this, function(){ dojo.query("tr", this.body).orphan(); }); + this.query.onItem = dojo.hitch(this, "onItem"); + this.query.onComplete = dojo.hitch(this, function(){ + dojo.query("tr:nth-child(odd)", this.body).addClass("oddRow"); + dojo.query("tr:nth-child(even)", this.body).removeClass("oddRow"); + }); + this.store.fetch(this.query); + </script> + <script type="dojo/method" event="onItem" args="item"> + var tr = this.row.cloneNode(true); + dojo.query("td", tr).forEach(function(n, i, a){ + var tc = this.columns[i]; + var tv = this.store.getValue(item, tc.attribute)||""; + if(tc.format){ tv = tc.format(tv, item, this.store); } + n.innerHTML = tv; + }, this); + this.body.appendChild(tr); + dojo.connect(tr, "onclick", this, function(){ this.onClick(item); }); + </script> + </table> + + <!-- Inline declaration for programmatically created "New Message" tabs --> + <div dojoType="dijit.Declaration" + widgetClass="mail.NewMessage"> + <div dojoType="dijit.layout.BorderContainer" dojoAttachPoint="container" title="Composing..." closeable="true"> + <div dojoType="dijit.layout.ContentPane" region="top" style="height:60px; overflow: visible; z-index: 10; color:#666;"> + <table width="100%"> + <tr style="padding-top:5px;"> + <td style="padding-left:20px; padding-right: 8px; text-align:right;"><label for="${id}_to">To:</label></td> + <td width=100%> + <select dojoType="dijit.form.ComboBox" id="${id}_to" hasDownArrow="false"> + <option></option> + <option>adam@yahoo.com</option> + <option>barry@yahoo.com</option> + <option>bob@yahoo.com</option> + <option>cal@yahoo.com</option> + <option>chris@yahoo.com</option> + <option>courtney@yahoo.com</option> + </select> + </td> + </tr> + <tr> + <td style="padding-left: 20px; padding-right:8px; text-align:right;"><label for="${id}_subject">Subject:</label></td> + <td width=100%> + <select dojoType="dijit.form.ComboBox" id="${id}_subject" hasDownArrow="false"> + <option></option> + <option>progress meeting</option> + <option>reports</option> + <option>lunch</option> + <option>vacation</option> + <option>status meeting</option> + </select> + </td> + </tr> + </table> + <hr noshade size="1"> + </div> + + <!-- new message part --> + <!-- FIXME: editor as direct widget here doesn't init --> + <div dojoType="dijit.layout.ContentPane" region="center" href="mail/newMail.html"></div> + + <div dojoType="dijit.layout.ContentPane" region="bottom" style="height:32px" align="center"> + <button dojoType="dijit.form.Button" iconClass="mailIconOk" + >Send + <script type="dojo/method" event="onClick"> + var toField = dojo.byId("${id}_to"); + if (toField.value == ""){ + alert("Please enter a recipient address"); + }else{ + showSendBar(); + } + </script> + </button> + <button dojoType="dijit.form.Button" iconClass="mailIconCancel" + >Cancel + <script type="dojo/method" event="onClick"> + tabs.closeChild(tabs.selectedChildWidget); + </script> + </button> + </div> + </div> + </div> + + + <div dojoType="dijit.layout.BorderContainer" id="main"> + + <!-- toolbar with new mail button, etc. --> + <div dojoType="dijit.Toolbar" region="top" style="height:25px;"> + <div id="getMail" dojoType="dijit.form.ComboButton" + iconClass="mailIconGetMail" optionsTitle="Mail Source Options"> + <script type="dojo/method" event="onClick"> + fakeDownload(); + </script> + <span>Get Mail</span> + <ul dojoType="dijit.Menu"> + <li dojoType="dijit.MenuItem" iconClass="mailIconGetMail">Yahoo</li> + <li dojoType="dijit.MenuItem" iconClass="mailIconGetMail">GMail</li> + </ul> + </div> + <span dojoType="dijit.Tooltip" connectId="getMail">Click to download new mail.</span> + + <button + id="newMsg" dojoType="dijit.form.Button" + iconClass="mailIconNewMessage"> + New Message + <script type="dojo/method" event="onClick"> + /* make a new tab for composing the message */ + var newTab = new mail.NewMessage({id: "new"+paneId }).container; + dojo.mixin(newTab, + { + title: "New Message #" + paneId++, + closable: true, + onClose: testClose + } + ); + tabs.addChild(newTab); + tabs.selectChild(newTab); + </script> + </button> + <span dojoType="dijit.Tooltip" connectId="newMsg">Click to compose new message.</span> + + <button id="options" dojoType="dijit.form.Button" iconClass="mailIconOptions"> + Options + <script type="dojo/method" event="onClick"> + dijit.byId('optionsDialog').show(); + </script> + </button> + <div dojoType="dijit.Tooltip" connectId="options">Set various options</div> + </div> + + <div dojoType="dijit.layout.TabContainer" id="tabs" jsId="tabs" region="center"> + <!-- main section with tree, table, and preview --> + <div dojoType="dijit.layout.BorderContainer" id="inbox" title="Inbox" design="sidebar"> + <div dojoType="dijit.layout.AccordionContainer" region="leading" minSize="20" style="width:20%;" splitter="true"> + <div dojoType="dijit.layout.AccordionPane" title="Folders"> + <div dojoType="dijit.Tree" id="mytree" store="mailStore" + childrenAttr="folders" query="{type:'folder'}" label="Folders"> + <script type="dojo/method" event="onClick" args="item"> + if(!item){ + return; // top level node in tree doesn't correspond to any item + } + /* filter the message list to messages in this folder */ + table.query.query = { + type: "message", + folder: mailStore.getValue(item, "id") + }; + table.runQuery(); + </script> + <script type="dojo/method" event="getIconClass" args="item"> + return (item && mailStore.getValue(item, "icon")) || "mailIconFolderDocuments"; + </script> + </div> + </div> + <div dojoType="dijit.layout.AccordionPane" title="Address Book"> + <span dojoType="demo.Table" store="mailStore" + query="{ query: { type: 'address' }, columns: [ {name: 'User name', attribute: 'label'} ], sort: [ { attribute: 'label' } ] }" + id="addresses" style="width: 100%"> + <script type="dojo/method" event="preamble"> + this.query = { type: "address" }; + this.columns = [ + { + name: "Name", + attribute: "label" + } + ]; + </script> + <script type="dojo/method" event="onClick" args="item"> + table.query.query.sender = mailStore.getValue(item, "sender"); + delete table.query.query.folder; + table.runQuery(); + </script> + </span> + </div> + </div> <!-- end of Accordion --> + + <!-- list of messages pane --> + <div id="listPane" dojoType="dijit.layout.ContentPane" region="top" minSize="20" style="height:134px;" splitter="true"> + <span dojoType="demo.Table" store="mailStore" + query="{ query: { type: 'message' }, sort: [ { attribute: 'label' } ] }" + id="foo" jsId="table" style="width: 100%"> + <script type="dojo/method" event="onClick" args="item"> + var sender = this.store.getValue(item, "sender"); + var subject = this.store.getValue(item, "label"); + var sent = dojo.date.locale.format( + dojo.date.stamp.fromISOString(this.store.getValue(item, "sent")), + {formatLength: "long", selector: "date"}); + var text = this.store.getValue(item, "text"); + var messageInner = "<span class='messageHeader'>From: " + sender + "<br>" + + "Subject: "+ subject + "<br>" + + "Date: " + sent + "<br><br></span>" + + text; + dijit.byId("message").setContent(messageInner); + </script> + </span> + </div> <!-- end of listPane --> + + <!-- message preview pane --> + <div id="message" dojoType="dijit.layout.ContentPane" region="center" minSize="20"> + <p> + This is a simple application mockup showing some of the dojo widgets: + </p> + <ul> + <li>layout widgets: BorderContainer, AccordionContainer</li> + <li>TooltipDialog, Tooltip</li> + <li>Tree</li> + <li>form widgets: Button, DropDownButton, ComboButton, FilteringSelect, ComboBox</li> + <li>Editor</li> + </ul> + <p> + The message list above originally contains all the messages, but you can filter it + by clicking on items in the left Accordion. + Then click on the messages in the above list to display them. + There's no server running, so the app is just a facade and it doesn't really do anything. + <!-- TODO: delete button (we can delete since we are using ItemFileWriteStore --> + </p> + <p> + <span style="font-family: 'Comic Sans MS',Textile,cursive; color: blue; font-style: italic;">-- Bill</span> + </p> + </div> <!-- end of "message" --> + + </div> <!-- end of inbox --> + </div> <!-- end of TabContainer --> + + <div dojoType="dijit.layout.ContentPane" region="bottom" id="footer" align="left"> + <span style="float:right;">DojoMail v1.0 (demo only)</span> + <div id="fetchMail" style="opacity:0;visibility:hidden"> + <div annotate="true" id="fakeFetch" dojoType="dijit.ProgressBar" style="height:15px; width:275px;" indeterminate="true" report="fakeReport"></div> + </div> + </div> + </div> <!-- end of main --> + + <div dojoType="dijit.Dialog" id="optionsDialog" title="Options:"> + <table> + <tr><td style="text-align:right;"><label for="option1">Transport type:</label></td><td> + <select id="option1" dojoType="dijit.form.FilteringSelect"> + <option value="pop3">POP3</option> + <option value="imap">IMAP</option> + </select></td></tr> + <tr><td style="text-align:right;"><label for="option2">Server:</label></td><td><input id="option2" dojoType="dijit.form.TextBox" type="text"> + </td></tr> + + <tr><td style="text-align:right;"><input type="checkbox" id="fooCB" dojoType="dijit.form.CheckBox"></td><td><label for="fooCB">Leave messages on Server</label></td></tr> + <tr><td style="text-align:right;"><input type="checkbox" id="fooCB2" dojoType="dijit.form.CheckBox"></td><td><label for="fooCB2">Remember Password</label></td></tr> + + <tr><td colspan="2" style="text-align:center;"> + <button dojoType="dijit.form.Button" type="submit" iconClass="mailIconOk">OK</button> + <button dojoType="dijit.form.Button" type="submit" iconClass="mailIconCancel">Abort</button> + </td></tr> + </table> + </div> + <div dojoType="dijit.Dialog" id="sendDialog" title="Sending Mail"> + <div id="sendMailBar" style="text-align:center"> + <div id="fakeSend" dojoType="dijit.ProgressBar" style="height:15px; width:175px;" indeterminate="true" ></div> + </div> + <div> +</body> +</html> |