This is an automated email from the ASF dual-hosted git repository.

nixon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git

commit a78e208ddaf249134a6e3ab0df14cb9f609b40c2
Author: kevalbhatt <kbh...@apache.org>
AuthorDate: Tue Mar 17 17:48:09 2020 +0530

    ATLAS-3669 : UI: Import Glossary Terms CSV into a Glossary
    
    Signed-off-by: nixonrodrigues <ni...@apache.org>
---
 dashboardv2/gruntfile.js                           |   6 +-
 dashboardv2/package-lock.json                      | 510 ++++++++++++---------
 dashboardv2/package.json                           |   1 +
 dashboardv2/public/css/scss/theme.scss             |  22 +
 dashboardv2/public/index.html.tpl                  |   1 +
 dashboardv2/public/js/main.js                      |   3 +-
 .../glossary/GlossaryLayoutView_tmpl.html          |  12 +-
 .../glossary/ImportGlossaryLayoutView_tmpl.html    |  17 +
 dashboardv2/public/js/utils/UrlLinks.js            |   6 +
 .../public/js/views/glossary/GlossaryLayoutView.js |  20 +-
 .../js/views/glossary/ImportGlossaryLayoutView.js  | 128 ++++++
 dashboardv3/gruntfile.js                           |   6 +-
 dashboardv3/package-lock.json                      | 498 +++++++++++---------
 dashboardv3/package.json                           |   1 +
 dashboardv3/public/css/scss/leftsidebar.scss       |  12 +
 dashboardv3/public/css/scss/theme.scss             |  22 +
 dashboardv3/public/index.html.tpl                  |   1 +
 dashboardv3/public/js/main.js                      |   5 +-
 .../glossary/ImportGlossaryLayoutView_tmpl.html    |  17 +
 .../search/tree/GlossaryTreeLayoutView_tmpl.html   |  14 +-
 dashboardv3/public/js/utils/UrlLinks.js            |   6 +
 .../js/views/glossary/ImportGlossaryLayoutView.js  | 128 ++++++
 .../js/views/search/tree/GlossaryTreeLayoutView.js |  30 +-
 23 files changed, 1021 insertions(+), 445 deletions(-)

diff --git a/dashboardv2/gruntfile.js b/dashboardv2/gruntfile.js
index fef4e08..efb1475 100644
--- a/dashboardv2/gruntfile.js
+++ b/dashboardv2/gruntfile.js
@@ -109,7 +109,8 @@ module.exports = function(grunt) {
                     'jquery.sparkline.min.js': { 'jquery-sparkline': 
'sparkline' },
                     'table-dragger.js': { 'table-dragger/dist': 
'table-dragger' },
                     'jstree.min.js': { 'jstree/dist': 'jstree' },
-                    'jquery.steps.min.js': { 'jquery-steps/build': 
'jquery-steps' }
+                    'jquery.steps.min.js': { 'jquery-steps/build': 
'jquery-steps' },
+                    'dropzone-amd-module.js': { 'dropzone/dist': "dropzone/js" 
}
                 }
 
             },
@@ -147,7 +148,8 @@ module.exports = function(grunt) {
                     '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' }
+                    'pretty-checkbox.min.css': { 'pretty-checkbox/dist': 
'pretty-checkbox/css' },
+                    'dropzone.css': { 'dropzone/dist': "dropzone/css" }
                 }
 
             },
diff --git a/dashboardv2/package-lock.json b/dashboardv2/package-lock.json
index 7f25b57..32f9549 100644
--- a/dashboardv2/package-lock.json
+++ b/dashboardv2/package-lock.json
@@ -20,9 +20,9 @@
       }
     },
     "ajv": {
-      "version": "6.11.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz";,
-      "integrity": 
"sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==",
+      "version": "6.12.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz";,
+      "integrity": 
"sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
       "dev": true,
       "requires": {
         "fast-deep-equal": "^3.1.1",
@@ -60,10 +60,13 @@
       "dev": true
     },
     "ansi-styles": {
-      "version": "2.2.1",
-      "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-      "dev": true
+      "version": "3.2.1",
+      "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";,
+      "integrity": 
"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
     },
     "aproba": {
       "version": "1.2.0",
@@ -436,16 +439,14 @@
       }
     },
     "chalk": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
-      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz";,
+      "integrity": 
"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
       "dev": true,
       "requires": {
-        "ansi-styles": "^2.2.1",
-        "escape-string-regexp": "^1.0.2",
-        "has-ansi": "^2.0.0",
-        "strip-ansi": "^3.0.0",
-        "supports-color": "^2.0.0"
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
       }
     },
     "clean-css": {
@@ -577,9 +578,9 @@
       }
     },
     "core-js": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz";,
-      "integrity": 
"sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A=="
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz";,
+      "integrity": 
"sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
     },
     "core-util-is": {
       "version": "1.0.2",
@@ -639,13 +640,6 @@
       "requires": {
         "graphlib": "^1.0.5",
         "lodash": "^3.10.0"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "3.10.1",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz";,
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
-        }
       }
     },
     "dagre-d3": {
@@ -657,13 +651,6 @@
         "dagre": "^0.7.3",
         "graphlib": "^1.0.5",
         "lodash": "^3.10.0"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "3.10.1",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz";,
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
-        }
       }
     },
     "dashdash": {
@@ -734,14 +721,14 @@
       "dev": true
     },
     "dot": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.2.tgz";,
-      "integrity": "sha1-xzdwGfxOVQeYkosrmv62ar+h8vk="
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.3.tgz";,
+      "integrity": 
"sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg=="
     },
     "dragula-with-animation": {
-      "version": "3.7.2",
-      "resolved": 
"https://registry.npmjs.org/dragula-with-animation/-/dragula-with-animation-3.7.2.tgz";,
-      "integrity": "sha1-m5ktsqJ0MkMlxwuwy3Uud+H6qK8=",
+      "version": "3.7.4",
+      "resolved": 
"https://registry.npmjs.org/dragula-with-animation/-/dragula-with-animation-3.7.4.tgz";,
+      "integrity": 
"sha512-Kdvld/s4ASLRgP5w8lzK64P+8XUX9ccNGn0rmXDCG9AuvyzUxvVo+HxLQoRMyRPCQWAZ3xzA7b3ghcFIz+QsIA==",
       "requires": {
         "contra": "1.9.4",
         "crossvent": "1.5.4"
@@ -762,6 +749,11 @@
         }
       }
     },
+    "dropzone": {
+      "version": "5.5.1",
+      "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-5.5.1.tgz";,
+      "integrity": 
"sha512-3VduRWLxx9hbVr42QieQN25mx/I61/mRdUSuxAmDGdDqZIN8qtP7tcKMa3KfpJjuGjOJGYYUzzeq6eGDnkzesA=="
+    },
     "ecc-jsbn": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";,
@@ -785,13 +777,12 @@
       "dev": true
     },
     "error": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz";,
-      "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
+      "version": "7.2.1",
+      "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz";,
+      "integrity": 
"sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==",
       "dev": true,
       "requires": {
-        "string-template": "~0.2.1",
-        "xtend": "~4.0.0"
+        "string-template": "~0.2.1"
       }
     },
     "error-ex": {
@@ -1056,20 +1047,20 @@
       }
     },
     "globule": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz";,
