├── .bowerrc ├── .gitignore ├── LICENSE ├── README.md ├── bower.json ├── config.json ├── index.js ├── modules ├── ignite │ ├── rest-controller.js │ └── rest-service.js ├── logger.js ├── router.js ├── ui │ ├── css │ │ ├── animate.css │ │ ├── app.css │ │ ├── bootstrap.css │ │ ├── font-awesome.min.css │ │ ├── font.css │ │ ├── simple-line-icons.css │ │ └── smart-table.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── Simple-Line-Icons.eot │ │ ├── Simple-Line-Icons.svg │ │ ├── Simple-Line-Icons.ttf │ │ ├── Simple-Line-Icons.woff │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ ├── glyphicons-halflings-regular.woff2 │ │ └── sourcesanspro │ │ │ ├── sourcesanspro-bold.woff │ │ │ ├── sourcesanspro-light.woff │ │ │ └── sourcesanspro.woff │ ├── img │ │ ├── logo-small.png │ │ └── logo.png │ ├── index.html │ ├── l10n │ │ └── en.js │ └── modules │ │ ├── app │ │ ├── app-controller.js │ │ ├── app.js │ │ ├── config.js │ │ ├── lazyload.js │ │ ├── main.js │ │ └── router.js │ │ ├── ignite │ │ ├── cache │ │ │ ├── cache-controller.js │ │ │ └── default.html │ │ ├── master.html │ │ ├── rest │ │ │ ├── default.html │ │ │ ├── rest-controller.js │ │ │ └── rest-service.js │ │ └── topology │ │ │ ├── default.html │ │ │ └── topology-controller.js │ │ └── layout │ │ ├── aside.html │ │ ├── header-controller.js │ │ ├── header.html │ │ ├── master.html │ │ ├── nav.html │ │ └── page-sizer-directive.js └── web-server.js └── package.json /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "modules/ui/bower_components/" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.csv 2 | *.dat 3 | *.iml 4 | *.log 5 | *.out 6 | *.pid 7 | *.seed 8 | *.sublime-* 9 | *.swo 10 | *.swp 11 | *.tgz 12 | *.xml 13 | .DS_Store 14 | .idea 15 | .project 16 | .strong-pm 17 | coverage 18 | node_modules 19 | npm-debug.log 20 | bower_components 21 | amps-standalone 22 | db 23 | store.db 24 | prod 25 | data -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | 167 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # aiex 2 | Apache Ignite Extensions 3 | ##maintainer needed 4 | 5 | 12 | 13 |

Summary

14 | Apache Ignite Extensions is a modular system to create user interface modules for interacting with application deployed 15 | in Apache Ignite.
16 | 17 | 18 | 19 |

Current Features

20 | aeix can currently shows a basic view of topology and supports invocation of all caching related operations. 21 | 22 | 26 | 27 | 28 |

Topology Viewer

29 | 34 | 35 | 36 |

Cache Operations

37 | 38 | 39 |

How To Install

40 | 41 | The application requires node runtime. If you are familiar with node and npm standard deployment/development workflow, 42 | you can skip to the Quick Setup section below. Otherwise read on.. 43 | 44 |

Setup

45 | Given below is the overall setup process: 46 | 47 | 55 | 56 |

Ubuntu

57 |

58 | Following instructions were tested on freshly provisioned EC2 server ubuntu-trusty-14.04-amd64. Your mileage may vary depending on your OS. 59 |

60 | 61 |

Step 1: Install git

62 |

63 | 64 | sudo apt-get update 65 |
66 | 67 | sudo apt-get install git 68 | 69 |

70 |

71 | For information on how to install git for your operating system please refer to: 72 | https://git-scm.com/book/en/v2/Getting-Started-Installing-Git. 73 |

74 | 75 | 76 |

Step 2: Install nodejs

77 |

78 | 79 | curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash - 80 |
81 | 82 | sudo apt-get install -y nodejs 83 | 84 |

85 | 86 |

87 | For information on how to install nodejs for your operating system please refer to: 88 | https://nodejs.org/en/download/package-manager/ 89 |

90 | 91 | 92 |

Step 3: Clone the repo

93 |

94 | 95 | git clone https://github.com/sumeet70/aiex.git 96 |
97 |

98 | 99 |

Step 4: Install bower

100 |

101 | 102 | sudo npm install bower -g 103 | 104 |

105 | 106 | 107 |

Step 5: Install all npm packages

108 |

Change the current directory to project root and install npm dependencies

109 |

110 | 111 | cd aiex 112 |
113 | 114 | npm install 115 | 116 |

117 | 118 | 119 |

Step 6: Install all bower packages

120 |

121 | 122 | bower install 123 | 124 |

125 | 126 |

Step 7: Start the server

127 |

128 | Although it is recommended that you run the next command as is, but it can fail under certain circumstance. If that is the case, try running it as a sudoer. 129 | One of the conditions under which it is likely to fail is if you set the default port to be port 80 in /config.json, 130 | since port 80 access is blocked by some OS builds it only runs as sudo. 131 | There can be other permissions issues along the way that might prevent you from starting up a node process without sudo. 132 |

133 |

134 | 135 | export IGNITE_REST=localhost:8080 #optional 136 | npm start 137 | 138 |

139 |

If you run into security problems run sudo npm start

140 | 141 |

Windows

142 |

143 | Following instructions were tested on freshly provisioned EC2 windows machine. Your mileage may vary depending on your OS. 144 |

145 | 146 |

Step 1: Install git

147 |

148 | http://git-scm.com/download/win 149 |

150 |

151 | For information on how to install git for your operating system please refer to: 152 | https://git-scm.com/book/en/v2/Getting-Started-Installing-Git. 153 |

154 | 155 | 156 |

Step 2: Install nodejs

157 |

158 | 159 | https://nodejs.org/en/download/ 160 | 161 |

162 |

163 | For information on how to install nodejs for your operating system please refer to: 164 | https://nodejs.org/en/download/package-manager/ 165 |

166 | 167 | 168 |

Step 3: Clone the repo

169 |

Open command prompt or your favorite shell as admin

170 |

171 | 172 | git clone https://github.com/sumeet70/aiex.git 173 |
174 |

175 | 176 |

Step 4: Install bower

177 |

This step will usually fail if you don't run the following command as admin

178 |

179 | 180 | npm install bower -g 181 | 182 |

183 | 184 | 185 |

Step 5: Install all npm packages

186 |

Change the current directory to project root and install npm dependencies

187 |

188 | 189 | cd aiex 190 |
191 | 192 | npm install 193 | 194 |

195 | 196 | 197 |

Step 6: Install all bower packages

198 |

199 | 200 | bower install 201 | 202 |

203 | 204 |

Step 7: Start the server

205 |

206 | 207 | export IGNITE_REST=localhost:8080 #optional 208 | npm start 209 | 210 |

211 | 212 |

Quick Setup

213 | Follow these instructions if you are already setup with node, npm, bower and git.
214 | These instructions assume that you already have npm and git on your path 215 | 226 | 227 | The application backend runs in node using expressjs as middleware. The front end of the application has been written in Angularjs 1.4. 228 | 229 |

Usage Guide

230 |

231 | The current version assumes that the ignite rest api is running on default localhost:8080 location. 232 | Additionally, if you want to run cache operations, you need to run ignite with caching enabled. 233 |

234 | 235 |

Enable REST Interface

236 |

237 | In order to run ignite with REST api you need to load an optional library called ignite-rest-http
238 | Simply go to /libs/optional folder in the root directory of your install and copy ignite-rest-http folder to /libs and then restart ignite. 239 |

240 |

Please visit ignite docs for additional information on ignite setup: https://apacheignite.readme.io/docs/getting-started

241 | 242 |

Enable Caching

243 |

244 | To enable caching in ignite cluster you need to supply some basic configurations. When starting up your cluster, use one of the example configuration that already 245 | ships with ignite code: /examples/config/example-cahce.xml

246 |

Please visit ignite docs for additional information on ignite setup: https://apacheignite.readme.io/docs/getting-started

247 | 248 |

249 | You need to supply this configuration path as a command line parameter to ignite startup script ignite.sh (ignite.bat in windows command prompt). 250 | This script is located in /bin directory of your installation root.
251 |

252 | 253 |

254 | You start up command should look like:
255 | 256 | [Install Dir]/bin/ignite.sh [Install Dir]/examples/config/example-cahce.xml
257 | replace [Install Dir] with path to your installation directory. 258 |

259 | 260 |

Startup aiex

261 |

262 |

268 |

269 | 270 |

Upcoming Features

271 | 276 | 277 |

This project is under active development. Stay tuned for more.

