atlascamp 2013: modernizing your plugin ui

63
#atlascamp @atlassian

Upload: colleenfry

Post on 14-Jan-2015

139 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: AtlasCamp 2013: Modernizing your Plugin UI

#atlascamp@atlassian

Page 2: AtlasCamp 2013: Modernizing your Plugin UI

Jonathon Creenaune, Front End Architect, Atlassian

Modernizing YourPlugin UI

Page 3: AtlasCamp 2013: Modernizing your Plugin UI

Build more features

Page 4: AtlasCamp 2013: Modernizing your Plugin UI

Build more features

Make features better

Page 5: AtlasCamp 2013: Modernizing your Plugin UI

Make features better

Page 6: AtlasCamp 2013: Modernizing your Plugin UI

Beauty

Page 7: AtlasCamp 2013: Modernizing your Plugin UI

Beauty

Interactivity

Page 8: AtlasCamp 2013: Modernizing your Plugin UI
Page 9: AtlasCamp 2013: Modernizing your Plugin UI

Beauty

Page 10: AtlasCamp 2013: Modernizing your Plugin UI
Page 11: AtlasCamp 2013: Modernizing your Plugin UI

<header class="aui-page-header">

  <div class="aui-page-header-inner">

    my header text

  </div>

</header>

AUI

Page 12: AtlasCamp 2013: Modernizing your Plugin UI
Page 13: AtlasCamp 2013: Modernizing your Plugin UI
Page 14: AtlasCamp 2013: Modernizing your Plugin UI

<header class="aui-page-header">

  <div class="aui-page-header-inner">

    my header text

  </div>

</header>

Side-by-side

Page 15: AtlasCamp 2013: Modernizing your Plugin UI

<header class="aui-page-header">

  <div class="aui-page-header-inner">

    my header text

  </div>

</header>

Side-by-side

{call aui.page.pageHeader}

  {param content}

    my header text

  {/param}

{/call}

Page 16: AtlasCamp 2013: Modernizing your Plugin UI

AUI 5.0 is in

JIRA 6.0Confluence 5.0

Bamboo 4.3Stash 2.0

FE/CRU 3.0

Page 17: AtlasCamp 2013: Modernizing your Plugin UI

Targeting non-soy platforms

Page 18: AtlasCamp 2013: Modernizing your Plugin UI
Page 19: AtlasCamp 2013: Modernizing your Plugin UI
Page 20: AtlasCamp 2013: Modernizing your Plugin UI
Page 21: AtlasCamp 2013: Modernizing your Plugin UI

URLs should be designed for the user, not just a side-effect of the technology you used to create a page

“”

Page 22: AtlasCamp 2013: Modernizing your Plugin UI

/secure/MemeAction.jspa

/plugins/servlet/memes

Page 23: AtlasCamp 2013: Modernizing your Plugin UI

/memes

/memes/{x}

/memes/create/

/memes/create/{x}

/memes/create

/secure/MemeAction.jspa

/secure/MemeAction.jspa?key={x}

/secure/MemeAction.jspa?upload=

/secure/MemeAction.jspa?createBaseImageKey={x}

/secure/MemeAction.jspa?create=

=>

Page 24: AtlasCamp 2013: Modernizing your Plugin UI

<routing key="meme-pretty-urls" path="/memes">

<get from="" to="/secure/MemeAction.jspa"/>

<get from="/create/" to="/secure/MemeAction.jspa?upload="/>

<get from="/create/{key}" to="/secure/MemeAction.jspa?createBaseImageKey={key}"/>

<get from="/create" to="/secure/MemeAction.jspa?create="/>

<get from="/{key}" to="/secure/MemeAction.jspa?key={key}"/>

</routing>

Pretty URLs

Page 25: AtlasCamp 2013: Modernizing your Plugin UI

P2: YesOld products:Yes

Connect:Yes

Pretty URLs

Page 26: AtlasCamp 2013: Modernizing your Plugin UI

Interactivity

Page 27: AtlasCamp 2013: Modernizing your Plugin UI

Getting code closer to the user

Page 28: AtlasCamp 2013: Modernizing your Plugin UI
Page 29: AtlasCamp 2013: Modernizing your Plugin UI

history.pushState(stateObject, title, url);

// Using history.js

History.pushState(null, null, url);

Pushstate

Page 30: AtlasCamp 2013: Modernizing your Plugin UI

gallery.onSelectImage(function(key) {

// Add it to the URL

History.pushState(null, null, AJS.contextPath() + “/memes” + key);

// Load the hero image

hero.load($container, key);

});

Pushstate

Page 31: AtlasCamp 2013: Modernizing your Plugin UI

History.Adapter.bind(window, 'statechange', function() {

var match;

if (match = getUrl().match(/^$/)) { // gallery

gallery.load($container);

}

else if (match = getUrl().match(/^\/(.*)$/)) { // hero

hero.load($container, match[1]);

}

});

Pushstate - back / forward

Page 32: AtlasCamp 2013: Modernizing your Plugin UI

P2: YesOld products:Yes

Connect:Yes

Pushstate

Page 33: AtlasCamp 2013: Modernizing your Plugin UI

Soy renders on server

and on client

Page 34: AtlasCamp 2013: Modernizing your Plugin UI

<webwork1 key="meme-webwork" class="java.lang.Object">

<actions>

<action name="com.atlassian.meme.action.MemeAction" ...>

<view name="hero" type="soy">

:server-templates/meme.page.hero

</view>

<view name="gallery" type="soy">

:server-templates/meme.page.gallery

</view>

...

Render on server