-      "integrity": 
"sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz";,
+      "integrity": 
"sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==",
       "dev": true,
       "requires": {
         "glob": "~7.1.1",
-        "lodash": "~4.17.10",
+        "lodash": "~4.17.12",
         "minimatch": "~3.0.2"
       },
       "dependencies": {
         "glob": {
-          "version": "7.1.4",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz";,
-          "integrity": 
"sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz";,
+          "integrity": 
"sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -1089,9 +1080,9 @@
       }
     },
     "graceful-fs": {
-      "version": "4.2.0",
-      "resolved": 
"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz";,
-      "integrity": 
"sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
+      "version": "4.2.3",
+      "resolved": 
"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz";,
+      "integrity": 
"sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
       "dev": true
     },
     "graceful-readlink": {
@@ -1106,13 +1097,6 @@
       "integrity": "sha1-DKst8P/mq+BwsmJb+h7bbslnuLE=",
       "requires": {
         "lodash": "^3.10.0"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "3.10.1",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz";,
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
-        }
       }
     },
     "grunt": {
@@ -1138,33 +1122,6 @@
         "nopt": "~3.0.6",
         "path-is-absolute": "~1.0.0",
         "rimraf": "~2.6.2"
-      },
-      "dependencies": {
-        "rimraf": {
-          "version": "2.6.3",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";,
-          "integrity": 
"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          },
-          "dependencies": {
-            "glob": {
-              "version": "7.1.4",
-              "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz";,
-              "integrity": 
"sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
-              "dev": true,
-              "requires": {
-                "fs.realpath": "^1.0.0",
-                "inflight": "^1.0.4",
-                "inherits": "2",
-                "minimatch": "^3.0.4",
-                "once": "^1.3.0",
-                "path-is-absolute": "^1.0.0"
-              }
-            }
-          }
-        }
       }
     },
     "grunt-cli": {
@@ -1195,31 +1152,6 @@
       "requires": {
         "async": "^1.5.2",
         "rimraf": "^2.5.1"
-      },
-      "dependencies": {
-        "glob": {
-          "version": "7.1.4",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz";,
-          "integrity": 
"sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.3",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";,
-          "integrity": 
"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
       }
     },
     "grunt-contrib-connect": {
@@ -1247,6 +1179,33 @@
       "requires": {
         "chalk": "^1.1.1",
         "file-sync-cmp": "^0.1.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
       }
     },
     "grunt-contrib-cssmin": {
@@ -1258,6 +1217,33 @@
         "chalk": "^1.0.0",
         "clean-css": "~4.0.3",
         "maxmin": "^1.1.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
       }
     },
     "grunt-contrib-htmlmin": {
@@ -1271,11 +1257,36 @@
         "pretty-bytes": "^4.0.2"
       },
       "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
         "pretty-bytes": {
           "version": "4.0.2",
           "resolved": 
"https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz";,
           "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
           "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
         }
       }
     },
@@ -1296,6 +1307,33 @@
         "object.assign": "^4.0.4",
         "uglify-js": "~2.7.0",
         "uri-path": "^1.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
       }
     },
     "grunt-contrib-watch": {
@@ -1318,6 +1356,12 @@
           "requires": {
             "lodash": "^4.17.14"
           }
+        },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
         }
       }
     },
@@ -1337,6 +1381,14 @@
         "grunt-legacy-log-utils": "~2.0.0",
         "hooker": "~0.2.3",
         "lodash": "~4.17.5"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        }
       }
     },
     "grunt-legacy-log-utils": {
@@ -1349,34 +1401,11 @@
         "lodash": "~4.17.10"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";,
-          "integrity": 
"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz";,
-          "integrity": 
"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";,
-          "integrity": 
"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
         }
       }
     },
@@ -1395,14 +1424,11 @@
         "which": "~1.3.0"
       },
       "dependencies": {
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz";,
-          "integrity": 
"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
         }
       }
     },
@@ -1466,9 +1492,9 @@
       "dev": true
     },
     "has-symbols": {
-      "version": "1.0.0",
-      "resolved": 
"https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz";,
-      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+      "version": "1.0.1",
+      "resolved": 
"https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz";,
+      "integrity": 
"sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
       "dev": true
     },
     "has-unicode": {
@@ -1490,9 +1516,9 @@
       "dev": true
     },
     "hosted-git-info": {
-      "version": "2.7.1",
-      "resolved": 
"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz";,
-      "integrity": 
"sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
+      "version": "2.8.8",
+      "resolved": 
"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz";,
+      "integrity": 
"sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
       "dev": true
     },
     "html-minifier": {
@@ -1564,9 +1590,9 @@
       }
     },
     "in-publish": {
-      "version": "2.0.0",
-      "resolved": 
"https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz";,
-      "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
+      "version": "2.0.1",
+      "resolved": 
"https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz";,
+      "integrity": 
"sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==",
       "dev": true
     },
     "indent-string": {
@@ -1613,13 +1639,10 @@
       "dev": true
     },
     "is-finite": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz";,
-      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
-      "dev": true,
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz";,
+      "integrity": 
"sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+      "dev": true
     },
     "is-fullwidth-code-point": {
       "version": "1.0.0",
@@ -1670,13 +1693,6 @@
         "jquery": ">=1.9.0",
         "jquery-extendext": ">=0.1.2",
         "moment": ">=2.6.0"
-      },
-      "dependencies": {
-        "bootstrap": {
-          "version": "4.3.1",
-          "resolved": 
"https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz";,
-          "integrity": 
"sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag=="
-        }
       }
     },
     "jquery": {
@@ -1693,9 +1709,9 @@
       }
     },
     "jquery-extendext": {
-      "version": "0.1.2",
-      "resolved": 
"https://registry.npmjs.org/jquery-extendext/-/jquery-extendext-0.1.2.tgz";,
-      "integrity": "sha1-1FtUi1EtF0oqcz16wkSLkEVscVY=",
+      "version": "1.0.0",
+      "resolved": 
"https://registry.npmjs.org/jquery-extendext/-/jquery-extendext-1.0.0.tgz";,
+      "integrity": 
"sha512-gDJjpQ8ISd4ZMwSn0yXSuyufsPMCeWtWJ8kmqE85VromJqyVT2sdkHzS5yL0w1GK81UpOzmr2f9JgFln2sbJSg==",
       "requires": {
         "jquery": ">=1.9.1"
       }
@@ -1836,10 +1852,9 @@
       }
     },
     "lodash": {
-      "version": "4.17.15",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
-      "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
-      "dev": true
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz";,
+      "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
     },
     "longest": {
       "version": "1.0.1",
@@ -1894,6 +1909,33 @@
         "figures": "^1.0.1",
         "gzip-size": "^1.0.0",
         "pretty-bytes": "^1.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
       }
     },
     "meow": {
@@ -1921,18 +1963,18 @@
       "dev": true
     },
     "mime-db": {
-      "version": "1.40.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz";,
-      "integrity": 
"sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
+      "version": "1.43.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz";,
+      "integrity": 
"sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
       "dev": true
     },
     "mime-types": {
-      "version": "2.1.24",
-      "resolved": 
"https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz";,
-      "integrity": 
"sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+      "version": "2.1.26",
+      "resolved": 
"https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz";,
+      "integrity": 
"sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
       "dev": true,
       "requires": {
-        "mime-db": "1.40.0"
+        "mime-db": "1.43.0"
       }
     },
     "minimatch": {
@@ -1945,9 +1987,9 @@
       }
     },
     "minimist": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz";,