278 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aeixui", 3 | "version": "0.0.1", 4 | "authors": [ 5 | "Sumeet Singh" 6 | ], 7 | "description": "Web UI for aeix", 8 | "keywords": ["Apache Ignite", "Aeix", "Ignite REST API"], 9 | "license": "GPL", 10 | "homepage": "", 11 | "private": true, 12 | "ignore": [ 13 | "**/.*", 14 | "node_modules", 15 | "bower_components", 16 | "test", 17 | "tests" 18 | ], 19 | "dependencies": { 20 | "angular": "~1.3.11", 21 | "angular-animate": "~1.3.11", 22 | "angular-cookies": "~1.3.11", 23 | "angular-resource": "~1.3.11", 24 | "angular-sanitize": "~1.3.11", 25 | "angular-touch": "~1.3.11", 26 | "angular-translate": "~2.5.2", 27 | "angular-translate-loader-static-files": "~2.5.2", 28 | "angular-translate-storage-cookie": "~2.5.2", 29 | "angular-translate-storage-local": "~2.5.2", 30 | "angular-bootstrap": "~0.12.0", 31 | "angular-bootstrap-nav-tree": "*", 32 | "angular-ui-router": "~0.2.11", 33 | "angular-ui-utils": "~0.2.1", 34 | "angular-file-upload": "~1.1.1", 35 | "angular-ui-select": "~0.8.3", 36 | "angular-ui-calendar": "latest", 37 | "angular-ui-grid": "~3.0.0-rc.16", 38 | "angular-xeditable": "~0.1.8", 39 | "angular-smart-table": "~1.4.9", 40 | "angularjs-toaster": "~0.4.8", 41 | "ng-grid": "~2.0.13", 42 | "ngImgCrop": "~0.2.0", 43 | "ngstorage": "~0.3.0", 44 | "oclazyload": "~0.5.1", 45 | "textAngular": "~1.2.2", 46 | "venturocket-angular-slider": "~0.3.2", 47 | "jquery": "~2.1.3", 48 | "animate.css": "~3.2.0", 49 | "bootstrap": "~3.3.0", 50 | "bootstrap-filestyle": "~1.1.2", 51 | "bootstrap-slider": "*", 52 | "bootstrap-touchspin": "~3.0.1", 53 | "bootstrap-wysiwyg": "*", 54 | "bower-jvectormap": "~1.2.2", 55 | "bootstrap-chosen": "~1.0.0", 56 | "chosen": "https://github.com/harvesthq/chosen/releases/download/v1.3.0/chosen_v1.3.0.zip", 57 | "datatables": "~1.10.4", 58 | "plugins": "datatables/plugins#~1.0.1", 59 | "footable": "~2.0.3", 60 | "font-awesome": "~4.2.0", 61 | "fullcalendar": "~2.2.6", 62 | "html5sortable": "*", 63 | "moment": "~2.10.3", 64 | "nestable": "*", 65 | "screenfull": "~1.2.1", 66 | "slimscroll": "~1.3.3", 67 | "simple-line-icons": "~0.1.1", 68 | "jquery_appear": "~0.3.3", 69 | "jquery.easy-pie-chart": "~2.1.6", 70 | "jquery.sparkline": "~2.1.2", 71 | "flot": "~0.8.3", 72 | "flot.tooltip": "~0.8.4", 73 | "flot.orderbars": "*", 74 | "bootstrap-daterangepicker": "~1.3.17", 75 | "bootstrap-tagsinput": "~0.4.2", 76 | "underscore": "~1.8.2", 77 | "d3": "~3.5.5", 78 | "moment-range": "~2.0.2", 79 | "socket.io-client": "~1.3.5", 80 | "livereload-js": "~2.2.1" 81 | }, 82 | "resolutions": { 83 | "angular-cookies": "~1.3.11", 84 | "angular-touch": "~1.3.11", 85 | "angular": "~1.3.11", 86 | "angular-sanitize": "~1.3.x", 87 | "jquery": "~2.1.3", 88 | "fullcalendar": "~2.2.6", 89 | "moment": "~2.10.3", 90 | "bootstrap": "~3.3.0", 91 | "d3": "~3.5.5" 92 | } 93 | } -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "development":{ 3 | "rootPath":"/api", 4 | "port": 8081, 5 | "zmqSocketAddress":"tcp://127.0.0.1:5555" 6 | } 7 | } 8 | 9 | 10 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | //Setup env variable 2 | process.env.PWD = process.env.PWD || process.cwd(); 3 | var arguments = process.argv.slice(2); 4 | var env = process.env.NODE_ENV; 5 | if(env === undefined){ env = "development"; } 6 | 7 | var app = require('express')(); 8 | app.set('env',env); 9 | 10 | 11 | //Load Configuration File 12 | var jsonFile = require('json-file-plus'); 13 | var path = require('path'); 14 | var configFile = path.join(process.cwd(), 'config.json'); 15 | if(arguments.length > 0){ configFile = arguments[0]; } 16 | 17 | jsonFile(configFile, function (err, file) { 18 | if (err) { console.log(err); } 19 | global.logger = require('./modules/logger')(env); 20 | var activeConfig = file.data[env]; 21 | 22 | global.logger.info("Configuration loaded successfully from %s", configFile, activeConfig); 23 | require('./modules/web-server')(app, activeConfig); 24 | }); -------------------------------------------------------------------------------- /modules/ignite/rest-controller.js: -------------------------------------------------------------------------------- 1 | var logger = global.logger; 2 | var _ = require('underscore'); 3 | var restService = require('./rest-service'); 4 | 5 | module.exports = function(){ 6 | 7 | var restController = function () { 8 | 9 | var restServiceInstance = new restService(); 10 | var apiMethods = [ "log", "version", "decrement", "increment", 11 | "cachemetrics", "cas", "prepend", "append", "rep", "rmvall", "remove", "add", "putall", "put", "getall", "get", 12 | "node", "top", "execute"] 13 | 14 | var me = this; 15 | _.forEach(apiMethods, function(methodName){ 16 | me[methodName] = function (req, res) { 17 | try{ 18 | logger.info(req.query); 19 | 20 | restServiceInstance.proxyCall(methodName, req.query).then(function(result){ 21 | res.send(result); 22 | }); 23 | }catch(error){ 24 | logger.error("Error", { "method": methodName, "error": error.message }); 25 | res.status(417).send(error); 26 | } 27 | }; 28 | }); 29 | } 30 | 31 | return new restController(); 32 | }; -------------------------------------------------------------------------------- /modules/ignite/rest-service.js: -------------------------------------------------------------------------------- 1 | var q = require('q'); 2 | var _ = require('underscore'); 3 | var logger = global.logger; 4 | var request = require("request"); 5 | var rootUrl = "http://" + process.env.IGNITE_REST + "/ignite?cmd=" || "http://localhost:8080/ignite?cmd="; 6 | 7 | module.exports = function() { 8 | this.proxyCall = function(methodName, query){ 9 | var deferred = q.defer(); 10 | 11 | request({ 12 | method:"GET", 13 | uri: rootUrl + methodName, 14 | qs: query 15 | } , function (error, response, body) { 16 | if (error) { 17 | logger.info(error); 18 | deferred.reject(error); 19 | } else { 20 | logger.info("Resolved"); 21 | deferred.resolve(body); 22 | } 23 | }); 24 | 25 | return deferred.promise; 26 | } 27 | }; 28 | -------------------------------------------------------------------------------- /modules/logger.js: -------------------------------------------------------------------------------- 1 | var winston = require('winston'); 2 | 3 | module.exports = function(){ 4 | 5 | var logger; 6 | var env = global.env; 7 | if(env === undefined){ 8 | env = 'development'; 9 | } 10 | 11 | if(env === 'development'){ 12 | winston.remove(winston.transports.Console); 13 | 14 | logger = new (winston.Logger)({ 15 | transports: [ 16 | new (winston.transports.Console)({ 17 | timestamp:true, 18 | level:'debug' 19 | }) 20 | ] 21 | }); 22 | }else{ 23 | 24 | } 25 | global.logger = logger; 26 | return logger; 27 | }; 28 | -------------------------------------------------------------------------------- /modules/router.js: -------------------------------------------------------------------------------- 1 | var _ = require('underscore'); 2 | 3 | module.exports = function(app,router){ 4 | 5 | var igniteRestController = require('./ignite/rest-controller')(app); 6 | 7 | var apiMethods = [ "log", "version", "decrement", "increment", "cachemetrics", "cas", 8 | "prepend", "append", "rep", "rmvall", "remove", "add", "putall", "put", 9 | "getall", "get", "node", "top", "execute"] 10 | _.forEach(apiMethods, function(methodName){ 11 | router.get('/ignite/' + methodName, igniteRestController[methodName]); 12 | }); 13 | } 14 | -------------------------------------------------------------------------------- /modules/ui/css/animate.css: -------------------------------------------------------------------------------- 1 | .animated{ 2 | -webkit-animation-fill-mode:both; 3 | -moz-animation-fill-mode:both; 4 | -ms-animation-fill-mode:both; 5 | -o-animation-fill-mode:both; 6 | animation-fill-mode:both; 7 | -webkit-animation-duration:0.5s; 8 | -moz-animation-duration:0.5s; 9 | -ms-animation-duration:0.5s; 10 | -o-animation-duration:0.5s; 11 | animation-duration:0.5s; 12 | } 13 | 14 | @-webkit-keyframes fadeIn { 15 | 0% {opacity: 0;} 100% {opacity: 1;} 16 | } 17 | 18 | @-moz-keyframes fadeIn { 19 | 0% {opacity: 0;} 20 | 100% {opacity: 1;} 21 | } 22 | 23 | @-o-keyframes fadeIn { 24 | 0% {opacity: 0;} 25 | 100% {opacity: 1;} 26 | } 27 | 28 | @keyframes fadeIn { 29 | 0% {opacity: 0;} 30 | 100% {opacity: 1;} 31 | } 32 | 33 | .fadeIn { 34 | -webkit-animation-name: fadeIn; 35 | -moz-animation-name: fadeIn; 36 | -o-animation-name: fadeIn; 37 | animation-name: fadeIn; 38 | } 39 | @-webkit-keyframes fadeInUp { 40 | 0% { 41 | opacity: 0; 42 | -webkit-transform: translateY(20px); 43 | } 44 | 45 | 100% { 46 | opacity: 1; 47 | -webkit-transform: translateY(0); 48 | } 49 | } 50 | 51 | @-moz-keyframes fadeInUp { 52 | 0% { 53 | opacity: 0; 54 | -moz-transform: translateY(20px); 55 | } 56 | 57 | 100% { 58 | opacity: 1; 59 | -moz-transform: translateY(0); 60 | } 61 | } 62 | 63 | @-o-keyframes fadeInUp { 64 | 0% { 65 | opacity: 0; 66 | -o-transform: translateY(20px); 67 | } 68 | 69 | 100% { 70 | opacity: 1; 71 | -o-transform: translateY(0); 72 | } 73 | } 74 | 75 | @keyframes fadeInUp { 76 | 0% { 77 | opacity: 0; 78 | transform: translateY(20px); 79 | } 80 | 81 | 100% { 82 | opacity: 1; 83 | transform: translateY(0); 84 | } 85 | } 86 | 87 | .fadeInUp { 88 | -webkit-animation-name: fadeInUp; 89 | -moz-animation-name: fadeInUp; 90 | -o-animation-name: fadeInUp; 91 | animation-name: fadeInUp; 92 | } 93 | @-webkit-keyframes fadeInDown { 94 | 0% { 95 | opacity: 0; 96 | -webkit-transform: translateY(-20px); 97 | } 98 | 99 | 100% { 100 | opacity: 1; 101 | -webkit-transform: translateY(0); 102 | } 103 | } 104 | 105 | @-moz-keyframes fadeInDown { 106 | 0% { 107 | opacity: 0; 108 | -moz-transform: translateY(-20px); 109 | } 110 | 111 | 100% { 112 | opacity: 1; 113 | -moz-transform: translateY(0); 114 | } 115 | } 116 | 117 | @-o-keyframes fadeInDown { 118 | 0% { 119 | opacity: 0; 120 | -o-transform: translateY(-20px); 121 | } 122 | 123 | 100% { 124 | opacity: 1; 125 | -o-transform: translateY(0); 126 | } 127 | } 128 | 129 | @keyframes fadeInDown { 130 | 0% { 131 | opacity: 0; 132 | transform: translateY(-20px); 133 | } 134 | 135 | 100% { 136 | opacity: 1; 137 | transform: translateY(0); 138 | } 139 | } 140 | 141 | .fadeInDown { 142 | -webkit-animation-name: fadeInDown; 143 | -moz-animation-name: fadeInDown; 144 | -o-animation-name: fadeInDown; 145 | animation-name: fadeInDown; 146 | } 147 | @-webkit-keyframes fadeInLeft { 148 | 0% { 149 | opacity: 0; 150 | -webkit-transform: translateX(-20px); 151 | } 152 | 153 | 100% { 154 | opacity: 1; 155 | -webkit-transform: translateX(0); 156 | } 157 | } 158 | 159 | @-moz-keyframes fadeInLeft { 160 | 0% { 161 | opacity: 0; 162 | -moz-transform: translateX(-20px); 163 | } 164 | 165 | 100% { 166 | opacity: 1; 167 | -moz-transform: translateX(0); 168 | } 169 | } 170 | 171 | @-o-keyframes fadeInLeft { 172 | 0% { 173 | opacity: 0; 174 | -o-transform: translateX(-20px); 175 | } 176 | 177 | 100% { 178 | opacity: 1; 179 | -o-transform: translateX(0); 180 | } 181 | } 182 | 183 | @keyframes fadeInLeft { 184 | 0% { 185 | opacity: 0; 186 | transform: translateX(-20px); 187 | } 188 | 189 | 100% { 190 | opacity: 1; 191 | transform: translateX(0); 192 | } 193 | } 194 | 195 | .fadeInLeft { 196 | -webkit-animation-name: fadeInLeft; 197 | -moz-animation-name: fadeInLeft; 198 | -o-animation-name: fadeInLeft; 199 | animation-name: fadeInLeft; 200 | } 201 | @-webkit-keyframes fadeInRight { 202 | 0% { 203 | opacity: 0; 204 | -webkit-transform: translateX(20px); 205 | } 206 | 207 | 100% { 208 | opacity: 1; 209 | -webkit-transform: translateX(0); 210 | } 211 | } 212 | 213 | @-moz-keyframes fadeInRight { 214 | 0% { 215 | opacity: 0; 216 | -moz-transform: translateX(20px); 217 | } 218 | 219 | 100% { 220 | opacity: 1; 221 | -moz-transform: translateX(0); 222 | } 223 | } 224 | 225 | @-o-keyframes fadeInRight { 226 | 0% { 227 | opacity: 0; 228 | -o-transform: translateX(20px); 229 | } 230 | 231 | 100% { 232 | opacity: 1; 233 | -o-transform: translateX(0); 234 | } 235 | } 236 | 237 | @keyframes fadeInRight { 238 | 0% { 239 | opacity: 0; 240 | transform: translateX(20px); 241 | } 242 | 243 | 100% { 244 | opacity: 1; 245 | transform: translateX(0); 246 | } 247 | } 248 | 249 | .fadeInRight { 250 | -webkit-animation-name: fadeInRight; 251 | -moz-animation-name: fadeInRight; 252 | -o-animation-name: fadeInRight; 253 | animation-name: fadeInRight; 254 | } 255 | @-webkit-keyframes fadeInUpBig { 256 | 0% { 257 | opacity: 0; 258 | -webkit-transform: translateY(2000px); 259 | } 260 | 261 | 100% { 262 | opacity: 1; 263 | -webkit-transform: translateY(0); 264 | } 265 | } 266 | 267 | @-moz-keyframes fadeInUpBig { 268 | 0% { 269 | opacity: 0; 270 | -moz-transform: translateY(2000px); 271 | } 272 | 273 | 100% { 274 | opacity: 1; 275 | -moz-transform: translateY(0); 276 | } 277 | } 278 | 279 | @-o-keyframes fadeInUpBig { 280 | 0% { 281 | opacity: 0; 282 | -o-transform: translateY(2000px); 283 | } 284 | 285 | 100% { 286 | opacity: 1; 287 | -o-transform: translateY(0); 288 | } 289 | } 290 | 291 | @keyframes fadeInUpBig { 292 | 0% { 293 | opacity: 0; 294 | transform: translateY(2000px); 295 | } 296 | 297 | 100% { 298 | opacity: 1; 299 | transform: translateY(0); 300 | } 301 | } 302 | 303 | .fadeInUpBig { 304 | -webkit-animation-name: fadeInUpBig; 305 | -moz-animation-name: fadeInUpBig; 306 | -o-animation-name: fadeInUpBig; 307 | animation-name: fadeInUpBig; 308 | } 309 | @-webkit-keyframes fadeInDownBig { 310 | 0% { 311 | opacity: 0; 312 | -webkit-transform: translateY(-2000px); 313 | } 314 | 315 | 100% { 316 | opacity: 1; 317 | -webkit-transform: translateY(0); 318 | } 319 | } 320 | 321 | @-moz-keyframes fadeInDownBig { 322 | 0% { 323 | opacity: 0; 324 | -moz-transform: translateY(-2000px); 325 | } 326 | 327 | 100% { 328 | opacity: 1; 329 | -moz-transform: translateY(0); 330 | } 331 | } 332 | 333 | @-o-keyframes fadeInDownBig { 334 | 0% { 335 | opacity: 0; 336 | -o-transform: translateY(-2000px); 337 | } 338 | 339 | 100% { 340 | opacity: 1; 341 | -o-transform: translateY(0); 342 | } 343 | } 344 | 345 | @keyframes fadeInDownBig { 346 | 0% { 347 | opacity: 0; 348 | transform: translateY(-2000px); 349 | } 350 | 351 | 100% { 352 | opacity: 1; 353 | transform: translateY(0); 354 | } 355 | } 356 | 357 | .fadeInDownBig { 358 | -webkit-animation-name: fadeInDownBig; 359 | -moz-animation-name: fadeInDownBig; 360 | -o-animation-name: fadeInDownBig; 361 | animation-name: fadeInDownBig; 362 | } 363 | @-webkit-keyframes fadeInLeftBig { 364 | 0% { 365 | opacity: 0; 366 | -webkit-transform: translateX(-2000px); 367 | } 368 | 369 | 100% { 370 | opacity: 1; 371 | -webkit-transform: translateX(0); 372 | } 373 | } 374 | @-moz-keyframes fadeInLeftBig { 375 | 0% { 376 | opacity: 0; 377 | -moz-transform: translateX(-2000px); 378 | } 379 | 380 | 100% { 381 | opacity: 1; 382 | -moz-transform: translateX(0); 383 | } 384 | } 385 | @-o-keyframes fadeInLeftBig { 386 | 0% { 387 | opacity: 0; 388 | -o-transform: translateX(-2000px); 389 | } 390 | 391 | 100% { 392 | opacity: 1; 393 | -o-transform: translateX(0); 394 | } 395 | } 396 | @keyframes fadeInLeftBig { 397 | 0% { 398 | opacity: 0; 399 | transform: translateX(-2000px); 400 | } 401 | 402 | 100% { 403 | opacity: 1; 404 | transform: translateX(0); 405 | } 406 | } 407 | 408 | .fadeInLeftBig { 409 | -webkit-animation-name: fadeInLeftBig; 410 | -moz-animation-name: fadeInLeftBig; 411 | -o-animation-name: fadeInLeftBig; 412 | animation-name: fadeInLeftBig; 413 | } 414 | @-webkit-keyframes fadeInRightBig { 415 | 0% { 416 | opacity: 0; 417 | -webkit-transform: translateX(2000px); 418 | } 419 | 420 | 100% { 421 | opacity: 1; 422 | -webkit-transform: translateX(0); 423 | } 424 | } 425 | 426 | @-moz-keyframes fadeInRightBig { 427 | 0% { 428 | opacity: 0; 429 | -moz-transform: translateX(2000px); 430 | } 431 | 432 | 100% { 433 | opacity: 1; 434 | -moz-transform: translateX(0); 435 | } 436 | } 437 | 438 | @-o-keyframes fadeInRightBig { 439 | 0% { 440 | opacity: 0; 441 | -o-transform: translateX(2000px); 442 | } 443 | 444 | 100% { 445 | opacity: 1; 446 | -o-transform: translateX(0); 447 | } 448 | } 449 | 450 | @keyframes fadeInRightBig { 451 | 0% { 452 | opacity: 0; 453 | transform: translateX(2000px); 454 | } 455 | 456 | 100% { 457 | opacity: 1; 458 | transform: translateX(0); 459 | } 460 | } 461 | 462 | .fadeInRightBig { 463 | -webkit-animation-name: fadeInRightBig; 464 | -moz-animation-name: fadeInRightBig; 465 | -o-animation-name: fadeInRightBig; 466 | animation-name: fadeInRightBig; 467 | } 468 | @-webkit-keyframes fadeOut { 469 | 0% {opacity: 1;} 470 | 100% {opacity: 0;} 471 | } 472 | 473 | @-moz-keyframes fadeOut { 474 | 0% {opacity: 1;} 475 | 100% {opacity: 0;} 476 | } 477 | 478 | @-o-keyframes fadeOut { 479 | 0% {opacity: 1;} 480 | 100% {opacity: 0;} 481 | } 482 | 483 | @keyframes fadeOut { 484 | 0% {opacity: 1;} 485 | 100% {opacity: 0;} 486 | } 487 | 488 | .fadeOut { 489 | -webkit-animation-name: fadeOut; 490 | -moz-animation-name: fadeOut; 491 | -o-animation-name: fadeOut; 492 | animation-name: fadeOut; 493 | } 494 | @-webkit-keyframes fadeOutUp { 495 | 0% { 496 | opacity: 1; 497 | -webkit-transform: translateY(0); 498 | } 499 | 500 | 100% { 501 | opacity: 0; 502 | -webkit-transform: translateY(-20px); 503 | } 504 | } 505 | @-moz-keyframes fadeOutUp { 506 | 0% { 507 | opacity: 1; 508 | -moz-transform: translateY(0); 509 | } 510 | 511 | 100% { 512 | opacity: 0; 513 | -moz-transform: translateY(-20px); 514 | } 515 | } 516 | @-o-keyframes fadeOutUp { 517 | 0% { 518 | opacity: 1; 519 | -o-transform: translateY(0); 520 | } 521 | 522 | 100% { 523 | opacity: 0; 524 | -o-transform: translateY(-20px); 525 | } 526 | } 527 | @keyframes fadeOutUp { 528 | 0% { 529 | opacity: 1; 530 | transform: translateY(0); 531 | } 532 | 533 | 100% { 534 | opacity: 0; 535 | transform: translateY(-20px); 536 | } 537 | } 538 | 539 | .fadeOutUp { 540 | -webkit-animation-name: fadeOutUp; 541 | -moz-animation-name: fadeOutUp; 542 | -o-animation-name: fadeOutUp; 543 | animation-name: fadeOutUp; 544 | } 545 | @-webkit-keyframes fadeOutDown { 546 | 0% { 547 | opacity: 1; 548 | -webkit-transform: translateY(0); 549 | } 550 | 551 | 100% { 552 | opacity: 0; 553 | -webkit-transform: translateY(20px); 554 | } 555 | } 556 | 557 | @-moz-keyframes fadeOutDown { 558 | 0% { 559 | opacity: 1; 560 | -moz-transform: translateY(0); 561 | } 562 | 563 | 100% { 564 | opacity: 0; 565 | -moz-transform: translateY(20px); 566 | } 567 | } 568 | 569 | @-o-keyframes fadeOutDown { 570 | 0% { 571 | opacity: 1; 572 | -o-transform: translateY(0); 573 | } 574 | 575 | 100% { 576 | opacity: 0; 577 | -o-transform: translateY(20px); 578 | } 579 | } 580 | 581 | @keyframes fadeOutDown { 582 | 0% { 583 | opacity: 1; 584 | transform: translateY(0); 585 | } 586 | 587 | 100% { 588 | opacity: 0; 589 | transform: translateY(20px); 590 | } 591 | } 592 | 593 | .fadeOutDown { 594 | -webkit-animation-name: fadeOutDown; 595 | -moz-animation-name: fadeOutDown; 596 | -o-animation-name: fadeOutDown; 597 | animation-name: fadeOutDown; 598 | } 599 | @-webkit-keyframes fadeOutLeft { 600 | 0% { 601 | opacity: 1; 602 | -webkit-transform: translateX(0); 603 | } 604 | 605 | 100% { 606 | opacity: 0; 607 | -webkit-transform: translateX(-20px); 608 | } 609 | } 610 | 611 | @-moz-keyframes fadeOutLeft { 612 | 0% { 613 | opacity: 1; 614 | -moz-transform: translateX(0); 615 | } 616 | 617 | 100% { 618 | opacity: 0; 619 | -moz-transform: translateX(-20px); 620 | } 621 | } 622 | 623 | @-o-keyframes fadeOutLeft { 624 | 0% { 625 | opacity: 1; 626 | -o-transform: translateX(0); 627 | } 628 | 629 | 100% { 630 | opacity: 0; 631 | -o-transform: translateX(-20px); 632 | } 633 | } 634 | 635 | @keyframes fadeOutLeft { 636 | 0% { 637 | opacity: 1; 638 | transform: translateX(0); 639 | } 640 | 641 | 100% { 642 | opacity: 0; 643 | transform: translateX(-20px); 644 | } 645 | } 646 | 647 | .fadeOutLeft { 648 | -webkit-animation-name: fadeOutLeft; 649 | -moz-animation-name: fadeOutLeft; 650 | -o-animation-name: fadeOutLeft; 651 | animation-name: fadeOutLeft; 652 | } 653 | @-webkit-keyframes fadeOutRight { 654 | 0% { 655 | opacity: 1; 656 | -webkit-transform: translateX(0); 657 | } 658 | 659 | 100% { 660 | opacity: 0; 661 | -webkit-transform: translateX(20px); 662 | } 663 | } 664 | 665 | @-moz-keyframes fadeOutRight { 666 | 0% { 667 | opacity: 1; 668 | -moz-transform: translateX(0); 669 | } 670 | 671 | 100% { 672 | opacity: 0; 673 | -moz-transform: translateX(20px); 674 | } 675 | } 676 | 677 | @-o-keyframes fadeOutRight { 678 | 0% { 679 | opacity: 1; 680 | -o-transform: translateX(0); 681 | } 682 | 683 | 100% { 684 | opacity: 0; 685 | -o-transform: translateX(20px); 686 | } 687 | } 688 | 689 | @keyframes fadeOutRight { 690 | 0% { 691 | opacity: 1; 692 | transform: translateX(0); 693 | } 694 | 695 | 100% { 696 | opacity: 0; 697 | transform: translateX(20px); 698 | } 699 | } 700 | 701 | .fadeOutRight { 702 | -webkit-animation-name: fadeOutRight; 703 | -moz-animation-name: fadeOutRight; 704 | -o-animation-name: fadeOutRight; 705 | animation-name: fadeOutRight; 706 | } 707 | @-webkit-keyframes fadeOutUpBig { 708 | 0% { 709 | opacity: 1; 710 | -webkit-transform: translateY(0); 711 | } 712 | 713 | 100% { 714 | opacity: 0; 715 | -webkit-transform: translateY(-2000px); 716 | } 717 | } 718 | 719 | @-moz-keyframes fadeOutUpBig { 720 | 0% { 721 | opacity: 1; 722 | -moz-transform: translateY(0); 723 | } 724 | 725 | 100% { 726 | opacity: 0; 727 | -moz-transform: translateY(-2000px); 728 | } 729 | } 730 | 731 | @-o-keyframes fadeOutUpBig { 732 | 0% { 733 | opacity: 1; 734 | -o-transform: translateY(0); 735 | } 736 | 737 | 100% { 738 | opacity: 0; 739 | -o-transform: translateY(-2000px); 740 | } 741 | } 742 | 743 | @keyframes fadeOutUpBig { 744 | 0% { 745 | opacity: 1; 746 | transform: translateY(0); 747 | } 748 | 749 | 100% { 750 | opacity: 0; 751 | transform: translateY(-2000px); 752 | } 753 | } 754 | 755 | .fadeOutUpBig { 756 | -webkit-animation-name: fadeOutUpBig; 757 | -moz-animation-name: fadeOutUpBig; 758 | -o-animation-name: fadeOutUpBig; 759 | animation-name: fadeOutUpBig; 760 | } 761 | @-webkit-keyframes fadeOutDownBig { 762 | 0% { 763 | opacity: 1; 764 | -webkit-transform: translateY(0); 765 | } 766 | 767 | 100% { 768 | opacity: 0; 769 | -webkit-transform: translateY(2000px); 770 | } 771 | } 772 | 773 | @-moz-keyframes fadeOutDownBig { 774 | 0% { 775 | opacity: 1; 776 | -moz-transform: translateY(0); 777 | } 778 | 779 | 100% { 780 | opacity: 0; 781 | -moz-transform: translateY(2000px); 782 | } 783 | } 784 | 785 | @-o-keyframes fadeOutDownBig { 786 | 0% { 787 | opacity: 1; 788 | -o-transform: translateY(0); 789 | } 790 | 791 | 100% { 792 | opacity: 0; 793 | -o-transform: translateY(2000px); 794 | } 795 | } 796 | 797 | @keyframes fadeOutDownBig { 798 | 0% { 799 | opacity: 1; 800 | transform: translateY(0); 801 | } 802 | 803 | 100% { 804 | opacity: 0; 805 | transform: translateY(2000px); 806 | } 807 | } 808 | 809 | .fadeOutDownBig { 810 | -webkit-animation-name: fadeOutDownBig; 811 | -moz-animation-name: fadeOutDownBig; 812 | -o-animation-name: fadeOutDownBig; 813 | animation-name: fadeOutDownBig; 814 | } 815 | @-webkit-keyframes fadeOutLeftBig { 816 | 0% { 817 | opacity: 1; 818 | -webkit-transform: translateX(0); 819 | } 820 | 821 | 100% { 822 | opacity: 0; 823 | -webkit-transform: translateX(-2000px); 824 | } 825 | } 826 | 827 | @-moz-keyframes fadeOutLeftBig { 828 | 0% { 829 | opacity: 1; 830 | -moz-transform: translateX(0); 831 | } 832 | 833 | 100% { 834 | opacity: 0; 835 | -moz-transform: translateX(-2000px); 836 | } 837 | } 838 | 839 | @-o-keyframes fadeOutLeftBig { 840 | 0% { 841 | opacity: 1; 842 | -o-transform: translateX(0); 843 | } 844 | 845 | 100% { 846 | opacity: 0; 847 | -o-transform: translateX(-2000px); 848 | } 849 | } 850 | 851 | @keyframes fadeOutLeftBig { 852 | 0% { 853 | opacity: 1; 854 | transform: translateX(0); 855 | } 856 | 857 | 100% { 858 | opacity: 0; 859 | transform: translateX(-2000px); 860 | } 861 | } 862 | 863 | .fadeOutLeftBig { 864 | -webkit-animation-name: fadeOutLeftBig; 865 | -moz-animation-name: fadeOutLeftBig; 866 | -o-animation-name: fadeOutLeftBig; 867 | animation-name: fadeOutLeftBig; 868 | } 869 | @-webkit-keyframes fadeOutRightBig { 870 | 0% { 871 | opacity: 1; 872 | -webkit-transform: translateX(0); 873 | } 874 | 875 | 100% { 876 | opacity: 0; 877 | -webkit-transform: translateX(2000px); 878 | } 879 | } 880 | @-moz-keyframes fadeOutRightBig { 881 | 0% { 882 | opacity: 1; 883 | -moz-transform: translateX(0); 884 | } 885 | 886 | 100% { 887 | opacity: 0; 888 | -moz-transform: translateX(2000px); 889 | } 890 | } 891 | @-o-keyframes fadeOutRightBig { 892 | 0% { 893 | opacity: 1; 894 | -o-transform: translateX(0); 895 | } 896 | 897 | 100% { 898 | opacity: 0; 899 | -o-transform: translateX(2000px); 900 | } 901 | } 902 | @keyframes fadeOutRightBig { 903 | 0% { 904 | opacity: 1; 905 | transform: translateX(0); 906 | } 907 | 908 | 100% { 909 | opacity: 0; 910 | transform: translateX(2000px); 911 | } 912 | } 913 | 914 | .fadeOutRightBig { 915 | -webkit-animation-name: fadeOutRightBig; 916 | -moz-animation-name: fadeOutRightBig; 917 | -o-animation-name: fadeOutRightBig; 918 | animation-name: fadeOutRightBig; 919 | } 920 | 921 | 922 | 923 | 924 | @-webkit-keyframes flipInX { 925 | 0% { 926 | -webkit-transform: perspective(400px) rotateX(90deg); 927 | opacity: 0; 928 | } 929 | 930 | 40% { 931 | -webkit-transform: perspective(400px) rotateX(-10deg); 932 | } 933 | 934 | 70% { 935 | -webkit-transform: perspective(400px) rotateX(10deg); 936 | } 937 | 938 | 100% { 939 | -webkit-transform: perspective(400px) rotateX(0deg); 940 | opacity: 1; 941 | } 942 | } 943 | @-moz-keyframes flipInX { 944 | 0% { 945 | -moz-transform: perspective(400px) rotateX(90deg); 946 | opacity: 0; 947 | } 948 | 949 | 40% { 950 | -moz-transform: perspective(400px) rotateX(-10deg); 951 | } 952 | 953 | 70% { 954 | -moz-transform: perspective(400px) rotateX(10deg); 955 | } 956 | 957 | 100% { 958 | -moz-transform: perspective(400px) rotateX(0deg); 959 | opacity: 1; 960 | } 961 | } 962 | @-o-keyframes flipInX { 963 | 0% { 964 | -o-transform: perspective(400px) rotateX(90deg); 965 | opacity: 0; 966 | } 967 | 968 | 40% { 969 | -o-transform: perspective(400px) rotateX(-10deg); 970 | } 971 | 972 | 70% { 973 | -o-transform: perspective(400px) rotateX(10deg); 974 | } 975 | 976 | 100% { 977 | -o-transform: perspective(400px) rotateX(0deg); 978 | opacity: 1; 979 | } 980 | } 981 | @keyframes flipInX { 982 | 0% { 983 | transform: perspective(400px) rotateX(90deg); 984 | opacity: 0; 985 | } 986 | 987 | 40% { 988 | transform: perspective(400px) rotateX(-10deg); 989 | } 990 | 991 | 70% { 992 | transform: perspective(400px) rotateX(10deg); 993 | } 994 | 995 | 100% { 996 | transform: perspective(400px) rotateX(0deg); 997 | opacity: 1; 998 | } 999 | } 1000 | 1001 | .animated.flipInX { 1002 | -webkit-backface-visibility: visible !important; 1003 | -webkit-animation-name: flipInX; 1004 | -moz-backface-visibility: visible !important; 1005 | -moz-animation-name: flipInX; 1006 | -o-backface-visibility: visible !important; 1007 | -o-animation-name: flipInX; 1008 | backface-visibility: visible !important; 1009 | animation-name: flipInX; 1010 | } 1011 | 1012 | @-webkit-keyframes flipInY { 1013 | 0% { 1014 | -webkit-transform: perspective(400px) rotateY(90deg); 1015 | opacity: 0; 1016 | } 1017 | 1018 | 40% { 1019 | -webkit-transform: perspective(400px) rotateY(-10deg); 1020 | } 1021 | 1022 | 70% { 1023 | -webkit-transform: perspective(400px) rotateY(10deg); 1024 | } 1025 | 1026 | 100% { 1027 | -webkit-transform: perspective(400px) rotateY(0deg); 1028 | opacity: 1; 1029 | } 1030 | } 1031 | @-moz-keyframes flipInY { 1032 | 0% { 1033 | -moz-transform: perspective(400px) rotateY(90deg); 1034 | opacity: 0; 1035 | } 1036 | 1037 | 40% { 1038 | -moz-transform: perspective(400px) rotateY(-10deg); 1039 | } 1040 | 1041 | 70% { 1042 | -moz-transform: perspective(400px) rotateY(10deg); 1043 | } 1044 | 1045 | 100% { 1046 | -moz-transform: perspective(400px) rotateY(0deg); 1047 | opacity: 1; 1048 | } 1049 | } 1050 | @-o-keyframes flipInY { 1051 | 0% { 1052 | -o-transform: perspective(400px) rotateY(90deg); 1053 | opacity: 0; 1054 | } 1055 | 1056 | 40% { 1057 | -o-transform: perspective(400px) rotateY(-10deg); 1058 | } 1059 | 1060 | 70% { 1061 | -o-transform: perspective(400px) rotateY(10deg); 1062 | } 1063 | 1064 | 100% { 1065 | -o-transform: perspective(400px) rotateY(0deg); 1066 | opacity: 1; 1067 | } 1068 | } 1069 | @keyframes flipInY { 1070 | 0% { 1071 | transform: perspective(400px) rotateY(90deg); 1072 | opacity: 0; 1073 | } 1074 | 1075 | 40% { 1076 | transform: perspective(400px) rotateY(-10deg); 1077 | } 1078 | 1079 | 70% { 1080 | transform: perspective(400px) rotateY(10deg); 1081 | } 1082 | 1083 | 100% { 1084 | transform: perspective(400px) rotateY(0deg); 1085 | opacity: 1; 1086 | } 1087 | } 1088 | 1089 | .animated.flipInY { 1090 | -webkit-backface-visibility: visible !important; 1091 | -webkit-animation-name: flipInY; 1092 | -moz-backface-visibility: visible !important; 1093 | -moz-animation-name: flipInY; 1094 | -o-backface-visibility: visible !important; 1095 | -o-animation-name: flipInY; 1096 | backface-visibility: visible !important; 1097 | animation-name: flipInY; 1098 | } -------------------------------------------------------------------------------- /modules/ui/css/font-awesome.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} -------------------------------------------------------------------------------- /modules/ui/css/font.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Source Sans Pro'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/sourcesanspro/sourcesanspro-light.woff') format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Source Sans Pro'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: local('Source Sans Pro'), local('SourceSansPro-Regular'), url('../fonts/sourcesanspro/sourcesanspro.woff') format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Source Sans Pro'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/sourcesanspro/sourcesanspro-bold.woff') format('woff'); 18 | } -------------------------------------------------------------------------------- /modules/ui/css/simple-line-icons.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Simple-Line-Icons'; 3 | src:url('../fonts/Simple-Line-Icons.eot'); 4 | src:url('../fonts/Simple-Line-Icons.eot?#iefix') format('embedded-opentype'), 5 | url('../fonts/Simple-Line-Icons.woff') format('woff'), 6 | url('../fonts/Simple-Line-Icons.ttf') format('truetype'), 7 | url('../fonts/Simple-Line-Icons.svg#Simple-Line-Icons') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | 12 | /* Use the following CSS code if you want to use data attributes for inserting your icons */ 13 | [data-icon]:before { 14 | font-family: 'Simple-Line-Icons'; 15 | content: attr(data-icon); 16 | speak: none; 17 | font-weight: normal; 18 | font-variant: normal; 19 | text-transform: none; 20 | line-height: 1; 21 | -webkit-font-smoothing: antialiased; 22 | -moz-osx-font-smoothing: grayscale; 23 | } 24 | 25 | /* Use the following CSS code if you want to have a class per icon */ 26 | /* 27 | Instead of a list of all class selectors, 28 | you can use the generic selector below, but it's slower: 29 | [class*="icon-"] { 30 | */ 31 | .icon-user-female, .icon-user-follow, .icon-user-following, .icon-user-unfollow, .icon-trophy, .icon-screen-smartphone, .icon-screen-desktop, .icon-plane, .icon-notebook, .icon-moustache, .icon-mouse, .icon-magnet, .icon-energy, .icon-emoticon-smile, .icon-disc, .icon-cursor-move, .icon-crop, .icon-credit-card, .icon-chemistry, .icon-user, .icon-speedometer, .icon-social-youtube, .icon-social-twitter, .icon-social-tumblr, .icon-social-facebook, .icon-social-dropbox, .icon-social-dribbble, .icon-shield, .icon-screen-tablet, .icon-magic-wand, .icon-hourglass, .icon-graduation, .icon-ghost, .icon-game-controller, .icon-fire, .icon-eyeglasses, .icon-envelope-open, .icon-envelope-letter, .icon-bell, .icon-badge, .icon-anchor, .icon-wallet, .icon-vector, .icon-speech, .icon-puzzle, .icon-printer, .icon-present, .icon-playlist, .icon-pin, .icon-picture, .icon-map, .icon-layers, .icon-handbag, .icon-globe-alt, .icon-globe, .icon-frame, .icon-folder-alt, .icon-film, .icon-feed, .icon-earphones-alt, .icon-earphones, .icon-drop, .icon-drawer, .icon-docs, .icon-directions, .icon-direction, .icon-diamond, .icon-cup, .icon-compass, .icon-call-out, .icon-call-in, .icon-call-end, .icon-calculator, .icon-bubbles, .icon-briefcase, .icon-book-open, .icon-basket-loaded, .icon-basket, .icon-bag, .icon-action-undo, .icon-action-redo, .icon-wrench, .icon-umbrella, .icon-trash, .icon-tag, .icon-support, .icon-size-fullscreen, .icon-size-actual, .icon-shuffle, .icon-share-alt, .icon-share, .icon-rocket, .icon-question, .icon-pie-chart, .icon-pencil, .icon-note, .icon-music-tone-alt, .icon-music-tone, .icon-microphone, .icon-loop, .icon-logout, .icon-login, .icon-list, .icon-like, .icon-home, .icon-grid, .icon-graph, .icon-equalizer, .icon-dislike, .icon-cursor, .icon-control-start, .icon-control-rewind, .icon-control-play, .icon-control-pause, .icon-control-forward, .icon-control-end, .icon-calendar, .icon-bulb, .icon-bar-chart, .icon-arrow-up, .icon-arrow-right, .icon-arrow-left, .icon-arrow-down, .icon-ban, .icon-bubble, .icon-camcorder, .icon-camera, .icon-check, .icon-clock, .icon-close, .icon-cloud-download, .icon-cloud-upload, .icon-doc, .icon-envelope, .icon-eye, .icon-flag, .icon-folder, .icon-heart, .icon-info, .icon-key, .icon-link, .icon-lock, .icon-lock-open, .icon-magnifier, .icon-magnifier-add, .icon-magnifier-remove, .icon-paper-clip, .icon-paper-plane, .icon-plus, .icon-pointer, .icon-power, .icon-refresh, .icon-reload, .icon-settings, .icon-star, .icon-symbol-female, .icon-symbol-male, .icon-target, .icon-volume-1, .icon-volume-2, .icon-volume-off, .icon-users { 32 | font-family: 'Simple-Line-Icons'; 33 | speak: none; 34 | font-style: normal; 35 | font-weight: normal; 36 | font-variant: normal; 37 | text-transform: none; 38 | line-height: 1; 39 | -webkit-font-smoothing: antialiased; 40 | } 41 | .icon-user-female:before { 42 | content: "\e000"; 43 | } 44 | .icon-user-follow:before { 45 | content: "\e002"; 46 | } 47 | .icon-user-following:before { 48 | content: "\e003"; 49 | } 50 | .icon-user-unfollow:before { 51 | content: "\e004"; 52 | } 53 | .icon-trophy:before { 54 | content: "\e006"; 55 | } 56 | .icon-screen-smartphone:before { 57 | content: "\e010"; 58 | } 59 | .icon-screen-desktop:before { 60 | content: "\e011"; 61 | } 62 | .icon-plane:before { 63 | content: "\e012"; 64 | } 65 | .icon-notebook:before { 66 | content: "\e013"; 67 | } 68 | .icon-moustache:before { 69 | content: "\e014"; 70 | } 71 | .icon-mouse:before { 72 | content: "\e015"; 73 | } 74 | .icon-magnet:before { 75 | content: "\e016"; 76 | } 77 | .icon-energy:before { 78 | content: "\e020"; 79 | } 80 | .icon-emoticon-smile:before { 81 | content: "\e021"; 82 | } 83 | .icon-disc:before { 84 | content: "\e022"; 85 | } 86 | .icon-cursor-move:before { 87 | content: "\e023"; 88 | } 89 | .icon-crop:before { 90 | content: "\e024"; 91 | } 92 | .icon-credit-card:before { 93 | content: "\e025"; 94 | } 95 | .icon-chemistry:before { 96 | content: "\e026"; 97 | } 98 | .icon-user:before { 99 | content: "\e005"; 100 | } 101 | .icon-speedometer:before { 102 | content: "\e007"; 103 | } 104 | .icon-social-youtube:before { 105 | content: "\e008"; 106 | } 107 | .icon-social-twitter:before { 108 | content: "\e009"; 109 | } 110 | .icon-social-tumblr:before { 111 | content: "\e00a"; 112 | } 113 | .icon-social-facebook:before { 114 | content: "\e00b"; 115 | } 116 | .icon-social-dropbox:before { 117 | content: "\e00c"; 118 | } 119 | .icon-social-dribbble:before { 120 | content: "\e00d"; 121 | } 122 | .icon-shield:before { 123 | content: "\e00e"; 124 | } 125 | .icon-screen-tablet:before { 126 | content: "\e00f"; 127 | } 128 | .icon-magic-wand:before { 129 | content: "\e017"; 130 | } 131 | .icon-hourglass:before { 132 | content: "\e018"; 133 | } 134 | .icon-graduation:before { 135 | content: "\e019"; 136 | } 137 | .icon-ghost:before { 138 | content: "\e01a"; 139 | } 140 | .icon-game-controller:before { 141 | content: "\e01b"; 142 | } 143 | .icon-fire:before { 144 | content: "\e01c"; 145 | } 146 | .icon-eyeglasses:before { 147 | content: "\e01d"; 148 | } 149 | .icon-envelope-open:before { 150 | content: "\e01e"; 151 | } 152 | .icon-envelope-letter:before { 153 | content: "\e01f"; 154 | } 155 | .icon-bell:before { 156 | content: "\e027"; 157 | } 158 | .icon-badge:before { 159 | content: "\e028"; 160 | } 161 | .icon-anchor:before { 162 | content: "\e029"; 163 | } 164 | .icon-wallet:before { 165 | content: "\e02a"; 166 | } 167 | .icon-vector:before { 168 | content: "\e02b"; 169 | } 170 | .icon-speech:before { 171 | content: "\e02c"; 172 | } 173 | .icon-puzzle:before { 174 | content: "\e02d"; 175 | } 176 | .icon-printer:before { 177 | content: "\e02e"; 178 | } 179 | .icon-present:before { 180 | content: "\e02f"; 181 | } 182 | .icon-playlist:before { 183 | content: "\e030"; 184 | } 185 | .icon-pin:before { 186 | content: "\e031"; 187 | } 188 | .icon-picture:before { 189 | content: "\e032"; 190 | } 191 | .icon-map:before { 192 | content: "\e033"; 193 | } 194 | .icon-layers:before { 195 | content: "\e034"; 196 | } 197 | .icon-handbag:before { 198 | content: "\e035"; 199 | } 200 | .icon-globe-alt:before { 201 | content: "\e036"; 202 | } 203 | .icon-globe:before { 204 | content: "\e037"; 205 | } 206 | .icon-frame:before { 207 | content: "\e038"; 208 | } 209 | .icon-folder-alt:before { 210 | content: "\e039"; 211 | } 212 | .icon-film:before { 213 | content: "\e03a"; 214 | } 215 | .icon-feed:before { 216 | content: "\e03b"; 217 | } 218 | .icon-earphones-alt:before { 219 | content: "\e03c"; 220 | } 221 | .icon-earphones:before { 222 | content: "\e03d"; 223 | } 224 | .icon-drop:before { 225 | content: "\e03e"; 226 | } 227 | .icon-drawer:before { 228 | content: "\e03f"; 229 | } 230 | .icon-docs:before { 231 | content: "\e040"; 232 | } 233 | .icon-directions:before { 234 | content: "\e041"; 235 | } 236 | .icon-direction:before { 237 | content: "\e042"; 238 | } 239 | .icon-diamond:before { 240 | content: "\e043"; 241 | } 242 | .icon-cup:before { 243 | content: "\e044"; 244 | } 245 | .icon-compass:before { 246 | content: "\e045"; 247 | } 248 | .icon-call-out:before { 249 | content: "\e046"; 250 | } 251 | .icon-call-in:before { 252 | content: "\e047"; 253 | } 254 | .icon-call-end:before { 255 | content: "\e048"; 256 | } 257 | .icon-calculator:before { 258 | content: "\e049"; 259 | } 260 | .icon-bubbles:before { 261 | content: "\e04a"; 262 | } 263 | .icon-briefcase:before { 264 | content: "\e04b"; 265 | } 266 | .icon-book-open:before { 267 | content: "\e04c"; 268 | } 269 | .icon-basket-loaded:before { 270 | content: "\e04d"; 271 | } 272 | .icon-basket:before { 273 | content: "\e04e"; 274 | } 275 | .icon-bag:before { 276 | content: "\e04f"; 277 | } 278 | .icon-action-undo:before { 279 | content: "\e050"; 280 | } 281 | .icon-action-redo:before { 282 | content: "\e051"; 283 | } 284 | .icon-wrench:before { 285 | content: "\e052"; 286 | } 287 | .icon-umbrella:before { 288 | content: "\e053"; 289 | } 290 | .icon-trash:before { 291 | content: "\e054"; 292 | } 293 | .icon-tag:before { 294 | content: "\e055"; 295 | } 296 | .icon-support:before { 297 | content: "\e056"; 298 | } 299 | .icon-size-fullscreen:before { 300 | content: "\e057"; 301 | } 302 | .icon-size-actual:before { 303 | content: "\e058"; 304 | } 305 | .icon-shuffle:before { 306 | content: "\e059"; 307 | } 308 | .icon-share-alt:before { 309 | content: "\e05a"; 310 | } 311 | .icon-share:before { 312 | content: "\e05b"; 313 | } 314 | .icon-rocket:before { 315 | content: "\e05c"; 316 | } 317 | .icon-question:before { 318 | content: "\e05d"; 319 | } 320 | .icon-pie-chart:before { 321 | content: "\e05e"; 322 | } 323 | .icon-pencil:before { 324 | content: "\e05f"; 325 | } 326 | .icon-note:before { 327 | content: "\e060"; 328 | } 329 | .icon-music-tone-alt:before { 330 | content: "\e061"; 331 | } 332 | .icon-music-tone:before { 333 | content: "\e062"; 334 | } 335 | .icon-microphone:before { 336 | content: "\e063"; 337 | } 338 | .icon-loop:before { 339 | content: "\e064"; 340 | } 341 | .icon-logout:before { 342 | content: "\e065"; 343 | } 344 | .icon-login:before { 345 | content: "\e066"; 346 | } 347 | .icon-list:before { 348 | content: "\e067"; 349 | } 350 | .icon-like:before { 351 | content: "\e068"; 352 | } 353 | .icon-home:before { 354 | content: "\e069"; 355 | } 356 | .icon-grid:before { 357 | content: "\e06a"; 358 | } 359 | .icon-graph:before { 360 | content: "\e06b"; 361 | } 362 | .icon-equalizer:before { 363 | content: "\e06c"; 364 | } 365 | .icon-dislike:before { 366 | content: "\e06d"; 367 | } 368 | .icon-cursor:before { 369 | content: "\e06e"; 370 | } 371 | .icon-control-start:before { 372 | content: "\e06f"; 373 | } 374 | .icon-control-rewind:before { 375 | content: "\e070"; 376 | } 377 | .icon-control-play:before { 378 | content: "\e071"; 379 | } 380 | .icon-control-pause:before { 381 | content: "\e072"; 382 | } 383 | .icon-control-forward:before { 384 | content: "\e073"; 385 | } 386 | .icon-control-end:before { 387 | content: "\e074"; 388 | } 389 | .icon-calendar:before { 390 | content: "\e075"; 391 | } 392 | .icon-bulb:before { 393 | content: "\e076"; 394 | } 395 | .icon-bar-chart:before { 396 | content: "\e077"; 397 | } 398 | .icon-arrow-up:before { 399 | content: "\e078"; 400 | } 401 | .icon-arrow-right:before { 402 | content: "\e079"; 403 | } 404 | .icon-arrow-left:before { 405 | content: "\e07a"; 406 | } 407 | .icon-arrow-down:before { 408 | content: "\e07b"; 409 | } 410 | .icon-ban:before { 411 | content: "\e07c"; 412 | } 413 | .icon-bubble:before { 414 | content: "\e07d"; 415 | } 416 | .icon-camcorder:before { 417 | content: "\e07e"; 418 | } 419 | .icon-camera:before { 420 | content: "\e07f"; 421 | } 422 | .icon-check:before { 423 | content: "\e080"; 424 | } 425 | .icon-clock:before { 426 | content: "\e081"; 427 | } 428 | .icon-close:before { 429 | content: "\e082"; 430 | } 431 | .icon-cloud-download:before { 432 | content: "\e083"; 433 | } 434 | .icon-cloud-upload:before { 435 | content: "\e084"; 436 | } 437 | .icon-doc:before { 438 | content: "\e085"; 439 | } 440 | .icon-envelope:before { 441 | content: "\e086"; 442 | } 443 | .icon-eye:before { 444 | content: "\e087"; 445 | } 446 | .icon-flag:before { 447 | content: "\e088"; 448 | } 449 | .icon-folder:before { 450 | content: "\e089"; 451 | } 452 | .icon-heart:before { 453 | content: "\e08a"; 454 | } 455 | .icon-info:before { 456 | content: "\e08b"; 457 | } 458 | .icon-key:before { 459 | content: "\e08c"; 460 | } 461 | .icon-link:before { 462 | content: "\e08d"; 463 | } 464 | .icon-lock:before { 465 | content: "\e08e"; 466 | } 467 | .icon-lock-open:before { 468 | content: "\e08f"; 469 | } 470 | .icon-magnifier:before { 471 | content: "\e090"; 472 | } 473 | .icon-magnifier-add:before { 474 | content: "\e091"; 475 | } 476 | .icon-magnifier-remove:before { 477 | content: "\e092"; 478 | } 479 | .icon-paper-clip:before { 480 | content: "\e093"; 481 | } 482 | .icon-paper-plane:before { 483 | content: "\e094"; 484 | } 485 | .icon-plus:before { 486 | content: "\e095"; 487 | } 488 | .icon-pointer:before { 489 | content: "\e096"; 490 | } 491 | .icon-power:before { 492 | content: "\e097"; 493 | } 494 | .icon-refresh:before { 495 | content: "\e098"; 496 | } 497 | .icon-reload:before { 498 | content: "\e099"; 499 | } 500 | .icon-settings:before { 501 | content: "\e09a"; 502 | } 503 | .icon-star:before { 504 | content: "\e09b"; 505 | } 506 | .icon-symbol-female:before { 507 | content: "\e09c"; 508 | } 509 | .icon-symbol-male:before { 510 | content: "\e09d"; 511 | } 512 | .icon-target:before { 513 | content: "\e09e"; 514 | } 515 | .icon-volume-1:before { 516 | content: "\e09f"; 517 | } 518 | .icon-volume-2:before { 519 | content: "\e0a0"; 520 | } 521 | .icon-volume-off:before { 522 | content: "\e0a1"; 523 | } 524 | .icon-users:before { 525 | content: "\e001"; 526 | } -------------------------------------------------------------------------------- /modules/ui/css/smart-table.css: -------------------------------------------------------------------------------- 1 | .st-selected td{ 2 | background-color: #58666e !important; 3 | color:#fff; 4 | } -------------------------------------------------------------------------------- /modules/ui/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /modules/ui/fonts/Simple-Line-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/Simple-Line-Icons.eot -------------------------------------------------------------------------------- /modules/ui/fonts/Simple-Line-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/Simple-Line-Icons.ttf -------------------------------------------------------------------------------- /modules/ui/fonts/Simple-Line-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/Simple-Line-Icons.woff -------------------------------------------------------------------------------- /modules/ui/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /modules/ui/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /modules/ui/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /modules/ui/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /modules/ui/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /modules/ui/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /modules/ui/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /modules/ui/fonts/sourcesanspro/sourcesanspro-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/sourcesanspro/sourcesanspro-bold.woff -------------------------------------------------------------------------------- /modules/ui/fonts/sourcesanspro/sourcesanspro-light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/sourcesanspro/sourcesanspro-light.woff -------------------------------------------------------------------------------- /modules/ui/fonts/sourcesanspro/sourcesanspro.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/fonts/sourcesanspro/sourcesanspro.woff -------------------------------------------------------------------------------- /modules/ui/img/logo-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/img/logo-small.png -------------------------------------------------------------------------------- /modules/ui/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sumeet70/aiex/ef9afd1c18438de188dbdf307e54d239ebfa709d/modules/ui/img/logo.png -------------------------------------------------------------------------------- /modules/ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Apache Ignite Manager | Designextech 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /modules/ui/l10n/en.js: -------------------------------------------------------------------------------- 1 | { 2 | "aside" : { 3 | "nav" : { 4 | "HEADER" : "Modules", 5 | "INTERACT" : "Ignite Browser" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /modules/ui/modules/app/app-controller.js: -------------------------------------------------------------------------------- 1 | app.controller('AppController', ['$scope', 2 | function($scope) { 3 | } 4 | ]); 5 | -------------------------------------------------------------------------------- /modules/ui/modules/app/app.js: -------------------------------------------------------------------------------- 1 | angular.module('app', [ 2 | 'ngCookies', 3 | 'ngResource', 4 | 'ngSanitize', 5 | 'ngTouch', 6 | 'ngStorage', 7 | 'ui.router', 8 | 'ui.bootstrap', 9 | 'oc.lazyLoad', 10 | 'pascalprecht.translate', 11 | 'smart-table' 12 | ]); -------------------------------------------------------------------------------- /modules/ui/modules/app/config.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('app') 2 | .config( 3 | ['$controllerProvider', '$compileProvider', '$filterProvider', '$provide', 4 | function ($controllerProvider, $compileProvider, $filterProvider, $provide) { 5 | 6 | // lazy controller, directive and service 7 | app.controller = $controllerProvider.register; 8 | app.directive = $compileProvider.directive; 9 | app.filter = $filterProvider.register; 10 | app.factory = $provide.factory; 11 | app.service = $provide.service; 12 | app.constant = $provide.constant; 13 | app.value = $provide.value; 14 | } 15 | ]) 16 | .config(['$translateProvider', function($translateProvider){ 17 | // Register a loader for the static files 18 | // So, the module will search missing translation tables under the specified urls. 19 | // Those urls are [prefix][langKey][suffix]. 20 | $translateProvider.useStaticFilesLoader({ 21 | prefix: 'l10n/', 22 | suffix: '.js' 23 | }); 24 | // Tell the module what language to use by default 25 | $translateProvider.preferredLanguage('en'); 26 | // Tell the module to store the language in the local storage 27 | $translateProvider.useLocalStorage(); 28 | }]); 29 | 30 | 31 | app.getUrl = function(path){ 32 | return "/api/ignite/" + path; 33 | }; -------------------------------------------------------------------------------- /modules/ui/modules/app/lazyload.js: -------------------------------------------------------------------------------- 1 | angular.module('app').config(['$ocLazyLoadProvider', function($ocLazyLoadProvider) { 2 | $ocLazyLoadProvider.config({ 3 | debug: true, 4 | events: true, 5 | modules: [ 6 | { 7 | name: 'toaster', 8 | files: [ 9 | '../bower_components/angularjs-toaster/toaster.js', 10 | '../bower_components/angularjs-toaster/toaster.css' 11 | ] 12 | } 13 | ] 14 | }); 15 | }]); -------------------------------------------------------------------------------- /modules/ui/modules/app/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('app') 4 | .controller('AppCtrl', ['$scope', '$translate', '$localStorage', '$window', 5 | function( $scope, $translate, $localStorage, $window ) { 6 | var isIE = !!navigator.userAgent.match(/MSIE/i); 7 | isIE && angular.element($window.document.body).addClass('ie'); 8 | isSmartDevice( $window ) && angular.element($window.document.body).addClass('smart'); 9 | 10 | // config 11 | $scope.app = { 12 | name: 'Apache Ignite Browser', 13 | version: '0.0.9', 14 | 15 | // for chart colors 16 | color: { 17 | primary: '#7266ba', 18 | info: '#23b7e5', 19 | success: '#27c24c', 20 | warning: '#fad733', 21 | danger: '#f05050', 22 | light: '#e8eff0', 23 | dark: '#3a3f51', 24 | black: '#1c2b36' 25 | }, 26 | settings: { 27 | themeID: 1, 28 | navbarHeaderColor: 'bg-black', 29 | navbarCollapseColor: 'bg-white-only', 30 | asideColor: 'bg-black', 31 | headerFixed: true, 32 | asideFixed: false, 33 | asideFolded: false, 34 | asideDock: false, 35 | container: false 36 | } 37 | } 38 | 39 | // save settings to local storage 40 | if ( angular.isDefined($localStorage.settings) ) { 41 | $scope.app.settings = $localStorage.settings; 42 | } else { 43 | $localStorage.settings = $scope.app.settings; 44 | } 45 | 46 | $scope.$watch('app.settings', function(){ 47 | if( $scope.app.settings.asideDock && $scope.app.settings.asideFixed ){ 48 | // aside dock and fixed must set the header fixed. 49 | $scope.app.settings.headerFixed = true; 50 | } 51 | // save to local storage 52 | $localStorage.settings = $scope.app.settings; 53 | }, true); 54 | 55 | // angular translate 56 | $scope.lang = { isopen: false }; 57 | $scope.langs = {en:'English', de_DE:'German', it_IT:'Italian'}; 58 | $scope.selectLang = $scope.langs[$translate.proposedLanguage()] || "English"; 59 | 60 | $scope.setLang = function(langKey, $event) { 61 | // set the current lang 62 | $scope.selectLang = $scope.langs[langKey]; 63 | // You can change the language during runtime 64 | $translate.use(langKey); 65 | $scope.lang.isopen = !$scope.lang.isopen; 66 | }; 67 | 68 | function isSmartDevice( $window ) 69 | { 70 | // Adapted from http://www.detectmobilebrowsers.com 71 | var ua = $window['navigator']['userAgent'] || $window['navigator']['vendor'] || $window['opera']; 72 | // Checks for iOs, Android, Blackberry, Opera Mini, and Windows mobile devices 73 | return (/iPhone|iPod|iPad|Silk|Android|BlackBerry|Opera Mini|IEMobile/).test(ua); 74 | } 75 | }]); -------------------------------------------------------------------------------- /modules/ui/modules/app/router.js: -------------------------------------------------------------------------------- 1 | angular.module('app') 2 | .run(['$rootScope', '$state', '$stateParams', 3 | function ($rootScope, $state, $stateParams) { 4 | $rootScope.$state = $state; 5 | $rootScope.$stateParams = $stateParams; 6 | } 7 | ]).config(['$stateProvider', '$urlRouterProvider', 8 | function ($stateProvider, $urlRouterProvider) { 9 | $urlRouterProvider 10 | .otherwise('/app/ignite/rest'); 11 | $stateProvider 12 | .state('app', { 13 | abstract: true, 14 | url: '/app', 15 | templateUrl: 'modules/layout/master.html', 16 | resolve: { 17 | deps: ['$ocLazyLoad', function ($ocLazyLoad) { 18 | return $ocLazyLoad.load([ 19 | 'modules/app/app-controller.js', 20 | 'modules/layout/page-sizer-directive.js', 21 | 'modules/layout/header-controller.js', 22 | 'toaster' 23 | ]); 24 | }] 25 | } 26 | }) 27 | .state('app.gen', { 28 | abstract: true, 29 | url: '/gen', 30 | templateUrl: 'modules/generators/master.html' 31 | }) 32 | .state('app.ignite', { 33 | abstract: true, 34 | url: '/ignite', 35 | templateUrl: 'modules/ignite/master.html' 36 | }) 37 | .state('app.gen.metastock', { 38 | url: '/metastock', 39 | templateUrl: '../generators/metastock/metastock.html', 40 | resolve: { 41 | deps: ['$ocLazyLoad', 42 | function( $ocLazyLoad){ 43 | return $ocLazyLoad.load([ 44 | 'modules/generators/metastock/metastock-service.js', 45 | 'modules/generators/metastock/metastock-controller.js' 46 | ]); 47 | }] 48 | } 49 | }) 50 | .state('app.ignite.rest', { 51 | url: '/rest', 52 | templateUrl: 'modules/ignite/rest/default.html', 53 | resolve: { 54 | deps: ['$ocLazyLoad', 55 | function( $ocLazyLoad){ 56 | return $ocLazyLoad.load([ 57 | 'modules/ignite/rest/rest-service.js', 58 | 'modules/ignite/rest/rest-controller.js', 59 | 'modules/ignite/topology/topology-controller.js', 60 | 'modules/ignite/cache/cache-controller.js' 61 | ]); 62 | }] 63 | } 64 | }); 65 | 66 | } 67 | ] 68 | ); 69 | -------------------------------------------------------------------------------- /modules/ui/modules/ignite/cache/cache-controller.js: -------------------------------------------------------------------------------- 1 | app.controller('CacheController', ['$scope', 'toaster', 'igniteRestService', function($scope, toaster, igniteRestService) { 2 | 3 | var index = 1; 4 | $scope.cacheItems = [{id:index, key:"", value:"", casValue:""}]; 5 | $scope.toaster = { 6 | type: 'success', 7 | title: 'Title', 8 | text: 'Message' 9 | }; 10 | $scope.pop = function(){ 11 | toaster.pop($scope.toaster.type, $scope.toaster.title, $scope.toaster.text); 12 | }; 13 | 14 | $scope.addItem = function(){ 15 | index = index + 1; 16 | $scope.cacheItems.push({id:index, key:"", value:""}); 17 | } 18 | 19 | $scope.removeItem = function(id){ 20 | if($scope.cacheItems.length > 1){ 21 | $scope.cacheItems = _.reject($scope.cacheItems, function(item){ 22 | return item.id == id; 23 | }); 24 | } 25 | } 26 | 27 | $scope.putall = function(){ 28 | var keyCounter = 0; 29 | var params = { 30 | "cacheName": $scope.cacheName, 31 | "destId" : $scope.nodeId 32 | }; 33 | 34 | if($scope.cacheItems.length > 0){ 35 | _.forEach($scope.cacheItems, function(item){ 36 | if(item.key != ""){ 37 | keyCounter++; 38 | params["k"+ keyCounter] = item.key; 39 | params["v"+ keyCounter] = item.value; 40 | } 41 | }); 42 | 43 | if(keyCounter > 0){ 44 | igniteRestService.invoke('putall',params).then(function(result){ 45 | if(!hasError(result)){ 46 | $scope.toaster.text="Put Succeeded"; 47 | $scope.toaster.title="Confirmation"; 48 | } 49 | $scope.pop(); 50 | }).catch(function(){ 51 | 52 | }); 53 | } 54 | } 55 | } 56 | 57 | $scope.getall = function(method){ 58 | 59 | var keyCounter = 0; 60 | var params = { 61 | "cacheName": $scope.cacheName, 62 | "destId" : $scope.nodeId 63 | }; 64 | 65 | if($scope.cacheItems.length > 0){ 66 | _.forEach($scope.cacheItems, function(item){ 67 | if(item.key != ""){ 68 | keyCounter++; 69 | params["k"+ keyCounter] = item.key; 70 | } 71 | }); 72 | 73 | if(keyCounter > 0){ 74 | igniteRestService.invoke('getall',params).then(function(result){ 75 | 76 | if(!hasError(result)){ 77 | $scope.toaster.title="Confirmation"; 78 | $scope.toaster.text="Some keys were not found"; 79 | 80 | var allKeysFound = true; 81 | if(result && result.response){ 82 | for(var i=0; i < $scope.cacheItems.length; i++){ 83 | if(result.response[$scope.cacheItems[i].key]){ 84 | $scope.cacheItems[i].value = result.response[$scope.cacheItems[i].key]; 85 | }else{ 86 | if(allKeysFound) { 87 | allKeysFound = false; 88 | } 89 | } 90 | } 91 | } 92 | if(allKeysFound){ 93 | $scope.toaster.text="Entries Retrieved"; 94 | } 95 | } 96 | $scope.pop(); 97 | }).catch(function(){ 98 | 99 | }); 100 | } 101 | } 102 | } 103 | 104 | $scope.rmvall = function(method){ 105 | 106 | var keyCounter = 0; 107 | var params = { 108 | "cacheName": $scope.cacheName, 109 | "destId" : $scope.nodeId 110 | }; 111 | 112 | if($scope.cacheItems.length > 0){ 113 | _.forEach($scope.cacheItems, function(item){ 114 | if(item.key != ""){ 115 | keyCounter++; 116 | params["k"+ keyCounter] = item.key; 117 | } 118 | }); 119 | 120 | if(keyCounter > 0){ 121 | igniteRestService.invoke('rmvall',params).then(function(result){ 122 | 123 | if(!hasError(result)) { 124 | $scope.toaster.title = "Confirmation"; 125 | $scope.toaster.text = "Entries Removed"; 126 | } 127 | $scope.pop(); 128 | }).catch(function(){ 129 | 130 | }); 131 | } 132 | } 133 | } 134 | 135 | $scope.add = function(){ 136 | if($scope.cacheItems.length > 0){ 137 | _.forEach($scope.cacheItems, function(item){ 138 | if(item.key != ""){ 139 | igniteRestService.invoke('add',{ 140 | key:item.key, 141 | val:item.value, 142 | "cacheName": $scope.cacheName, 143 | "destId" : $scope.nodeId 144 | }).then(function(result){ 145 | 146 | if(!hasError(result)) { 147 | 148 | if (result.response == false) { 149 | $scope.toaster.title = "Confirmation"; 150 | $scope.toaster.text = item.key + " already present"; 151 | } else { 152 | $scope.toaster.title = "Confirmation"; 153 | $scope.toaster.text = item.key + " added"; 154 | } 155 | } 156 | $scope.pop(); 157 | }).catch(function(){ 158 | 159 | }); 160 | } 161 | }); 162 | } 163 | } 164 | 165 | $scope.prepend = function(){ 166 | if($scope.cacheItems.length > 0){ 167 | _.forEach($scope.cacheItems, function(item){ 168 | if(item.key != ""){ 169 | igniteRestService.invoke('prepend',{ 170 | key:item.key, 171 | val:item.value, 172 | cacheName:$scope.cacheName, 173 | destId:$scope.nodeId 174 | }).then(function(result){ 175 | if(!hasError(result)){} 176 | else if(result.response == false){ 177 | $scope.toaster.title="Confirmation"; 178 | $scope.toaster.text= item.key + " not found"; 179 | }else{ 180 | $scope.toaster.title="Confirmation"; 181 | $scope.toaster.text= "Value prepended"; 182 | } 183 | $scope.pop(); 184 | }).catch(function(){ 185 | 186 | }); 187 | } 188 | }); 189 | } 190 | } 191 | 192 | $scope.append = function(){ 193 | if($scope.cacheItems.length > 0){ 194 | _.forEach($scope.cacheItems, function(item){ 195 | if(item.key != ""){ 196 | igniteRestService.invoke('append',{ 197 | key:item.key, 198 | val:item.value, 199 | cacheName:$scope.cacheName, 200 | destId:$scope.nodeId 201 | }).then(function(result){ 202 | if(!hasError(result)){} 203 | else if(result.response == false){ 204 | $scope.toaster.title="Confirmation"; 205 | $scope.toaster.text= item.key + " not found"; 206 | }else{ 207 | $scope.toaster.title="Confirmation"; 208 | $scope.toaster.text= "Value appended"; 209 | } 210 | $scope.pop(); 211 | }).catch(function(){ 212 | 213 | }); 214 | } 215 | }); 216 | } 217 | } 218 | 219 | $scope.replace = function(){ 220 | if($scope.cacheItems.length > 0){ 221 | _.forEach($scope.cacheItems, function(item){ 222 | if(item.key != ""){ 223 | igniteRestService.invoke('rep',{ 224 | key:item.key, 225 | val:item.value, 226 | cacheName:$scope.cacheName, 227 | destId:$scope.nodeId 228 | }).then(function(result){ 229 | if(!hasError(result)){} 230 | else if(result.response == false){ 231 | $scope.toaster.title="Confirmation"; 232 | $scope.toaster.text= item.key + " not found"; 233 | }else{ 234 | $scope.toaster.title="Confirmation"; 235 | $scope.toaster.text= "Value replaced"; 236 | } 237 | $scope.pop(); 238 | }).catch(function(){ 239 | 240 | }); 241 | } 242 | }); 243 | } 244 | } 245 | 246 | $scope.cas = function(){ 247 | if($scope.cacheItems.length > 0){ 248 | _.forEach($scope.cacheItems, function(item){ 249 | if(item.key != ""){ 250 | igniteRestService.invoke('cas',{ 251 | key:item.key, 252 | val:item.value, 253 | val2:item.casValue, 254 | cacheName:$scope.cacheName, 255 | destId:$scope.nodeId 256 | }).then(function(result){ 257 | if(!hasError(result)){} 258 | else if(result.response == false){ 259 | $scope.toaster.title="Confirmation"; 260 | $scope.toaster.text= "key not found or comparison failed."; 261 | }else{ 262 | $scope.toaster.title="Confirmation"; 263 | $scope.toaster.text= "Value swapped"; 264 | } 265 | $scope.pop(); 266 | }).catch(function(){ 267 | 268 | }); 269 | } 270 | }); 271 | } 272 | } 273 | 274 | var hasError = function(result){ 275 | 276 | if(result.error && result.error.indexOf("Cluster group is empty") != -1){ 277 | $scope.toaster.title="Failed"; 278 | $scope.toaster.text= "Cluster group is empty. Check the destination node id."; 279 | $scope.toaster.type="warning"; 280 | return true; 281 | } 282 | if(result.error && result.error.indexOf("Failed to start transaction on non-transactional") != -1){ 283 | $scope.toaster.title="Failed"; 284 | $scope.toaster.text= "Your cache is not transactional. Check grid configuration."; 285 | $scope.toaster.type="warning"; 286 | return true; 287 | }else if(result.error && result.error.indexOf("Failed to find cache for given cache name") != -1){ 288 | $scope.toaster.title="Failed"; 289 | $scope.toaster.text= "Named cache not found. Check grid configuration."; 290 | $scope.toaster.type="warning"; 291 | return true; 292 | } 293 | $scope.toaster.type="success"; 294 | return false; 295 | } 296 | }]); -------------------------------------------------------------------------------- /modules/ui/modules/ignite/cache/default.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | 7 |
8 |
9 |
10 | 11 |
12 |
13 |
14 | 15 |
16 |

