go! go! gadgets. writing an opensocial application
DESCRIPTION
This presentation delivered at the OpenSocial Europe Summit and Industry Spotlight on Education Event. Talks about writing OpenSocial Gadgets from Hello World to something a little more useful.TRANSCRIPT
Go Go Gadgets!Building an OpenSocial Application
1
Mark HalvorsonCommunity Member, OpenSocial Foundation BoardChief Imagineer, Atlassian Software
Email: [email protected]: @halv0112
Monday, December 6, 2010
What is an ‘Imagineer’?Monday, December 6, 2010
Take things that exist...
!" #"
Monday, December 6, 2010
...and make something different.
Monday, December 6, 2010
Monday, December 6, 2010
Agenda
•What it is a Gadget•Why Atlassian chose OpenSocial•Application Portability
•Why you should too!•Application Sharing
6Monday, December 6, 2010
What is OpenSocial?
7Monday, December 6, 2010
Social Data Model
8Monday, December 6, 2010
Web Service APIs
9Monday, December 6, 2010
Gadgets
10Monday, December 6, 2010
Our Problem
11Monday, December 6, 2010
Before
FishEyeSourceCode
JIRAIssues&Tasks
ConfluenceWiki
12
•Enterprise Apps are Silos
Monday, December 6, 2010
13
Emphasize Teams, Projects & Tasks over Tools
Monday, December 6, 2010
13
Emphasize Teams, Projects & Tasks over Tools
Monday, December 6, 2010
13
Emphasize Teams, Projects & Tasks over Tools
Monday, December 6, 2010
13
Emphasize Teams, Projects & Tasks over Tools
Monday, December 6, 2010
Too Many Dashboards
14Monday, December 6, 2010
Too Many Dashboards
14Monday, December 6, 2010
Cross-Product Sharing
15Monday, December 6, 2010
Integration with Non-Atlassian apps
16Monday, December 6, 2010
Solution: OpenSocial Gadgets
17Monday, December 6, 2010
Gadgets
18
are a Great Solution for Dashboard
Monday, December 6, 2010
Open standard for enterprise application connection
After
19
viewcompleteproject
singleacCvity
Monday, December 6, 2010
Not just about portals,or internal applications.
Managers Do Email
viewacCvity&status
createissues
20Monday, December 6, 2010
Open Standards, Industry Support
21Monday, December 6, 2010
Why Write Gadgets?
•They’re easy!
•They use stable, widely accessible and understood technologies
•Write once, display everywhere
22Monday, December 6, 2010
The Obligatory Hello World Example
23Monday, December 6, 2010
The Obligatory Hello World Example
23Monday, December 6, 2010
Anatomy of a Gadget
24Monday, December 6, 2010
Anatomy of a Gadget
•XML Spec File•Metadata, HTML Content, and JavaScript
24Monday, December 6, 2010
Anatomy of a Gadget
•XML Spec File•Metadata, HTML Content, and JavaScript
•Core JavaScript API•Access Preferences, Make Requests
24Monday, December 6, 2010
Anatomy of a Gadget
•XML Spec File•Metadata, HTML Content, and JavaScript
•Core JavaScript API•Access Preferences, Make Requests
•Gadget Features•Additional, Optional Capabilities & APIs
24Monday, December 6, 2010
XML Spec File
25Monday, December 6, 2010
<ModulePrefs>
26Monday, December 6, 2010
<ModulePrefs>
<?xml version="1.0" encoding="UTF-8" ?><Module> <ModulePrefs title="JIRA Issues" author="Atlassian" thumbnail="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-issues-thumbnail.png" description="A list of recently created Issues">
<Require feature="minimessage" /> <Require feature="dynamic-height" />
</ModulePrefs>
26Monday, December 6, 2010
<ModulePrefs>
<?xml version="1.0" encoding="UTF-8" ?><Module> <ModulePrefs title="JIRA Issues" author="Atlassian" thumbnail="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-issues-thumbnail.png" description="A list of recently created Issues">
<Require feature="minimessage" /> <Require feature="dynamic-height" />
</ModulePrefs>
26Monday, December 6, 2010
<ModulePrefs>
<?xml version="1.0" encoding="UTF-8" ?><Module> <ModulePrefs title="JIRA Issues" author="Atlassian" thumbnail="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-issues-thumbnail.png" description="A list of recently created Issues">
<Require feature="minimessage" /> <Require feature="dynamic-height" />
</ModulePrefs>
26Monday, December 6, 2010
<UserPref>
<UserPref name="show_date" display_name="Show Dates?" datatype="bool" default_value="true"/> <UserPref name="show_summ" display_name="Show Summaries?" datatype="bool" default_value="true"/> <UserPref name="num_entries" display_name="Number of Entries:" default_value="5" required="true"/>
27Monday, December 6, 2010
<UserPref>
<UserPref name="show_date" display_name="Show Dates?" datatype="bool" default_value="true"/> <UserPref name="show_summ" display_name="Show Summaries?" datatype="bool" default_value="true"/> <UserPref name="num_entries" display_name="Number of Entries:" default_value="5" required="true"/>
27Monday, December 6, 2010
<UserPref>
<UserPref name="show_date" display_name="Show Dates?" datatype="bool" default_value="true"/> <UserPref name="show_summ" display_name="Show Summaries?" datatype="bool" default_value="true"/> <UserPref name="num_entries" display_name="Number of Entries:" default_value="5" required="true"/>
27Monday, December 6, 2010
<Content>
<Content type="html"><![CDATA[ <link rel="stylesheet" href="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-issues.css">
<div id="content_div"></div>
<script type="text/javascript" src="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-issues.js"></script> ]]></Content></Module>
28Monday, December 6, 2010
<Content>
<Content type="html"><![CDATA[ <link rel="stylesheet" href="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-issues.css">
<div id="content_div"></div>
<script type="text/javascript" src="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-issues.js"></script> ]]></Content></Module>
28Monday, December 6, 2010
Views - DEFAULT view
29Monday, December 6, 2010
Views - DEFAULT view
29Monday, December 6, 2010
Views - DEFAULT view
30Monday, December 6, 2010
Views - DEFAULT view
30Monday, December 6, 2010
Views - CANVAS view
31Monday, December 6, 2010
Views - CANVAS view
31Monday, December 6, 2010
Views - DEFAULT view (in Gmail)
32Monday, December 6, 2010
Views - DEFAULT view (in Gmail)
32Monday, December 6, 2010
Views - CANVAS view (in Gmail)
33Monday, December 6, 2010
Views - CANVAS view (in Gmail)
33Monday, December 6, 2010
Views - Custom view
34Monday, December 6, 2010
Wallboards
Gadgets go beyond theJIRA Dashboardonto your wall!
35Monday, December 6, 2010
Wallboards
Gadgets go beyond theJIRA Dashboardonto your wall!
35Monday, December 6, 2010
JavaScript
// Create minimessage factoryvar msg = new gadgets.MiniMessage();// Show a small loading message to the uservar loadMessage = msg.createStaticMessage("loading...");
// Get configured user prefsvar prefs = new gadgets.Prefs();var showDate = prefs.getBool("show_date");var showSummary = prefs.getBool("show_summ");var numEntries = prefs.getInt("num_entries");
// Fetch issues when the gadget loadsgadgets.util.registerOnLoadHandler(fetchIssues);
36Monday, December 6, 2010
JavaScript
// Create minimessage factoryvar msg = new gadgets.MiniMessage();// Show a small loading message to the uservar loadMessage = msg.createStaticMessage("loading...");
// Get configured user prefsvar prefs = new gadgets.Prefs();var showDate = prefs.getBool("show_date");var showSummary = prefs.getBool("show_summ");var numEntries = prefs.getInt("num_entries");
// Fetch issues when the gadget loadsgadgets.util.registerOnLoadHandler(fetchIssues);
36Monday, December 6, 2010
JavaScript
// Create minimessage factoryvar msg = new gadgets.MiniMessage();// Show a small loading message to the uservar loadMessage = msg.createStaticMessage("loading...");
// Get configured user prefsvar prefs = new gadgets.Prefs();var showDate = prefs.getBool("show_date");var showSummary = prefs.getBool("show_summ");var numEntries = prefs.getInt("num_entries");
// Fetch issues when the gadget loadsgadgets.util.registerOnLoadHandler(fetchIssues);
36Monday, December 6, 2010
Requesting Data from Web Services
•AJAX + DOM
•OAuth
•Request Proxy
•
37Monday, December 6, 2010
38Monday, December 6, 2010
39Monday, December 6, 2010
40Monday, December 6, 2010
41Monday, December 6, 2010
gadgets.io.makeRequest()
42Monday, December 6, 2010
What Can You Call?
•Any URL
•XML and JSON are the most useful•
43Monday, December 6, 2010
Fetching Issues
function fetchIssues() { var url = "http://jira.atlassian.com/sr/" + "jira.issueviews:searchrequest-xml" + "/temp/SearchRequest.xml?" + "created%3Aprevious=-1w&resolution=-1" + "&sorter/field=issuekey&sorter/order=DESC" + "&sorter/field=created&sorter/order=DESC" + "&tempMax=20";
var params = {}; params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM;
gadgets.io.makeRequest(url, handleResponse, params);}
44Monday, December 6, 2010
Handling the Response
function handleResponse(obj) { var domData = obj.data;
var jiraIssues = { title : getTitle(domData), items : getItems(domData) }; renderJiraIssues(jiraIssues);
msg.dismissMessage(loadMessage); gadgets.window.adjustHeight();}
45Monday, December 6, 2010
Handling the Response
function handleResponse(obj) { var domData = obj.data;
var jiraIssues = { title : getTitle(domData), items : getItems(domData) }; renderJiraIssues(jiraIssues);
msg.dismissMessage(loadMessage); gadgets.window.adjustHeight();}
45Monday, December 6, 2010
TextText
An ExampleReal World Example...Monday, December 6, 2010
TextText
An ExampleReal World Example...Monday, December 6, 2010
TextText
An ExampleReal World Example...Monday, December 6, 2010
TextText
An ExampleReal World Example...Monday, December 6, 2010
TextText
An ExampleReal World Example...Monday, December 6, 2010
TextText
An ExampleReal World Example...Monday, December 6, 2010
The Goal
The Goal47
Monday, December 6, 2010
48The Result
Monday, December 6, 2010
48The Result
Monday, December 6, 2010
49Preferences
Monday, December 6, 2010
Statistics
50Monday, December 6, 2010
Let’s Take a Step Back.
51Monday, December 6, 2010
Q: What is the purpose of an application?
52Monday, December 6, 2010
Q: What is the purpose of an application?
•A: DO Something. Complete some process.
52Monday, December 6, 2010
Anatomy of an Application
Context Content Ac(on
53Monday, December 6, 2010
An ExampleGmail
Communica(on
ContactsMail
ReadWriteReply
54Monday, December 6, 2010
Q: What is the purpose of a gadget?
55Monday, December 6, 2010
Q: What is the purpose of a gadget?
•A: DO Something. Complete some process.
55Monday, December 6, 2010
Gadget = ReusableMini‐ApplicaCon
Context
Content
Ac(on
AtomicUnitofWork
Ac(on
Context
Content
•or
56Monday, December 6, 2010
Example - “Mini-Application”
JIRACommentGadget
JIRA‐1234
AddComment
UsersComment
57Monday, December 6, 2010
JIRACommentGadget
Context
UsersComment
AddComment
58
Example - Unit of Work
Monday, December 6, 2010
JIRACommentGadget
Context
UsersComment
AddComment
58
Example - Unit of Work
Monday, December 6, 2010
Lesson Learned over time:
•Gadgets as “Units of Work” are...
• Easier to build
• Easier to use
• Easier to reuse
59Monday, December 6, 2010
Composite Application
Gadget
Ac(on
Context
Content
Gadget
Ac(on
Context
Content
Context
Gadget
Ac(on
Add’lContext
ContentContent
Ac(on
60Monday, December 6, 2010
Example - Gmail
GoogleCommunicaConApplicaCon
Gmail
Communica(on
ContactsMail
ReadWriteReply
GoogleTalk
IM
ReadWriteReply
Presence
61Monday, December 6, 2010
<demo>
62Monday, December 6, 2010
Get Satisfaction
63Monday, December 6, 2010
Gadgets?
64
Monday, December 6, 2010
Gadgets?
Gadget? Gadget?
64
Monday, December 6, 2010
65Monday, December 6, 2010
65
Gadget
Gadget!
Gadget
Monday, December 6, 2010
Get Satisfactionpowered by JIRA
66Monday, December 6, 2010
Gadgets!
67Monday, December 6, 2010
Gadgets!
67Monday, December 6, 2010
Gadgets!
67Gadget!
Gadget!
Monday, December 6, 2010
68Monday, December 6, 2010
68Monday, December 6, 2010
</demo>
69Monday, December 6, 2010
Summary - Why write gadgets?
•Easy!• Simple web based technologies mean anyone can write a gadget.
•Reusable!•Use in any OpenSocial Container. iGoogle, Gmail, JIVE, more every day.
•Fun!• Thinking about applications as atomic units of work add a new dimension to
application design.
70Monday, December 6, 2010
Questions?
71
Resources• http://atlassian.com/opensocial
• http://www.opensocial.org
• http://atlassian.com/classroom
Monday, December 6, 2010