go! go! gadgets. writing an opensocial application

Post on 17-May-2015

2.334 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

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: mark.halvorson@atlassian.comTwitter: @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

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

top related