Transcript AppSDK2
App SDK 2.0
RallyOn!
Hour 1 Agenda • • • • Welcome, Overview, & How We Got Here (Mark) Write an App in 5 Minutes or Less (Kyle) Component List & Help (Mark) Components in Detail (Charles)
Hour 2 Agenda • • • • Data Interaction (Kyle) Examples & Guides (Mark) Rake File (Charles) Ext Details (Kyle)
Platform
A "platform" is a system that can be programmed and therefore customized by outside developers -- users -- and in that way, adapted to countless needs and niches that the platform's original developers could not have possibly contemplated, much less had time to accommodate.
- Marc Andreessen
Rally’s App Platform: What is it?
• The Rally App Platform enables the ‘ occasional developer’ to enhance, customize, and extend the Rally product.
App Story: Who Closed Defects?
App Story: Personal Burndown Chart
App Story: Epic Stories by Status
App Story: Epic Progress
App Story: Planning Board for Very, Very Large Chip Maker
Apps Version 1.0 Uptake 1.O Release
Past, Present & Future Rally UI App SDK 1.0
Rally UI & App SDK 2.0
Portfolio Item Kanban
Write an App in 5 Minutes or Less
Anatomy of an App
Rally.createApp
• Rally.createApp(name, definition) – Name should be unique – Definition should contain launch() • Created as a subclass of the App Base Class • launch() called when all dependencies loaded – JS – CSS • Rendered to body
App Base Class • Rally.app.App
– – – Extends from Ext.Container
launch() getContext() • Rally.app.Context
– – – getWorkspace() getProject() getDataContext()
Hello World Rally.createApp
(‘Rally.app.HelloWorld’, { launch: function() { this.add({ xtype : ‘component’, html: ‘Hello World’ }); } });
Hello Context Rally.createApp
(‘Rally.app.HelloContext’, { items: [ { xtype : ‘component’, itemId: ‘project’ } ] } launch: function() { var context = this.getContext(); this.down
(‘#project’) .update(‘Project: ‘ + context.getProject().ObjectID); });
Component List & Help System Overview
Landing Page
Component List
Components – in Detail
Data Interaction Models, Records & Stores (Oh My)
Models • • • Specify a WSAPI object type – Defect, HierarchicalRequirement, etc.
Specify fields – ScheduleState • • Type = String AllowedValues = [‘Defined’, …, ‘Accepted’] Rally.data.ModelFactory
– – – getModel, getModels Built dynamically from TypeDefinition Cached per workspace
Records • • Instance of a Model Provide simple CRUD operations
Stores • • • • Collection of Records Batch read Sorting, Filtering, Paging Data provided to all UI components via stores • Rally.data.WsapiDataStore
Rake File
Guides & Examples
Guides
Examples
ExtJS Library Details
Class System • Ext.define(name, definition) – – – – extend mixins constructor: function(config) { } callParent(args) • Ext.create(name, config) • http://docs.sencha.com/ext-js/4-0/#!/guide/class_system
Class System Ext.define
(‘My.cool.Container’, { extend: ‘Ext.container’, }); } constructor: function(config) { //Do something cool this.callParent(arguments); var coolContainer = Ext.create
(‘My.cool.Container’, { level: 99 });
Components • Ext.Base
– Ext.AbstractComponent
• Ext.Component
• • initComponent() destroy() • http://docs.sencha.com/ext-js/4-0/#!/guide/components
Containers • Ext.Component
– Ext.container.AbstractContainer
• Ext.container.Container
• Layouts – auto – hbox, vbox, etc.
• add() • http://docs.sencha.com/ext-js/4-0/ - !/guide/layouts_and_containers
Event Model • Ext.util.Observable
• Common event signatures: – function(sender, arg1, arg2…) • Registration – listeners config – on(eventName, handler, scope) • Cleanup – un(eventName, handler, scope)
Events: listeners config Ext.create
(‘Rally.data.WsapiDataStore’, { model: ‘Defect’, listeners: { load: function(store, records) { } }); }
Events: on var store = Ext.create
(‘Rally.data.WsapiDataStore’, { model: ‘Defect’ }); store.on
(‘load’, function(store, records) { });
Xtypes • Unique shorthand name • Ext.Container
– container • Rally.ui.cardboard.CardBoard
– rallycardboard • Allow lazy instantiation of components
Xtypes: declarative layout } { xtype : ‘container’, ] items: [ { xtype : ‘component’, cls: ‘header’, itemId: ‘header’ }, { xtype : ‘component’, cls: ‘body’, itemId: ‘body’ }, { xtype : ‘component’, cls: ‘footer’, itemId: ‘footer’ }
Xtypes: Dynamic layout var container = Ext.widget
(‘container’); container.add({ xtype : ‘component’, itemId : ‘iterations’ }); container.down
(‘#iterations’).add({ xtype : ‘rallyiterationcombobox’ });
Thank You!
If you want to build a ship don't herd people together to collect wood and don't assign them tasks and work, but rather teach them to long for the endless immensity of the sea.
Antoine-Marie-Roger de Saint-Exupery