-      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";,
+      "integrity": 
"sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
       "dev": true
     },
     "mkdirp": {
@@ -2092,6 +2134,39 @@
         "sass-graph": "^2.2.4",
         "stdout-stream": "^1.4.0",
         "true-case-path": "^1.0.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
       }
     },
     "nopt": {
@@ -2393,9 +2468,9 @@
       "dev": true
     },
     "qs": {
-      "version": "6.8.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.8.0.tgz";,
-      "integrity": 
"sha512-tPSkj8y92PfZVbinY1n84i1Qdx75lZjMQYx9WZhnkofyxzw2r7Ho39G3/aEvSUdebxpnnM4LZJCtvE/Aq3+s9w==",
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz";,
+      "integrity": 
"sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==",
       "dev": true
     },
     "range-parser": {
@@ -2444,9 +2519,9 @@
       }
     },
     "readable-stream": {
-      "version": "2.3.6",
-      "resolved": 
"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz";,
-      "integrity": 
"sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "version": "2.3.7",
+      "resolved": 
"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz";,
+      "integrity": 
"sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
       "dev": true,
       "requires": {
         "core-util-is": "~1.0.0",
@@ -2553,9 +2628,9 @@
       "integrity": "sha1-ExOHM2E/xEV7fhJH6Mt1HfeqVCk="
     },
     "resolve": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz";,
-      "integrity": 
"sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
+      "version": "1.15.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz";,
+      "integrity": 
"sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
       "dev": true,
       "requires": {
         "path-parse": "^1.0.6"
@@ -2586,9 +2661,9 @@
       }
     },
     "rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz";,
-      "integrity": 
"sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";,
+      "integrity": 
"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
       "dev": true,
       "requires": {
         "glob": "^7.1.3"
@@ -2662,6 +2737,12 @@
             "wrap-ansi": "^2.0.0"
           }
         },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
         "yargs": {
           "version": "7.1.0",
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz";,
@@ -2716,9 +2797,9 @@
       }
     },
     "semver": {
-      "version": "5.7.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz";,
-      "integrity": 
"sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz";,
+      "integrity": 
"sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
       "dev": true
     },
     "send": {
@@ -2847,9 +2928,9 @@
       }
     },
     "spdx-license-ids": {
-      "version": "3.0.4",
-      "resolved": 
"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz";,
-      "integrity": 
"sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==",
+      "version": "3.0.5",
+      "resolved": 
"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz";,
+      "integrity": 
"sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
       "dev": true
     },
     "sprintf-js": {
@@ -2944,10 +3025,13 @@
       }
     },
     "supports-color": {
-      "version": "2.0.0",
-      "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-      "dev": true
+      "version": "5.5.0",
+      "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";,
+      "integrity": 
"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
     },
     "table-dragger": {
       "version": "1.0.2",
@@ -3257,12 +3341,6 @@
       "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=",
       "dev": true
     },
-    "xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz";,
-      "integrity": 
"sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "dev": true
-    },
     "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 e90040e..be5902d 100644
--- a/dashboardv2/package.json
+++ b/dashboardv2/package.json
@@ -33,6 +33,7 @@
     "d3": "3.5.17",
     "d3-tip": "0.6.8",
     "dagre-d3": "0.4.17",
+    "dropzone": "5.5.1",
     "font-awesome": "4.7.0",
     "jQuery-QueryBuilder": "2.4.3",
     "jquery": "3.3.1",
diff --git a/dashboardv2/public/css/scss/theme.scss 
b/dashboardv2/public/css/scss/theme.scss
index aad0dfa..0b4f835 100644
--- a/dashboardv2/public/css/scss/theme.scss
+++ b/dashboardv2/public/css/scss/theme.scss
@@ -608,4 +608,26 @@ td.searchTableName:hover {
         z-index: 1;
         left: calc(50% - 8px);
     }
+}
+
+.dropzone {
+    border-radius: 10px;
+    border: 2px dashed $color_havelock_blue_approx;
+
+    .dz-default.dz-message {
+        font-weight: 500;
+        font-size: 20px;
+    }
+
+    &.single-file-center {
+        .dz-file-preview {
+            margin-left: calc(50% - 68px);
+        }
+    }
+}
+
+.dropzone-modal {
+    .modal-body {
+        background: $color_white_lilac_approx;
+    }
 }
\ No newline at end of file
diff --git a/dashboardv2/public/index.html.tpl 
b/dashboardv2/public/index.html.tpl
index 7cd86bd..5335d39 100644
--- a/dashboardv2/public/index.html.tpl
+++ b/dashboardv2/public/index.html.tpl
@@ -56,6 +56,7 @@
     <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">
     <link href="js/libs/jstree/css/default/default-theme.min.css?bust=<%- bust 
%>" rel="stylesheet">
     <link href="css/style.css?bust=<%- bust %>" rel="stylesheet">
 </head>