17 |

18 |
19 |

20 |
21 |
22 | 23 |
24 |
25 |
26 | 27 |
28 |

29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
38 | 39 |
-------------------------------------------------------------------------------- /modules/ui/modules/ignite/master.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /modules/ui/modules/ignite/rest/default.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

Ignite Browser

6 |
7 |
8 |
9 |
10 |
11 |
12 | 13 | 14 | 15 | Topology 16 | 17 |
18 |
19 |
20 | 21 | 22 | Cache 23 | 24 |
25 |
26 |
27 | 28 | 29 | Logs 30 | 31 |
32 | Pending implementation. Waiting for underlying bug in Apache Ignite rest api to be fixed. 33 |
34 |
35 | 36 | 37 | 38 |
39 |
40 |
41 |
42 |
-------------------------------------------------------------------------------- /modules/ui/modules/ignite/rest/rest-controller.js: -------------------------------------------------------------------------------- 1 | app.controller('IgniteRestController', ['$scope', 'igniteRestService', function($scope, igniteRestService) { 2 | $scope.loadTopology = function(){ 3 | $scope.$broadcast('reloadTopology'); 4 | } 5 | }]); -------------------------------------------------------------------------------- /modules/ui/modules/ignite/rest/rest-service.js: -------------------------------------------------------------------------------- 1 | app.service('igniteRestService', ['$http', '$q', function ($http, $q) { 2 | 3 | this.invoke = function (methodName, params) { 4 | var deferred = $q.defer(); 5 | $http({ 6 | method: 'GET', 7 | url: app.getUrl(methodName), 8 | params: params 9 | }).success(function (response) { 10 | deferred.resolve(response) 11 | }).error(function (error, status, headers) { 12 | console.log(error); 13 | }); 14 | return deferred.promise; 15 | }; 16 | }]); -------------------------------------------------------------------------------- /modules/ui/modules/ignite/topology/default.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
Nodes
{{node.nodeId}}
19 |
20 |
21 | 22 | 23 | 24 | Summary 25 | 26 |
27 | Node Id:{{selectedNode.nodeId}}
28 | Consistent Id:
29 |
30 | {{consistentId}} 31 |
32 | DefaultCacheMode: {{selectedNode.defaultCacheMode}}
33 | Tcp Addresses:
34 |
35 | {{address}} 36 |
37 | Tcp Host Names: {{selectedNode.tcpHostNames}}
38 | Tcp Port: {{selectedNode.tcpPort}}
39 | 40 |
41 |
42 | 43 | 44 | Metrics 45 | 46 |
47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 |
Name Value
55 | 56 |
{{metric.name}}{{metric.val}}
66 |
67 |
68 | 69 | 70 | Attributes 71 | 72 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 |
Name Value
81 | 82 |
{{attribute.name}}{{attribute.val}}
92 |
93 |
94 |
95 |
96 |
97 |
-------------------------------------------------------------------------------- /modules/ui/modules/ignite/topology/topology-controller.js: -------------------------------------------------------------------------------- 1 | app.controller('TopologyController', ['$scope', 'igniteRestService', function($scope, igniteRestService) { 2 | 3 | $scope.$on("reloadTopology", function(){ 4 | 5 | $scope.nodes= []; 6 | $scope.displayedNodes = []; 7 | $scope.selectedNode = {}; 8 | 9 | $scope.attributes = []; 10 | $scope.displayedAttributes = []; 11 | 12 | $scope.metrics = []; 13 | $scope.displayedMetrics = []; 14 | 15 | $scope.$watch('displayedNodes', function(node) { 16 | node.filter(function(r) { 17 | if (r.isSelected) { 18 | $scope.selectedNode = r; 19 | $scope.attributes = []; 20 | $scope.metrics = []; 21 | 22 | igniteRestService.invoke("node",{ 23 | attr:true, 24 | mtr:true, 25 | id: r.nodeId 26 | }).then(function(result){ 27 | for (var property in result.response.attributes ) { 28 | $scope.attributes.push({ 29 | name:property, 30 | val:result.response.attributes[property] 31 | }); 32 | } 33 | $scope.displayedAttributes = [].concat($scope.attributes); 34 | 35 | for (var property in result.response.metrics ) { 36 | $scope.metrics.push({ 37 | name:property, 38 | val:result.response.metrics[property] 39 | }); 40 | } 41 | $scope.displayedMetrics = [].concat($scope.metrics); 42 | }); 43 | } 44 | }) 45 | }, true); 46 | 47 | igniteRestService.invoke("top").then(function(result){ 48 | _.forEach(result.response, function(node){ 49 | node.consistentId = node.consistentId.split(","); 50 | $scope.nodes.push(node); 51 | }); 52 | $scope.displayedNodes = [].concat($scope.nodes); 53 | }); 54 | 55 | }); 56 | 57 | $scope.$broadcast('reloadTopology'); 58 | 59 | }]); 60 | -------------------------------------------------------------------------------- /modules/ui/modules/layout/aside.html: -------------------------------------------------------------------------------- 1 |
2 | 7 |
-------------------------------------------------------------------------------- /modules/ui/modules/layout/header-controller.js: -------------------------------------------------------------------------------- 1 | app.controller('HeaderController', ['$scope', function($scope) { 2 | $scope.clusterAddress = ""; 3 | }]); -------------------------------------------------------------------------------- /modules/ui/modules/layout/header.html: -------------------------------------------------------------------------------- 1 | 2 | 16 | 33 | -------------------------------------------------------------------------------- /modules/ui/modules/layout/master.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 |
7 | 8 |
9 |
10 | 11 | 12 | 13 | 17 | -------------------------------------------------------------------------------- /modules/ui/modules/layout/nav.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /modules/ui/modules/layout/page-sizer-directive.js: -------------------------------------------------------------------------------- 1 | angular.module('app').directive('pageSizer', ['$rootScope', function($rootScope) { 2 | return { 3 | link: function(scope, el, attrs) { 4 | 5 | var appFooterHeight = 51; 6 | 7 | var appFooter = jQuery('.' + attrs.footercontainer); 8 | var appFooterTop = appFooter.position().top; 9 | var me = jQuery(el); 10 | var myTop = me.position().top; 11 | 12 | function resize(){ 13 | 14 | var desiredHeight = appFooterTop - myTop - appFooterHeight; 15 | 16 | me.animate({height: desiredHeight + "px"}, 300, null, function(){ 17 | 18 | }); 19 | } 20 | resize(); 21 | } 22 | }; 23 | }]); -------------------------------------------------------------------------------- /modules/web-server.js: -------------------------------------------------------------------------------- 1 | var logger = global.logger; 2 | 3 | var path = require('path'); 4 | var http = require('http'); 5 | var os = require('os'); 6 | var express = require('express'); 7 | 8 | var bodyParser = require('body-parser'); 9 | var compression = require('compression'); 10 | var expiry = require('static-expiry'); //Fix expiry on Windows :( 11 | 12 | module.exports = function(app,configData){ 13 | 14 | app.set('config',configData); 15 | var staticDir = path.join(__dirname, './ui'); 16 | var viewsDir = __dirname + './ui'; 17 | app.set('views', viewsDir); 18 | app.use(bodyParser.json()); 19 | app.use(compression()); 20 | app.use(expiry(app, {dir: staticDir, debug: app.get("env") == 'development'})); 21 | app.use(express.static(staticDir)); 22 | 23 | var port = app.get("config").port; 24 | var rootPath = app.get("config").rootPath; 25 | var router = express.Router(); 26 | 27 | app.set('port', port); 28 | app.set('view engine', 'ejs'); 29 | app.use(rootPath,router); 30 | 31 | require('./router')(app,router); 32 | 33 | var server = http.createServer(app).listen(port, function(){ 34 | logger.info("Web Server Ready on port: " + app.get("port")); 35 | }); 36 | return server; 37 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aiex", 3 | "version": "0.0.9", 4 | "private": true, 5 | "scripts": { 6 | "start": "node index.js" 7 | }, 8 | "engines": { 9 | "node": "0.12.2" 10 | }, 11 | "dependencies": { 12 | "body-parser": "^1.13.1", 13 | "bson": "^0.3.2", 14 | "compression": "^1.5.0", 15 | "ejs": "^2.3.1", 16 | "express": "~4.0.0", 17 | "express-urlrewrite": "^1.2.0", 18 | "json-file-plus": "^3.0.0", 19 | "q": "^1.4.1", 20 | "request": "^2.64.0", 21 | "serve-favicon": "^2.3.0", 22 | "socket.io": "^1.3.5", 23 | "static-expiry": ">=0.0.5", 24 | "underscore": "^1.8.3", 25 | "winston": "^1.0.1" 26 | }, 27 | "devDependencies": { 28 | "http-server": "^0.6.1", 29 | "require-directory": "^2.0.0", 30 | "requirejs": "^2.1.17" 31 | } 32 | } --------------------------------------------------------------------------------