From 072100f30d6f64f5f727c6138e0b98d563e049b9 Mon Sep 17 00:00:00 2001 From: jiazhong Date: Tue, 9 Dec 2014 21:50:20 +0800 Subject: [PATCH] alert UI enhancement --- .../com/kylinolap/cube/project/ProjectManager.java | 6 +- .../metadata/validation/rule/RowKeyAttrRule.java | 8 +- .../kylinolap/rest/controller/TableController.java | 26 +- .../components/bootstrap-sweetalert/.bower.json | 35 + .../components/bootstrap-sweetalert/.editorconfig | 11 + .../app/components/bootstrap-sweetalert/.gitignore | 3 + .../bootstrap-sweetalert/Gruntfile.coffee | 35 + webapp/app/components/bootstrap-sweetalert/LICENSE | 22 + .../app/components/bootstrap-sweetalert/README.md | 31 + .../assets/bootstrap-sweetalert.png | Bin 0 -> 52320 bytes .../bootstrap-sweetalert/assets/docs.css | 123 ++++ .../bootstrap-sweetalert/assets/thumbs-up.jpg | Bin 0 -> 30052 bytes .../bootstrap-sweetalert/bootstrap/mixins.less | 13 + .../bootstrap-sweetalert/bootstrap/variables.less | 42 ++ .../app/components/bootstrap-sweetalert/bower.json | 24 + .../app/components/bootstrap-sweetalert/index.html | 308 +++++++++ .../lib/sweet-alert-animations.less | 255 ++++++++ .../lib/sweet-alert-combine.less | 3 + .../bootstrap-sweetalert/lib/sweet-alert.css | 564 ++++++++++++++++ .../bootstrap-sweetalert/lib/sweet-alert.html | 39 ++ .../bootstrap-sweetalert/lib/sweet-alert.js | 706 +++++++++++++++++++++ .../bootstrap-sweetalert/lib/sweet-alert.less | 254 ++++++++ .../bootstrap-sweetalert/lib/sweet-alert.min.js | 1 + .../components/bootstrap-sweetalert/package.json | 29 + webapp/app/components/sweetalert/.bower.json | 4 +- webapp/app/index.html | 4 +- webapp/app/js/app.js | 4 +- webapp/app/js/controllers/page.js | 2 - webapp/app/js/controllers/sourceMeta.js | 22 +- webapp/app/less/app.less | 9 +- webapp/bower.json | 3 +- webapp/grunt.json | 4 +- 32 files changed, 2567 insertions(+), 23 deletions(-) create mode 100644 webapp/app/components/bootstrap-sweetalert/.bower.json create mode 100644 webapp/app/components/bootstrap-sweetalert/.editorconfig create mode 100644 webapp/app/components/bootstrap-sweetalert/.gitignore create mode 100644 webapp/app/components/bootstrap-sweetalert/Gruntfile.coffee create mode 100644 webapp/app/components/bootstrap-sweetalert/LICENSE create mode 100644 webapp/app/components/bootstrap-sweetalert/README.md create mode 100644 webapp/app/components/bootstrap-sweetalert/assets/bootstrap-sweetalert.png create mode 100644 webapp/app/components/bootstrap-sweetalert/assets/docs.css create mode 100644 webapp/app/components/bootstrap-sweetalert/assets/thumbs-up.jpg create mode 100644 webapp/app/components/bootstrap-sweetalert/bootstrap/mixins.less create mode 100644 webapp/app/components/bootstrap-sweetalert/bootstrap/variables.less create mode 100644 webapp/app/components/bootstrap-sweetalert/bower.json create mode 100644 webapp/app/components/bootstrap-sweetalert/index.html create mode 100644 webapp/app/components/bootstrap-sweetalert/lib/sweet-alert-animations.less create mode 100644 webapp/app/components/bootstrap-sweetalert/lib/sweet-alert-combine.less create mode 100644 webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.css create mode 100644 webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.html create mode 100644 webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.js create mode 100644 webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.less create mode 100644 webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.min.js create mode 100644 webapp/app/components/bootstrap-sweetalert/package.json diff --git a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java index f1c3384..3b5cdc0 100644 --- a/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java +++ b/cube/src/main/java/com/kylinolap/cube/project/ProjectManager.java @@ -195,8 +195,10 @@ public ProjectInstance updateTableToProject(String tables, String projectName) t String[] tokens = StringUtils.split(tables, ","); for (int i = 0; i < tokens.length; i++) { String token = tokens[i].trim(); - if (StringUtils.isNotEmpty(token)) { - projectInstance.addTable(token); + int cut = token.indexOf('.'); + String tableName = cut >= 0 ? token.substring(cut + 1).trim() : token.trim(); + if (StringUtils.isNotEmpty(tableName)) { + projectInstance.addTable(tableName); } } diff --git a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRule.java b/metadata/src/main/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRule.java index 2016cd6..5253cea 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRule.java +++ b/metadata/src/main/java/com/kylinolap/metadata/validation/rule/RowKeyAttrRule.java @@ -49,10 +49,14 @@ public void validate(CubeDesc cube, ValidateContext context) { } RowKeyColDesc[] rcd = row.getRowKeyColumns(); - if (rcd == null || rcd.length == 0) { - context.addResult(ResultLevel.ERROR, "Rowkey columns do not exist or is empty"); + if (rcd == null) { + context.addResult(ResultLevel.ERROR, "Rowkey columns do not exist"); return; } + if(rcd.length == 0){ + context.addResult(ResultLevel.ERROR, "Rowkey columns is empty"); + return; + } for (int i = 0; i < rcd.length; i++) { RowKeyColDesc rd = rcd[i]; diff --git a/server/src/main/java/com/kylinolap/rest/controller/TableController.java b/server/src/main/java/com/kylinolap/rest/controller/TableController.java index ee4cdb3..f7ab06a 100644 --- a/server/src/main/java/com/kylinolap/rest/controller/TableController.java +++ b/server/src/main/java/com/kylinolap/rest/controller/TableController.java @@ -122,13 +122,29 @@ public String reloadSourceTable() { public Map loadHiveTable(@PathVariable String tables,@PathVariable String project){ Map result = new HashMap(); try{ - String[] arr = cubeMgmtService.reloadHiveTable(tables); - if(arr.length==0){ - throw new InternalErrorException("No Table Loaded! Please check the table name."); + String[] loadedTables = cubeMgmtService.reloadHiveTable(tables); + + String inputTables[] = tables.split(","); + ArrayList unloadedTables = new ArrayList(); + for (String inputTable : inputTables) { + boolean tableLoaded = false; + for (String loadedTable : loadedTables) { + int cut = loadedTable.indexOf('.'); + String tableName = cut >= 0 ? loadedTable.substring(cut + 1).trim() : loadedTable.trim(); + if (inputTable.toUpperCase().equals(tableName)||inputTable.toUpperCase().equals(loadedTable)) { + tableLoaded = true; + continue; + } + } + if(!tableLoaded){ + unloadedTables.add(inputTable); + } } - + cubeMgmtService.syncTableToProject(tables, project); - result.put("result", arr); + result.put("result.loaded", loadedTables); + result.put("result.unloaded",unloadedTables.toArray(new String[unloadedTables.size()]) ); + }catch(IOException e){ logger.error("Failed to deal with the request.", e); throw new InternalErrorException("Failed to load table,Please check the table name."); diff --git a/webapp/app/components/bootstrap-sweetalert/.bower.json b/webapp/app/components/bootstrap-sweetalert/.bower.json new file mode 100644 index 0000000..e7a8854 --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/.bower.json @@ -0,0 +1,35 @@ +{ + "name": "bootstrap-sweetalert", + "homepage": "http://lipis.github.io/bootstrap-sweetalert/", + "authors": [ + "Tristan Edwards (http://tristanedwards.me)", + "Panayiotis Lipiridis (http://lip.is)" + ], + "description": "A beautiful replacement for JavaScript's alert for Bootstrap.", + "main": [ + "lib/sweet-alert.js", + "lib/sweet-alert.css", + "lib/sweet-alert.less", + "lib/sweet-alert-animations.less" + ], + "keywords": [ + "alert", + "modal" + ], + "repository": { + "type": "git", + "url": "git@github.com:lipis/bootstrap-sweetalert.git" + }, + "license": "MIT", + "version": "0.4.3", + "_release": "0.4.3", + "_resolution": { + "type": "version", + "tag": "0.4.3", + "commit": "8ef52611ab63175e77424180a07a8fa0b6829594" + }, + "_source": "https://github.com/lipis/bootstrap-sweetalert.git", + "_target": "~0.4.3", + "_originalSource": "bootstrap-sweetalert", + "_direct": true +} \ No newline at end of file diff --git a/webapp/app/components/bootstrap-sweetalert/.editorconfig b/webapp/app/components/bootstrap-sweetalert/.editorconfig new file mode 100644 index 0000000..f29d257 --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/.editorconfig @@ -0,0 +1,11 @@ +# editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/webapp/app/components/bootstrap-sweetalert/.gitignore b/webapp/app/components/bootstrap-sweetalert/.gitignore new file mode 100644 index 0000000..e1a8279 --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/.gitignore @@ -0,0 +1,3 @@ +.deploy +.sass-cache +node_modules diff --git a/webapp/app/components/bootstrap-sweetalert/Gruntfile.coffee b/webapp/app/components/bootstrap-sweetalert/Gruntfile.coffee new file mode 100644 index 0000000..13edb64 --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/Gruntfile.coffee @@ -0,0 +1,35 @@ +module.exports = (grunt) -> + require('load-grunt-tasks') grunt + + grunt.initConfig + less: + lib: + files: + 'lib/sweet-alert.css': 'lib/sweet-alert-combine.less' + + uglify: + lib: + files: + 'lib/sweet-alert.min.js': 'lib/sweet-alert.js' + + watch: + lib: + options: + livereload: 32123 + files: ['**/*.{less,html,css}', 'lib/sweet-alert.js'] + tasks: ['compile'] + + open: + example: + path: 'http://localhost:7777/' + + connect: + server: + options: + port: 7777 + hostname: '*' + base: '.' + + grunt.registerTask 'compile', ['less', 'uglify'] + + grunt.registerTask 'default', ['compile', 'connect', 'open', 'watch'] diff --git a/webapp/app/components/bootstrap-sweetalert/LICENSE b/webapp/app/components/bootstrap-sweetalert/LICENSE new file mode 100644 index 0000000..2d4ac32 --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014 Tristan Edwards + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/webapp/app/components/bootstrap-sweetalert/README.md b/webapp/app/components/bootstrap-sweetalert/README.md new file mode 100644 index 0000000..4eb4682 --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/README.md @@ -0,0 +1,31 @@ +> If you are looking for the non-Bootstrap version refer to the original +> [SweetAlert project](https://github.com/t4t5/sweetalert). + +# SweetAlert for Bootstrap + +An awesome _replacement_ for JavaScript's `alert()` made for Bootstrap. + + +## Usage + +On how to use these alerts, read the docs from the original +[SweetAlert](http://tristanedwards.me/sweetalert) project. + +The main difference here is that instead of using the `confirmButtonColor` you +should use the `confirmButtonClass`. It can take any of the default Bootstrap +classes for buttons like: `btn-danger`, `btn-success`, etc. The rest of the API +remains exactly the same. + +Also if you are using Less in your project, then instead of including the +`*.css` files include the +[`sweet-alert.less`](https://github.com/lipis/bootstrap-sweetalert/blob/master/lib/sweet-alert.less) +in your building process. That way it will use the Bootstrap's variables to +match your theme perfectly. + + +## Development + +```shell +$ npm install +$ grunt +``` diff --git a/webapp/app/components/bootstrap-sweetalert/assets/bootstrap-sweetalert.png b/webapp/app/components/bootstrap-sweetalert/assets/bootstrap-sweetalert.png new file mode 100644 index 0000000000000000000000000000000000000000..66664593b4c6636ffadbc728d003f7cfb6ed9c0d GIT binary patch literal 52320 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 BMU4Oe literal 0 HcmV?d00001 diff --git a/webapp/app/components/bootstrap-sweetalert/assets/docs.css b/webapp/app/components/bootstrap-sweetalert/assets/docs.css new file mode 100644 index 0000000..28144d8 --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/assets/docs.css @@ -0,0 +1,123 @@ +.jumbotron { + font-size: 16px; + text-align: center; + color: #fff; + color: rgba(255,255,255,.75); + background-color: #cb4b16; + border-radius: 0; +} +.jumbotron h1 { + margin-bottom: 15px; + font-weight: 300; + letter-spacing: -1px; + color: #fff; +} +.jumbotron .small { + font-size: .9em; +} +.jumbotron iframe { + width: 90px!important; + height: 20px!important; + border: none; + overflow: hidden; + margin: 2px; +} +.jumbotron p a, +.jumbotron-links a { + font-weight: 500; + color: #fff; + transition: all .1s ease-in-out; +} +.jumbotron p a:hover, +.jumbotron-links a:hover { + text-shadow: 0 0 10px rgba(255,255,255,.55); +} + +.jumbotron-links { + margin-top: 15px; + padding-left: 0; + list-style: none; + font-size: 14px; +} +.jumbotron-links li { + display: inline; +} +.jumbotron-links li + li { + margin-left: 20px; +} + + +.btn-outline { + margin-top: 15px; + margin-bottom: 15px; + padding: 18px 24px; + font-size: inherit; + font-weight: 500; + color: #fff; + background-color: transparent; + border-color: #fff; + border-color: rgba(255,255,255,.5); + transition: all .1s ease-in-out; +} + +.btn-outline:hover, +.btn-outline:active { + color: @color-bg; + background-color: #fff; + border-color: #fff; +} + +.container { + max-width: 680px; +} + + +h1, +h2 { + font-weight: 300; + color: #555; + margin-top: 32px; + margin-bottom: 32px; + text-align: center; +} + +h4 { + font-weight: 300; + color: #555; + margin-top: 36px; + margin-bottom: 24px; +} + +pre { + font-size: 0.8em; + overflow: auto; + word-wrap: normal; + white-space: pre; +} + +footer { + text-align: center; + opacity: .8; + padding: 40px 0; + margin-top: 40px; + border-top: 1px solid #ccc; +} + +.examples { + text-align: center; +} + +.examples .btn { + margin-bottom: 4px; +} + +.links { + margin: 0; + list-style: none; + padding-left: 0; +} + +.links li { + display: inline; + padding: 0 10px; +} diff --git a/webapp/app/components/bootstrap-sweetalert/assets/thumbs-up.jpg b/webapp/app/components/bootstrap-sweetalert/assets/thumbs-up.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e7c7474f0ce33c927eddc9f50ecbbf00464c526 GIT binary patch literal 30052 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 (http://tristanedwards.me)", + "Panayiotis Lipiridis (http://lip.is)" + ], + "description": "A beautiful replacement for JavaScript's alert for Bootstrap.", + "main": [ + "lib/sweet-alert.js", + "lib/sweet-alert.css", + "lib/sweet-alert.less", + "lib/sweet-alert-animations.less" + ], + "keywords": [ + "alert", + "modal" + ], + "repository": { + "type": "git", + "url": "git@github.com:lipis/bootstrap-sweetalert.git" + }, + "license": "MIT" +} diff --git a/webapp/app/components/bootstrap-sweetalert/index.html b/webapp/app/components/bootstrap-sweetalert/index.html new file mode 100644 index 0000000..14a7788 --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/index.html @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + SweetAlert for Bootstrap + + + + + + + + + + + + + + + + + + +
+

SweetAlert for Bootstrap

+

A beautiful replacement for JavaScript's "alert"

+

+ This is just a clone for Bootstrap of the original + SweetAlert. +

+

+ + + View on GitHub + +

+ + + + +
+ +
+ +

Try any of those!

+
+ + + + + +
+ + +

Install via Bower

+ +
$ bower install bootstrap-sweetalert
+ +

+ Continue playing with the examples or check how to use it on + GitHub. +

+ +

Original Examples

+ +

Basic example

+
+
+

+
+
+
swal("Here's a message!")
+
+
+ +

A title with a text under

+
+
+

+
+
+
swal("Here's a message!", "It's pretty, isn't it?")
+
+
+ +

A success message!

+
+
+

+
+
+
swal("Good job!", "You clicked the button!", "success")
+
+
+ +

A warning message, with a function attached to the "Confirm" button...

+
+
+

+
+
+
+swal({
+  title: "Are you sure?",
+  text: "Your will not be able to recover this imaginary file!",
+  type: "warning",
+  showCancelButton: true,
+  confirmButtonClass: "btn-danger",
+  confirmButtonText: "Yes, delete it!",
+  closeOnConfirm: false
+},
+function(){
+  swal("Deleted!", "Your imaginary file has been deleted.", "success");
+});
+
+
+ +

...and by passing a parameter, you can execute something else for "Cancel".

+
+
+

+
+
+
+swal({
+  title: "Are you sure?",
+  text: "You will not be able to recover this imaginary file!",
+  type: "warning",
+  showCancelButton: true,
+  confirmButtonClass: "btn-danger",
+  confirmButtonText: "Yes, delete it!",
+  cancelButtonText: "No, cancel plx!",
+  closeOnConfirm: false,
+  closeOnCancel: false
+},
+function(isConfirm) {
+  if (isConfirm) {
+    swal("Deleted!", "Your imaginary file has been deleted.", "success");
+  } else {
+    swal("Cancelled", "Your imaginary file is safe :)", "error");
+  }
+});
+
+
+ +

A message with a custom icon

+
+
+

+
+
+
+swal({
+  title: "Sweet!",
+  text: "Here's a custom image.",
+  imageUrl: 'thumbs-up.jpg'
+});
+
+
+
+ + + + + + diff --git a/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert-animations.less b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert-animations.less new file mode 100644 index 0000000..031b20e --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert-animations.less @@ -0,0 +1,255 @@ +@-webkit-keyframes showSweetAlert { + 0% { + transform: scale(0.7); + -webkit-transform: scale(0.7); } + 45% { + transform: scale(1.05); + -webkit-transform: scale(1.05); } + 80% { + transform: scale(0.95); + -webkit-tranform: scale(0.95); } + 100% { + transform: scale(1); + -webkit-transform: scale(1); } } +@keyframes showSweetAlert { + 0% { + transform: scale(0.7); + -webkit-transform: scale(0.7); } + 45% { + transform: scale(1.05); + -webkit-transform: scale(1.05); } + 80% { + transform: scale(0.95); + -webkit-tranform: scale(0.95); } + 100% { + transform: scale(1); + -webkit-transform: scale(1); } } +@-webkit-keyframes hideSweetAlert { + 0% { + transform: scale(1); + -webkit-transform: scale(1); } + 100% { + transform: scale(0.5); + -webkit-transform: scale(0.5); } } +@keyframes hideSweetAlert { + 0% { + transform: scale(1); + -webkit-transform: scale(1); } + 100% { + transform: scale(0.5); + -webkit-transform: scale(0.5); } } +.showSweetAlert { + -webkit-animation: showSweetAlert 0.3s; + animation: showSweetAlert 0.3s; } + +.hideSweetAlert { + -webkit-animation: hideSweetAlert 0.2s; + animation: hideSweetAlert 0.2s; } + +@-webkit-keyframes animateSuccessTip { + 0% { + width: 0; + left: 1px; + top: 19px; } + 54% { + width: 0; + left: 1px; + top: 19px; } + 70% { + width: 50px; + left: -8px; + top: 37px; } + 84% { + width: 17px; + left: 21px; + top: 48px; } + 100% { + width: 25px; + left: 14px; + top: 45px; } } +@keyframes animateSuccessTip { + 0% { + width: 0; + left: 1px; + top: 19px; } + 54% { + width: 0; + left: 1px; + top: 19px; } + 70% { + width: 50px; + left: -8px; + top: 37px; } + 84% { + width: 17px; + left: 21px; + top: 48px; } + 100% { + width: 25px; + left: 14px; + top: 45px; } } +@-webkit-keyframes animateSuccessLong { + 0% { + width: 0; + right: 46px; + top: 54px; } + 65% { + width: 0; + right: 46px; + top: 54px; } + 84% { + width: 55px; + right: 0px; + top: 35px; } + 100% { + width: 47px; + right: 8px; + top: 38px; } } +@keyframes animateSuccessLong { + 0% { + width: 0; + right: 46px; + top: 54px; } + 65% { + width: 0; + right: 46px; + top: 54px; } + 84% { + width: 55px; + right: 0px; + top: 35px; } + 100% { + width: 47px; + right: 8px; + top: 38px; } } +@-webkit-keyframes rotatePlaceholder { + 0% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); } + 5% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); } + 12% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); } + 100% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); } } +@keyframes rotatePlaceholder { + 0% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); } + 5% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); } + 12% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); } + 100% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); } } +.animateSuccessTip { + -webkit-animation: animateSuccessTip 0.75s; + animation: animateSuccessTip 0.75s; } + +.animateSuccessLong { + -webkit-animation: animateSuccessLong 0.75s; + animation: animateSuccessLong 0.75s; } + +.icon.success.animate::after { + -webkit-animation: rotatePlaceholder 4.25s ease-in; + animation: rotatePlaceholder 4.25s ease-in; } + +@-webkit-keyframes animateErrorIcon { + 0% { + transform: rotateX(100deg); + -webkit-transform: rotateX(100deg); + opacity: 0; } + 100% { + transform: rotateX(0deg); + -webkit-transform: rotateX(0deg); + opacity: 1; } } +@keyframes animateErrorIcon { + 0% { + transform: rotateX(100deg); + -webkit-transform: rotateX(100deg); + opacity: 0; } + 100% { + transform: rotateX(0deg); + -webkit-transform: rotateX(0deg); + opacity: 1; } } +.animateErrorIcon { + -webkit-animation: animateErrorIcon 0.5s; + animation: animateErrorIcon 0.5s; } + +@-webkit-keyframes animateXMark { + 0% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; } + 50% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; } + 80% { + transform: scale(1.15); + -webkit-transform: scale(1.15); + margin-top: -6px; } + 100% { + transform: scale(1); + -webkit-transform: scale(1); + margin-top: 0; + opacity: 1; } } +@keyframes animateXMark { + 0% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; } + 50% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; } + 80% { + transform: scale(1.15); + -webkit-transform: scale(1.15); + margin-top: -6px; } + 100% { + transform: scale(1); + -webkit-transform: scale(1); + margin-top: 0; + opacity: 1; } } +.animateXMark { + -webkit-animation: animateXMark 0.5s; + animation: animateXMark 0.5s; } + +@-webkit-keyframes pulseWarning { + 0% { + border-color: #F8D486; } + 100% { + border-color: #F8BB86; } } +@keyframes pulseWarning { + 0% { + border-color: #F8D486; } + 100% { + border-color: #F8BB86; } } +.pulseWarning { + -webkit-animation: pulseWarning 0.75s infinite alternate; + animation: pulseWarning 0.75s infinite alternate; } + +@-webkit-keyframes pulseWarningIns { + 0% { + background-color: #F8D486; } + 100% { + background-color: #F8BB86; } } +@keyframes pulseWarningIns { + 0% { + background-color: #F8D486; } + 100% { + background-color: #F8BB86; } } +.pulseWarningIns { + -webkit-animation: pulseWarningIns 0.75s infinite alternate; + animation: pulseWarningIns 0.75s infinite alternate; } diff --git a/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert-combine.less b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert-combine.less new file mode 100644 index 0000000..b4cfcca --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert-combine.less @@ -0,0 +1,3 @@ +@import "../bootstrap/variables"; +@import "../bootstrap/mixins"; +@import "sweet-alert"; diff --git a/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.css b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.css new file mode 100644 index 0000000..7075866 --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.css @@ -0,0 +1,564 @@ +@-webkit-keyframes showSweetAlert { + 0% { + transform: scale(0.7); + -webkit-transform: scale(0.7); + } + 45% { + transform: scale(1.05); + -webkit-transform: scale(1.05); + } + 80% { + transform: scale(0.95); + -webkit-tranform: scale(0.95); + } + 100% { + transform: scale(1); + -webkit-transform: scale(1); + } +} +@keyframes showSweetAlert { + 0% { + transform: scale(0.7); + -webkit-transform: scale(0.7); + } + 45% { + transform: scale(1.05); + -webkit-transform: scale(1.05); + } + 80% { + transform: scale(0.95); + -webkit-tranform: scale(0.95); + } + 100% { + transform: scale(1); + -webkit-transform: scale(1); + } +} +@-webkit-keyframes hideSweetAlert { + 0% { + transform: scale(1); + -webkit-transform: scale(1); + } + 100% { + transform: scale(0.5); + -webkit-transform: scale(0.5); + } +} +@keyframes hideSweetAlert { + 0% { + transform: scale(1); + -webkit-transform: scale(1); + } + 100% { + transform: scale(0.5); + -webkit-transform: scale(0.5); + } +} +.showSweetAlert { + -webkit-animation: showSweetAlert 0.3s; + animation: showSweetAlert 0.3s; +} +.hideSweetAlert { + -webkit-animation: hideSweetAlert 0.2s; + animation: hideSweetAlert 0.2s; +} +@-webkit-keyframes animateSuccessTip { + 0% { + width: 0; + left: 1px; + top: 19px; + } + 54% { + width: 0; + left: 1px; + top: 19px; + } + 70% { + width: 50px; + left: -8px; + top: 37px; + } + 84% { + width: 17px; + left: 21px; + top: 48px; + } + 100% { + width: 25px; + left: 14px; + top: 45px; + } +} +@keyframes animateSuccessTip { + 0% { + width: 0; + left: 1px; + top: 19px; + } + 54% { + width: 0; + left: 1px; + top: 19px; + } + 70% { + width: 50px; + left: -8px; + top: 37px; + } + 84% { + width: 17px; + left: 21px; + top: 48px; + } + 100% { + width: 25px; + left: 14px; + top: 45px; + } +} +@-webkit-keyframes animateSuccessLong { + 0% { + width: 0; + right: 46px; + top: 54px; + } + 65% { + width: 0; + right: 46px; + top: 54px; + } + 84% { + width: 55px; + right: 0px; + top: 35px; + } + 100% { + width: 47px; + right: 8px; + top: 38px; + } +} +@keyframes animateSuccessLong { + 0% { + width: 0; + right: 46px; + top: 54px; + } + 65% { + width: 0; + right: 46px; + top: 54px; + } + 84% { + width: 55px; + right: 0px; + top: 35px; + } + 100% { + width: 47px; + right: 8px; + top: 38px; + } +} +@-webkit-keyframes rotatePlaceholder { + 0% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 5% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 12% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } + 100% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } +} +@keyframes rotatePlaceholder { + 0% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 5% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + } + 12% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } + 100% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); + } +} +.animateSuccessTip { + -webkit-animation: animateSuccessTip 0.75s; + animation: animateSuccessTip 0.75s; +} +.animateSuccessLong { + -webkit-animation: animateSuccessLong 0.75s; + animation: animateSuccessLong 0.75s; +} +.icon.success.animate::after { + -webkit-animation: rotatePlaceholder 4.25s ease-in; + animation: rotatePlaceholder 4.25s ease-in; +} +@-webkit-keyframes animateErrorIcon { + 0% { + transform: rotateX(100deg); + -webkit-transform: rotateX(100deg); + opacity: 0; + } + 100% { + transform: rotateX(0deg); + -webkit-transform: rotateX(0deg); + opacity: 1; + } +} +@keyframes animateErrorIcon { + 0% { + transform: rotateX(100deg); + -webkit-transform: rotateX(100deg); + opacity: 0; + } + 100% { + transform: rotateX(0deg); + -webkit-transform: rotateX(0deg); + opacity: 1; + } +} +.animateErrorIcon { + -webkit-animation: animateErrorIcon 0.5s; + animation: animateErrorIcon 0.5s; +} +@-webkit-keyframes animateXMark { + 0% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; + } + 50% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; + } + 80% { + transform: scale(1.15); + -webkit-transform: scale(1.15); + margin-top: -6px; + } + 100% { + transform: scale(1); + -webkit-transform: scale(1); + margin-top: 0; + opacity: 1; + } +} +@keyframes animateXMark { + 0% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; + } + 50% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; + } + 80% { + transform: scale(1.15); + -webkit-transform: scale(1.15); + margin-top: -6px; + } + 100% { + transform: scale(1); + -webkit-transform: scale(1); + margin-top: 0; + opacity: 1; + } +} +.animateXMark { + -webkit-animation: animateXMark 0.5s; + animation: animateXMark 0.5s; +} +@-webkit-keyframes pulseWarning { + 0% { + border-color: #F8D486; + } + 100% { + border-color: #F8BB86; + } +} +@keyframes pulseWarning { + 0% { + border-color: #F8D486; + } + 100% { + border-color: #F8BB86; + } +} +.pulseWarning { + -webkit-animation: pulseWarning 0.75s infinite alternate; + animation: pulseWarning 0.75s infinite alternate; +} +@-webkit-keyframes pulseWarningIns { + 0% { + background-color: #F8D486; + } + 100% { + background-color: #F8BB86; + } +} +@keyframes pulseWarningIns { + 0% { + background-color: #F8D486; + } + 100% { + background-color: #F8BB86; + } +} +.pulseWarningIns { + -webkit-animation: pulseWarningIns 0.75s infinite alternate; + animation: pulseWarningIns 0.75s infinite alternate; +} +.sweet-overlay { + background-color: rgba(0, 0, 0, 0.4); + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + display: none; + z-index: 1040; +} +.sweet-alert { + background-color: #ffffff; + width: 478px; + padding: 17px; + border-radius: 5px; + text-align: center; + position: fixed; + left: 50%; + top: 50%; + margin-left: -256px; + margin-top: -200px; + overflow: hidden; + display: none; + z-index: 2000; +} +@media all and (max-width: 767px) { + .sweet-alert { + width: auto; + margin-left: 0; + margin-right: 0; + left: 15px; + right: 15px; + } +} +.sweet-alert .icon { + width: 80px; + height: 80px; + border: 4px solid gray; + border-radius: 50%; + margin: 20px auto; + position: relative; + box-sizing: content-box; +} +.sweet-alert .icon.error { + border-color: #d43f3a; +} +.sweet-alert .icon.error .x-mark { + position: relative; + display: block; +} +.sweet-alert .icon.error .line { + position: absolute; + height: 5px; + width: 47px; + background-color: #d9534f; + display: block; + top: 37px; + border-radius: 2px; +} +.sweet-alert .icon.error .line.left { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + left: 17px; +} +.sweet-alert .icon.error .line.right { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + right: 16px; +} +.sweet-alert .icon.warning { + border-color: #eea236; +} +.sweet-alert .icon.warning .body { + position: absolute; + width: 5px; + height: 47px; + left: 50%; + top: 10px; + border-radius: 2px; + margin-left: -2px; + background-color: #f0ad4e; +} +.sweet-alert .icon.warning .dot { + position: absolute; + width: 7px; + height: 7px; + border-radius: 50%; + margin-left: -3px; + left: 50%; + bottom: 10px; + background-color: #f0ad4e; +} +.sweet-alert .icon.info { + border-color: #46b8da; +} +.sweet-alert .icon.info::before { + content: ""; + position: absolute; + width: 5px; + height: 29px; + left: 50%; + bottom: 17px; + border-radius: 2px; + margin-left: -2px; + background-color: #5bc0de; +} +.sweet-alert .icon.info::after { + content: ""; + position: absolute; + width: 7px; + height: 7px; + border-radius: 50%; + margin-left: -3px; + top: 19px; + background-color: #5bc0de; +} +.sweet-alert .icon.success { + border-color: #4cae4c; +} +.sweet-alert .icon.success::before, +.sweet-alert .icon.success::after { + content: ''; + border-radius: 50%; + position: absolute; + width: 60px; + height: 120px; + background: white; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} +.sweet-alert .icon.success::before { + border-radius: 120px 0 0 120px; + top: -7px; + left: -33px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: 60px 60px; + transform-origin: 60px 60px; +} +.sweet-alert .icon.success::after { + border-radius: 0 120px 120px 0; + top: -11px; + left: 30px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: 0px 60px; + transform-origin: 0px 60px; +} +.sweet-alert .icon.success .placeholder { + width: 80px; + height: 80px; + border: 4px solid rgba(92, 184, 92, 0.2); + border-radius: 50%; + box-sizing: content-box; + position: absolute; + left: -4px; + top: -4px; + z-index: 2; +} +.sweet-alert .icon.success .fix { + width: 5px; + height: 90px; + background-color: #ffffff; + position: absolute; + left: 28px; + top: 8px; + z-index: 1; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} +.sweet-alert .icon.success .line { + height: 5px; + background-color: #5cb85c; + display: block; + border-radius: 2px; + position: absolute; + z-index: 2; +} +.sweet-alert .icon.success .line.tip { + width: 25px; + left: 14px; + top: 46px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} +.sweet-alert .icon.success .line.long { + width: 47px; + right: 8px; + top: 38px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} +.sweet-alert .icon.custom { + background-size: contain; + border-radius: 0; + border: none; + background-position: center center; + background-repeat: no-repeat; +} +.sweet-alert .btn-default:focus { + border-color: #cccccc; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(204, 204, 204, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(204, 204, 204, 0.6); +} +.sweet-alert .btn-success:focus { + border-color: #4cae4c; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(76, 174, 76, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(76, 174, 76, 0.6); +} +.sweet-alert .btn-info:focus { + border-color: #46b8da; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(70, 184, 218, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(70, 184, 218, 0.6); +} +.sweet-alert .btn-danger:focus { + border-color: #d43f3a; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(212, 63, 58, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(212, 63, 58, 0.6); +} +.sweet-alert .btn-warning:focus { + border-color: #eea236; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(238, 162, 54, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(238, 162, 54, 0.6); +} +.sweet-alert button::-moz-focus-inner { + border: 0; +} diff --git a/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.html b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.html new file mode 100644 index 0000000..c1067fc --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.html @@ -0,0 +1,39 @@ + + +
+ + + +
+ +
+ + + + +
+ +
+ + +
+ +
+ +
+ + +
+
+
+ +
+ + +

Title

+

Text

+

+ + +

+
diff --git a/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.js b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.js new file mode 100644 index 0000000..d40b3ed --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.js @@ -0,0 +1,706 @@ +// SweetAlert +// 2014 (c) - Tristan Edwards +// github.com/t4t5/sweetalert +(function(window, document) { + + var modalClass = '.sweet-alert', + overlayClass = '.sweet-overlay', + alertTypes = ['error', 'warning', 'info', 'success'], + defaultParams = { + title: '', + text: '', + type: null, + allowOutsideClick: false, + showCancelButton: false, + closeOnConfirm: true, + closeOnCancel: true, + confirmButtonText: 'OK', + confirmButtonClass: 'btn-primary', + cancelButtonText: 'Cancel', + imageUrl: null, + imageSize: null, + timer: null + }; + + + /* + * Manipulate DOM + */ + + var getModal = function() { + return document.querySelector(modalClass); + }, + getOverlay = function() { + return document.querySelector(overlayClass); + }, + hasClass = function(elem, className) { + return new RegExp(' ' + className + ' ').test(' ' + elem.className + ' '); + }, + addClass = function(elem, className) { + if (!hasClass(elem, className)) { + elem.className += ' ' + className; + } + }, + removeClass = function(elem, className) { + var newClass = ' ' + elem.className.replace(/[\t\r\n]/g, ' ') + ' '; + if (hasClass(elem, className)) { + while (newClass.indexOf(' ' + className + ' ') >= 0) { + newClass = newClass.replace(' ' + className + ' ', ' '); + } + elem.className = newClass.replace(/^\s+|\s+$/g, ''); + } + }, + escapeHtml = function(str) { + var div = document.createElement('div'); + div.appendChild(document.createTextNode(str)); + return div.innerHTML; + }, + _show = function(elem) { + elem.style.opacity = ''; + elem.style.display = 'block'; + }, + show = function(elems) { + if (elems && !elems.length) { + return _show(elems); + } + for (var i = 0; i < elems.length; ++i) { + _show(elems[i]); + } + }, + _hide = function(elem) { + elem.style.opacity = ''; + elem.style.display = 'none'; + }, + hide = function(elems) { + if (elems && !elems.length) { + return _hide(elems); + } + for (var i = 0; i < elems.length; ++i) { + _hide(elems[i]); + } + }, + isDescendant = function(parent, child) { + var node = child.parentNode; + while (node !== null) { + if (node === parent) { + return true; + } + node = node.parentNode; + } + return false; + }, + getTopMargin = function(elem) { + elem.style.left = '-9999px'; + elem.style.display = 'block'; + + var height = elem.clientHeight; + var padding = parseInt(getComputedStyle(elem).getPropertyValue('padding'), 10); + + elem.style.left = ''; + elem.style.display = 'none'; + return ('-' + parseInt(height / 2 + padding) + 'px'); + }, + fadeIn = function(elem, interval) { + if(+elem.style.opacity < 1) { + interval = interval || 16; + elem.style.opacity = 0; + elem.style.display = 'block'; + var last = +new Date(); + var tick = function() { + elem.style.opacity = +elem.style.opacity + (new Date() - last) / 100; + last = +new Date(); + + if (+elem.style.opacity < 1) { + setTimeout(tick, interval); + } + }; + tick(); + } + }, + fadeOut = function(elem, interval) { + interval = interval || 16; + elem.style.opacity = 1; + var last = +new Date(); + var tick = function() { + elem.style.opacity = +elem.style.opacity - (new Date() - last) / 100; + last = +new Date(); + + if (+elem.style.opacity > 0) { + setTimeout(tick, interval); + } else { + elem.style.display = 'none'; + } + }; + tick(); + }, + fireClick = function(node) { + // Taken from http://www.nonobtrusive.com/2011/11/29/programatically-fire-crossbrowser-click-event-with-javascript/ + // Then fixed for today's Chrome browser. + if (MouseEvent) { + // Up-to-date approach + var mevt = new MouseEvent('click', { + view: window, + bubbles: false, + cancelable: true + }); + node.dispatchEvent(mevt); + } else if ( document.createEvent ) { + // Fallback + var evt = document.createEvent('MouseEvents'); + evt.initEvent('click', false, false); + node.dispatchEvent(evt); + } else if( document.createEventObject ) { + node.fireEvent('onclick') ; + } else if (typeof node.onclick === 'function' ) { + node.onclick(); + } + }, + stopEventPropagation = function(e) { + // In particular, make sure the space bar doesn't scroll the main window. + if (typeof e.stopPropagation === 'function') { + e.stopPropagation(); + e.preventDefault(); + } else if (window.event && window.event.hasOwnProperty('cancelBubble')) { + window.event.cancelBubble = true; + } + }; + + // Remember state in cases where opening and handling a modal will fiddle with it. + var previousActiveElement, + previousDocumentClick, + previousWindowKeyDown, + lastFocusedButton; + + /* + * Add modal + overlay to DOM + */ + + window.sweetAlertInitialize = function() { + var sweetHTML = '

Title

Text

', + sweetWrap = document.createElement('div'); + + sweetWrap.innerHTML = sweetHTML; + + // For readability: check sweet-alert.html + document.body.appendChild(sweetWrap); + + // For development use only! + /*jQuery.ajax({ + url: '../lib/sweet-alert.html', // Change path depending on file location + dataType: 'html' + }) + .done(function(html) { + jQuery('body').append(html); + });*/ + } + + /* + * Global sweetAlert function + */ + + window.sweetAlert = window.swal = function() { + if (arguments[0] === undefined) { + window.console.error('sweetAlert expects at least 1 attribute!'); + return false; + } + + var params = extend({}, defaultParams); + + switch (typeof arguments[0]) { + + case 'string': + params.title = arguments[0]; + params.text = arguments[1] || ''; + params.type = arguments[2] || ''; + + break; + + case 'object': + if (arguments[0].title === undefined) { + window.console.error('Missing "title" argument!'); + return false; + } + + params.title = arguments[0].title; + params.text = arguments[0].text || defaultParams.text; + params.type = arguments[0].type || defaultParams.type; + params.allowOutsideClick = arguments[0].allowOutsideClick || defaultParams.allowOutsideClick; + params.showCancelButton = arguments[0].showCancelButton !== undefined ? arguments[0].showCancelButton : defaultParams.showCancelButton; + params.closeOnConfirm = arguments[0].closeOnConfirm !== undefined ? arguments[0].closeOnConfirm : defaultParams.closeOnConfirm; + params.closeOnCancel = arguments[0].closeOnCancel !== undefined ? arguments[0].closeOnCancel : defaultParams.closeOnCancel; + params.timer = arguments[0].timer || defaultParams.timer; + + // Show "Confirm" instead of "OK" if cancel button is visible + params.confirmButtonText = (defaultParams.showCancelButton) ? 'Confirm' : defaultParams.confirmButtonText; + params.confirmButtonText = arguments[0].confirmButtonText || defaultParams.confirmButtonText; + params.confirmButtonClass = arguments[0].confirmButtonClass || defaultParams.confirmButtonClass; + params.cancelButtonText = arguments[0].cancelButtonText || defaultParams.cancelButtonText; + params.imageUrl = arguments[0].imageUrl || defaultParams.imageUrl; + params.imageSize = arguments[0].imageSize || defaultParams.imageSize; + params.doneFunction = arguments[1] || null; + + break; + + default: + window.console.error('Unexpected type of argument! Expected "string" or "object", got ' + typeof arguments[0]); + return false; + + } + + setParameters(params); + fixVerticalPosition(); + openModal(); + + + // Modal interactions + var modal = getModal(); + + // Mouse interactions + var onButtonEvent = function(e) { + + var target = e.target || e.srcElement, + targetedConfirm = (target.className.indexOf('confirm') > -1), + modalIsVisible = hasClass(modal, 'visible'), + doneFunctionExists = (params.doneFunction && modal.getAttribute('data-has-done-function') === 'true'); + + switch (e.type) { + case ("click"): + if (targetedConfirm && doneFunctionExists && modalIsVisible) { // Clicked "confirm" + + params.doneFunction(true); + + if (params.closeOnConfirm) { + closeModal(); + } + } else if (doneFunctionExists && modalIsVisible) { // Clicked "cancel" + + // Check if callback function expects a parameter (to track cancel actions) + var functionAsStr = String(params.doneFunction).replace(/\s/g, ''); + var functionHandlesCancel = functionAsStr.substring(0, 9) === "function(" && functionAsStr.substring(9, 10) !== ")"; + + if (functionHandlesCancel) { + params.doneFunction(false); + } + + if (params.closeOnCancel) { + closeModal(); + } + } else { + closeModal(); + } + + break; + } + }; + + var $buttons = modal.querySelectorAll('button'); + for (var i = 0; i < $buttons.length; i++) { + $buttons[i].onclick = onButtonEvent; + } + + // Remember the current document.onclick event. + previousDocumentClick = document.onclick; + document.onclick = function(e) { + var target = e.target || e.srcElement; + + var clickedOnModal = (modal === target), + clickedOnModalChild = isDescendant(modal, e.target), + modalIsVisible = hasClass(modal, 'visible'), + outsideClickIsAllowed = modal.getAttribute('data-allow-ouside-click') === 'true'; + + if (!clickedOnModal && !clickedOnModalChild && modalIsVisible && outsideClickIsAllowed) { + closeModal(); + } + }; + + + // Keyboard interactions + var $okButton = modal.querySelector('button.confirm'), + $cancelButton = modal.querySelector('button.cancel'), + $modalButtons = modal.querySelectorAll('button:not([type=hidden])'); + + + function handleKeyDown(e) { + var keyCode = e.keyCode || e.which; + + if ([9,13,32,27].indexOf(keyCode) === -1) { + // Don't do work on keys we don't care about. + return; + } + + var $targetElement = e.target || e.srcElement; + + var btnIndex = -1; // Find the button - note, this is a nodelist, not an array. + for (var i = 0; i < $modalButtons.length; i++) { + if ($targetElement === $modalButtons[i]) { + btnIndex = i; + break; + } + } + + if (keyCode === 9) { + // TAB + if (btnIndex === -1) { + // No button focused. Jump to the confirm button. + $targetElement = $okButton; + } else { + // Cycle to the next button + if (btnIndex === $modalButtons.length - 1) { + $targetElement = $modalButtons[0]; + } else { + $targetElement = $modalButtons[btnIndex + 1]; + } + } + + stopEventPropagation(e); + $targetElement.focus(); + + } else { + if (keyCode === 13 || keyCode === 32) { + if (btnIndex === -1) { + // ENTER/SPACE clicked outside of a button. + $targetElement = $okButton; + } else { + // Do nothing - let the browser handle it. + $targetElement = undefined; + } + } else if (keyCode === 27 && !($cancelButton.hidden || $cancelButton.style.display === 'none')) { + // ESC to cancel only if there's a cancel button displayed (like the alert() window). + $targetElement = $cancelButton; + } else { + // Fallback - let the browser handle it. + $targetElement = undefined; + } + + if ($targetElement !== undefined) { + fireClick($targetElement, e); + } + } + } + + previousWindowKeyDown = window.onkeydown; + window.onkeydown = handleKeyDown; + + function handleOnBlur(e) { + var $targetElement = e.target || e.srcElement, + $focusElement = e.relatedTarget, + modalIsVisible = hasClass(modal, 'visible'); + + if (modalIsVisible) { + var btnIndex = -1; // Find the button - note, this is a nodelist, not an array. + + if ($focusElement !== null) { + // If we picked something in the DOM to focus to, let's see if it was a button. + for (var i = 0; i < $modalButtons.length; i++) { + if ($focusElement === $modalButtons[i]) { + btnIndex = i; + break; + } + } + + if (btnIndex === -1) { + // Something in the dom, but not a visible button. Focus back on the button. + $targetElement.focus(); + } + } else { + // Exiting the DOM (e.g. clicked in the URL bar); + lastFocusedButton = $targetElement; + } + } + } + + $okButton.onblur = handleOnBlur; + $cancelButton.onblur = handleOnBlur; + + window.onfocus = function() { + // When the user has focused away and focused back from the whole window. + window.setTimeout(function() { + // Put in a timeout to jump out of the event sequence. Calling focus() in the event + // sequence confuses things. + if (lastFocusedButton !== undefined) { + lastFocusedButton.focus(); + lastFocusedButton = undefined; + } + }, 0); + }; + }; + + /** + * Set default params for each popup + * @param {Object} userParams + */ + window.swal.setDefaults = function(userParams) { + if (!userParams) { + throw new Error('userParams is required'); + } + if (typeof userParams !== 'object') { + throw new Error('userParams has to be a object'); + } + + extend(defaultParams, userParams); + }; + + /* + * Set type, text and actions on modal + */ + + function setParameters(params) { + var modal = getModal(); + + var $title = modal.querySelector('h2'), + $text = modal.querySelector('p'), + $cancelBtn = modal.querySelector('button.cancel'), + $confirmBtn = modal.querySelector('button.confirm'); + + // Title + $title.innerHTML = escapeHtml(params.title).split("\n").join("
"); + + // Text + $text.innerHTML = escapeHtml(params.text || '').split("\n").join("
"); + if (params.text) { + show($text); + } + + // Icon + hide(modal.querySelectorAll('.icon')); + if (params.type) { + var validType = false; + for (var i = 0; i < alertTypes.length; i++) { + if (params.type === alertTypes[i]) { + validType = true; + break; + } + } + if (!validType) { + window.console.error('Unknown alert type: ' + params.type); + return false; + } + var $icon = modal.querySelector('.icon.' + params.type); + show($icon); + + // Animate icon + switch (params.type) { + case "success": + addClass($icon, 'animate'); + addClass($icon.querySelector('.tip'), 'animateSuccessTip'); + addClass($icon.querySelector('.long'), 'animateSuccessLong'); + break; + case "error": + addClass($icon, 'animateErrorIcon'); + addClass($icon.querySelector('.x-mark'), 'animateXMark'); + break; + case "warning": + addClass($icon, 'pulseWarning'); + addClass($icon.querySelector('.body'), 'pulseWarningIns'); + addClass($icon.querySelector('.dot'), 'pulseWarningIns'); + break; + } + + } + + // Custom image + if (params.imageUrl) { + var $customIcon = modal.querySelector('.icon.custom'); + + $customIcon.style.backgroundImage = 'url(' + params.imageUrl + ')'; + show($customIcon); + + var _imgWidth = 80, + _imgHeight = 80; + + if (params.imageSize) { + var imgWidth = params.imageSize.split('x')[0]; + var imgHeight = params.imageSize.split('x')[1]; + + if (!imgWidth || !imgHeight) { + window.console.error("Parameter imageSize expects value with format WIDTHxHEIGHT, got " + params.imageSize); + } else { + _imgWidth = imgWidth; + _imgHeight = imgHeight; + + $customIcon.css({ + 'width': imgWidth + 'px', + 'height': imgHeight + 'px' + }); + } + } + $customIcon.setAttribute('style', $customIcon.getAttribute('style') + 'width:' + _imgWidth + 'px; height:' + _imgHeight + 'px'); + } + + // Cancel button + modal.setAttribute('data-has-cancel-button', params.showCancelButton); + if (params.showCancelButton) { + $cancelBtn.style.display = 'inline-block'; + } else { + hide($cancelBtn); + } + + // Edit text on cancel and confirm buttons + if (params.cancelButtonText) { + $cancelBtn.innerHTML = escapeHtml(params.cancelButtonText); + } + if (params.confirmButtonText) { + $confirmBtn.innerHTML = escapeHtml(params.confirmButtonText); + } + + // Reset confirm buttons to default class (Ugly fix) + $confirmBtn.className = 'confirm btn btn-lg' + + // Set confirm button to selected class + addClass($confirmBtn, params.confirmButtonClass); + + // Allow outside click? + modal.setAttribute('data-allow-ouside-click', params.allowOutsideClick); + + // Done-function + var hasDoneFunction = (params.doneFunction) ? true : false; + modal.setAttribute('data-has-done-function', hasDoneFunction); + + // Close timer + modal.setAttribute('data-timer', params.timer); + } + + + /* + * Set hover, active and focus-states for buttons (source: http://www.sitepoint.com/javascript-generate-lighter-darker-color) + */ + + function colorLuminance(hex, lum) { + // Validate hex string + hex = String(hex).replace(/[^0-9a-f]/gi, ''); + if (hex.length < 6) { + hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]; + } + lum = lum || 0; + + // Convert to decimal and change luminosity + var rgb = "#", c, i; + for (i = 0; i < 3; i++) { + c = parseInt(hex.substr(i*2,2), 16); + c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16); + rgb += ("00"+c).substr(c.length); + } + + return rgb; + } + + function extend(a, b){ + for (var key in b) { + if (b.hasOwnProperty(key)) { + a[key] = b[key]; + } + } + + return a; + } + + function hexToRgb(hex) { + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? parseInt(result[1], 16) + ', ' + parseInt(result[2], 16) + ', ' + parseInt(result[3], 16) : null; + } + + // Add box-shadow style to button (depending on its chosen bg-color) + function setFocusStyle($button, bgColor) { + var rgbColor = hexToRgb(bgColor); + $button.style.boxShadow = '0 0 2px rgba(' + rgbColor +', 0.8), inset 0 0 0 1px rgba(0, 0, 0, 0.05)'; + } + + + /* + * Animations + */ + + function openModal() { + var modal = getModal(); + fadeIn(getOverlay(), 10); + show(modal); + addClass(modal, 'showSweetAlert'); + removeClass(modal, 'hideSweetAlert'); + + previousActiveElement = document.activeElement; + var $okButton = modal.querySelector('button.confirm'); + $okButton.focus(); + + setTimeout(function() { + addClass(modal, 'visible'); + }, 500); + + var timer = modal.getAttribute('data-timer'); + if (timer !== "null" && timer !== "") { + setTimeout(function() { + closeModal(); + }, timer); + } + } + + function closeModal() { + var modal = getModal(); + fadeOut(getOverlay(), 5); + fadeOut(modal, 5); + removeClass(modal, 'showSweetAlert'); + addClass(modal, 'hideSweetAlert'); + removeClass(modal, 'visible'); + + + // Reset icon animations + + var $successIcon = modal.querySelector('.icon.success'); + removeClass($successIcon, 'animate'); + removeClass($successIcon.querySelector('.tip'), 'animateSuccessTip'); + removeClass($successIcon.querySelector('.long'), 'animateSuccessLong'); + + var $errorIcon = modal.querySelector('.icon.error'); + removeClass($errorIcon, 'animateErrorIcon'); + removeClass($errorIcon.querySelector('.x-mark'), 'animateXMark'); + + var $warningIcon = modal.querySelector('.icon.warning'); + removeClass($warningIcon, 'pulseWarning'); + removeClass($warningIcon.querySelector('.body'), 'pulseWarningIns'); + removeClass($warningIcon.querySelector('.dot'), 'pulseWarningIns'); + + + // Reset the page to its previous state + window.onkeydown = previousWindowKeyDown; + document.onclick = previousDocumentClick; + if (previousActiveElement) { + previousActiveElement.focus(); + } + lastFocusedButton = undefined; + } + + + /* + * Set "margin-top"-property on modal based on its computed height + */ + + function fixVerticalPosition() { + var modal = getModal(); + modal.style.marginTop = getTopMargin(getModal()); + } + + + /* + * If library is injected after page has loaded + */ + + (function () { + if (document.readyState === "complete" || document.readyState === "interactive" && document.body) { + sweetAlertInitialize(); + } else { + if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', function factorial() { + document.removeEventListener('DOMContentLoaded', arguments.callee, false); + sweetAlertInitialize(); + }, false); + } else if (document.attachEvent) { + document.attachEvent('onreadystatechange', function() { + if (document.readyState === 'complete') { + document.detachEvent('onreadystatechange', arguments.callee); + sweetAlertInitialize(); + } + }); + } + } + })(); + +})(window, document); diff --git a/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.less b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.less new file mode 100644 index 0000000..ddc4296 --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.less @@ -0,0 +1,254 @@ +// SweetAlert +// 2014 (c) - Tristan Edwards +// github.com/t4t5/sweetalert + +@import "sweet-alert-animations"; + +.sweet-overlay { + background-color: fade(#000, 40%); + + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + + display: none; + z-index: @zindex-modal; +} + +.sweet-alert { + @width: 478px; + @padding: 17px; + + background-color: @body-bg; + width: @width; + padding: @padding; + border-radius: 5px; + text-align: center; + + position: fixed; + left: 50%; + top: 50%; + margin-left: -(@width / 2 + @padding); + margin-top: -200px; + + overflow: hidden; + display: none; + z-index: 2000; + + @media all and (max-width: @screen-xs-max) { + width: auto; + margin-left: 0; + margin-right: 0; + + left: (@grid-gutter-width / 2); + right: (@grid-gutter-width / 2); + } + + .icon { + width: 80px; + height: 80px; + border: 4px solid gray; + border-radius: 50%; + margin: 20px auto; + position: relative; + box-sizing: content-box; + + &.error { + border-color: @btn-danger-border; + + .x-mark { + position: relative; + display: block; + } + + .line { + position: absolute; + height: 5px; + width: 47px; + background-color: @btn-danger-bg; + display: block; + top: 37px; + border-radius: 2px; + + &.left { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + left: 17px; + } + &.right { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + right: 16px; + } + } + } + &.warning { + border-color: @btn-warning-border; + + .body { // Exclamation mark body + position: absolute; + width: 5px; + height: 47px; + left: 50%; + top: 10px; + border-radius: 2px; + margin-left: -2px; + background-color: @btn-warning-bg; + } + .dot { // Exclamation mark dot + position: absolute; + width: 7px; + height: 7px; + border-radius: 50%; + margin-left: -3px; + left: 50%; + bottom: 10px; + background-color: @btn-warning-bg; + } + } + &.info { + border-color: @btn-info-border; + + &::before { // i-letter body + content: ""; + position: absolute; + width: 5px; + height: 29px; + left: 50%; + bottom: 17px; + border-radius: 2px; + margin-left: -2px; + background-color: @btn-info-bg; + } + &::after { // i-letter dot + content: ""; + position: absolute; + width: 7px; + height: 7px; + border-radius: 50%; + margin-left: -3px; + top: 19px; + background-color: @btn-info-bg; + } + } + &.success { + border-color: @btn-success-border; + + &::before, &::after { // Emulate moving circular line + content: ''; + border-radius: 50%; + position: absolute; + width: 60px; + height: 120px; + background: white; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } + &::before { + border-radius: 120px 0 0 120px; + top: -7px; + left: -33px; + + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: 60px 60px; + transform-origin: 60px 60px; + } + &::after { + border-radius: 0 120px 120px 0; + top: -11px; + left: 30px; + + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: 0px 60px; + transform-origin: 0px 60px; + } + + .placeholder { // Ring + width: 80px; + height: 80px; + border: 4px solid fade(@brand-success, 20%); + border-radius: 50%; + box-sizing: content-box; + + position: absolute; + left: -4px; + top: -4px; + z-index: 2; + } + + .fix { // Hide corners left from animation + width: 5px; + height: 90px; + background-color: @body-bg; + + position: absolute; + left: 28px; + top: 8px; + z-index: 1; + + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + } + + .line { + height: 5px; + background-color: @btn-success-bg; + display: block; + border-radius: 2px; + + position: absolute; + z-index: 2; + + &.tip { + width: 25px; + + left: 14px; + top: 46px; + + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + } + &.long { + width: 47px; + + right: 8px; + top: 38px; + + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + } + } + } + &.custom { + background-size: contain; + border-radius: 0; + border: none; + background-position: center center; + background-repeat: no-repeat; + } + } + + .btn-default { + .form-control-focus(@btn-default-border); + } + .btn-success { + .form-control-focus(@btn-success-border); + } + .btn-info { + .form-control-focus(@btn-info-border); + } + .btn-danger { + .form-control-focus(@btn-danger-border); + } + .btn-warning { + .form-control-focus(@btn-warning-border); + } + + button::-moz-focus-inner { + border: 0; + } +} diff --git a/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.min.js b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.min.js new file mode 100644 index 0000000..3940548 --- /dev/null +++ b/webapp/app/components/bootstrap-sweetalert/lib/sweet-alert.min.js @@ -0,0 +1 @@ +!function(a,b){function c(b){var c=p(),d=c.querySelector("h2"),e=c.querySelector("p"),f=c.querySelector("button.cancel"),g=c.querySelector("button.confirm");if(d.innerHTML=u(b.title).split("\n").join("
"),e.innerHTML=u(b.text||"").split("\n").join("
"),b.text&&w(e),y(c.querySelectorAll(".icon")),b.type){for(var h=!1,i=0;i=0;)c=c.replace(" "+b+" "," ");a.className=c.replace(/^\s+|\s+$/g,"")}},u=function(a){var c=b.createElement("div");return c.appendChild(b.createTextNode(a)),c.innerHTML},v=function(a){a.style.opacity="",a.style.display="block"},w=function(a){if(a&&!a.length)return v(a);for(var b=0;b0?setTimeout(d,b):a.style.display="none"};d()},D=function(c){if(MouseEvent){var d=new MouseEvent("click",{view:a,bubbles:!1,cancelable:!0});c.dispatchEvent(d)}else if(b.createEvent){var e=b.createEvent("MouseEvents");e.initEvent("click",!1,!1),c.dispatchEvent(e)}else b.createEventObject?c.fireEvent("onclick"):"function"==typeof c.onclick&&c.onclick()},E=function(b){"function"==typeof b.stopPropagation?(b.stopPropagation(),b.preventDefault()):a.event&&a.event.hasOwnProperty("cancelBubble")&&(a.event.cancelBubble=!0)};a.sweetAlertInitialize=function(){var a='

Title

Text

',c=b.createElement("div");c.innerHTML=a,b.body.appendChild(c)},a.sweetAlert=a.swal=function(){function h(a){var b=a.keyCode||a.which;if(-1!==[9,13,32,27].indexOf(b)){for(var c=a.target||a.srcElement,d=-1,e=0;e-1,d=r(n,"visible"),e=m.doneFunction&&"true"===n.getAttribute("data-has-done-function");switch(a.type){case"click":if(c&&e&&d)m.doneFunction(!0),m.closeOnConfirm&&f();else if(e&&d){var g=String(m.doneFunction).replace(/\s/g,""),h="function("===g.substring(0,9)&&")"!==g.substring(9,10);h&&m.doneFunction(!1),m.closeOnCancel&&f()}else f()}},s=n.querySelectorAll("button"),t=0;t", + "licenses": [ + { + "type": "MIT", + "url": "http://opensource.org/licenses/MIT" + } + ], + "repository" : { + "type" : "git", + "url" : "http://github.com/lipis/bootstrap-sweetalert" + }, + "dependencies": { + "bootstrap": "~3" + }, + "devDependencies": { + "grunt": "~0", + "grunt-contrib-connect": "~0", + "grunt-contrib-less": "~0.10", + "grunt-contrib-watch": "~0", + "grunt-contrib-uglify": "~0", + "grunt-open": "~0", + "load-grunt-tasks": "~0" + } +} diff --git a/webapp/app/components/sweetalert/.bower.json b/webapp/app/components/sweetalert/.bower.json index 04dcd16..52430d8 100644 --- a/webapp/app/components/sweetalert/.bower.json +++ b/webapp/app/components/sweetalert/.bower.json @@ -25,7 +25,7 @@ "tag": "v0.3.2", "commit": "11c6cd37dc5d0fea88a25e7c80da27e9f28227db" }, - "_source": "git://github.com/t4t5/sweetalert.git", - "_target": "~0.3.1", + "_source": "https://github.com/t4t5/sweetalert.git", + "_target": "~0.3.2", "_originalSource": "sweetalert" } \ No newline at end of file diff --git a/webapp/app/index.html b/webapp/app/index.html index dea6aab..18be2db 100644 --- a/webapp/app/index.html +++ b/webapp/app/index.html @@ -24,7 +24,7 @@ - + @@ -75,7 +75,7 @@ - + diff --git a/webapp/app/js/app.js b/webapp/app/js/app.js index ea82262..9dd4c66 100644 --- a/webapp/app/js/app.js +++ b/webapp/app/js/app.js @@ -3,6 +3,6 @@ KylinApp = angular.module('kylin', ['ngRoute', 'ngResource', 'ngGrid', 'ui.boots KylinApp.config(['rainbowBarProvider', function(rainbowBarProvider) { "use strict"; rainbowBarProvider.configure({ - barThickness: 5 + barThickness: 10 }); -}]); +}]); \ No newline at end of file diff --git a/webapp/app/js/controllers/page.js b/webapp/app/js/controllers/page.js index 9ef4bc1..31f5bc7 100644 --- a/webapp/app/js/controllers/page.js +++ b/webapp/app/js/controllers/page.js @@ -176,7 +176,6 @@ var projCtrl = function ($scope, $modalInstance, ProjectService, MessageService, newDescription: $scope.proj.description }; ProjectService.update({}, requestBody, function (newProj) { -// MessageService.sendMsg("Project update successfully!", 'success'); SweetAlert.swal('Success!', 'Project update successfully!', 'success'); $modalInstance.dismiss('cancel'); }); @@ -184,7 +183,6 @@ var projCtrl = function ($scope, $modalInstance, ProjectService, MessageService, else { ProjectService.save({}, $scope.proj, function (newProj) { -// MessageService.sendMsg("New project created successfully", 'success'); SweetAlert.swal('Success!', 'New project created successfully!', 'success'); $modalInstance.dismiss('cancel'); if(projects) { diff --git a/webapp/app/js/controllers/sourceMeta.js b/webapp/app/js/controllers/sourceMeta.js index 69d25e8..862080d 100644 --- a/webapp/app/js/controllers/sourceMeta.js +++ b/webapp/app/js/controllers/sourceMeta.js @@ -159,8 +159,26 @@ KylinApp rainbowBar.show(); loadingRequest.show(); TableService.loadHiveTable({tableName: $scope.tableNames,action:projectName}, {}, function (result) { -// MessageService.sendMsg('Below tables were synced successfully: ' + result['result'].join() + ', Click Refresh button ...', 'success', {}); - SweetAlert.swal('Success!','Below tables were synced successfully: ' + result['result'].join() , 'success'); + var loadTableInfo=""; + angular.forEach(result['result.loaded'],function(table){ + loadTableInfo+="\n"+table; + }) + var unloadedTableInfo=""; + angular.forEach(result['result.unloaded'],function(table){ + unloadedTableInfo+="\n"+table; + }) + + if(result['result.unloaded'].length!=0&&result['result.loaded'].length==0){ + SweetAlert.swal('Failed!','Failed to synchronize following table(s): ' + unloadedTableInfo , 'error'); + } + if(result['result.loaded'].length!=0&&result['result.unloaded'].length==0){ + SweetAlert.swal('Success!','The following table(s) have been successfully synchronized: ' + loadTableInfo , 'success'); + } + if(result['result.loaded'].length!=0&&result['result.unloaded'].length!=0){ + SweetAlert.swal('Partial loaded!','The following table(s) have been successfully synchronized: ' + loadTableInfo+"\n Failed to synchronize following table(s):" + unloadedTableInfo, 'warning'); + } + + rainbowBar.hide(); loadingRequest.hide(); hiveTbLoad.status="success"; diff --git a/webapp/app/less/app.less b/webapp/app/less/app.less index 47cb21a..f2d4eee 100644 --- a/webapp/app/less/app.less +++ b/webapp/app/less/app.less @@ -499,7 +499,14 @@ background-color:#ffffff; .showbox{position:fixed;top:0;left:50%;z-index:9999;opacity:0;filter:alpha(opacity=0);margin-left:-80px;} *html,*html body{background-image:url(about:blank);background-attachment:fixed;} //*html .showbox,*html .loadingOverlay{position:absolute;top:expression(eval(document.documentElement.scrollTop));} -#loadingCntnr{border:1px solid #8CBEDA;color:#37a;font-size:18px;font-weight:bold;} +#loadingCntnr{ +// border:1px solid #8CBEDA;color:#37a;font-size:18px;font-weight:bold; + color: #797979; + font-size: 16px; + font-weight: 300; + line-height: normal; +} + #loadingCntnr div.loadingWord{width:200px;height:70px;line-height:70px;border:2px solid #D6E7F2;background:#fff;} #loadingCntnr img{margin:17px 15px;float:left;display:inline;} diff --git a/webapp/bower.json b/webapp/bower.json index 039162e..9eeb416 100644 --- a/webapp/bower.json +++ b/webapp/bower.json @@ -21,7 +21,8 @@ "nvd3": "1.1.15-beta", "angularjs-nvd3-directives": "0.0.5-beta", "sweetalert": "~0.3.2", - "angular-sweetalert": "~1.0.3" + "angular-sweetalert": "~1.0.3", + "bootstrap-sweetalert": "~0.4.3" }, "devDependencies": { "less.js": "~1.4.0", diff --git a/webapp/grunt.json b/webapp/grunt.json index 0b50e31..6ecf097 100644 --- a/webapp/grunt.json +++ b/webapp/grunt.json @@ -33,7 +33,7 @@ "app/components/d3/d3.min.js", "app/components/nvd3/nv.d3.min.js", "app/components/angularjs-nvd3-directives/dist/angularjs-nvd3-directives.js", - "app/components/sweetalert/lib/sweet-alert.js", + "app/components/bootstrap-sweetalert/lib/sweet-alert.js", "app/components/angular-sweetalert/SweetAlert.js", "tmp/js/scripts.js" ], @@ -54,7 +54,7 @@ "app/components/angular-chosen-localytics/chosen-spinner.css", "app/components/nvd3/nv.d3.min.css", "app/components/ace/css/AdminLTE.css", - "app/components/sweetalert/lib/sweet-alert.css", + "app/components/bootstrap-sweetalert/lib/sweet-alert.css", "tmp/css/styles.css" ], "dest": "tmp/css/styles.min.css"