diff --git a/dashboardv2/public/js/main.js b/dashboardv2/public/js/main.js
index 41af465..0fd5f80 100644
--- a/dashboardv2/public/js/main.js
+++ b/dashboardv2/public/js/main.js
@@ -175,7 +175,8 @@ require.config({
         'sparkline': 'libs/sparkline/jquery.sparkline.min',
         'table-dragger': 'libs/table-dragger/table-dragger',
         'jstree': 'libs/jstree/jstree.min',
-        'jquery-steps': 'libs/jquery-steps/jquery.steps.min'
+        'jquery-steps': 'libs/jquery-steps/jquery.steps.min',
+        'dropzone': 'libs/dropzone/js/dropzone-amd-module'
     },
 
     /**
diff --git 
a/dashboardv2/public/js/templates/glossary/GlossaryLayoutView_tmpl.html 
b/dashboardv2/public/js/templates/glossary/GlossaryLayoutView_tmpl.html
index 1fa1e35..dea4fcc 100644
--- a/dashboardv2/public/js/templates/glossary/GlossaryLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/glossary/GlossaryLayoutView_tmpl.html
@@ -17,7 +17,7 @@
 <div class="col-sm-12 {{#unless isAssignView}}add-seperator{{/unless}}">
     <div class="row">
         {{#unless isAssignView}}
-        <div class="col-sm-8 no-padding" style="margin-top: 5px;">
+        <div class="col-sm-7 no-padding" style="margin-top: 5px;">
             <span class="pull-left">Terms</span>
             <label class="switch pull-left">
                 <input type="checkbox" class="switch-input" 
name="glossaryView" value="text" />
@@ -25,9 +25,17 @@
             </label>
             <span class="pull-left">Category</span>
         </div>
-        <div class="{{#if isAssignView}}col-sm-2{{else}}col-sm-4{{/if}} 
no-padding-right">
+        <div class="{{#if isAssignView}}col-sm-2{{else}}col-sm-5{{/if}} 
no-padding-right">
             <button type="button" class="btn btn-action btn-md pull-right" 
title="Refresh" data-id="refreshGlossary" onclick="this.blur();" 
type="button"><i class="fa fa-refresh"></i></button>
             <button type="button" class="btn btn-action btn-md pull-right" 
data-id="createGlossary" type="button"><i class="fa fa-plus"></i></button>
+            <div class="dropdown pull-right">
+                <button type="button" data-toggle="dropdown" class="btn 
btn-action btn-md dropdown-toggle" type="button"><i class="fa 
fa-paperclip"></i></button>
+                <ul class="dropdown-menu">
+                    <li><a href="{{importTmplUrl}}">Download Import 
template</a></li>
+                    <li><a href="javascript:void(0)" 
data-id="importGlossary">Import Glossary</a></li>
+                </ul>
+            </div>
+            <!--  -->
             {{/unless}}
         </div>
     </div>
diff --git 
a/dashboardv2/public/js/templates/glossary/ImportGlossaryLayoutView_tmpl.html 
b/dashboardv2/public/js/templates/glossary/ImportGlossaryLayoutView_tmpl.html
new file mode 100644
index 0000000..abf11b7
--- /dev/null
+++ 
b/dashboardv2/public/js/templates/glossary/ImportGlossaryLayoutView_tmpl.html
@@ -0,0 +1,17 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+<form action={{importUrl}} id="importGlossary" class="dropzone 
single-file-center"></form>
\ No newline at end of file
diff --git a/dashboardv2/public/js/utils/UrlLinks.js 
b/dashboardv2/public/js/utils/UrlLinks.js
index 6c67e8c..56a4a47 100644
--- a/dashboardv2/public/js/utils/UrlLinks.js
+++ b/dashboardv2/public/js/utils/UrlLinks.js
@@ -185,6 +185,12 @@ define(['require', 'utils/Enums', 'utils/Utils', 
'underscore'], function(require
                 return glossaryUrl;
             }
         },
+        glossaryImportTempUrl: function() {
+            return this.glossaryApiUrl() + '/import/template';
+        },
+        glossaryImportUrl: function() {
+            return this.glossaryApiUrl() + '/import';
+        },
         categoryApiUrl: function(options) {
             var guid = options && options.guid,
                 list = options && options.list,
diff --git a/dashboardv2/public/js/views/glossary/GlossaryLayoutView.js 
b/dashboardv2/public/js/views/glossary/GlossaryLayoutView.js
index 9b386f3..76e6476 100644
--- a/dashboardv2/public/js/views/glossary/GlossaryLayoutView.js
+++ b/dashboardv2/public/js/views/glossary/GlossaryLayoutView.js
@@ -22,9 +22,10 @@ define(['require',
     'utils/Utils',
     'utils/Messages',
     'utils/Globals',
+    'utils/UrlLinks',
     'utils/CommonViewFunction',
     'jstree'
-], function(require, Backbone, GlossaryLayoutViewTmpl, Utils, Messages, 
Globals, CommonViewFunction) {
+], function(require, Backbone, GlossaryLayoutViewTmpl, Utils, Messages, 
Globals, UrlLinks, CommonViewFunction) {
     'use strict';
 
     var GlossaryLayoutView = Backbone.Marionette.LayoutView.extend(
@@ -39,6 +40,7 @@ define(['require',
             templateHelpers: function() {
                 return {
                     isAssignView: this.isAssignView,
+                    importTmplUrl: UrlLinks.glossaryImportTempUrl(),
                     isAssignAttributeRelationView: 
this.isAssignAttributeRelationView
                 };
             },
@@ -51,7 +53,8 @@ define(['require',
                 searchCategory: "[data-id='searchCategory']",
                 glossaryView: 'input[name="glossaryView"]',
                 termTree: "[data-id='termTree']",
-                categoryTree: "[data-id='categoryTree']"
+                categoryTree: "[data-id='categoryTree']",
+                importGlossary: "[data-id='importGlossary']"
             },
             /** ui events hash */
             events: function() {
@@ -75,6 +78,7 @@ define(['require',
                     })
                 };
                 events["click " + this.ui.refreshGlossary] = 'getGlossary';
+                events["click " + this.ui.importGlossary] = 
'onClickImportGlossary';
                 events["keyup " + this.ui.searchTerm] = function() {
                     this.ui.termTree.jstree("search", 
this.ui.searchTerm.val());
                 };
@@ -740,6 +744,18 @@ define(['require',
                         updateTabState: true
                     });
                 }
+            },
+            onClickImportGlossary: function() {
+                var that = this;
+                require([
+                    'views/glossary/ImportGlossaryLayoutView'
+                ], function(ImportGlossaryLayoutView) {
+                    var view = new ImportGlossaryLayoutView({
+                        callback: function() {
+                            that.getGlossary();
+                        }
+                    });
+                });
             }
         });
     return GlossaryLayoutView;
diff --git a/dashboardv2/public/js/views/glossary/ImportGlossaryLayoutView.js 
b/dashboardv2/public/js/views/glossary/ImportGlossaryLayoutView.js
new file mode 100644
index 0000000..23b0ef7
--- /dev/null
+++ b/dashboardv2/public/js/views/glossary/ImportGlossaryLayoutView.js
@@ -0,0 +1,128 @@
+/**
+ * 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",
+    "backbone",
+    "hbs!tmpl/glossary/ImportGlossaryLayoutView_tmpl",
+    "modules/Modal",
+    'utils/CommonViewFunction',
+    "utils/Utils",
+    "utils/UrlLinks",
+    "dropzone"
+], function(require, Backbone, ImportGlossaryLayoutViewTmpl, Modal, 
CommonViewFunction, Utils, UrlLinks, dropzone) {
+    var ImportGlossaryLayoutView = Backbone.Marionette.LayoutView.extend(
+        /** @lends ImportGlossaryLayoutView */
+        {
+            _viewName: "ImportGlossaryLayoutView",
+
+            template: ImportGlossaryLayoutViewTmpl,
+
+            templateHelpers: function() {
+                return {
+                    importUrl: UrlLinks.glossaryImportUrl()
+                };
+            },
+
+            /** Layout sub regions */
+            regions: {},
+
+            /** ui selector cache */
+            ui: {},
+            /** ui events hash */
+            events: function() {
+                var events = {};
+                return events;
+            },
+            /**
+             * intialize a new ImportGlossaryLayoutView Layout
+             * @constructs
+             */
+            initialize: function(options) {
+                _.extend(this, _.pick(options, "callback"));
+                var that = this;
+                this.modal = new Modal({
+                    title: "Import Glossary",
+                    content: this,
+                    cancelText: "Cancel",
+                    okText: "upload",
+                    allowCancel: true,
+                    okCloses: false,
+                    mainClass: "dropzone-modal"
+                }).open();
+                this.modal.$el.find("button.ok").attr("disabled", true);
+                this.modal.on("ok", function(e) {
+                    that.dropzone.processQueue();
+                });
+                this.modal.on("closeModal", function() {
+                    that.modal.trigger("cancel");
+                });
+            },
+            bindEvents: function() {},
+            onRender: function() {
+                var that = this;
+                this.dropzone = null;
+                var updateButton = function(files) {
+                    var buttonEl = that.modal.$el.find("button.ok");
+                    if (files.length === 0) {
+                        buttonEl.attr("disabled", true);
+                    } else {
+                        buttonEl.attr("disabled", false);
+                    }
+                }
+                var headers = {};
+                headers[CommonViewFunction.restCsrfCustomHeader] = '""';
+                this.$("#importGlossary").dropzone({
+                    url: UrlLinks.glossaryImportUrl(),
+                    clickable: true,
+                    acceptedFiles: ".csv,.xls,.xlsx",
+                    autoProcessQueue: false,
+                    maxFiles: 1,
+                    addRemoveLinks: true,
+                    init: function() {
+                        that.dropzone = this;
+                        this.on('addedfile', function(file) {
+                            updateButton(this.files);
+                        })
+                        this.on('removedfile', function(file) {
+                            updateButton(this.files);
+                        })
+                    },
+                    maxfilesexceeded: function(file) {
+                        this.removeAllFiles();
+                        this.addFile(file);
+                    },
+                    success: function(file, response) {
+                        that.modal.trigger("cancel");
+                        Utils.notifySuccess({
+                            content: "File: " + file.name + " added 
successfully"
+                        });
+                        that.callback();
+                    },
+                    error: function(file, response, responseObj) {
+                        Utils.defaultErrorHandler(null, responseObj, { 
defaultErrorMessage: (response.errorMessage) || response });
+                        that.modal.$el.find("button.ok").attr("disabled", 
false);
+                    },
+                    dictDefaultMessage: "Drop files here or click to upload.",
+                    headers: headers
+                });
+            }
+        }
+    );
+    return ImportGlossaryLayoutView;
+});
\ No newline at end of file
diff --git a/dashboardv3/gruntfile.js b/dashboardv3/gruntfile.js
index f55ff0d..6993188 100644
--- a/dashboardv3/gruntfile.js
+++ b/dashboardv3/gruntfile.js
@@ -109,7 +109,8 @@ module.exports = function(grunt) {
                     'jquery.sparkline.min.js': { 'jquery-sparkline': 
'sparkline' },
                     'table-dragger.js': { 'table-dragger/dist': 
'table-dragger' },
                     'jstree.min.js': { 'jstree/dist': 'jstree' },
-                    'jquery.steps.min.js': { 'jquery-steps/build': 
'jquery-steps' }
+                    'jquery.steps.min.js': { 'jquery-steps/build': 
'jquery-steps' },
+                    'dropzone-amd-module.js': { 'dropzone/dist': "dropzone/js" 
}
                 }
 
             },
