commit/galaxy-central: carlfeberhard: history.js: refactored body renderers
1 new commit in galaxy-central: https://bitbucket.org/galaxy/galaxy-central/changeset/0bb0a2d4bf3c/ changeset: 0bb0a2d4bf3c user: carlfeberhard date: 2012-09-14 01:53:12 summary: history.js: refactored body renderers affected #: 19 files diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/libs/handlebars.full.js --- a/static/scripts/libs/handlebars.full.js +++ /dev/null @@ -1,1550 +0,0 @@ -// lib/handlebars/base.js -var Handlebars = {}; - -Handlebars.VERSION = "1.0.beta.6"; - -Handlebars.helpers = {}; -Handlebars.partials = {}; - -Handlebars.registerHelper = function(name, fn, inverse) { - if(inverse) { fn.not = inverse; } - this.helpers[name] = fn; -}; - -Handlebars.registerPartial = function(name, str) { - this.partials[name] = str; -}; - -Handlebars.registerHelper('helperMissing', function(arg) { - if(arguments.length === 2) { - return undefined; - } else { - throw new Error("Could not find property '" + arg + "'"); - } -}); - -var toString = Object.prototype.toString, functionType = "[object Function]"; - -Handlebars.registerHelper('blockHelperMissing', function(context, options) { - var inverse = options.inverse || function() {}, fn = options.fn; - - - var ret = ""; - var type = toString.call(context); - - if(type === functionType) { context = context.call(this); } - - if(context === true) { - return fn(this); - } else if(context === false || context == null) { - return inverse(this); - } else if(type === "[object Array]") { - if(context.length > 0) { - for(var i=0, j=context.length; i<j; i++) { - ret = ret + fn(context[i]); - } - } else { - ret = inverse(this); - } - return ret; - } else { - return fn(context); - } -}); - -Handlebars.registerHelper('each', function(context, options) { - var fn = options.fn, inverse = options.inverse; - var ret = ""; - - if(context && context.length > 0) { - for(var i=0, j=context.length; i<j; i++) { - ret = ret + fn(context[i]); - } - } else { - ret = inverse(this); - } - return ret; -}); - -Handlebars.registerHelper('if', function(context, options) { - var type = toString.call(context); - if(type === functionType) { context = context.call(this); } - - if(!context || Handlebars.Utils.isEmpty(context)) { - return options.inverse(this); - } else { - return options.fn(this); - } -}); - -Handlebars.registerHelper('unless', function(context, options) { - var fn = options.fn, inverse = options.inverse; - options.fn = inverse; - options.inverse = fn; - - return Handlebars.helpers['if'].call(this, context, options); -}); - -Handlebars.registerHelper('with', function(context, options) { - return options.fn(context); -}); - -Handlebars.registerHelper('log', function(context) { - Handlebars.log(context); -}); -; -// lib/handlebars/compiler/parser.js -/* Jison generated parser */ -var handlebars = (function(){ - -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"root":3,"program":4,"EOF":5,"statements":6,"simpleInverse":7,"statement":8,"openInverse":9,"closeBlock":10,"openBlock":11,"mustache":12,"partial":13,"CONTENT":14,"COMMENT":15,"OPEN_BLOCK":16,"inMustache":17,"CLOSE":18,"OPEN_INVERSE":19,"OPEN_ENDBLOCK":20,"path":21,"OPEN":22,"OPEN_UNESCAPED":23,"OPEN_PARTIAL":24,"params":25,"hash":26,"param":27,"STRING":28,"INTEGER":29,"BOOLEAN":30,"hashSegments":31,"hashSegment":32,"ID":33,"EQUALS":34,"pathSegments":35,"SEP":36,"$accept":0,"$end":1}, -terminals_: {2:"error",5:"EOF",14:"CONTENT",15:"COMMENT",16:"OPEN_BLOCK",18:"CLOSE",19:"OPEN_INVERSE",20:"OPEN_ENDBLOCK",22:"OPEN",23:"OPEN_UNESCAPED",24:"OPEN_PARTIAL",28:"STRING",29:"INTEGER",30:"BOOLEAN",33:"ID",34:"EQUALS",36:"SEP"}, -productions_: [0,[3,2],[4,3],[4,1],[4,0],[6,1],[6,2],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[11,3],[9,3],[10,3],[12,3],[12,3],[13,3],[13,4],[7,2],[17,3],[17,2],[17,2],[17,1],[25,2],[25,1],[27,1],[27,1],[27,1],[27,1],[26,1],[31,2],[31,1],[32,3],[32,3],[32,3],[32,3],[21,1],[35,3],[35,1]], -performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { - -var $0 = $$.length - 1; -switch (yystate) { -case 1: return $$[$0-1] -break; -case 2: this.$ = new yy.ProgramNode($$[$0-2], $$[$0]) -break; -case 3: this.$ = new yy.ProgramNode($$[$0]) -break; -case 4: this.$ = new yy.ProgramNode([]) -break; -case 5: this.$ = [$$[$0]] -break; -case 6: $$[$0-1].push($$[$0]); this.$ = $$[$0-1] -break; -case 7: this.$ = new yy.InverseNode($$[$0-2], $$[$0-1], $$[$0]) -break; -case 8: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1], $$[$0]) -break; -case 9: this.$ = $$[$0] -break; -case 10: this.$ = $$[$0] -break; -case 11: this.$ = new yy.ContentNode($$[$0]) -break; -case 12: this.$ = new yy.CommentNode($$[$0]) -break; -case 13: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]) -break; -case 14: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]) -break; -case 15: this.$ = $$[$0-1] -break; -case 16: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]) -break; -case 17: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], true) -break; -case 18: this.$ = new yy.PartialNode($$[$0-1]) -break; -case 19: this.$ = new yy.PartialNode($$[$0-2], $$[$0-1]) -break; -case 20: -break; -case 21: this.$ = [[$$[$0-2]].concat($$[$0-1]), $$[$0]] -break; -case 22: this.$ = [[$$[$0-1]].concat($$[$0]), null] -break; -case 23: this.$ = [[$$[$0-1]], $$[$0]] -break; -case 24: this.$ = [[$$[$0]], null] -break; -case 25: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]; -break; -case 26: this.$ = [$$[$0]] -break; -case 27: this.$ = $$[$0] -break; -case 28: this.$ = new yy.StringNode($$[$0]) -break; -case 29: this.$ = new yy.IntegerNode($$[$0]) -break; -case 30: this.$ = new yy.BooleanNode($$[$0]) -break; -case 31: this.$ = new yy.HashNode($$[$0]) -break; -case 32: $$[$0-1].push($$[$0]); this.$ = $$[$0-1] -break; -case 33: this.$ = [$$[$0]] -break; -case 34: this.$ = [$$[$0-2], $$[$0]] -break; -case 35: this.$ = [$$[$0-2], new yy.StringNode($$[$0])] -break; -case 36: this.$ = [$$[$0-2], new yy.IntegerNode($$[$0])] -break; -case 37: this.$ = [$$[$0-2], new yy.BooleanNode($$[$0])] -break; -case 38: this.$ = new yy.IdNode($$[$0]) -break; -case 39: $$[$0-2].push($$[$0]); this.$ = $$[$0-2]; -break; -case 40: this.$ = [$$[$0]] -break; -} -}, -table: [{3:1,4:2,5:[2,4],6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],24:[1,15]},{1:[3]},{5:[1,16]},{5:[2,3],7:17,8:18,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,19],20:[2,3],22:[1,13],23:[1,14],24:[1,15]},{5:[2,5],14:[2,5],15:[2,5],16:[2,5],19:[2,5],20:[2,5],22:[2,5],23:[2,5],24:[2,5]},{4:20,6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,4],22:[1,13],23:[1,14],24:[1,15]},{4:21,6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,4],22:[1,13],23:[1,14],24:[1,15]},{5:[2,9],14:[2,9],15:[2,9],16:[2,9],19:[2,9],20:[2,9],22:[2,9],23:[2,9],24:[2,9]},{5:[2,10],14:[2,10],15:[2,10],16:[2,10],19:[2,10],20:[2,10],22:[2,10],23:[2,10],24:[2,10]},{5:[2,11],14:[2,11],15:[2,11],16:[2,11],19:[2,11],20:[2,11],22:[2,11],23:[2,11],24:[2,11]},{5:[2,12],14:[2,12],15:[2,12],16:[2,12],19:[2,12],20:[2,12],22:[2,12],23:[2,12],24:[2,12]},{17:22,21:23,33:[1,25],35:24},{17:26,21:23,33:[1,25],35:24},{17:27,21:23,33:[1,25],35:24},{17:28,21:23,33:[1,25],35:24},{21:29,33:[1,25],35:24},{1:[2,1]},{6:30,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],24:[1,15]},{5:[2,6],14:[2,6],15:[2,6],16:[2,6],19:[2,6],20:[2,6],22:[2,6],23:[2,6],24:[2,6]},{17:22,18:[1,31],21:23,33:[1,25],35:24},{10:32,20:[1,33]},{10:34,20:[1,33]},{18:[1,35]},{18:[2,24],21:40,25:36,26:37,27:38,28:[1,41],29:[1,42],30:[1,43],31:39,32:44,33:[1,45],35:24},{18:[2,38],28:[2,38],29:[2,38],30:[2,38],33:[2,38],36:[1,46]},{18:[2,40],28:[2,40],29:[2,40],30:[2,40],33:[2,40],36:[2,40]},{18:[1,47]},{18:[1,48]},{18:[1,49]},{18:[1,50],21:51,33:[1,25],35:24},{5:[2,2],8:18,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,2],22:[1,13],23:[1,14],24:[1,15]},{14:[2,20],15:[2,20],16:[2,20],19:[2,20],22:[2,20],23:[2,20],24:[2,20]},{5:[2,7],14:[2,7],15:[2,7],16:[2,7],19:[2,7],20:[2,7],22:[2,7],23:[2,7],24:[2,7]},{21:52,33:[1,25],35:24},{5:[2,8],14:[2,8],15:[2,8],16:[2,8],19:[2,8],20:[2,8],22:[2,8],23:[2,8],24:[2,8]},{14:[2,14],15:[2,14],16:[2,14],19:[2,14],20:[2,14],22:[2,14],23:[2,14],24:[2,14]},{18:[2,22],21:40,26:53,27:54,28:[1,41],29:[1,42],30:[1,43],31:39,32:44,33:[1,45],35:24},{18:[2,23]},{18:[2,26],28:[2,26],29:[2,26],30:[2,26],33:[2,26]},{18:[2,31],32:55,33:[1,56]},{18:[2,27],28:[2,27],29:[2,27],30:[2,27],33:[2,27]},{18:[2,28],28:[2,28],29:[2,28],30:[2,28],33:[2,28]},{18:[2,29],28:[2,29],29:[2,29],30:[2,29],33:[2,29]},{18:[2,30],28:[2,30],29:[2,30],30:[2,30],33:[2,30]},{18:[2,33],33:[2,33]},{18:[2,40],28:[2,40],29:[2,40],30:[2,40],33:[2,40],34:[1,57],36:[2,40]},{33:[1,58]},{14:[2,13],15:[2,13],16:[2,13],19:[2,13],20:[2,13],22:[2,13],23:[2,13],24:[2,13]},{5:[2,16],14:[2,16],15:[2,16],16:[2,16],19:[2,16],20:[2,16],22:[2,16],23:[2,16],24:[2,16]},{5:[2,17],14:[2,17],15:[2,17],16:[2,17],19:[2,17],20:[2,17],22:[2,17],23:[2,17],24:[2,17]},{5:[2,18],14:[2,18],15:[2,18],16:[2,18],19:[2,18],20:[2,18],22:[2,18],23:[2,18],24:[2,18]},{18:[1,59]},{18:[1,60]},{18:[2,21]},{18:[2,25],28:[2,25],29:[2,25],30:[2,25],33:[2,25]},{18:[2,32],33:[2,32]},{34:[1,57]},{21:61,28:[1,62],29:[1,63],30:[1,64],33:[1,25],35:24},{18:[2,39],28:[2,39],29:[2,39],30:[2,39],33:[2,39],36:[2,39]},{5:[2,19],14:[2,19],15:[2,19],16:[2,19],19:[2,19],20:[2,19],22:[2,19],23:[2,19],24:[2,19]},{5:[2,15],14:[2,15],15:[2,15],16:[2,15],19:[2,15],20:[2,15],22:[2,15],23:[2,15],24:[2,15]},{18:[2,34],33:[2,34]},{18:[2,35],33:[2,35]},{18:[2,36],33:[2,36]},{18:[2,37],33:[2,37]}], -defaultActions: {16:[2,1],37:[2,23],53:[2,21]}, -parseError: function parseError(str, hash) { - throw new Error(str); -}, -parse: function parse(input) { - var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - if (typeof this.lexer.yylloc == "undefined") - this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - if (typeof this.yy.parseError === "function") - this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - function lex() { - var token; - token = self.lexer.lex() || 1; - if (typeof token !== "number") { - token = self.symbols_[token] || token; - } - return token; - } - var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol == null) - symbol = lex(); - action = table[state] && table[state][symbol]; - } - if (typeof action === "undefined" || !action.length || !action[0]) { - if (!recovering) { - expected = []; - for (p in table[state]) - if (this.terminals_[p] && p > 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - var errStr = ""; - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + this.terminals_[symbol] + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column}; - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; -} -};/* Jison generated lexer */ -var lexer = (function(){ - -var lexer = ({EOF:1, -parseError:function parseError(str, hash) { - if (this.yy.parseError) { - this.yy.parseError(str, hash); - } else { - throw new Error(str); - } - }, -setInput:function (input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; - return this; - }, -input:function () { - var ch = this._input[0]; - this.yytext+=ch; - this.yyleng++; - this.match+=ch; - this.matched+=ch; - var lines = ch.match(/\n/); - if (lines) this.yylineno++; - this._input = this._input.slice(1); - return ch; - }, -unput:function (ch) { - this._input = ch + this._input; - return this; - }, -more:function () { - this._more = true; - return this; - }, -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); - }, -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c+"^"; - }, -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, - match, - col, - lines; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i=0;i < rules.length; i++) { - match = this._input.match(this.rules[rules[i]]); - if (match) { - lines = match[0].match(/\n.*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = {first_line: this.yylloc.last_line, - last_line: this.yylineno+1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length} - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[i],this.conditionStack[this.conditionStack.length-1]); - if (token) return token; - else return; - } - } - if (this._input === "") { - return this.EOF; - } else { - this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), - {text: "", token: null, line: this.yylineno}); - } - }, -lex:function lex() { - var r = this.next(); - if (typeof r !== 'undefined') { - return r; - } else { - return this.lex(); - } - }, -begin:function begin(condition) { - this.conditionStack.push(condition); - }, -popState:function popState() { - return this.conditionStack.pop(); - }, -_currentRules:function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; - }, -topState:function () { - return this.conditionStack[this.conditionStack.length-2]; - }, -pushState:function begin(condition) { - this.begin(condition); - }}); -lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { - -var YYSTATE=YY_START -switch($avoiding_name_collisions) { -case 0: - if(yy_.yytext.slice(-1) !== "\\") this.begin("mu"); - if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1), this.begin("emu"); - if(yy_.yytext) return 14; - -break; -case 1: return 14; -break; -case 2: this.popState(); return 14; -break; -case 3: return 24; -break; -case 4: return 16; -break; -case 5: return 20; -break; -case 6: return 19; -break; -case 7: return 19; -break; -case 8: return 23; -break; -case 9: return 23; -break; -case 10: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15; -break; -case 11: return 22; -break; -case 12: return 34; -break; -case 13: return 33; -break; -case 14: return 33; -break; -case 15: return 36; -break; -case 16: /*ignore whitespace*/ -break; -case 17: this.popState(); return 18; -break; -case 18: this.popState(); return 18; -break; -case 19: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 28; -break; -case 20: return 30; -break; -case 21: return 30; -break; -case 22: return 29; -break; -case 23: return 33; -break; -case 24: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 33; -break; -case 25: return 'INVALID'; -break; -case 26: return 5; -break; -} -}; -lexer.rules = [/^[^\x00]*?(?=(\{\{))/,/^[^\x00]+/,/^[^\x00]{2,}?(?=(\{\{))/,/^\{\{>/,/^\{\{#/,/^\{\{\//,/^\{\{\^/,/^\{\{\s*else\b/,/^\{\{\{/,/^\{\{&/,/^\{\{![\s\S]*?\}\}/,/^\{\{/,/^=/,/^\.(?=[} ])/,/^\.\./,/^[\/.]/,/^\s+/,/^\}\}\}/,/^\}\}/,/^"(\\["]|[^"])*"/,/^true(?=[}\s])/,/^false(?=[}\s])/,/^[0-9]+(?=[}\s])/,/^[a-zA-Z0-9_$-]+(?=[=}\s\/.])/,/^\[[^\]]*\]/,/^./,/^$/]; -lexer.conditions = {"mu":{"rules":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"INITIAL":{"rules":[0,1,26],"inclusive":true}};return lexer;})() -parser.lexer = lexer; -return parser; -})(); -if (typeof require !== 'undefined' && typeof exports !== 'undefined') { -exports.parser = handlebars; -exports.parse = function () { return handlebars.parse.apply(handlebars, arguments); } -exports.main = function commonjsMain(args) { - if (!args[1]) - throw new Error('Usage: '+args[0]+' FILE'); - if (typeof process !== 'undefined') { - var source = require('fs').readFileSync(require('path').join(process.cwd(), args[1]), "utf8"); - } else { - var cwd = require("file").path(require("file").cwd()); - var source = cwd.join(args[1]).read({charset: "utf-8"}); - } - return exports.parser.parse(source); -} -if (typeof module !== 'undefined' && require.main === module) { - exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args); -} -}; -; -// lib/handlebars/compiler/base.js -Handlebars.Parser = handlebars; - -Handlebars.parse = function(string) { - Handlebars.Parser.yy = Handlebars.AST; - return Handlebars.Parser.parse(string); -}; - -Handlebars.print = function(ast) { - return new Handlebars.PrintVisitor().accept(ast); -}; - -Handlebars.logger = { - DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3, - - // override in the host environment - log: function(level, str) {} -}; - -Handlebars.log = function(level, str) { Handlebars.logger.log(level, str); }; -; -// lib/handlebars/compiler/ast.js -(function() { - - Handlebars.AST = {}; - - Handlebars.AST.ProgramNode = function(statements, inverse) { - this.type = "program"; - this.statements = statements; - if(inverse) { this.inverse = new Handlebars.AST.ProgramNode(inverse); } - }; - - Handlebars.AST.MustacheNode = function(params, hash, unescaped) { - this.type = "mustache"; - this.id = params[0]; - this.params = params.slice(1); - this.hash = hash; - this.escaped = !unescaped; - }; - - Handlebars.AST.PartialNode = function(id, context) { - this.type = "partial"; - - // TODO: disallow complex IDs - - this.id = id; - this.context = context; - }; - - var verifyMatch = function(open, close) { - if(open.original !== close.original) { - throw new Handlebars.Exception(open.original + " doesn't match " + close.original); - } - }; - - Handlebars.AST.BlockNode = function(mustache, program, close) { - verifyMatch(mustache.id, close); - this.type = "block"; - this.mustache = mustache; - this.program = program; - }; - - Handlebars.AST.InverseNode = function(mustache, program, close) { - verifyMatch(mustache.id, close); - this.type = "inverse"; - this.mustache = mustache; - this.program = program; - }; - - Handlebars.AST.ContentNode = function(string) { - this.type = "content"; - this.string = string; - }; - - Handlebars.AST.HashNode = function(pairs) { - this.type = "hash"; - this.pairs = pairs; - }; - - Handlebars.AST.IdNode = function(parts) { - this.type = "ID"; - this.original = parts.join("."); - - var dig = [], depth = 0; - - for(var i=0,l=parts.length; i<l; i++) { - var part = parts[i]; - - if(part === "..") { depth++; } - else if(part === "." || part === "this") { this.isScoped = true; } - else { dig.push(part); } - } - - this.parts = dig; - this.string = dig.join('.'); - this.depth = depth; - this.isSimple = (dig.length === 1) && (depth === 0); - }; - - Handlebars.AST.StringNode = function(string) { - this.type = "STRING"; - this.string = string; - }; - - Handlebars.AST.IntegerNode = function(integer) { - this.type = "INTEGER"; - this.integer = integer; - }; - - Handlebars.AST.BooleanNode = function(bool) { - this.type = "BOOLEAN"; - this.bool = bool; - }; - - Handlebars.AST.CommentNode = function(comment) { - this.type = "comment"; - this.comment = comment; - }; - -})();; -// lib/handlebars/utils.js -Handlebars.Exception = function(message) { - var tmp = Error.prototype.constructor.apply(this, arguments); - - for (var p in tmp) { - if (tmp.hasOwnProperty(p)) { this[p] = tmp[p]; } - } - - this.message = tmp.message; -}; -Handlebars.Exception.prototype = new Error; - -// Build out our basic SafeString type -Handlebars.SafeString = function(string) { - this.string = string; -}; -Handlebars.SafeString.prototype.toString = function() { - return this.string.toString(); -}; - -(function() { - var escape = { - "<": "<", - ">": ">", - '"': """, - "'": "'", - "`": "`" - }; - - var badChars = /&(?!\w+;)|[<>"'`]/g; - var possible = /[&<>"'`]/; - - var escapeChar = function(chr) { - return escape[chr] || "&"; - }; - - Handlebars.Utils = { - escapeExpression: function(string) { - // don't escape SafeStrings, since they're already safe - if (string instanceof Handlebars.SafeString) { - return string.toString(); - } else if (string == null || string === false) { - return ""; - } - - if(!possible.test(string)) { return string; } - return string.replace(badChars, escapeChar); - }, - - isEmpty: function(value) { - if (typeof value === "undefined") { - return true; - } else if (value === null) { - return true; - } else if (value === false) { - return true; - } else if(Object.prototype.toString.call(value) === "[object Array]" && value.length === 0) { - return true; - } else { - return false; - } - } - }; -})();; -// lib/handlebars/compiler/compiler.js -Handlebars.Compiler = function() {}; -Handlebars.JavaScriptCompiler = function() {}; - -(function(Compiler, JavaScriptCompiler) { - Compiler.OPCODE_MAP = { - appendContent: 1, - getContext: 2, - lookupWithHelpers: 3, - lookup: 4, - append: 5, - invokeMustache: 6, - appendEscaped: 7, - pushString: 8, - truthyOrFallback: 9, - functionOrFallback: 10, - invokeProgram: 11, - invokePartial: 12, - push: 13, - assignToHash: 15, - pushStringParam: 16 - }; - - Compiler.MULTI_PARAM_OPCODES = { - appendContent: 1, - getContext: 1, - lookupWithHelpers: 2, - lookup: 1, - invokeMustache: 3, - pushString: 1, - truthyOrFallback: 1, - functionOrFallback: 1, - invokeProgram: 3, - invokePartial: 1, - push: 1, - assignToHash: 1, - pushStringParam: 1 - }; - - Compiler.DISASSEMBLE_MAP = {}; - - for(var prop in Compiler.OPCODE_MAP) { - var value = Compiler.OPCODE_MAP[prop]; - Compiler.DISASSEMBLE_MAP[value] = prop; - } - - Compiler.multiParamSize = function(code) { - return Compiler.MULTI_PARAM_OPCODES[Compiler.DISASSEMBLE_MAP[code]]; - }; - - Compiler.prototype = { - compiler: Compiler, - - disassemble: function() { - var opcodes = this.opcodes, opcode, nextCode; - var out = [], str, name, value; - - for(var i=0, l=opcodes.length; i<l; i++) { - opcode = opcodes[i]; - - if(opcode === 'DECLARE') { - name = opcodes[++i]; - value = opcodes[++i]; - out.push("DECLARE " + name + " = " + value); - } else { - str = Compiler.DISASSEMBLE_MAP[opcode]; - - var extraParams = Compiler.multiParamSize(opcode); - var codes = []; - - for(var j=0; j<extraParams; j++) { - nextCode = opcodes[++i]; - - if(typeof nextCode === "string") { - nextCode = "\"" + nextCode.replace("\n", "\\n") + "\""; - } - - codes.push(nextCode); - } - - str = str + " " + codes.join(" "); - - out.push(str); - } - } - - return out.join("\n"); - }, - - guid: 0, - - compile: function(program, options) { - this.children = []; - this.depths = {list: []}; - this.options = options; - - // These changes will propagate to the other compiler components - var knownHelpers = this.options.knownHelpers; - this.options.knownHelpers = { - 'helperMissing': true, - 'blockHelperMissing': true, - 'each': true, - 'if': true, - 'unless': true, - 'with': true, - 'log': true - }; - if (knownHelpers) { - for (var name in knownHelpers) { - this.options.knownHelpers[name] = knownHelpers[name]; - } - } - - return this.program(program); - }, - - accept: function(node) { - return this[node.type](node); - }, - - program: function(program) { - var statements = program.statements, statement; - this.opcodes = []; - - for(var i=0, l=statements.length; i<l; i++) { - statement = statements[i]; - this[statement.type](statement); - } - this.isSimple = l === 1; - - this.depths.list = this.depths.list.sort(function(a, b) { - return a - b; - }); - - return this; - }, - - compileProgram: function(program) { - var result = new this.compiler().compile(program, this.options); - var guid = this.guid++; - - this.usePartial = this.usePartial || result.usePartial; - - this.children[guid] = result; - - for(var i=0, l=result.depths.list.length; i<l; i++) { - depth = result.depths.list[i]; - - if(depth < 2) { continue; } - else { this.addDepth(depth - 1); } - } - - return guid; - }, - - block: function(block) { - var mustache = block.mustache; - var depth, child, inverse, inverseGuid; - - var params = this.setupStackForMustache(mustache); - - var programGuid = this.compileProgram(block.program); - - if(block.program.inverse) { - inverseGuid = this.compileProgram(block.program.inverse); - this.declare('inverse', inverseGuid); - } - - this.opcode('invokeProgram', programGuid, params.length, !!mustache.hash); - this.declare('inverse', null); - this.opcode('append'); - }, - - inverse: function(block) { - var params = this.setupStackForMustache(block.mustache); - - var programGuid = this.compileProgram(block.program); - - this.declare('inverse', programGuid); - - this.opcode('invokeProgram', null, params.length, !!block.mustache.hash); - this.declare('inverse', null); - this.opcode('append'); - }, - - hash: function(hash) { - var pairs = hash.pairs, pair, val; - - this.opcode('push', '{}'); - - for(var i=0, l=pairs.length; i<l; i++) { - pair = pairs[i]; - val = pair[1]; - - this.accept(val); - this.opcode('assignToHash', pair[0]); - } - }, - - partial: function(partial) { - var id = partial.id; - this.usePartial = true; - - if(partial.context) { - this.ID(partial.context); - } else { - this.opcode('push', 'depth0'); - } - - this.opcode('invokePartial', id.original); - this.opcode('append'); - }, - - content: function(content) { - this.opcode('appendContent', content.string); - }, - - mustache: function(mustache) { - var params = this.setupStackForMustache(mustache); - - this.opcode('invokeMustache', params.length, mustache.id.original, !!mustache.hash); - - if(mustache.escaped && !this.options.noEscape) { - this.opcode('appendEscaped'); - } else { - this.opcode('append'); - } - }, - - ID: function(id) { - this.addDepth(id.depth); - - this.opcode('getContext', id.depth); - - this.opcode('lookupWithHelpers', id.parts[0] || null, id.isScoped || false); - - for(var i=1, l=id.parts.length; i<l; i++) { - this.opcode('lookup', id.parts[i]); - } - }, - - STRING: function(string) { - this.opcode('pushString', string.string); - }, - - INTEGER: function(integer) { - this.opcode('push', integer.integer); - }, - - BOOLEAN: function(bool) { - this.opcode('push', bool.bool); - }, - - comment: function() {}, - - // HELPERS - pushParams: function(params) { - var i = params.length, param; - - while(i--) { - param = params[i]; - - if(this.options.stringParams) { - if(param.depth) { - this.addDepth(param.depth); - } - - this.opcode('getContext', param.depth || 0); - this.opcode('pushStringParam', param.string); - } else { - this[param.type](param); - } - } - }, - - opcode: function(name, val1, val2, val3) { - this.opcodes.push(Compiler.OPCODE_MAP[name]); - if(val1 !== undefined) { this.opcodes.push(val1); } - if(val2 !== undefined) { this.opcodes.push(val2); } - if(val3 !== undefined) { this.opcodes.push(val3); } - }, - - declare: function(name, value) { - this.opcodes.push('DECLARE'); - this.opcodes.push(name); - this.opcodes.push(value); - }, - - addDepth: function(depth) { - if(depth === 0) { return; } - - if(!this.depths[depth]) { - this.depths[depth] = true; - this.depths.list.push(depth); - } - }, - - setupStackForMustache: function(mustache) { - var params = mustache.params; - - this.pushParams(params); - - if(mustache.hash) { - this.hash(mustache.hash); - } - - this.ID(mustache.id); - - return params; - } - }; - - JavaScriptCompiler.prototype = { - // PUBLIC API: You can override these methods in a subclass to provide - // alternative compiled forms for name lookup and buffering semantics - nameLookup: function(parent, name, type) { - if (/^[0-9]+$/.test(name)) { - return parent + "[" + name + "]"; - } else if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { - return parent + "." + name; - } - else { - return parent + "['" + name + "']"; - } - }, - - appendToBuffer: function(string) { - if (this.environment.isSimple) { - return "return " + string + ";"; - } else { - return "buffer += " + string + ";"; - } - }, - - initializeBuffer: function() { - return this.quotedString(""); - }, - - namespace: "Handlebars", - // END PUBLIC API - - compile: function(environment, options, context, asObject) { - this.environment = environment; - this.options = options || {}; - - this.name = this.environment.name; - this.isChild = !!context; - this.context = context || { - programs: [], - aliases: { self: 'this' }, - registers: {list: []} - }; - - this.preamble(); - - this.stackSlot = 0; - this.stackVars = []; - - this.compileChildren(environment, options); - - var opcodes = environment.opcodes, opcode; - - this.i = 0; - - for(l=opcodes.length; this.i<l; this.i++) { - opcode = this.nextOpcode(0); - - if(opcode[0] === 'DECLARE') { - this.i = this.i + 2; - this[opcode[1]] = opcode[2]; - } else { - this.i = this.i + opcode[1].length; - this[opcode[0]].apply(this, opcode[1]); - } - } - - return this.createFunctionContext(asObject); - }, - - nextOpcode: function(n) { - var opcodes = this.environment.opcodes, opcode = opcodes[this.i + n], name, val; - var extraParams, codes; - - if(opcode === 'DECLARE') { - name = opcodes[this.i + 1]; - val = opcodes[this.i + 2]; - return ['DECLARE', name, val]; - } else { - name = Compiler.DISASSEMBLE_MAP[opcode]; - - extraParams = Compiler.multiParamSize(opcode); - codes = []; - - for(var j=0; j<extraParams; j++) { - codes.push(opcodes[this.i + j + 1 + n]); - } - - return [name, codes]; - } - }, - - eat: function(opcode) { - this.i = this.i + opcode.length; - }, - - preamble: function() { - var out = []; - - // this register will disambiguate helper lookup from finding a function in - // a context. This is necessary for mustache compatibility, which requires - // that context functions in blocks are evaluated by blockHelperMissing, and - // then proceed as if the resulting value was provided to blockHelperMissing. - this.useRegister('foundHelper'); - - if (!this.isChild) { - var namespace = this.namespace; - var copies = "helpers = helpers || " + namespace + ".helpers;"; - if(this.environment.usePartial) { copies = copies + " partials = partials || " + namespace + ".partials;"; } - out.push(copies); - } else { - out.push(''); - } - - if (!this.environment.isSimple) { - out.push(", buffer = " + this.initializeBuffer()); - } else { - out.push(""); - } - - // track the last context pushed into place to allow skipping the - // getContext opcode when it would be a noop - this.lastContext = 0; - this.source = out; - }, - - createFunctionContext: function(asObject) { - var locals = this.stackVars; - if (!this.isChild) { - locals = locals.concat(this.context.registers.list); - } - - if(locals.length > 0) { - this.source[1] = this.source[1] + ", " + locals.join(", "); - } - - // Generate minimizer alias mappings - if (!this.isChild) { - var aliases = [] - for (var alias in this.context.aliases) { - this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias]; - } - } - - if (this.source[1]) { - this.source[1] = "var " + this.source[1].substring(2) + ";"; - } - - // Merge children - if (!this.isChild) { - this.source[1] += '\n' + this.context.programs.join('\n') + '\n'; - } - - if (!this.environment.isSimple) { - this.source.push("return buffer;"); - } - - var params = this.isChild ? ["depth0", "data"] : ["Handlebars", "depth0", "helpers", "partials", "data"]; - - for(var i=0, l=this.environment.depths.list.length; i<l; i++) { - params.push("depth" + this.environment.depths.list[i]); - } - - if (asObject) { - params.push(this.source.join("\n ")); - - return Function.apply(this, params); - } else { - var functionSource = 'function ' + (this.name || '') + '(' + params.join(',') + ') {\n ' + this.source.join("\n ") + '}'; - Handlebars.log(Handlebars.logger.DEBUG, functionSource + "\n\n"); - return functionSource; - } - }, - - appendContent: function(content) { - this.source.push(this.appendToBuffer(this.quotedString(content))); - }, - - append: function() { - var local = this.popStack(); - this.source.push("if(" + local + " || " + local + " === 0) { " + this.appendToBuffer(local) + " }"); - if (this.environment.isSimple) { - this.source.push("else { " + this.appendToBuffer("''") + " }"); - } - }, - - appendEscaped: function() { - var opcode = this.nextOpcode(1), extra = ""; - this.context.aliases.escapeExpression = 'this.escapeExpression'; - - if(opcode[0] === 'appendContent') { - extra = " + " + this.quotedString(opcode[1][0]); - this.eat(opcode); - } - - this.source.push(this.appendToBuffer("escapeExpression(" + this.popStack() + ")" + extra)); - }, - - getContext: function(depth) { - if(this.lastContext !== depth) { - this.lastContext = depth; - } - }, - - lookupWithHelpers: function(name, isScoped) { - if(name) { - var topStack = this.nextStack(); - - this.usingKnownHelper = false; - - var toPush; - if (!isScoped && this.options.knownHelpers[name]) { - toPush = topStack + " = " + this.nameLookup('helpers', name, 'helper'); - this.usingKnownHelper = true; - } else if (isScoped || this.options.knownHelpersOnly) { - toPush = topStack + " = " + this.nameLookup('depth' + this.lastContext, name, 'context'); - } else { - this.register('foundHelper', this.nameLookup('helpers', name, 'helper')); - toPush = topStack + " = foundHelper || " + this.nameLookup('depth' + this.lastContext, name, 'context'); - } - - toPush += ';'; - this.source.push(toPush); - } else { - this.pushStack('depth' + this.lastContext); - } - }, - - lookup: function(name) { - var topStack = this.topStack(); - this.source.push(topStack + " = (" + topStack + " === null || " + topStack + " === undefined || " + topStack + " === false ? " + - topStack + " : " + this.nameLookup(topStack, name, 'context') + ");"); - }, - - pushStringParam: function(string) { - this.pushStack('depth' + this.lastContext); - this.pushString(string); - }, - - pushString: function(string) { - this.pushStack(this.quotedString(string)); - }, - - push: function(name) { - this.pushStack(name); - }, - - invokeMustache: function(paramSize, original, hasHash) { - this.populateParams(paramSize, this.quotedString(original), "{}", null, hasHash, function(nextStack, helperMissingString, id) { - if (!this.usingKnownHelper) { - this.context.aliases.helperMissing = 'helpers.helperMissing'; - this.context.aliases.undef = 'void 0'; - this.source.push("else if(" + id + "=== undef) { " + nextStack + " = helperMissing.call(" + helperMissingString + "); }"); - if (nextStack !== id) { - this.source.push("else { " + nextStack + " = " + id + "; }"); - } - } - }); - }, - - invokeProgram: function(guid, paramSize, hasHash) { - var inverse = this.programExpression(this.inverse); - var mainProgram = this.programExpression(guid); - - this.populateParams(paramSize, null, mainProgram, inverse, hasHash, function(nextStack, helperMissingString, id) { - if (!this.usingKnownHelper) { - this.context.aliases.blockHelperMissing = 'helpers.blockHelperMissing'; - this.source.push("else { " + nextStack + " = blockHelperMissing.call(" + helperMissingString + "); }"); - } - }); - }, - - populateParams: function(paramSize, helperId, program, inverse, hasHash, fn) { - var needsRegister = hasHash || this.options.stringParams || inverse || this.options.data; - var id = this.popStack(), nextStack; - var params = [], param, stringParam, stringOptions; - - if (needsRegister) { - this.register('tmp1', program); - stringOptions = 'tmp1'; - } else { - stringOptions = '{ hash: {} }'; - } - - if (needsRegister) { - var hash = (hasHash ? this.popStack() : '{}'); - this.source.push('tmp1.hash = ' + hash + ';'); - } - - if(this.options.stringParams) { - this.source.push('tmp1.contexts = [];'); - } - - for(var i=0; i<paramSize; i++) { - param = this.popStack(); - params.push(param); - - if(this.options.stringParams) { - this.source.push('tmp1.contexts.push(' + this.popStack() + ');'); - } - } - - if(inverse) { - this.source.push('tmp1.fn = tmp1;'); - this.source.push('tmp1.inverse = ' + inverse + ';'); - } - - if(this.options.data) { - this.source.push('tmp1.data = data;'); - } - - params.push(stringOptions); - - this.populateCall(params, id, helperId || id, fn, program !== '{}'); - }, - - populateCall: function(params, id, helperId, fn, program) { - var paramString = ["depth0"].concat(params).join(", "); - var helperMissingString = ["depth0"].concat(helperId).concat(params).join(", "); - - var nextStack = this.nextStack(); - - if (this.usingKnownHelper) { - this.source.push(nextStack + " = " + id + ".call(" + paramString + ");"); - } else { - this.context.aliases.functionType = '"function"'; - var condition = program ? "foundHelper && " : "" - this.source.push("if(" + condition + "typeof " + id + " === functionType) { " + nextStack + " = " + id + ".call(" + paramString + "); }"); - } - fn.call(this, nextStack, helperMissingString, id); - this.usingKnownHelper = false; - }, - - invokePartial: function(context) { - params = [this.nameLookup('partials', context, 'partial'), "'" + context + "'", this.popStack(), "helpers", "partials"]; - - if (this.options.data) { - params.push("data"); - } - - this.pushStack("self.invokePartial(" + params.join(", ") + ");"); - }, - - assignToHash: function(key) { - var value = this.popStack(); - var hash = this.topStack(); - - this.source.push(hash + "['" + key + "'] = " + value + ";"); - }, - - // HELPERS - - compiler: JavaScriptCompiler, - - compileChildren: function(environment, options) { - var children = environment.children, child, compiler; - - for(var i=0, l=children.length; i<l; i++) { - child = children[i]; - compiler = new this.compiler(); - - this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children - var index = this.context.programs.length; - child.index = index; - child.name = 'program' + index; - this.context.programs[index] = compiler.compile(child, options, this.context); - } - }, - - programExpression: function(guid) { - if(guid == null) { return "self.noop"; } - - var child = this.environment.children[guid], - depths = child.depths.list; - var programParams = [child.index, child.name, "data"]; - - for(var i=0, l = depths.length; i<l; i++) { - depth = depths[i]; - - if(depth === 1) { programParams.push("depth0"); } - else { programParams.push("depth" + (depth - 1)); } - } - - if(depths.length === 0) { - return "self.program(" + programParams.join(", ") + ")"; - } else { - programParams.shift(); - return "self.programWithDepth(" + programParams.join(", ") + ")"; - } - }, - - register: function(name, val) { - this.useRegister(name); - this.source.push(name + " = " + val + ";"); - }, - - useRegister: function(name) { - if(!this.context.registers[name]) { - this.context.registers[name] = true; - this.context.registers.list.push(name); - } - }, - - pushStack: function(item) { - this.source.push(this.nextStack() + " = " + item + ";"); - return "stack" + this.stackSlot; - }, - - nextStack: function() { - this.stackSlot++; - if(this.stackSlot > this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); } - return "stack" + this.stackSlot; - }, - - popStack: function() { - return "stack" + this.stackSlot--; - }, - - topStack: function() { - return "stack" + this.stackSlot; - }, - - quotedString: function(str) { - return '"' + str - .replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') + '"'; - } - }; - - var reservedWords = ( - "break else new var" + - " case finally return void" + - " catch for switch while" + - " continue function this with" + - " default if throw" + - " delete in try" + - " do instanceof typeof" + - " abstract enum int short" + - " boolean export interface static" + - " byte extends long super" + - " char final native synchronized" + - " class float package throws" + - " const goto private transient" + - " debugger implements protected volatile" + - " double import public let yield" - ).split(" "); - - var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; - - for(var i=0, l=reservedWords.length; i<l; i++) { - compilerWords[reservedWords[i]] = true; - } - - JavaScriptCompiler.isValidJavaScriptVariableName = function(name) { - if(!JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(name)) { - return true; - } - return false; - } - -})(Handlebars.Compiler, Handlebars.JavaScriptCompiler); - -Handlebars.precompile = function(string, options) { - options = options || {}; - - var ast = Handlebars.parse(string); - var environment = new Handlebars.Compiler().compile(ast, options); - return new Handlebars.JavaScriptCompiler().compile(environment, options); -}; - -Handlebars.compile = function(string, options) { - options = options || {}; - - var compiled; - function compile() { - var ast = Handlebars.parse(string); - var environment = new Handlebars.Compiler().compile(ast, options); - var templateSpec = new Handlebars.JavaScriptCompiler().compile(environment, options, undefined, true); - return Handlebars.template(templateSpec); - } - - // Template is only compiled on first use and cached after that point. - return function(context, options) { - if (!compiled) { - compiled = compile(); - } - return compiled.call(this, context, options); - }; -}; -; -// lib/handlebars/runtime.js -Handlebars.VM = { - template: function(templateSpec) { - // Just add water - var container = { - escapeExpression: Handlebars.Utils.escapeExpression, - invokePartial: Handlebars.VM.invokePartial, - programs: [], - program: function(i, fn, data) { - var programWrapper = this.programs[i]; - if(data) { - return Handlebars.VM.program(fn, data); - } else if(programWrapper) { - return programWrapper; - } else { - programWrapper = this.programs[i] = Handlebars.VM.program(fn); - return programWrapper; - } - }, - programWithDepth: Handlebars.VM.programWithDepth, - noop: Handlebars.VM.noop - }; - - return function(context, options) { - options = options || {}; - return templateSpec.call(container, Handlebars, context, options.helpers, options.partials, options.data); - }; - }, - - programWithDepth: function(fn, data, $depth) { - var args = Array.prototype.slice.call(arguments, 2); - - return function(context, options) { - options = options || {}; - - return fn.apply(this, [context, options.data || data].concat(args)); - }; - }, - program: function(fn, data) { - return function(context, options) { - options = options || {}; - - return fn(context, options.data || data); - }; - }, - noop: function() { return ""; }, - invokePartial: function(partial, name, context, helpers, partials, data) { - options = { helpers: helpers, partials: partials, data: data }; - - if(partial === undefined) { - throw new Handlebars.Exception("The partial " + name + " could not be found"); - } else if(partial instanceof Function) { - return partial(context, options); - } else if (!Handlebars.compile) { - throw new Handlebars.Exception("The partial " + name + " could not be compiled when running in runtime-only mode"); - } else { - partials[name] = Handlebars.compile(partial); - return partials[name](context, options); - } - } -}; - -Handlebars.template = Handlebars.VM.template; -; diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/mvc/history.js --- a/static/scripts/mvc/history.js +++ b/static/scripts/mvc/history.js @@ -3,34 +3,33 @@ TODO: replicate then refactor (could be the wrong order) - History meta controls (rename, annotate, etc. - see history.js.120823.bak) - choose a templating system and use it consistently - HIview state transitions (eg. upload -> ok), curr: build new, delete old, place new (in render) - events (local/ui and otherwise) - widget building (popupmenu, etc.) - localization - incorporate relations - convert function comments to /** style - complete comments + + fix: + tags + annotations + _render_displayApps + _render_downloadButton + widget building (popupmenu, etc.) don't draw body until it's first unhide event - - as always: where does the model end and the view begin? - HistoryPanel + all history.mako js -> this + HIview state transitions (eg. upload -> ok), curr: build new, delete old, place new (in render) + History (meta controls : collapse all, rename, annotate, etc. - see history.js.120823.bak) + events (local/ui and otherwise) HistoryCollection: (collection of History: 'Saved Histories') - CASES: - logged-in/NOT - show-deleted/DONT - - ?? anyway to _clone_ base HistoryItemView instead of creating a new one each time? + ?move IconButtonViews -> templates? + + convert function comments to jsDoc style, complete comments + collection -> show_deleted, show_hidden + poly HistoryItemView on: for_editing, display_structured, trans.user + incorporate relations? + localization + template helper {{#local}} calls _l() move inline styles into base.less add classes, ids on empty divs - localized text from template watch the magic strings - - poly HistoryItemView on: can/cant_edit */ //============================================================================== @@ -121,6 +120,12 @@ initialize : function(){ this.log( this + '.initialize', this.attributes ); this.log( '\tparent history_id: ' + this.get( 'history_id' ) ); + + //TODO: accessible is set in alt_hist + // this state is not in trans.app.model.Dataset.states - set it here + if( !this.get( 'accessible' ) ){ + this.set( 'state', HistoryItem.STATES.NOT_VIEWABLE ); + } }, isEditable : function(){ @@ -148,14 +153,15 @@ //------------------------------------------------------------------------------ HistoryItem.STATES = { - NEW : 'new', - UPLOAD : 'upload', - QUEUED : 'queued', - RUNNING : 'running', - OK : 'ok', - EMPTY : 'empty', - ERROR : 'error', - DISCARDED : 'discarded', + NOT_VIEWABLE : 'not_viewable', // not in trans.app.model.Dataset.states + NEW : 'new', + UPLOAD : 'upload', + QUEUED : 'queued', + RUNNING : 'running', + OK : 'ok', + EMPTY : 'empty', + ERROR : 'error', + DISCARDED : 'discarded', SETTING_METADATA : 'setting_metadata', FAILED_METADATA : 'failed_metadata' }; @@ -175,13 +181,11 @@ // ................................................................................ SET UP initialize : function(){ this.log( this + '.initialize:', this, this.model ); - }, // ................................................................................ RENDER MAIN //??: this style builds an entire, new DOM tree - is that what we want?? render : function(){ - this.log( this + '.model:', this.model ); var id = this.model.get( 'id' ), state = this.model.get( 'state' ); this.clearReferences(); @@ -214,6 +218,7 @@ clearReferences : function(){ //??TODO: best way? + //?? do we really need these - not so far this.displayButton = null; this.editButton = null; this.deleteButton = null; @@ -235,7 +240,7 @@ return titleBar; }, - // ................................................................................ DISPLAY, EDIT ATTR, DELETE + // ................................................................................ display, edit attr, delete _render_titleButtons : function(){ // render the display, edit attr and delete icon-buttons var buttonDiv = $( '<div class="historyItemButtons"></div>' ); @@ -245,11 +250,7 @@ return buttonDiv; }, - //TODO: refactor the following three - use extend for new href (with model data or something else) - //TODO: move other data (non-href) into {} in view definition, cycle over those keys in _titlebuttons - //TODO: move disabled span data into view def, move logic into _titlebuttons _render_displayButton : function(){ - // don't show display while uploading if( this.model.get( 'state' ) === HistoryItem.STATES.UPLOAD ){ return null; } @@ -257,21 +258,20 @@ displayBtnData = ( this.model.get( 'purged' ) )?({ title : 'Cannot display datasets removed from disk', enabled : false, - icon_class : 'display', + icon_class : 'display' // if not, render the display icon-button with href }):({ title : 'Display data in browser', href : this.model.get( 'display_url' ), target : ( this.model.get( 'for_editing' ) )?( 'galaxy_main' ):( null ), - icon_class : 'display', + icon_class : 'display' }); this.displayButton = new IconButtonView({ model : new IconButton( displayBtnData ) }); return this.displayButton.render().$el; }, _render_editButton : function(){ - // don't show edit while uploading, or if editable if( ( this.model.get( 'state' ) === HistoryItem.STATES.UPLOAD ) || ( !this.model.get( 'for_editing' ) ) ){ @@ -306,29 +306,266 @@ // don't show delete if not editable if( !this.model.get( 'for_editing' ) ){ return null; } - var deleteBtnData = ( this.model.get( 'delete_url' ) )?({ + var deleteBtnData = { title : 'Delete', href : this.model.get( 'delete_url' ), target : 'galaxy_main', id : 'historyItemDeleter-' + this.model.get( 'id' ), icon_class : 'delete' - }):({ - title : 'Dataset is already deleted', - icon_class : 'delete', - enabled : false - }); + }; + if( ( this.model.get( 'deleted' ) || this.model.get( 'purged' ) ) + && ( !this.model.get( 'delete_url' ) ) ){ + deleteBtnData = { + title : 'Dataset is already deleted', + icon_class : 'delete', + enabled : false + }; + } this.deleteButton = new IconButtonView({ model : new IconButton( deleteBtnData ) }); return this.deleteButton.render().$el; }, + // ................................................................................ titleLink _render_titleLink : function(){ - this.log( 'model:', this.model.toJSON() ); return $( jQuery.trim( HistoryItemView.templates.titleLink( this.model.toJSON() ) ) ); }, // ................................................................................ RENDER BODY + _render_hdaSummary : function(){ + var modelData = this.model.toJSON(); + // if there's no dbkey and it's editable : pass a flag to the template to render a link to editing in the '?' + if( this.model.get( 'metadata_dbkey' ) === '?' + && this.model.isEditable() ){ + _.extend( modelData, { dbkey_unknown_and_editable : true }); + } + return HistoryItemView.templates.hdaSummary( modelData ); + }, + + // ................................................................................ primary actions + _render_primaryActionButtons : function( buttonRenderingFuncs ){ + var primaryActionButtons = $( '<div/>' ), + view = this; + _.each( buttonRenderingFuncs, function( fn ){ + primaryActionButtons.append( fn.call( view ) ); + }); + return primaryActionButtons; + }, + + _render_downloadButton : function(){ + // return either: a single download icon-button (if there are no meta files) + // or a popupmenu with links to download assoc. meta files (if there are meta files) + + // don't show anything if the data's been purged + if( this.model.get( 'purged' ) ){ return null; } + + var downloadLink = linkHTMLTemplate({ + title : 'Download', + href : this.model.get( 'download_url' ), + classes : [ 'icon-button', 'tooltip', 'disk' ] + }); + + // if no metafiles, return only the main download link + var download_meta_urls = this.model.get( 'download_meta_urls' ); + if( !download_meta_urls ){ + return downloadLink; + } + + // build the popupmenu for downloading main, meta files + var popupmenu = $( '<div popupmenu="dataset-' + this.model.get( 'id' ) + '-popup"></div>' ); + popupmenu.append( linkHTMLTemplate({ + text : 'Download Dataset', + title : 'Download', + href : this.model.get( 'download_url' ), + classes : [ 'icon-button', 'tooltip', 'disk' ] + })); + popupmenu.append( '<a>Additional Files</a>' ); + for( file_type in download_meta_urls ){ + popupmenu.append( linkHTMLTemplate({ + text : 'Download ' + file_type, + href : download_meta_urls[ file_type ], + classes : [ 'action-button' ] + })); + } + var menuButton = $( ( '<div style="float:left;" class="menubutton split popup"' + + ' id="dataset-${dataset_id}-popup"></div>' ) ); + menuButton.append( downloadLink ); + popupmenu.append( menuButton ); + return popupmenu; + }, + + //NOTE: button renderers have the side effect of caching their IconButtonViews to this view + _render_errButton : function(){ + if( ( this.model.get( 'state' ) !== HistoryItem.STATES.ERROR ) + || ( !this.model.get( 'for_editing' ) ) ){ return null; } + + this.errButton = new IconButtonView({ model : new IconButton({ + title : 'View or report this error', + href : this.model.get( 'report_error_url' ), + target : 'galaxy_main', + icon_class : 'bug' + })}); + return this.errButton.render().$el; + }, + + _render_showParamsButton : function(){ + // gen. safe to show in all cases + this.showParamsButton = new IconButtonView({ model : new IconButton({ + title : 'View details', + href : this.model.get( 'show_params_url' ), + target : 'galaxy_main', + icon_class : 'information' + }) }); + return this.showParamsButton.render().$el; + }, + + _render_rerunButton : function(){ + if( !this.model.get( 'for_editing' ) ){ return null; } + this.rerunButton = new IconButtonView({ model : new IconButton({ + title : 'Run this job again', + href : this.model.get( 'rerun_url' ), + target : 'galaxy_main', + icon_class : 'arrow-circle' + }) }); + return this.rerunButton.render().$el; + }, + + _render_tracksterButton : function(){ + var trackster_urls = this.model.get( 'trackster_urls' ); + if( !( this.model.hasData() ) + || !( this.model.get( 'for_editing' ) ) + || !( trackster_urls ) ){ return null; } + + this.tracksterButton = new IconButtonView({ model : new IconButton({ + title : 'View in Trackster', + icon_class : 'chart_curve' + })}); + this.errButton.render(); //?? needed? + this.errButton.$el.addClass( 'trackster-add' ).attr({ + 'data-url' : trackster_urls[ 'data-url' ], + 'action-url': trackster_urls[ 'action-url' ], + 'new-url' : trackster_urls[ 'new-url' ] + }); + return this.errButton.$el; + }, + + // ................................................................................ secondary actions + _render_secondaryActionButtons : function( buttonRenderingFuncs ){ + // move to the right (same level as primary) + var secondaryActionButtons = $( '<div style="float: right;"></div>' ), + view = this; + _.each( buttonRenderingFuncs, function( fn ){ + secondaryActionButtons.append( fn.call( view ) ); + }); + return secondaryActionButtons; + }, + + _render_tagButton : function(){ + if( !( this.model.hasData() ) + || !( this.model.get( 'for_editing' ) ) + || ( !this.model.get( 'retag_url' ) ) ){ return null; } + + this.tagButton = new IconButtonView({ model : new IconButton({ + title : 'Edit dataset tags', + target : 'galaxy_main', + href : this.model.get( 'retag_url' ), + icon_class : 'tags' + })}); + return this.tagButton.render().$el; + }, + + _render_annotateButton : function(){ + if( !( this.model.hasData() ) + || !( this.model.get( 'for_editing' ) ) + || ( !this.model.get( 'annotate_url' ) ) ){ return null; } + + this.annotateButton = new IconButtonView({ model : new IconButton({ + title : 'Edit dataset annotation', + target : 'galaxy_main', + href : this.model.get( 'annotate_url' ), + icon_class : 'annotate' + })}); + return this.annotateButton.render().$el; + }, + + // ................................................................................ other elements + _render_tagArea : function(){ + if( this.model.get( 'retag_url' ) ){ return null; } + //TODO: move to mvc/tags.js + return $( HistoryItemView.templates.tagArea( this.model.toJSON() ) ); + }, + + _render_annotationArea : function(){ + if( !this.model.get( 'annotate_url' ) ){ return null; } + //TODO: move to mvc/annotations.js + return $( HistoryItemView.templates.annotationArea( this.model.toJSON() ) ); + }, + + _render_displayApps : function(){ + if( !this.model.get( 'display_apps' ) ){ return null; } + var displayApps = this.model.get( 'displayApps' ), + displayAppsDiv = $( '<div/>' ), + displayAppSpan = $( '<span/>' ); + + this.log( this + 'displayApps:', displayApps ); + ////TODO: grrr...somethings not in the right scope here + //for( app_name in displayApps ){ + // //TODO: to template + // var display_app = displayApps[ app_name ], + // display_app_HTML = app_name + ' '; + // for( location_name in display_app ){ + // display_app_HTML += linkHTMLTemplate({ + // text : location_name, + // href : display_app[ location_name ].url, + // target : display_app[ location_name ].target + // }) + ' '; + // } + // display_app_span.append( display_app_HTML ); + //} + //displayAppsDiv.append( display_app_span ); + + //displayAppsDiv.append( '<br />' ); + + //var display_appsDiv = $( '<div/>' ); + //if( this.model.get( 'display_apps' ) ){ + // + // var display_apps = this.model.get( 'display_apps' ), + // display_app_span = $( '<span/>' ); + // + // //TODO: grrr...somethings not in the right scope here + // for( app_name in display_apps ){ + // //TODO: to template + // var display_app = display_apps[ app_name ], + // display_app_HTML = app_name + ' '; + // for( location_name in display_app ){ + // display_app_HTML += linkHTMLTemplate({ + // text : location_name, + // href : display_app[ location_name ].url, + // target : display_app[ location_name ].target + // }) + ' '; + // } + // display_app_span.append( display_app_HTML ); + // } + // display_appsDiv.append( display_app_span ); + //} + ////display_appsDiv.append( '<br />' ); + //parent.append( display_appsDiv ); + return displayAppsDiv; + }, + + _render_peek : function(){ + if( !this.model.get( 'peek' ) ){ return null; } + return $( '<div/>' ).append( + $( '<pre/>' ) + .attr( 'id', 'peek' + this.model.get( 'id' ) ) + .addClass( 'peek' ) + .append( this.model.get( 'peek' ) ) + ); + }, + + // ................................................................................ state body renderers // _render_body fns for the various states _render_body_not_viewable : function( parent ){ + //TODO: revisit - still showing display, edit, delete (as common) - that CAN'T be right parent.append( $( '<div>You do not have permission to view dataset.</div>' ) ); }, @@ -338,12 +575,18 @@ _render_body_queued : function( parent ){ parent.append( $( '<div>Job is waiting to run.</div>' ) ); - parent.append( this._render_showParamsAndRerun() ); + parent.append( this._render_primaryActionButtons([ + this._render_showParamsButton, + this._render_rerunButton + ])); }, _render_body_running : function( parent ){ parent.append( '<div>Job is currently running.</div>' ); - parent.append( this._render_showParamsAndRerun() ); + parent.append( this._render_primaryActionButtons([ + this._render_showParamsButton, + this._render_rerunButton + ])); }, _render_body_error : function( parent ){ @@ -352,31 +595,20 @@ } parent.append( ( 'An error occurred running this job: ' + '<i>' + $.trim( this.model.get( 'misc_info' ) ) + '</i>' ) ); - - var actionBtnDiv = $( this._render_showParamsAndRerun() ); - // bug report button - //NOTE: these are shown _before_ info, rerun so use _prepend_ - if( this.model.get( 'for_editing' ) ){ - //TODO??: save to view 'this.errButton' - this.errButton = new IconButtonView({ model : new IconButton({ - title : 'View or report this error', - href : this.model.get( 'report_error_url' ), - target : 'galaxy_main', - icon_class : 'bug' - })}); - actionBtnDiv.prepend( this.errButton.render().$el ); - } - if( this.model.hasData() ){ - //TODO: render_download_links( data, dataset_id ) - // download dropdown - actionBtnDiv.prepend( this._render_downloadLinks() ); - } - parent.append( actionBtnDiv ); + parent.append( this._render_primaryActionButtons([ + this._render_downloadButton, + this._render_errButton, + this._render_showParamsButton, + this._render_rerunButton + ])); }, _render_body_discarded : function( parent ){ parent.append( '<div>The job creating this dataset was cancelled before completion.</div>' ); - parent.append( this._render_showParamsAndRerun() ); + parent.append( this._render_primaryActionButtons([ + this._render_showParamsButton, + this._render_rerunButton + ])); }, _render_body_setting_metadata : function( parent ){ @@ -387,150 +619,46 @@ //TODO: replace i with dataset-misc-info class //?? why are we showing the file size when we know it's zero?? parent.append( $( '<div>No data: <i>' + this.model.get( 'misc_blurb' ) + '</i></div>' ) ); - parent.append( this._render_showParamsAndRerun() ); + parent.append( this._render_primaryActionButtons([ + this._render_showParamsButton, + this._render_rerunButton + ])); }, _render_body_failed_metadata : function( parent ){ - // add a message box about the failure at the top of the body, then... - var warningMsgText = 'An error occurred setting the metadata for this dataset.'; - if( this.model.isEditable() ){ - var editLink = linkHTMLTemplate({ - text : 'set it manually or retry auto-detection', - href : this.model.get( 'edit_url' ), - target : 'galaxy_main' - }); - warningMsgText += 'You may be able to ' + editLink + '.'; - } - parent.append( $( HistoryItemView.templates.warningMsg({ warning: warningMsgText }) ) ); - - //...render the remaining body as STATES.OK (only diff between these states is the box above) + //TODO: the css for this box is broken (unlike the others) + // add a message box about the failure at the top of the body... + parent.append( $( HistoryItemView.templates.failedMetadata( this.model.toJSON() ) ) ); + //...then render the remaining body as STATES.OK (only diff between these states is the box above) this._render_body_ok( parent ); }, _render_body_ok : function( parent ){ // most common state renderer and the most complicated - - // build the summary info (using template and dbkey data) parent.append( this._render_hdaSummary() ); - if( this.model.get( 'misc_info' ) ){ - parent.append( $( '<div class="info">Info: ' + this.model.get( 'misc_info' ) + '</div>' ) ); - } + parent.append( this._render_primaryActionButtons([ + this._render_downloadButton, + this._render_errButton, + this._render_showParamsButton, + this._render_rerunButton + ])); + parent.append( this._render_secondaryActionButtons([ + this._render_tagButton, + this._render_annotateButton + ])); + parent.append( '<div class="clear"/>' ); - // hasData - if( this.model.hasData() ){ - var actionBtnDiv = $( '<div/>' ); - - // render download links, show_params - actionBtnDiv.append( this._render_downloadLinks() ); - actionBtnDiv.append( $( linkHTMLTemplate({ - title : 'View details', - href : this.model.get( 'show_params_url' ), - target : 'galaxy_main', - classes : [ 'icon-button', 'tooltip', 'information' ] - }))); - - // if for_editing - if( this.model.get( 'for_editing' ) ){ - - // rerun - actionBtnDiv.append( $( linkHTMLTemplate({ - title : 'Run this job again', - href : this.model.get( 'rerun_url' ), - target : 'galaxy_main', - classes : [ 'icon-button', 'tooltip', 'arrow-circle' ] - }))); - - if( this.model.get( 'trackster_urls' ) ){ - // link to trackster - var trackster_urls = this.model.get( 'trackster_urls' ); - actionBtnDiv.append( $( linkHTMLTemplate({ - title : 'View in Trackster', - href : "javascript:void(0)", - classes : [ 'icon-button', 'tooltip', 'chart_curve', 'trackster-add' ], - // prob just _.extend - 'data-url' : trackster_urls[ 'data-url' ], - 'action-url': trackster_urls[ 'action-url' ], - 'new-url' : trackster_urls[ 'new-url' ] - }))); - } - - // if trans.user - if( this.model.get( 'retag_url' ) && this.model.get( 'annotate_url' ) ){ - // tag, annotate buttons - //TODO: move to tag, Annot MV - var tagsAnnotationsBtns = $( '<div style="float: right;"></div>' ); - tagsAnnotationsBtns.append( $( linkHTMLTemplate({ - title : 'Edit dataset tags', - target : 'galaxy_main', - href : this.model.get( 'retag_url' ), - classes : [ 'icon-button', 'tooltip', 'tags' ] - }))); - tagsAnnotationsBtns.append( $( linkHTMLTemplate({ - title : 'Edit dataset annotation', - target : 'galaxy_main', - href : this.model.get( 'annotation_url' ), - classes : [ 'icon-button', 'tooltip', 'annotate' ] - }))); - actionBtnDiv.append( tagsAnnotationsBtns ); - actionBtnDiv.append( '<div style="clear: both"></div>' ); - - // tag/annot display areas - this.tagArea = $( '<div class="tag-area" style="display: none">' ); - this.tagArea.append( '<strong>Tags:</strong>' ); - this.tagElt = $( '<div class="tag-elt"></div>' ); - actionBtnDiv.append( this.tagArea.append( this.tagElt ) ); - - var annotationArea = $( ( '<div id="${dataset_id}-annotation-area"' - + ' class="annotation-area" style="display: none">' ) ); - this.annotationArea = annotationArea; - annotationArea.append( '<strong>Annotation:</strong>' ); - this.annotationElem = $( '<div id="' + this.model.get( 'id' ) + '-annotation-elt" ' - + 'style="margin: 1px 0px 1px 0px" class="annotation-elt tooltip editable-text" ' - + 'title="Edit dataset annotation"></div>' ); - annotationArea.append( this.annotationElem ); - actionBtnDiv.append( annotationArea ); - } - } - // clear div - actionBtnDiv.append( '<div style="clear: both;"></div>' ); - parent.append( actionBtnDiv ); - - var display_appsDiv = $( '<div/>' ); - if( this.model.get( 'display_apps' ) ){ - var display_apps = this.model.get( 'display_apps' ), - display_app_span = $( '<span/>' ); - - //TODO: grrr...somethings not in the right scope here - for( app_name in display_apps ){ - //TODO: to template - var display_app = display_apps[ app_name ], - display_app_HTML = app_name + ' '; - for( location_name in display_app ){ - display_app_HTML += linkHTMLTemplate({ - text : location_name, - href : display_app[ location_name ].url, - target : display_app[ location_name ].target - }) + ' '; - } - display_app_span.append( display_app_HTML ); - } - display_appsDiv.append( display_app_span ); - } - //display_appsDiv.append( '<br />' ); - parent.append( display_appsDiv ); + parent.append( this._render_tagArea() ); + parent.append( this._render_annotationArea() ); - } else if( this.model.get( 'for_editing' ) ){ - parent.append( this._render_showParamsAndRerun() ); - } - + parent.append( this._render_displayApps() ); parent.append( this._render_peek() ); }, _render_body : function(){ //this.log( this + '_render_body' ); - var state = this.model.get( 'state' ), - for_editing = this.model.get( 'for_editing' ); + var state = this.model.get( 'state' ); //this.log( 'state:', state, 'for_editing', for_editing ); //TODO: incorrect id (encoded - use hid?) @@ -539,6 +667,7 @@ .addClass( 'historyItemBody' ) .attr( 'style', 'display: block' ); + //TODO: not a fan of this switch( state ){ case HistoryItem.STATES.NOT_VIEWABLE : this._render_body_not_viewable( body ); @@ -582,92 +711,6 @@ return body; }, - _render_hdaSummary : function(){ - var modelData = this.model.toJSON(); - - // if there's no dbkey and it's editable : pass a flag to the template to render a link to editing in the '?' - if( this.model.get( 'metadata_dbkey' ) === '?' - && this.model.isEditable() ){ - _.extend( modelData, { dbkey_unknown_and_editable : true }); - } - return HistoryItemView.templates.hdaSummary( modelData ); - }, - - _render_showParamsAndRerun : function(){ - //TODO??: generalize to _render_actionButtons, pass in list of 'buttons' to render, default to these two - var actionBtnDiv = $( '<div/>' ); - - this.showParamsButton = new IconButtonView({ model : new IconButton({ - title : 'View details', - href : this.model.get( 'show_params_url' ), - target : 'galaxy_main', - icon_class : 'information' - }) }); - actionBtnDiv.append( this.showParamsButton.render().$el ); - - if( this.model.get( 'for_editing' ) ){ - this.rerunButton = new IconButtonView({ model : new IconButton({ - title : 'Run this job again', - href : this.model.get( 'rerun_url' ), - target : 'galaxy_main', - icon_class : 'arrow-circle' - }) }); - } - return actionBtnDiv; - }, - - _render_downloadLinks : function(){ - // return either: a single download icon-button (if there are no meta files) - // or a popupmenu with links to download assoc. meta files (if there are meta files) - - // don't show anything if the data's been purged - if( this.model.get( 'purged' ) ){ return null; } - - var downloadLink = linkHTMLTemplate({ - title : 'Download', - href : this.model.get( 'download_url' ), - classes : [ 'icon-button', 'tooltip', 'disk' ] - }); - - // if no metafiles, return only the main download link - var download_meta_urls = this.model.get( 'download_meta_urls' ); - if( !download_meta_urls ){ - return downloadLink; - } - - // build the popupmenu for downloading main, meta files - var popupmenu = $( '<div popupmenu="dataset-' + this.model.get( 'id' ) + '-popup"></div>' ); - popupmenu.append( linkHTMLTemplate({ - text : 'Download Dataset', - title : 'Download', - href : this.model.get( 'download_url' ), - classes : [ 'icon-button', 'tooltip', 'disk' ] - })); - popupmenu.append( '<a>Additional Files</a>' ); - for( file_type in download_meta_urls ){ - popupmenu.append( linkHTMLTemplate({ - text : 'Download ' + file_type, - href : download_meta_urls[ file_type ], - classes : [ 'action-button' ] - })); - } - var menuButton = $( ( '<div style="float:left;" class="menubutton split popup"' - + ' id="dataset-${dataset_id}-popup"></div>' ) ); - menuButton.append( downloadLink ); - popupmenu.append( menuButton ); - return popupmenu; - }, - - _render_peek : function(){ - if( !this.model.get( 'peek' ) ){ return null; } - return $( '<div/>' ).append( - $( '<pre/>' ) - .attr( 'id', 'peek' + this.model.get( 'id' ) ) - .addClass( 'peek' ) - .append( this.model.get( 'peek' ) ) - ); - }, - // ................................................................................ EVENTS events : { 'click .historyItemTitle' : 'toggleBodyVisibility', @@ -677,10 +720,11 @@ // ................................................................................ STATE CHANGES / MANIPULATION loadAndDisplayTags : function( event ){ + //BUG: broken with latest //TODO: this is a drop in from history.mako - should use MV as well - this.log( this, '.loadAndDisplayTags', event ); - var tagArea = this.tagArea; - var tagElt = this.tagElt; + this.log( this + '.loadAndDisplayTags', event ); + var tagArea = this.$el.find( '.tag-area' ), + tagElt = tagArea.find( '.tag-elt' ); // Show or hide tag area; if showing tag area and it's empty, fill it. if( tagArea.is( ":hidden" ) ){ @@ -688,9 +732,8 @@ // Need to fill tag element. $.ajax({ url: this.model.get( 'ajax_get_tag_url' ), - error: function() { alert( "Tagging failed" ) }, + error: function() { alert( "Tagging failed" ); }, success: function(tag_elt_html) { - this.log( 'tag_elt_html:', tag_elt_html ); tagElt.html(tag_elt_html); tagElt.find(".tooltip").tooltip(); tagArea.slideDown("fast"); @@ -709,21 +752,20 @@ }, loadAndDisplayAnnotation : function( event ){ + //BUG: broken with latest //TODO: this is a drop in from history.mako - should use MV as well - this.log( this, '.loadAndDisplayAnnotation', event ); - var annotationArea = this.annotationArea, - annotationElem = this.annotationElem, + this.log( this + '.loadAndDisplayAnnotation', event ); + var annotationArea = this.$el.find( '.annotation-area' ), + annotationElem = annotationArea.find( '.annotation-elt' ), setAnnotationUrl = this.model.get( 'ajax_set_annotation_url' ); // Show or hide annotation area; if showing annotation area and it's empty, fill it. - this.log( 'annotationArea hidden:', annotationArea.is( ":hidden" ) ); - this.log( 'annotationElem html:', annotationElem.html() ); if ( annotationArea.is( ":hidden" ) ){ if( !annotationElem.html() ){ // Need to fill annotation element. $.ajax({ url: this.model.get( 'ajax_get_annotation_url' ), - error: function(){ alert( "Annotations failed" ) }, + error: function(){ alert( "Annotations failed" ); }, success: function( htmlFromAjax ){ if( htmlFromAjax === "" ){ htmlFromAjax = "<em>Describe or add notes to dataset</em>"; @@ -767,12 +809,15 @@ //HistoryItemView.templates = InDomTemplateLoader.getTemplates({ HistoryItemView.templates = CompiledTemplateLoader.getTemplates({ 'common-templates.html' : { - warningMsg : 'template-warningmessagesmall', + warningMsg : 'template-warningmessagesmall' }, 'history-templates.html' : { messages : 'template-history-warning-messages', titleLink : 'template-history-titleLink', - hdaSummary : 'template-history-hdaSummary' + hdaSummary : 'template-history-hdaSummary', + failedMetadata : 'template-history-failedMetaData', + tagArea : 'template-history-tagArea', + annotationArea : 'template-history-annotationArea' } }); @@ -936,7 +981,7 @@ metadata_dbkey : '?', metadata_sequences : 0, misc_blurb : '215.8 MB', - misc_info : 'uploaded fastq file', + misc_info : 'uploaded fastq file (misc_info)', model_class : 'HistoryDatasetAssociation', download_url : '', state : 'ok', @@ -953,13 +998,15 @@ //can_edit : true, //can_edit : false, + accessible : true, + //TODO: move into model functions (build there (and cache?)) //!! be careful with adding these accrd. to permissions //!! IOW, don't send them via template/API if the user doesn't have perms to use //!! (even if they don't show up) - undelete_url : 'example.com/undelete', - purge_url : 'example.com/purge', - unhide_url : 'example.com/unhide', + undelete_url : '', + purge_url : '', + unhide_url : '', display_url : 'example.com/display', edit_url : 'example.com/edit', @@ -986,19 +1033,25 @@ }; _.extend( mockHistory.data, { + notAccessible : + _.extend( _.clone( mockHistory.data.template ), + { accessible : false }), + //deleted, purged, visible deleted : _.extend( _.clone( mockHistory.data.template ), - { deleted : true }), - //purged : - // _.extend( _.clone( mockHistory.data.template ), - // { purged : true, deleted : true }), + { deleted : true, + delete_url : '', + purge_url : 'example.com/purge', + undelete_url : 'example.com/undelete' }), purgedNotDeleted : _.extend( _.clone( mockHistory.data.template ), - { purged : true }), + { purged : true, + delete_url : '' }), notvisible : _.extend( _.clone( mockHistory.data.template ), - { visible : false }), + { visible : false, + unhide_url : 'example.com/unhide' }), hasDisplayApps : _.extend( _.clone( mockHistory.data.template ), diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/mvc/ui.js --- a/static/scripts/mvc/ui.js +++ b/static/scripts/mvc/ui.js @@ -36,7 +36,6 @@ */ var IconButtonView = Backbone.View.extend({ - initialize : function(){ // better rendering this way (for me anyway) this.model.attributes.tooltip_config = { placement : 'bottom' }; @@ -62,7 +61,6 @@ }, click : function( event ){ - console.debug( 'click event' ); // if on_click pass to that function if( this.model.attributes.on_click ){ this.model.attributes.on_click( event ); diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/common-templates.html --- a/static/scripts/templates/common-templates.html +++ b/static/scripts/templates/common-templates.html @@ -48,3 +48,10 @@ return buffer; }); </script> + +<script type="text/template" class="template-common" id="template-iconButton"> +{{! alternate template-based icon-button }} +{{> iconButton this}} +</script> + + diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/compile_templates.py --- a/static/scripts/templates/compile_templates.py +++ b/static/scripts/templates/compile_templates.py @@ -39,6 +39,7 @@ # ------------------------------------------------------------------------------ TODO = """ +remove intermediate, handlebars step of multi->handlebars->compiled/.js (if handlebars does stdin) """ import sys @@ -273,4 +274,4 @@ ( options, args ) = optparser.parse_args() sys.exit( main( options, args ) ) - \ No newline at end of file + diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/compiled/template-history-annotationArea.js --- /dev/null +++ b/static/scripts/templates/compiled/template-history-annotationArea.js @@ -0,0 +1,18 @@ +(function() { + var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; +templates['template-history-annotationArea'] = template(function (Handlebars,depth0,helpers,partials,data) { + helpers = helpers || Handlebars.helpers; + var buffer = "", stack1, foundHelper, functionType="function", escapeExpression=this.escapeExpression; + + + buffer += "\n<div id=\""; + foundHelper = helpers.id; + if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); } + else { stack1 = depth0.id; stack1 = typeof stack1 === functionType ? stack1() : stack1; } + buffer += escapeExpression(stack1) + "-annotation-area\" class=\"annotation-area\" style=\"display: none;\">\n <strong>Annotation:</strong>\n <div id=\""; + foundHelper = helpers.id; + if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); } + else { stack1 = depth0.id; stack1 = typeof stack1 === functionType ? stack1() : stack1; } + buffer += escapeExpression(stack1) + "-anotation-elt\" class=\"annotation-elt tooltip editable-text\"\n style=\"margin: 1px 0px 1px 0px\" title=\"Edit dataset annotation\">\n </div>\n</div>"; + return buffer;}); +})(); \ No newline at end of file diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/compiled/template-history-failedMetaData.js --- /dev/null +++ b/static/scripts/templates/compiled/template-history-failedMetaData.js @@ -0,0 +1,23 @@ +(function() { + var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; +templates['template-history-failedMetaData'] = template(function (Handlebars,depth0,helpers,partials,data) { + helpers = helpers || Handlebars.helpers; + var stack1, foundHelper, functionType="function", escapeExpression=this.escapeExpression, self=this, blockHelperMissing=helpers.blockHelperMissing; + +function program1(depth0,data) { + + var buffer = "", stack1, foundHelper; + buffer += "\nAn error occurred setting the metadata for this dataset.\nYou may be able to <a href=\""; + foundHelper = helpers.edit_url; + if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); } + else { stack1 = depth0.edit_url; stack1 = typeof stack1 === functionType ? stack1() : stack1; } + buffer += escapeExpression(stack1) + "\" target=\"galaxy_main\">set it manually or retry auto-detection</a>.\n"; + return buffer;} + + foundHelper = helpers.warningmessagesmall; + if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{},inverse:self.noop,fn:self.program(1, program1, data)}); } + else { stack1 = depth0.warningmessagesmall; stack1 = typeof stack1 === functionType ? stack1() : stack1; } + if (!helpers.warningmessagesmall) { stack1 = blockHelperMissing.call(depth0, stack1, {hash:{},inverse:self.noop,fn:self.program(1, program1, data)}); } + if(stack1 || stack1 === 0) { return stack1; } + else { return ''; }}); +})(); \ No newline at end of file diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/compiled/template-history-hdaSummary.js --- a/static/scripts/templates/compiled/template-history-hdaSummary.js +++ b/static/scripts/templates/compiled/template-history-hdaSummary.js @@ -7,7 +7,7 @@ function program1(depth0,data) { var buffer = "", stack1, foundHelper; - buffer += "\n <a href=\""; + buffer += "\n <a href=\""; foundHelper = helpers.edit_url; if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); } else { stack1 = depth0.edit_url; stack1 = typeof stack1 === functionType ? stack1() : stack1; } @@ -15,13 +15,13 @@ foundHelper = helpers.metadata_dbkey; if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); } else { stack1 = depth0.metadata_dbkey; stack1 = typeof stack1 === functionType ? stack1() : stack1; } - buffer += escapeExpression(stack1) + "</a>\n"; + buffer += escapeExpression(stack1) + "</a>\n "; return buffer;} function program3(depth0,data) { var buffer = "", stack1, foundHelper; - buffer += "\n <span class=\""; + buffer += "\n <span class=\""; foundHelper = helpers.metadata_dbkey; if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); } else { stack1 = depth0.metadata_dbkey; stack1 = typeof stack1 === functionType ? stack1() : stack1; } @@ -29,13 +29,24 @@ foundHelper = helpers.metadata_dbkey; if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); } else { stack1 = depth0.metadata_dbkey; stack1 = typeof stack1 === functionType ? stack1() : stack1; } - buffer += escapeExpression(stack1) + "</span>\n"; + buffer += escapeExpression(stack1) + "</span>\n "; return buffer;} +function program5(depth0,data) { + + var buffer = "", stack1, foundHelper; + buffer += "\n<div class=\"hda-info\">"; + foundHelper = helpers.misc_info; + if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); } + else { stack1 = depth0.misc_info; stack1 = typeof stack1 === functionType ? stack1() : stack1; } + buffer += escapeExpression(stack1) + "</div>\n"; + return buffer;} + + buffer += "<div class=\"hda-summary\">\n "; foundHelper = helpers.misc_blurb; if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); } else { stack1 = depth0.misc_blurb; stack1 = typeof stack1 === functionType ? stack1() : stack1; } - buffer += escapeExpression(stack1) + "<br />\nformat: <span class=\""; + buffer += escapeExpression(stack1) + "<br />\n format: <span class=\""; foundHelper = helpers.data_type; if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); } else { stack1 = depth0.data_type; stack1 = typeof stack1 === functionType ? stack1() : stack1; } @@ -43,9 +54,13 @@ foundHelper = helpers.data_type; if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); } else { stack1 = depth0.data_type; stack1 = typeof stack1 === functionType ? stack1() : stack1; } - buffer += escapeExpression(stack1) + "</span>,\ndatabase:\n"; + buffer += escapeExpression(stack1) + "</span>,\n database:\n "; stack1 = depth0.dbkey_unknown_and_editable; stack1 = helpers['if'].call(depth0, stack1, {hash:{},inverse:self.program(3, program3, data),fn:self.program(1, program1, data)}); if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n</div>\n"; + stack1 = depth0.misc_info; + stack1 = helpers['if'].call(depth0, stack1, {hash:{},inverse:self.noop,fn:self.program(5, program5, data)}); + if(stack1 || stack1 === 0) { buffer += stack1; } return buffer;}); })(); \ No newline at end of file diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/compiled/template-history-tagArea.js --- /dev/null +++ b/static/scripts/templates/compiled/template-history-tagArea.js @@ -0,0 +1,10 @@ +(function() { + var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; +templates['template-history-tagArea'] = template(function (Handlebars,depth0,helpers,partials,data) { + helpers = helpers || Handlebars.helpers; + var buffer = ""; + + + buffer += "\n<div class=\"tag-area\" style=\"display: none;\">\n <strong>Tags:</strong>\n <div class=\"tag-elt\">\n </div>\n</div>"; + return buffer;}); +})(); \ No newline at end of file diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/compiled/template-history-warning-messages.js --- a/static/scripts/templates/compiled/template-history-warning-messages.js +++ b/static/scripts/templates/compiled/template-history-warning-messages.js @@ -80,7 +80,7 @@ var buffer = "", stack1; buffer += "\n This dataset has been hidden.\n "; - stack1 = depth0.undelete_url; + stack1 = depth0.unhide_url; stack1 = helpers['if'].call(depth0, stack1, {hash:{},inverse:self.noop,fn:self.program(11, program11, data)}); if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n"; diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/compiled/template-iconButton.js --- /dev/null +++ b/static/scripts/templates/compiled/template-iconButton.js @@ -0,0 +1,12 @@ +(function() { + var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; +templates['template-iconButton'] = template(function (Handlebars,depth0,helpers,partials,data) { + helpers = helpers || Handlebars.helpers; partials = partials || Handlebars.partials; + var buffer = "", stack1, self=this; + + + buffer += "\n"; + stack1 = self.invokePartial(partials.iconButton, 'iconButton', depth0, helpers, partials);; + if(stack1 || stack1 === 0) { buffer += stack1; } + return buffer;}); +})(); \ No newline at end of file diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/history-templates.html --- a/static/scripts/templates/history-templates.html +++ b/static/scripts/templates/history-templates.html @@ -17,7 +17,7 @@ {{#unless visible}}{{#warningmessagesmall}} This dataset has been hidden. - {{#if undelete_url}} + {{#if unhide_url}} Click <a href="{{ unhide_url }}" class="historyItemUnhide" id="historyItemUnhider-{{ id }}" target="galaxy_history">here</a> to unhide it {{/if}} @@ -29,12 +29,44 @@ </script><script type="text/template" class="template-history" id="template-history-hdaSummary"> -{{ misc_blurb }}<br /> -format: <span class="{{ data_type }}">{{ data_type }}</span>, -database: -{{#if dbkey_unknown_and_editable }} - <a href="{{ edit_url }}" target="galaxy_main">{{ metadata_dbkey }}</a> -{{else}} - <span class="{{ metadata_dbkey }}">{{ metadata_dbkey }}</span> +<div class="hda-summary"> + {{ misc_blurb }}<br /> + format: <span class="{{ data_type }}">{{ data_type }}</span>, + database: + {{#if dbkey_unknown_and_editable }} + <a href="{{ edit_url }}" target="galaxy_main">{{ metadata_dbkey }}</a> + {{else}} + <span class="{{ metadata_dbkey }}">{{ metadata_dbkey }}</span> + {{/if}} +</div> +{{#if misc_info}} +<div class="hda-info">{{ misc_info }}</div> {{/if}} </script> + +<script type="text/template" class="template-history" id="template-history-failedMetaData"> +{{#warningmessagesmall}} +An error occurred setting the metadata for this dataset. +You may be able to <a href="{{ edit_url }}" target="galaxy_main">set it manually or retry auto-detection</a>. +{{/warningmessagesmall}} +</script> + +<script type="text/template" class="template-history" id="template-history-tagArea"> +{{! TODO: move to mvc/tag.js templates }} +<div class="tag-area" style="display: none;"> + <strong>Tags:</strong> + <div class="tag-elt"> + </div> +</div> +</script> + +<script type="text/template" class="template-history" id="template-history-annotationArea"> +{{! TODO: move to mvc/annotations.js templates, editable-text }} +<div id="{{ id }}-annotation-area" class="annotation-area" style="display: none;"> + <strong>Annotation:</strong> + <div id="{{ id }}-anotation-elt" class="annotation-elt tooltip editable-text" + style="margin: 1px 0px 1px 0px" title="Edit dataset annotation"> + </div> +</div> +</script> + diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/template-history-annotationArea.handlebars --- /dev/null +++ b/static/scripts/templates/template-history-annotationArea.handlebars @@ -0,0 +1,7 @@ +{{! TODO: move to mvc/annotations.js templates, editable-text }} +<div id="{{ id }}-annotation-area" class="annotation-area" style="display: none;"> + <strong>Annotation:</strong> + <div id="{{ id }}-anotation-elt" class="annotation-elt tooltip editable-text" + style="margin: 1px 0px 1px 0px" title="Edit dataset annotation"> + </div> +</div> \ No newline at end of file diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/template-history-failedMetaData.handlebars --- /dev/null +++ b/static/scripts/templates/template-history-failedMetaData.handlebars @@ -0,0 +1,4 @@ +{{#warningmessagesmall}} +An error occurred setting the metadata for this dataset. +You may be able to <a href="{{ edit_url }}" target="galaxy_main">set it manually or retry auto-detection</a>. +{{/warningmessagesmall}} \ No newline at end of file diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/template-history-hdaSummary.handlebars --- a/static/scripts/templates/template-history-hdaSummary.handlebars +++ b/static/scripts/templates/template-history-hdaSummary.handlebars @@ -1,8 +1,13 @@ -{{ misc_blurb }}<br /> -format: <span class="{{ data_type }}">{{ data_type }}</span>, -database: -{{#if dbkey_unknown_and_editable }} - <a href="{{ edit_url }}" target="galaxy_main">{{ metadata_dbkey }}</a> -{{else}} - <span class="{{ metadata_dbkey }}">{{ metadata_dbkey }}</span> +<div class="hda-summary"> + {{ misc_blurb }}<br /> + format: <span class="{{ data_type }}">{{ data_type }}</span>, + database: + {{#if dbkey_unknown_and_editable }} + <a href="{{ edit_url }}" target="galaxy_main">{{ metadata_dbkey }}</a> + {{else}} + <span class="{{ metadata_dbkey }}">{{ metadata_dbkey }}</span> + {{/if}} +</div> +{{#if misc_info}} +<div class="hda-info">{{ misc_info }}</div> {{/if}} \ No newline at end of file diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/template-history-tagArea.handlebars --- /dev/null +++ b/static/scripts/templates/template-history-tagArea.handlebars @@ -0,0 +1,6 @@ +{{! TODO: move to mvc/tag.js templates }} +<div class="tag-area" style="display: none;"> + <strong>Tags:</strong> + <div class="tag-elt"> + </div> +</div> \ No newline at end of file diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/template-history-warning-messages.handlebars --- a/static/scripts/templates/template-history-warning-messages.handlebars +++ b/static/scripts/templates/template-history-warning-messages.handlebars @@ -16,7 +16,7 @@ {{#unless visible}}{{#warningmessagesmall}} This dataset has been hidden. - {{#if undelete_url}} + {{#if unhide_url}} Click <a href="{{ unhide_url }}" class="historyItemUnhide" id="historyItemUnhider-{{ id }}" target="galaxy_history">here</a> to unhide it {{/if}} diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d static/scripts/templates/template-iconButton.handlebars --- /dev/null +++ b/static/scripts/templates/template-iconButton.handlebars @@ -0,0 +1,2 @@ +{{! alternate template-based icon-button }} +{{> iconButton this}} \ No newline at end of file diff -r 5088185a5bca723d5e58bb6672327e0310f86fbc -r 0bb0a2d4bf3cd19b822394f36b36f2d13c02339d templates/root/alternate_history.mako --- a/templates/root/alternate_history.mako +++ b/templates/root/alternate_history.mako @@ -302,7 +302,10 @@ "template-history-warning-messages", "template-history-titleLink", - "template-history-hdaSummary" + "template-history-hdaSummary", + "template-history-failedMetadata", + "template-history-tagArea", + "template-history-annotationArea" )} ## if using in-dom templates they need to go here (before the Backbone classes are defined) @@ -315,6 +318,53 @@ "mvc/history" ##"mvc/tags", "mvc/annotations" )} + + <script type="text/javascript"> + GalaxyLocalization.setLocalizedString( ${ create_localization_json( get_page_localized_strings() ) } ); + // add needed controller urls to GalaxyPaths + galaxy_paths.set( 'dataset_path', "${h.url_for( controller='dataset' )}" ) + + // Init. on document load. + var pageData = ${context_to_js()}; + + //USE_MOCK_DATA = true; + USE_CURR_DATA = true; + + // on ready + $(function(){ + if( console && console.debug ){ console.debug( 'using backbone.js in history panel' ); } + + if( window.USE_MOCK_DATA ){ + if( console && console.debug ){ console.debug( '\t using mock data' ); } + createMockHistoryData(); + return; + + } else if ( window.USE_CURR_DATA ){ + if( console && console.debug ){ console.debug( '\t using current history data' ); } + glx_history = new History( pageData.history ).loadDatasetsAsHistoryItems( pageData.hdas ); + glx_history_view = new HistoryView({ model: glx_history }); + glx_history_view.render(); + + hi = glx_history.items.at( 0 ); + hi_view = new HistoryItemView({ model: hi }); + $( 'body' ).append( hi_view.render() ); + return; + } + + // sandbox here + // testing iconButton + //ibm = new IconButton({ + // icon_class : 'information', + // on_click : function( event ){ console.debug( 'blerg' ); }, + //}); + //mockObj = { one : 1 }; + //ibv = new IconButtonView({ model : ibm }); + //new_click = function( event ){ console.debug( mockObj.one ); } + //$( 'body' ).append( ibv.render().$el ); + + }); + </script> + </%def><%def name="stylesheets()"> @@ -358,41 +408,4 @@ ${_('Galaxy History')} </%def> -<script type="text/javascript"> - GalaxyLocalization.setLocalizedString( ${ create_localization_json( get_page_localized_strings() ) } ); - // add needed controller urls to GalaxyPaths - galaxy_paths.set( 'dataset_path', "${h.url_for( controller='dataset' )}" ) - - // Init. on document load. - var pageData = ${context_to_js()}; - - //USE_MOCK_DATA = true; - USE_CURR_DATA = true; - - $(function(){ - if( console && console.debug ){ console.debug( 'using backbone.js in history panel' ); } - - if( window.USE_MOCK_DATA ){ - if( console && console.debug ){ console.debug( '\t using mock data' ); } - createMockHistoryData(); - return; - - } else if ( USE_CURR_DATA ){ - if( console && console.debug ){ console.debug( '\t using current history data' ); } - glx_history = new History( pageData.history ).loadDatasetsAsHistoryItems( pageData.hdas ); - glx_history_view = new HistoryView({ model: glx_history }); - glx_history_view.render(); - - hi = glx_history.items.at( 0 ); - hi_view = new HistoryItemView({ model: hi }); - $( 'body' ).append( hi_view.render() ); - return; - } - - // sandbox here - }); -</script> - - -<body class="historyPage"> -</body> +<body class="historyPage"></body> Repository URL: https://bitbucket.org/galaxy/galaxy-central/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email.
participants (1)
-
Bitbucket