ATLAS-279 UI not displaying results for certain successful select search queries (anilsg via shwethags)
Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/cc2d8860 Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/cc2d8860 Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/cc2d8860 Branch: refs/heads/branch-0.6-incubating Commit: cc2d886022dd314ae951e0e1dc44a808e6bc31c9 Parents: 4aef164 Author: Shwetha GS <[email protected]> Authored: Tue Dec 8 10:16:40 2015 +0530 Committer: Shwetha GS <[email protected]> Committed: Tue Dec 8 10:16:40 2015 +0530 ---------------------------------------------------------------------- dashboard/README.md | 2 +- dashboard/public/css/common.css | 12 ++ dashboard/public/css/tags.css | 9 +- dashboard/public/index.html | 5 +- dashboard/public/js/app.js | 30 ++- .../public/modules/details/detailsController.js | 6 +- .../public/modules/details/views/details.html | 13 +- dashboard/public/modules/home/views/header.html | 4 +- .../modules/lineage/lineage_ioController.js | 21 +- .../modules/navigation/navigationController.js | 8 +- .../modules/navigation/views/navigation.html | 2 +- .../public/modules/search/searchController.js | 164 ++++++++++---- .../public/modules/search/views/search.html | 214 +++++++++---------- .../tags/definition/definitionTagsController.js | 14 +- .../modules/tags/definition/views/add.html | 10 +- .../tags/instance/createTagController.js | 50 +++-- .../tags/instance/instanceTagsController.js | 74 ++++--- .../modules/tags/instance/views/createTag.html | 2 +- .../modules/tags/instance/views/tags.html | 84 +++++--- docs/src/site/twiki/Bridge-Hive.twiki | 12 +- release-log.txt | 1 + 21 files changed, 476 insertions(+), 261 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/README.md ---------------------------------------------------------------------- diff --git a/dashboard/README.md b/dashboard/README.md index 0957582..5285e19 100644 --- a/dashboard/README.md +++ b/dashboard/README.md @@ -28,7 +28,7 @@ ``` git clone $git-repo-url -git checkout dal +git checkout master cd dashboard/v2 npm install grunt server http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/css/common.css ---------------------------------------------------------------------- diff --git a/dashboard/public/css/common.css b/dashboard/public/css/common.css index 7f55c0c..aa6dd11 100644 --- a/dashboard/public/css/common.css +++ b/dashboard/public/css/common.css @@ -353,4 +353,16 @@ Tags on Home Page design .anchorAbsolute { position: absolute; right: 4px; +} + +.addTag{ + margin-top: -35px; +} + +.tagAlign{ + text-align: center; +} + +.h160 { + height: 160px !important; } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/css/tags.css ---------------------------------------------------------------------- diff --git a/dashboard/public/css/tags.css b/dashboard/public/css/tags.css index 3078d3d..69bfd52 100644 --- a/dashboard/public/css/tags.css +++ b/dashboard/public/css/tags.css @@ -17,7 +17,7 @@ */ .add-tag { - margin-top: -7px; + margin-top: -50px; } .inputs input{ height: 50px; @@ -113,4 +113,11 @@ } .tagsAdded{ display: inline; +} + +.noTags { + font-size: 24px; + font-weight: bold; + text-align: center; +} } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/index.html ---------------------------------------------------------------------- diff --git a/dashboard/public/index.html b/dashboard/public/index.html index 1b9b22a..2d0993f 100644 --- a/dashboard/public/index.html +++ b/dashboard/public/index.html @@ -44,9 +44,10 @@ <header class="navbar navbar-static-top navbar-top" data-role="navigation"> <div class="container" data-ng-include="'/modules/home/views/header.html'"></div> </header> -<div class="content"> +<div class="content container"> <div data-ng-include="'/modules/notification/views/notifications.html'"></div> - <div data-ui-view class="container"></div> + <div class="col-lg-2 padding0" data-ng-include="'/modules/navigation/views/navigation.html'" ng-class="leftNav ? 'hide' : ''" ></div> + <div data-ui-view class="ngView"></div> </div> <footer class="footer navbar-bottom"> <div class="container"> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/js/app.js ---------------------------------------------------------------------- diff --git a/dashboard/public/js/app.js b/dashboard/public/js/app.js index 3ef1794..b128ff1 100644 --- a/dashboard/public/js/app.js +++ b/dashboard/public/js/app.js @@ -15,7 +15,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - 'use strict'; angular.module('dgc', ['ngCookies', @@ -81,4 +80,31 @@ angular.module('dgc').factory('lodash', ['$window', $rootScope.$on('$stateChangeStart', function() { d3.selectAll('.d3-tip').remove(); }); -}]); + + $rootScope.updateTags = function(added, obj) { + if (added) { + $rootScope.$broadcast('add_Tag', obj); + } + }; + + $rootScope.loadTraits = function() { + $rootScope.$broadcast('load_Traits'); + }; + + $rootScope.$on('$stateChangeSuccess', function(evt, to, toParams, from) { + if (from.name !== '' && to.name === 'search' && to.name !== from.name && typeof to.parent === 'undefined' && typeof from.parent === 'undefined') { + $rootScope.loadTraits(); + } else if (from.name === '' && to.name === 'search') { + $rootScope.loadTraits(); + } + + if (typeof to.parent === 'undefined') { + if (to.name !== 'search') { + $rootScope.leftNav = true; + } else { + $rootScope.leftNav = false; + } + } + }); + +}]); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/details/detailsController.js ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/details/detailsController.js b/dashboard/public/modules/details/detailsController.js index d56b58e..65a4e40 100644 --- a/dashboard/public/modules/details/detailsController.js +++ b/dashboard/public/modules/details/detailsController.js @@ -27,11 +27,11 @@ angular.module('dgc.details').controller('DetailsController', ['$window', '$scop id: $stateParams.id }, function(data) { $scope.details = data; - console.log(data); $scope.schemas = data; $scope.tableName = data.values.name; $scope.isTable = (typeof data.typeName !== 'undefined' && data.typeName.toLowerCase().indexOf('table') !== -1) ? true : false; $scope.onActivate('io'); + $scope.isTags = (typeof data.traits !== 'undefined' && typeof data.traits === 'object') ? true : false; }); $scope.isNumber = angular.isNumber; @@ -45,7 +45,7 @@ angular.module('dgc.details').controller('DetailsController', ['$window', '$scop }); }; - $scope.goDetails = function(id){ + $scope.goDetails = function(id) { $state.go("details", { id: id }); @@ -55,4 +55,4 @@ angular.module('dgc.details').controller('DetailsController', ['$window', '$scop $window.history.back(); }; } -]); +]); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/details/views/details.html ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/details/views/details.html b/dashboard/public/modules/details/views/details.html index c05e222..95cd098 100644 --- a/dashboard/public/modules/details/views/details.html +++ b/dashboard/public/modules/details/views/details.html @@ -72,13 +72,14 @@ </tr> </tbody> - </table> - <ng-include src="'/modules/tags/instance/views/tags.html'"/> + </table> </tab> - <tab data-heading="Schema" data-ng-if="isTable"><ng-include src="'/modules/details/views/schema.html'"/></tab> - <!-- <tab data-heading="Output" data-ng-if="isTable" data-disable="!tableName" data-select="onActivate('outputs')"><ng-include data-table-type="outputs" src="'/modules/lineage/views/lineage.html'"/></tab> - <tab data-heading="Input" data-ng-if="isTable" data-disable="!tableName" data-select="onActivate('inputs')"><ng-include data-table-type="inputs" src="'/modules/lineage/views/lineage.html'"/></tab> - <tab data-heading="Lineage" data-ng-if="isTable" data-disable="!tableName" data-select="onActivate('io')"><ng-include data-table-type="io" src="'/modules/lineage_io/views/lineage_io.html'"/></tab> --> + <tab data-heading="Schema" data-ng-if="isTable"> + <ng-include src="'/modules/details/views/schema.html'"/> + </tab> + <tab data-heading="Tags" data-ng-if="isTags"> + <ng-include src="'/modules/tags/instance/views/tags.html'"/> + </tab> </tabset> </div> </div> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/home/views/header.html ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/home/views/header.html b/dashboard/public/modules/home/views/header.html index 0d64257..3d137a7 100644 --- a/dashboard/public/modules/home/views/header.html +++ b/dashboard/public/modules/home/views/header.html @@ -24,7 +24,7 @@ <span class="icon-bar"></span> <span class="icon-bar"></span> </button> - <a data-ui-sref="search({ query: '' })" data-ui-sref-active="active" class="mainLogo"> + <a data-ui-sref="search()" data-ui-sref-active="active" class="mainLogo"> <!-- <img src="../img/ApacheAtlasLogo.png" /> --> Apache <b>Atlas</b> </a> @@ -32,7 +32,7 @@ <nav class="collapse navbar-collapse" data-collapse="isCollapsed" data-role="navigation"> <ul class="navbar-nav nav pull-right menuBar" data-ng-if="isLoggedIn()"> <li data-ui-sref-active="active"> - <a data-ui-sref="search({ query: '' })" class="menulink">Search</a> + <a data-ui-sref="search()" class="menulink">Search</a> </li> <li data-ng-repeat="item in menu" data-ui-sref-active="active"> <a data-ui-sref="{{item.state}}">{{item.title}}</a> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/lineage/lineage_ioController.js ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/lineage/lineage_ioController.js b/dashboard/public/modules/lineage/lineage_ioController.js index 0a49ed0..e7b2734 100644 --- a/dashboard/public/modules/lineage/lineage_ioController.js +++ b/dashboard/public/modules/lineage/lineage_ioController.js @@ -19,7 +19,9 @@ angular.module('dgc.lineage').controller('Lineage_ioController', ['$element', '$scope', '$state', '$stateParams', 'lodash', 'LineageResource', 'd3', 'DetailsResource', '$q', function($element, $scope, $state, $stateParams, _, LineageResource, d3, DetailsResource, $q) { - var guidsList = []; + var guidsList = [], + $$ = angular.element; + function inVertObj(edgs) { var newEdgsObj = {}; @@ -31,7 +33,7 @@ angular.module('dgc.lineage').controller('Lineage_ioController', ['$element', '$ } }); return newEdgsObj; - } + } function getCombinedLineageData(tableData, callRender) { LineageResource.get({ @@ -71,7 +73,7 @@ angular.module('dgc.lineage').controller('Lineage_ioController', ['$element', '$ if (callRender) { render(); } - }); + }); } else { $scope.requested = false; } @@ -130,11 +132,10 @@ angular.module('dgc.lineage').controller('Lineage_ioController', ['$element', '$ if (!$scope.lineageData) { if ($scope.requested) { if ($scope.type === 'io') { - console.log($scope.type); getCombinedLineageData(lineageData, true); } else { getCombinedLineageData(lineageData, true); - } + } } } else { render(); @@ -305,7 +306,13 @@ angular.module('dgc.lineage').controller('Lineage_ioController', ['$element', '$ tooltip = d3.tip() .attr('class', 'd3-tip') .html(function(d) { - return '<pre class="alert alert-success">' + d.name + '</pre>'; + var toolTip = $$("<pre>").attr("class", "alert alert-success") + .append($$("<p>").html('Name :<b>' + d.name + '</b>')); + + if (d.tip && d.tip.trim() !== "") { + toolTip.append($$("<p>").html('Query: ' + d.tip)); + } + return toolTip.prop("outerHTML"); }); // define the baseSvg, attaching a class for styling and the zoomListener @@ -597,7 +604,7 @@ angular.module('dgc.lineage').controller('Lineage_ioController', ['$element', '$ }) .text(function(d) { var nameDis = (d.name.length > 15) ? d.name.substring(0, 15) + "..." : d.name; - $(this).attr('title', d.name); + $$(this).attr('title', d.name); return nameDis; }) .style("fill-opacity", 0); http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/navigation/navigationController.js ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/navigation/navigationController.js b/dashboard/public/modules/navigation/navigationController.js index a012885..4602923 100644 --- a/dashboard/public/modules/navigation/navigationController.js +++ b/dashboard/public/modules/navigation/navigationController.js @@ -15,17 +15,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - 'use strict'; angular.module('dgc.navigation').controller('NavigationController', ['$scope', 'NavigationResource', function($scope, NavigationResource) { - $scope.leftnav = NavigationResource.get(); $scope.updateVar = function(event) { $scope.$$prevSibling.query = angular.element(event.target).text(); }; + $scope.$on('load_Traits', function() { + $scope.leftnav = NavigationResource.get(); + }); + } -]); +]); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/navigation/views/navigation.html ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/navigation/views/navigation.html b/dashboard/public/modules/navigation/views/navigation.html index af19294..9b1a443 100644 --- a/dashboard/public/modules/navigation/views/navigation.html +++ b/dashboard/public/modules/navigation/views/navigation.html @@ -16,7 +16,7 @@ ~ limitations under the License. --> -<div data-ng-controller="NavigationController" class="mainTags"> +<div data-ng-controller="NavigationController" class="mainTags leftNavigation"> <h4>Tags</h4> <div class="list-group"> <a ng-repeat="nav in leftnav" ui-sref="search({ query: nav })" class="list-group-item limitSize" title="{{nav}}"><i class="fa fa-tag"></i> {{nav}} </a> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/search/searchController.js ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/search/searchController.js b/dashboard/public/modules/search/searchController.js index 2a134d6..4e4dde7 100644 --- a/dashboard/public/modules/search/searchController.js +++ b/dashboard/public/modules/search/searchController.js @@ -15,7 +15,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - 'use strict'; angular.module('dgc.search').controller('SearchController', ['$scope', '$location', '$http', '$state', '$stateParams', 'lodash', 'SearchResource', 'DetailsResource', 'NotificationService', @@ -29,6 +28,12 @@ angular.module('dgc.search').controller('SearchController', ['$scope', '$locatio $scope.filteredResults = []; $scope.resultRows = []; $scope.resultType = ''; + $scope.isObject = angular.isObject; + $scope.isString = angular.isString; + $scope.isArray = angular.isArray; + $scope.isNumber = angular.isNumber; + $scope.mapAttr = ['guid', 'typeName', 'owner', 'description', 'createTime', '$traits$', '$id$', 'comment', 'dataType']; + $scope.setPage = function(pageNo) { $scope.currentPage = pageNo; }; @@ -39,40 +44,67 @@ angular.module('dgc.search').controller('SearchController', ['$scope', '$locatio $scope.searchMessage = 'load-gif'; $scope.$parent.query = query; SearchResource.search({ - query: encodeURIComponent(query) + query: query }, function searchSuccess(response) { + $scope.resultCount = response.count; $scope.results = response.results; - $scope.resultRows = $scope.results; + $scope.resultRows = ($scope.results && $scope.results.rows) ? $scope.results.rows : $scope.results; + $scope.totalItems = $scope.resultCount; $scope.transformedResults = {}; $scope.dataTransitioned = false; - if (response.dataType && response.dataType.typeName.indexOf('__') === 0) { - $scope.dataTransitioned = true; - var attrDef = response.dataType.attributeDefinitions; - angular.forEach(attrDef, function(value) { - if (value.dataTypeName === '__IdType') { - $scope.searchKey = value.name; - } - }); - $scope.transformedResults = $scope.filterResults(); - } else { - $scope.transformedResults = $scope.resultRows; - } + if ($scope.results) { if (response.dataType) { $scope.resultType = response.dataType.typeName; + } else if (response.results.dataType) { + $scope.resultType = response.results.dataType.typeName; + } else if (typeof response.dataType === 'undefined') { + $scope.resultType = "full text"; } $scope.searchMessage = $scope.resultCount + ' results matching your search query ' + $scope.query + ' were found'; } else { $scope.searchMessage = '0 results matching your search query ' + $scope.query + ' were found'; } + if (response.dataType && response.dataType.typeName && response.dataType.typeName.toLowerCase().indexOf('table') === -1) { + $scope.dataTransitioned = true; + var attrDef = response.dataType.attributeDefinitions; + if (attrDef.length === 1) { + $scope.searchKey = attrDef[0].name; + } else { + angular.forEach(attrDef, function(value) { + if (value.dataTypeName === '__IdType') { + $scope.searchKey = value.name; + } + }); + if ($scope.searchKey === undefined || $scope.searchKey === '') { + $scope.searchKey = ''; + } + } + $scope.transformedResults = $scope.filterResults(); + $scope.transformedProperties = $scope.filterProperties(); + + } else if (typeof response.dataType === 'undefined') { + $scope.dataTransitioned = true; + $scope.searchKey = ''; + $scope.transformedResults = $scope.filterResults(); + $scope.transformedProperties = $scope.filterProperties(); + } else if (response.dataType.typeName && response.dataType.typeName.toLowerCase().indexOf('table') !== -1) { + $scope.searchKey = "Table"; + $scope.transformedResults = $scope.resultRows; + } else if (response.results.dataType && response.results.dataType.typeName && response.results.dataType.typeName.toLowerCase().indexOf('table') !== -1) { + $scope.searchKey = "Table"; + $scope.transformedResults = $scope.resultRows; + } + $scope.$watch('currentPage + itemsPerPage', function() { var begin = (($scope.currentPage - 1) * $scope.itemsPerPage), end = begin + $scope.itemsPerPage; - if ($scope.transformedResults) $scope.filteredResults = $scope.transformedResults.slice(begin, end); - console.log($scope.filteredResults); + if ($scope.transformedResults) { + $scope.filteredResults = $scope.transformedResults.slice(begin, end); + } $scope.pageCount = function() { return Math.ceil($scope.resultCount / $scope.itemsPerPage); }; @@ -84,15 +116,73 @@ angular.module('dgc.search').controller('SearchController', ['$scope', '$locatio $scope.searchMessage = '0 results matching your search query ' + $scope.query + ' were found'; NotificationService.error('Error occurred during executing search query, error status code = ' + err.status + ', status text = ' + err.statusText, false); }); + $state.go('search', { + query: query + }, { + location: 'replace' + }); }; $scope.filterResults = function() { var res = []; - angular.forEach($scope.resultRows, function(value) { - res.push(value[$scope.searchKey]); - }); + if ($scope.searchKey !== '') { + angular.forEach($scope.resultRows, function(value) { + res.push(value[$scope.searchKey]); + }); + } else { + angular.forEach($scope.resultRows, function(value) { + var objVal = {}, + curVal = value, + onlyId = false; + + if (curVal.name) { + objVal.name = curVal.name; + delete curVal.name; + } + angular.forEach(curVal, function(vl, ky) { + if ($scope.mapAttr.indexOf(ky) !== -1 || ky.indexOf('_col_') !== -1 || ky.toLowerCase().indexOf('name') !== -1) { + if (ky === '$id$') { + objVal.id = curVal[ky].id; + onlyId = true; + } else if (ky === '$traits$') { + objVal[ky] = vl; + objVal.Tools = objVal.id; + onlyId = false; + } else if (ky.indexOf('$') === -1) { + objVal[ky] = vl; + onlyId = false; + } + } + }); + + if (onlyId) { + objVal.guid = objVal.id; + } + + res.push(objVal); + }); + } return res; }; + + $scope.filterProperties = function() { + var results = $scope.transformedResults, + pro = []; + if (results && results.length > 0) { + var result = results[0]; + if (typeof result === 'object') { + angular.forEach(result, function(value, key) { + if (key.indexOf('$typeName$') === -1) { + pro.push(key); + } + }); + } else { + pro.push($scope.searchKey); + } + } + return pro; + }; + $scope.doToggle = function($event, el) { this.isCollapsed = !el; }; @@ -102,24 +192,24 @@ angular.module('dgc.search').controller('SearchController', ['$scope', '$locatio }); }; $scope.isTag = function(typename) { - - if ( typename.indexOf( "__tempQueryResultStruct" ) > -1 ) { + + if (typename.indexOf("__tempQueryResultStruct") > -1 || $scope.searchKey === '') { return true; } else { return false; - } + } }; $scope.getResourceDataHome = function(event, id) { DetailsResource.get({ id: id - }, function(data) { - if ($scope.filteredResults !== null && Object.keys($scope.filteredResults).length > 0) { - angular.forEach($scope.filteredResults, function(obj, trait) { - if ( obj.$id$.id.indexOf( id ) > -1 ) { - $scope.filteredResults[trait].$traits$ = data.traits; - } - }); - } + }, function(data) { + if ($scope.filteredResults !== null && Object.keys($scope.filteredResults).length > 0) { + angular.forEach($scope.filteredResults, function(obj, trait) { + if ((obj.$id$ && obj.$id$.id.indexOf(id) > -1) || (obj.id && obj.id.indexOf(id) > -1)) { + $scope.filteredResults[trait].$traits$ = data.traits; + } + }); + } }); }; $scope.$on('refreshResourceData', $scope.getResourceDataHome); @@ -137,18 +227,10 @@ angular.module('dgc.search').controller('SearchController', ['$scope', '$locatio return res; }; $scope.searchQuery = $location.search(); - if ($location.search().query) - $scope.query = decodeURIComponent($location.search().query); + $scope.query = ($location.search()).query; if ($scope.query) { $scope.search($scope.query); } - $scope.goSearch = function(query) { - $state.go('search', { - query: encodeURIComponent(query) - }, { - location: 'replace' - }); - }; } -]); +]); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/search/views/search.html ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/search/views/search.html b/dashboard/public/modules/search/views/search.html index e355644..b905cb9 100644 --- a/dashboard/public/modules/search/views/search.html +++ b/dashboard/public/modules/search/views/search.html @@ -1,123 +1,107 @@ -<!-- - ~ 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-lg-2 padding0" data-ng-include="'/modules/navigation/views/navigation.html'"></div> - <div class="col-lg-10 paddingR0"> - <div class="row mainSearch"> - <form class="col-lg-12" name="form" novalidate> - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search: Table, DB, Column" data-ng-model="query" required/> - <span class="input-group-btn"> - <button class="btn btn-success" type="submit" data-ng-disabled="form.$invalid" ng-click="goSearch(query)"> - <i class="glyphicon glyphicon-search white "></i> - </button> - </span> - </div> - </form> - </div> - <div class="col-lg-12 padding0 searchresults"> - <div ng-switch on="searchMessage"> - <div ng-switch-when="load-gif" class="search-spinner"><img src="../img/spinner.gif" align="middle" /></div> - <div ng-switch-default><h4 ng-show="searchMessage" title="{{searchMessage}}" class="searchResultCount">{{searchMessage}}</h4></div> + +<!-- + ~ 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-lg-10 paddingR0"> + <div class=""> + <div class="row mainSearch"> + <form class="col-lg-12" name="form" novalidate> + <div class="input-group"> + <input type="text" class="form-control" placeholder="Search: Table, DB, Column" data-ng-model="query" required/> + <span class="input-group-btn"> + <button class="btn btn-success" type="submit" data-ng-disabled="form.$invalid" ui-sref="search({ query: query })"> + <i class="glyphicon glyphicon-search white "></i> + </button> + </span> </div> - <div class="panel panel-default" ng-show='resultCount > 0'> - <table class="table table-bordered datatable" > - <thead> + </form> + </div> + <div class="col-lg-12 padding0 searchresults"> + <div ng-switch on="searchMessage"> + <div ng-switch-when="load-gif" class="search-spinner"><img src="../img/spinner.gif" align="middle" /></div> + <div ng-switch-default> + <h4 ng-show="searchMessage" title="{{searchMessage}}" class="tabsearchResult">{{searchMessage}}</h4> + </div> + </div> + <div class="panel panel-default" ng-show='resultCount > 0'> + <table class="table table-bordered datatable" > + <thead> <tr ng-if="!isTag(resultType)"> - <th>Name</th> - <th>Description</th> - <th>Owner</th> - <th>Tags</th> - <th>Tools</th> + <th>Name</th> + <th>Description</th> + <th>Owner</th> + <th>Tags</th> + <th>Tools</th> </tr> - <tr ng-if="isTag(resultType)"> - <th>Name</th> - <th>Type</th> - </tr> - </thead> - - <tbody> - <tr ng-if="!isTag(resultType)" ng-repeat="result in filteredResults"> - <td> - <a data-ui-sref="details({id:result['$id$'].id || result.guid})">{{result.name || result.guid}}</a> - </td> - - <td> - {{result.description}} - </td> - - <td> - <span ng-repeat="(key, value) in filterSearchResults(result)"> - <span ng-if="key =='owner'">{{value}}</span> - </span> - </td> - - <td> - <div ng-show="!dataTransitioned" class="wordBreak"><a class="tabsearchanchor" ng-repeat="(key, value) in result['$traits$']" data-ui-sref="search({query: key})" title="{{key}}">{{key}}<span> </span></a></div> - </td> - <td class="addTag"><img ng-src="img/addTag.png" tooltip="Add Tag" ng-click="openAddTagHome(result['$id$'].id || result.guid)"></td> + <tr ng-if="isTag(resultType) && transformedProperties != undefined" > + <th ng-repeat="prop in transformedProperties" ng-if="prop !== 'id'"> + {{(prop != '$traits$') ? prop : 'Tags'}} + </th> </tr> - <tr ng-if="isTag(resultType)" ng-repeat="result in filteredResults"> - <td> - <a data-ui-sref="details({id:result.guid})">{{result.guid}}</a> - </td> - - <td> - {{result.typeName}} - </td> + </thead> + <tbody> + <tr ng-if="!isTag(resultType) && isObject(result)" ng-repeat="result in filteredResults track by $index"> + <td> + <a data-ui-sref="details({id:result['$id$'].id || result.guid})">{{result.name || result.guid}}</a> + </td> + <td> + {{result.description}} + </td> + <td> + <span ng-repeat="(key, value) in filterSearchResults(result)"> + <span ng-if="key =='owner'">{{value}}</span> + </span> + </td> + <td> + <div id="{{result['$id$'].id}}" ng-show="!dataTransitioned" class="wordBreak"><a class="tabsearchanchor" ng-repeat="(key, value) in result['$traits$']" data-ui-sref="search({query: key})" title="{{key}}">{{key}}<span> </span></a></div> + </td> + <td class="addTag"><img ng-src="img/addTag.png" tooltip="Add Tag" ng-click="openAddTagHome(result['$id$'].id || result.guid)"></td> </tr> - </tbody> - </table> - </div> - - <!-- <ul class="list-unstyled" ng-show='resultCount > 0'> + <tr ng-if="isTag(resultType)" ng-repeat="result in filteredResults track by $index"> + <td data-ng-if="isObject(result) && !isString(result) && res != 'id'" data-ng-repeat="res in transformedProperties track by $index"> + + <a data-ng-if="res == 'guid'" data-ui-sref="details({id:result[res]})">{{result[res]}}</a> + + <span data-ng-if="res != '$traits$' && res != 'Tools' && res != 'guid' && res.toLowerCase().indexOf('name') == -1 && res.toLowerCase().indexOf('time') == -1">{{result[res]}}</span> + + <span data-ng-if="res.toLowerCase().indexOf('time') != -1 && isNumber(result[res])">{{result[res] * 1000 | date:'yyyy-MM-dd HH:mm:ss'}} UTC</span> + + <a data-ng-if="res.toLowerCase().indexOf('name') != -1" data-ui-sref="details({id:result['id']|| result['guid']})">{{result[res]}}</a> + + <div data-ng-if="res == '$traits$'" class="wordBreak tags" id="{{result['id']|| result['guid']}}"> + <a class="tabsearchanchor" ng-repeat="(key, value) in result[res]" data-ui-sref="search({query: key})" title="{{key}}">{{key}}<span> </span></a> + </div> + + <span data-ng-if="res == 'Tools'" class="addTag"> <img ng-src="img/addTag.png" tooltip="Add Tag" ng-click="openAddTagHome(result['id']|| result['guid'])"> </span> + </td> + <td data-ng-if="isString(result) || result == false || result == true"> + <a data-ng-if="result.toLowerCase() == 'guid'" data-ui-sref="details({id:result})">{{result}}</a> + <span data-ng-if="result.toLowerCase() != 'guid'">{{result}}</span> + </td> </tr> - </tbody> - </table> - </div> - - <!-- <ul class="list-unstyled" ng-show='resultCount > 0'> - <li ng-repeat="result in filteredResults" class="searchresults"> - <h4><a data-ui-sref="details({id:result['$id$'].id || result.guid})">{{result.name || result.guid}}</a></h4> - - <p>{{result.description}}</p> - <span ng-repeat="(key, value) in filterSearchResults(result)"> - <span ng-show="$index <= 3 "><b>{{key}}: </b>{{value}} {{(($index+1 === limit) || $last ) ? '' : ', '}}</span> - </span> + </tbody> + </table> + </div> + <div class="pull-right" ng-show='resultCount > 0'> + <pagination total-items="totalItems" items-per-page="itemsPerPage" ng-model="currentPage" ng-change="pageChanged()"></pagination> + <p> + </div> + </div> + </div> +</div> - <div collapse="isCollapsed"> - <span ng-repeat="(key, value) in filterSearchResults(result)"> - <span ng-show="$index > 3"><b>{{key}}: </b>{{value}}{{$last ? '' : ', '}}</span> - </span> - </div> - <a href ng-show="isCollapsed && (keyLength > 4)" ng-click="doToggle($event,isCollapsed)">..show more</a> - <a href ng-show="!isCollapsed" ng-click="doToggle($event,isCollapsed)">..show less</a> - - <h5 ng-show="!dataTransitioned">Tags : <a ng-repeat="(key, value) in result['$traits$']" data-ui-sref="search({query: key})">{{key}}<span ng-show="!{{$last}}">,</span> </a></h5> - - </li> - </ul> --> - - <div class="pull-right" ng-show='resultCount > 0'> - <pagination total-items="totalItems" items-per-page="itemsPerPage" ng-model="currentPage" ng-change="pageChanged()"></pagination> - <p> - </div> - </div> - </div> -</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/tags/definition/definitionTagsController.js ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/tags/definition/definitionTagsController.js b/dashboard/public/modules/tags/definition/definitionTagsController.js index a3e7ce6..15a6b42 100755 --- a/dashboard/public/modules/tags/definition/definitionTagsController.js +++ b/dashboard/public/modules/tags/definition/definitionTagsController.js @@ -15,24 +15,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - 'use strict'; -angular.module('dgc.tags.definition').controller('DefinitionTagsController', ['$scope', '$resource', '$state', '$stateParams', 'lodash', 'AttributeDefinition', 'TagClasses', 'TagsResource', 'NotificationService', - function($scope, $resource, $state, $stateParams, _, AttributeDefinition, Categories, TagsResource, NotificationService) { +angular.module('dgc.tags.definition').controller('DefinitionTagsController', ['$scope', '$resource', '$state', '$stateParams', 'lodash', 'AttributeDefinition', 'TagClasses', 'TagsResource', 'NotificationService', 'NavigationResource', + function($scope, $resource, $state, $stateParams, _, AttributeDefinition, Categories, TagsResource, NotificationService, NavigationResource) { $scope.categoryList = Categories; $scope.category = 'TRAIT'; $scope.tagModel = { typeName: null, + superTypes: [], attributeDefinitions: [] }; + $scope.typesList = NavigationResource.get(); $scope.addAttribute = function AddAttribute() { $scope.tagModel.attributeDefinitions.push(AttributeDefinition.getModel()); }; - $scope.removeAttribute = function(index){ - $scope.tagModel.attributeDefinitions.splice(index,1); + $scope.removeAttribute = function(index) { + $scope.tagModel.attributeDefinitions.splice(index, 1); }; $scope.categoryChange = function CategorySwitched() { @@ -42,6 +43,7 @@ angular.module('dgc.tags.definition').controller('DefinitionTagsController', ['$ $scope.save = function saveTag(form) { $scope.savedTag = null; if (form.$valid) { + $scope.tagModel.superTypes = $scope.selectedParent; $scope.categoryInst = Categories[$scope.category]; $scope.categoryInst.clearTags().addTag($scope.tagModel); @@ -59,4 +61,4 @@ angular.module('dgc.tags.definition').controller('DefinitionTagsController', ['$ } }; } -]); +]); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/tags/definition/views/add.html ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/tags/definition/views/add.html b/dashboard/public/modules/tags/definition/views/add.html index dcdd27d..fdcc6d8 100755 --- a/dashboard/public/modules/tags/definition/views/add.html +++ b/dashboard/public/modules/tags/definition/views/add.html @@ -39,6 +39,14 @@ <input type="text" class="form-control" name="typeName" id="typeName" placeholder="Tag Name" data-ng-model="tagModel.typeName" required/> </div> </div> + <div class="form-group"> + <label class="control-label col-sm-2" for="ParentTag">Parent Tag</label> + <div class="col-sm-4"> + <select ng-model="selectedParent" class="form-control h160" id="ParentTag" name="ParentTag" multiple> + <option ng-repeat="data in typesList" title="{{data}}">{{data}}</option> + </select> + </div> + </div> <ng-form name="attributeForm"> <div class="form-group" data-ng-class="{'has-error': attributeForm.name.$invalid && attributeForm.name.$dirty}" data-ng-repeat-start="attribute in tagModel.attributeDefinitions"> @@ -55,7 +63,7 @@ </div> </div> <div class="form-group" data-ng-class="{'has-error': attributeForm.name.$invalid && attributeForm.name.$dirty}" data-ng-show="attribute.$$show"> - <label for="attributeDatatype_{{$index}}" class="col-sm-2 control-label">Data Type Name</label> + <label for="attributeDatatype_{{$index}}" class="col-sm-2 control-label">Data Type </label> <div class="col-sm-10"> <input type="text" class="form-control" name="name" id="attributeDatatype_{{$index}}" placeholder="dataTypeName" http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/tags/instance/createTagController.js ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/tags/instance/createTagController.js b/dashboard/public/modules/tags/instance/createTagController.js index 7cfc392..ba564c9 100644 --- a/dashboard/public/modules/tags/instance/createTagController.js +++ b/dashboard/public/modules/tags/instance/createTagController.js @@ -15,7 +15,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - 'use strict'; angular.module('dgc.tags.instance').controller('CreateTagController', ['$scope', 'DetailsResource', '$modalInstance', 'typesList', 'lodash', 'TagsResource', '$stateParams', '$rootScope', 'TagClasses', 'NotificationService', @@ -23,29 +22,44 @@ angular.module('dgc.tags.instance').controller('CreateTagController', ['$scope', if (typesList) { $scope.typesList = typesList; } + var $$ = angular.element; $scope.categoryList = Categories; $scope.category = 'TRAIT'; $scope.getAttributeDefinations = function() { + $scope.propertiesList = {}; + $scope.isRequired = {}; + $scope.getAttributeApi($scope.selectedType); + }; + + $scope.getAttributeApi = function(tagName) { TagsResource.get({ - id: $scope.selectedType + id: tagName }, function(data) { var instanceType = Categories[$scope.category].instanceInfo(); if (instanceType) { - var traitTypes = angular.fromJson(data.definition)[instanceType][0]; - if (traitTypes) { - $scope.propertiesList = {}; - $scope.isRequired = {}; - _.each(traitTypes.attributeDefinitions, function(value) { - $scope.propertiesList[value.name] = ''; - $scope.isRequired[value.name] = value.isRequired; - }); + var traitTypes = angular.fromJson(data.definition)[instanceType]; + + for (var t = 0; t < traitTypes.length; t++) { + if (traitTypes[t]) { + for(var indx = 0; indx < traitTypes[t].attributeDefinitions.length; indx++) + { + var attrDefn = traitTypes[t].attributeDefinitions[indx]; + $scope.propertiesList[attrDefn.name] = ''; + $scope.isRequired[attrDefn.name] = attrDefn.isRequired; + } + } + + if (traitTypes[t].superTypes && traitTypes[t].superTypes.length > 0) { + for (var s = 0; s < traitTypes[t].superTypes.length; s++) { + $scope.getAttributeApi(traitTypes[t].superTypes[s]); + } + } } } - }); }; - $scope.ok = function(tagDefinitionform) { + $scope.ok = function($event, tagDefinitionform) { if (tagDefinitionform.$valid) { var requestObject = { "jsonClass": "org.apache.atlas.typesystem.json.InstanceSerialization$_Struct", @@ -54,8 +68,14 @@ angular.module('dgc.tags.instance').controller('CreateTagController', ['$scope', }; DetailsResource.saveTag({ id: $stateParams.id - }, requestObject).$promise.then(function() { - $rootScope.$broadcast('refreshResourceData', $stateParams.id); + }, requestObject).$promise.then(function(data) { + if (data.requestId !== undefined && data.GUID === $stateParams.id) { + var tagName = $$("#tagDefinition").val(); + $rootScope.updateTags(true, { + added: $scope.selectedType + }); + $$("#" + $stateParams.id).append("<a class='tabsearchanchor ng-binding ng-scope' data-ui-sref='search({query: " + tagName + "})' title='" + tagName + "' href='#!/search?query=" + tagName + "'>" + tagName + "<span> </span></a>"); + } NotificationService.info('Tag "' + $scope.selectedType + '" has been added to entity', true); $modalInstance.close(true); }).catch(function(err) { @@ -69,4 +89,4 @@ angular.module('dgc.tags.instance').controller('CreateTagController', ['$scope', $modalInstance.dismiss('cancel'); }; } -]); +]); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/tags/instance/instanceTagsController.js ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/tags/instance/instanceTagsController.js b/dashboard/public/modules/tags/instance/instanceTagsController.js index d1f3506..754f2cb 100644 --- a/dashboard/public/modules/tags/instance/instanceTagsController.js +++ b/dashboard/public/modules/tags/instance/instanceTagsController.js @@ -15,34 +15,50 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - 'use strict'; angular.module('dgc.tags.instance').controller('InstanceTagController', ['$scope', 'DetailsResource', '$stateParams', '$state', function($scope, DetailsResource, $stateParams, $state) { $scope.id = $stateParams.id; + var $$ = angular.element; function getResourceData() { DetailsResource.get({ id: $stateParams.id }, function(data) { - angular.forEach(data.traits, function(obj, trait) { - var pair_arr = []; - if (obj.values !== null && Object.keys(obj.values).length > 0) { - angular.forEach(obj.values, function(value, key) { - var pair = key+":"+value; - pair_arr.push(pair); - }); - data.traits[trait].values = pair_arr.join(" | "); - } else { - data.traits[trait].values = 'NA'; - } - }); - + angular.forEach(data.traits, function(obj, trait) { + var pair_arr = []; + if (obj.values !== null && Object.keys(obj.values).length > 0) { + angular.forEach(obj.values, function(value, key) { + var pair = key + ":" + value; + pair_arr.push(pair); + }); + data.traits[trait].values = pair_arr.join(" | "); + } else { + data.traits[trait].values = 'NA'; + } + }); + $scope.traitsList = data.traits; + if ($.isEmptyObject($scope.traitsList)) { + $scope.noTags = true; + } }); } + + $scope.$on('add_Tag', function(evt, obj) { + $scope.traitsList[obj.added] = { + typeName: obj.added + }; + if ($.isEmptyObject($scope.traitsList)) { + $scope.noTags = true; + } else { + $scope.noTags = false; + } + }); + + $scope.openAddTag = function() { $state.go('addTag', { id: $scope.id @@ -50,25 +66,35 @@ angular.module('dgc.tags.instance').controller('InstanceTagController', ['$scope }; $scope.detachTag = function($event, name) { - var r = confirm("Please confirm delete."); - if (r === true) { + $scope.displayName = name; + $$('#btnDelete').modal().on('click', function(e) { + e.preventDefault(); + $$("#myModal").modal(); + DetailsResource.detachTag({ id: $stateParams.id, tagName: name }, function(data) { - console.log("Detached Tag"); - console.log(data); if (data.requestId !== undefined && data.GUID === $stateParams.id && data.traitName === name) { - var curent = $event.currentTarget; - curent.parentElement.remove(); - $(".popover").remove(); + $$($event.currentTarget).closest('tr').remove(); + delete $scope.traitsList[name]; + if ($.isEmptyObject($scope.traitsList)) { + $scope.noTags = true; + } else { + $scope.noTags = false; + } } + }); - } + }); + }; + + $scope.cancel = function() { + $$(".modal-backdrop").remove(); }; - + getResourceData(); $scope.$on('refreshResourceData', getResourceData); } -]); +]); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/tags/instance/views/createTag.html ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/tags/instance/views/createTag.html b/dashboard/public/modules/tags/instance/views/createTag.html index a057894..2184b56 100644 --- a/dashboard/public/modules/tags/instance/views/createTag.html +++ b/dashboard/public/modules/tags/instance/views/createTag.html @@ -52,7 +52,7 @@ </div> </div> <div class="modal-footer"> - <button class="btn btn-success" type="submit" ng-click="ok(tagDefinitionform)" ng-disabled="tagDefinitionform.$invalid">Save</button> + <button class="btn btn-success" type="submit" ng-click="ok($event, tagDefinitionform)" ng-disabled="tagDefinitionform.$invalid">Save</button> <button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button> </div> </form> http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/dashboard/public/modules/tags/instance/views/tags.html ---------------------------------------------------------------------- diff --git a/dashboard/public/modules/tags/instance/views/tags.html b/dashboard/public/modules/tags/instance/views/tags.html index 40eccd5..6de1081 100644 --- a/dashboard/public/modules/tags/instance/views/tags.html +++ b/dashboard/public/modules/tags/instance/views/tags.html @@ -1,27 +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. - --> -<div data-ng-controller="InstanceTagController"> - <div class="container tag-list wordBreak"> - <h4 class="tagsAdded">Tags</h4> - <a ng-click="openAddTag()" href="" class="add-tag btn btn-primary pull-right">Add tag</a> - <ul class="tagalign"> - <li ng-repeat="trait in traitsList" class="list-group-item pointer tabsearchanchor maxwidth125px" popover="{{trait.values}}" popover-title="{{trait.typeName}} Values" popover-trigger="mouseenter" > - {{trait.typeName}} <a href="" class="anchorAbsolute" ng-click="detachTag($event, trait.typeName)"> <i class="fa fa-times"></i> </a> </li> - </ul> + ~ 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 data-ng-controller="InstanceTagController" > + <div> + <a ng-click="openAddTag()" class="add-tag btn btn-primary pull-right">Add Tag</a> + </div> + <table class="table table-bordered"> + <thead> + <tr> + <th>Tag</th> + <th>Tools</th> + </tr> + </thead> + <tbody> + <tr ng-repeat="trait in traitsList" class="pointer" ng-if="!noTags"> + <td class="col-lg-11" > + {{trait.typeName}} + </td> + <td class="col-lg-1 tagAlign"> + <a href="" class="deleteTag confirm-delete" data-toggle="modal" data-target="#myModal" ><i class="fa fa-trash-o " ng-click="detachTag($event, trait.typeName)"></i></a> + </td> + </tr> + </tbody> + </table> + <!-- Modal --> + <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> + <h4 class="modal-title" id="myModalLabel">Are you sure you want to delete ? </h4> + </div> + <div class="modal-body"> + <b> Tag : {{displayName}} </b> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default" data-dismiss="modal" ng-click="cancel()">Close</button> + <button type="button" id="btnDelete" class="btn btn-primary" data-dismiss="modal">Delete</button> + </div> + </div> + </div> </div> + <div ng-if="noTags" class="noTags"> + No tags to display + </div> </div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/docs/src/site/twiki/Bridge-Hive.twiki ---------------------------------------------------------------------- diff --git a/docs/src/site/twiki/Bridge-Hive.twiki b/docs/src/site/twiki/Bridge-Hive.twiki index 34f82a5..86bdd7e 100644 --- a/docs/src/site/twiki/Bridge-Hive.twiki +++ b/docs/src/site/twiki/Bridge-Hive.twiki @@ -19,12 +19,12 @@ hive_partition(ClassType) - super types [Referenceable] - attributes [values, ta hive_process(ClassType) - super types [Process] - attributes [startTime, endTime, userName, operationType, queryText, queryPlan, queryId, queryGraph] </verbatim> -The entities are created and de-duped using unique qualified name. They provide namespace and can be used for querying/lineage as well. Note that dbName and tableName should be in lower case. clusterName is explained below: -hive_db - attribute qualifiedName - <dbName>@<clusterName> -hive_table - attribute name - <dbName>.<tableName>@<clusterName> -hive_column - attribute qualifiedName - <dbName>.<tableName>.<columnName>@<clusterName> -hive_partition - attribute qualifiedName - <dbName>.<tableName>.<partitionValues('-' separated)>@<clusterName> -hive_process - attribute name - <queryString> - trimmed query string in lower case +The entities are created and de-duped using unique qualified name. They provide namespace and can be used for querying/lineage as well. Note that dbName and tableName should be in lower case. clusterName is explained below. + * hive_db - attribute qualifiedName - <dbName>@<clusterName> + * hive_table - attribute name - <dbName>.<tableName>@<clusterName> + * hive_column - attribute qualifiedName - <dbName>.<tableName>.<columnName>@<clusterName> + * hive_partition - attribute qualifiedName - <dbName>.<tableName>.<partitionValues('-' separated)>@<clusterName> + * hive_process - attribute name - <queryString> - trimmed query string in lower case ---++ Importing Hive Metadata http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/cc2d8860/release-log.txt ---------------------------------------------------------------------- diff --git a/release-log.txt b/release-log.txt index b773bfb..979bdf2 100644 --- a/release-log.txt +++ b/release-log.txt @@ -9,6 +9,7 @@ ATLAS-54 Rename configs in hive hook (shwethags) ATLAS-3 Mixed Index creation fails with Date types (sumasai via shwethags) ALL CHANGES: +ATLAS-279 UI not displaying results for certain successful "select" search queries (anilsg via shwethags) ATLAS-242 The qualified name for hive entities should be backward compatible (shwethags) ATLAS-361 Add validation when index backends are switched in ATLAS configuration (sumasai via shwethags) ATLAS-171 Ability to update type definition(shwethags via sumasai)
