You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ve...@apache.org on 2015/05/13 23:28:03 UTC
[22/50] [abbrv] incubator-atlas git commit: Add the latest dashboard
from MPR
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a9d61e1b/dashboard/v3/js/1stmaycontrollers.js
----------------------------------------------------------------------
diff --git a/dashboard/v3/js/1stmaycontrollers.js b/dashboard/v3/js/1stmaycontrollers.js
new file mode 100755
index 0000000..59d7572
--- /dev/null
+++ b/dashboard/v3/js/1stmaycontrollers.js
@@ -0,0 +1,1250 @@
+/*
+ * 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.
+ */
+
+var DgcControllers = angular.module("DgcControllers", []);
+
+ DgcControllers.service('sharedProperties', function () {
+ var property="";
+ var Query="";
+
+ return {
+ getProperty: function () {
+ return property;
+ },
+ setProperty: function(value) {
+ property = value;
+ },
+ getQuery: function () {
+ return Query;
+ },setQuery: function(value) {
+ Query = value;
+ }
+ };
+});
+
+
+
+DgcControllers.controller("headerController", ['$scope', '$window', '$location', '$stateParams', function($scope, $window, $location,$stateParams)
+ {
+ $scope.executeSearch=function executeSearch() {
+ $window.location.href = "#Search/" + $scope.query;
+
+
+ }
+ $scope.query=$stateParams.searchid;
+ }]
+);
+
+DgcControllers.controller("footerController", ['$scope','$http', function($scope, $http)
+ {
+ $http.get('/api/metadata/admin/version')
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.apiVersion=data.Version;
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+
+ }]
+);
+
+
+DgcControllers.controller("NavController", ['$scope','$http', '$filter', 'sharedProperties', function($scope, $http, $filter, sharedProperties)
+{
+
+ $http.get('/api/metadata/types/traits/list')
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.leftnav=angular.fromJson(data.results);
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+ //Nav to textbox
+
+ $scope.updateVar = function (event) {
+ $scope.$$prevSibling.query = angular.element(event.target).text();
+
+ };
+
+
+}]
+);
+
+
+DgcControllers.controller("ListController", ['$scope','$http', '$filter','$stateParams', 'sharedProperties', function($scope, $http, $filter, $stateParams, sharedProperties)
+ {
+
+
+ $scope.isUndefined = function (strval) {
+
+ return (typeof strval === "undefined");
+ }
+
+ $scope.StoreJson = function (strval) {
+ sharedProperties.setProperty(strval);
+ }
+
+ $scope.Showpaging = function(itemlength)
+ {
+
+ return (itemlength > 1);
+ }
+
+ $scope.isString=function isString(value){
+ return typeof value === 'string';
+ }
+
+ $scope.isObject=function isObject(value){
+
+ return typeof value === 'object';
+ }
+ $scope.Storeqry=function Storeqry(value){
+
+ return typeof value === 'object';
+ }
+
+
+
+ $scope.executeSearchForleftNav = function executeSearchForleftNav(strSearch){
+ $scope.query=strSearch;
+ sharedProperties.setQuery(strSearch);
+ //$scope.executeSearch();
+ }
+
+ console.log($stateParams.searchid);
+ $scope.SearchQuery=$stateParams.searchid;
+ $scope.reverse = false;
+ $scope.filteredItems = [];
+ $scope.groupedItems = [];
+ $scope.itemsPerPage = 10;
+ $scope.pagedItems = [];
+ $scope.currentPage = 0;
+ $scope.itemlength=0;
+ $scope.configdata=[];
+ $scope.results=[];
+ $scope.datatype="";
+ $http.get('js/config.json').success(function(data){
+ $scope.configdata=data.Search;
+
+ });
+
+
+ $http.get('/api/metadata/discovery/search?query='+$scope.SearchQuery)
+ .success(function (data) {
+ $scope.iserror=false;
+ $scope.entities=angular.fromJson(data.results.rows);
+ if(!$scope.isUndefined($scope.entities)){
+ $scope.itemlength=$scope.entities.length;
+ $scope.datatype=data.results.dataType.typeName;
+
+ var i=0;
+ angular.forEach($scope.configdata, function(values, key) {
+ if (key === data.results.dataType.typeName) {
+ i=1;
+ }
+ });
+ if(i===0){
+ var tempdataType="__tempQueryResultStruct";
+ //console.log(tempdataType);
+ var datatype1=$scope.datatype.substring(0,tempdataType.length);
+ // console.log(datatype1);
+ if(datatype1===tempdataType){
+ $scope.datatype=tempdataType;
+ }
+
+ }
+
+ sharedProperties.setProperty($scope.datatype);
+ }
+
+ // console.log($scope.entities);
+
+
+ // to get value based on config but not use (used in view directly)
+ /* angular.forEach($scope.configdata, function(values, key) {
+ if(key===data.results.dataType.typeName)
+ {
+ $scope.entities.forEach(function(k,v){
+ angular.forEach(values, function(value, key1) {
+ var obj = {};
+ obj[value] = k[value];
+ $scope.results.push(obj);
+ });
+ });
+ }
+ });
+ */
+
+ $scope.currentPage = 0;
+ // now group by pages
+ $scope.groupToPages();
+
+
+ });
+ // .error(function (e) {
+ // alert("failed");
+ // $scope.iserror=true;
+ // $scope.error=e;
+
+
+ // });
+
+//click value to textbox
+
+ $scope.updateVars = function (event) {
+ var appElement = document.querySelector('[ng-model=query]');
+ var $scope = angular.element(appElement).scope();
+ $scope.query = angular.element(event.target).text();
+ // $scope.$apply(function() {
+ // $scope.query = angular.element(event.target).text();
+ // });
+
+
+ console.log("test");
+ console.log(angular.element(event.target).text());
+ console.log("testingFact");
+ };
+ //click value to textbox
+ $scope.getGuidName=function getGuidName(val){
+ $http.get('/api/metadata/entities/definition/'+val)
+ .success(function (data) {
+ $scope.iserror1=false;
+ if(!$scope.isUndefined(data.results)){
+ $scope.gname=angular.fromJson(data.results);
+ console.log(angular.fromJson(data.results));
+ // $scope.gname=data.results.name;
+ }
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+ //return $scope.gname;
+ }
+
+
+ // calculate page in place
+ $scope.groupToPages = function () {
+ $scope.pagedItems = [];
+
+ for (var i = 0; i < $scope.itemlength; i++) {
+ if (i % $scope.itemsPerPage === 0) {
+ $scope.pagedItems[Math.floor(i / $scope.itemsPerPage)] = [ $scope.entities[i] ];
+ } else {
+ $scope.pagedItems[Math.floor(i / $scope.itemsPerPage)].push($scope.entities[i]);
+ }
+ }
+
+ };
+
+ $scope.range = function (start, end) {
+ var ret = [];
+ if (!end) {
+ end = start;
+ start = 0;
+ }
+ for (var i = start; i < end; i++) {
+ ret.push(i);
+ }
+ return ret;
+ };
+
+ $scope.prevPage = function () {
+ if ($scope.currentPage > 0) {
+ $scope.currentPage--;
+ }
+ };
+
+ $scope.nextPage = function () {
+ if ($scope.currentPage < $scope.pagedItems.length - 1) {
+ $scope.currentPage++;
+ }
+ };
+
+
+ $scope.firstPage = function () {
+ if ($scope.currentPage > 0) {
+ $scope.currentPage = 0;
+ }
+ };
+
+ $scope.lastPage = function () {
+ if ($scope.currentPage < $scope.pagedItems.length - 1) {
+ $scope.currentPage = $scope.pagedItems.length-1;
+ }
+ };
+ $scope.setPage = function () {
+ $scope.currentPage = this.n;
+ };
+
+ }]
+);
+
+
+DgcControllers.controller("DefinitionController", ['$scope','$http', '$stateParams', 'sharedProperties','$q', function($scope, $http, $stateParams, sharedProperties, $q)
+ {
+
+ $scope.guidName="";
+ $scope.ids=[];
+ $scope.isUndefined = function (strval) {
+ return (typeof strval === "undefined");
+ }
+
+ $scope.isString=function isString(value){
+ return typeof value === 'string' || getType(value)==='[object Number]';
+ }
+
+ var getType = function (elem) {
+ return Object.prototype.toString.call(elem);
+ };
+
+ $scope.isObject=function isObject(value){
+ return typeof value === 'object';
+ }
+//onclick to textbox
+
+ $scope.updateDetailsVariable = function (event) {
+ var appElement = document.querySelector('[ng-model=query]');
+ var $scope = angular.element(appElement).scope();
+ $scope.query = angular.element(event.target).text();
+ // $scope.$apply(function() {
+ // $scope.query = angular.element(event.target).text();
+ // });
+
+
+ console.log("test");
+ console.log(angular.element(event.target).text());
+ console.log("testing");
+ };
+//onclick to textbox
+ $scope.getGuidName=function getGuidName(val){
+ $http.get('/api/metadata/entities/definition/'+val)
+ .success(function (data) {
+ $scope.iserror1=false;
+ if(!$scope.isUndefined(data.results)){
+ $scope.gname=angular.fromJson(data.results);
+ //console.log(angular.fromJson(data.results));
+ // $scope.gname=data.results.name;
+ }
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+ return true;
+ }
+
+ $scope.Name=$stateParams.Id;
+ $scope.searchqry=sharedProperties.getQuery();
+ $scope.datatype1=sharedProperties.getProperty();
+
+ $http.get('/api/metadata/entities/definition/'+$stateParams.Id)
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.details= angular.fromJson(data.results);
+ if(!$scope.isUndefined( $scope.details)) {
+ // console.log($scope.details['name']);
+ $scope.datatype1=$scope.details["$typeName$"];
+ $scope.getSchema($scope.details['name']);
+ $scope.getLinegae($scope.details['name']);
+ $scope.getLinegaeforinput($scope.details['name']);
+ }
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+
+
+ $scope.getSchema= function (tableName) {
+
+ $http.get('/api/metadata/lineage/hive/schema/'+tableName)
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.schema= angular.fromJson(data.results.rows);
+ // console.log(tableName);
+
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+ }
+
+$scope.getLinegae= function (tableName) {
+
+// $scope.width = 900;
+// $scope.height = 900;
+ var arr=[];
+ var arrmyalias=[];
+ var datatypes=[];
+ var tags=[];
+ $http.get('/api/metadata/lineage/hive/outputs/'+tableName)
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.lineage= angular.fromJson(data.results.rows);
+
+ $scope.vts = [];
+ $scope.edges1 = [];
+ $scope.listguid = [];
+ angular.forEach($scope.lineage, function(lineage1){
+ var level = 0;
+ angular.forEach(lineage1.path, function(item, index){
+ // if ($scope.listguid.indexOf(index) == -1) {
+ // $scope.listguid.push(index);
+
+ $scope.vts.push({"Name": item.guid,"Id" :index,"hasChild":"True","type":item.typeName});
+ $scope.edges1.push({source: index, target: (index+1)});
+
+ // }
+ });
+
+ });
+
+
+ var newarr = [];
+ var unique = {};
+
+ angular.forEach($scope.edges1, function(item) {
+ if (!unique[item.source]) {
+ newarr.push(item);
+ unique[item.source] = item;
+ //console.log(newarr);
+ }
+ });
+
+ var newarrvts = [];
+ var uniquevts = {};
+
+ angular.forEach($scope.vts, function(item) {
+ if (!uniquevts[item.Name]) {
+ newarrvts.push(item);
+ uniquevts[item.Name] = item;
+
+ var url="/api/metadata/entities/definition/"+item.Name;
+ arr.push($http.get(url));
+ }
+ });
+
+
+ $q.all(arr).then(function(ret){
+ //console.log("Result guid list length="+ret.length);
+ for(var i=0;i<ret.length;i++){
+ var f=angular.fromJson(ret[i].data.results);
+ //console.log(i+"Their Names="+angular.toJson(f));
+ //console.log(i+"Their Names="+f.name);
+ arrmyalias[i]=f.name;
+
+ datatypes[i]=f['$typeName$'];
+
+ if(f['$typeName$']==="Table")
+ {
+ angular.forEach(f['$traits$'], function(key, value) {
+ tags[i]=value;
+
+ });
+ }
+ else{
+ tags[i]=f.queryText;
+ }
+
+
+ }
+if(arrmyalias.length>1){
+ doMakeStaticJson(arrmyalias);
+ }
+ else{
+ $scope.errornodata="";
+ }
+// loadjsonRealv2(arrmyalias);
+ // doMakeStaticJson(arrmyalias);
+
+ });
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+
+ function doMakeStaticJson(arrmyalias){
+
+ var toparr=[];
+ console.log(arrmyalias.length);
+ var rootobj=new Object();
+ rootobj.name=arrmyalias[0];
+ rootobj.alias=arrmyalias[0];
+ rootobj.query=tags[0];
+ rootobj.datatype=datatypes[0];
+ rootobj.parent="null";
+
+ toparr[0]=rootobj;
+
+//start first object
+ var child1obj=new Object();
+ child1obj.alias=arrmyalias[1];
+ child1obj.name=arrmyalias[1];
+ child1obj.query=tags[1];
+ child1obj.datatype=datatypes[1];
+ child1obj.parent=arrmyalias[0];
+
+ //start
+ var childsub1obj=new Object();
+ childsub1obj.name=arrmyalias[2];
+ childsub1obj.alias=arrmyalias[2];
+ childsub1obj.query=tags[2];
+ childsub1obj.datatype=datatypes[2];
+ childsub1obj.parent=arrmyalias[1];
+ if(arrmyalias.length>2){
+ var arraychildren1=[];
+ arraychildren1.push(childsub1obj);
+ child1obj.children=arraychildren1;
+ }
+ //start
+ var childsub2obj=new Object();
+ childsub2obj.name=arrmyalias[3];
+ childsub2obj.alias=arrmyalias[3];
+ childsub2obj.query=tags[3];
+ childsub2obj.datatype=datatypes[3];
+ childsub2obj.parent=arrmyalias[2];
+ if(arrmyalias.length>3){
+ var arraychildren2=[];
+ arraychildren2.push(childsub2obj);
+ childsub1obj.children=arraychildren2;
+ }
+
+ //start
+ var childsub3obj=new Object();
+ childsub3obj.name=arrmyalias[4];
+ childsub3obj.alias=arrmyalias[4];
+ childsub3obj.query=tags[4];
+ childsub3obj.datatype=datatypes[4];
+ childsub3obj.parent=arrmyalias[3];
+ if(arrmyalias.length>4){
+ var arraychildren3=[];
+ arraychildren3.push(childsub3obj);
+ childsub2obj.children=arraychildren3;
+ }
+
+///end first objects
+
+
+
+ /*var arraychildren2=[];
+ arraychildren2.push(child1obj2);
+// arraychildren2.push(childsub2obj2);
+
+
+ child1obj2.children=arraychildren2;
+
+
+ //end second objects
+ */
+
+ var array1=[];
+ array1[0]=child1obj;
+// array1[1]=child1obj2;
+
+
+ rootobj.children=array1;
+
+
+ //console.info("MITH SEE THIS="+angular.toJson(toparr));
+
+ root = toparr[0];
+ console.log(root);
+ update(root);
+ }
+
+
+ //Width and height
+ var width = 700,
+ height = 500,
+ root;
+//image intitializer
+ var mitharr=["img/tableicon.png","img/process.png","img/tableicon.png","img/process.png","img/tableicon.png"];
+
+
+
+ var force = d3.layout.force()
+ .gravity(0)
+ .friction(0.7)
+ .charge(-90)
+ .linkDistance(120)
+ .size([width, height])
+ .on("tick", tick);
+
+ var svg = d3.select("svg")
+// .attr("transform", "translate(" + (width/2) +
+// "," + (height/2) + ")")
+
+ .attr('transform-origin', '-419 -530')
+ .attr("viewBox", "10 -300 1000 1000")
+ .attr("preserveAspectRatio", "xMidYMid meet");
+// .append("g")
+// .attr("transform", "translate(" + d.x + "," + d.y +") rotate(180) scale(-1, -1)");
+
+
+// .attr("preserveAspectRatio", "xMidYMid slice");
+
+ var link = svg.selectAll(".link"),
+ node = svg.selectAll(".node");
+
+ var tip = d3.tip()
+ .attr('class', 'd3-tip')
+ .offset([-10, 0])
+ .html(function(d) {
+ return "<pre class='alert alert-success' style='max-width:400px;'>" + d.query + "</pre>";
+ });
+ svg.call(tip);
+
+ function update(source) {
+ var nodes = flatten(root),
+ links = d3.layout.tree().links(nodes);
+
+ // Restart the force layout.
+ force
+ .nodes(nodes)
+ .links(links)
+
+ .start();
+
+ // Update links.
+ link = link.data(links, function(d) { return d.target.id; });
+
+ link.exit().remove();
+
+ link.enter().insert("line", ".node")
+ .attr("class", "link");
+
+ // Update nodes.
+ node = node.data(nodes, function(d) { return d.id; });
+
+ node.exit().remove();
+
+ svg.append("svg:pattern").attr("id","processICO").attr("width",1).attr("height",1)
+ .append("svg:image").attr("xlink:href","./img/process.png").attr("x",-5.5).attr("y",-4).attr("width",42).attr("height",42);
+ svg.append("svg:pattern").attr("id","textICO").attr("width",1).attr("height",1)
+ .append("svg:image").attr("xlink:href","./img/tableicon.png").attr("x",2).attr("y",2).attr("width",25).attr("height",25);
+
+
+//arrow
+ svg.append("svg:defs").append("svg:marker").attr("id", "arrow").attr("viewBox", "0 0 10 10").attr("refX", 36).attr("refY", 5).attr("markerUnits", "strokeWidth").attr("markerWidth", 8).attr("markerHeight", 8).attr("orient", "auto").append("svg:path").attr("d", "M 0 0 L 10 5 L 0 10 z");
+//arrow
+ var nodeEnter = node.enter().append("g")
+ .attr("class", "nodeTrans")
+ .on("mouseover", tip.show)
+ .on("mouseout", tip.hide)
+ .call(force.drag);
+
+
+
+
+ nodeEnter.append("circle")
+ .attr("r", function(d) { return 15; });
+
+ link.attr("marker-end", "url(#arrow)"); //also added attribute for arrow at end
+
+ nodeEnter.append("text")
+ .style("text-anchor", "middle")
+
+
+ .attr("dy", "-1em")
+
+ .attr("text-anchor", function(d) {
+ return d.children || d._children ? "end" : "start"; })
+ .text(function(d) {
+ return d.alias;
+ //return d.name;
+ })
+
+ .style("fill-opacity", 1);
+
+
+// nodeEnter.select("circle")
+// .attr("xlink:href", function(d) {
+// //return d.icon;
+// return mitharr[d.depth];
+// })
+// .attr("x", "-12px")
+// .attr("y", "-12px")
+// .attr("width", "24px")
+// .attr("height", "24px");
+
+
+ node.select("circle")
+// .attr("xlink:href", function(d) {
+// //return d.icon;
+// return mitharr[d.depth];
+// })
+ .style("fill", function(d, i) {
+ if(d.datatype==="Table"){
+ return "url('#textICO')";
+
+ }else{
+ return "url('#processICO')";
+ }
+ return colors(i);
+ });
+//force.stop();
+//force.resume();
+
+}
+
+//force.stop();
+function tick() {
+ link.attr("x1", function(d) { return d.source.x; })
+ .attr("y1", function(d) { return d.source.y; })
+ .attr("x2", function(d) { return d.target.x; })
+ .attr("y2", function(d) { return d.target.y; });
+
+
+ node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ") " });
+
+}
+
+//node[0].x = width / 2;
+// node[1].y = height / 2;
+d3.select(window).on('resize', update);
+
+function color(d) {
+ return d._children ? "#3182bd" // collapsed package
+ : d.children ? "#c6dbef" // expanded package
+ : "#fd8d3c"; // leaf node
+}
+
+// Toggle children on click.
+function click(d) {
+ if (d3.event.defaultPrevented) return; // ignore drag
+ if (d.children) {
+ d._children = d.children;
+ d.children = null;
+ } else {
+ d.children = d._children;
+ d._children = null;
+ }
+ update();
+
+}
+
+// Returns a list of all nodes the root.
+function flatten(root) {
+ var nodes = [], i = 0;
+
+ function recurse(node) {
+ if (node.children) node.children.forEach(recurse);
+ if (!node.id) node.id = ++i;
+ nodes.push(node);
+ }
+
+ recurse(root);
+ return nodes;
+
+}
+
+
+//
+// })
+// .error(function (e) {
+// $scope.iserror1=true;
+// $scope.error1=e;
+// });
+
+
+ }
+
+
+
+
+
+$scope.getLinegaeforinput= function (tableName) {
+
+// $scope.width = 900;
+// $scope.height = 900;
+ var arr=[];
+ var arrmyalias=[];
+ var datatypes=[];
+ var tags=[];
+ $http.get('/api/metadata/lineage/hive/inputs/'+tableName)
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.lineage= angular.fromJson(data.results.rows);
+
+ $scope.vts = [];
+ $scope.edges1 = [];
+ $scope.listguid = [];
+ angular.forEach($scope.lineage, function(lineage1){
+ var level = 0;
+ angular.forEach(lineage1.path, function(item, index){
+ // if ($scope.listguid.indexOf(index) == -1) {
+ // $scope.listguid.push(index);
+
+ $scope.vts.push({"Name": item.guid,"Id" :index,"hasChild":"True","type":item.typeName});
+ $scope.edges1.push({source: index, target: (index+1)});
+
+ // }
+ });
+
+ });
+
+ var newarr = [];
+ var unique = {};
+
+ angular.forEach($scope.edges1, function(item) {
+ if (!unique[item.source]) {
+ newarr.push(item);
+ unique[item.source] = item;
+ //console.log(newarr);
+ }
+ });
+
+ var newarrvts = [];
+ var uniquevts = {};
+
+ angular.forEach($scope.vts, function(item) {
+ if (!uniquevts[item.Name]) {
+ newarrvts.push(item);
+ uniquevts[item.Name] = item;
+
+ var url="/api/metadata/entities/definition/"+item.Name;
+ arr.push($http.get(url));
+
+ //getLienageGuidName(item.Name);
+
+ }
+ });
+ console.log(item.Name);
+
+ $q.all(arr).then(function(ret){
+ //console.log("Result guid list length="+ret.length);
+ for(var i=0;i<ret.length;i++){
+ var f=angular.fromJson(ret[i].data.results);
+ //console.log(i+"Their Names="+angular.toJson(f));
+ //console.log(i+"Their Names="+f.name);
+ arrmyalias[i]=f.name;
+
+ datatypes[i]=f['$typeName$'];
+
+ if(f['$typeName$']==="Table")
+ {
+ angular.forEach(f['$traits$'], function(key, value) {
+ tags[i]=value;
+ console.log(value);
+ });
+ }
+ else{
+ tags[i]=f.queryText;
+ console.log(f.queryText);
+ }
+
+
+ }
+ console.log(arrmyalias);
+
+if(arrmyalias.length>1){
+ doMakeStaticJson(arrmyalias);
+ }
+ else{
+ $scope.errornodata1="";
+ }
+// loadjsonRealv2(arrmyalias);
+ // doMakeStaticJson(arrmyalias);
+
+ });
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+
+ function doMakeStaticJson(arrmyalias){
+
+ var toparr=[];
+
+ var rootobj=new Object();
+ rootobj.name=arrmyalias[0];
+ rootobj.alias=arrmyalias[0];
+ rootobj.query=tags[0];
+ rootobj.datatype=datatypes[0];
+ rootobj.parent="null";
+
+ toparr[0]=rootobj;
+
+//start first object
+ var child1obj=new Object();
+ child1obj.alias=arrmyalias[1];
+ child1obj.name=arrmyalias[1];
+ child1obj.query=tags[1];
+ child1obj.datatype=datatypes[1];
+ child1obj.parent=arrmyalias[0];
+
+ //start
+ var childsub1obj=new Object();
+ childsub1obj.name=arrmyalias[2];
+ childsub1obj.alias=arrmyalias[2];
+ childsub1obj.query=tags[2];
+ childsub1obj.datatype=datatypes[2];
+ childsub1obj.parent=arrmyalias[1];
+
+ if(arrmyalias.length>2){
+ var arraychildren1=[];
+ arraychildren1.push(childsub1obj);
+ child1obj.children=arraychildren1;
+ }
+ //start
+ var childsub2obj=new Object();
+ childsub2obj.name=arrmyalias[3];
+ childsub2obj.alias=arrmyalias[3];
+ childsub2obj.query=tags[3];
+ childsub2obj.datatype=datatypes[3];
+ childsub2obj.parent=arrmyalias[2];
+ if(arrmyalias.length>3){
+ var arraychildren2=[];
+ arraychildren2.push(childsub2obj);
+ childsub1obj.children=arraychildren2;
+ }
+
+ //start
+ var childsub3obj=new Object();
+ childsub3obj.name=arrmyalias[4];
+ childsub3obj.alias=arrmyalias[4];
+ childsub3obj.query=tags[4];
+ childsub3obj.datatype=datatypes[4];
+ childsub3obj.parent=arrmyalias[3];
+
+ if(arrmyalias.length>4){
+ var arraychildren3=[];
+ arraychildren3.push(childsub3obj);
+ childsub2obj.children=arraychildren3;
+ }
+
+
+///end first objects
+
+
+
+ /*var arraychildren2=[];
+ arraychildren2.push(child1obj2);
+// arraychildren2.push(childsub2obj2);
+
+
+ child1obj2.children=arraychildren2;
+
+
+ //end second objects
+ */
+
+ var array1=[];
+ array1[0]=child1obj;
+// array1[1]=child1obj2;
+
+
+ rootobj.children=array1;
+
+
+ //console.info("MITH SEE THIS="+angular.toJson(toparr));
+
+ root = toparr[0];
+ console.log("test input");
+ console.log(root);
+ update(root);
+ }
+
+
+ //Width and height
+ var width = 700,
+ height = 500,
+ root;
+//image intitializer
+ var mitharr=["img/tableicon.png","img/process.png","img/tableicon.png","img/process.png","img/tableicon.png"];
+
+
+
+ var force = d3.layout.force()
+ .gravity(0)
+ .friction(0.7)
+ .charge(-90)
+ .linkDistance(120)
+ .size([width, height])
+ .on("tick", tick);
+
+ var svg = d3.select("svg1").append("svg")
+// .attr("transform", "translate(" + (width/2) +
+// "," + (height/2) + ")")
+
+ .attr('transform-origin', '-419 -530')
+ .attr("viewBox", "10 -300 1000 1000")
+ .attr("preserveAspectRatio", "xMidYMid meet");
+// .append("g")
+// .attr("transform", "translate(" + d.x + "," + d.y +") rotate(180) scale(-1, -1)");
+
+
+// .attr("preserveAspectRatio", "xMidYMid slice");
+
+ var link = svg.selectAll(".link"),
+ node = svg.selectAll(".node");
+
+ var tip = d3.tip()
+ .attr('class', 'd3-tip')
+ .offset([-10, 0])
+ .html(function(d) {
+ return "<pre class='alert alert-success' style='max-width:400px;'>" + d.query + "</pre>";
+ });
+
+ if(svg){
+ svg.call(tip);
+ }
+
+
+ function update(source) {
+ var nodes = flatten(root),
+ links = d3.layout.tree().links(nodes);
+
+ // Restart the force layout.
+ force
+ .nodes(nodes)
+ .links(links)
+
+ .start();
+
+ // Update links.
+ link = link.data(links, function(d) { return d.target.id; });
+
+ link.exit().remove();
+
+ link.enter().insert("line", ".node")
+ .attr("class", "link");
+
+ // Update nodes.
+ node = node.data(nodes, function(d) { return d.id; });
+
+ node.exit().remove();
+
+ svg.append("svg:pattern").attr("id","processICO1").attr("width",1).attr("height",1)
+ .append("svg:image").attr("xlink:href","./img/process.png").attr("x",-5.5).attr("y",-4).attr("width",42).attr("height",42);
+ svg.append("svg:pattern").attr("id","textICO1").attr("width",1).attr("height",1)
+ .append("svg:image").attr("xlink:href","./img/tableicon.png").attr("x",2).attr("y",2).attr("width",25).attr("height",25);
+
+
+//arrow
+ svg.append("svg:defs").append("svg:marker").attr("id", "arrow1").attr("viewBox", "0 0 10 10").attr("refX", 60).attr("refY", 5).attr("markerUnits", "strokeWidth").attr("markerWidth", 8).attr("markerHeight", 8).attr("orient", "auto").append("svg:path").attr("d", "M 0 0 L 10 5 L 0 10 z");
+//arrow
+ var nodeEnter = node.enter().append("g")
+ .attr("class", "nodeTrans")
+ .on("mouseover", tip.show)
+ .on("mouseout", tip.hide)
+ .call(force.drag);
+
+
+
+
+ nodeEnter.append("circle")
+ .attr("r", function(d) { return 15; });
+
+ link.attr("marker-end", "url(#arrow1)"); //also added attribute for arrow at end
+
+ nodeEnter.append("text")
+ .style("text-anchor", "middle")
+
+
+ .attr("dy", "-1em")
+
+ .attr("text-anchor", function(d) {
+ return d.children || d._children ? "end" : "start"; })
+ .text(function(d) {
+ return d.alias;
+ //return d.name;
+ })
+
+ .style("fill-opacity", 1);
+
+
+// nodeEnter.select("circle")
+// .attr("xlink:href", function(d) {
+// //return d.icon;
+// return mitharr[d.depth];
+// })
+// .attr("x", "-12px")
+// .attr("y", "-12px")
+// .attr("width", "24px")
+// .attr("height", "24px");
+
+
+ node.select("circle")
+// .attr("xlink:href", function(d) {
+// //return d.icon;
+// return mitharr[d.depth];
+// })
+ .style("fill", function(d) {
+ if(d.datatype==="Table"){
+ return "url('#textICO1')";
+
+ }else{
+ return "url('#processICO1')";
+ }
+ return colors(i);
+ });
+//force.stop();
+//force.resume();
+
+}
+
+//force.stop();
+function tick() {
+ link.attr("x1", function(d) { return d.source.x; })
+ .attr("y1", function(d) { return d.source.y; })
+ .attr("x2", function(d) { return d.target.x; })
+ .attr("y2", function(d) { return d.target.y; });
+
+
+ node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ") " });
+
+}
+
+//node[0].x = width / 2;
+// node[1].y = height / 2;
+d3.select(window).on('resize', update);
+
+function color(d) {
+ return d._children ? "#3182bd" // collapsed package
+ : d.children ? "#c6dbef" // expanded package
+ : "#fd8d3c"; // leaf node
+}
+
+// Toggle children on click.
+function click(d) {
+ if (d3.event.defaultPrevented) return; // ignore drag
+ if (d.children) {
+ d._children = d.children;
+ d.children = null;
+ } else {
+ d.children = d._children;
+ d._children = null;
+ }
+ update();
+
+}
+
+// Returns a list of all nodes the root.
+function flatten(root) {
+ var nodes = [], i = 0;
+
+ function recurse(node) {
+ if (node.children) node.children.forEach(recurse);
+ if (!node.id) node.id = ++i;
+ nodes.push(node);
+ }
+
+ recurse(root);
+ return nodes;
+
+}
+
+
+//
+// })
+// .error(function (e) {
+// $scope.iserror1=true;
+// $scope.error1=e;
+// });
+
+
+ }
+
+
+
+ // console.log( $scope.vts);
+
+ $scope.reverse = function(array) {
+ var copy = [].concat(array);
+ return copy.reverse();
+ }
+
+ // function back()
+ // {
+ // $window.history.back();
+ // myModule.run(function ($rootScope, $location) {
+
+ // var history = [];
+
+ // $rootScope.$on('$routeChangeSuccess', function() {
+ // history.push($location.$$path);
+ // });
+
+ // $rootScope.back = function () {
+ // var prevUrl = history.length > 1 ? history.splice(-2)[0] : "/";
+ // $location.path(prevUrl);
+ // };
+
+ // });
+ // }
+
+
+
+
+ }]
+);
+
+
+DgcControllers.controller("GuidController", ['$scope','$http', '$filter','$stateParams', 'sharedProperties', function($scope, $http, $filter, $stateParams, sharedProperties)
+ {
+
+
+
+$scope.getGuidName=function getGuidName(val){
+
+ $scope.gnew=[];
+ $http.get('/api/metadata/entities/definition/'+val)
+ .success(function (data) {
+ $scope.iserror1=false;
+ if(!$scope.isUndefined(data.results)){
+
+ $scope.gname=angular.fromJson(data.results);
+ var data1=angular.fromJson(data.results);
+ //$scope.gnew({"id" : val,"name" : data1['name']});
+
+ $scope.gnew= $scope.gname.name;
+ // $scope.$watch($scope.gnew, true);
+
+}
+ //dddd
+
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+
+ //return $scope.gnew;
+ }
+
+
+ }]
+);
+
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a9d61e1b/dashboard/v3/js/app.js
----------------------------------------------------------------------
diff --git a/dashboard/v3/js/app.js b/dashboard/v3/js/app.js
new file mode 100755
index 0000000..0adb15b
--- /dev/null
+++ b/dashboard/v3/js/app.js
@@ -0,0 +1,63 @@
+/*
+ * 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.
+ */
+
+var DgcApp = angular.module('DgcApp', [
+ 'ui.router',
+ 'DgcControllers',
+ 'ui.bootstrap'
+]);
+
+DgcApp.config(['$urlRouterProvider','$stateProvider', function($urlRouterProvider, $stateProvider) {
+ $urlRouterProvider.otherwise('Home');
+ $stateProvider
+ .state('Home', {
+ url: 'Home',
+ views: {
+ 'content': {
+ templateUrl: 'partials/search.html',
+ controller: 'ListController'
+ }
+ }
+ })
+ .state('Search', {
+ url: '/Search/:searchid',
+ views: {
+ 'content': {
+ templateUrl: 'partials/search.html',
+ controller: 'ListController'
+ }
+ }
+ })
+ .state('details', {
+ url: 'details/:Id',
+ views: {
+ 'content': {
+ templateUrl: 'partials/wiki.html',
+ controller: 'DefinitionController'
+ }
+ }
+ });
+}]);
+
+DgcApp.run(['$window', '$rootScope',
+function ($window , $rootScope) {
+ $rootScope.goBack = function(){
+ $window.history.back();
+ return false;
+ }
+}]);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a9d61e1b/dashboard/v3/js/config.json
----------------------------------------------------------------------
diff --git a/dashboard/v3/js/config.json b/dashboard/v3/js/config.json
new file mode 100755
index 0000000..4530ee0
--- /dev/null
+++ b/dashboard/v3/js/config.json
@@ -0,0 +1,54 @@
+{ "Search": {
+ "Table": [
+ { "$id$":["id"] },
+ "name",
+ { "description": ["description"] },
+ "owner",
+ "createTime",
+ { "$traits$":[""]}
+ ],
+ "DB": [
+ { "$id$":["id"] },
+ "name",
+ { "description": ["description"] },
+ "locationUri",
+ "owner",
+ { "$traits$":[""]}
+ ],
+ "Column": [
+ { "$id$":["id"] },
+ "name",
+ "dataType",
+ "comment",
+ "table",
+ { "$traits$":[""]}
+ ],
+ "__tempQueryResultStruct": [
+ { "instanceInfo": ["guid","typeName"] }
+ ],
+ "StorageDesc": [
+ { "$id$":["id"] },
+ "compressed",
+ "outputFormat",
+ "location",
+ "inputFormat",
+ { "$traits$":[""]}
+ ],
+ "LoadProcess": [
+ { "$id$":["id"] },
+{ "inputTables":["id"] },
+ "name",
+ "queryText",
+ "startTime",
+ "endTime",
+ { "$traits$":[""]}
+ ],
+ "View": [
+ { "$id$":["id"] },
+ "inputTables",
+ "name",
+ { "$traits$":[""]}
+ ]
+
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a9d61e1b/dashboard/v3/js/controllers.js
----------------------------------------------------------------------
diff --git a/dashboard/v3/js/controllers.js b/dashboard/v3/js/controllers.js
new file mode 100755
index 0000000..c707a6d
--- /dev/null
+++ b/dashboard/v3/js/controllers.js
@@ -0,0 +1,1247 @@
+/*
+ * 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.
+ */
+
+var DgcControllers = angular.module("DgcControllers", []);
+
+ DgcControllers.service('sharedProperties', function () {
+ var property="";
+ var Query="";
+
+ return {
+ getProperty: function () {
+ return property;
+ },
+ setProperty: function(value) {
+ property = value;
+ },
+ getQuery: function () {
+ return Query;
+ },setQuery: function(value) {
+ Query = value;
+ }
+ };
+});
+
+
+
+DgcControllers.controller("headerController", ['$scope', '$window', '$location', '$stateParams', function($scope, $window, $location,$stateParams)
+ {
+ $scope.executeSearch=function executeSearch() {
+ $window.location.href = "#Search/" + $scope.query;
+
+
+ }
+ $scope.query=$stateParams.searchid;
+ }]
+);
+
+DgcControllers.controller("footerController", ['$scope','$http', function($scope, $http)
+ {
+ $http.get('/api/metadata/admin/version')
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.apiVersion=data.Version;
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+
+ }]
+);
+
+
+DgcControllers.controller("NavController", ['$scope','$http', '$filter', 'sharedProperties', function($scope, $http, $filter, sharedProperties)
+{
+
+ $http.get('/api/metadata/types/traits/list')
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.leftnav=angular.fromJson(data.results);
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+ //Nav to textbox
+
+ $scope.updateVar = function (event) {
+ $scope.$$prevSibling.query = angular.element(event.target).text();
+
+ };
+
+
+}]
+);
+
+
+DgcControllers.controller("ListController", ['$scope','$http', '$filter','$stateParams', 'sharedProperties', function($scope, $http, $filter, $stateParams, sharedProperties)
+ {
+
+
+ $scope.isUndefined = function (strval) {
+
+ return (typeof strval === "undefined");
+ }
+
+ $scope.StoreJson = function (strval) {
+ sharedProperties.setProperty(strval);
+ }
+
+ $scope.Showpaging = function(itemlength)
+ {
+
+ return (itemlength > 1);
+ }
+
+ $scope.isString=function isString(value){
+ return typeof value === 'string';
+ }
+
+ $scope.isObject=function isObject(value){
+
+ return typeof value === 'object';
+ }
+ $scope.Storeqry=function Storeqry(value){
+
+ return typeof value === 'object';
+ }
+
+
+
+ $scope.executeSearchForleftNav = function executeSearchForleftNav(strSearch){
+ $scope.query=strSearch;
+ sharedProperties.setQuery(strSearch);
+ //$scope.executeSearch();
+ }
+
+ console.log($stateParams.searchid);
+ $scope.SearchQuery=$stateParams.searchid;
+ $scope.reverse = false;
+ $scope.filteredItems = [];
+ $scope.groupedItems = [];
+ $scope.itemsPerPage = 10;
+ $scope.pagedItems = [];
+ $scope.currentPage = 0;
+ $scope.itemlength=0;
+ $scope.configdata=[];
+ $scope.results=[];
+ $scope.datatype="";
+ $http.get('js/config.json').success(function(data){
+ $scope.configdata=data.Search;
+
+ });
+
+
+ $http.get('/api/metadata/discovery/search?query='+$scope.SearchQuery)
+ .success(function (data) {
+ $scope.iserror=false;
+ $scope.entities=angular.fromJson(data.results.rows);
+ if(!$scope.isUndefined($scope.entities)){
+ $scope.itemlength=$scope.entities.length;
+ $scope.datatype=data.results.dataType.typeName;
+
+ var i=0;
+ angular.forEach($scope.configdata, function(values, key) {
+ if (key === data.results.dataType.typeName) {
+ i=1;
+ }
+ });
+ if(i===0){
+ var tempdataType="__tempQueryResultStruct";
+ //console.log(tempdataType);
+ var datatype1=$scope.datatype.substring(0,tempdataType.length);
+ // console.log(datatype1);
+ if(datatype1===tempdataType){
+ $scope.datatype=tempdataType;
+ }
+
+ }
+
+ sharedProperties.setProperty($scope.datatype);
+ }
+
+ // console.log($scope.entities);
+
+
+ // to get value based on config but not use (used in view directly)
+ /* angular.forEach($scope.configdata, function(values, key) {
+ if(key===data.results.dataType.typeName)
+ {
+ $scope.entities.forEach(function(k,v){
+ angular.forEach(values, function(value, key1) {
+ var obj = {};
+ obj[value] = k[value];
+ $scope.results.push(obj);
+ });
+ });
+ }
+ });
+ */
+
+ $scope.currentPage = 0;
+ // now group by pages
+ $scope.groupToPages();
+
+
+ });
+ // .error(function (e) {
+ // alert("failed");
+ // $scope.iserror=true;
+ // $scope.error=e;
+
+
+ // });
+
+//click value to textbox
+
+ $scope.updateVars = function (event) {
+ var appElement = document.querySelector('[ng-model=query]');
+ var $scope = angular.element(appElement).scope();
+ $scope.query = angular.element(event.target).text();
+ // $scope.$apply(function() {
+ // $scope.query = angular.element(event.target).text();
+ // });
+
+
+ console.log("test");
+ console.log(angular.element(event.target).text());
+ console.log("testingFact");
+ };
+ //click value to textbox
+ $scope.getGuidName=function getGuidName(val){
+ $http.get('/api/metadata/entities/definition/'+val)
+ .success(function (data) {
+ $scope.iserror1=false;
+ if(!$scope.isUndefined(data.results)){
+ $scope.gname=angular.fromJson(data.results);
+ console.log(angular.fromJson(data.results));
+ // $scope.gname=data.results.name;
+ }
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+ //return $scope.gname;
+ }
+
+
+ // calculate page in place
+ $scope.groupToPages = function () {
+ $scope.pagedItems = [];
+
+ for (var i = 0; i < $scope.itemlength; i++) {
+ if (i % $scope.itemsPerPage === 0) {
+ $scope.pagedItems[Math.floor(i / $scope.itemsPerPage)] = [ $scope.entities[i] ];
+ } else {
+ $scope.pagedItems[Math.floor(i / $scope.itemsPerPage)].push($scope.entities[i]);
+ }
+ }
+
+ };
+
+ $scope.range = function (start, end) {
+ var ret = [];
+ if (!end) {
+ end = start;
+ start = 0;
+ }
+ for (var i = start; i < end; i++) {
+ ret.push(i);
+ }
+ return ret;
+ };
+
+ $scope.prevPage = function () {
+ if ($scope.currentPage > 0) {
+ $scope.currentPage--;
+ }
+ };
+
+ $scope.nextPage = function () {
+ if ($scope.currentPage < $scope.pagedItems.length - 1) {
+ $scope.currentPage++;
+ }
+ };
+
+
+ $scope.firstPage = function () {
+ if ($scope.currentPage > 0) {
+ $scope.currentPage = 0;
+ }
+ };
+
+ $scope.lastPage = function () {
+ if ($scope.currentPage < $scope.pagedItems.length - 1) {
+ $scope.currentPage = $scope.pagedItems.length-1;
+ }
+ };
+ $scope.setPage = function () {
+ $scope.currentPage = this.n;
+ };
+
+ }]
+);
+
+
+DgcControllers.controller("DefinitionController", ['$scope','$http', '$stateParams', 'sharedProperties','$q', function($scope, $http, $stateParams, sharedProperties, $q)
+ {
+
+ $scope.guidName="";
+ $scope.ids=[];
+ $scope.isUndefined = function (strval) {
+ return (typeof strval === "undefined");
+ }
+
+ $scope.isString=function isString(value){
+ return typeof value === 'string' || getType(value)==='[object Number]';
+ }
+
+ var getType = function (elem) {
+ return Object.prototype.toString.call(elem);
+ };
+
+ $scope.isObject=function isObject(value){
+ return typeof value === 'object';
+ }
+//onclick to textbox
+
+ $scope.updateDetailsVariable = function (event) {
+ var appElement = document.querySelector('[ng-model=query]');
+ var $scope = angular.element(appElement).scope();
+ $scope.query = angular.element(event.target).text();
+ // $scope.$apply(function() {
+ // $scope.query = angular.element(event.target).text();
+ // });
+
+
+ console.log("test");
+ console.log(angular.element(event.target).text());
+ console.log("testing");
+ };
+//onclick to textbox
+ $scope.getGuidName=function getGuidName(val){
+ $http.get('/api/metadata/entities/definition/'+val)
+ .success(function (data) {
+ $scope.iserror1=false;
+ if(!$scope.isUndefined(data.results)){
+ $scope.gname=angular.fromJson(data.results);
+ //console.log(angular.fromJson(data.results));
+ // $scope.gname=data.results.name;
+ }
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+ return true;
+ }
+
+ $scope.Name=$stateParams.Id;
+ $scope.searchqry=sharedProperties.getQuery();
+ $scope.datatype1=sharedProperties.getProperty();
+
+ $http.get('/api/metadata/entities/definition/'+$stateParams.Id)
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.details= angular.fromJson(data.results);
+ if(!$scope.isUndefined( $scope.details)) {
+ // console.log($scope.details['name']);
+ $scope.datatype1=$scope.details["$typeName$"];
+ $scope.getSchema($scope.details['name']);
+ $scope.getLinegae($scope.details['name']);
+ $scope.getLinegaeforinput($scope.details['name']);
+ }
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+
+
+ $scope.getSchema= function (tableName) {
+
+ $http.get('/api/metadata/lineage/hive/schema/'+tableName)
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.schema= angular.fromJson(data.results.rows);
+ // console.log(tableName);
+
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+ }
+
+$scope.getLinegae= function (tableName) {
+
+// $scope.width = 900;
+// $scope.height = 900;
+ var arr=[];
+ var arrmyalias=[];
+ var datatypes=[];
+ var tags=[];
+ $http.get('/api/metadata/lineage/hive/outputs/'+tableName)
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.lineage= angular.fromJson(data.results.rows);
+
+ $scope.vts = [];
+ $scope.edges1 = [];
+ $scope.listguid = [];
+ angular.forEach($scope.lineage, function(lineage1){
+ var level = 0;
+ angular.forEach(lineage1.path, function(item, index){
+ // if ($scope.listguid.indexOf(index) == -1) {
+ // $scope.listguid.push(index);
+
+ $scope.vts.push({"Name": item.guid,"Id" :index,"hasChild":"True","type":item.typeName});
+ $scope.edges1.push({source: index, target: (index+1)});
+
+ // }
+ });
+
+ });
+
+
+ var newarr = [];
+ var unique = {};
+
+ angular.forEach($scope.edges1, function(item) {
+ if (!unique[item.source]) {
+ newarr.push(item);
+ unique[item.source] = item;
+ //console.log(newarr);
+ }
+ });
+
+ var newarrvts = [];
+ var uniquevts = {};
+
+ angular.forEach($scope.vts, function(item) {
+ if (!uniquevts[item.Name]) {
+ newarrvts.push(item);
+ uniquevts[item.Name] = item;
+
+ var url="/api/metadata/entities/definition/"+item.Name;
+ arr.push($http.get(url));
+ }
+ });
+
+
+ $q.all(arr).then(function(ret){
+ //console.log("Result guid list length="+ret.length);
+ for(var i=0;i<ret.length;i++){
+ var f=angular.fromJson(ret[i].data.results);
+ //console.log(i+"Their Names="+angular.toJson(f));
+ //console.log(i+"Their Names="+f.name);
+ arrmyalias[i]=f.name;
+
+ datatypes[i]=f['$typeName$'];
+
+ if(f['$typeName$']==="Table")
+ {
+ angular.forEach(f['$traits$'], function(key, value) {
+ tags[i]=value;
+
+ });
+ }
+ else{
+ tags[i]=f.queryText;
+ }
+
+
+ }
+if(arrmyalias.length>1){
+ doMakeStaticJson(arrmyalias);
+ }
+ else{
+ $scope.errornodata="";
+ }
+// loadjsonRealv2(arrmyalias);
+ // doMakeStaticJson(arrmyalias);
+
+ });
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+
+ function doMakeStaticJson(arrmyalias){
+
+ var toparr=[];
+ console.log(arrmyalias.length);
+ var rootobj=new Object();
+ rootobj.name=arrmyalias[0];
+ rootobj.alias=arrmyalias[0];
+ rootobj.query=tags[0];
+ rootobj.datatype=datatypes[0];
+ rootobj.parent="null";
+
+ toparr[0]=rootobj;
+
+//start first object
+ var child1obj=new Object();
+ child1obj.alias=arrmyalias[1];
+ child1obj.name=arrmyalias[1];
+ child1obj.query=tags[1];
+ child1obj.datatype=datatypes[1];
+ child1obj.parent=arrmyalias[0];
+
+ //start
+ var childsub1obj=new Object();
+ childsub1obj.name=arrmyalias[2];
+ childsub1obj.alias=arrmyalias[2];
+ childsub1obj.query=tags[2];
+ childsub1obj.datatype=datatypes[2];
+ childsub1obj.parent=arrmyalias[1];
+ if(arrmyalias.length>2){
+ var arraychildren1=[];
+ arraychildren1.push(childsub1obj);
+ child1obj.children=arraychildren1;
+ }
+ //start
+ var childsub2obj=new Object();
+ childsub2obj.name=arrmyalias[3];
+ childsub2obj.alias=arrmyalias[3];
+ childsub2obj.query=tags[3];
+ childsub2obj.datatype=datatypes[3];
+ childsub2obj.parent=arrmyalias[2];
+ if(arrmyalias.length>3){
+ var arraychildren2=[];
+ arraychildren2.push(childsub2obj);
+ childsub1obj.children=arraychildren2;
+ }
+
+ //start
+ var childsub3obj=new Object();
+ childsub3obj.name=arrmyalias[4];
+ childsub3obj.alias=arrmyalias[4];
+ childsub3obj.query=tags[4];
+ childsub3obj.datatype=datatypes[4];
+ childsub3obj.parent=arrmyalias[3];
+ if(arrmyalias.length>4){
+ var arraychildren3=[];
+ arraychildren3.push(childsub3obj);
+ childsub2obj.children=arraychildren3;
+ }
+
+///end first objects
+
+
+
+ /*var arraychildren2=[];
+ arraychildren2.push(child1obj2);
+// arraychildren2.push(childsub2obj2);
+
+
+ child1obj2.children=arraychildren2;
+
+
+ //end second objects
+ */
+
+ var array1=[];
+ array1[0]=child1obj;
+// array1[1]=child1obj2;
+
+
+ rootobj.children=array1;
+
+
+ //console.info("MITH SEE THIS="+angular.toJson(toparr));
+
+ root = toparr[0];
+ console.log(root);
+ update(root);
+ }
+
+
+ //Width and height
+ var width = 700,
+ height = 500,
+ root;
+//image intitializer
+ var mitharr=["img/tableicon.png","img/process.png","img/tableicon.png","img/process.png","img/tableicon.png"];
+
+
+
+ var force = d3.layout.force()
+ .gravity(0)
+ .friction(0.7)
+ .charge(-90)
+ .linkDistance(120)
+ .size([width, height])
+ .on("tick", tick);
+
+ var svg = d3.select("svg")
+// .attr("transform", "translate(" + (width/2) +
+// "," + (height/2) + ")")
+
+ .attr('transform-origin', '-419 -530')
+ .attr("viewBox", "10 -300 1000 1000")
+ .attr("preserveAspectRatio", "xMidYMid meet");
+// .append("g")
+// .attr("transform", "translate(" + d.x + "," + d.y +") rotate(180) scale(-1, -1)");
+
+
+// .attr("preserveAspectRatio", "xMidYMid slice");
+
+ var link = svg.selectAll(".link"),
+ node = svg.selectAll(".node");
+
+ var tip = d3.tip()
+ .attr('class', 'd3-tip')
+ .offset([-10, 0])
+ .html(function(d) {
+ return "<pre class='alert alert-success' style='max-width:400px;'>" + d.query + "</pre>";
+ });
+ svg.call(tip);
+
+ function update(source) {
+ var nodes = flatten(root),
+ links = d3.layout.tree().links(nodes);
+
+ // Restart the force layout.
+ force
+ .nodes(nodes)
+ .links(links)
+
+ .start();
+
+ // Update links.
+ link = link.data(links, function(d) { return d.target.id; });
+
+ link.exit().remove();
+
+ link.enter().insert("line", ".node")
+ .attr("class", "link");
+
+ // Update nodes.
+ node = node.data(nodes, function(d) { return d.id; });
+
+ node.exit().remove();
+
+ svg.append("svg:pattern").attr("id","processICO").attr("width",1).attr("height",1)
+ .append("svg:image").attr("xlink:href","./img/process.png").attr("x",-5.5).attr("y",-4).attr("width",42).attr("height",42);
+ svg.append("svg:pattern").attr("id","textICO").attr("width",1).attr("height",1)
+ .append("svg:image").attr("xlink:href","./img/tableicon.png").attr("x",2).attr("y",2).attr("width",25).attr("height",25);
+
+
+//arrow
+ svg.append("svg:defs").append("svg:marker").attr("id", "arrow").attr("viewBox", "0 0 10 10").attr("refX", 36).attr("refY", 5).attr("markerUnits", "strokeWidth").attr("markerWidth", 8).attr("markerHeight", 8).attr("orient", "auto").append("svg:path").attr("d", "M 0 0 L 10 5 L 0 10 z");
+//arrow
+ var nodeEnter = node.enter().append("g")
+ .attr("class", "nodeTrans")
+ .on("mouseover", tip.show)
+ .on("mouseout", tip.hide)
+ .call(force.drag);
+
+
+
+
+ nodeEnter.append("circle")
+ .attr("r", function(d) { return 15; });
+
+ link.attr("marker-end", "url(#arrow)"); //also added attribute for arrow at end
+
+ nodeEnter.append("text")
+ .style("text-anchor", "middle")
+
+
+ .attr("dy", "-1em")
+
+ .attr("text-anchor", function(d) {
+ return d.children || d._children ? "end" : "start"; })
+ .text(function(d) {
+ return d.alias;
+ //return d.name;
+ })
+
+ .style("fill-opacity", 1);
+
+
+// nodeEnter.select("circle")
+// .attr("xlink:href", function(d) {
+// //return d.icon;
+// return mitharr[d.depth];
+// })
+// .attr("x", "-12px")
+// .attr("y", "-12px")
+// .attr("width", "24px")
+// .attr("height", "24px");
+
+
+ node.select("circle")
+// .attr("xlink:href", function(d) {
+// //return d.icon;
+// return mitharr[d.depth];
+// })
+ .style("fill", function(d, i) {
+ if(d.datatype==="Table"){
+ return "url('#textICO')";
+
+ }else{
+ return "url('#processICO')";
+ }
+ return colors(i);
+ });
+//force.stop();
+//force.resume();
+
+}
+
+//force.stop();
+function tick() {
+ link.attr("x1", function(d) { return d.source.x; })
+ .attr("y1", function(d) { return d.source.y; })
+ .attr("x2", function(d) { return d.target.x; })
+ .attr("y2", function(d) { return d.target.y; });
+
+
+ node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ") " });
+
+}
+
+//node[0].x = width / 2;
+// node[1].y = height / 2;
+d3.select(window).on('resize', update);
+
+function color(d) {
+ return d._children ? "#3182bd" // collapsed package
+ : d.children ? "#c6dbef" // expanded package
+ : "#fd8d3c"; // leaf node
+}
+
+// Toggle children on click.
+function click(d) {
+ if (d3.event.defaultPrevented) return; // ignore drag
+ if (d.children) {
+ d._children = d.children;
+ d.children = null;
+ } else {
+ d.children = d._children;
+ d._children = null;
+ }
+ update();
+
+}
+
+// Returns a list of all nodes the root.
+function flatten(root) {
+ var nodes = [], i = 0;
+
+ function recurse(node) {
+ if (node.children) node.children.forEach(recurse);
+ if (!node.id) node.id = ++i;
+ nodes.push(node);
+ }
+
+ recurse(root);
+ return nodes;
+
+}
+
+
+//
+// })
+// .error(function (e) {
+// $scope.iserror1=true;
+// $scope.error1=e;
+// });
+
+
+ }
+
+
+
+
+
+$scope.getLinegaeforinput= function (tableName) {
+
+// $scope.width = 900;
+// $scope.height = 900;
+ var arr=[];
+ var arrmyalias=[];
+ var datatypes=[];
+ var tags=[];
+ $http.get('/api/metadata/lineage/hive/inputs/'+tableName)
+ .success(function (data) {
+ $scope.iserror1=false;
+ $scope.lineage= angular.fromJson(data.results.rows);
+
+ $scope.vts = [];
+ $scope.edges1 = [];
+ $scope.listguid = [];
+ angular.forEach($scope.lineage, function(lineage1){
+ var level = 0;
+ angular.forEach(lineage1.path, function(item, index){
+ // if ($scope.listguid.indexOf(index) == -1) {
+ // $scope.listguid.push(index);
+
+ $scope.vts.push({"Name": item.guid,"Id" :index,"hasChild":"True","type":item.typeName});
+ $scope.edges1.push({source: index, target: (index+1)});
+
+ // }
+ });
+
+ });
+
+ var newarr = [];
+ var unique = {};
+
+ angular.forEach($scope.edges1, function(item) {
+ if (!unique[item.source]) {
+ newarr.push(item);
+ unique[item.source] = item;
+ //console.log(newarr);
+ }
+ });
+
+ var newarrvts = [];
+ var uniquevts = {};
+
+ angular.forEach($scope.vts, function(item) {
+ if (!uniquevts[item.Name]) {
+ newarrvts.push(item);
+ uniquevts[item.Name] = item;
+
+ var url="/api/metadata/entities/definition/"+item.Name;
+ arr.push($http.get(url));
+
+ //getLienageGuidName(item.Name);
+
+ }
+ });
+
+
+ $q.all(arr).then(function(ret){
+ //console.log("Result guid list length="+ret.length);
+ for(var i=0;i<ret.length;i++){
+ var f=angular.fromJson(ret[i].data.results);
+ //console.log(i+"Their Names="+angular.toJson(f));
+ //console.log(i+"Their Names="+f.name);
+ arrmyalias[i]=f.name;
+
+ datatypes[i]=f['$typeName$'];
+
+ if(f['$typeName$']==="Table")
+ {
+ angular.forEach(f['$traits$'], function(key, value) {
+ tags[i]=value;
+ console.log(value);
+ });
+ }
+ else{
+ tags[i]=f.queryText;
+ console.log(f.queryText);
+ }
+
+
+ }
+if(arrmyalias.length>1){
+ doMakeStaticJson(arrmyalias);
+ }
+ else{
+ $scope.errornodata1="";
+ }
+// loadjsonRealv2(arrmyalias);
+ // doMakeStaticJson(arrmyalias);
+
+ });
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+
+ function doMakeStaticJson(arrmyalias){
+
+ var toparr=[];
+
+ var rootobj=new Object();
+ rootobj.name=arrmyalias[0];
+ rootobj.alias=arrmyalias[0];
+ rootobj.query=tags[0];
+ rootobj.datatype=datatypes[0];
+ rootobj.parent="null";
+
+ toparr[0]=rootobj;
+
+//start first object
+ var child1obj=new Object();
+ child1obj.alias=arrmyalias[1];
+ child1obj.name=arrmyalias[1];
+ child1obj.query=tags[1];
+ child1obj.datatype=datatypes[1];
+ child1obj.parent=arrmyalias[0];
+
+ //start
+ var childsub1obj=new Object();
+ childsub1obj.name=arrmyalias[2];
+ childsub1obj.alias=arrmyalias[2];
+ childsub1obj.query=tags[2];
+ childsub1obj.datatype=datatypes[2];
+ childsub1obj.parent=arrmyalias[1];
+
+ if(arrmyalias.length>2){
+ var arraychildren1=[];
+ arraychildren1.push(childsub1obj);
+ child1obj.children=arraychildren1;
+ }
+ //start
+ var childsub2obj=new Object();
+ childsub2obj.name=arrmyalias[3];
+ childsub2obj.alias=arrmyalias[3];
+ childsub2obj.query=tags[3];
+ childsub2obj.datatype=datatypes[3];
+ childsub2obj.parent=arrmyalias[2];
+ if(arrmyalias.length>3){
+ var arraychildren2=[];
+ arraychildren2.push(childsub2obj);
+ childsub1obj.children=arraychildren2;
+ }
+
+ //start
+ var childsub3obj=new Object();
+ childsub3obj.name=arrmyalias[4];
+ childsub3obj.alias=arrmyalias[4];
+ childsub3obj.query=tags[4];
+ childsub3obj.datatype=datatypes[4];
+ childsub3obj.parent=arrmyalias[3];
+
+ if(arrmyalias.length>4){
+ var arraychildren3=[];
+ arraychildren3.push(childsub3obj);
+ childsub2obj.children=arraychildren3;
+ }
+
+
+///end first objects
+
+
+
+ /*var arraychildren2=[];
+ arraychildren2.push(child1obj2);
+// arraychildren2.push(childsub2obj2);
+
+
+ child1obj2.children=arraychildren2;
+
+
+ //end second objects
+ */
+
+ var array1=[];
+ array1[0]=child1obj;
+// array1[1]=child1obj2;
+
+
+ rootobj.children=array1;
+
+
+ //console.info("MITH SEE THIS="+angular.toJson(toparr));
+
+ root = toparr[0];
+
+ update(root);
+ }
+
+
+ //Width and height
+ var width = 700,
+ height = 500,
+ root;
+//image intitializer
+ var mitharr=["img/tableicon.png","img/process.png","img/tableicon.png","img/process.png","img/tableicon.png"];
+
+
+
+ var force = d3.layout.force()
+ .gravity(0)
+ .friction(0.7)
+ .charge(-90)
+ .linkDistance(120)
+ .size([width, height])
+ .on("tick", tick);
+
+ var svg = d3.select("svg1").append("svg")
+// .attr("transform", "translate(" + (width/2) +
+// "," + (height/2) + ")")
+
+ .attr('transform-origin', '-419 -530')
+ .attr("viewBox", "10 -300 1000 1000")
+ .attr("preserveAspectRatio", "xMidYMid meet");
+// .append("g")
+// .attr("transform", "translate(" + d.x + "," + d.y +") rotate(180) scale(-1, -1)");
+
+
+// .attr("preserveAspectRatio", "xMidYMid slice");
+
+ var link = svg.selectAll(".link"),
+ node = svg.selectAll(".node");
+
+ var tip = d3.tip()
+ .attr('class', 'd3-tip')
+ .offset([-10, 0])
+ .html(function(d) {
+ return "<pre class='alert alert-success' style='max-width:400px;'>" + d.query + "</pre>";
+ });
+
+ if(svg){
+ svg.call(tip);
+ }
+
+
+ function update(source) {
+ var nodes = flatten(root),
+ links = d3.layout.tree().links(nodes);
+
+ // Restart the force layout.
+ force
+ .nodes(nodes)
+ .links(links)
+
+ .start();
+
+ // Update links.
+ link = link.data(links, function(d) { return d.target.id; });
+
+ link.exit().remove();
+
+ link.enter().insert("line", ".node")
+ .attr("class", "link");
+
+ // Update nodes.
+ node = node.data(nodes, function(d) { return d.id; });
+
+ node.exit().remove();
+
+ svg.append("svg:pattern").attr("id","processICO1").attr("width",1).attr("height",1)
+ .append("svg:image").attr("xlink:href","./img/process.png").attr("x",-5.5).attr("y",-4).attr("width",42).attr("height",42);
+ svg.append("svg:pattern").attr("id","textICO1").attr("width",1).attr("height",1)
+ .append("svg:image").attr("xlink:href","./img/tableicon.png").attr("x",2).attr("y",2).attr("width",25).attr("height",25);
+
+
+//arrow
+ svg.append("svg:defs").append("svg:marker").attr("id", "arrow1").attr("viewBox", "0 0 10 10").attr("refX", 60).attr("refY", 5).attr("markerUnits", "strokeWidth").attr("markerWidth", 8).attr("markerHeight", 8).attr("orient", "auto").append("svg:path").attr("d", "M 0 0 L 10 5 L 0 10 z");
+//arrow
+ var nodeEnter = node.enter().append("g")
+ .attr("class", "nodeTrans")
+ .on("mouseover", tip.show)
+ .on("mouseout", tip.hide)
+ .call(force.drag);
+
+
+
+
+ nodeEnter.append("circle")
+ .attr("r", function(d) { return 15; });
+
+ link.attr("marker-end", "url(#arrow1)"); //also added attribute for arrow at end
+
+ nodeEnter.append("text")
+ .style("text-anchor", "middle")
+
+
+ .attr("dy", "-1em")
+
+ .attr("text-anchor", function(d) {
+ return d.children || d._children ? "end" : "start"; })
+ .text(function(d) {
+ return d.alias;
+ //return d.name;
+ })
+
+ .style("fill-opacity", 1);
+
+
+// nodeEnter.select("circle")
+// .attr("xlink:href", function(d) {
+// //return d.icon;
+// return mitharr[d.depth];
+// })
+// .attr("x", "-12px")
+// .attr("y", "-12px")
+// .attr("width", "24px")
+// .attr("height", "24px");
+
+
+ node.select("circle")
+// .attr("xlink:href", function(d) {
+// //return d.icon;
+// return mitharr[d.depth];
+// })
+ .style("fill", function(d) {
+ if(d.datatype==="Table"){
+ return "url('#textICO1')";
+
+ }else{
+ return "url('#processICO1')";
+ }
+ return colors(i);
+ });
+//force.stop();
+//force.resume();
+
+}
+
+//force.stop();
+function tick() {
+ link.attr("x1", function(d) { return d.source.x; })
+ .attr("y1", function(d) { return d.source.y; })
+ .attr("x2", function(d) { return d.target.x; })
+ .attr("y2", function(d) { return d.target.y; });
+
+
+ node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ") " });
+
+}
+
+//node[0].x = width / 2;
+// node[1].y = height / 2;
+d3.select(window).on('resize', update);
+
+function color(d) {
+ return d._children ? "#3182bd" // collapsed package
+ : d.children ? "#c6dbef" // expanded package
+ : "#fd8d3c"; // leaf node
+}
+
+// Toggle children on click.
+function click(d) {
+ if (d3.event.defaultPrevented) return; // ignore drag
+ if (d.children) {
+ d._children = d.children;
+ d.children = null;
+ } else {
+ d.children = d._children;
+ d._children = null;
+ }
+ update();
+
+}
+
+// Returns a list of all nodes the root.
+function flatten(root) {
+ var nodes = [], i = 0;
+
+ function recurse(node) {
+ if (node.children) node.children.forEach(recurse);
+ if (!node.id) node.id = ++i;
+ nodes.push(node);
+ }
+
+ recurse(root);
+ return nodes;
+
+}
+
+
+//
+// })
+// .error(function (e) {
+// $scope.iserror1=true;
+// $scope.error1=e;
+// });
+
+
+ }
+
+
+
+ // console.log( $scope.vts);
+
+ $scope.reverse = function(array) {
+ var copy = [].concat(array);
+ return copy.reverse();
+ }
+
+ // function back()
+ // {
+ // $window.history.back();
+ // myModule.run(function ($rootScope, $location) {
+
+ // var history = [];
+
+ // $rootScope.$on('$routeChangeSuccess', function() {
+ // history.push($location.$$path);
+ // });
+
+ // $rootScope.back = function () {
+ // var prevUrl = history.length > 1 ? history.splice(-2)[0] : "/";
+ // $location.path(prevUrl);
+ // };
+
+ // });
+ // }
+
+
+
+
+ }]
+);
+
+
+DgcControllers.controller("GuidController", ['$scope','$http', '$filter','$stateParams', 'sharedProperties', function($scope, $http, $filter, $stateParams, sharedProperties)
+ {
+
+
+
+$scope.getGuidName=function getGuidName(val){
+
+ $scope.gnew=[];
+ $http.get('/api/metadata/entities/definition/'+val)
+ .success(function (data) {
+ $scope.iserror1=false;
+ if(!$scope.isUndefined(data.results)){
+
+ $scope.gname=angular.fromJson(data.results);
+ var data1=angular.fromJson(data.results);
+ //$scope.gnew({"id" : val,"name" : data1['name']});
+
+ $scope.gnew= $scope.gname.name;
+ // $scope.$watch($scope.gnew, true);
+
+}
+ //dddd
+
+
+ })
+ .error(function (e) {
+ $scope.iserror1=true;
+ $scope.error1=e;
+ });
+
+ //return $scope.gnew;
+ }
+
+
+ }]
+);
+
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/a9d61e1b/dashboard/v3/js/ie-emulation-modes-warning.js
----------------------------------------------------------------------
diff --git a/dashboard/v3/js/ie-emulation-modes-warning.js b/dashboard/v3/js/ie-emulation-modes-warning.js
new file mode 100755
index 0000000..896ed62
--- /dev/null
+++ b/dashboard/v3/js/ie-emulation-modes-warning.js
@@ -0,0 +1,51 @@
+// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT
+// IT'S JUST JUNK FOR OUR DOCS!
+// ++++++++++++++++++++++++++++++++++++++++++
+/*!
+ * Copyright 2014 Twitter, Inc.
+ *
+ * Licensed under the Creative Commons Attribution 3.0 Unported License. For
+ * details, see http://creativecommons.org/licenses/by/3.0/.
+ */
+// Intended to prevent false-positive bug reports about Bootstrap not working properly in old versions of IE due to folks testing using IE's unreliable emulation modes.
+(function () {
+ 'use strict';
+
+ function emulatedIEMajorVersion() {
+ var groups = /MSIE ([0-9.]+)/.exec(window.navigator.userAgent)
+ if (groups === null) {
+ return null
+ }
+ var ieVersionNum = parseInt(groups[1], 10)
+ var ieMajorVersion = Math.floor(ieVersionNum)
+ return ieMajorVersion
+ }
+
+ function actualNonEmulatedIEMajorVersion() {
+ // Detects the actual version of IE in use, even if it's in an older-IE emulation mode.
+ // IE JavaScript conditional compilation docs: http://msdn.microsoft.com/en-us/library/ie/121hztk3(v=vs.94).aspx
+ // @cc_on docs: http://msdn.microsoft.com/en-us/library/ie/8ka90k2e(v=vs.94).aspx
+ var jscriptVersion = new Function('/*@cc_on return @_jscript_version; @*/')() // jshint ignore:line
+ if (jscriptVersion === undefined) {
+ return 11 // IE11+ not in emulation mode
+ }
+ if (jscriptVersion < 9) {
+ return 8 // IE8 (or lower; haven't tested on IE<8)
+ }
+ return jscriptVersion // IE9 or IE10 in any mode, or IE11 in non-IE11 mode
+ }
+
+ var ua = window.navigator.userAgent
+ if (ua.indexOf('Opera') > -1 || ua.indexOf('Presto') > -1) {
+ return // Opera, which might pretend to be IE
+ }
+ var emulated = emulatedIEMajorVersion()
+ if (emulated === null) {
+ return // Not IE
+ }
+ var nonEmulated = actualNonEmulatedIEMajorVersion()
+
+ if (emulated !== nonEmulated) {
+ window.alert('WARNING: You appear to be using IE' + nonEmulated + ' in IE' + emulated + ' emulation mode.\nIE emulation modes can behave significantly differently from ACTUAL older versions of IE.\nPLEASE DON\'T FILE BOOTSTRAP BUGS based on testing in IE emulation modes!')
+ }
+})();