@@ -153,7 +154,8 @@ module.exports = function(grunt) {
                     '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' }
+                    'pretty-checkbox.min.css': { 'pretty-checkbox/dist': 
'pretty-checkbox/css' },
+                    'dropzone.css': { 'dropzone/dist': "dropzone/css" }
                 }
 
             },
diff --git a/dashboardv3/package-lock.json b/dashboardv3/package-lock.json
index 3918ecc..7ec8506 100644
--- a/dashboardv3/package-lock.json
+++ b/dashboardv3/package-lock.json
@@ -20,9 +20,9 @@
       }
     },
     "ajv": {
-      "version": "6.11.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz";,
-      "integrity": 
"sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==",
+      "version": "6.12.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz";,
+      "integrity": 
"sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
       "dev": true,
       "requires": {
         "fast-deep-equal": "^3.1.1",
@@ -60,10 +60,13 @@
       "dev": true
     },
     "ansi-styles": {
-      "version": "2.2.1",
-      "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-      "dev": true
+      "version": "3.2.1",
+      "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";,
+      "integrity": 
"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
     },
     "aproba": {
       "version": "1.2.0",
@@ -436,16 +439,14 @@
       }
     },
     "chalk": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
-      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz";,
+      "integrity": 
"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
       "dev": true,
       "requires": {
-        "ansi-styles": "^2.2.1",
-        "escape-string-regexp": "^1.0.2",
-        "has-ansi": "^2.0.0",
-        "strip-ansi": "^3.0.0",
-        "supports-color": "^2.0.0"
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
       }
     },
     "clean-css": {
@@ -577,9 +578,9 @@
       }
     },
     "core-js": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz";,
-      "integrity": 
"sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A=="
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz";,
+      "integrity": 
"sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
     },
     "core-util-is": {
       "version": "1.0.2",
@@ -639,13 +640,6 @@
       "requires": {
         "graphlib": "^1.0.5",
         "lodash": "^3.10.0"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "3.10.1",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz";,
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
-        }
       }
     },
     "dagre-d3": {
@@ -657,13 +651,6 @@
         "dagre": "^0.7.3",
         "graphlib": "^1.0.5",
         "lodash": "^3.10.0"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "3.10.1",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz";,
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
-        }
       }
     },
     "dashdash": {
@@ -734,14 +721,14 @@
       "dev": true
     },
     "dot": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.2.tgz";,
-      "integrity": "sha1-xzdwGfxOVQeYkosrmv62ar+h8vk="
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.3.tgz";,
+      "integrity": 
"sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg=="
     },
     "dragula-with-animation": {
-      "version": "3.7.2",
-      "resolved": 
"https://registry.npmjs.org/dragula-with-animation/-/dragula-with-animation-3.7.2.tgz";,
-      "integrity": "sha1-m5ktsqJ0MkMlxwuwy3Uud+H6qK8=",
+      "version": "3.7.4",
+      "resolved": 
"https://registry.npmjs.org/dragula-with-animation/-/dragula-with-animation-3.7.4.tgz";,
+      "integrity": 
"sha512-Kdvld/s4ASLRgP5w8lzK64P+8XUX9ccNGn0rmXDCG9AuvyzUxvVo+HxLQoRMyRPCQWAZ3xzA7b3ghcFIz+QsIA==",
       "requires": {
         "contra": "1.9.4",
         "crossvent": "1.5.4"
@@ -762,6 +749,11 @@
         }
       }
     },
+    "dropzone": {
+      "version": "5.7.0",
+      "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-5.7.0.tgz";,
+      "integrity": 
"sha512-kOltiZXH5cO/72I22JjE+w6BoT6uaVLfWdFMsi1PMKFkU6BZWpqRwjnsRm0o6ANGTBuZar5Piu7m/CbKqRPiYg=="
+    },
     "ecc-jsbn": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";,
@@ -785,13 +777,12 @@
       "dev": true
     },
     "error": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz";,
-      "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
+      "version": "7.2.1",
+      "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz";,
+      "integrity": 
"sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==",
       "dev": true,
       "requires": {
-        "string-template": "~0.2.1",
-        "xtend": "~4.0.0"
+        "string-template": "~0.2.1"
       }
     },
     "error-ex": {
@@ -1056,20 +1047,20 @@
       }
     },
     "globule": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz";,
