16
Proteus SDK Andy Keller Director of Engineering Dave Shepperton Senior Software Engineer

Proteus SDK

Embed Size (px)

DESCRIPTION

Andy Keller and Dave Shepperton, Traction Software. Traction User Group, Oct 15 2010, Newport RI. TUG 2010 Newport slides, agenda and more see www.TractionSoftware.com

Citation preview

Page 1: Proteus SDK

Proteus SDK

Andy KellerDirector of Engineering

Dave SheppertonSenior Software Engineer

Page 2: Proteus SDK

2

What’s new in 5.x?

• <join> tag

• Proteus skin framework

• Tabbed navigation

• Entry types

• Entry decorators

• Entry labels

• XML forms

Page 3: Proteus SDK

3

<join> tag

• Adds separators between chunks of output

• Doesn’t print at the beginning or end

• Doesn’t repeat separators

• Works through tags and functions

• Used for entry details, line breaks, sql query operators, and more<join separator=”,”>__join.separator__A__join.separator__<compare.equals a=”1” b=”2”>D</compare.equals>__join.separator__<compare.equals a=”1” b=”1”>B</compare.equals>__join.separator__C__join.separator__</join>

A,B,C

Page 4: Proteus SDK

4

Proteus Skin Framework

The Proteus skin is like browser within a browser. It

uses the GWTRPC skin to generate the components

of the page:

Page 5: Proteus SDK

5

Proteus Skin Framework (cont’d)

gwt.rpc.view SDL Tags Produce a Tree of ViewData

objects:

Page 6: Proteus SDK

6

Customizing Proteus Navigation: Configurable Tabs

tabs#main-allprojects →

view.tabsjson SDL Tag →

Tab::evalJSONData →

tasks tab configuration →

tabs#server-tasks → JSON

rendering

Page 7: Proteus SDK

7

Handling JavaScript Installation forWidgets in Proteus

Problem: Some widgets require JavaScript which

use document.write to install their own additional

JavaScript. You can’t do this in an already closed

HTML document! (Symptom: page goes blank,

spinner spins forever...)

Solution: Don’t let external JavaScript ruin the

current document. Instead, render an IFrame with a

link to a view that is its own HTML document that

includes the JavaScript.

Page 8: Proteus SDK

8

Handling JavaScript Installation forWidgets in Proteus (cont’d)

e.g., googlemap token (in

plugins/com.traction.googlemap):

token → token configuration → SDL

renderer →IFrame tag →

type=googlemap View via view

configuration → HTML rendering

(with SCRIPT tag)

Page 9: Proteus SDK

9

Entry Decorators

• Provide custom, context-sensitive renderings for

different kinds of entries

• Based upon the “custom entry type” of the Entry,

same as: com.traction.sdk.Entry::getCustomEntryType()__entry.customentrytype__

• Decorators are per token renderer set; currently

supported for the Proteus skin only (via the

GWTRPC render).

Page 10: Proteus SDK

10

Entry Decorators (cont’d)

entry.content tag →

Entry::decorate method →

milestone decorator configuration

→ SDL renderer → HTML

rendering

Page 11: Proteus SDK

11

Entry Labels

• An entry with a corresponding label

• Encoded as ::Project:-e:[entry#]

• Considered system labels

• Typically hidden from the interface

• Used for grouping entries with another entry, e.g. tasks with a

milestone and/or project, milestones with a project

• Added/removed with reclassifications

• References would require an edit

• Label history tracks changes

Page 12: Proteus SDK

12

Entry Labels: used for PM

TaskTask

ProjecProjectt

MilestMilestoneone

Milestoneshave

Project

Tasks haveProject andMilestone

Page 13: Proteus SDK

13

Entry Labels: new Java SDK methods

Entry and TractionId

LabelName getLabelName()

LabelName

String getDisplayName(CJournalRequest)

Item

LabelIterator getSystemLabels()

Page 14: Proteus SDK

14

Entry Labels: new SDL tags

Entry

__entry.labelname__

LabelName

__labelname.displayname__

Item

<item.labels system=true> </item.labels>

Page 15: Proteus SDK

15

Entry Labels: retrieving labeled content

Just like any other labeled entries

SDK - Journal

EntryIterator getLabeledEntries(...)

SDL

<entries type=cat cat=”__entry.labelname__”> </entries>

Page 16: Proteus SDK

16

Entry Labels: special PM tags

<goal.milestones>

<goal.tasks>

<milestone.goal>

<milestone.tasks>

<task.goal>

<task.milestone>

These all put an entry or entries in scope