http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/require-handlebars-plugin/js/hbs.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/require-handlebars-plugin/js/hbs.js b/dashboardv2/public/js/require-handlebars-plugin/js/hbs.js new file mode 100644 index 0000000..4aa054c --- /dev/null +++ b/dashboardv2/public/js/require-handlebars-plugin/js/hbs.js @@ -0,0 +1,490 @@ +/** + * @license Handlebars hbs 0.4.0 - Alex Sexton, but Handlebars has it's own licensing junk + * + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/require-cs for details on the plugin this was based off of + */ + +/* Yes, deliciously evil. */ +/*jslint evil: true, strict: false, plusplus: false, regexp: false */ +/*global require: false, XMLHttpRequest: false, ActiveXObject: false, +define: false, process: false, window: false */ +define([ + //>>excludeStart('excludeHbs', pragmas.excludeHbs) + 'handlebars', 'underscore', 'i18nprecompile', 'json2' + //>>excludeEnd('excludeHbs') +], function( + //>>excludeStart('excludeHbs', pragmas.excludeHbs) + Handlebars, _, precompile, JSON + //>>excludeEnd('excludeHbs') +) { + //>>excludeStart('excludeHbs', pragmas.excludeHbs) + var fs, getXhr, + progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], + fetchText = function() { + throw new Error('Environment unsupported.'); + }, + buildMap = [], + filecode = "w+", + templateExtension = "hbs", + customNameExtension = "@hbs", + devStyleDirectory = "/styles/", + buildStyleDirectory = "/demo-build/styles/", + helperDirectory = "template/helpers/", + i18nDirectory = "template/i18n/", + buildCSSFileName = "screen.build.css"; + + Handlebars.registerHelper('$', function() { + //placeholder for translation helper + }); + + if (typeof window !== "undefined" && window.navigator && window.document && !window.navigator.userAgent.match(/Node.js/)) { + // Browser action + getXhr = function() { + //Would love to dump the ActiveX crap in here. Need IE 6 to die first. + var xhr, i, progId; + if (typeof XMLHttpRequest !== "undefined") { + return new XMLHttpRequest(); + } else { + for (i = 0; i < 3; i++) { + progId = progIds[i]; + try { + xhr = new ActiveXObject(progId); + } catch (e) {} + + if (xhr) { + progIds = [progId]; // so faster next time + break; + } + } + } + + if (!xhr) { + throw new Error("getXhr(): XMLHttpRequest not available"); + } + + return xhr; + }; + + fetchText = function(url, callback) { + var prependComment = "<!--START: " + url + "--> == <!--END: " + url + "-->"; + var xhr = getXhr(); + xhr.open('GET', url, true); + xhr.onreadystatechange = function(evt) { + //Do not explicitly handle errors, those should be + //visible via console output in the browser. + if (xhr.readyState === 4) { + callback(xhr.responseText); + //TODO FIXME Gautam:Not working with backbone-forms when it does this : $($.trim(this.template(_.result(this, 'templateData')))); + // callback(prependComment.replace('==',xhr.responseText)); + } + }; + xhr.send(null); + }; + + } else if (typeof process !== "undefined" && + process.versions && + !!process.versions.node) { + //Using special require.nodeRequire, something added by r.js. + fs = require.nodeRequire('fs'); + fetchText = function(path, callback) { + var body = fs.readFileSync(path, 'utf8') || ""; + // we need to remove BOM stuff from the file content + body = body.replace(/^\uFEFF/, ''); + callback(body); + }; + } else if (typeof java !== "undefined" && typeof java.io !== "undefined") { + fetchText = function(path, callback) { + var f = new java.io.File(path); + var is = new java.io.FileReader(f); + var reader = new java.io.BufferedReader(is); + var line; + var text = ""; + while ((line = reader.readLine()) !== null) { + text += new String(line) + "\n"; + } + reader.close(); + callback(text); + }; + } + + var cache = {}; + var fetchOrGetCached = function(path, callback) { + if (cache[path]) { + callback(cache[path]); + } else { + fetchText(path, function(data) { + cache[path] = data; + callback.call(this, data); + }); + } + }; + var styleList = [], + styleMap = {}; + //>>excludeEnd('excludeHbs') + + return { + + get: function() { + return Handlebars; + }, + + write: function(pluginName, name, write) { + + if ((name + customNameExtension) in buildMap) { + var text = buildMap[name + customNameExtension]; + write.asModule(pluginName + "!" + name, text); + } + }, + + version: '0.4.0', + + load: function(name, parentRequire, load, config) { + //>>excludeStart('excludeHbs', pragmas.excludeHbs) + + var compiledName = name + customNameExtension, + disableI18n = (config.hbs && config.hbs.disableI18n), + partialDeps = []; + + function recursiveNodeSearch(statements, res) { + _(statements).forEach(function(statement) { + if (statement && statement.type && statement.type === 'partial') { + res.push(statement.partialName.name); + } + if (statement && statement.program && statement.program.statements) { + recursiveNodeSearch(statement.program.statements, res); + } + if (statement && statement.program && statement.program.inverse && statement.program.inverse.statements) { + recursiveNodeSearch(statement.program.inverse.statements, res); + } + }); + return res; + } + + // TODO :: use the parser to do this! + function findPartialDeps(nodes) { + var res = []; + if (nodes && nodes.statements) { + res = recursiveNodeSearch(nodes.statements, []); + } + return _(res).unique(); + } + + // See if the first item is a comment that's json + function getMetaData(nodes) { + var statement, res, test; + if (nodes && nodes.statements) { + statement = nodes.statements[0]; + if (statement && statement.type === "comment") { + try { + res = (statement.comment).replace(new RegExp('^[\\s]+|[\\s]+$', 'g'), ''); + test = JSON.parse(res); + return res; + } catch (e) { + return "{}"; + } + } + } + return "{}"; + } + + function composeParts(parts) { + if (!parts) { + return []; + } + var res = [parts[0]], + cur = parts[0], + i; + + for (i = 1; i < parts.length; ++i) { + if (parts.hasOwnProperty(i)) { + cur += "." + parts[i]; + res.push(cur); + } + } + return res; + } + + function recursiveVarSearch(statements, res, prefix, helpersres) { + prefix = prefix ? prefix + "." : ""; + + var newprefix = "", + flag = false; + + // loop through each statement + _(statements).forEach(function(statement) { + var parts, part, sideways; + + // if it's a mustache block + if (statement && statement.type && statement.type === 'mustache') { + + // If it has params, the first part is a helper or something + if (!statement.params || !statement.params.length) { + parts = composeParts(statement.id.parts); + for (part in parts) { + if (parts[part]) { + newprefix = parts[part] || newprefix; + res.push(prefix + parts[part]); + } + } + res.push(prefix + statement.id.string); + } + + var paramsWithoutParts = ['this', '.', '..', './..', '../..', '../../..']; + + // grab the params + if (statement.params && typeof Handlebars.helpers[statement.id.string] === 'undefined') { + _(statement.params).forEach(function(param) { + if (_(paramsWithoutParts).contains(param.original) || param instanceof Handlebars.AST.StringNode || param instanceof Handlebars.AST.IntegerNode || param instanceof Handlebars.AST.BooleanNode) { + helpersres.push(statement.id.string); + } + + parts = composeParts(param.parts); + + for (var part in parts) { + if (parts[part]) { + newprefix = parts[part] || newprefix; + helpersres.push(statement.id.string); + res.push(prefix + parts[part]); + } + } + }); + } + } + + // If it's a meta block + if (statement && statement.mustache) { + recursiveVarSearch([statement.mustache], res, prefix + newprefix, helpersres); + } + + // if it's a whole new program + if (statement && statement.program && statement.program.statements) { + sideways = recursiveVarSearch([statement.mustache], [], "", helpersres)[0] || ""; + if (statement.program.inverse && statement.program.inverse.statements) { + recursiveVarSearch(statement.program.inverse.statements, res, prefix + newprefix + (sideways ? (prefix + newprefix) ? "." + sideways : sideways : ""), helpersres); + } + recursiveVarSearch(statement.program.statements, res, prefix + newprefix + (sideways ? (prefix + newprefix) ? "." + sideways : sideways : ""), helpersres); + } + }); + return res; + } + + // This finds the Helper dependencies since it's soooo similar + function getExternalDeps(nodes) { + var res = []; + var helpersres = []; + + if (nodes && nodes.statements) { + res = recursiveVarSearch(nodes.statements, [], undefined, helpersres); + } + + var defaultHelpers = ["helperMissing", "blockHelperMissing", "each", "if", "unless", "with"]; + + return { + vars: _(res).chain().unique().map(function(e) { + if (e === "") { + return '.'; + } + if (e.length && e[e.length - 1] === '.') { + return e.substr(0, e.length - 1) + '[]'; + } + return e; + }).value(), + helpers: _(helpersres).chain().unique().map(function(e) { + if (_(defaultHelpers).contains(e)) { + return undefined; + } + return e; + }).compact().value() + }; + } + + function fetchAndRegister(langMap) { + fetchText(path, function(text) { + // for some reason it doesn't include hbs _first_ when i don't add it here... + var nodes = Handlebars.parse(text), + deps = findPartialDeps(nodes), + meta = getMetaData(nodes), + extDeps = getExternalDeps(nodes), + vars = extDeps.vars, + helps = extDeps.helpers || [], + depStr = deps.join("', 'hbs!").replace(/_/g, '/'), + helpDepStr = config.hbs && config.hbs.disableHelpers ? + "" : (function() { + var i, paths = [], + pathGetter = config.hbs && config.hbs.helperPathCallback ? config.hbs.helperPathCallback : function(name) { + return (config.hbs && config.hbs.helperDirectory ? config.hbs.helperDirectory : helperDirectory) + name; + }; + + for (i = 0; i < helps.length; i++) { + paths[i] = "'" + pathGetter(helps[i], path) + "'" + } + return paths; + })().join(','), + debugOutputStart = "", + debugOutputEnd = "", + debugProperties = "", + metaObj, head, linkElem; + + if (depStr) { + depStr = ",'hbs!" + depStr + "'"; + } + if (helpDepStr) { + helpDepStr = "," + helpDepStr; + } + + if (meta !== "{}") { + try { + metaObj = JSON.parse(meta); + if (metaObj && metaObj.styles) { + styleList = _.union(styleList, metaObj.styles); + + // In dev mode in the browser + if (require.isBrowser && !config.isBuild) { + head = document.head || document.getElementsByTagName('head')[0]; + _(metaObj.styles).forEach(function(style) { + if (!styleMap[style]) { + linkElem = document.createElement('link'); + linkElem.href = config.baseUrl + devStyleDirectory + style + '.css'; + linkElem.media = 'all'; + linkElem.rel = 'stylesheet'; + linkElem.type = 'text/css'; + head.appendChild(linkElem); + styleMap[style] = linkElem; + } + }); + } else if (config.isBuild) { + (function() { + var fs = require.nodeRequire('fs'), + str = _(metaObj.styles).map(function(style) { + if (!styleMap[style]) { + styleMap[style] = true; + return "@import url(" + style + ".css);\n"; + } + return ""; + }).join("\n"); + + // I write out my import statements to a file in order to help me build stuff. + // Then I use a tool to inline my import statements afterwards. (you can run r.js on it too) + fs.open(__dirname + buildStyleDirectory + buildCSSFileName, filecode, '0666', function(e, id) { + fs.writeSync(id, str, null, encoding = 'utf8'); + fs.close(id); + }); + filecode = "a"; + })(); + } + } + } catch (e) { + console.log('error injecting styles'); + } + } + + if (!config.isBuild && !config.serverRender) { + debugOutputStart = "<!-- START - " + name + " -->"; + debugOutputEnd = "<!-- END - " + name + " -->"; + debugProperties = "t.meta = " + meta + ";\n" + + "t.helpers = " + JSON.stringify(helps) + ";\n" + + "t.deps = " + JSON.stringify(deps) + ";\n" + + "t.vars = " + JSON.stringify(vars) + ";\n"; + } + + var mapping = disableI18n ? false : _.extend(langMap, config.localeMapping), + configHbs = config.hbs || {}, + options = _.extend(configHbs.compileOptions || {}, { + originalKeyFallback: configHbs.originalKeyFallback + }), + prec = precompile(text, mapping, options); + + text = "/* START_TEMPLATE */\n" + + "define(['hbs','handlebars'" + depStr + helpDepStr + "], function( hbs, Handlebars ){ \n" + + "var t = Handlebars.template(" + prec + ");\n" + + "Handlebars.registerPartial('" + name.replace(/\//g, '_') + "', t);\n" + + debugProperties + + "return t;\n" + + "});\n" + + "/* END_TEMPLATE */\n"; + + //Hold on to the transformed text if a build. + if (config.isBuild) { + buildMap[compiledName] = text; + } + + //IE with conditional comments on cannot handle the + //sourceURL trick, so skip it if enabled. + /*@if (@_jscript) @else @*/ + if (!config.isBuild) { + text += "\r\n//@ sourceURL=" + path; + } + /*@end@*/ + + for (var i in deps) { + if (deps.hasOwnProperty(i)) { + deps[i] = 'hbs!' + deps[i].replace(/_/g, '/'); + } + } + + if (!config.isBuild) { + require(deps, function() { + load.fromText(text); + + //Give result to load. Need to wait until the module + //is fully parse, which will happen after this + //execution. + parentRequire([name], function(value) { + load(value); + }); + }); + } else { + load.fromText(name, text); + + //Give result to load. Need to wait until the module + //is fully parse, which will happen after this + //execution. + parentRequire([name], function(value) { + load(value); + }); + } + + if (config.removeCombined) { + fs.unlinkSync(path); + } + }); + } + + var path, + omitExtension = config.hbs && config.hbs.templateExtension === false; + if (omitExtension) { + path = parentRequire.toUrl(name); + } else { + path = parentRequire.toUrl(name + '.' + (config.hbs && config.hbs.templateExtension ? config.hbs.templateExtension : templateExtension)); + } + + if (disableI18n) { + fetchAndRegister(false); + } else { + // Workaround until jam is able to pass config info or we move i18n to a separate module. + // This logs a warning and disables i18n if there's an error loading the language file + var langMapPath = (config.hbs && config.hbs.i18nDirectory ? config.hbs.i18nDirectory : i18nDirectory) + (config.locale || "en_us") + '.json'; + try { + fetchOrGetCached(parentRequire.toUrl(langMapPath), function(langMap) { + fetchAndRegister(JSON.parse(langMap)); + }); + } catch (er) { + // if there's no configuration at all, log a warning and disable i18n for this and subsequent templates + if (!config.hbs) { + console.warn('hbs: Error reading ' + langMapPath + ', disabling i18n. Ignore this if you\'re using jam, otherwise check your i18n configuration.\n'); + config.hbs = { + disableI18n: true + }; + fetchAndRegister(false); + } else { + throw er; + + } + } + } + //>>excludeEnd('excludeHbs') + } + }; +}); +/* END_hbs_PLUGIN */
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/require-handlebars-plugin/js/i18nprecompile.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/require-handlebars-plugin/js/i18nprecompile.js b/dashboardv2/public/js/require-handlebars-plugin/js/i18nprecompile.js new file mode 100644 index 0000000..925ac39 --- /dev/null +++ b/dashboardv2/public/js/require-handlebars-plugin/js/i18nprecompile.js @@ -0,0 +1,57 @@ +//>>excludeStart('excludeAfterBuild', pragmas.excludeAfterBuild) +define(['handlebars', "underscore"], function(Handlebars, _) { + + function replaceLocaleStrings(ast, mapping, options) { + options = options || {}; + mapping = mapping || {}; + // Base set of things + if (ast && ast.type === "program" && ast.statements) { + _(ast.statements).forEach(function(statement, i) { + var newString = "<!-- i18n error -->"; + // If it's a translation node + if (statement.type === "mustache" && statement.id && statement.id.original === "$") { + + if (statement.params.length && statement.params[0].string) { + var key = statement.params[0].string; + newString = mapping[key] || (options.originalKeyFallback ? key : newString); + } + ast.statements[i] = new Handlebars.AST.ContentNode(newString); + } + // If we need to recurse + else if (statement.program) { + statement.program = replaceLocaleStrings(statement.program, mapping, options); + } + }); + // Also cover the else blocks + if (ast.inverse) { + replaceLocaleStrings(ast.inverse, mapping, options); + } + } + return ast; + } + + return function precompile(string, mapping, options) { + var ast, environment; + + options = options || {}; + + if (!('data' in options)) { + options.data = true; + } + + if (options.compat) { + options.useDepths = true; + } + + ast = Handlebars.parse(string); + + // avoid replacing locale if mapping is `false` + if (mapping !== false) { + ast = replaceLocaleStrings(ast, mapping, options); + } + + environment = new Handlebars.Compiler().compile(ast, options); + return new Handlebars.JavaScriptCompiler().compile(environment, options); + }; +}); +//>>excludeEnd('excludeAfterBuild') http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/require-handlebars-plugin/js/json2.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/require-handlebars-plugin/js/json2.js b/dashboardv2/public/js/require-handlebars-plugin/js/json2.js new file mode 100644 index 0000000..c740001 --- /dev/null +++ b/dashboardv2/public/js/require-handlebars-plugin/js/json2.js @@ -0,0 +1,351 @@ +//>>excludeStart('excludeAfterBuild', pragmas.excludeAfterBuild) +/* + http://www.JSON.org/json2.js + 2011-10-19 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. +*/ + +/*jslint evil: true, regexp: true */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, + call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, + getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, + lastIndex, length, parse, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + +(function(window) { + + // Create a JSON object only if one does not already exist. We create the + // methods in a closure to avoid creating global variables. + + // Return the window JSON element if it exists; + var JSON = window.JSON || {}; + + (function() { + 'use strict'; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + if (typeof Date.prototype.toJSON !== 'function') { + + Date.prototype.toJSON = function(key) { + + return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z' : null; + }; + + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function(key) { + return this.valueOf(); + }; + } + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"': '\\"', + '\\': '\\\\' + }, + rep; + + function quote(string) { + + // If the string contains no control characters, no quote characters, and no + // backslash characters, then we can safely slap some quotes around it. + // Otherwise we must also replace the offending characters with safe escape + // sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function(a) { + var c = meta[a]; + return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + function str(key, holder) { + + // Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + + // If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + + // If we were called with a replacer function, then call the replacer to + // obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + + // What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + + // JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + + // If the value is a boolean or null, convert it to a string. Note: + // typeof null does not produce 'null'. The case is included here in + // the remote chance that this gets fixed someday. + + return String(value); + + // If the type is 'object', we might be dealing with an object or an array or + // null. + + case 'object': + + // Due to a specification blunder in ECMAScript, typeof null is 'object', + // so watch out for that case. + + if (!value) { + return 'null'; + } + + // Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + + // Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + + // The value is an array. Stringify every element. Use null as a placeholder + // for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + + // Join all of the elements together, separated with commas, and wrap them in + // brackets. + + v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + + // If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + + // Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + + // Join all of the member texts together, separated with commas, + // and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + + // If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== 'function') { + JSON.stringify = function(value, replacer, space) { + + // The stringify method takes a value and an optional replacer, and an optional + // space parameter, and returns a JSON text. The replacer can be a function + // that can replace values, or an array of strings that will select the keys. + // A default replacer method can be provided. Use of the space parameter can + // produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + + // If the space parameter is a number, make an indent string containing that + // many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + + // If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + + // If there is a replacer, it must be a function or an array. + // Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + + // Make a fake root object containing our value under the key of ''. + // Return the result of stringifying the value. + + return str('', { + '': value + }); + }; + } + + // If the JSON object does not yet have a parse method, give it one. + + if (typeof JSON.parse !== 'function') { + JSON.parse = function(text, reviver) { + + // The parse method takes a text and an optional reviver function, and returns + // a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + + // The walk method is used to recursively walk the resulting structure so + // that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + // Parsing happens in four stages. In the first stage, we replace certain + // Unicode characters with escape sequences. JavaScript handles many characters + // incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function(a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + + // In the second stage, we run the text against regular expressions that look + // for non-JSON patterns. We are especially concerned with '()' and 'new' + // because they can cause invocation, and '=' because it can cause mutation. + // But just to be safe, we want to reject all unexpected forms. + + // We split the second stage into 4 regexp operations in order to work around + // crippling inefficiencies in IE's and Safari's regexp engines. First we + // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we + // replace all simple value tokens with ']' characters. Third, we delete all + // open brackets that follow a colon or comma or that begin the text. Finally, + // we look to see that the remaining characters are only whitespace or ']' or + // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + + // In the third stage we use the eval function to compile the text into a + // JavaScript structure. The '{' operator is subject to a syntactic ambiguity + // in JavaScript: it can begin a block or an object literal. We wrap the text + // in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + + // In the optional fourth stage, we recursively walk the new structure, passing + // each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? walk({ + '': j + }, '') : j; + } + + // If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + } + }()); + + define(function() { + return JSON; + }); + // otherwise just leave it alone + +}).call(this, this); +//>>excludeEnd('excludeAfterBuild') http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/router/Router.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/router/Router.js b/dashboardv2/public/js/router/Router.js new file mode 100644 index 0000000..d5a2709 --- /dev/null +++ b/dashboardv2/public/js/router/Router.js @@ -0,0 +1,173 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +define([ + 'jquery', + 'underscore', + 'backbone', + 'App', + 'utils/Globals', + 'utils/Utils' +], function($, _, Backbone, App, Globals, Utils) { + var AppRouter = Backbone.Router.extend({ + routes: { + // Define some URL routes + '': 'assetPageLoad', + '!/': 'assetPageLoad', + "!/dashboard/assetPage": 'assetPageLoad', + '!/dashboard/detailPage/:id': 'detailPageLoad', + '!/dashboard/createTags': 'tagPageLoad', + // Default + '*actions': 'defaultAction' + }, + initialize: function() { + this.showRegions(); + this.bindCommonEvents(); + this.listenTo(this, 'route', this.postRouteExecute, this); + this.globalVent = new Backbone.Wreqr.EventAggregator(); + this.catalogVent = new Backbone.Wreqr.EventAggregator(); + this.tagVent = new Backbone.Wreqr.EventAggregator(); + }, + bindCommonEvents: function() { + var that = this; + $('body').on('click', 'li.aboutAtlas', function() { + that.aboutAtlas(); + }); + }, + aboutAtlas: function() { + var that = this; + require([ + 'hbs!tmpl/common/aboutAtlas_tmpl', + 'modules/Modal' + ], function(aboutAtlasTmpl, Modal) { + + var aboutAtlas = Marionette.LayoutView.extend({ + template: aboutAtlasTmpl, + events: {}, + }); + var view = new aboutAtlas(); + var modal = new Modal({ + title: 'About', + content: view, + okCloses: true, + showFooter: true, + }).open(); + + view.on('closeModal', function() { + modal.trigger('cancel'); + }); + + }); + }, + showRegions: function() {}, + + /** + * @override + * Execute a route handler with the provided parameters. This is an + * excellent place to do pre-route setup or post-route cleanup. + * @param {Function} callback - route handler + * @param {Array} args - route params + */ + execute: function(callback, args) { + this.preRouteExecute(); + if (callback) callback.apply(this, args); + this.postRouteExecute(); + }, + preRouteExecute: function() { + // console.log("Pre-Route Change Operations can be performed here !!"); + }, + postRouteExecute: function(name, args) { + // console.log("Post-Route Change Operations can be performed here !!"); + // console.log("Route changed: ", name); + }, + /** + * Define route handlers here + */ + assetPageLoad: function() { + var that = this; + $('#old').show(); + $('#new').hide(); + require([ + 'views/asset/AssetPageLayoutView', + 'collection/VSearchList', + 'views/site/Header', + /*'views/site/footer',*/ + ], function(AssetPageLayoutView, VSearchList, HeaderView /*, FooterView*/ ) { + that.searchCollection = new VSearchList([], { + state: { + firstPage: 0, + pageSize: 10 + } + }); + App.rHeader.show(new HeaderView({ 'globalVent': that.globalVent })); + App.rContent.show(new AssetPageLayoutView({ + 'globalVent': that.globalVent, + 'collection': that.searchCollection, + 'vent': that.tagVent + })); + }); + }, + detailPageLoad: function(id) { + var that = this; + $('#old').show(); + $('#new').hide(); + if (id) { + require([ + 'views/detail_page/DetailPageLayoutView', + 'collection/VEntityList', + 'views/site/Header', + ], function(DetailPageLayoutView, VEntityList, HeaderView) { + this.entityCollection = new VEntityList([], {}); + App.rHeader.show(new HeaderView({ 'globalVent': that.globalVent })); + App.rContent.show(new DetailPageLayoutView({ + 'globalVent': that.globalVent, + 'collection': entityCollection, + 'id': id, + 'vent': that.tagVent + })); + entityCollection.url = "/api/atlas/entities/" + id; + entityCollection.fetch({ reset: true }); + }); + } + }, + tagPageLoad: function() { + var that = this; + $('#old').show(); + $('#new').hide(); + require([ + 'views/tag/createTagsLayoutView', + 'collection/VTagList', + 'views/site/Header', + ], function(CreateTagsLayoutView, VTagList, HeaderView) { + this.tagsCollection = new VTagList([], {}); + App.rHeader.show(new HeaderView({ 'globalVent': that.globalVent })); + App.rContent.show(new CreateTagsLayoutView({ + 'globalVent': that.globalVent, + 'tagsCollection': tagsCollection, + })); + + }); + }, + + defaultAction: function(actions) { + // We have no matching route, lets just log what the URL was + console.log('No route:', actions); + } + }); + return AppRouter; +}); http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/asset/AssetPageLayoutView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/asset/AssetPageLayoutView_tmpl.html b/dashboardv2/public/js/templates/asset/AssetPageLayoutView_tmpl.html new file mode 100644 index 0000000..7a290d9 --- /dev/null +++ b/dashboardv2/public/js/templates/asset/AssetPageLayoutView_tmpl.html @@ -0,0 +1,32 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="row"> + <div class="col-sm-3"> + <div id="r_tagLayoutView"></div> + </div> + <div class="col-sm-9"> + <div class="panel panel-default"> + <div class="panel-body"> + <div id="r_searchLayoutView"></div> + <div class="fontLoader"> + <i class="fa fa-refresh fa-spin-custom"></i> + </div> + <div id="r_entityTableLayoutView" class="entityTable"></div> + </div> + </div> + </div> +</div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/common/TableLayout_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/common/TableLayout_tmpl.html b/dashboardv2/public/js/templates/common/TableLayout_tmpl.html new file mode 100644 index 0000000..4264035 --- /dev/null +++ b/dashboardv2/public/js/templates/common/TableLayout_tmpl.html @@ -0,0 +1,37 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="clearfix"> + <div class="form-group pull-right no-margin"> + <div data-id="control" class="pull-right"></div> + <label class="select pull-right"> + <select data-id="pageSize" class="form-control"> + <option selected>10</option> + <option>25</option> + <option>50</option> + <option>100</option> + </select> + </label> + </div> +</div> +<div class="position-relative thick-border"> + <div data-id="r_tableList" class="table-responsive tableBorder"> </div> + <div data-id="r_tableSpinner"></div> +</div> +<div class="row banded"> + <div data-id="r_footerRecords" class="col-sm-6 margin-top-10"></div> + <div data-id="r_pagination" class="col-sm-6 text-right"></div> +</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/common/aboutAtlas_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/common/aboutAtlas_tmpl.html b/dashboardv2/public/js/templates/common/aboutAtlas_tmpl.html new file mode 100644 index 0000000..9839458 --- /dev/null +++ b/dashboardv2/public/js/templates/common/aboutAtlas_tmpl.html @@ -0,0 +1,27 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="row"> + <div class="col-md-4"> + <img src="img/ApacheAtlasLogo.png" class="img-responsive"> + <div class="col-md-8 subContent"> + <h2 class="title-bold">Apache Atlas</h2> + <p class="ng-binding"><b>Version : </b> 0.7-incubating-SNAPSHOT-ra2cc01c4342ace7f7a3e3e254d7ede781f990318</p> + <br> + <p class="text-info">Get involved!</p> + <p class="text-info"><a href="http://apache.org/licenses/LICENSE-2.0" target="_blank">Licensed under the Apache License Version 2.0</a></p> + </div> + </div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/common/modal.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/common/modal.html b/dashboardv2/public/js/templates/common/modal.html new file mode 100644 index 0000000..0f64f5a --- /dev/null +++ b/dashboardv2/public/js/templates/common/modal.html @@ -0,0 +1,46 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="modal-dialog {{mainClass}}" role="document"> + <div class="modal-content"> + {{#if title}} + <div class="modal-header"> + <a class="close">×</a> + <h4 class="modal-title"> + {{#if titleHtml}} + {{{tt title}}} + {{else}} + {{tt title}} + {{/if}} + </h4> + </div> + {{/if}} + {{#if contentWithFooter}} + {{else}} + <div class="modal-body">{{content}}</div> + {{#if showFooter}} + <div class="modal-footer" > + <a href="#" class="btn ok btn-success">{{tt okText}}</a> + {{#if allowCancel}} + {{#if cancelText}} + <a href="#" class="btn btn-default cancel">{{tt cancelText}}</a> + {{/if}} + {{/if}} + </div> + {{/if}} + {{/if}} + </div> +</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html b/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html new file mode 100644 index 0000000..3a8eb44 --- /dev/null +++ b/dashboardv2/public/js/templates/detail_page/DetailPageLayoutView_tmpl.html @@ -0,0 +1,48 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="col-sm-12"> + <ol class="breadcrumb"> + <li><a href="#!/dashboard/assetPage">Home</a></li> + <li class="active breadcrumbName"></li> + </ol> + <div class="panel panel-default lineageLayout" style="display:none"> + <div id="r_lineageLayoutView"></div> + </div> + <div class="panel panel-default"> + <div class="panel-body"> + <p class="name"></p> + <p class="description"></p> + <hr> + <ul class="nav nav-tabs" role="tablist"> + <li role="presentation" class="tab active"><a href="#tab-details" aria-controls="tab-details" role="tab" data-toggle="tab">Details</a></li> + <li role="presentation" class="tab schemaTable" style="display:none"><a href="#tab-schema" aria-controls="tab-schema" role="tab" data-toggle="tab">Schema</a></li> + <li role="presentation" class="tab "><a href="#tab-tags" aria-controls="tab-tags" role="tab" data-toggle="tab">Tags</a></li> + </ul> + <div class="tab-content"> + <div id="tab-details" role="tabpanel" class="tab-pane active"> + <div id="r_entityDetailTableLayoutView"></div> + </div> + <div id="tab-schema" class="tab-pane"> + <div id="r_schemaTableLayoutView"></div> + </div> + <div id="tab-tags" class="tab-pane"> + <div id="r_tagTableLayoutView"></div> + </div> + </div> + </div> + </div> +</div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/entity/EntityDetailTableLayoutView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/entity/EntityDetailTableLayoutView_tmpl.html b/dashboardv2/public/js/templates/entity/EntityDetailTableLayoutView_tmpl.html new file mode 100644 index 0000000..8ce71de --- /dev/null +++ b/dashboardv2/public/js/templates/entity/EntityDetailTableLayoutView_tmpl.html @@ -0,0 +1,26 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<table class="table table-bordered table-striped"> + <thead> + <tr> + <th>Key</th> + <th>Value</th> + </tr> + </thead> + <tbody data-id="detailValue"> + </tbody> +</table> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/graph/LineageLayoutView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/graph/LineageLayoutView_tmpl.html b/dashboardv2/public/js/templates/graph/LineageLayoutView_tmpl.html new file mode 100644 index 0000000..0c32a48 --- /dev/null +++ b/dashboardv2/public/js/templates/graph/LineageLayoutView_tmpl.html @@ -0,0 +1,33 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="panel-heading"> + <h3 class="panel-title">Lineage</h3> +</div> +<div class="fontLoader"> + <i class="fa fa-refresh fa-spin-custom"></i> +</div> +<div class="panel-body graph-bg" align="center"> + <!-- <div class="temp"> + <i class="glyphicon glyphicon-plus"></i> + <i class="glyphicon glyphicon-minus"></i> + </div> --> + <div class="graph" id="tree-container"> + </div> + <div> + <svg width=100% height=350> </svg> + </div> +</div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html b/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html new file mode 100644 index 0000000..cbc0e8a --- /dev/null +++ b/dashboardv2/public/js/templates/schema/SchemaTableLayoutView_tmpl.html @@ -0,0 +1,17 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div id="r_tagLayoutView"></div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/search/SearchLayoutView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/search/SearchLayoutView_tmpl.html b/dashboardv2/public/js/templates/search/SearchLayoutView_tmpl.html new file mode 100644 index 0000000..70cbf37 --- /dev/null +++ b/dashboardv2/public/js/templates/search/SearchLayoutView_tmpl.html @@ -0,0 +1,33 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="row row-margin-bottom"> + <div class="col-sm-12"> + <div class="switch" style="float: left;"> + <input type="radio" class="switch-input" name="queryType" value="fulltext" id="fulltext_toggle" checked=""> + <label for="fulltext_toggle" class="switch-label switch-label-off">Text</label> + <input type="radio" class="switch-input" name="queryType" value="dsl" id="dsl_toggle"> + <label for="dsl_toggle" class="switch-label switch-label-on">DSL</label> + <span class="switch-selection"></span> + </div> + <div class="input-group"> + <input style="padding-left: 132px;" type="text" class="form-control" data-id="searchInput" placeholder="Search using a query string: e.g. sales_fact"> + <span class="input-group-btn"> + <button class="btn btn-success" data-id="searchButton" type="button"><i class="fa fa-search"></i></button> + </span> + </div> + </div> +</div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/site/footer.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/site/footer.html b/dashboardv2/public/js/templates/site/footer.html new file mode 100644 index 0000000..72148ec --- /dev/null +++ b/dashboardv2/public/js/templates/site/footer.html @@ -0,0 +1,21 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<footer class="footer navbar-bottom"> + <div class="container"> + <p align="right">Powered by<img src="../img/logo-green.png"></p> + </div> +</footer> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/site/header.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/site/header.html b/dashboardv2/public/js/templates/site/header.html new file mode 100644 index 0000000..fe3803d --- /dev/null +++ b/dashboardv2/public/js/templates/site/header.html @@ -0,0 +1,53 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="container"> + <div class="row"> + <div class="navbar-header"> + <ul class="sidebar-nav"> + <li class="sidebar-brand clearfix"> + <a class="pull-left" href="#!/"><i class="fa fa-globe"></i><strong> Atlas</strong></a> + <div class="dropdown headerDroupDown pull-left"> + <a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown"> + {{#ifCond urlType "==" "assetPage"}} + Assets + {{else}} + {{#ifCond urlType "==" "createTags"}} + Tag Definition + {{else}} + Asset Details + {{/ifCond}} + {{/ifCond}} + <span class="caret"></span></a> + <ul class="dropdown-menu"> + {{#ifCond urlType "==" "assetPage"}} + <li><a href="#!/dashboard/createTags">Tag Definition</a></li> + {{else}} {{#ifCond urlType "==" "createTags"}} + <li><a href="#!/dashboard/assetPage">Assets</a></li> + {{else}} + <li><a href="#!/dashboard/assetPage">Assets</a></li> + <li><a href="#!/dashboard/createTags">Tag Definition</a></li> + {{/ifCond}} {{/ifCond}} + <li><a target="_blank" href="https://cwiki.apache.org/confluence/display/ATLAS/Atlas+Home">Help</a></li> + <li class="aboutAtlas"><a href="javascript:void(0)">About</a></li> + <li><a href="logout.html">Logout</a></li> + </ul> + </div> + </li> + </ul> + </div> + </div> +</div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/tag/TagDetailTableLayoutView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/tag/TagDetailTableLayoutView_tmpl.html b/dashboardv2/public/js/templates/tag/TagDetailTableLayoutView_tmpl.html new file mode 100644 index 0000000..cbfbeff --- /dev/null +++ b/dashboardv2/public/js/templates/tag/TagDetailTableLayoutView_tmpl.html @@ -0,0 +1,33 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div> + <button class="add-tag btn btn-success pull-right" data-id="addTag" style="margin-bottom:10px">Add Tag</button> +</div> +<table class="table table-bordered table-striped"> + <thead> + <tr> + <th>Tag</th> + <th>Attribute</th> + <th>Tools</th> + </tr> + </thead> + <tbody data-id="detailValue"> + </tbody> +</table> +<div class="noTags" style="display:none"> + No tags to display +</div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/tag/TagLayoutView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/tag/TagLayoutView_tmpl.html b/dashboardv2/public/js/templates/tag/TagLayoutView_tmpl.html new file mode 100644 index 0000000..160af27 --- /dev/null +++ b/dashboardv2/public/js/templates/tag/TagLayoutView_tmpl.html @@ -0,0 +1,40 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="tagsList"> + <div class="atlast-tabbable"> + <ul class="nav nav-tabs" role="tablist"> + <li role="presentation" class="tab active"><a href="#tab-tags" role="tab" data-toggle="tab">Tags</a></li> + <li role="presentation" class="tab"><a href="#tab-types" role="tab" data-toggle="tab">Type</a></li> + <div class="pull-right" data-id="referesh"><a href="javascript:void(0)"><i class="fa fa-refresh"></i></a></div> + <div class="indicator" style="right: 116px; left: 0px;"></div> + </ul> + <div class="tab-content"> + <div id="tab-tags" role="tabpanel" class="tab-pane active"> + <div class="row-margin-bottom"> + <input data-id="searchTag" data-type="listTag" placeholder="Search for Tagsâ¦" class="form-control"> + </div> + <div class="list-group scrollTagList" data-id="listTag"> </div> + </div> + <div id="tab-types" role="tabpanel" class="tab-pane"> + <div class="row-margin-bottom "> + <input data-id="searchTag" data-type="listType" placeholder="Search for Typesâ¦" class="form-control"> + </div> + <div class="list-group scrollTagList" data-id="listType"> </div> + </div> + </div> + </div> +</div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/tag/addTagAttributeItemView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/tag/addTagAttributeItemView_tmpl.html b/dashboardv2/public/js/templates/tag/addTagAttributeItemView_tmpl.html new file mode 100644 index 0000000..9dd62ca --- /dev/null +++ b/dashboardv2/public/js/templates/tag/addTagAttributeItemView_tmpl.html @@ -0,0 +1,23 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="form-group"> + <label class="col-sm-2 control-label">Attribute name</label> + <div class="col-sm-10"> + <input type="text" class="form-control" name="name" id="attributeId" placeholder="Attribute name" required=""> + <button class="remove" id="close"><i class="fa fa-times"></i></button> + </div> +</div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/tag/addTagModalView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/tag/addTagModalView_tmpl.html b/dashboardv2/public/js/templates/tag/addTagModalView_tmpl.html new file mode 100644 index 0000000..acae4e1 --- /dev/null +++ b/dashboardv2/public/js/templates/tag/addTagModalView_tmpl.html @@ -0,0 +1,29 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="modalHeight"> + <form name="tagDefinitionform" class="css-form"> + <div class="form-group"> + <label class="control-label col-sm-4">Tag definition</label> + <div class="col-sm-8 input-spacing"> + <select class="form-control" data-id="addTagOptions" id="addTagID" required> + </select> + </div> + </div> + </form> +</div> +<div class="form-group modalHeight" data-id="tagAttribute" style="display:none"> +</div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/templates/tag/createTagLayoutView_tmpl.html ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/templates/tag/createTagLayoutView_tmpl.html b/dashboardv2/public/js/templates/tag/createTagLayoutView_tmpl.html new file mode 100644 index 0000000..4682aca --- /dev/null +++ b/dashboardv2/public/js/templates/tag/createTagLayoutView_tmpl.html @@ -0,0 +1,65 @@ +<!-- + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +--> +<div class="row"> + <div class="appForm col-lg-12"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h4>Tag Definition</h4></div> + <div class="panel-body inputs"> + <form data-name="tagForm" class="form-horizontal" novalidate="" role="form"> + <fieldset> + <div class="form-group hide"> + <label for="category" class="col-sm-2 control-label">Category</label> + <div class="col-sm-10"> + <select class="form-control" data-id="category" name="category" required=""> + </select> + </div> + </div> + <div class="form-group"> + <label for="typeName" class="col-sm-2 control-label">Tag Name</label> + <div class="col-sm-10"> + <input type="text" class="form-control" name="typeName" data-id="typeName" placeholder="Tag Name" required=""> + </div> + </div> + <div class="form-group"> + <label class="control-label col-sm-2">Parent Tag</label> + <div class="col-sm-5 mrt-8"> + <select class="form-control h160" data-id="parentTag" name="ParentTag" multiple> + </select> + </div> + <div class="mtop3"> + <a href="javascript:void(0)" class="pull-left fa fa-refresh" title="Refreh parent tag list" data-id="refreshBtn"> + </a> + </div> + </div> + <div data-id="addAttributeDiv"></div> + <div class="form-group text-right"> + <div class="col-sm-offset-2 col-sm-10"> + <button type="default" class="btn btn-default addAttr" disabled="true" data-id="addAttrBtn"><i class="fa fa-plus"></i> Add Attribute</button> + </div> + </div> + <div class="form-group panel-footer"> + <div class="col-sm-12 text-right padding0"> + <button class="btn btn-primary saveAttr" type="button" disabled="true" data-id="saveButton">Save</button> + </div> + </div> + </fieldset> + </form> + </div> + </div> + </div> +</div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/utils/Globals.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/utils/Globals.js b/dashboardv2/public/js/utils/Globals.js new file mode 100644 index 0000000..d4f25a2 --- /dev/null +++ b/dashboardv2/public/js/utils/Globals.js @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +define(['require'], function(require) { + 'use strict'; + + var Globals = {}; + + Globals.baseURL = ''; + Globals.settings = {}; + Globals.settings.PAGE_SIZE = 25; + Globals.saveApplicationState = { + mainPageState: {}, + detailPageState: {} + }; + + return Globals; +}); http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a5f8c5aa/dashboardv2/public/js/utils/Overrides.js ---------------------------------------------------------------------- diff --git a/dashboardv2/public/js/utils/Overrides.js b/dashboardv2/public/js/utils/Overrides.js new file mode 100644 index 0000000..3b598e3 --- /dev/null +++ b/dashboardv2/public/js/utils/Overrides.js @@ -0,0 +1,77 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +define(['require', 'backgrid'], function(require) { + 'use strict'; + + /* + * HtmlCell renders any html code + * @class Backgrid.HtmlCell + * @extends Backgrid.Cell + */ + var HtmlCell = Backgrid.HtmlCell = Backgrid.Cell.extend({ + + /** @property */ + className: "html-cell", + + render: function() { + this.$el.empty(); + var rawValue = this.model.get(this.column.get("name")); + var formattedValue = this.formatter.fromRaw(rawValue, this.model); + this.$el.append(formattedValue); + this.delegateEvents(); + return this; + } + }); + + var UriCell = Backgrid.UriCell = Backgrid.Cell.extend({ + className: "uri-cell", + title: null, + target: "_blank", + + initialize: function(options) { + UriCell.__super__.initialize.apply(this, arguments); + this.title = options.title || this.title; + this.target = options.target || this.target; + }, + + render: function() { + this.$el.empty(); + var rawValue = this.model.get(this.column.get("name")); + var href = _.isFunction(this.column.get("href")) ? this.column.get('href')(this.model) : this.column.get('href'); + var klass = this.column.get("klass"); + var formattedValue = this.formatter.fromRaw(rawValue, this.model); + this.$el.append($("<a>", { + tabIndex: -1, + href: href, + title: this.title || formattedValue, + 'class': klass + }).text(formattedValue)); + + if (this.column.has("iconKlass")) { + var iconKlass = this.column.get("iconKlass"); + var iconTitle = this.column.get("iconTitle"); + this.$el.find('a').append('<i class="' + iconKlass + '" title="' + iconTitle + '"></i>'); + } + this.delegateEvents(); + return this; + } + + }); + +});