-      "integrity": 
"sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz";,
+      "integrity": 
"sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==",
       "dev": true,
       "requires": {
         "glob": "~7.1.1",
-        "lodash": "~4.17.10",
+        "lodash": "~4.17.12",
         "minimatch": "~3.0.2"
       },
       "dependencies": {
         "glob": {
-          "version": "7.1.4",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz";,
-          "integrity": 
"sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz";,
+          "integrity": 
"sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -1089,9 +1080,9 @@
       }
     },
     "graceful-fs": {
-      "version": "4.2.0",
-      "resolved": 
"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz";,
-      "integrity": 
"sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
+      "version": "4.2.3",
+      "resolved": 
"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz";,
+      "integrity": 
"sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
       "dev": true
     },
     "graceful-readlink": {
@@ -1106,13 +1097,6 @@
       "integrity": "sha1-DKst8P/mq+BwsmJb+h7bbslnuLE=",
       "requires": {
         "lodash": "^3.10.0"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "3.10.1",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz";,
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
-        }
       }
     },
     "grunt": {
@@ -1138,33 +1122,6 @@
         "nopt": "~3.0.6",
         "path-is-absolute": "~1.0.0",
         "rimraf": "~2.6.2"
-      },
-      "dependencies": {
-        "rimraf": {
-          "version": "2.6.3",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";,
-          "integrity": 
"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          },
-          "dependencies": {
-            "glob": {
-              "version": "7.1.4",
-              "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz";,
-              "integrity": 
"sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
-              "dev": true,
-              "requires": {
-                "fs.realpath": "^1.0.0",
-                "inflight": "^1.0.4",
-                "inherits": "2",
-                "minimatch": "^3.0.4",
-                "once": "^1.3.0",
-                "path-is-absolute": "^1.0.0"
-              }
-            }
-          }
-        }
       }
     },
     "grunt-cli": {
@@ -1195,31 +1152,6 @@
       "requires": {
         "async": "^1.5.2",
         "rimraf": "^2.5.1"
-      },
-      "dependencies": {
-        "glob": {
-          "version": "7.1.4",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz";,
-          "integrity": 
"sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.3",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";,
-          "integrity": 
"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
       }
     },
     "grunt-contrib-connect": {
@@ -1247,6 +1179,33 @@
       "requires": {
         "chalk": "^1.1.1",
         "file-sync-cmp": "^0.1.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
       }
     },
     "grunt-contrib-cssmin": {
@@ -1258,6 +1217,33 @@
         "chalk": "^1.0.0",
         "clean-css": "~4.0.3",
         "maxmin": "^1.1.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
       }
     },
     "grunt-contrib-htmlmin": {
@@ -1271,11 +1257,36 @@
         "pretty-bytes": "^4.0.2"
       },
       "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
         "pretty-bytes": {
           "version": "4.0.2",
           "resolved": 
"https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz";,
           "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
           "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
         }
       }
     },
@@ -1296,6 +1307,33 @@
         "object.assign": "^4.0.4",
         "uglify-js": "~2.7.0",
         "uri-path": "^1.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
       }
     },
     "grunt-contrib-watch": {
@@ -1318,6 +1356,12 @@
           "requires": {
             "lodash": "^4.17.14"
           }
+        },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
         }
       }
     },
@@ -1337,6 +1381,14 @@
         "grunt-legacy-log-utils": "~2.0.0",
         "hooker": "~0.2.3",
         "lodash": "~4.17.5"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        }
       }
     },
     "grunt-legacy-log-utils": {
@@ -1349,34 +1401,11 @@
         "lodash": "~4.17.10"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";,
-          "integrity": 
"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz";,
-          "integrity": 
"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";,
-          "integrity": 
"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
         }
       }
     },
@@ -1395,14 +1424,11 @@
         "which": "~1.3.0"
       },
       "dependencies": {
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz";,
-          "integrity": 
"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
         }
       }
     },
@@ -1466,9 +1492,9 @@
       "dev": true
     },
     "has-symbols": {
-      "version": "1.0.0",
-      "resolved": 
"https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz";,
-      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+      "version": "1.0.1",
+      "resolved": 
"https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz";,
+      "integrity": 
"sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
       "dev": true
     },
     "has-unicode": {
@@ -1490,9 +1516,9 @@
       "dev": true
     },
     "hosted-git-info": {
-      "version": "2.7.1",
-      "resolved": 
"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz";,
-      "integrity": 
"sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
+      "version": "2.8.8",
+      "resolved": 
"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz";,
+      "integrity": 
"sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
       "dev": true
     },
     "html-minifier": {
@@ -1613,13 +1639,10 @@
       "dev": true
     },
     "is-finite": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz";,
-      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
-      "dev": true,
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz";,
+      "integrity": 
"sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+      "dev": true
     },
     "is-fullwidth-code-point": {
       "version": "1.0.0",
@@ -1670,13 +1693,6 @@
         "jquery": ">=1.9.0",
         "jquery-extendext": ">=0.1.2",
         "moment": ">=2.6.0"
-      },
-      "dependencies": {
-        "bootstrap": {
-          "version": "4.3.1",
-          "resolved": 
"https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz";,
-          "integrity": 
"sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag=="
-        }
       }
     },
     "jquery": {
@@ -1693,9 +1709,9 @@
       }
     },
     "jquery-extendext": {
-      "version": "0.1.2",
-      "resolved": 
"https://registry.npmjs.org/jquery-extendext/-/jquery-extendext-0.1.2.tgz";,
-      "integrity": "sha1-1FtUi1EtF0oqcz16wkSLkEVscVY=",
+      "version": "1.0.0",
+      "resolved": 
"https://registry.npmjs.org/jquery-extendext/-/jquery-extendext-1.0.0.tgz";,
+      "integrity": 
"sha512-gDJjpQ8ISd4ZMwSn0yXSuyufsPMCeWtWJ8kmqE85VromJqyVT2sdkHzS5yL0w1GK81UpOzmr2f9JgFln2sbJSg==",
       "requires": {
         "jquery": ">=1.9.1"
       }
@@ -1844,10 +1860,9 @@
       }
     },
     "lodash": {
-      "version": "4.17.15",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
-      "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
-      "dev": true
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz";,
+      "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
     },
     "longest": {
       "version": "1.0.1",
@@ -1902,6 +1917,33 @@
         "figures": "^1.0.1",
         "gzip-size": "^1.0.0",
         "pretty-bytes": "^1.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
       }
     },
     "meow": {
@@ -1929,18 +1971,18 @@
       "dev": true
     },
     "mime-db": {
-      "version": "1.40.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz";,
-      "integrity": 
"sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
+      "version": "1.43.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz";,
+      "integrity": 
"sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
       "dev": true
     },
     "mime-types": {
-      "version": "2.1.24",
-      "resolved": 
"https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz";,
-      "integrity": 
"sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+      "version": "2.1.26",
+      "resolved": 
"https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz";,
+      "integrity": 
"sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
       "dev": true,
       "requires": {
-        "mime-db": "1.40.0"
+        "mime-db": "1.43.0"
       }
     },
     "minimatch": {
@@ -2100,6 +2142,39 @@
         "sass-graph": "^2.2.4",
         "stdout-stream": "^1.4.0",
         "true-case-path": "^1.0.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";,
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";,
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
       }
     },
     "nopt": {
@@ -2401,9 +2476,9 @@
       "dev": true
     },
     "qs": {
-      "version": "6.8.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.8.0.tgz";,
-      "integrity": 
"sha512-tPSkj8y92PfZVbinY1n84i1Qdx75lZjMQYx9WZhnkofyxzw2r7Ho39G3/aEvSUdebxpnnM4LZJCtvE/Aq3+s9w==",
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz";,
+      "integrity": 
"sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==",
       "dev": true
     },
     "range-parser": {
@@ -2452,9 +2527,9 @@
       }
     },
     "readable-stream": {
-      "version": "2.3.6",
-      "resolved": 
"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz";,
-      "integrity": 
"sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "version": "2.3.7",
+      "resolved": 
"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz";,
+      "integrity": 
"sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
       "dev": true,
       "requires": {
         "core-util-is": "~1.0.0",
@@ -2561,9 +2636,9 @@
       "integrity": "sha1-ExOHM2E/xEV7fhJH6Mt1HfeqVCk="
     },
     "resolve": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz";,
-      "integrity": 
"sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
+      "version": "1.15.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz";,
+      "integrity": 
"sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
       "dev": true,
       "requires": {
         "path-parse": "^1.0.6"
@@ -2594,9 +2669,9 @@
       }
     },
     "rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz";,