Page 35: AtlasCamp 2013: Modernizing your Plugin UI

$(function() {

var $container = getContainer();

hero.initEvents($container);

});

Render on server

Page 36: AtlasCamp 2013: Modernizing your Plugin UI

<web-resource key="hero">

<transformation extension="soy">

<transformer key="soyTransformer" />

</transformation>

<resource type="download" name="hero.js" location="hero.soy"/>

...

Render on client

Page 37: AtlasCamp 2013: Modernizing your Plugin UI

function render($container, key) {

$.get(getMemeUrl(key)).done(function(memeData) {

$container.html(meme.hero.main({

meme: memeData

}));

initEvents($container);

...

Render on client

Page 38: AtlasCamp 2013: Modernizing your Plugin UI

P2: YesOld products: If soy available

Connect:JVM server

Render on client + server

Page 39: AtlasCamp 2013: Modernizing your Plugin UI

// Bad

<script>

var myData = “${getMyData}”;

</script>

// Why? Because it’s an XSS hole

<script>

var myData = “</script><script>alert(‘naughty’);””;

</script>

Injecting Page Data

Page 40: AtlasCamp 2013: Modernizing your Plugin UI

// In action

public String getSelectData() {

return ImmutableMap.of(

“baseImages”, getAllBaseImages(),

“baseImagesJson”, marshalAsJson(getAllBaseImages())

);

}

Injecting Page Data

Page 41: AtlasCamp 2013: Modernizing your Plugin UI

// In template

<div class="base-images-json"

data-base-images-json="{$baseImagesJson}">

</div>

Injecting Page Data

Page 42: AtlasCamp 2013: Modernizing your Plugin UI

// From javascript

var myData = AJS.$(".base-images-json").

data("base-images-json");

Accessing Page Data

Page 43: AtlasCamp 2013: Modernizing your Plugin UI

P2: YesOld products:Yes

Connect:Yes

Page Data

Page 44: AtlasCamp 2013: Modernizing your Plugin UI

Future ...

Page 45: AtlasCamp 2013: Modernizing your Plugin UI

<web-resource key="blah">

  <data name="my-data" provider="com.acme.MyDataProvider" />

  <resource type="download" name="my-code.js" />

</web-resource>

Injecting Page Data

Page 46: AtlasCamp 2013: Modernizing your Plugin UI

// pageBuilderService is injectable

pageBuilderService.getData().set("my-data-key", myJsonable);

Injecting Page Data

Page 47: AtlasCamp 2013: Modernizing your Plugin UI

var data = AJS.data.get("my-plugin:blah:my-data");

Accessing Page Data

Page 48: AtlasCamp 2013: Modernizing your Plugin UI

Main

Gallery

Hero

Create

Select

Form

Utils

Read files

Render Meme

Page 49: AtlasCamp 2013: Modernizing your Plugin UI

define(“create/canvasDrawer”, function() {

...

return {

drawImage: function() {},

drawText: function() {},

getAsBase64: function() {}

}

});

Defining Modules

Page 50: AtlasCamp 2013: Modernizing your Plugin UI

define(“create/main”, [“./formView”, “./canvasDrawer”],

function(formView, canvasDrawer) {

formView.onSubmit(function() {

canvasDrawer.drawImage(myImage);

save(canvasDrawer.getAsBase64);

});

});

Requiring Modules

Page 51: AtlasCamp 2013: Modernizing your Plugin UI

almond.js

Page 52: AtlasCamp 2013: Modernizing your Plugin UI

P2: YesOld products:Yes

Connect:Yes

JS modules

Page 53: AtlasCamp 2013: Modernizing your Plugin UI

Amazon: For every 100ms increase in load time of Amazon.com decreased sales by 1%

Google: From 10 results in 0.4 seconds to to 30 results in 0.9 seconds decreased traffic and ad revenues by 20%

Google: An extra 500ms in loading time resulted in 20% drop in traffic.

Yahoo: 400ms slower page would see 5-9% more people leave before the page finished loading.

Page 54: AtlasCamp 2013: Modernizing your Plugin UI

Main

Gallery

Hero

Create

Select

Form

Utils

Read Files

Render Meme

Page 55: AtlasCamp 2013: Modernizing your Plugin UI

Main

Gallery

Hero

Create

Select

Form

Utils

Read Files

Render Meme

Page 56: AtlasCamp 2013: Modernizing your Plugin UI

<web-resource key="create">

<resource type="download" name="create/main.js" location="create/main.js" />

<resource type="download" name="create/create.css" location="create/create.css" />

<resource type="download" name="create/create.js" location="create/create.soy" />

...

</web-resource>

Async Resource Loading

Page 57: AtlasCamp 2013: Modernizing your Plugin UI

require("gallery/main").onSelectCreate(function() { WRM.require([ "wr!com.atlassian.atlassian-meme-generator:create" ]).done(function() { showCreateView(); });});

Async Resource Loading

Page 58: AtlasCamp 2013: Modernizing your Plugin UI

P2: YesOld products:Yes

Connect:Other libs

Async Resource Loading

Page 59: AtlasCamp 2013: Modernizing your Plugin UI

Beauty:

SoyPretty URLs

Page 60: AtlasCamp 2013: Modernizing your Plugin UI

Interactivity:

PushstateServer and Client rendering

DataJS modules

Async resource loading

Page 62: AtlasCamp 2013: Modernizing your Plugin UI

Thank you!

Page 63: AtlasCamp 2013: Modernizing your Plugin UI

Party Starts at 19.00!SkyLounge, Oosterdoksstraat 4, 11th Floor