ATLAS-4022: Atlas UI: After d3 verion upgrade profile tab not working
diff --git a/dashboardv2/gruntfile.js b/dashboardv2/gruntfile.js
index 1f21df2..fa79a15 100644
--- a/dashboardv2/gruntfile.js
+++ b/dashboardv2/gruntfile.js
@@ -105,7 +105,6 @@
'platform.js': { 'platform': 'platform' },
'query-builder.standalone.min.js': { 'jQuery-QueryBuilder/dist/js': 'jQueryQueryBuilder/js' },
'daterangepicker.js': { 'bootstrap-daterangepicker': 'bootstrap-daterangepicker/js' },
- 'nv.d3.min.js': { 'nvd3/build': 'nvd3' },
'jquery.sparkline.min.js': { 'jquery-sparkline': 'sparkline' },
'table-dragger.js': { 'table-dragger/dist': 'table-dragger' },
'jstree.min.js': { 'jstree/dist': 'jstree' },
@@ -148,7 +147,6 @@
}],
'query-builder.default.min.css': { 'jQuery-QueryBuilder/dist/css': 'jQueryQueryBuilder/css' },
'daterangepicker.css': { 'bootstrap-daterangepicker': 'bootstrap-daterangepicker/css' },
- 'nv.d3.min.css': { 'nvd3/build': 'nvd3/css' },
'pretty-checkbox.min.css': { 'pretty-checkbox/dist': 'pretty-checkbox/css' },
'dropzone.css': { 'dropzone/dist': "dropzone/css" }
}
@@ -179,7 +177,6 @@
],
'LICENSE.md': [{ 'backbone.babysitter': 'backbone-babysitter' },
{ 'backbone.wreqr': 'backbone-wreqr' },
- { 'nvd3': 'nvd3/' },
{ 'lossless-json': 'lossless-json' }
],
'license.txt': [{ 'backbone.marionette': 'backbone-marionette' }],
diff --git a/dashboardv2/package-lock.json b/dashboardv2/package-lock.json
index 6b8e15a..001de7d 100644
--- a/dashboardv2/package-lock.json
+++ b/dashboardv2/package-lock.json
@@ -792,11 +792,27 @@
"resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
"integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA=="
},
+ "d3-queue": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz",
+ "integrity": "sha1-yTouVLQXwJWRKdfXP2z31Ckudhg="
+ },
"d3-random": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz",
"integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ=="
},
+ "d3-request": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz",
+ "integrity": "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==",
+ "requires": {
+ "d3-collection": "1",
+ "d3-dispatch": "1",
+ "d3-dsv": "1",
+ "xmlhttprequest": "1"
+ }
+ },
"d3-scale": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz",
@@ -851,17 +867,251 @@
"integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
},
"d3-tip": {
- "version": "0.6.8",
- "resolved": "https://registry.npmjs.org/d3-tip/-/d3-tip-0.6.8.tgz",
- "integrity": "sha1-5bRJGuiYP95kbqSQCP9UKgM8Ciw=",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/d3-tip/-/d3-tip-0.7.1.tgz",
+ "integrity": "sha1-eMv1VPZ7cgpw47DxkeFM/+aM3Xk=",
"requires": {
- "d3": "^3.5.5"
+ "d3": "^4.2"
},
"dependencies": {
"d3": {
- "version": "3.5.17",
- "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz",
- "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g="
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/d3/-/d3-4.13.0.tgz",
+ "integrity": "sha512-l8c4+0SldjVKLaE2WG++EQlqD7mh/dmQjvi2L2lKPadAVC+TbJC4ci7Uk9bRi+To0+ansgsS0iWfPjD7DBy+FQ==",
+ "requires": {
+ "d3-array": "1.2.1",
+ "d3-axis": "1.0.8",
+ "d3-brush": "1.0.4",
+ "d3-chord": "1.0.4",
+ "d3-collection": "1.0.4",
+ "d3-color": "1.0.3",
+ "d3-dispatch": "1.0.3",
+ "d3-drag": "1.2.1",
+ "d3-dsv": "1.0.8",
+ "d3-ease": "1.0.3",
+ "d3-force": "1.1.0",
+ "d3-format": "1.2.2",
+ "d3-geo": "1.9.1",
+ "d3-hierarchy": "1.1.5",
+ "d3-interpolate": "1.1.6",
+ "d3-path": "1.0.5",
+ "d3-polygon": "1.0.3",
+ "d3-quadtree": "1.0.3",
+ "d3-queue": "3.0.7",
+ "d3-random": "1.1.0",
+ "d3-request": "1.0.6",
+ "d3-scale": "1.0.7",
+ "d3-selection": "1.3.0",
+ "d3-shape": "1.2.0",
+ "d3-time": "1.0.8",
+ "d3-time-format": "2.1.1",
+ "d3-timer": "1.0.7",
+ "d3-transition": "1.1.1",
+ "d3-voronoi": "1.1.2",
+ "d3-zoom": "1.7.1"
+ }
+ },
+ "d3-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz",
+ "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw=="
+ },
+ "d3-axis": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz",
+ "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo="
+ },
+ "d3-brush": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz",
+ "integrity": "sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=",
+ "requires": {
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "1",
+ "d3-transition": "1"
+ }
+ },
+ "d3-chord": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz",
+ "integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=",
+ "requires": {
+ "d3-array": "1",
+ "d3-path": "1"
+ }
+ },
+ "d3-collection": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz",
+ "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI="
+ },
+ "d3-color": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz",
+ "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs="
+ },
+ "d3-dispatch": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz",
+ "integrity": "sha1-RuFJHqqbWMNY/OW+TovtYm54cfg="
+ },
+ "d3-drag": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz",
+ "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==",
+ "requires": {
+ "d3-dispatch": "1",
+ "d3-selection": "1"
+ }
+ },
+ "d3-dsv": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz",
+ "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==",
+ "requires": {
+ "commander": "2",
+ "iconv-lite": "0.4",
+ "rw": "1"
+ }
+ },
+ "d3-ease": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz",
+ "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4="
+ },
+ "d3-force": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz",
+ "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==",
+ "requires": {
+ "d3-collection": "1",
+ "d3-dispatch": "1",
+ "d3-quadtree": "1",
+ "d3-timer": "1"
+ }
+ },
+ "d3-format": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz",
+ "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw=="
+ },
+ "d3-geo": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz",
+ "integrity": "sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==",
+ "requires": {
+ "d3-array": "1"
+ }
+ },
+ "d3-hierarchy": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz",
+ "integrity": "sha1-ochFxC+Eoga88cAcAQmOpN2qeiY="
+ },
+ "d3-interpolate": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz",
+ "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==",
+ "requires": {
+ "d3-color": "1"
+ }
+ },
+ "d3-path": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz",
+ "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q="
+ },
+ "d3-polygon": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz",
+ "integrity": "sha1-FoiOkCZGCTPysXllKtN4Ik04LGI="
+ },
+ "d3-quadtree": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz",
+ "integrity": "sha1-rHmH4+I/6AWpkPKOG1DTj8uCJDg="
+ },
+ "d3-random": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz",
+ "integrity": "sha1-ZkLlBsb6OmSFldKyRpeIqNElKdM="
+ },
+ "d3-scale": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz",
+ "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==",
+ "requires": {
+ "d3-array": "^1.2.0",
+ "d3-collection": "1",
+ "d3-color": "1",
+ "d3-format": "1",
+ "d3-interpolate": "1",
+ "d3-time": "1",
+ "d3-time-format": "2"
+ }
+ },
+ "d3-selection": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz",
+ "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA=="
+ },
+ "d3-shape": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz",
+ "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=",
+ "requires": {
+ "d3-path": "1"
+ }
+ },
+ "d3-time": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz",
+ "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ=="
+ },
+ "d3-time-format": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz",
+ "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==",
+ "requires": {
+ "d3-time": "1"
+ }
+ },
+ "d3-timer": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz",
+ "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA=="
+ },
+ "d3-transition": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz",
+ "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==",
+ "requires": {
+ "d3-color": "1",
+ "d3-dispatch": "1",
+ "d3-ease": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "^1.1.0",
+ "d3-timer": "1"
+ }
+ },
+ "d3-voronoi": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz",
+ "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw="
+ },
+ "d3-zoom": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz",
+ "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==",
+ "requires": {
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "1",
+ "d3-transition": "1"
+ }
}
}
},
@@ -2441,11 +2691,6 @@
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true
},
- "nvd3": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/nvd3/-/nvd3-1.8.5.tgz",
- "integrity": "sha1-lKDJj/HDNmtyH6eocFs8bp6va7Y="
- },
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@@ -3578,6 +3823,11 @@
"integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=",
"dev": true
},
+ "xmlhttprequest": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+ "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
+ },
"y18n": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
diff --git a/dashboardv2/package.json b/dashboardv2/package.json
index a6b26b5..5e20147 100644
--- a/dashboardv2/package.json
+++ b/dashboardv2/package.json
@@ -31,7 +31,7 @@
"bootstrap": "3.3.7",
"bootstrap-daterangepicker": "3.1.0",
"d3": "5.14.2",
- "d3-tip": "0.6.8",
+ "d3-tip": "^0.7.1",
"dagre-d3": "0.6.4",
"dropzone": "5.7.0",
"font-awesome": "4.7.0",
@@ -42,9 +42,9 @@
"jquery-sparkline": "2.4.0",
"jquery-steps": "1.1.0",
"jstree": "3.3.5",
+ "lossless-json": "1.0.4",
"moment": "2.21.0",
"moment-timezone": "0.5.14",
- "nvd3": "1.8.5",
"platform": "1.3.4",
"pnotify": "3.2.0",
"pretty-checkbox": "3.0.3",
@@ -52,8 +52,7 @@
"requirejs-text": "2.0.15",
"select2": "4.0.3",
"table-dragger": "1.0.2",
- "underscore": "1.8.3",
- "lossless-json": "1.0.4"
+ "underscore": "1.8.3"
},
"devDependencies": {
"grunt": "1.0.4",
diff --git a/dashboardv2/public/css/scss/graph.scss b/dashboardv2/public/css/scss/graph.scss
index cd5e220..19636c5 100644
--- a/dashboardv2/public/css/scss/graph.scss
+++ b/dashboardv2/public/css/scss/graph.scss
@@ -300,4 +300,42 @@
padding-bottom: 15px;
}
}
+}
+
+.profile-bar {
+ fill: #38bb9b;
+ stroke: #38bb9b;
+ fill-opacity: 0.75;
+}
+
+.axislabel {
+ text-anchor: middle;
+ fill: #999;
+ font: 400 12px Arial, sans-serif;
+}
+
+.grid {
+
+ path,
+ line {
+ stroke: lightgrey;
+ stroke-opacity: 0.7;
+ shape-rendering: crispEdges;
+ }
+}
+
+.d3-tip {
+ table td {
+ padding: 2px 9px 2px 0;
+ vertical-align: middle;
+
+ &.value {
+ text-align: right;
+ font-weight: 700;
+ }
+
+ &.key {
+ font-weight: 400;
+ }
+ }
}
\ No newline at end of file
diff --git a/dashboardv2/public/index.html.tpl b/dashboardv2/public/index.html.tpl
index 7c6783d..55cf2e8 100644
--- a/dashboardv2/public/index.html.tpl
+++ b/dashboardv2/public/index.html.tpl
@@ -64,7 +64,6 @@
<link href="js/external_lib/pnotify/pnotify.custom.min.css?bust=<%- bust %>" rel="stylesheet">
<link href="js/libs/jQueryQueryBuilder/css/query-builder.default.min.css?bust=<%- bust %>" rel="stylesheet">
<link href="js/libs/bootstrap-daterangepicker/css/daterangepicker.css?bust=<%- bust %>" rel="stylesheet">
- <link rel="stylesheet" href="js/libs/nvd3/css/nv.d3.min.css?bust=<%- bust %>">
<link href="js/libs/jstree/css/default-dark/default-dark-theme.min.css?bust=<%- bust %>" rel="stylesheet">
<link href="js/libs/pretty-checkbox/css/pretty-checkbox.min.css?bust=<%- bust %>" rel="stylesheet">
<link href="js/libs/dropzone/css/dropzone.css?bust=<%- bust %>" rel="stylesheet">
diff --git a/dashboardv2/public/js/main.js b/dashboardv2/public/js/main.js
index 10d62eb..64be5b4 100644
--- a/dashboardv2/public/js/main.js
+++ b/dashboardv2/public/js/main.js
@@ -106,9 +106,6 @@
'deps': ['d3'],
'exports': ['dagreD3']
},
- 'nvd3': {
- 'deps': ['d3']
- },
'sparkline': {
'deps': ['jquery'],
'exports': ['sparkline']
@@ -159,7 +156,6 @@
'd3-tip': 'libs/d3/index',
'LineageHelper': 'external_lib/atlas-lineage/dist/index',
'dagreD3': 'libs/dagre-d3/dagre-d3.min',
- 'nvd3': 'libs/nvd3/nv.d3.min',
'sparkline': 'libs/sparkline/jquery.sparkline.min',
'tmpl': 'templates',
'requirejs.text': 'libs/requirejs-text/text',
diff --git a/dashboardv2/public/js/templates/profile/ProfileLayoutView_tmpl.html b/dashboardv2/public/js/templates/profile/ProfileLayoutView_tmpl.html
index b1fba11..96adc9b 100644
--- a/dashboardv2/public/js/templates/profile/ProfileLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/profile/ProfileLayoutView_tmpl.html
@@ -16,7 +16,7 @@
-->
<div id="r_profileTableOrColumnLayoutView">
{{#if profileData}}
- <div class="fontLoader" style="display: block;">
+ <div class="fontLoader-relative show" style="display: block;">
<i class="fa fa-refresh fa-spin-custom"></i>
</div> {{else}} {{#ifCond typeName "==" "hive_db"}}
<h3>No Tables to Show!</h3> {{else}}
diff --git a/dashboardv2/public/js/views/graph/ProfileBarChart.js b/dashboardv2/public/js/views/graph/ProfileBarChart.js
new file mode 100644
index 0000000..d5a974d
--- /dev/null
+++ b/dashboardv2/public/js/views/graph/ProfileBarChart.js
@@ -0,0 +1,151 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define(["require", "d3", "d3-tip"], function(require, d3, d3Tip) {
+ "use strict";
+ var ProfileBarChart = {
+ render(options) {
+ var el = options.el,
+ type = options.data.key,
+ data = options.data.values,
+ formatValue = options.formatValue,
+ xAxisLabel = options.xAxisLabel,
+ yAxisLabel = options.yAxisLabel,
+ rotateXticks = options.rotateXticks,
+ onBarClick = options.onBarClick,
+ size = el.getBoundingClientRect(),
+ svg = d3.select(el),
+ margin = { top: 20, right: 30, bottom: 100, left: 80 },
+ width = size.width - margin.left - margin.right,
+ height = size.height - margin.top - margin.bottom;
+
+ // set the ranges
+ var x = d3.scaleBand().range([0, width]).padding(0.5);
+
+ var y = d3.scaleLinear().range([height, 0]);
+
+ var g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");
+
+ x.domain(
+ data.map(function(d) {
+ return d.value;
+ })
+ );
+ y.domain([
+ 0,
+ d3.max(data, function(d) {
+ return d.count;
+ })
+ ]);
+
+ // gridlines in x axis function
+ function make_x_gridlines() {
+ return d3.axisBottom(x).ticks(5);
+ }
+
+ // gridlines in y axis function
+ function make_y_gridlines() {
+ return d3.axisLeft(y).ticks(5);
+ }
+
+ // add the X gridlines
+ g.append("g")
+ .attr("class", "grid")
+ .attr("transform", "translate(0," + height + ")")
+ .call(make_x_gridlines().tickSize(-height).tickFormat(""));
+
+ // add the Y gridlines
+ g.append("g").attr("class", "grid").call(make_y_gridlines().tickSize(-width).tickFormat(""));
+
+ // add the x Axis
+ var xAxis = g
+ .append("g")
+ .attr("transform", "translate(0," + height + ")")
+ .call(d3.axisBottom(x));
+
+ if (rotateXticks) {
+ xAxis.selectAll("text").style("text-anchor", "end").attr("dx", "-.8em").attr("dy", ".15em").attr("transform", "rotate(-45)");
+ }
+
+ // add the y Axis
+ g.append("g").call(d3.axisLeft(y).ticks(3, "s"));
+
+ g.append("text")
+ .attr("transform", "translate(" + width / 2 + " ," + (margin.top - 25) + ")")
+ .attr("class", "axislabel")
+ .text(xAxisLabel);
+
+ // text label for the y axis
+ g.append("text")
+ .attr("transform", "rotate(-90)")
+ .attr("y", 0 - margin.left)
+ .attr("x", 0 - height / 2)
+ .attr("dy", "1em")
+ .attr("class", "axislabel")
+ .text(yAxisLabel);
+
+ var tooltip = d3Tip()
+ .attr("class", "d3-tip")
+ .offset([10, 0])
+ .html(function(d) {
+ console.log(d)
+ return '<table><thead><tr><td colspan="3"><strong class="x-value">' + d.value + '</strong></td></tr></thead><tbody><tr><td class="key">' + type + '</td><td class="value">' + d.count + '</td></tr></tbody></table>';
+ });
+
+ // append the rectangles for the bar chart
+ g.selectAll(".bar")
+ .data(data)
+ .enter()
+ .append("rect")
+ .attr("class", "profile-bar")
+ .attr("x", function(d) {
+ return x(d.value);
+ })
+ .attr("width", x.bandwidth())
+ .attr("y", d => { return height; })
+ .attr("height", 0)
+ .on("click", function(e) {
+ tooltip.hide();
+ if (onBarClick) {
+ onBarClick(e);
+ }
+ })
+ .on("mouseover", function(d) {
+ tooltip.show(d, this);
+ })
+ .on("mouseout", function(d) {
+ tooltip.hide();
+ })
+ .transition()
+ .duration(450)
+ .delay(function(d, i) {
+ return i * 50;
+ })
+ .attr("y", function(d) {
+ return y(d.count);
+ })
+ .attr("height", function(d) {
+ return height - y(d.count);
+ });
+
+ g.call(tooltip);
+
+ }
+ };
+ return ProfileBarChart;
+});
\ No newline at end of file
diff --git a/dashboardv2/public/js/views/profile/ProfileColumnLayoutView.js b/dashboardv2/public/js/views/profile/ProfileColumnLayoutView.js
index 74e19c0..215391d 100644
--- a/dashboardv2/public/js/views/profile/ProfileColumnLayoutView.js
+++ b/dashboardv2/public/js/views/profile/ProfileColumnLayoutView.js
@@ -16,23 +16,25 @@
* limitations under the License.
*/
-define(['require',
- 'backbone',
- 'hbs!tmpl/profile/ProfileColumnLayoutView_tmpl',
- 'collection/VProfileList',
- 'utils/Utils',
- 'utils/Messages',
- 'utils/Globals',
- 'moment',
- 'models/VEntity',
- 'nvd3'
-], function(require, Backbone, ProfileColumnLayoutViewTmpl, VProfileList, Utils, Messages, Globals, moment, VEntity) {
- 'use strict';
+define([
+ "require",
+ "backbone",
+ "hbs!tmpl/profile/ProfileColumnLayoutView_tmpl",
+ "views/graph/ProfileBarChart",
+ "collection/VProfileList",
+ "utils/Utils",
+ "utils/Messages",
+ "utils/Globals",
+ "moment",
+ "models/VEntity",
+ "d3"
+], function(require, Backbone, ProfileColumnLayoutViewTmpl, ProfileBarChart, VProfileList, Utils, Messages, Globals, moment, VEntity, d3) {
+ "use strict";
var ProfileColumnLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends ProfileColumnLayoutView */
{
- _viewName: 'ProfileColumnLayoutView',
+ _viewName: "ProfileColumnLayoutView",
template: ProfileColumnLayoutViewTmpl,
@@ -47,12 +49,12 @@
},
/** ui selector cache */
ui: {
- "backToYear": '[data-id="backToYear"]'
+ backToYear: '[data-id="backToYear"]'
},
/** ui events hash */
events: function() {
var events = {};
- events["click " + this.ui.backToYear] = 'backToYear';
+ events["click " + this.ui.backToYear] = "backToYear";
return events;
},
/**
@@ -60,39 +62,42 @@
* @constructs
*/
initialize: function(options) {
- _.extend(this, _.pick(options, 'profileData', 'guid', 'entityDetail'));
+ _.extend(this, _.pick(options, "profileData", "guid", "entityDetail"));
this.typeObject = Utils.getProfileTabType(this.profileData.attributes);
this.entityModel = new VEntity();
- this.formatValue = d3.format("2s")
-
+ this.formatValue = d3.format(".0s");
},
fetchEntity: function(argument) {
var that = this;
this.entityModel.getEntity(this.entityDetail.table.guid, {
success: function(data) {
var entity = data.entity,
- profileData = entity && entity.attributes && entity.attributes.profileData ? entity.attributes.profileData.attributes : null;
+ profileData =
+ entity && entity.attributes && entity.attributes.profileData ? entity.attributes.profileData.attributes : null;
if (profileData && profileData.rowCount) {
- that.$('.rowValue').show();
- that.$('.rowValue .graphval').html('<b>' + that.formatValue(profileData.rowCount).replace('G', 'B') + '</b>');
+ that.$(".rowValue").show();
+ that.$(".rowValue .graphval").html("<b>" + that.formatValue(profileData.rowCount).replace("G", "B") + "</b>");
}
if (entity.attributes) {
if (entity.guid) {
- that.$('.table_name .graphval').html('<b><a href="#!/detailPage/' + entity.guid + "?profile=true" + '">' + Utils.getName(entity) + '</a></b>');
+ that.$(".table_name .graphval").html(
+ '<b><a href="#!/detailPage/' + entity.guid + "?profile=true" + '">' + Utils.getName(entity) + "</a></b>"
+ );
}
- that.$('.table_created .graphval').html('<b>' + moment(entity.attributes.createTime).format("LL") + '</b>');
+ that.$(".table_created .graphval").html("<b>" + moment(entity.attributes.createTime).format("LL") + "</b>");
}
}
});
},
bindEvents: function() {},
onRender: function() {
- this.renderGraph();
this.fetchEntity();
if (this.typeObject && this.typeObject.type === "date") {
- this.$('svg').addClass('dateType');
+ this.$("svg").addClass("dateType");
}
-
+ },
+ onShow: function() {
+ this.renderGraph();
},
renderGraph: function(argument) {
if (!this.typeObject) {
@@ -100,106 +105,71 @@
}
var that = this,
profileData = this.profileData.attributes;
- this.data = [{
+ this.data = {
key: this.typeObject.label,
values: this.typeObject.actualObj || []
- }];
- nv.addGraph(function() {
- that.chart = nv.models.multiBarChart()
- .x(function(d) {
- return d.value || d.year
- }) //Specify the data accessors.
- .y(function(d) {
- return d.count
- })
- .height(220)
- .stacked(false)
- .showControls(false)
- .reduceXTicks(false)
- .staggerLabels(true)
- .duration(1000)
- .groupSpacing(0.6)
- .wrapLabels(true)
- .showLegend(false);
- if (that.typeObject.type !== "date") {
- that.chart.rotateLabels(-45);
- }
- that.chart.color(["#38BB9B"]);
-
- that.chart.yAxis.tickFormat(function(d) {
- return that.formatValue(d).replace('G', 'B');
- });
- that.chart.xAxis
- .axisLabel(that.typeObject.xAxisLabel)
- .axisLabelDistance(-185);
- that.chart.yAxis
- .axisLabel(that.typeObject.yAxisLabel)
- .axisLabelDistance(-5);
- that.chart.margin({
- right: 30,
- left: 80,
- top: 20,
- bottom: 60
- });
- if (that.typeObject.type === "date") {
- that.chart.multibar.dispatch.elementClick = function(e) {
- if (!that.monthsData) {
- that.createMonthData(e.data.monthlyCounts)
- }
- }
- }
- that.svg = d3.select(that.$('svg')[0]).datum(that.data)
- that.svg.transition().duration(0).call(that.chart);
-
- nv.utils.windowResize(that.chart.update);
-
- return that.chart;
- });
-
+ };
+ this.updateGraph(this.data);
},
backToYear: function() {
this.ui.backToYear.hide();
- this.$('.profileGraphDetail').show();
+ this.$(".profileGraphDetail").show();
this.monthsData = null;
this.updateGraph(this.data);
},
createMonthData: function(data) {
var monthsKey = {
- "1": "Jan",
- "2": "Feb",
- "3": "Mar",
- "4": "Apr",
- "5": "May",
- "6": "Jun",
- "7": "Jul",
- "8": "Aug",
- "9": "Sep",
- "10": "Oct",
- "11": "Nov",
- "12": "Dec"
+ 1: "Jan",
+ 2: "Feb",
+ 3: "Mar",
+ 4: "Apr",
+ 5: "May",
+ 6: "Jun",
+ 7: "Jul",
+ 8: "Aug",
+ 9: "Sep",
+ 10: "Oct",
+ 11: "Nov",
+ 12: "Dec"
},
i = 1;
- this.monthsData = [{
+ this.monthsData = {
key: this.typeObject.label,
values: []
- }];
+ };
while (i <= 12) {
- this.monthsData[0].values.push({
+ this.monthsData.values.push({
value: monthsKey[i],
count: data[i] || 0
});
i++;
}
this.ui.backToYear.show();
- this.$('.profileGraphDetail').hide();
+ this.$(".profileGraphDetail").hide();
this.updateGraph(this.monthsData);
-
},
updateGraph: function(data) {
- this.svg.datum(data).transition().duration(0).call(this.chart);
- },
- });
+ var that = this;
+ this.$("svg").empty();
+ ProfileBarChart.render({
+ el: this.$("svg")[0],
+ data: data,
+ xAxisLabel: this.typeObject.xAxisLabel,
+ yAxisLabel: this.typeObject.yAxisLabel,
+ formatValue: this.formatValue,
+ rotateXticks: this.typeObject.type !== "date",
+ onBarClick: function(e) {
+ if (that.typeObject.type === "date") {
+ if (!that.monthsData) {
+ that.createMonthData(e.monthlyCounts);
+ }
+ }
+ }
+ });
+ }
+ }
+ );
return ProfileColumnLayoutView;
});
\ No newline at end of file
diff --git a/dashboardv2/public/js/views/profile/ProfileTableLayoutView.js b/dashboardv2/public/js/views/profile/ProfileTableLayoutView.js
index ada7e62..54dabe2 100644
--- a/dashboardv2/public/js/views/profile/ProfileTableLayoutView.js
+++ b/dashboardv2/public/js/views/profile/ProfileTableLayoutView.js
@@ -24,10 +24,12 @@
'utils/Messages',
'utils/Globals',
'moment',
+ 'utils/UrlLinks',
'collection/VCommonList',
- 'models/VEntity',
+ 'collection/VEntityList',
+ 'd3',
'sparkline'
-], function(require, Backbone, ProfileTableLayoutViewTmpl, VProfileList, Utils, Messages, Globals, moment, VCommonList, VEntity, sparkline) {
+], function(require, Backbone, ProfileTableLayoutViewTmpl, VProfileList, Utils, Messages, Globals, moment, UrlLinks, VCommonList, VEntityList, d3, sparkline) {
'use strict';
var ProfileTableLayoutView = Backbone.Marionette.LayoutView.extend(
@@ -57,67 +59,86 @@
initialize: function(options) {
_.extend(this, _.pick(options, 'profileData', 'guid', 'entityDetail'));
var that = this;
- this.entityModel = new VEntity();
this.profileCollection = new VCommonList([], {
comparator: function(item) {
return item.get('position') || 999;
}
});
- _.each(this.entityDetail.columns, function(obj) {
- if (obj.attributes.profileData !== null) {
- var profileObj = Utils.getProfileTabType(obj.attributes.profileData.attributes, true);
- var changeValueObj = {}
- if (profileObj && profileObj.type) {
- if (profileObj.type === "numeric") {
- changeValueObj['averageLength'] = 0;
- changeValueObj['maxLength'] = 0;
- }
- if (profileObj.type === "string") {
- changeValueObj['minValue'] = 0;
- changeValueObj['maxValue'] = 0;
- changeValueObj['meanValue'] = 0;
- changeValueObj['medianValue'] = 0;
- }
- if (profileObj.type === "date") {
- changeValueObj['averageLength'] = 0;
- changeValueObj['maxLength'] = 0;
- changeValueObj['minValue'] = 0;
- changeValueObj['maxValue'] = 0;
- changeValueObj['meanValue'] = 0;
- changeValueObj['medianValue'] = 0;
- }
- }
- that.profileCollection.fullCollection.add(_.extend({}, obj.attributes, obj.attributes.profileData.attributes, changeValueObj, { guid: obj.guid, position: obj.attributes ? obj.attributes.position : null }));
- }
- });
this.bindEvents();
},
onRender: function() {
this.fetchEntity();
- this.renderTableLayoutView();
- if (this.entityDetail) {
- if (this.guid && this.entityDetail.name) {
- this.$('.table_name .graphval').html('<b><a href="#!/detailPage/' + this.guid + '">' + this.entityDetail.name + '</a></b>');
- }
- var profileData = this.entityDetail.profileData;
- if (profileData && profileData.attributes && profileData.attributes.rowCount) {
- this.$('.rowValue .graphval').html('<b>' + d3.format("2s")(profileData.attributes.rowCount).replace('G', 'B') + '</b>');
- }
- this.$('.table_created .graphval').html('<b>' + (this.entityDetail.createTime ? moment(this.entityDetail.createTime).format("LL") : "--") + '</b>');
- }
},
fetchEntity: function(argument) {
var that = this;
- this.entityModel.getEntity(this.entityDetail.db.guid, {
- success: function(data) {
- var entity = data.entity;
- if (entity.attributes) {
- if (entity.guid) {
- that.$('.db_name .graphval').html('<b><a href="#!/detailPage/' + entity.guid + "?profile=true" + '">' + Utils.getName(entity) + '</a></b>');
+ this.collection = new VEntityList([], {});
+ this.collection.url = UrlLinks.entitiesApiUrl({ guid: this.guid, minExtInfo: false });
+ this.collection.fetch({
+ success: function(response) {
+ that.entityObject = that.collection.first().toJSON();
+
+ var collectionJSON = that.entityObject.entity;
+ that.entityDetail = collectionJSON.attributes;
+
+ Utils.findAndMergeRefEntity({
+ attributeObject: collectionJSON.attributes,
+ referredEntities: that.entityObject.referredEntities
+ });
+
+ Utils.findAndMergeRefEntity({
+ attributeObject: collectionJSON.relationshipAttributes,
+ referredEntities: that.entityObject.referredEntities
+ });
+
+ var columns = collectionJSON.relationshipAttributes.columns || collectionJSON.attributes.columns,
+ db = collectionJSON.relationshipAttributes.db || collectionJSON.attributes.db
+
+ that.renderTableLayoutView();
+ if (that.entityDetail) {
+ if (that.guid && that.entityDetail.name) {
+ that.$('.table_name .graphval').html('<b><a href="#!/detailPage/' + that.guid + '">' + that.entityDetail.name + '</a></b>');
}
+ if (db) {
+ that.$('.db_name .graphval').html('<b><a href="#!/detailPage/' + db.guid + "?profile=true" + '">' + Utils.getName(db) + '</a></b>');
+ }
+ var profileData = that.entityDetail.profileData;
+ if (profileData && profileData.attributes && profileData.attributes.rowCount) {
+ that.$('.rowValue .graphval').html('<b>' + d3.format("2s")(profileData.attributes.rowCount).replace('G', 'B') + '</b>');
+ }
+ that.$('.table_created .graphval').html('<b>' + (that.entityDetail.createTime ? moment(that.entityDetail.createTime).format("LL") : "--") + '</b>');
}
- }
+
+ _.each(columns, function(obj) {
+ if (obj.attributes && obj.attributes.profileData) {
+ var profileObj = Utils.getProfileTabType(obj.attributes.profileData.attributes, true);
+ var changeValueObj = {}
+ if (profileObj && profileObj.type) {
+ if (profileObj.type === "numeric") {
+ changeValueObj['averageLength'] = 0;
+ changeValueObj['maxLength'] = 0;
+ }
+ if (profileObj.type === "string") {
+ changeValueObj['minValue'] = 0;
+ changeValueObj['maxValue'] = 0;
+ changeValueObj['meanValue'] = 0;
+ changeValueObj['medianValue'] = 0;
+ }
+ if (profileObj.type === "date") {
+ changeValueObj['averageLength'] = 0;
+ changeValueObj['maxLength'] = 0;
+ changeValueObj['minValue'] = 0;
+ changeValueObj['maxValue'] = 0;
+ changeValueObj['meanValue'] = 0;
+ changeValueObj['medianValue'] = 0;
+ }
+ }
+
+ that.profileCollection.fullCollection.add(_.extend({}, obj.attributes, obj.attributes.profileData.attributes, changeValueObj, { guid: obj.guid, position: obj.attributes ? obj.attributes.position : null }));
+ }
+ });
+ },
+ reset: false
});
},
bindEvents: function() {
diff --git a/dashboardv3/gruntfile.js b/dashboardv3/gruntfile.js
index 62d8ddf..b1b7b59 100644
--- a/dashboardv3/gruntfile.js
+++ b/dashboardv3/gruntfile.js
@@ -105,7 +105,6 @@
'platform.js': { 'platform': 'platform' },
'query-builder.standalone.min.js': { 'jQuery-QueryBuilder/dist/js': 'jQueryQueryBuilder/js' },
'daterangepicker.js': { 'bootstrap-daterangepicker': 'bootstrap-daterangepicker/js' },
- 'nv.d3.min.js': { 'nvd3/build': 'nvd3' },
'jquery.sparkline.min.js': { 'jquery-sparkline': 'sparkline' },
'table-dragger.js': { 'table-dragger/dist': 'table-dragger' },
'jstree.min.js': { 'jstree/dist': 'jstree' },
@@ -154,7 +153,6 @@
}],
'query-builder.default.min.css': { 'jQuery-QueryBuilder/dist/css': 'jQueryQueryBuilder/css' },
'daterangepicker.css': { 'bootstrap-daterangepicker': 'bootstrap-daterangepicker/css' },
- 'nv.d3.min.css': { 'nvd3/build': 'nvd3/css' },
'pretty-checkbox.min.css': { 'pretty-checkbox/dist': 'pretty-checkbox/css' },
'dropzone.css': { 'dropzone/dist': "dropzone/css" }
}
@@ -185,7 +183,6 @@
],
'LICENSE.md': [{ 'backbone.babysitter': 'backbone-babysitter' },
{ 'backbone.wreqr': 'backbone-wreqr' },
- { 'nvd3': 'nvd3/' },
{ 'lossless-json': 'lossless-json' }
],
'license.txt': [{ 'backbone.marionette': 'backbone-marionette' }],
diff --git a/dashboardv3/package-lock.json b/dashboardv3/package-lock.json
index 732f20d..f681b6d 100644
--- a/dashboardv3/package-lock.json
+++ b/dashboardv3/package-lock.json
@@ -792,11 +792,27 @@
"resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
"integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA=="
},
+ "d3-queue": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz",
+ "integrity": "sha1-yTouVLQXwJWRKdfXP2z31Ckudhg="
+ },
"d3-random": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz",
"integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ=="
},
+ "d3-request": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz",
+ "integrity": "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==",
+ "requires": {
+ "d3-collection": "1",
+ "d3-dispatch": "1",
+ "d3-dsv": "1",
+ "xmlhttprequest": "1"
+ }
+ },
"d3-scale": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz",
@@ -851,17 +867,251 @@
"integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
},
"d3-tip": {
- "version": "0.6.8",
- "resolved": "https://registry.npmjs.org/d3-tip/-/d3-tip-0.6.8.tgz",
- "integrity": "sha1-5bRJGuiYP95kbqSQCP9UKgM8Ciw=",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/d3-tip/-/d3-tip-0.7.1.tgz",
+ "integrity": "sha1-eMv1VPZ7cgpw47DxkeFM/+aM3Xk=",
"requires": {
- "d3": "^3.5.5"
+ "d3": "^4.2"
},
"dependencies": {
"d3": {
- "version": "3.5.17",
- "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz",
- "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g="
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/d3/-/d3-4.13.0.tgz",
+ "integrity": "sha512-l8c4+0SldjVKLaE2WG++EQlqD7mh/dmQjvi2L2lKPadAVC+TbJC4ci7Uk9bRi+To0+ansgsS0iWfPjD7DBy+FQ==",
+ "requires": {
+ "d3-array": "1.2.1",
+ "d3-axis": "1.0.8",
+ "d3-brush": "1.0.4",
+ "d3-chord": "1.0.4",
+ "d3-collection": "1.0.4",
+ "d3-color": "1.0.3",
+ "d3-dispatch": "1.0.3",
+ "d3-drag": "1.2.1",
+ "d3-dsv": "1.0.8",
+ "d3-ease": "1.0.3",
+ "d3-force": "1.1.0",
+ "d3-format": "1.2.2",
+ "d3-geo": "1.9.1",
+ "d3-hierarchy": "1.1.5",
+ "d3-interpolate": "1.1.6",
+ "d3-path": "1.0.5",
+ "d3-polygon": "1.0.3",
+ "d3-quadtree": "1.0.3",
+ "d3-queue": "3.0.7",
+ "d3-random": "1.1.0",
+ "d3-request": "1.0.6",
+ "d3-scale": "1.0.7",
+ "d3-selection": "1.3.0",
+ "d3-shape": "1.2.0",
+ "d3-time": "1.0.8",
+ "d3-time-format": "2.1.1",
+ "d3-timer": "1.0.7",
+ "d3-transition": "1.1.1",
+ "d3-voronoi": "1.1.2",
+ "d3-zoom": "1.7.1"
+ }
+ },
+ "d3-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz",
+ "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw=="
+ },
+ "d3-axis": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz",
+ "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo="
+ },
+ "d3-brush": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz",
+ "integrity": "sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=",
+ "requires": {
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "1",
+ "d3-transition": "1"
+ }
+ },
+ "d3-chord": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz",
+ "integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=",
+ "requires": {
+ "d3-array": "1",
+ "d3-path": "1"
+ }
+ },
+ "d3-collection": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz",
+ "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI="
+ },
+ "d3-color": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz",
+ "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs="
+ },
+ "d3-dispatch": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz",
+ "integrity": "sha1-RuFJHqqbWMNY/OW+TovtYm54cfg="
+ },
+ "d3-drag": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz",
+ "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==",
+ "requires": {
+ "d3-dispatch": "1",
+ "d3-selection": "1"
+ }
+ },
+ "d3-dsv": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz",
+ "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==",
+ "requires": {
+ "commander": "2",
+ "iconv-lite": "0.4",
+ "rw": "1"
+ }
+ },
+ "d3-ease": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz",
+ "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4="
+ },
+ "d3-force": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz",
+ "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==",
+ "requires": {
+ "d3-collection": "1",
+ "d3-dispatch": "1",
+ "d3-quadtree": "1",
+ "d3-timer": "1"
+ }
+ },
+ "d3-format": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz",
+ "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw=="
+ },
+ "d3-geo": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz",
+ "integrity": "sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==",
+ "requires": {
+ "d3-array": "1"
+ }
+ },
+ "d3-hierarchy": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz",
+ "integrity": "sha1-ochFxC+Eoga88cAcAQmOpN2qeiY="
+ },
+ "d3-interpolate": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz",
+ "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==",
+ "requires": {
+ "d3-color": "1"
+ }
+ },
+ "d3-path": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz",
+ "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q="
+ },
+ "d3-polygon": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz",
+ "integrity": "sha1-FoiOkCZGCTPysXllKtN4Ik04LGI="
+ },
+ "d3-quadtree": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz",
+ "integrity": "sha1-rHmH4+I/6AWpkPKOG1DTj8uCJDg="
+ },
+ "d3-random": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz",
+ "integrity": "sha1-ZkLlBsb6OmSFldKyRpeIqNElKdM="
+ },
+ "d3-scale": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz",
+ "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==",
+ "requires": {
+ "d3-array": "^1.2.0",
+ "d3-collection": "1",
+ "d3-color": "1",
+ "d3-format": "1",
+ "d3-interpolate": "1",
+ "d3-time": "1",
+ "d3-time-format": "2"
+ }
+ },
+ "d3-selection": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz",
+ "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA=="
+ },
+ "d3-shape": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz",
+ "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=",
+ "requires": {
+ "d3-path": "1"
+ }
+ },
+ "d3-time": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz",
+ "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ=="
+ },
+ "d3-time-format": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz",
+ "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==",
+ "requires": {
+ "d3-time": "1"
+ }
+ },
+ "d3-timer": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz",
+ "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA=="
+ },
+ "d3-transition": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz",
+ "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==",
+ "requires": {
+ "d3-color": "1",
+ "d3-dispatch": "1",
+ "d3-ease": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "^1.1.0",
+ "d3-timer": "1"
+ }
+ },
+ "d3-voronoi": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz",
+ "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw="
+ },
+ "d3-zoom": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz",
+ "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==",
+ "requires": {
+ "d3-dispatch": "1",
+ "d3-drag": "1",
+ "d3-interpolate": "1",
+ "d3-selection": "1",
+ "d3-transition": "1"
+ }
}
}
},
@@ -2449,11 +2699,6 @@
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true
},
- "nvd3": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/nvd3/-/nvd3-1.8.5.tgz",
- "integrity": "sha1-lKDJj/HDNmtyH6eocFs8bp6va7Y="
- },
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@@ -3586,6 +3831,11 @@
"integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=",
"dev": true
},
+ "xmlhttprequest": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+ "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
+ },
"y18n": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
diff --git a/dashboardv3/package.json b/dashboardv3/package.json
index 803280a..10ff43c 100644
--- a/dashboardv3/package.json
+++ b/dashboardv3/package.json
@@ -31,7 +31,7 @@
"bootstrap": "3.3.7",
"bootstrap-daterangepicker": "3.1.0",
"d3": "5.14.2",
- "d3-tip": "0.6.8",
+ "d3-tip": "^0.7.1",
"dagre-d3": "0.6.4",
"dropzone": "5.7.0",
"font-awesome": "4.7.0",
@@ -43,9 +43,9 @@
"jquery-steps": "1.1.0",
"jstree": "3.3.5",
"jstree-bootstrap-theme": "1.0.1",
+ "lossless-json": "1.0.4",
"moment": "2.21.0",
"moment-timezone": "0.5.14",
- "nvd3": "1.8.5",
"platform": "1.3.4",
"pnotify": "3.2.0",
"pretty-checkbox": "3.0.3",
@@ -53,8 +53,7 @@
"requirejs-text": "2.0.15",
"select2": "4.0.3",
"table-dragger": "1.0.2",
- "underscore": "1.8.3",
- "lossless-json": "1.0.4"
+ "underscore": "1.8.3"
},
"devDependencies": {
"grunt": "1.0.4",
diff --git a/dashboardv3/public/css/scss/graph.scss b/dashboardv3/public/css/scss/graph.scss
index 69d451b..ee774ce 100644
--- a/dashboardv3/public/css/scss/graph.scss
+++ b/dashboardv3/public/css/scss/graph.scss
@@ -311,4 +311,42 @@
padding-bottom: 15px;
}
}
+}
+
+.profile-bar {
+ fill: #38bb9b;
+ stroke: #38bb9b;
+ fill-opacity: 0.75;
+}
+
+.axislabel {
+ text-anchor: middle;
+ fill: #999;
+ font: 400 12px Arial, sans-serif;
+}
+
+.grid {
+
+ path,
+ line {
+ stroke: lightgrey;
+ stroke-opacity: 0.7;
+ shape-rendering: crispEdges;
+ }
+}
+
+.d3-tip {
+ table td {
+ padding: 2px 9px 2px 0;
+ vertical-align: middle;
+
+ &.value {
+ text-align: right;
+ font-weight: 700;
+ }
+
+ &.key {
+ font-weight: 400;
+ }
+ }
}
\ No newline at end of file
diff --git a/dashboardv3/public/index.html.tpl b/dashboardv3/public/index.html.tpl
index c0c43da..f849e4d 100644
--- a/dashboardv3/public/index.html.tpl
+++ b/dashboardv3/public/index.html.tpl
@@ -64,7 +64,6 @@
<link href="js/external_lib/pnotify/pnotify.custom.min.css?bust=<%- bust %>" rel="stylesheet" />
<link href="js/libs/jQueryQueryBuilder/css/query-builder.default.min.css?bust=<%- bust %>" rel="stylesheet" />
<link href="js/libs/bootstrap-daterangepicker/css/daterangepicker.css?bust=<%- bust %>" rel="stylesheet" />
- <link rel="stylesheet" href="js/libs/nvd3/css/nv.d3.min.css?bust=<%- bust %>" />
<link href="js/libs/dropzone/css/dropzone.css?bust=<%- bust %>" rel="stylesheet">
<link href="js/libs/jstree/css/default/default-theme.min.css?bust=<%- bust %>" rel="stylesheet" />
<link href="js/libs/pretty-checkbox/css/pretty-checkbox.min.css?bust=<%- bust %>" rel="stylesheet" />
diff --git a/dashboardv3/public/js/main.js b/dashboardv3/public/js/main.js
index a5f80dc..1c7bf8c 100644
--- a/dashboardv3/public/js/main.js
+++ b/dashboardv3/public/js/main.js
@@ -135,9 +135,6 @@
'deps': ['d3'],
'exports': ['dagreD3']
},
- 'nvd3': {
- 'deps': ['d3']
- },
'sparkline': {
'deps': ['jquery'],
'exports': ['sparkline']
@@ -188,7 +185,6 @@
'd3-tip': 'libs/d3/index',
'LineageHelper': 'external_lib/atlas-lineage/dist/index',
'dagreD3': 'libs/dagre-d3/dagre-d3.min',
- 'nvd3': 'libs/nvd3/nv.d3.min',
'sparkline': 'libs/sparkline/jquery.sparkline.min',
'tmpl': 'templates',
'requirejs.text': 'libs/requirejs-text/text',
diff --git a/dashboardv3/public/js/templates/profile/ProfileLayoutView_tmpl.html b/dashboardv3/public/js/templates/profile/ProfileLayoutView_tmpl.html
index b1fba11..96adc9b 100644
--- a/dashboardv3/public/js/templates/profile/ProfileLayoutView_tmpl.html
+++ b/dashboardv3/public/js/templates/profile/ProfileLayoutView_tmpl.html
@@ -16,7 +16,7 @@
-->
<div id="r_profileTableOrColumnLayoutView">
{{#if profileData}}
- <div class="fontLoader" style="display: block;">
+ <div class="fontLoader-relative show" style="display: block;">
<i class="fa fa-refresh fa-spin-custom"></i>
</div> {{else}} {{#ifCond typeName "==" "hive_db"}}
<h3>No Tables to Show!</h3> {{else}}
diff --git a/dashboardv3/public/js/views/graph/ProfileBarChart.js b/dashboardv3/public/js/views/graph/ProfileBarChart.js
new file mode 100644
index 0000000..d5a974d
--- /dev/null
+++ b/dashboardv3/public/js/views/graph/ProfileBarChart.js
@@ -0,0 +1,151 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define(["require", "d3", "d3-tip"], function(require, d3, d3Tip) {
+ "use strict";
+ var ProfileBarChart = {
+ render(options) {
+ var el = options.el,
+ type = options.data.key,
+ data = options.data.values,
+ formatValue = options.formatValue,
+ xAxisLabel = options.xAxisLabel,
+ yAxisLabel = options.yAxisLabel,
+ rotateXticks = options.rotateXticks,
+ onBarClick = options.onBarClick,
+ size = el.getBoundingClientRect(),
+ svg = d3.select(el),
+ margin = { top: 20, right: 30, bottom: 100, left: 80 },
+ width = size.width - margin.left - margin.right,
+ height = size.height - margin.top - margin.bottom;
+
+ // set the ranges
+ var x = d3.scaleBand().range([0, width]).padding(0.5);
+
+ var y = d3.scaleLinear().range([height, 0]);
+
+ var g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");
+
+ x.domain(
+ data.map(function(d) {
+ return d.value;
+ })
+ );
+ y.domain([
+ 0,
+ d3.max(data, function(d) {
+ return d.count;
+ })
+ ]);
+
+ // gridlines in x axis function
+ function make_x_gridlines() {
+ return d3.axisBottom(x).ticks(5);
+ }
+
+ // gridlines in y axis function
+ function make_y_gridlines() {
+ return d3.axisLeft(y).ticks(5);
+ }
+
+ // add the X gridlines
+ g.append("g")
+ .attr("class", "grid")
+ .attr("transform", "translate(0," + height + ")")
+ .call(make_x_gridlines().tickSize(-height).tickFormat(""));
+
+ // add the Y gridlines
+ g.append("g").attr("class", "grid").call(make_y_gridlines().tickSize(-width).tickFormat(""));
+
+ // add the x Axis
+ var xAxis = g
+ .append("g")
+ .attr("transform", "translate(0," + height + ")")
+ .call(d3.axisBottom(x));
+
+ if (rotateXticks) {
+ xAxis.selectAll("text").style("text-anchor", "end").attr("dx", "-.8em").attr("dy", ".15em").attr("transform", "rotate(-45)");
+ }
+
+ // add the y Axis
+ g.append("g").call(d3.axisLeft(y).ticks(3, "s"));
+
+ g.append("text")
+ .attr("transform", "translate(" + width / 2 + " ," + (margin.top - 25) + ")")
+ .attr("class", "axislabel")
+ .text(xAxisLabel);
+
+ // text label for the y axis
+ g.append("text")
+ .attr("transform", "rotate(-90)")
+ .attr("y", 0 - margin.left)
+ .attr("x", 0 - height / 2)
+ .attr("dy", "1em")
+ .attr("class", "axislabel")
+ .text(yAxisLabel);
+
+ var tooltip = d3Tip()
+ .attr("class", "d3-tip")
+ .offset([10, 0])
+ .html(function(d) {
+ console.log(d)
+ return '<table><thead><tr><td colspan="3"><strong class="x-value">' + d.value + '</strong></td></tr></thead><tbody><tr><td class="key">' + type + '</td><td class="value">' + d.count + '</td></tr></tbody></table>';
+ });
+
+ // append the rectangles for the bar chart
+ g.selectAll(".bar")
+ .data(data)
+ .enter()
+ .append("rect")
+ .attr("class", "profile-bar")
+ .attr("x", function(d) {
+ return x(d.value);
+ })
+ .attr("width", x.bandwidth())
+ .attr("y", d => { return height; })
+ .attr("height", 0)
+ .on("click", function(e) {
+ tooltip.hide();
+ if (onBarClick) {
+ onBarClick(e);
+ }
+ })
+ .on("mouseover", function(d) {
+ tooltip.show(d, this);
+ })
+ .on("mouseout", function(d) {
+ tooltip.hide();
+ })
+ .transition()
+ .duration(450)
+ .delay(function(d, i) {
+ return i * 50;
+ })
+ .attr("y", function(d) {
+ return y(d.count);
+ })
+ .attr("height", function(d) {
+ return height - y(d.count);
+ });
+
+ g.call(tooltip);
+
+ }
+ };
+ return ProfileBarChart;
+});
\ No newline at end of file
diff --git a/dashboardv3/public/js/views/profile/ProfileColumnLayoutView.js b/dashboardv3/public/js/views/profile/ProfileColumnLayoutView.js
index 74e19c0..215391d 100644
--- a/dashboardv3/public/js/views/profile/ProfileColumnLayoutView.js
+++ b/dashboardv3/public/js/views/profile/ProfileColumnLayoutView.js
@@ -16,23 +16,25 @@
* limitations under the License.
*/
-define(['require',
- 'backbone',
- 'hbs!tmpl/profile/ProfileColumnLayoutView_tmpl',
- 'collection/VProfileList',
- 'utils/Utils',
- 'utils/Messages',
- 'utils/Globals',
- 'moment',
- 'models/VEntity',
- 'nvd3'
-], function(require, Backbone, ProfileColumnLayoutViewTmpl, VProfileList, Utils, Messages, Globals, moment, VEntity) {
- 'use strict';
+define([
+ "require",
+ "backbone",
+ "hbs!tmpl/profile/ProfileColumnLayoutView_tmpl",
+ "views/graph/ProfileBarChart",
+ "collection/VProfileList",
+ "utils/Utils",
+ "utils/Messages",
+ "utils/Globals",
+ "moment",
+ "models/VEntity",
+ "d3"
+], function(require, Backbone, ProfileColumnLayoutViewTmpl, ProfileBarChart, VProfileList, Utils, Messages, Globals, moment, VEntity, d3) {
+ "use strict";
var ProfileColumnLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends ProfileColumnLayoutView */
{
- _viewName: 'ProfileColumnLayoutView',
+ _viewName: "ProfileColumnLayoutView",
template: ProfileColumnLayoutViewTmpl,
@@ -47,12 +49,12 @@
},
/** ui selector cache */
ui: {
- "backToYear": '[data-id="backToYear"]'
+ backToYear: '[data-id="backToYear"]'
},
/** ui events hash */
events: function() {
var events = {};
- events["click " + this.ui.backToYear] = 'backToYear';
+ events["click " + this.ui.backToYear] = "backToYear";
return events;
},
/**
@@ -60,39 +62,42 @@
* @constructs
*/
initialize: function(options) {
- _.extend(this, _.pick(options, 'profileData', 'guid', 'entityDetail'));
+ _.extend(this, _.pick(options, "profileData", "guid", "entityDetail"));
this.typeObject = Utils.getProfileTabType(this.profileData.attributes);
this.entityModel = new VEntity();
- this.formatValue = d3.format("2s")
-
+ this.formatValue = d3.format(".0s");
},
fetchEntity: function(argument) {
var that = this;
this.entityModel.getEntity(this.entityDetail.table.guid, {
success: function(data) {
var entity = data.entity,
- profileData = entity && entity.attributes && entity.attributes.profileData ? entity.attributes.profileData.attributes : null;
+ profileData =
+ entity && entity.attributes && entity.attributes.profileData ? entity.attributes.profileData.attributes : null;
if (profileData && profileData.rowCount) {
- that.$('.rowValue').show();
- that.$('.rowValue .graphval').html('<b>' + that.formatValue(profileData.rowCount).replace('G', 'B') + '</b>');
+ that.$(".rowValue").show();
+ that.$(".rowValue .graphval").html("<b>" + that.formatValue(profileData.rowCount).replace("G", "B") + "</b>");
}
if (entity.attributes) {
if (entity.guid) {
- that.$('.table_name .graphval').html('<b><a href="#!/detailPage/' + entity.guid + "?profile=true" + '">' + Utils.getName(entity) + '</a></b>');
+ that.$(".table_name .graphval").html(
+ '<b><a href="#!/detailPage/' + entity.guid + "?profile=true" + '">' + Utils.getName(entity) + "</a></b>"
+ );
}
- that.$('.table_created .graphval').html('<b>' + moment(entity.attributes.createTime).format("LL") + '</b>');
+ that.$(".table_created .graphval").html("<b>" + moment(entity.attributes.createTime).format("LL") + "</b>");
}
}
});
},
bindEvents: function() {},
onRender: function() {
- this.renderGraph();
this.fetchEntity();
if (this.typeObject && this.typeObject.type === "date") {
- this.$('svg').addClass('dateType');
+ this.$("svg").addClass("dateType");
}
-
+ },
+ onShow: function() {
+ this.renderGraph();
},
renderGraph: function(argument) {
if (!this.typeObject) {
@@ -100,106 +105,71 @@
}
var that = this,
profileData = this.profileData.attributes;
- this.data = [{
+ this.data = {
key: this.typeObject.label,
values: this.typeObject.actualObj || []
- }];
- nv.addGraph(function() {
- that.chart = nv.models.multiBarChart()
- .x(function(d) {
- return d.value || d.year
- }) //Specify the data accessors.
- .y(function(d) {
- return d.count
- })
- .height(220)
- .stacked(false)
- .showControls(false)
- .reduceXTicks(false)
- .staggerLabels(true)
- .duration(1000)
- .groupSpacing(0.6)
- .wrapLabels(true)
- .showLegend(false);
- if (that.typeObject.type !== "date") {
- that.chart.rotateLabels(-45);
- }
- that.chart.color(["#38BB9B"]);
-
- that.chart.yAxis.tickFormat(function(d) {
- return that.formatValue(d).replace('G', 'B');
- });
- that.chart.xAxis
- .axisLabel(that.typeObject.xAxisLabel)
- .axisLabelDistance(-185);
- that.chart.yAxis
- .axisLabel(that.typeObject.yAxisLabel)
- .axisLabelDistance(-5);
- that.chart.margin({
- right: 30,
- left: 80,
- top: 20,
- bottom: 60
- });
- if (that.typeObject.type === "date") {
- that.chart.multibar.dispatch.elementClick = function(e) {
- if (!that.monthsData) {
- that.createMonthData(e.data.monthlyCounts)
- }
- }
- }
- that.svg = d3.select(that.$('svg')[0]).datum(that.data)
- that.svg.transition().duration(0).call(that.chart);
-
- nv.utils.windowResize(that.chart.update);
-
- return that.chart;
- });
-
+ };
+ this.updateGraph(this.data);
},
backToYear: function() {
this.ui.backToYear.hide();
- this.$('.profileGraphDetail').show();
+ this.$(".profileGraphDetail").show();
this.monthsData = null;
this.updateGraph(this.data);
},
createMonthData: function(data) {
var monthsKey = {
- "1": "Jan",
- "2": "Feb",
- "3": "Mar",
- "4": "Apr",
- "5": "May",
- "6": "Jun",
- "7": "Jul",
- "8": "Aug",
- "9": "Sep",
- "10": "Oct",
- "11": "Nov",
- "12": "Dec"
+ 1: "Jan",
+ 2: "Feb",
+ 3: "Mar",
+ 4: "Apr",
+ 5: "May",
+ 6: "Jun",
+ 7: "Jul",
+ 8: "Aug",
+ 9: "Sep",
+ 10: "Oct",
+ 11: "Nov",
+ 12: "Dec"
},
i = 1;
- this.monthsData = [{
+ this.monthsData = {
key: this.typeObject.label,
values: []
- }];
+ };
while (i <= 12) {
- this.monthsData[0].values.push({
+ this.monthsData.values.push({
value: monthsKey[i],
count: data[i] || 0
});
i++;
}
this.ui.backToYear.show();
- this.$('.profileGraphDetail').hide();
+ this.$(".profileGraphDetail").hide();
this.updateGraph(this.monthsData);
-
},
updateGraph: function(data) {
- this.svg.datum(data).transition().duration(0).call(this.chart);
- },
- });
+ var that = this;
+ this.$("svg").empty();
+ ProfileBarChart.render({
+ el: this.$("svg")[0],
+ data: data,
+ xAxisLabel: this.typeObject.xAxisLabel,
+ yAxisLabel: this.typeObject.yAxisLabel,
+ formatValue: this.formatValue,
+ rotateXticks: this.typeObject.type !== "date",
+ onBarClick: function(e) {
+ if (that.typeObject.type === "date") {
+ if (!that.monthsData) {
+ that.createMonthData(e.monthlyCounts);
+ }
+ }
+ }
+ });
+ }
+ }
+ );
return ProfileColumnLayoutView;
});
\ No newline at end of file
diff --git a/dashboardv3/public/js/views/profile/ProfileTableLayoutView.js b/dashboardv3/public/js/views/profile/ProfileTableLayoutView.js
index ada7e62..54dabe2 100644
--- a/dashboardv3/public/js/views/profile/ProfileTableLayoutView.js
+++ b/dashboardv3/public/js/views/profile/ProfileTableLayoutView.js
@@ -24,10 +24,12 @@
'utils/Messages',
'utils/Globals',
'moment',
+ 'utils/UrlLinks',
'collection/VCommonList',
- 'models/VEntity',
+ 'collection/VEntityList',
+ 'd3',
'sparkline'
-], function(require, Backbone, ProfileTableLayoutViewTmpl, VProfileList, Utils, Messages, Globals, moment, VCommonList, VEntity, sparkline) {
+], function(require, Backbone, ProfileTableLayoutViewTmpl, VProfileList, Utils, Messages, Globals, moment, UrlLinks, VCommonList, VEntityList, d3, sparkline) {
'use strict';
var ProfileTableLayoutView = Backbone.Marionette.LayoutView.extend(
@@ -57,67 +59,86 @@
initialize: function(options) {
_.extend(this, _.pick(options, 'profileData', 'guid', 'entityDetail'));
var that = this;
- this.entityModel = new VEntity();
this.profileCollection = new VCommonList([], {
comparator: function(item) {
return item.get('position') || 999;
}
});
- _.each(this.entityDetail.columns, function(obj) {
- if (obj.attributes.profileData !== null) {
- var profileObj = Utils.getProfileTabType(obj.attributes.profileData.attributes, true);
- var changeValueObj = {}
- if (profileObj && profileObj.type) {
- if (profileObj.type === "numeric") {
- changeValueObj['averageLength'] = 0;
- changeValueObj['maxLength'] = 0;
- }
- if (profileObj.type === "string") {
- changeValueObj['minValue'] = 0;
- changeValueObj['maxValue'] = 0;
- changeValueObj['meanValue'] = 0;
- changeValueObj['medianValue'] = 0;
- }
- if (profileObj.type === "date") {
- changeValueObj['averageLength'] = 0;
- changeValueObj['maxLength'] = 0;
- changeValueObj['minValue'] = 0;
- changeValueObj['maxValue'] = 0;
- changeValueObj['meanValue'] = 0;
- changeValueObj['medianValue'] = 0;
- }
- }
- that.profileCollection.fullCollection.add(_.extend({}, obj.attributes, obj.attributes.profileData.attributes, changeValueObj, { guid: obj.guid, position: obj.attributes ? obj.attributes.position : null }));
- }
- });
this.bindEvents();
},
onRender: function() {
this.fetchEntity();
- this.renderTableLayoutView();
- if (this.entityDetail) {
- if (this.guid && this.entityDetail.name) {
- this.$('.table_name .graphval').html('<b><a href="#!/detailPage/' + this.guid + '">' + this.entityDetail.name + '</a></b>');
- }
- var profileData = this.entityDetail.profileData;
- if (profileData && profileData.attributes && profileData.attributes.rowCount) {
- this.$('.rowValue .graphval').html('<b>' + d3.format("2s")(profileData.attributes.rowCount).replace('G', 'B') + '</b>');
- }
- this.$('.table_created .graphval').html('<b>' + (this.entityDetail.createTime ? moment(this.entityDetail.createTime).format("LL") : "--") + '</b>');
- }
},
fetchEntity: function(argument) {
var that = this;
- this.entityModel.getEntity(this.entityDetail.db.guid, {
- success: function(data) {
- var entity = data.entity;
- if (entity.attributes) {
- if (entity.guid) {
- that.$('.db_name .graphval').html('<b><a href="#!/detailPage/' + entity.guid + "?profile=true" + '">' + Utils.getName(entity) + '</a></b>');
+ this.collection = new VEntityList([], {});
+ this.collection.url = UrlLinks.entitiesApiUrl({ guid: this.guid, minExtInfo: false });
+ this.collection.fetch({
+ success: function(response) {
+ that.entityObject = that.collection.first().toJSON();
+
+ var collectionJSON = that.entityObject.entity;
+ that.entityDetail = collectionJSON.attributes;
+
+ Utils.findAndMergeRefEntity({
+ attributeObject: collectionJSON.attributes,
+ referredEntities: that.entityObject.referredEntities
+ });
+
+ Utils.findAndMergeRefEntity({
+ attributeObject: collectionJSON.relationshipAttributes,
+ referredEntities: that.entityObject.referredEntities
+ });
+
+ var columns = collectionJSON.relationshipAttributes.columns || collectionJSON.attributes.columns,
+ db = collectionJSON.relationshipAttributes.db || collectionJSON.attributes.db
+
+ that.renderTableLayoutView();
+ if (that.entityDetail) {
+ if (that.guid && that.entityDetail.name) {
+ that.$('.table_name .graphval').html('<b><a href="#!/detailPage/' + that.guid + '">' + that.entityDetail.name + '</a></b>');
}
+ if (db) {
+ that.$('.db_name .graphval').html('<b><a href="#!/detailPage/' + db.guid + "?profile=true" + '">' + Utils.getName(db) + '</a></b>');
+ }
+ var profileData = that.entityDetail.profileData;
+ if (profileData && profileData.attributes && profileData.attributes.rowCount) {
+ that.$('.rowValue .graphval').html('<b>' + d3.format("2s")(profileData.attributes.rowCount).replace('G', 'B') + '</b>');
+ }
+ that.$('.table_created .graphval').html('<b>' + (that.entityDetail.createTime ? moment(that.entityDetail.createTime).format("LL") : "--") + '</b>');
}
- }
+
+ _.each(columns, function(obj) {
+ if (obj.attributes && obj.attributes.profileData) {
+ var profileObj = Utils.getProfileTabType(obj.attributes.profileData.attributes, true);
+ var changeValueObj = {}
+ if (profileObj && profileObj.type) {
+ if (profileObj.type === "numeric") {
+ changeValueObj['averageLength'] = 0;
+ changeValueObj['maxLength'] = 0;
+ }
+ if (profileObj.type === "string") {
+ changeValueObj['minValue'] = 0;
+ changeValueObj['maxValue'] = 0;
+ changeValueObj['meanValue'] = 0;
+ changeValueObj['medianValue'] = 0;
+ }
+ if (profileObj.type === "date") {
+ changeValueObj['averageLength'] = 0;
+ changeValueObj['maxLength'] = 0;
+ changeValueObj['minValue'] = 0;
+ changeValueObj['maxValue'] = 0;
+ changeValueObj['meanValue'] = 0;
+ changeValueObj['medianValue'] = 0;
+ }
+ }
+
+ that.profileCollection.fullCollection.add(_.extend({}, obj.attributes, obj.attributes.profileData.attributes, changeValueObj, { guid: obj.guid, position: obj.attributes ? obj.attributes.position : null }));
+ }
+ });
+ },
+ reset: false
});
},
bindEvents: function() {