-      "integrity": 
"sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";,
+      "integrity": 
"sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
       "dev": true,
       "requires": {
         "glob": "^7.1.3"
@@ -2670,6 +2745,12 @@
             "wrap-ansi": "^2.0.0"
           }
         },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";,
+          "integrity": 
"sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
         "yargs": {
           "version": "7.1.0",
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz";,
@@ -2724,9 +2805,9 @@
       }
     },
     "semver": {
-      "version": "5.7.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz";,
-      "integrity": 
"sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz";,
+      "integrity": 
"sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
       "dev": true
     },
     "send": {
@@ -2855,9 +2936,9 @@
       }
     },
     "spdx-license-ids": {
-      "version": "3.0.4",
-      "resolved": 
"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz";,
-      "integrity": 
"sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==",
+      "version": "3.0.5",
+      "resolved": 
"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz";,
+      "integrity": 
"sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
       "dev": true
     },
     "sprintf-js": {
@@ -2952,10 +3033,13 @@
       }
     },
     "supports-color": {
-      "version": "2.0.0",
-      "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";,
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-      "dev": true
+      "version": "5.5.0",
+      "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";,
+      "integrity": 
"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
     },
     "table-dragger": {
       "version": "1.0.2",
@@ -3265,12 +3349,6 @@
       "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=",
       "dev": true
     },
-    "xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz";,
-      "integrity": 
"sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "dev": true
-    },
     "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 5dc0510..e2d33d5 100644
--- a/dashboardv3/package.json
+++ b/dashboardv3/package.json
@@ -33,6 +33,7 @@
     "d3": "3.5.17",
     "d3-tip": "0.6.8",
     "dagre-d3": "0.4.17",
+    "dropzone": "5.7.0",
     "font-awesome": "4.7.0",
     "jQuery-QueryBuilder": "2.4.3",
     "jquery": "3.3.1",
diff --git a/dashboardv3/public/css/scss/leftsidebar.scss 
b/dashboardv3/public/css/scss/leftsidebar.scss
index bbdc5fb..9c5475c 100644
--- a/dashboardv3/public/css/scss/leftsidebar.scss
+++ b/dashboardv3/public/css/scss/leftsidebar.scss
@@ -425,4 +425,16 @@ span.tree-tooltip {
     &.show {
         display: block;
     }
+}
+
+.glossary-dropdown {
+    left: -190px !important;
+
+    span a {
+        padding: 0px !important;
+
+        span {
+            margin-left: 0px !important;
+        }
+    }
 }
\ No newline at end of file
diff --git a/dashboardv3/public/css/scss/theme.scss 
b/dashboardv3/public/css/scss/theme.scss
index 2b0c45d..ef84ca9 100644
--- a/dashboardv3/public/css/scss/theme.scss
+++ b/dashboardv3/public/css/scss/theme.scss
@@ -844,4 +844,26 @@ td.searchTableName:hover {
     }
 
 
+}
+
+.dropzone {
+    border-radius: 10px;
+    border: 2px dashed $color_havelock_blue_approx;
+
+    .dz-default.dz-message {
+        font-weight: 500;
+        font-size: 20px;
+    }
+
+    &.single-file-center {
+        .dz-file-preview {
+            margin-left: calc(50% - 68px);
+        }
+    }
+}
+
+.dropzone-modal {
+    .modal-body {
+        background: $color_white_lilac_approx;
+    }
 }
\ No newline at end of file
diff --git a/dashboardv3/public/index.html.tpl 
b/dashboardv3/public/index.html.tpl
index 1baeb12..408f2b5 100644
--- a/dashboardv3/public/index.html.tpl
+++ b/dashboardv3/public/index.html.tpl
@@ -54,6 +54,7 @@
     <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" />
     <link href="css/style.css?bust=<%- bust %>" rel="stylesheet" />
