User List (Dojo DGrid)
This example uses Orbiter, JavaScript, HTML, Dojo, and Dijit to create a list of users in an application room. (For a plain HTML user list, see User List.)
The above user list demonstrates how to use the following Orbiter features:
- Creating a room
- Joining a room
- Running a function when a client joins a room
- Running a function when a client leaves a room
- Updating an on-screen list component with the current occupants of a room
- Displaying a client's connect time
The Code
Here is the code for the preceeding example. The example relies on a locally installed copy of the Dojo framework and DGrid, a datagrid component for Dojo.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Orbiter Occupant List with Dojo DGrid</title> <!-- Load Dojo Styles --> <link rel="stylesheet" href="dojo/1.7.2/dojo/resources/dojo.css"> <link rel="stylesheet" href="dojo/1.7.2/dgrid/css/dgrid.css"> <link rel="stylesheet" href="dojo/1.7.2/dgrid/css/skins/claro.css"> <!--Load the Orbiter JavaScript library (non-minified version). Use during development.--> <script type="text/javascript" src="http://unionplatform.com/cdn/Orbiter_latest.js"></script> <!--Load the Orbiter JavaScript library (minified version). Use for production.--> <!--<script type="text/javascript" src="http://unionplatform.com/cdn/Orbiter_latest_min.js"></script>--> <!-- Load Dojo --> <script src="dojo/1.7.2/dojo/dojo.js" data-dojo-config="async: true, debug: true"></script> <!--Application code--> <script type="text/javascript"> //============================================================================== // VARIABLES //============================================================================== var orbiter; var chatRoom; var occupantStore; var occupantGrid; var TIMEZONE_OFFSET = new Date().getTimezoneOffset(); //============================================================================== // INITIALIZATION //============================================================================== // Load Dojo modules require(["dojo/_base/declare", "dojo/store/Memory", "dojo/store/Observable", "dgrid/OnDemandGrid", "dgrid/Keyboard", "dgrid/Selection", "dojo/domReady!"], dojoReady); // Start the app when Dojo's modules have loaded function dojoReady (declare, Memory, Observable, OnDemandGrid, Keyboard, Selection) { // Create the room-occupant data store occupantStore = Observable(new Memory({identifier: "id"})); // Create a grid constructor for the desired grid features var CustomGrid = declare([ OnDemandGrid, Keyboard, Selection ]); // Create a grid in which to display room occupants occupantGrid = new CustomGrid({ columns: { name: "Name", clientID: "Client ID", connectTime: "Connect Time", }, selectionMode: "single", cellNavigation: false, store: occupantStore }, "grid"); occupantGrid.on("dgrid-select", function (event) { console.log("Row selected: ", event.rows[0].data); }); occupantGrid.on("dgrid-deselect", function (event) { console.log("Row de-selected: ", event.rows[0].data); }); occupantGrid.on(".dgrid-row:click", function (event) { var row = occupantGrid.row(event); console.log("Row clicked:", row.data); }); // Create the Orbiter instance, used to connect to and communicate with Union, // then enable automatic reconnection (one attempt every 15 seconds) orbiter = new net.user1.orbiter.Orbiter(); orbiter.getConnectionMonitor().setAutoReconnectFrequency(15000); orbiter.getLog().setLevel(net.user1.logger.Logger.DEBUG); // Register for Orbiter's connection events orbiter.addEventListener(net.user1.orbiter.OrbiterEvent.READY, readyListener, this); orbiter.addEventListener(net.user1.orbiter.OrbiterEvent.CLOSE, closeListener, this); // Connect to Union Server orbiter.connect("tryunion.com", 80); } //============================================================================== // ORBITER EVENT LISTENERS //============================================================================== function readyListener (e) { chatRoom = orbiter.getRoomManager().createRoom("chatRoom"); chatRoom.addEventListener(net.user1.orbiter.RoomEvent.ADD_OCCUPANT, addOccupantListener); chatRoom.addEventListener(net.user1.orbiter.RoomEvent.REMOVE_OCCUPANT, removeOccupantListener); chatRoom.join(); } // Triggered when the connection is closed function closeListener (e) { // Remove all items from the grid occupantStore.setData([]); occupantGrid.refresh(); } //============================================================================== // ROOM EVENT LISTENERS //============================================================================== // Triggered when a client joins the room function addOccupantListener (e) { var occupantConnectTime = new Date(e.getClient().getConnectTime()); var formattedConnectTime = occupantConnectTime.getMonth()+1 + "/" + occupantConnectTime.getDate() + "/" + occupantConnectTime.getFullYear().toString().substr(2) + " " + net.user1.utils.NumericFormatter.dateToLocalHrMinSec(occupantConnectTime) + " UTC" + (TIMEZONE_OFFSET >= 0 ? "-" : "+") + Math.abs(TIMEZONE_OFFSET / 60); addItem("User" + e.getClientID(), e.getClientID(), formattedConnectTime); } // Triggered when a client leaves the room function removeOccupantListener (e) { removeItem(e.getClientID()); } //============================================================================== // STORE MANAGEMENT //============================================================================== function addItem (name, clientID, connectTime) { occupantStore.put({ id: clientID, name: name, clientID: clientID, connectTime: connectTime }); } function removeItem (id) { occupantStore.remove(id); } </script> </head> <body class="claro"> <!--Contains the grid of room occupants--> <div id="grid" style="width: 80%; height: 150px;"></div> <div id="count"></div> </select> </body> </html>