diff --git a/dashboardv3/public/js/main.js b/dashboardv3/public/js/main.js
index 4acbd52..b4e921a 100644
--- a/dashboardv3/public/js/main.js
+++ b/dashboardv3/public/js/main.js
@@ -175,7 +175,8 @@ require.config({
         'sparkline': 'libs/sparkline/jquery.sparkline.min',
         'table-dragger': 'libs/table-dragger/table-dragger',
         'jstree': 'libs/jstree/jstree.min',
-        'jquery-steps': 'libs/jquery-steps/jquery.steps.min'
+        'jquery-steps': 'libs/jquery-steps/jquery.steps.min',
+        'dropzone': 'libs/dropzone/js/dropzone-amd-module'
     },
 
     /**
@@ -348,4 +349,4 @@ require(['App',
             startApp();
         }
     });
-});
+});
\ No newline at end of file
diff --git 
a/dashboardv3/public/js/templates/glossary/ImportGlossaryLayoutView_tmpl.html 
b/dashboardv3/public/js/templates/glossary/ImportGlossaryLayoutView_tmpl.html
new file mode 100644
index 0000000..abf11b7
--- /dev/null
+++ 
b/dashboardv3/public/js/templates/glossary/ImportGlossaryLayoutView_tmpl.html
@@ -0,0 +1,17 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+<form action={{importUrl}} id="importGlossary" class="dropzone 
single-file-center"></form>
\ No newline at end of file
diff --git 
a/dashboardv3/public/js/templates/search/tree/GlossaryTreeLayoutView_tmpl.html 
b/dashboardv3/public/js/templates/search/tree/GlossaryTreeLayoutView_tmpl.html
index 83da9c5..9cedf96 100644
--- 
a/dashboardv3/public/js/templates/search/tree/GlossaryTreeLayoutView_tmpl.html
+++ 
b/dashboardv3/public/js/templates/search/tree/GlossaryTreeLayoutView_tmpl.html
@@ -23,18 +23,22 @@
             <button type="button" class="typeRefresh" 
data-id="showGlossaryType" title="Show Category">
                 <i class="fa fa-toggle-on switch-button"></i>
             </button>
-            <button title="Create Glossary" type="button" 
data-id="createGlossary">
+            <!-- <button title="Create Glossary" type="button" 
data-id="createGlossary">
                 <i class="fa fa-plus"></i>
-            </button>
-            <!--  <button type="button" class="typeRefresh dropdown">
+            </button> -->
+            <button type="button" class="typeRefresh dropdown">
                 <div class=" btn-secondary dropdown-toggle" type="button" 
id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" 
aria-expanded="false">
                     <i class="fa fa-ellipsis-v"></i>
                 </div>
-                <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
+                <ul class="dropdown-menu glossary-dropdown" 
aria-labelledby="dropdownMenuButton">
                     <li data-id="createGlossary" data-type="term"> <i 
class="fa fa-plus"></i><span>Create Glossary</span>
                     </li>
+                    <li data-id="downloadTemplate" data-type="term"><i 
class="fa fa-download"></i> <span><a href="{{importTmplUrl}}"><span>Download 
Import template</span></a></span>
+                    </li>
+                    <li data-id="importGlossary" data-type="term"> <i 
class="fa fa-upload"></i><a href="javascript:void(0)"><span>Import 
Glossary</span></a>
+                    </li>
                 </ul>
-            </button> -->
+            </button>
         </div>
     </div>
     <div id="c_term" class="panel-collapse collapse jstree-with-action in">
diff --git a/dashboardv3/public/js/utils/UrlLinks.js 
b/dashboardv3/public/js/utils/UrlLinks.js
index 17d2bdf..62384d6 100644
--- a/dashboardv3/public/js/utils/UrlLinks.js
+++ b/dashboardv3/public/js/utils/UrlLinks.js
@@ -185,6 +185,12 @@ define(['require', 'utils/Enums', 'utils/Utils', 
'underscore'], function(require
                 return glossaryUrl;
             }
         },
+        glossaryImportTempUrl: function() {
+            return this.glossaryApiUrl() + '/import/template';
+        },
+        glossaryImportUrl: function() {
+            return this.glossaryApiUrl() + '/import';
+        },
         categoryApiUrl: function(options) {
             var guid = options && options.guid,
                 list = options && options.list,
diff --git a/dashboardv3/public/js/views/glossary/ImportGlossaryLayoutView.js 
b/dashboardv3/public/js/views/glossary/ImportGlossaryLayoutView.js
new file mode 100644
index 0000000..23b0ef7
--- /dev/null
+++ b/dashboardv3/public/js/views/glossary/ImportGlossaryLayoutView.js
@@ -0,0 +1,128 @@
+/**
+ * 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",
+    "backbone",
+    "hbs!tmpl/glossary/ImportGlossaryLayoutView_tmpl",
+    "modules/Modal",
+    'utils/CommonViewFunction',
+    "utils/Utils",
+    "utils/UrlLinks",
+    "dropzone"
+], function(require, Backbone, ImportGlossaryLayoutViewTmpl, Modal, 
CommonViewFunction, Utils, UrlLinks, dropzone) {
+    var ImportGlossaryLayoutView = Backbone.Marionette.LayoutView.extend(
+        /** @lends ImportGlossaryLayoutView */
+        {
+            _viewName: "ImportGlossaryLayoutView",
+
+            template: ImportGlossaryLayoutViewTmpl,
+
+            templateHelpers: function() {
+                return {
+                    importUrl: UrlLinks.glossaryImportUrl()
+                };
+            },
+
+            /** Layout sub regions */
+            regions: {},
+
+            /** ui selector cache */
+            ui: {},
+            /** ui events hash */
+            events: function() {
+                var events = {};
+                return events;
+            },
+            /**
+             * intialize a new ImportGlossaryLayoutView Layout
+             * @constructs
+             */
+            initialize: function(options) {
+                _.extend(this, _.pick(options, "callback"));
+                var that = this;
+                this.modal = new Modal({
+                    title: "Import Glossary",
+                    content: this,
+                    cancelText: "Cancel",
+                    okText: "upload",
+                    allowCancel: true,
+                    okCloses: false,
+                    mainClass: "dropzone-modal"
+                }).open();
+                this.modal.$el.find("button.ok").attr("disabled", true);
+                this.modal.on("ok", function(e) {
+                    that.dropzone.processQueue();
+                });
+                this.modal.on("closeModal", function() {
+                    that.modal.trigger("cancel");
+                });
+            },
+            bindEvents: function() {},
+            onRender: function() {
+                var that = this;
+                this.dropzone = null;
+                var updateButton = function(files) {
+                    var buttonEl = that.modal.$el.find("button.ok");
+                    if (files.length === 0) {
+                        buttonEl.attr("disabled", true);
+                    } else {
+                        buttonEl.attr("disabled", false);
+                    }
+                }
+                var headers = {};
+                headers[CommonViewFunction.restCsrfCustomHeader] = '""';
+                this.$("#importGlossary").dropzone({
+                    url: UrlLinks.glossaryImportUrl(),
+                    clickable: true,
+                    acceptedFiles: ".csv,.xls,.xlsx",
+                    autoProcessQueue: false,
+                    maxFiles: 1,
+                    addRemoveLinks: true,
+                    init: function() {
+                        that.dropzone = this;
+                        this.on('addedfile', function(file) {
+                            updateButton(this.files);
+                        })
+                        this.on('removedfile', function(file) {
+                            updateButton(this.files);
+                        })
+                    },
+                    maxfilesexceeded: function(file) {
+                        this.removeAllFiles();
+                        this.addFile(file);
+                    },
+                    success: function(file, response) {
+                        that.modal.trigger("cancel");
+                        Utils.notifySuccess({
+                            content: "File: " + file.name + " added 
successfully"
+                        });
+                        that.callback();
+                    },
+                    error: function(file, response, responseObj) {
+                        Utils.defaultErrorHandler(null, responseObj, { 
defaultErrorMessage: (response.errorMessage) || response });
+                        that.modal.$el.find("button.ok").attr("disabled", 
false);
+                    },
+                    dictDefaultMessage: "Drop files here or click to upload.",
+                    headers: headers
+                });
+            }
+        }
+    );
+    return ImportGlossaryLayoutView;
+});
\ No newline at end of file
diff --git a/dashboardv3/public/js/views/search/tree/GlossaryTreeLayoutView.js 
b/dashboardv3/public/js/views/search/tree/GlossaryTreeLayoutView.js
index 28c6a9e..fda7647 100644
--- a/dashboardv3/public/js/views/search/tree/GlossaryTreeLayoutView.js
+++ b/dashboardv3/public/js/views/search/tree/GlossaryTreeLayoutView.js
@@ -37,11 +37,15 @@ define([
             refreshTree: '[data-id="refreshTree"]',
             termSearchTree: '[data-id="termSearchTree"]',
             createGlossary: '[data-id="createGlossary"]',
-            showGlossaryType: '[data-id="showGlossaryType"]'
+            showGlossaryType: '[data-id="showGlossaryType"]',
+            importGlossary: "[data-id='importGlossary']",
+            downloadTemplate: "[data-id='downloadTemplate']"
+
         },
         templateHelpers: function() {
             return {
-                apiBaseUrl: UrlLinks.apiBaseUrl
+                apiBaseUrl: UrlLinks.apiBaseUrl,
+                importTmplUrl: UrlLinks.glossaryImportTempUrl()
             };
         },
         events: function() {
@@ -73,6 +77,13 @@ define([
                 this.isTermView = !this.isTermView;
                 this.glossarySwitchBtnUpdate();
             };
+            events["click " + this.ui.importGlossary] = function(e) {
+                e.stopPropagation();
+                that.onClickImportGlossary();
+            };
+            events['click ' + this.ui.downloadTemplate] = function(e) {
+                e.stopPropagation();
+            };
             return events;
         },
         bindEvents: function() {
@@ -581,7 +592,8 @@ define([
                     gId: glossaryId,
                     guid: getSelectedParent,
                     gType: that.isTermView ? 'term' : 'category',
-                    viewType: that.isTermView ? 'term' : 'category'
+                    viewType: that.isTermView ? 'term' : 'category',
+                    searchType: "basic"
                 }
                 var serachUrl = '#!/glossary/' + guid;
                 this.triggerSearch(params, serachUrl);
@@ -683,6 +695,18 @@ define([
         refresh: function(options) {
             this.glossaryTermId = null;
             this.fetchGlossary();
+        },
+        onClickImportGlossary: function() {
+            var that = this;
+            require([
+                'views/glossary/ImportGlossaryLayoutView'
+            ], function(ImportGlossaryLayoutView) {
+                var view = new ImportGlossaryLayoutView({
+                    callback: function() {
+                        that.refresh();
+                    }
+                });
+            });
         }
     });
     return GlossaryTreeLayoutView;

Reply via email to