🤬
  • ■ ■ ■ ■ ■ ■
    gui-frontend/.csslintrc
     1 +{
     2 + "box-model": true,
     3 + "display-property-grouping": true,
     4 + "duplicate-properties": true,
     5 + "empty-rules": true,
     6 + "known-properties": true,
     7 + "adjoining-classes": true,
     8 + "box-sizing": false,
     9 + "compatible-vendor-prefixes": true,
     10 + "gradients": true,
     11 + "text-indent": true,
     12 + "vendor-prefix": false,
     13 + "fallback-colors": false,
     14 + "star-property-hack": true,
     15 + "underscore-property-hack": true,
     16 + "bulletproof-font-face": true,
     17 + "font-faces": true,
     18 + "import": true,
     19 + "regex-selectors": true,
     20 + "universal-selector": false,
     21 + "unqualified-attributes": false,
     22 + "zero-units": false,
     23 + "overqualified-elements": false,
     24 + "shorthand": true,
     25 + "duplicate-background-images": false,
     26 + "floats": false,
     27 + "font-sizes": false,
     28 + "ids": false,
     29 + "important": false,
     30 + "outline-none": false,
     31 + "qualified-headings": false,
     32 + "unique-headings": false,
     33 + "selector-max-approaching": false,
     34 + "selector-max": true
     35 +}
     36 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/.eslintignore
     1 +Gruntfile.js
     2 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/.eslintrc
     1 +{
     2 + "env": {
     3 + "browser": true,
     4 + "node": true
     5 + },
     6 + "globals": {
     7 + "angular": true,
     8 + "describe": true,
     9 + "beforeEach": true,
     10 + "inject": true,
     11 + "it": true,
     12 + "expect": true
     13 + },
     14 + "rules": {
     15 + "eqeqeq": "error",
     16 + "curly": "error",
     17 + "no-dupe-args": "error",
     18 + "no-dupe-keys": "error",
     19 + "no-duplicate-case": "error",
     20 + "no-extra-semi": "error",
     21 + "no-func-assign": "error",
     22 + "no-negated-in-lhs": "error",
     23 + "no-obj-calls": "error",
     24 + "no-unexpected-multiline": "error",
     25 + "no-unreachable": "error",
     26 + "use-isnan": "error",
     27 + "valid-typeof": "error",
     28 + "block-scoped-var": "error",
     29 + "dot-location": [1, "property"],
     30 + "no-empty-function": "error",
     31 + "no-eq-null": "error",
     32 + "no-eval": "error",
     33 + "no-fallthrough": "error",
     34 + "no-implied-eval": "error",
     35 + "no-lone-blocks": "error",
     36 + "no-loop-func": "error",
     37 + "no-multi-spaces": "error",
     38 + "no-multi-str": "error",
     39 + "no-native-reassign": ["error", {"exceptions": ["Object"]}],
     40 + "no-redeclare": "error",
     41 + "no-self-assign": "error",
     42 + "no-self-compare": "error",
     43 + "no-useless-concat": "error",
     44 + "radix": "error",
     45 + "strict": ["error", "global"],
     46 + "no-catch-shadow": "error",
     47 + "no-undef-init": "error",
     48 + "no-use-before-define": "error",
     49 + "array-bracket-spacing": "error",
     50 + "block-spacing": ["error", "always"],
     51 + "brace-style": ["error", "1tbs", { "allowSingleLine": true }],
     52 + "camelcase": ["error", {properties: "always"}],
     53 + "comma-spacing": ["error", { "before": false, "after": true }],
     54 + "comma-style": ["error", "last"],
     55 + "computed-property-spacing": ["error", "never"],
     56 + "eol-last": "error",
     57 + "indent": ["error", 4],
     58 + "jsx-quotes": ["warn", "prefer-single"],
     59 + "key-spacing": ["error", { "beforeColon": false }],
     60 + "keyword-spacing": ["error", { "before": true }],
     61 + "new-parens": "error",
     62 + "no-lonely-if": "error",
     63 + "no-mixed-spaces-and-tabs": ["error", "smart-tabs"],
     64 + "no-multiple-empty-lines": ["error", {"max": 1}],
     65 + "no-spaced-func": "error",
     66 + "no-trailing-spaces": "error",
     67 + "no-unneeded-ternary": "error",
     68 + "no-whitespace-before-property": "error",
     69 + "operator-linebreak": ["error", "before"],
     70 + "quote-props": ["error", "always"],
     71 + "quotes": ["error", "single", {"avoidEscape": true}],
     72 + "semi": "error",
     73 + "semi-spacing": "error",
     74 + "space-before-blocks": "error",
     75 + "space-in-parens": ["error", "never"],
     76 + "space-infix-ops": "error",
     77 + "space-unary-ops": "error",
     78 + "spaced-comment": ["error", "always"],
     79 + "unicode-bom": ["error", "never"],
     80 + "wrap-regex": "error"
     81 + }
     82 +}
     83 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/.gitignore
     1 +.komodotools/
     2 +*.komodoproject
     3 +*.sw*
     4 +*~
     5 +bin/
     6 +node_modules
     7 +vendor/
     8 +.idea/
     9 +report/
     10 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/.npmrc
     1 +proxy=http://10.144.1.10:8080
     2 +https-proxy=http://10.144.1.10:8080
     3 +https_proxy=http://10.144.1.10:8080
     4 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/.travis.yml
     1 +language: node_js
     2 +node_js:
     3 + - "0.10"
     4 + 
     5 +before_script:
     6 + - export DISPLAY=:99.0
     7 + - sh -e /etc/init.d/xvfb start
     8 + - npm install --quiet -g grunt-cli karma bower
     9 + - npm install
     10 + - bower install
     11 + 
     12 +script: grunt
     13 + 
     14 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/CHANGELOG.md
     1 +# 0.3.2 (2014-04-15)
     2 + 
     3 +## Features
     4 + 
     5 +* Updated to bootstrap 3 and ui-bootstrap 0.10 ([55682310]([email protected]:ngbp/ngbp/commit/55682310))
     6 + 
     7 +## Bug fixes
     8 + 
     9 +* Karma unit port changed to 9019 ([0c354e90]([email protected]:ngbp/ngbp/commit/0c354e90))
     10 +* Updated Travis links to new name ([3346a704]([email protected]:ngbp/ngbp/commit/3346a704))
     11 +* Typo in copy watch task. ([00834319]([email protected]:ngbp/ngbp/commit/00834319))
     12 +* Vendor assets were ignored during watch ([a94bb652]([email protected]:ngbp/ngbp/commit/a94bb652))
     13 + 
     14 + 
     15 + 
     16 + 
     17 +# 0.3.1 (2013-09-13)
     18 + 
     19 +## Features
     20 + 
     21 +* Page titles are now set via state objects ([33de8097]([email protected]:joshdmiller/ng-boilerplate/commit/33de8097))
     22 +* Append pkg.version to JS and CSS ([90e1b71f]([email protected]:joshdmiller/ng-boilerplate/commit/90e1b71f))
     23 +* Vendor CSS is copied and concatenated with the app's CSS ([dda8792c]([email protected]:joshdmiller/ng-boilerplate/commit/dda8792c))
     24 +* Vendor assets are copied to the build too ([29502bff]([email protected]:joshdmiller/ng-boilerplate/commit/29502bff))
     25 +* Treat JS in src/assets as assets (i.e. don't do anything with it) ([99b50751]([email protected]:joshdmiller/ng-boilerplate/commit/99b50751))
     26 +* Added PhantomJS support ([89acf5f6]([email protected]:joshdmiller/ng-boilerplate/commit/89acf5f6))
     27 +* Files for use only in testing are now configurable ([a04e663b]([email protected]:joshdmiller/ng-boilerplate/commit/a04e663b))
     28 + 
     29 +## Bug fixes
     30 + 
     31 +* CopyPasteException in index.html comments ([3a0596a7]([email protected]:joshdmiller/ng-boilerplate/commit/3a0596a7))
     32 +* Fixed typos in the README ([5ae95393]([email protected]:joshdmiller/ng-boilerplate/commit/5ae95393)), ([8c362208]([email protected]:joshdmiller/ng-boilerplate/commit/8c362208)), and ([6b617282]([email protected]:joshdmiller/ng-boilerplate/commit/6b617282))
     33 +* Vendor files were added to build twice ([09277b74]([email protected]:joshdmiller/ng-boilerplate/commit/09277b74))
     34 +* IE7 Font Awesome stylesheet pointed nowhere ([515673b1]([email protected]:joshdmiller/ng-boilerplate/commit/515673b1))
     35 + 
     36 +# 0.3.0 (2013-06-25)
     37 + 
     38 +## Features
     39 +### build
     40 + 
     41 +* split build into build+compile ([97fb290d](https://github.com/joshdmiller/ng-boilerplate/commits/97fb290d))
     42 +* Moved config to separate file ([ff5d8b58](https://github.com/joshdmiller/ng-boilerplate/commits/ff5d8b58))
     43 +* Added grunt-bump to ease releasing ([27312de1](https://github.com/joshdmiller/ng-boilerplate/commits/27312de1))
     44 +* Added changelog generation ([328d25d2](https://github.com/joshdmiller/ng-boilerplate/commits/328d25d2))
     45 +* karma config managed automatically ([3384b6fd](https://github.com/joshdmiller/ng-boilerplate/commits/3384b6fd))
     46 +* CoffeeScript support ([0f308f2f](https://github.com/joshdmiller/ng-boilerplate/commits/0f308f2f))
     47 + 
     48 +### *
     49 + 
     50 +* switched to ui-router for state mgmt ([7bec0378](https://github.com/joshdmiller/ng-boilerplate/commits/7bec0378))
     51 + 
     52 +## Bug fixes
     53 +### build
     54 + 
     55 +* Karma no longer hangs the watch (([f66cfcc6])(https://github.com/joshdmiller/ng-boilerplate/commits/f66cfcc6))
     56 + 
     57 + 
     58 + 
     59 +# 0.2.0 (2013-05-10)
     60 + 
     61 +## Features
     62 +### build
     63 + 
     64 +* live reload added through grunt-watch ([653df741](https://github.com/joshdmiller/ng-boilerplate/commits/653df741))
     65 + 
     66 +* Add grunt ng-min for annotation ([9c529ccb](https://github.com/joshdmiller/ng-boilerplate/commits/9c529ccb))
     67 + 
     68 +### *
     69 + 
     70 +* far better Bower integration ([864c2656](https://github.com/joshdmiller/ng-boilerplate/commits/864c2656))
     71 + 
     72 +* included AngularUI `utils` to use uiRoute ([df08e4be](https://github.com/joshdmiller/ng-boilerplate/commits/df08e4be))
     73 + 
     74 + 
     75 + 
     76 + 
     77 + 
     78 + 
     79 +# 0.1.0 (2013-03-11)
     80 + 
     81 +## Features
     82 +### *
     83 + 
     84 +* Initial application structure ([7c149227](https://github.com/joshdmiller/ng-boilerplate/commits/7c149227))
     85 + 
     86 +* improved navigation styling and added home page tpl ([e1a655e0](https://github.com/joshdmiller/ng-boilerplate/commits/e1a655e0))
     87 + 
     88 +### app
     89 + 
     90 +* added current route indication to menu with appropriate unit test ([14d35da8](https://github.com/joshdmiller/ng-boilerplate/commits/14d35da8))
     91 + 
     92 +### index
     93 + 
     94 +* improved navbar style and added additional links ([a7c4504c](https://github.com/joshdmiller/ng-boilerplate/commits/a7c4504c))
     95 + 
     96 +### about
     97 + 
     98 +* Added an about page with some descriptive content ([290704ab](https://github.com/joshdmiller/ng-boilerplate/commits/290704ab))
     99 + 
     100 +* Added placeholders demo to about page ([89a06e9f](https://github.com/joshdmiller/ng-boilerplate/commits/89a06e9f))
     101 + 
     102 +### titleService
     103 + 
     104 +* dynamic title support) ([3db6ec2b](https://github.com/joshdmiller/ng-boilerplate/commits/3db6ec2b))
     105 + 
     106 +* suffix is now customizable ([9f8b4c73](https://github.com/joshdmiller/ng-boilerplate/commits/9f8b4c73))
     107 + 
     108 +### activeIfCurrentDirective
     109 + 
     110 +* created directory to test for current route ([0ac1f4b4](https://github.com/joshdmiller/ng-boilerplate/commits/0ac1f4b4))
     111 + 
     112 +### home
     113 + 
     114 +* replaced placeholder text with mrktg copy ([dcaf7237](https://github.com/joshdmiller/ng-boilerplate/commits/dcaf7237))
     115 + 
     116 +* added google +1 button ([98d3312b](https://github.com/joshdmiller/ng-boilerplate/commits/98d3312b))
     117 + 
     118 + 
     119 + 
     120 +## Bug fixes
     121 +### build
     122 + 
     123 +* Removed unnecessary step from delta:unittest ([5ffbfd78](https://github.com/joshdmiller/ng-boilerplate/commits/5ffbfd78))
     124 + 
     125 +* delta tasks that concat must also uglify ([926983f8](https://github.com/joshdmiller/ng-boilerplate/commits/926983f8))
     126 + 
     127 +### test-config
     128 + 
     129 +* Change browser-name case, add browser list ([682b1ea4](https://github.com/joshdmiller/ng-boilerplate/commits/682b1ea4))
     130 + 
     131 +### home
     132 + 
     133 +* corrected typo in tweet button URL ([b9920eea](https://github.com/joshdmiller/ng-boilerplate/commits/b9920eea))
     134 + 
     135 +### testacular
     136 + 
     137 +* fixed typo in browser docstring ([11a60fa7](https://github.com/joshdmiller/ng-boilerplate/commits/11a60fa7))
     138 + 
     139 + 
     140 + 
     141 + 
     142 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/Gruntfile.js
     1 +module.exports = function ( grunt ) {
     2 + 
     3 + /**
     4 + * Load required Grunt tasks. These are installed based on the versions listed
     5 + * in `package.json` when you do `npm install` in this directory.
     6 + */
     7 + grunt.loadNpmTasks('grunt-contrib-clean');
     8 + grunt.loadNpmTasks('grunt-contrib-copy');
     9 + grunt.loadNpmTasks('grunt-html-angular-validate');
     10 + grunt.loadNpmTasks('grunt-eslint');
     11 + grunt.loadNpmTasks('grunt-lesslint');
     12 + grunt.loadNpmTasks('grunt-contrib-concat');
     13 + grunt.loadNpmTasks('grunt-contrib-watch');
     14 + grunt.loadNpmTasks('grunt-contrib-uglify');
     15 + grunt.loadNpmTasks('grunt-contrib-coffee');
     16 + grunt.loadNpmTasks('grunt-contrib-less');
     17 + grunt.loadNpmTasks('grunt-conventional-changelog');
     18 + grunt.loadNpmTasks('grunt-bump');
     19 + grunt.loadNpmTasks('grunt-coffeelint');
     20 + grunt.loadNpmTasks('grunt-karma');
     21 + grunt.loadNpmTasks('grunt-ngmin');
     22 + grunt.loadNpmTasks('grunt-html2js');
     23 + 
     24 + /**
     25 + * Load in our build configuration file.
     26 + */
     27 + var userConfig = require( './build.config.js' );
     28 + 
     29 + /**
     30 + * This is the configuration object Grunt uses to give each plugin its
     31 + * instructions.
     32 + */
     33 + var taskConfig = {
     34 + /**
     35 + * We read in our `package.json` file so we can access the package name and
     36 + * version. It's already there, so we don't repeat ourselves here.
     37 + */
     38 + pkg: grunt.file.readJSON('package.json'),
     39 + 
     40 + /**
     41 + * The banner is the comment that is placed at the top of our compiled
     42 + * source files. It is first processed as a Grunt template, where the `<%=`
     43 + * pairs are evaluated based on this very configuration object.
     44 + */
     45 + meta: {
     46 + banner:
     47 + '/**\n' +
     48 + ' * <%= pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %>\n' +
     49 + ' * <%= pkg.homepage %>\n' +
     50 + ' *\n' +
     51 + ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
     52 + ' * Licensed <%= pkg.licenses.type %> <<%= pkg.licenses.url %>>\n' +
     53 + ' */\n'
     54 + },
     55 + 
     56 + /**
     57 + * Creates a changelog on a new version.
     58 + */
     59 + changelog: {
     60 + options: {
     61 + dest: 'CHANGELOG.md',
     62 + template: 'changelog.tpl'
     63 + }
     64 + },
     65 + 
     66 + /**
     67 + * Increments the version number, etc.
     68 + */
     69 + bump: {
     70 + options: {
     71 + files: [
     72 + 'package.json',
     73 + 'bower.json'
     74 + ],
     75 + commit: false,
     76 + commitMessage: 'chore(release): v%VERSION%',
     77 + commitFiles: [
     78 + 'package.json',
     79 + 'client/bower.json'
     80 + ],
     81 + createTag: false,
     82 + tagName: 'v%VERSION%',
     83 + tagMessage: 'Version %VERSION%',
     84 + push: false,
     85 + pushTo: 'origin'
     86 + }
     87 + },
     88 + 
     89 + /**
     90 + * The directories to delete when `grunt clean` is executed.
     91 + */
     92 + clean: [
     93 + '<%= build_dir %>',
     94 + '<%= compile_dir %>'
     95 + ],
     96 + 
     97 + /**
     98 + * The `copy` task just copies files from A to B. We use it here to copy
     99 + * our project assets (images, fonts, etc.) and javascripts into
     100 + * `build_dir`, and then to copy the assets to `compile_dir`.
     101 + */
     102 + copy: {
     103 + build_app_assets: {
     104 + files: [
     105 + {
     106 + src: [ '**' ],
     107 + dest: '<%= build_dir %>/assets/',
     108 + cwd: 'src/assets',
     109 + expand: true
     110 + }
     111 + ]
     112 + },
     113 + build_app_fonts: {
     114 + files: [
     115 + {
     116 + src: [ '<%= app_files.fonts %>' ],
     117 + dest: '<%= build_dir %>/fonts/',
     118 + expand: true,
     119 + flatten: true
     120 + }
     121 + ]
     122 + },
     123 + build_vendor_assets: {
     124 + files: [
     125 + {
     126 + src: [ '<%= vendor_files.assets %>' ],
     127 + dest: '<%= build_dir %>/assets/',
     128 + cwd: '.',
     129 + expand: true,
     130 + flatten: true
     131 + }
     132 + ]
     133 + },
     134 + build_vendor_fonts: {
     135 + files: [
     136 + {
     137 + src: [ '<%= vendor_files.fonts %>' ],
     138 + dest: '<%= build_dir %>/fonts/',
     139 + expand: true,
     140 + flatten: true
     141 + }
     142 + ]
     143 + },
     144 + build_appjs: {
     145 + files: [
     146 + {
     147 + src: [ '<%= app_files.js %>' ],
     148 + dest: '<%= build_dir %>/',
     149 + cwd: '.',
     150 + expand: true
     151 + }
     152 + ]
     153 + },
     154 + build_vendorjs: {
     155 + files: [
     156 + {
     157 + src: [ '<%= vendor_files.js %>' ],
     158 + dest: '<%= build_dir %>/',
     159 + cwd: '.',
     160 + expand: true
     161 + }
     162 + ]
     163 + },
     164 + build_vendorcss: {
     165 + files: [
     166 + {
     167 + src: [ '<%= vendor_files.css %>' ],
     168 + dest: '<%= build_dir %>/',
     169 + cwd: '.',
     170 + expand: true
     171 + }
     172 + ]
     173 + },
     174 + build_lang_files: {
     175 + files: [
     176 + {
     177 + src: [ '<%= lang_files.json %>' ],
     178 + dest: '<%= build_dir %>/languages/',
     179 + expand: true,
     180 + flatten: true
     181 + }
     182 + ]
     183 + },
     184 + compile_assets: {
     185 + files: [
     186 + {
     187 + src: [ '**' ],
     188 + dest: '<%= compile_dir %>/assets',
     189 + cwd: '<%= build_dir %>/assets',
     190 + expand: true
     191 + },
     192 + {
     193 + src: [ '<%= vendor_files.css %>' ],
     194 + dest: '<%= compile_dir %>/',
     195 + cwd: '.',
     196 + expand: true
     197 + },
     198 + {
     199 + src: [ '<%= app_files.fonts %>' ],
     200 + dest: '<%= compile_dir %>/fonts',
     201 + expand: true,
     202 + flatten: true
     203 + },
     204 + {
     205 + src: [ '<%= vendor_files.fonts %>' ],
     206 + dest: '<%= compile_dir %>/fonts',
     207 + expand: true,
     208 + flatten: true
     209 + },
     210 + {
     211 + src: [ '<%= lang_files.json %>' ],
     212 + dest: '<%= compile_dir %>/languages',
     213 + expand: true,
     214 + flatten: true
     215 + }
     216 + ]
     217 + }
     218 + },
     219 + 
     220 + /**
     221 + * `grunt concat` concatenates multiple source files into a single file.
     222 + */
     223 + concat: {
     224 + /**
     225 + * The `build_css` target concatenates compiled CSS and vendor CSS
     226 + * together.
     227 + */
     228 + build_css: {
     229 + src: [
     230 + '<%= vendor_files.css %>',
     231 + '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css'
     232 + ],
     233 + dest: '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css'
     234 + },
     235 + /**
     236 + * The `compile_js` target is the concatenation of our application source
     237 + * code and all specified vendor source code into a single file.
     238 + */
     239 + compile_js: {
     240 + options: {
     241 + banner: '<%= meta.banner %>'
     242 + },
     243 + src: [
     244 + '<%= vendor_files.js %>',
     245 + 'module.prefix',
     246 + '<%= build_dir %>/src/**/*.js',
     247 + '<%= html2js.app.dest %>',
     248 + '<%= html2js.common.dest %>',
     249 + 'module.suffix'
     250 + ],
     251 + dest: '<%= compile_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.js'
     252 + }
     253 + },
     254 + 
     255 + /**
     256 + * `grunt coffee` compiles the CoffeeScript sources. To work well with the
     257 + * rest of the build, we have a separate compilation task for sources and
     258 + * specs so they can go to different places. For example, we need the
     259 + * sources to live with the rest of the copied JavaScript so we can include
     260 + * it in the final build, but we don't want to include our specs there.
     261 + */
     262 + coffee: {
     263 + source: {
     264 + options: {
     265 + bare: true
     266 + },
     267 + expand: true,
     268 + cwd: '.',
     269 + src: [ '<%= app_files.coffee %>' ],
     270 + dest: '<%= build_dir %>',
     271 + ext: '.js'
     272 + }
     273 + },
     274 + 
     275 + /**
     276 + * `ng-min` annotates the sources before minifying. That is, it allows us
     277 + * to code without the array syntax.
     278 + */
     279 + ngmin: {
     280 + compile: {
     281 + files: [
     282 + {
     283 + src: [ '<%= app_files.js %>' ],
     284 + cwd: '<%= build_dir %>',
     285 + dest: '<%= build_dir %>',
     286 + expand: true
     287 + }
     288 + ]
     289 + }
     290 + },
     291 + 
     292 + /**
     293 + * Minify the sources!
     294 + */
     295 + uglify: {
     296 + compile: {
     297 + options: {
     298 + banner: '<%= meta.banner %>'
     299 + },
     300 + files: {
     301 + '<%= concat.compile_js.dest %>': '<%= concat.compile_js.dest %>'
     302 + }
     303 + }
     304 + },
     305 + 
     306 + /**
     307 + * `grunt-contrib-less` handles our LESS compilation and uglification automatically.
     308 + * Only our `main.less` file is included in compilation; all other files
     309 + * must be imported from this file.
     310 + */
     311 + less: {
     312 + build: {
     313 + files: {
     314 + '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css': '<%= app_files.less %>'
     315 + }
     316 + },
     317 + compile: {
     318 + files: {
     319 + '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css': '<%= app_files.less %>'
     320 + },
     321 + options: {
     322 + cleancss: true,
     323 + compress: true
     324 + }
     325 + }
     326 + },
     327 + 
     328 + /**
     329 + * `lint5` defines the rules of our linter as well as which files we
     330 + * HTML5 should check.
     331 + */
     332 + htmlangular: {
     333 + options: {
     334 + w3cproxy: '<%= proxy %>',
     335 + tmplext: 'tpl.html',
     336 + reportpath: 'report/html-angular-validate.json',
     337 + reportCheckstylePath: 'report/html-angular-validate-checkstyle.xml',
     338 + customattrs: ["*"]
     339 + },
     340 + files: {
     341 + src: [
     342 + '<%= app_files.atpl %>', '<%= app_files.ctpl %>'
     343 + ]
     344 + }
     345 + },
     346 + 
     347 + /**
     348 + * `eslint` defines the rules of our linter as well as which files we
     349 + * should check. This file, all javascript sources, and all our unit tests
     350 + * are linted based on the policies listed in `options`.
     351 + */
     352 + eslint: {
     353 + src: [
     354 + '<%= app_files.js %>'
     355 + ],
     356 + test: [
     357 + '<%= app_files.jsunit %>'
     358 + ],
     359 + options: {
     360 + outputFile: 'report/eslint.txt'
     361 + }
     362 + },
     363 + 
     364 + /**
     365 + * `lesslint` defines the rules of our linter as well as which .less files we
     366 + * should check.
     367 + */
     368 + lesslint: {
     369 + src: [
     370 + '<%= app_files.less %>'
     371 + ],
     372 + options: {
     373 + formatters: [{
     374 + id: 'csslint-xml',
     375 + dest: 'report/lesslint.xml'
     376 + }],
     377 + csslint: {
     378 + csslintrc: '.csslintrc'
     379 + },
     380 + failOnWarning: false,
     381 + failOnError: false
     382 + }
     383 + },
     384 + 
     385 + /**
     386 + * `coffeelint` does the same as `eslint`, but for CoffeeScript.
     387 + * CoffeeScript is not the default in ngBoilerplate, so we're just using
     388 + * the defaults here.
     389 + */
     390 + coffeelint: {
     391 + src: {
     392 + files: {
     393 + src: [ '<%= app_files.coffee %>' ]
     394 + }
     395 + },
     396 + test: {
     397 + files: {
     398 + src: [ '<%= app_files.coffeeunit %>' ]
     399 + }
     400 + }
     401 + },
     402 + 
     403 + /**
     404 + * HTML2JS is a Grunt plugin that takes all of your template files and
     405 + * places them into JavaScript files as strings that are added to
     406 + * AngularJS's template cache. This means that the templates too become
     407 + * part of the initial payload as one JavaScript file. Neat!
     408 + */
     409 + html2js: {
     410 + /**
     411 + * These are the templates from `src/app`.
     412 + */
     413 + app: {
     414 + options: {
     415 + base: 'src/app'
     416 + },
     417 + src: [ '<%= app_files.atpl %>' ],
     418 + dest: '<%= build_dir %>/templates-app.js'
     419 + },
     420 + 
     421 + /**
     422 + * These are the templates from `src/common`.
     423 + */
     424 + common: {
     425 + options: {
     426 + base: 'src/common'
     427 + },
     428 + src: [ '<%= app_files.ctpl %>' ],
     429 + dest: '<%= build_dir %>/templates-common.js'
     430 + }
     431 + },
     432 + 
     433 + /**
     434 + * The Karma configurations.
     435 + */
     436 + karma: {
     437 + options: {
     438 + configFile: '<%= build_dir %>/karma-unit.js'
     439 + },
     440 + unit: {
     441 + port: 9019,
     442 + background: true
     443 + },
     444 + continuous: {
     445 + singleRun: true
     446 + }
     447 + },
     448 + 
     449 + /**
     450 + * The `index` task compiles the `index.html` file as a Grunt template. CSS
     451 + * and JS files co-exist here but they get split apart later.
     452 + */
     453 + index: {
     454 + 
     455 + /**
     456 + * During development, we don't want to have wait for compilation,
     457 + * concatenation, minification, etc. So to avoid these steps, we simply
     458 + * add all script files directly to the `<head>` of `index.html`. The
     459 + * `src` property contains the list of included files.
     460 + */
     461 + build: {
     462 + dir: '<%= build_dir %>',
     463 + src: [
     464 + '<%= vendor_files.js %>',
     465 + '<%= build_dir %>/src/**/*.js',
     466 + '<%= html2js.common.dest %>',
     467 + '<%= html2js.app.dest %>',
     468 + '<%= vendor_files.css %>',
     469 + '<%= lang_files.json %>',
     470 + '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css'
     471 + ]
     472 + },
     473 + 
     474 + /**
     475 + * When it is time to have a completely compiled application, we can
     476 + * alter the above to include only a single JavaScript and a single CSS
     477 + * file. Now we're back!
     478 + */
     479 + compile: {
     480 + dir: '<%= compile_dir %>',
     481 + src: [
     482 + '<%= concat.compile_js.dest %>',
     483 + '<%= vendor_files.css %>',
     484 + '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css'
     485 + ]
     486 + }
     487 + },
     488 + 
     489 + /**
     490 + * This task compiles the karma template so that changes to its file array
     491 + * don't have to be managed manually.
     492 + */
     493 + karmaconfig: {
     494 + unit: {
     495 + dir: '<%= build_dir %>',
     496 + src: [
     497 + '<%= vendor_files.js %>',
     498 + '<%= html2js.app.dest %>',
     499 + '<%= html2js.common.dest %>',
     500 + '<%= test_files.js %>'
     501 + ]
     502 + }
     503 + },
     504 + 
     505 + /**
     506 + * And for rapid development, we have a watch set up that checks to see if
     507 + * any of the files listed below change, and then to execute the listed
     508 + * tasks when they do. This just saves us from having to type "grunt" into
     509 + * the command-line every time we want to see what we're working on; we can
     510 + * instead just leave "grunt watch" running in a background terminal. Set it
     511 + * and forget it, as Ron Popeil used to tell us.
     512 + *
     513 + * But we don't need the same thing to happen for all the files.
     514 + */
     515 + delta: {
     516 + /**
     517 + * By default, we want the Live Reload to work for all tasks; this is
     518 + * overridden in some tasks (like this file) where browser resources are
     519 + * unaffected. It runs by default on port 35729, which your browser
     520 + * plugin should auto-detect.
     521 + */
     522 + options: {
     523 + livereload: true
     524 + },
     525 + 
     526 + /**
     527 + * When the Gruntfile changes, we just want to lint it. In fact, when
     528 + * your Gruntfile changes, it will automatically be reloaded!
     529 + */
     530 + gruntfile: {
     531 + files: 'Gruntfile.js',
     532 + // tasks: [ 'eslint:gruntfile', 'lesslint:gruntfile' ],
     533 + options: {
     534 + livereload: false
     535 + }
     536 + },
     537 + 
     538 + /**
     539 + * When our JavaScript source files change, we want to run lint them and
     540 + * run our unit tests.
     541 + */
     542 + jssrc: {
     543 + files: [
     544 + '<%= app_files.js %>'
     545 + ],
     546 + tasks: [ /*'eslint:src',*/ 'karma:unit:run', 'copy:build_appjs' ]
     547 + },
     548 + 
     549 + /**
     550 + * When our CoffeeScript source files change, we want to run lint them and
     551 + * run our unit tests.
     552 + */
     553 + coffeesrc: {
     554 + files: [
     555 + '<%= app_files.coffee %>'
     556 + ],
     557 + tasks: [ 'coffeelint:src', 'coffee:source', 'karma:unit:run', 'copy:build_appjs' ]
     558 + },
     559 + 
     560 + /**
     561 + * When assets are changed, copy them. Note that this will *not* copy new
     562 + * files, so this is probably not very useful.
     563 + */
     564 + assets: {
     565 + files: [
     566 + 'src/assets/**/*'
     567 + ],
     568 + tasks: [ 'copy:build_app_assets', 'copy:build_vendor_assets', 'copy:build_app_fonts', 'copy:build_vendor_fonts' ]
     569 + },
     570 + 
     571 + /**
     572 + * When index.html changes, we need to compile it.
     573 + */
     574 + html: {
     575 + files: [ '<%= app_files.html %>' ],
     576 + tasks: [ 'index:build' ]
     577 + },
     578 + 
     579 + /**
     580 + * When our templates change, we only rewrite the template cache.
     581 + */
     582 + tpls: {
     583 + files: [
     584 + '<%= app_files.atpl %>',
     585 + '<%= app_files.ctpl %>'
     586 + ],
     587 + tasks: [ 'html2js' ]
     588 + },
     589 + 
     590 + /**
     591 + * When the CSS files change, we need to compile and minify them.
     592 + */
     593 + less: {
     594 + files: [ 'src/**/*.less' ],
     595 + tasks: [ 'less:build' ]
     596 + },
     597 + 
     598 + /**
     599 + * When a JavaScript unit test file changes, we only want to lint it and
     600 + * run the unit tests. We don't want to do any live reloading.
     601 + */
     602 + jsunit: {
     603 + files: [
     604 + '<%= app_files.jsunit %>'
     605 + ],
     606 + tasks: [ /*'eslint:test',*/ 'karma:unit:run' ],
     607 + options: {
     608 + livereload: false
     609 + }
     610 + },
     611 + 
     612 + /**
     613 + * When a CoffeeScript unit test file changes, we only want to lint it and
     614 + * run the unit tests. We don't want to do any live reloading.
     615 + */
     616 + coffeeunit: {
     617 + files: [
     618 + '<%= app_files.coffeeunit %>'
     619 + ],
     620 + tasks: [ 'coffeelint:test', 'karma:unit:run' ],
     621 + options: {
     622 + livereload: false
     623 + }
     624 + }
     625 + }
     626 + };
     627 + 
     628 + grunt.initConfig( grunt.util._.extend( taskConfig, userConfig ) );
     629 + /**
     630 + * In order to make it safe to just compile or copy *only* what was changed,
     631 + * we need to ensure we are starting from a clean, fresh build. So we rename
     632 + * the `watch` task to `delta` (that's why the configuration var above is
     633 + * `delta`) and then add a new task called `watch` that does a clean build
     634 + * before watching for changes.
     635 + */
     636 + grunt.renameTask( 'watch', 'delta' );
     637 + grunt.registerTask( 'watch', [ 'build', 'karma:unit', 'delta' ] );
     638 + 
     639 + /**
     640 + * The default task is to build and compile.
     641 + */
     642 + grunt.registerTask( 'default', [ 'build', 'compile' ] );
     643 + 
     644 + /**
     645 + * The `build` task gets your app ready to run for development and testing.
     646 + */
     647 + grunt.registerTask( 'build', [
     648 + 'clean',
     649 + 'html2js',
     650 + // 'htmlangular',
     651 + // 'eslint',
     652 + // 'lesslint',
     653 + // 'coffeelint',
     654 + // 'coffee',
     655 + 'less:build',
     656 + // 'concat:build_css',
     657 + 'copy:build_app_assets',
     658 + 'copy:build_app_fonts',
     659 + 'copy:build_vendor_assets',
     660 + 'copy:build_vendor_fonts',
     661 + 'copy:build_appjs',
     662 + 'copy:build_vendorjs',
     663 + 'copy:build_vendorcss',
     664 + 'copy:build_lang_files',
     665 + 'index:build',
     666 + 'karmaconfig',
     667 + 'karma:continuous'
     668 + ] );
     669 + 
     670 + /**
     671 + * The `compile` task gets your app ready for deployment by concatenating and
     672 + * minifying your code.
     673 + */
     674 + grunt.registerTask( 'compile', [
     675 + 'less:compile',
     676 + 'copy:compile_assets',
     677 + 'ngmin',
     678 + 'concat:compile_js',
     679 + 'uglify',
     680 + 'index:compile'
     681 + ] );
     682 + 
     683 + /**
     684 + * A utility function to get all app JavaScript sources.
     685 + */
     686 + function filterForJS ( files ) {
     687 + return files.filter( function ( file ) {
     688 + return file.match( /\.js$/ );
     689 + });
     690 + }
     691 + 
     692 + /**
     693 + * A utility function to get all app CSS sources.
     694 + */
     695 + function filterForCSS ( files ) {
     696 + return files.filter( function ( file ) {
     697 + return file.match( /\.css$/ );
     698 + });
     699 + }
     700 + 
     701 + /**
     702 + * The index.html template includes the stylesheet and javascript sources
     703 + * based on dynamic names calculated in this Gruntfile. This task assembles
     704 + * the list into variables for the template to use and then runs the
     705 + * compilation.
     706 + */
     707 + grunt.registerMultiTask( 'index', 'Process index.html template', function () {
     708 + var dirRE = new RegExp( '^('+grunt.config('build_dir')+'|'+grunt.config('compile_dir')+')\/', 'g' );
     709 + var jsFiles = filterForJS( this.filesSrc ).map( function ( file ) {
     710 + return file.replace( dirRE, '' );
     711 + });
     712 + var cssFiles = filterForCSS( this.filesSrc ).map( function ( file ) {
     713 + return file.replace( dirRE, '' );
     714 + });
     715 + // Set mode (development or production)
     716 + var mode = this.target === 'build' ? 'dev' : 'prod';
     717 + 
     718 + grunt.file.copy('src/index.html', this.data.dir + '/index.html', {
     719 + process: function ( contents ) {
     720 + return grunt.template.process( contents, {
     721 + data: {
     722 + scripts: jsFiles,
     723 + styles: cssFiles,
     724 + version: grunt.config( 'pkg.version' ),
     725 + mode: mode
     726 + }
     727 + });
     728 + }
     729 + });
     730 + });
     731 + 
     732 + /**
     733 + * In order to avoid having to specify manually the files needed for karma to
     734 + * run, we use grunt to manage the list for us. The `karma/*` files are
     735 + * compiled as grunt templates for use by Karma. Yay!
     736 + */
     737 + grunt.registerMultiTask( 'karmaconfig', 'Process karma config templates', function () {
     738 + var jsFiles = filterForJS( this.filesSrc );
     739 + 
     740 + grunt.file.copy( 'karma/karma-unit.tpl.js', grunt.config( 'build_dir' ) + '/karma-unit.js', {
     741 + process: function ( contents ) {
     742 + return grunt.template.process( contents, {
     743 + data: {
     744 + scripts: jsFiles
     745 + }
     746 + });
     747 + }
     748 + });
     749 + });
     750 +};
     751 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/LICENSE
     1 +Copyright (c) 2013 Josh David Miller <[email protected]>
     2 + 
     3 +Permission is hereby granted, free of charge, to any person obtaining a copy of
     4 +this software and associated documentation files (the "Software"), to deal in
     5 +the Software without restriction, including without limitation the rights to
     6 +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
     7 +of the Software, and to permit persons to whom the Software is furnished to do
     8 +so, subject to the following conditions:
     9 + 
     10 +The above copyright notice and this permission notice shall be included in all
     11 +copies or substantial portions of the Software.
     12 + 
     13 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     14 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     15 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     16 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     17 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     18 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     19 +SOFTWARE.
     20 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/README.md
     1 +# Anomaly Detection Graph user interface
     2 + 
     3 +### Install nodejs
     4 + 
     5 +```sh
     6 +npm install
     7 +```
     8 + 
     9 +```sh
     10 +npm install -g grunt-cli
     11 +grunt watch
     12 +```
     13 + 
  • ■ ■ ■ ■ ■
    gui-frontend/build/assets/README.md
     1 +# The `src/assets` Directory
     2 + 
     3 +There's really not much to say here. Every file in this directory is recursively transferred to `dist/assets/`.
     4 + 
     5 + 
  • gui-frontend/build/assets/fe_client_ngbp-0.1.0.css
    Diff is too large to be displayed.
  • gui-frontend/build/assets/img/cmm.png
  • gui-frontend/build/assets/img/external-api.png
  • gui-frontend/build/assets/img/hss.png
  • gui-frontend/build/assets/img/mme-disabled.png
  • gui-frontend/build/assets/img/mwc-2018/cscf_blue_cyan.png
  • gui-frontend/build/assets/img/mwc-2018/cscf_blue_white.png
  • gui-frontend/build/assets/img/mwc-2018/cscf_cyan_blue.png
  • gui-frontend/build/assets/img/mwc-2018/cscf_cyan_white.png
  • gui-frontend/build/assets/img/mwc-2018/cscf_gray_white.png
  • gui-frontend/build/assets/img/mwc-2018/cscf_transparent_white.png
  • gui-frontend/build/assets/img/mwc-2018/database_blue_cyan.png
  • gui-frontend/build/assets/img/mwc-2018/database_blue_white.png
  • gui-frontend/build/assets/img/mwc-2018/database_cyan_blue.png
  • gui-frontend/build/assets/img/mwc-2018/database_cyan_white.png
  • gui-frontend/build/assets/img/mwc-2018/database_gray_white.png
  • gui-frontend/build/assets/img/mwc-2018/dialing_cyan_blue.png
  • gui-frontend/build/assets/img/mwc-2018/dialing_transparent_blue.png
  • gui-frontend/build/assets/img/mwc-2018/ims_blue_cyan.png
  • gui-frontend/build/assets/img/mwc-2018/ims_blue_white.png
  • gui-frontend/build/assets/img/mwc-2018/ims_cyan_blue.png
  • gui-frontend/build/assets/img/mwc-2018/ims_cyan_white.png
  • gui-frontend/build/assets/img/mwc-2018/ims_gray_white.png
  • gui-frontend/build/assets/img/mwc-2018/mobile-phone-cropped-dialing-blue.png
  • gui-frontend/build/assets/img/mwc-2018/mobile-phone-cropped-on-call-green.png
  • gui-frontend/build/assets/img/mwc-2018/mobile-phone-cropped-on-hold-orange.png
  • gui-frontend/build/assets/img/mwc-2018/mobile-phone-cropped-ringing-cyan.png
  • gui-frontend/build/assets/img/mwc-2018/mobile-phone-cropped.png
  • gui-frontend/build/assets/img/mwc-2018/mobile_blue_cyan.png
  • gui-frontend/build/assets/img/mwc-2018/mobile_blue_white.png
  • gui-frontend/build/assets/img/mwc-2018/mobile_cyan_blue.png
  • gui-frontend/build/assets/img/mwc-2018/mobile_cyan_white.png
  • gui-frontend/build/assets/img/mwc-2018/mobile_gray_white.png
  • gui-frontend/build/assets/img/mwc-2018/radio_blue_cyan.png
  • gui-frontend/build/assets/img/mwc-2018/radio_blue_white.png
  • gui-frontend/build/assets/img/mwc-2018/radio_cyan_blue.png
  • gui-frontend/build/assets/img/mwc-2018/radio_cyan_white.png
  • gui-frontend/build/assets/img/mwc-2018/radio_gray_white.png
  • gui-frontend/build/assets/img/mwc-2018/sbc_blue_cyan.png
  • gui-frontend/build/assets/img/mwc-2018/sbc_blue_white.png
  • gui-frontend/build/assets/img/mwc-2018/sbc_cyan_blue.png
  • gui-frontend/build/assets/img/mwc-2018/sbc_cyan_white.png
  • gui-frontend/build/assets/img/mwc-2018/sbc_gray_white.png
  • gui-frontend/build/assets/img/mwc-2018/wifi_access_point_blue_cyan.png
  • gui-frontend/build/assets/img/mwc-2018/wifi_access_point_blue_white.png
  • gui-frontend/build/assets/img/mwc-2018/wifi_access_point_cyan_blue.png
  • gui-frontend/build/assets/img/mwc-2018/wifi_access_point_cyan_white.png
  • gui-frontend/build/assets/img/mwc-2018/wifi_access_point_gray_white.png
  • gui-frontend/build/assets/img/nef.png
  • gui-frontend/build/assets/img/nokia_logo_blue_cropped.png
  • gui-frontend/build/assets/img/top-background.jpg
  • gui-frontend/build/fonts/FontAwesome.otf
    Binary file.
  • gui-frontend/build/fonts/NokiaIcons.woff
    Binary file.
  • gui-frontend/build/fonts/NokiaPureHWeb_Bd.woff
    Binary file.
  • gui-frontend/build/fonts/NokiaPureHWeb_Lt.woff
    Binary file.
  • gui-frontend/build/fonts/NokiaPureHWeb_Rg.woff
    Binary file.
  • gui-frontend/build/fonts/fontawesome-webfont.eot
    Binary file.
  • gui-frontend/build/fonts/fontawesome-webfont.svg
  • gui-frontend/build/fonts/fontawesome-webfont.ttf
    Binary file.
  • gui-frontend/build/fonts/fontawesome-webfont.woff
    Binary file.
  • gui-frontend/build/fonts/fontawesome-webfont.woff2
    Binary file.
  • gui-frontend/build/fonts/glyphicons-halflings-regular.eot
    Binary file.
  • gui-frontend/build/fonts/glyphicons-halflings-regular.svg
  • gui-frontend/build/fonts/glyphicons-halflings-regular.ttf
    Binary file.
  • gui-frontend/build/fonts/glyphicons-halflings-regular.woff
    Binary file.
  • gui-frontend/build/fonts/glyphicons-halflings-regular.woff2
    Binary file.
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build/index.html
     1 +<!DOCTYPE html>
     2 +<html ng-app="fe-client" ng-controller="AppCtrl" lang="en">
     3 + <head>
     4 + <title ng-bind="pageTitle"></title>
     5 + <meta name="viewport" content="width=device-width, initial-scale=1">
     6 + <meta http-equiv="X-UA-Compatible" content="IE=edge" />
     7 + <meta charset="UTF-8">
     8 + <!-- compiled CSS -->
     9 + <link rel="stylesheet" type="text/css" href="assets/fe_client_ngbp-0.1.0.css" />
     10 + <!-- compiled JavaScript -->
     11 + <script type="text/javascript" src="node_modules/jquery/dist/jquery.js"></script>
     12 + <script type="text/javascript" src="node_modules/bootstrap/dist/js/bootstrap.js"></script>
     13 + <script type="text/javascript" src="node_modules/angular/angular.js"></script>
     14 + <script type="text/javascript" src="node_modules/angular-resource/angular-resource.js"></script>
     15 + <script type="text/javascript" src="node_modules/angular-cookies/angular-cookies.js"></script>
     16 + <script type="text/javascript" src="node_modules/angular-bootstrap/ui-bootstrap-tpls.min.js"></script>
     17 + <script type="text/javascript" src="node_modules/@uirouter/angularjs/release/angular-ui-router.js"></script>
     18 + <script type="text/javascript" src="node_modules/angular-ui-utils/modules/route/route.js"></script>
     19 + <script type="text/javascript" src="node_modules/angular-breadcrumb/dist/angular-breadcrumb.js"></script>
     20 + <script type="text/javascript" src="node_modules/sigma/src/sigma.core.js"></script>
     21 + <script type="text/javascript" src="node_modules/sigma/src/conrad.js"></script>
     22 + <script type="text/javascript" src="node_modules/sigma/src/utils/sigma.utils.js"></script>
     23 + <script type="text/javascript" src="node_modules/sigma/src/utils/sigma.polyfills.js"></script>
     24 + <script type="text/javascript" src="node_modules/sigma/src/sigma.settings.js"></script>
     25 + <script type="text/javascript" src="node_modules/sigma/src/classes/sigma.classes.dispatcher.js"></script>
     26 + <script type="text/javascript" src="node_modules/sigma/src/classes/sigma.classes.configurable.js"></script>
     27 + <script type="text/javascript" src="node_modules/sigma/src/classes/sigma.classes.graph.js"></script>
     28 + <script type="text/javascript" src="node_modules/sigma/src/classes/sigma.classes.camera.js"></script>
     29 + <script type="text/javascript" src="node_modules/sigma/src/classes/sigma.classes.quad.js"></script>
     30 + <script type="text/javascript" src="node_modules/sigma/src/classes/sigma.classes.edgequad.js"></script>
     31 + <script type="text/javascript" src="node_modules/sigma/src/captors/sigma.captors.mouse.js"></script>
     32 + <script type="text/javascript" src="node_modules/sigma/src/captors/sigma.captors.touch.js"></script>
     33 + <script type="text/javascript" src="node_modules/sigma/src/renderers/sigma.renderers.canvas.js"></script>
     34 + <script type="text/javascript" src="node_modules/sigma/src/renderers/sigma.renderers.webgl.js"></script>
     35 + <script type="text/javascript" src="node_modules/sigma/src/renderers/sigma.renderers.svg.js"></script>
     36 + <script type="text/javascript" src="node_modules/sigma/src/renderers/sigma.renderers.def.js"></script>
     37 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.labels.def.js"></script>
     38 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.hovers.def.js"></script>
     39 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.nodes.def.js"></script>
     40 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.def.js"></script>
     41 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.curve.js"></script>
     42 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.arrow.js"></script>
     43 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.curvedArrow.js"></script>
     44 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.def.js"></script>
     45 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.curve.js"></script>
     46 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.arrow.js"></script>
     47 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.curvedArrow.js"></script>
     48 + <script type="text/javascript" src="node_modules/sigma/src/renderers/canvas/sigma.canvas.extremities.def.js"></script>
     49 + <script type="text/javascript" src="node_modules/sigma/src/middlewares/sigma.middlewares.rescale.js"></script>
     50 + <script type="text/javascript" src="node_modules/sigma/src/middlewares/sigma.middlewares.copy.js"></script>
     51 + <script type="text/javascript" src="node_modules/sigma/src/misc/sigma.misc.animation.js"></script>
     52 + <script type="text/javascript" src="node_modules/sigma/src/misc/sigma.misc.bindEvents.js"></script>
     53 + <script type="text/javascript" src="node_modules/sigma/src/misc/sigma.misc.bindDOMEvents.js"></script>
     54 + <script type="text/javascript" src="node_modules/sigma/src/misc/sigma.misc.drawHovers.js"></script>
     55 + <script type="text/javascript" src="node_modules/sigma/plugins/sigma.renderers.parallelEdges/utils.js"></script>
     56 + <script type="text/javascript" src="node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edges.curvedArrow.js"></script>
     57 + <script type="text/javascript" src="node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edgehovers.curvedArrow.js"></script>
     58 + <script type="text/javascript" src="node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edgehovers.curve.js"></script>
     59 + <script type="text/javascript" src="node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edges.labels.curve.js"></script>
     60 + <script type="text/javascript" src="node_modules/sigma/plugins/sigma.layout.forceAtlas2/supervisor.js"></script>
     61 + <script type="text/javascript" src="node_modules/sigma/plugins/sigma.layout.forceAtlas2/worker.js"></script>
     62 + <script type="text/javascript" src="node_modules/html2canvas/dist/html2canvas.js"></script>
     63 + <script type="text/javascript" src="src/app/app.js"></script>
     64 + <script type="text/javascript" src="src/app/home/home.js"></script>
     65 + <script type="text/javascript" src="src/common/directives/directives.js"></script>
     66 + <script type="text/javascript" src="src/common/filters/filters.js"></script>
     67 + <script type="text/javascript" src="src/common/helpers/modal/modal.js"></script>
     68 + <script type="text/javascript" src="src/common/helpers/scroll-top/scroll-top.js"></script>
     69 + <script type="text/javascript" src="src/common/services/services.js"></script>
     70 + <script type="text/javascript" src="templates-common.js"></script>
     71 + <script type="text/javascript" src="templates-app.js"></script>
     72 + <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
     73 + <!--[if lt IE 9]>
     74 + <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
     75 + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
     76 + <![endif]-->
     77 + </head>
     78 + <body>
     79 + <!-- Fixed navbar -->
     80 + <nav class="navbar navbar-default"> <!-- navbar-fixed-top -->
     81 + <!--
     82 + <div class="top-background"></div>
     83 + -->
     84 + <div class="container">
     85 + <div class="navbar-header">
     86 + <button ng-init="isCollapsed = true" ng-click="isCollapsed = !isCollapsed" type="button" class="navbar-toggle collapsed">
     87 + <span class="sr-only">Toggle navigation</span>
     88 + <span class="icon-bar"></span>
     89 + <span class="icon-bar"></span>
     90 + <span class="icon-bar"></span>
     91 + </button>
     92 + <span class="text-center navbar-brand">
     93 + <img class="logo-img" src="assets/img/nokia_logo_blue_cropped.png" alt="logo" />
     94 + <!--
     95 + <span class="clearfix header-small">Graph Explorer<!-- Shared Data Layer - -></span>
     96 + -->
     97 + </span>
     98 + </div>
     99 + <!--
     100 + <div class="navbar-collapse" collapse="isCollapsed">
     101 + <ul class="nav navbar-nav">
     102 + <li ng-class=" { 'active' : $state.current.name === 'home' }">
     103 + <a ui-sref="home"><i class="fa fa-home"></i> Home</a>
     104 + <div class="menu-border"></div>
     105 + </li>
     106 + </ul>
     107 + </div>
     108 + --> <!--/.nav-collapse -->
     109 + </div>
     110 + </nav>
     111 + <!--
     112 + <div class="container breadcrumb-container" autoscroll="true">
     113 + <span class="pull-left breadcrumb-image-home">You are here: </span>
     114 + <div class="pull-left" ncy-breadcrumb></div>
     115 + </div>
     116 + -->
     117 + <!-- Begin page content -->
     118 + <div ui-view="main" class="container"></div>
     119 + <footer class="footer text-center">
     120 + <div class="container">
     121 + <small class="text-dark"><!-- Nokia - Mobile World Congress 2018 --><!-- Shared Data Layer --></small>
     122 + </div>
     123 + </footer>
     124 + <scroll-to-top></scroll-to-top>
     125 + <script src="http://localhost:35729/livereload.js"></script>
     126 + </body>
     127 +</html>
     128 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build/karma-unit.js
     1 +module.exports = function ( karma ) {
     2 + karma.set({
     3 + /**
     4 + * From where to look for files, starting with the location of this file.
     5 + */
     6 + basePath: '../',
     7 + 
     8 + /**
     9 + * This is the list of file patterns to load into the browser during testing.
     10 + */
     11 + files: [
     12 + 'node_modules/jquery/dist/jquery.js',
     13 + 'node_modules/bootstrap/dist/js/bootstrap.js',
     14 + 'node_modules/angular/angular.js',
     15 + 'node_modules/angular-resource/angular-resource.js',
     16 + 'node_modules/angular-cookies/angular-cookies.js',
     17 + 'node_modules/angular-bootstrap/ui-bootstrap-tpls.min.js',
     18 + 'node_modules/@uirouter/angularjs/release/angular-ui-router.js',
     19 + 'node_modules/angular-ui-utils/modules/route/route.js',
     20 + 'node_modules/angular-breadcrumb/dist/angular-breadcrumb.js',
     21 + 'node_modules/sigma/src/sigma.core.js',
     22 + 'node_modules/sigma/src/conrad.js',
     23 + 'node_modules/sigma/src/utils/sigma.utils.js',
     24 + 'node_modules/sigma/src/utils/sigma.polyfills.js',
     25 + 'node_modules/sigma/src/sigma.settings.js',
     26 + 'node_modules/sigma/src/classes/sigma.classes.dispatcher.js',
     27 + 'node_modules/sigma/src/classes/sigma.classes.configurable.js',
     28 + 'node_modules/sigma/src/classes/sigma.classes.graph.js',
     29 + 'node_modules/sigma/src/classes/sigma.classes.camera.js',
     30 + 'node_modules/sigma/src/classes/sigma.classes.quad.js',
     31 + 'node_modules/sigma/src/classes/sigma.classes.edgequad.js',
     32 + 'node_modules/sigma/src/captors/sigma.captors.mouse.js',
     33 + 'node_modules/sigma/src/captors/sigma.captors.touch.js',
     34 + 'node_modules/sigma/src/renderers/sigma.renderers.canvas.js',
     35 + 'node_modules/sigma/src/renderers/sigma.renderers.webgl.js',
     36 + 'node_modules/sigma/src/renderers/sigma.renderers.svg.js',
     37 + 'node_modules/sigma/src/renderers/sigma.renderers.def.js',
     38 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.labels.def.js',
     39 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.hovers.def.js',
     40 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.nodes.def.js',
     41 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.def.js',
     42 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.curve.js',
     43 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.arrow.js',
     44 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.curvedArrow.js',
     45 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.def.js',
     46 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.curve.js',
     47 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.arrow.js',
     48 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.curvedArrow.js',
     49 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.extremities.def.js',
     50 + 'node_modules/sigma/src/middlewares/sigma.middlewares.rescale.js',
     51 + 'node_modules/sigma/src/middlewares/sigma.middlewares.copy.js',
     52 + 'node_modules/sigma/src/misc/sigma.misc.animation.js',
     53 + 'node_modules/sigma/src/misc/sigma.misc.bindEvents.js',
     54 + 'node_modules/sigma/src/misc/sigma.misc.bindDOMEvents.js',
     55 + 'node_modules/sigma/src/misc/sigma.misc.drawHovers.js',
     56 + 'node_modules/sigma/plugins/sigma.renderers.parallelEdges/utils.js',
     57 + 'node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edges.curvedArrow.js',
     58 + 'node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edgehovers.curvedArrow.js',
     59 + 'node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edgehovers.curve.js',
     60 + 'node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edges.labels.curve.js',
     61 + 'node_modules/sigma/plugins/sigma.layout.forceAtlas2/supervisor.js',
     62 + 'node_modules/sigma/plugins/sigma.layout.forceAtlas2/worker.js',
     63 + 'node_modules/html2canvas/dist/html2canvas.js',
     64 + 'build/templates-app.js',
     65 + 'build/templates-common.js',
     66 + 'node_modules/angular-mocks/angular-mocks.js',
     67 +
     68 + 'src/**/*.js',
     69 + 'src/**/*.coffee',
     70 + ],
     71 + exclude: [
     72 + 'src/assets/**/*.js'
     73 + ],
     74 + frameworks: [ 'jasmine' ],
     75 + plugins: [ 'karma-jasmine', 'karma-firefox-launcher', 'karma-phantomjs-launcher', 'karma-coffee-preprocessor' ],
     76 + preprocessors: {
     77 + '**/*.coffee': 'coffee',
     78 + },
     79 + 
     80 + /**
     81 + * How to report, by default.
     82 + */
     83 + reporters: 'dots',
     84 + 
     85 + /**
     86 + * On which port should the browser connect, on which port is the test runner
     87 + * operating, and what is the URL path for the browser to use.
     88 + */
     89 + port: 9018,
     90 + runnerPort: 9100,
     91 + urlRoot: '/',
     92 + 
     93 + /**
     94 + * Disable file watching by default.
     95 + */
     96 + autoWatch: false,
     97 + 
     98 + /**
     99 + * The list of browsers to launch to test on. This includes only "Firefox" by
     100 + * default, but other browser names include:
     101 + * Chrome, ChromeCanary, Firefox, Opera, Safari, PhantomJS
     102 + *
     103 + * Note that you can also use the executable name of the browser, like "chromium"
     104 + * or "firefox", but that these vary based on your operating system.
     105 + *
     106 + * You may also leave this blank and manually navigate your browser to
     107 + * http://localhost:9018/ when you're running tests. The window/tab can be left
     108 + * open and the tests will automatically occur there during the build. This has
     109 + * the aesthetic advantage of not launching a browser every time you save.
     110 + */
     111 + browsers: [
     112 + 'PhantomJS'//, 'Firefox'
     113 + ]
     114 + });
     115 +};
     116 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build/languages/enUS.json
     1 +{}
     2 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build/src/app/app.js
     1 +'use strict';
     2 +angular.module('fe-client', [
     3 + 'ngResource',
     4 + 'ngCookies',
     5 + 'services',
     6 + 'ncy-angular-breadcrumb',
     7 + 'templates-app',
     8 + 'templates-common',
     9 + 'modal',
     10 + 'scroll-top',
     11 + 'ui.router',
     12 + 'ui.bootstrap',
     13 + 'directives',
     14 + 'filters',
     15 + 'app.home'
     16 +]).config(function myAppConfig(
     17 + $httpProvider, $urlRouterProvider, $locationProvider, $breadcrumbProvider) {
     18 + 
     19 + $httpProvider.defaults.useXDomain = true;
     20 + $httpProvider.defaults.withCredentials = true;
     21 + delete $httpProvider.defaults.headers.common['X-Requested-With'];
     22 + 
     23 + // redirect to home
     24 + $urlRouterProvider.otherwise('/home');
     25 + // prefix
     26 + $locationProvider.html5Mode(false).hashPrefix('!');
     27 + // breadcrumb template
     28 + $breadcrumbProvider.setOptions({
     29 + 'templateUrl': 'helpers/breadcrumb/breadcrumb.tpl.html'
     30 + });
     31 +}).run(function run($rootScope, $state, $timeout) {
     32 + /**
     33 + * Close alert
     34 + *
     35 + * @param {int} index
     36 + * @returns {undefined}
     37 + */
     38 + $rootScope.closeAlert = function(index) {
     39 + $rootScope.alerts.splice(index, 1);
     40 + };
     41 + // set $state to rootScope
     42 + $rootScope.$state = $state;
     43 + // breadcrumb titles
     44 + $timeout(function() {
     45 + $rootScope.homeBreadCrumb = 'Nokia | Anomaly Detection';
     46 + }, 500);
     47 +}).controller('AppCtrl', function AppCtrl(
     48 + $scope, $rootScope, $window, $timeout) {
     49 + // state change start
     50 + $scope.$on('$stateChangeStart', function(
     51 + event, toState, toParams, fromState, fromParams) {
     52 + // scroll to top whenever a page is changed
     53 + $window.scrollTo(0, 0);
     54 + // clear alerts
     55 + $rootScope.alerts = [];
     56 + });
     57 + // state change success
     58 + $scope.$on('$stateChangeSuccess', function(
     59 + event, toState, toParams, fromState, fromParams) {
     60 + // set page title
     61 + if (angular.isDefined(toState.data.pageTitle)) {
     62 + $timeout(function() {
     63 + $scope.pageTitle = toState.data.pageTitle;
     64 + }, 100);
     65 + }
     66 + });
     67 +});
     68 + 
  • gui-frontend/build/src/app/home/home.js
    Diff is too large to be displayed.
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build/src/common/directives/directives.js
     1 +'use strict';
     2 +angular.module('directives', []);
     3 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build/src/common/filters/filters.js
     1 +'use strict';
     2 +angular.module('filters', [])
     3 +/*
     4 + .filter('filterName', function() {
     5 + return function(value) {
     6 + return '';
     7 + };
     8 + })
     9 +*/
     10 +;
     11 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build/src/common/helpers/modal/modal.js
     1 +'use strict';
     2 +angular.module('modal', ['ui.bootstrap']).controller('ModalInstanceCtrl', function($scope, $modalInstance) {
     3 + $scope.ok = function() {
     4 + $modalInstance.close();
     5 + };
     6 + $scope.cancel = function() {
     7 + $modalInstance.dismiss('cancel');
     8 + };
     9 +});
     10 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build/src/common/helpers/scroll-top/scroll-top.js
     1 +'use strict';
     2 +angular.module('scroll-top', [])
     3 + .directive('scrollToTop', function($window) {
     4 + function backToTop(scope, element) {
     5 + var visibilityVal = 'hidden',
     6 + opacityVal = '0';
     7 + var topScrollTo = function(reduceOffset, timeout) {
     8 + if ($window.pageYOffset !== 0) {
     9 + setTimeout(function() {
     10 + $window.scrollTo(0, $window.pageYOffset - reduceOffset);
     11 + topScrollTo(reduceOffset, timeout);
     12 + }, timeout);
     13 + }
     14 + };
     15 + element.find('button').bind('click', function() {
     16 + topScrollTo(50, 0);
     17 + });
     18 + angular.element($window).bind('scroll', function() {
     19 + visibilityVal = (this.pageYOffset > 1000) ? 'visible' : 'hidden';
     20 + opacityVal = (this.pageYOffset > 1000) ? '1' : '0';
     21 + element.find('button')
     22 + .css({
     23 + 'visibility': visibilityVal,
     24 + 'opacity': opacityVal
     25 + });
     26 + });
     27 + }
     28 + return {
     29 + 'restrict': 'E',
     30 + 'template': '<button title="back-to-top-button" \n'
     31 + + 'class="back-top btn btn-primary">'
     32 + + '<i class="fa fa-angle-up fa-3x"></i></button>',
     33 + 'link': backToTop
     34 + };
     35 + });
     36 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build/src/common/services/services.js
     1 +'use strict';
     2 +/**
     3 + * Services module
     4 + *
     5 + * This module defines:
     6 + * - the host IP addresses of the REST APIs
     7 + * - the endpoints of the REST web services
     8 + */
     9 +angular.module('services', ['ngResource'])
     10 + // Configuration of service module
     11 + .config(function($resourceProvider) {
     12 + $resourceProvider.defaults.stripTrailingSlashes = false;
     13 + })
     14 + // constant variables
     15 + .constant('context', {
     16 + 'protocol': 'http',
     17 + 'host': '127.0.0.1',
     18 + 'port': 5000,
     19 + 'base_api_context': '/api'
     20 + })
     21 + /**
     22 + * Example
     23 + .factory('CheckUsername', ['$resource', 'context', function ($resource, context) {
     24 + return $resource(
     25 + context.protocol + "://" + context.host + ":" + context.port + context.base_apicontext.protocol + '://' + context.host + ':' + context.port + context.base_api_context + 'rest-auth/username/:username', {username: '@username'}, {'method': 'GET'}
     26 + );
     27 + }])
     28 + 
     29 + .factory('getTopology', ['$resource', 'context', function($resource, context) {
     30 + return $resource(context.protocol + '://' + context.host + ':' + context.port + context.base_api_context + '/topology/v1/', {}, {
     31 + 'get': {
     32 + 'method': 'GET'
     33 + }
     34 + });
     35 + }])
     36 + */
     37 + .factory('graphElements', ['$resource', 'context', function($resource, context) {
     38 + return $resource(context.protocol + '://' + context.host + ':' + context.port + context.base_api_context + '/anomaly_detection/v1/', {}, {
     39 + 'get': {
     40 + 'method': 'GET'
     41 + },
     42 + 'post': {
     43 + 'method': 'POST'
     44 + }
     45 + });
     46 + }])
     47 + ;
     48 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build/templates-app.js
     1 +angular.module('templates-app', ['home/home.tpl.html']);
     2 + 
     3 +angular.module("home/home.tpl.html", []).run(["$templateCache", function($templateCache) {
     4 + $templateCache.put("home/home.tpl.html",
     5 + "<section id=\"home\" class=\"container-fluid\">\n" +
     6 + " <div class=\"panel panel-default\">\n" +
     7 + " <div class=\"panel-body\">\n" +
     8 + " <div class=\"row\">\n" +
     9 + " <!--\n" +
     10 + " <div class=\"col-md-12\">\n" +
     11 + " <h4 class=\"heading-level-2\">\n" +
     12 + " <i class=\"fa fa-upload\"></i>\n" +
     13 + " Import Netflow Data\n" +
     14 + " <small ng-show=\"jsonInputContainer\"><a href=\"\" ng-click=\"jsonInputContainer = !jsonInputContainer\"><span><i class=\"fa fa-minus-circle\"></i></span> Hide</a></small>\n" +
     15 + " <small ng-show=\"!jsonInputContainer\"><a href=\"\" ng-click=\"jsonInputContainer = !jsonInputContainer\"><span><i class=\"fa fa-plus-circle\"></i></span> Show</a></small>\n" +
     16 + " </h4>\n" +
     17 + " <div ng-show=\"jsonInputContainer\">\n" +
     18 + " <form class=\"form-group\" ng-submit=\"getGraph()\">\n" +
     19 + " <!-- required=\"true\" ng-model=\"jsonInput\" -/->\n" +
     20 + " <textarea class=\"form-control rounded-0 graph-input\" id=\"graph_exploer_json_input\" rows=\"7\">{\"key\": \"value\"}</textarea>\n" +
     21 + " <br />\n" +
     22 + " <button type=\"submit\" class=\"btn btn-primary btn-md\">\n" +
     23 + " <i class=\"fa fa-gear\"></i> Process\n" +
     24 + " </button>\n" +
     25 + " </form>\n" +
     26 + " </div>\n" +
     27 + " </div>\n" +
     28 + " -->\n" +
     29 + " <!--\n" +
     30 + " <div class=\"col-md-12\">\n" +
     31 + " <h4 class=\"heading-level-2\">\n" +
     32 + " <i class=\"fa fa-envelope\"></i>\n" +
     33 + " Email Subjects\n" +
     34 + " <small ng-show=\"subjectsContainer\"><a href=\"\" ng-click=\"subjectsContainer = !subjectsContainer\"><span><i class=\"fa fa-minus-circle\"></i></span> Hide</a></small>\n" +
     35 + " <small ng-show=\"!subjectsContainer\"><a href=\"\" ng-click=\"subjectsContainer = !subjectsContainer\"><span><i class=\"fa fa-plus-circle\"></i></span> Show</a></small>\n" +
     36 + " </h4>\n" +
     37 + " <div ng-show=\"subjectsContainer\">\n" +
     38 + " <div ng-if=\"graphElements === ''\" class=\"alert alert-info graph-alert\" role=\"alert\">\n" +
     39 + " <strong>Info!</strong> No data to show. Please, submit the Graph Explorer json.\n" +
     40 + " </div>\n" +
     41 + " <ul class=\"list-inline\">\n" +
     42 + " <li class=\"subject-list\" ng-repeat=\"graph in graphElements['result']\">\n" +
     43 + " <a href='' ng-class=\" { 'active' : graph['subject'] === currentSubject } \" class=\"list-group-item subject-list-link\" ng-click=\"loadGraph(graph);\">{{graph[\"subject\"]}}</a>\n" +
     44 + " </li>\n" +
     45 + " </ul>\n" +
     46 + " </div>\n" +
     47 + " </div>\n" +
     48 + " -->\n" +
     49 + " <div class=\"col-md-12\">\n" +
     50 + " <h4 class=\"heading-level-2\">\n" +
     51 + " <i class=\"fa fa-link\"></i>\n" +
     52 + " Graph\n" +
     53 + " <small ng-show=\"graphContainer\"><a href=\"\" ng-click=\"graphContainer = !graphContainer\"><span><i class=\"fa fa-minus-circle\"></i></span> Hide</a></small>\n" +
     54 + " <small ng-show=\"!graphContainer\"><a href=\"\" ng-click=\"graphContainer = !graphContainer\"><span><i class=\"fa fa-plus-circle\"></i></span> Show</a></small>\n" +
     55 + " </h4>\n" +
     56 + " <button ng-if=\"currentSubject !== '' && graphContainer\" class=\"btn btn-sm btn-default pull-right\" ng-click=\"downloadGraph()\"><i class=\"fa fa-download\"></i> Download</button>\n" +
     57 + " <div id=\"graph-container\" ng-show=\"graphContainer\">\n" +
     58 + " <div ng-if=\"graphElements === ''\" class=\"alert alert-info graph-alert\" role=\"alert\">\n" +
     59 + " <strong>Info!</strong> No data to show. Please, submit the Graph Explorer json.\n" +
     60 + " </div>\n" +
     61 + " <h4>\n" +
     62 + " <!--\n" +
     63 + " <span ng-if=\"currentSubject !== ''\" class=\"label label-primary text-center\">Subject: {{currentSubject}}</span>\n" +
     64 + " -->\n" +
     65 + " <span ng-if=\"numberOfPackets !== ''\" class=\"label label-primary text-center\">{{numberOfPings}} messages sent by botnet to the machines within ten minutes on 2011/08/17, 14:24:20 to 14:34:20</span>\n" +
     66 + " <span ng-if=\"numberOfPingsPerMachine !== '' && numberOfPingsPerMachine > 0\" class=\"label label-danger text-center\">Received {{numberOfPingsPerMachine}} message<span ng-if=\"numberOfPingsPerMachine > 1\">s</span> from botnet</span>\n" +
     67 + " <!--\n" +
     68 + " <span class=\"label label-primary text-center\">Initiator: {{initiator}}</span>\n" +
     69 + " -->\n" +
     70 + " </h4>\n" +
     71 + " <!-- ng-show=\"hasGraph\" -->\n" +
     72 + " <div id=\"container\"></div>\n" +
     73 + " </div>\n" +
     74 + " </div>\n" +
     75 + " </div>\n" +
     76 + " </div>\n" +
     77 + " </div>\n" +
     78 + "</section>\n" +
     79 + "");
     80 +}]);
     81 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build/templates-common.js
     1 +angular.module('templates-common', ['helpers/modal/modal.tpl.html']);
     2 + 
     3 +angular.module("helpers/modal/modal.tpl.html", []).run(["$templateCache", function($templateCache) {
     4 + $templateCache.put("helpers/modal/modal.tpl.html",
     5 + "<div class=\"modal-body\">\n" +
     6 + " {{'CONFIRM_PROCEED_MODAL' | translate}}\n" +
     7 + "</div>\n" +
     8 + "<div class=\"modal-footer\">\n" +
     9 + " <button class=\"btn btn-primary\" ng-click=\"ok()\" ng-bind=\" 'YES' | translate \"></button>\n" +
     10 + " <button class=\"btn btn-warning\" ng-click=\"cancel()\" ng-bind=\" 'NO' | translate \"></button>\n" +
     11 + "</div>\n" +
     12 + "");
     13 +}]);
     14 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/build.config.js
     1 +/**
     2 + * This file/module contains all configuration for the build process.
     3 + */
     4 +module.exports = {
     5 + /**
     6 + * The `build_dir` folder is where our projects are compiled during
     7 + * development and the `compile_dir` folder is where our app resides once it's
     8 + * completely built.
     9 + */
     10 + build_dir: 'build',
     11 + compile_dir: 'bin',
     12 + proxy: 'http://10.144.1.10:8080',
     13 + /**
     14 + * This is a collection of file patterns that refer to our app code (the
     15 + * stuff in `src/`). These file paths are used in the configuration of
     16 + * build tasks. `js` is all project javascript, less tests. `ctpl` contains
     17 + * our reusable components' (`src/common`) template HTML files, while
     18 + * `atpl` contains the same, but for our app's code. `html` is just our
     19 + * main HTML file, `less` is our main stylesheet, and `unit` contains our
     20 + * app's unit tests.
     21 + */
     22 + app_files: {
     23 + js: ['src/**/*.js', '!src/**/*.spec.js', '!src/assets/**/*.js'],
     24 + jsunit: ['src/**/*.spec.js'],
     25 + coffee: ['src/**/*.coffee', '!src/**/*.spec.coffee'],
     26 + coffeeunit: ['src/**/*.spec.coffee'],
     27 + atpl: ['src/app/**/*.tpl.html'],
     28 + ctpl: ['src/common/**/*.tpl.html'],
     29 + html: ['src/index.html'],
     30 + less: 'src/less/main.less',
     31 + fonts: ['src/fonts/*']
     32 + },
     33 + lang_files: {
     34 + json: ['src/languages/**/*.json']
     35 + },
     36 + /**
     37 + * This is a collection of files used during testing only.
     38 + */
     39 + test_files: {
     40 + js: [
     41 + 'node_modules/angular-mocks/angular-mocks.js'
     42 + ]
     43 + },
     44 + /**
     45 + * This is the same as `app_files`, except it contains patterns that
     46 + * reference vendor code (`node_modules/`) that we need to place into the build
     47 + * process somewhere. While the `app_files` property ensures all
     48 + * standardized files are collected for compilation, it is the user's job
     49 + * to ensure non-standardized (i.e. vendor-related) files are handled
     50 + * appropriately in `vendor_files.js`.
     51 + *
     52 + * The `vendor_files.js` property holds files to be automatically
     53 + * concatenated and minified with our project source files.
     54 + *
     55 + * The `vendor_files.css` property holds any CSS files to be automatically
     56 + * included in our app.
     57 + *
     58 + * The `vendor_files.assets` property holds any assets to be copied along
     59 + * with our app's assets. This structure is flattened, so it is not
     60 + * recommended that you use wildcards.
     61 + */
     62 + vendor_files: {
     63 + js: [
     64 + 'node_modules/jquery/dist/jquery.js',
     65 + 'node_modules/bootstrap/dist/js/bootstrap.js',
     66 + 'node_modules/angular/angular.js',
     67 + 'node_modules/angular-resource/angular-resource.js',
     68 + 'node_modules/angular-cookies/angular-cookies.js',
     69 + 'node_modules/angular-bootstrap/ui-bootstrap-tpls.min.js',
     70 + 'node_modules/@uirouter/angularjs/release/angular-ui-router.js',
     71 + 'node_modules/angular-ui-utils/modules/route/route.js',
     72 + 'node_modules/angular-breadcrumb/dist/angular-breadcrumb.js', //,
     73 + // 'node_modules/cytoscape/dist/cytoscape.js',
     74 + // 'node_modules/cytoscape-node-html-label/dist/*min.js',
     75 + // 'node_modules/sigma-bower-master/*.min.js',
     76 + // 'node_modules/sigma-bower-master/plugins/*.min.js'
     77 + 
     78 + /*
     79 + // Core:
     80 + 'node_modules/sigma/src/sigma.core.js',
     81 + // 'node_modules/sigma/src/sigma.export.js',
     82 + 
     83 + // Utils:
     84 + 'node_modules/sigma/src/conrad.js',
     85 + 'node_modules/sigma/src/utils/sigma.utils.js',
     86 + 'node_modules/sigma/src/utils/sigma.polyfills.js',
     87 + 'node_modules/sigma/src/sigma.settings.js',
     88 + 
     89 + 
     90 + // Main classes:
     91 + 'node_modules/sigma/src/classes/*.js',
     92 + // 'node_modules/sigma/src/sigma.settings.js',
     93 + // 'node_modules/sigma/src/classes/sigma.classes.dispatcher.js',
     94 + // 'node_modules/sigma/src/classes/sigma.classes.configurable.js',
     95 + // 'node_modules/sigma/src/classes/sigma.classes.graph.js',
     96 + // 'node_modules/sigma/src/classes/sigma.classes.camera.js',
     97 + // 'node_modules/sigma/src/classes/sigma.classes.quad.js',
     98 + // 'node_modules/sigma/src/classes/sigma.classes.edgequad.js',
     99 + 
     100 + // Captors:
     101 + 'node_modules/sigma/src/captors/*.js',
     102 + // 'node_modules/sigma/src/captors/sigma.captors.mouse.js',
     103 + // 'node_modules/sigma/src/captors/sigma.captors.touch.js',
     104 + 
     105 + // Renderers:
     106 + 'node_modules/sigma/src/renderers/*.js',
     107 + 'node_modules/sigma/src/renderers/canvas/*.js',
     108 + 'node_modules/sigma/src/renderers/svg/*.js',
     109 + 'node_modules/sigma/src/renderers/webgl/*.js',
     110 + // 'node_modules/sigma/src/renderers/sigma.renderers.canvas.js',
     111 + // 'node_modules/sigma/src/renderers/sigma.renderers.webgl.js',
     112 + // 'node_modules/sigma/src/renderers/sigma.renderers.svg.js',
     113 + // 'node_modules/sigma/src/renderers/sigma.renderers.def.js',
     114 + 
     115 + // Sub functions per engine:
     116 + // 'node_modules/sigma/src/renderers/webgl/sigma.webgl.nodes.def.js',
     117 + // 'node_modules/sigma/src/renderers/webgl/sigma.webgl.nodes.fast.js',
     118 + // 'node_modules/sigma/src/renderers/webgl/sigma.webgl.edges.def.js',
     119 + // 'node_modules/sigma/src/renderers/webgl/sigma.webgl.edges.fast.js',
     120 + // 'node_modules/sigma/src/renderers/webgl/sigma.webgl.edges.arrow.js',
     121 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.labels.def.js',
     122 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.hovers.def.js',
     123 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.nodes.def.js',
     124 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.def.js',
     125 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.dotCurve.js',
     126 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.arrow.js',
     127 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.dotCurvedArrow.js',
     128 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.def.js',
     129 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.curve.js',
     130 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.arrow.js',
     131 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.curvedArrow.js',
     132 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.extremities.def.js',
     133 + // 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.labels.curvedArrow.js',
     134 + // 'node_modules/sigma/src/renderers/svg/sigma.svg.utils.js',
     135 + // 'node_modules/sigma/src/renderers/svg/sigma.svg.nodes.def.js',
     136 + // 'node_modules/sigma/src/renderers/svg/sigma.svg.edges.def.js',
     137 + // 'node_modules/sigma/src/renderers/svg/sigma.svg.edges.curve.js',
     138 + // 'node_modules/sigma/src/renderers/svg/sigma.svg.labels.def.js',
     139 + // 'node_modules/sigma/src/renderers/svg/sigma.svg.hovers.def.js',
     140 + 
     141 + // Middlewares:
     142 + 'node_modules/sigma/src/middlewares/*.js',
     143 + // 'node_modules/sigma/src/middlewares/sigma.middlewares.rescale.js',
     144 + // 'node_modules/sigma/src/middlewares/sigma.middlewares.copy.js',
     145 + 
     146 + // Misc:
     147 + 'node_modules/sigma/src/misc/*.js',
     148 + // 'node_modules/sigma/src/misc/sigma.misc.animation.js',
     149 + // 'node_modules/sigma/src/misc/sigma.misc.bindEvents.js',
     150 + // 'node_modules/sigma/src/misc/sigma.misc.bindDOMEvents.js',
     151 + // 'node_modules/sigma/src/misc/sigma.misc.drawHovers.js',
     152 + 
     153 + // Plugins
     154 + 'node_modules/sigma/plugins/sigma.exporters.svg/*.js',
     155 + */
     156 + 
     157 + // 'node_modules/sigma/src/sigma.core.js',
     158 + // 'node_modules/sigma/src/conrad.js',
     159 + 
     160 + 'node_modules/sigma/src/sigma.core.js',
     161 + 'node_modules/sigma/src/conrad.js',
     162 + 'node_modules/sigma/src/utils/sigma.utils.js',
     163 + 'node_modules/sigma/src/utils/sigma.polyfills.js',
     164 + 'node_modules/sigma/src/sigma.settings.js',
     165 + 'node_modules/sigma/src/classes/sigma.classes.dispatcher.js',
     166 + 'node_modules/sigma/src/classes/sigma.classes.configurable.js',
     167 + 'node_modules/sigma/src/classes/sigma.classes.graph.js',
     168 + 'node_modules/sigma/src/classes/sigma.classes.camera.js',
     169 + 'node_modules/sigma/src/classes/sigma.classes.quad.js',
     170 + 'node_modules/sigma/src/classes/sigma.classes.edgequad.js',
     171 + 'node_modules/sigma/src/captors/sigma.captors.mouse.js',
     172 + 'node_modules/sigma/src/captors/sigma.captors.touch.js',
     173 + 'node_modules/sigma/src/renderers/sigma.renderers.canvas.js',
     174 + 'node_modules/sigma/src/renderers/sigma.renderers.webgl.js',
     175 + 'node_modules/sigma/src/renderers/sigma.renderers.svg.js',
     176 + 'node_modules/sigma/src/renderers/sigma.renderers.def.js',
     177 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.labels.def.js',
     178 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.hovers.def.js',
     179 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.nodes.def.js',
     180 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.def.js',
     181 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.curve.js',
     182 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.arrow.js',
     183 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edges.curvedArrow.js',
     184 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.def.js',
     185 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.curve.js',
     186 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.arrow.js',
     187 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.edgehovers.curvedArrow.js',
     188 + 'node_modules/sigma/src/renderers/canvas/sigma.canvas.extremities.def.js',
     189 + 'node_modules/sigma/src/middlewares/sigma.middlewares.rescale.js',
     190 + 'node_modules/sigma/src/middlewares/sigma.middlewares.copy.js',
     191 + 'node_modules/sigma/src/misc/sigma.misc.animation.js',
     192 + 'node_modules/sigma/src/misc/sigma.misc.bindEvents.js',
     193 + 'node_modules/sigma/src/misc/sigma.misc.bindDOMEvents.js',
     194 + 'node_modules/sigma/src/misc/sigma.misc.drawHovers.js',
     195 + 'node_modules/sigma/plugins/sigma.renderers.parallelEdges/utils.js',
     196 + 'node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edges.curvedArrow.js',
     197 + 'node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edgehovers.curvedArrow.js',
     198 + 'node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edgehovers.curve.js',
     199 + 'node_modules/sigma/plugins/sigma.renderers.parallelEdges/sigma.canvas.edges.labels.curve.js',
     200 + 'node_modules/sigma/plugins/sigma.layout.forceAtlas2/supervisor.js',
     201 + 'node_modules/sigma/plugins/sigma.layout.forceAtlas2/worker.js',
     202 + 
     203 + // html2canvas
     204 + 'node_modules/html2canvas/dist/html2canvas.js',
     205 + ],
     206 + css: [],
     207 + fonts: [
     208 + 'node_modules/font-awesome/fonts/*',
     209 + // 'node_modules/ionicons/fonts/*',
     210 + 'node_modules/bootstrap/fonts/*'
     211 + ],
     212 + assets: []
     213 + },
     214 +};
     215 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/changelog.tpl
     1 + 
     2 +# <%= version%> (<%= today%>)
     3 + 
     4 +<% if (_(changelog.feat).size() > 0) { %> ## Features
     5 +<% _(changelog.feat).forEach(function(changes, scope) { %>
     6 +- **<%= scope%>:**
     7 + <% changes.forEach(function(change) { %> - <%= change.msg%> (<%= helpers.commitLink(change.sha1) %>)
     8 + <% }); %>
     9 +<% }); %> <% } %>
     10 + 
     11 +<% if (_(changelog.fix).size() > 0) { %> ## Fixes
     12 +<% _(changelog.fix).forEach(function(changes, scope) { %>
     13 +- **<%= scope%>:**
     14 + <% changes.forEach(function(change) { %> - <%= change.msg%> (<%= helpers.commitLink(change.sha1) %>)
     15 + <% }); %>
     16 +<% }); %> <% } %>
     17 + 
     18 +<% if (_(changelog.breaking).size() > 0) { %> ## Breaking Changes
     19 +<% _(changelog.breaking).forEach(function(changes, scope) { %>
     20 +- **<%= scope%>:**
     21 + <% changes.forEach(function(change) { %> <%= change.msg%>
     22 + <% }); %>
     23 +<% }); %> <% } %>
     24 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/karma/karma-unit.tpl.js
     1 +module.exports = function ( karma ) {
     2 + karma.set({
     3 + /**
     4 + * From where to look for files, starting with the location of this file.
     5 + */
     6 + basePath: '../',
     7 + 
     8 + /**
     9 + * This is the list of file patterns to load into the browser during testing.
     10 + */
     11 + files: [
     12 + <% scripts.forEach( function ( file ) { %>'<%= file %>',
     13 + <% }); %>
     14 + 'src/**/*.js',
     15 + 'src/**/*.coffee',
     16 + ],
     17 + exclude: [
     18 + 'src/assets/**/*.js'
     19 + ],
     20 + frameworks: [ 'jasmine' ],
     21 + plugins: [ 'karma-jasmine', 'karma-firefox-launcher', 'karma-phantomjs-launcher', 'karma-coffee-preprocessor' ],
     22 + preprocessors: {
     23 + '**/*.coffee': 'coffee',
     24 + },
     25 + 
     26 + /**
     27 + * How to report, by default.
     28 + */
     29 + reporters: 'dots',
     30 + 
     31 + /**
     32 + * On which port should the browser connect, on which port is the test runner
     33 + * operating, and what is the URL path for the browser to use.
     34 + */
     35 + port: 9018,
     36 + runnerPort: 9100,
     37 + urlRoot: '/',
     38 + 
     39 + /**
     40 + * Disable file watching by default.
     41 + */
     42 + autoWatch: false,
     43 + 
     44 + /**
     45 + * The list of browsers to launch to test on. This includes only "Firefox" by
     46 + * default, but other browser names include:
     47 + * Chrome, ChromeCanary, Firefox, Opera, Safari, PhantomJS
     48 + *
     49 + * Note that you can also use the executable name of the browser, like "chromium"
     50 + * or "firefox", but that these vary based on your operating system.
     51 + *
     52 + * You may also leave this blank and manually navigate your browser to
     53 + * http://localhost:9018/ when you're running tests. The window/tab can be left
     54 + * open and the tests will automatically occur there during the build. This has
     55 + * the aesthetic advantage of not launching a browser every time you save.
     56 + */
     57 + browsers: [
     58 + 'PhantomJS'//, 'Firefox'
     59 + ]
     60 + });
     61 +};
     62 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/module.prefix
     1 +(function ( window, angular, undefined ) {
     2 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/module.suffix
     1 +})( window, window.angular );
     2 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/package.json
     1 +{
     2 + "author": "Josh David Miller",
     3 + "name": "fe_client_ngbp",
     4 + "version": "0.1.0",
     5 + "homepage": "https://github.com/ngbp/ngbp",
     6 + "licenses": {
     7 + "type": "MIT",
     8 + "url": "https://raw.github.com/ngbp/ngbp/master/LICENSE"
     9 + },
     10 + "bugs": "https://github.com/ngbp/ngbp/issues",
     11 + "repository": {
     12 + "type": "git",
     13 + "url": "[email protected]:ngbp/ngbp.git"
     14 + },
     15 + "dependencies": {
     16 + "angular-ui-utils": "^0.1.1",
     17 + "html2canvas": "^1.0.0-alpha.12"
     18 + },
     19 + "devDependencies": {
     20 + "@uirouter/angularjs": "^0.2.15",
     21 + "angular": "1.4.8",
     22 + "angular-bootstrap": "0.12.2",
     23 + "angular-breadcrumb": "0.4.1",
     24 + "angular-cookies": "1.4.8",
     25 + "angular-mocks": "1.4.8",
     26 + "angular-resource": "1.4.8",
     27 + "bootstrap": "3.3.6",
     28 + "font-awesome": "4.5.0",
     29 + "grunt": "^0.4.5",
     30 + "grunt-bump": "0.0.6",
     31 + "grunt-coffeelint": "~0.0.10",
     32 + "grunt-contrib-clean": "^0.4.1",
     33 + "grunt-contrib-coffee": "^0.7.0",
     34 + "grunt-contrib-concat": "^0.3.0",
     35 + "grunt-contrib-copy": "^0.4.1",
     36 + "grunt-contrib-csslint": "^1.0.0",
     37 + "grunt-contrib-less": "~0.11.0",
     38 + "grunt-contrib-uglify": "^0.2.7",
     39 + "grunt-contrib-watch": "^0.4.4",
     40 + "grunt-conventional-changelog": "^0.1.2",
     41 + "grunt-eslint": "^18.1.0",
     42 + "grunt-html-angular-validate": "^0.5.8",
     43 + "grunt-html2js": "^0.1.9",
     44 + "grunt-karma": "^0.8.2",
     45 + "grunt-lesslint": "^3.2.0",
     46 + "grunt-ngmin": "0.0.2",
     47 + "ionicons": "2.0.1",
     48 + "jquery": "^2.2.0",
     49 + "karma": "^2.0.0",
     50 + "karma-coffee-preprocessor": "^0.2.1",
     51 + "karma-firefox-launcher": "^0.1.3",
     52 + "karma-jasmine": "^0.1.5",
     53 + "karma-phantomjs-launcher": "~1.0.2",
     54 + "sigma": "*"
     55 + }
     56 +}
     57 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/README.md
     1 +# The `src` Directory
     2 + 
     3 +## Overview
     4 + 
     5 +The `src/` directory contains all code used in the application along with all
     6 +tests of such code.
     7 + 
     8 +```
     9 +src/
     10 + |- app/
     11 + | |- about/
     12 + | |- home/
     13 + | |- app.js
     14 + | |- app.spec.js
     15 + |- assets/
     16 + |- common/
     17 + | |- plusOne/
     18 + |- less/
     19 + | |- main.less
     20 + | |- variables.less
     21 + |- index.html
     22 +```
     23 + 
     24 +- `src/app/` - application-specific code, i.e. code not likely to be reused in
     25 + another application. [Read more &raquo;](app/README.md)
     26 +- `src/assets/` - static files like fonts and images.
     27 + [Read more &raquo;](assets/README.md)
     28 +- `src/common/` - third-party libraries or components likely to be reused in
     29 + another application. [Read more &raquo;](common/README.md)
     30 +- `src/less/` - LESS CSS files. [Read more &raquo;](less/README.md)
     31 +- `src/index.html` - this is the HTML document of the single-page application.
     32 + See below.
     33 + 
     34 +See each directory for a detailed explanation.
     35 + 
     36 +## `index.html`
     37 + 
     38 +The `index.html` file is the HTML document of the single-page application (SPA)
     39 +that should contain all markup that applies to everything in the app, such as
     40 +the header and footer. It declares with `ngApp` that this is `app`,
     41 +specifies the main `AppCtrl` controller, and contains the `ngView` directive
     42 +into which route templates are placed.
     43 + 
     44 +Unlike any other HTML document (e.g. the templates), `index.html` is compiled as
     45 +a Grunt template, so variables from `Gruntfile.js` and `package.json` can be
     46 +referenced from within it. Changing `name` in `package.json` from
     47 +"ng-boilerplate" will rename the resultant CSS and JavaScript placed in `build/`,
     48 +so this HTML references them by variable for convenience.
     49 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/app/app.js
     1 +'use strict';
     2 +angular.module('fe-client', [
     3 + 'ngResource',
     4 + 'ngCookies',
     5 + 'services',
     6 + 'ncy-angular-breadcrumb',
     7 + 'templates-app',
     8 + 'templates-common',
     9 + 'modal',
     10 + 'scroll-top',
     11 + 'ui.router',
     12 + 'ui.bootstrap',
     13 + 'directives',
     14 + 'filters',
     15 + 'app.home'
     16 +]).config(function myAppConfig(
     17 + $httpProvider, $urlRouterProvider, $locationProvider, $breadcrumbProvider) {
     18 + 
     19 + $httpProvider.defaults.useXDomain = true;
     20 + $httpProvider.defaults.withCredentials = true;
     21 + delete $httpProvider.defaults.headers.common['X-Requested-With'];
     22 + 
     23 + // redirect to home
     24 + $urlRouterProvider.otherwise('/home');
     25 + // prefix
     26 + $locationProvider.html5Mode(false).hashPrefix('!');
     27 + // breadcrumb template
     28 + $breadcrumbProvider.setOptions({
     29 + 'templateUrl': 'helpers/breadcrumb/breadcrumb.tpl.html'
     30 + });
     31 +}).run(function run($rootScope, $state, $timeout) {
     32 + /**
     33 + * Close alert
     34 + *
     35 + * @param {int} index
     36 + * @returns {undefined}
     37 + */
     38 + $rootScope.closeAlert = function(index) {
     39 + $rootScope.alerts.splice(index, 1);
     40 + };
     41 + // set $state to rootScope
     42 + $rootScope.$state = $state;
     43 + // breadcrumb titles
     44 + $timeout(function() {
     45 + $rootScope.homeBreadCrumb = 'Nokia | Anomaly Detection';
     46 + }, 500);
     47 +}).controller('AppCtrl', function AppCtrl(
     48 + $scope, $rootScope, $window, $timeout) {
     49 + // state change start
     50 + $scope.$on('$stateChangeStart', function(
     51 + event, toState, toParams, fromState, fromParams) {
     52 + // scroll to top whenever a page is changed
     53 + $window.scrollTo(0, 0);
     54 + // clear alerts
     55 + $rootScope.alerts = [];
     56 + });
     57 + // state change success
     58 + $scope.$on('$stateChangeSuccess', function(
     59 + event, toState, toParams, fromState, fromParams) {
     60 + // set page title
     61 + if (angular.isDefined(toState.data.pageTitle)) {
     62 + $timeout(function() {
     63 + $scope.pageTitle = toState.data.pageTitle;
     64 + }, 100);
     65 + }
     66 + });
     67 +});
     68 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/app/app.spec.js
     1 +'use strict';
     2 +describe('AppCtrl', function() {
     3 + describe('isCurrentUrl', function() {
     4 + var AppCtrl, $location, $scope;
     5 + beforeEach(module('fe-client'));
     6 + beforeEach(inject(function($controller, _$location_, $rootScope) {
     7 + $location = _$location_;
     8 + $scope = $rootScope.$new();
     9 + AppCtrl = $controller(
     10 + 'AppCtrl', {
     11 + '$location': $location,
     12 + '$scope': $scope
     13 + });
     14 + }));
     15 + it('should pass a dummy test', inject(function() {
     16 + expect(AppCtrl).toBeTruthy();
     17 + }));
     18 + });
     19 +});
     20 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/app/home/README.md
     1 +# The `src/app/home` Directory
     2 + 
     3 +## Overview
     4 + 
     5 +```
     6 +src/
     7 + |- app/
     8 + | |- home/
     9 + | | |- home.js
     10 + | | |- home.less
     11 + | | |- home.spec.js
     12 + | | |- home.tpl.html
     13 +```
     14 + 
     15 +- `home.js` - defines the module.
     16 +- `home.less` - module-specific styles; this file is imported into
     17 + `src/less/main.less` manually by the developer.
     18 +- `home.spec.js` - module unit tests.
     19 +- `home.tpl.html` - the route template.
     20 + 
     21 +## `home.js`
     22 + 
     23 +This boilerplate is too simple to demonstrate it, but `src/app/home` could have
     24 +several sub-folders representing additional modules that would then be listed
     25 +as dependencies of this one. For example, a `note` section could have the
     26 +submodules `note.create`, `note.delete`, `note.search`, etc.
     27 + 
     28 +Regardless, so long as dependencies are managed correctly, the build process
     29 +will automatically take take of the rest.
     30 + 
     31 +The dependencies block is also where component dependencies should be
     32 +specified, as shown below.
     33 + 
     34 +```js
     35 +angular.module( 'app.home', [
     36 + 'ui.router',
     37 + 'titleService',
     38 + 'plusOne'
     39 +])
     40 +```
     41 + 
     42 +Each section or module of the site can also have its own routes. AngularJS will
     43 +handle ensuring they are all available at run-time, but splitting it this way
     44 +makes each module more self-contained. We use [ui-router](https://github.com/angular-ui/ui-router) to create
     45 +a state for our 'home' page. We set the url we'd like to see in the address bar
     46 +as well as the controller and template file to load. Specifying "main" as our view
     47 +means the controller and template will be loaded into the <div ui-view="main"/> element
     48 +of the root template (aka index.html). Read more over at the [ui-router wiki](https://github.com/angular-ui/ui-router/wiki).
     49 +Finally we add a custom data property, pageTitle, which will be used to set the page's
     50 +title (see the app.js controller).
     51 + 
     52 +```js
     53 +.config(function config( $stateProvider ) {
     54 + $stateProvider.state( 'home', {
     55 + url: '/home',
     56 + views: {
     57 + "main": {
     58 + controller: 'HomeCtrl',
     59 + templateUrl: 'home/home.tpl.html'
     60 + }
     61 + },
     62 + data:{ pageTitle: 'Home' }
     63 + });
     64 +})
     65 +```
     66 + 
     67 +And of course we define a controller for our route, though in this case it does
     68 +nothing.
     69 + 
     70 +```js
     71 +.controller( 'HomeCtrl', function HomeController( $scope ) {
     72 +})
     73 +```
     74 + 
  • gui-frontend/src/app/home/home.js
    Diff is too large to be displayed.
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/app/home/home.spec.js
     1 +'use strict';
     2 +/**
     3 + * Tests sit right alongside the file they are testing, which is more intuitive
     4 + * and portable than separating `src` and `test` directories. Additionally, the
     5 + * build process will exclude all `.spec.js` files from the build
     6 + * automatically.
     7 + */
     8 +describe('home', function() {
     9 + beforeEach(module('app.home'));
     10 + it('check_home', inject(function() {
     11 + expect(true).toBeTruthy();
     12 + }));
     13 +});
     14 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/app/home/home.tpl.html
     1 +<section id="home" class="container-fluid">
     2 + <div class="panel panel-default">
     3 + <div class="panel-body">
     4 + <div class="row">
     5 + <!--
     6 + <div class="col-md-12">
     7 + <h4 class="heading-level-2">
     8 + <i class="fa fa-upload"></i>
     9 + Import Netflow Data
     10 + <small ng-show="jsonInputContainer"><a href="" ng-click="jsonInputContainer = !jsonInputContainer"><span><i class="fa fa-minus-circle"></i></span> Hide</a></small>
     11 + <small ng-show="!jsonInputContainer"><a href="" ng-click="jsonInputContainer = !jsonInputContainer"><span><i class="fa fa-plus-circle"></i></span> Show</a></small>
     12 + </h4>
     13 + <div ng-show="jsonInputContainer">
     14 + <form class="form-group" ng-submit="getGraph()">
     15 + <!-- required="true" ng-model="jsonInput" -/->
     16 + <textarea class="form-control rounded-0 graph-input" id="graph_exploer_json_input" rows="7">{"key": "value"}</textarea>
     17 + <br />
     18 + <button type="submit" class="btn btn-primary btn-md">
     19 + <i class="fa fa-gear"></i> Process
     20 + </button>
     21 + </form>
     22 + </div>
     23 + </div>
     24 + -->
     25 + <!--
     26 + <div class="col-md-12">
     27 + <h4 class="heading-level-2">
     28 + <i class="fa fa-envelope"></i>
     29 + Email Subjects
     30 + <small ng-show="subjectsContainer"><a href="" ng-click="subjectsContainer = !subjectsContainer"><span><i class="fa fa-minus-circle"></i></span> Hide</a></small>
     31 + <small ng-show="!subjectsContainer"><a href="" ng-click="subjectsContainer = !subjectsContainer"><span><i class="fa fa-plus-circle"></i></span> Show</a></small>
     32 + </h4>
     33 + <div ng-show="subjectsContainer">
     34 + <div ng-if="graphElements === ''" class="alert alert-info graph-alert" role="alert">
     35 + <strong>Info!</strong> No data to show. Please, submit the Graph Explorer json.
     36 + </div>
     37 + <ul class="list-inline">
     38 + <li class="subject-list" ng-repeat="graph in graphElements['result']">
     39 + <a href='' ng-class=" { 'active' : graph['subject'] === currentSubject } " class="list-group-item subject-list-link" ng-click="loadGraph(graph);">{{graph["subject"]}}</a>
     40 + </li>
     41 + </ul>
     42 + </div>
     43 + </div>
     44 + -->
     45 + <div class="col-md-12">
     46 + <h4 class="heading-level-2">
     47 + <i class="fa fa-link"></i>
     48 + Graph
     49 + <small ng-show="graphContainer"><a href="" ng-click="graphContainer = !graphContainer"><span><i class="fa fa-minus-circle"></i></span> Hide</a></small>
     50 + <small ng-show="!graphContainer"><a href="" ng-click="graphContainer = !graphContainer"><span><i class="fa fa-plus-circle"></i></span> Show</a></small>
     51 + </h4>
     52 + <button ng-if="currentSubject !== '' && graphContainer" class="btn btn-sm btn-default pull-right" ng-click="downloadGraph()"><i class="fa fa-download"></i> Download</button>
     53 + <div id="graph-container" ng-show="graphContainer">
     54 + <div ng-if="graphElements === ''" class="alert alert-info graph-alert" role="alert">
     55 + <strong>Info!</strong> No data to show. Please, submit the Graph Explorer json.
     56 + </div>
     57 + <h4>
     58 + <!--
     59 + <span ng-if="currentSubject !== ''" class="label label-primary text-center">Subject: {{currentSubject}}</span>
     60 + -->
     61 + <span ng-if="numberOfPackets !== ''" class="label label-primary text-center">{{numberOfPings}} messages sent by botnet to the machines within ten minutes on 2011/08/17, 14:24:20 to 14:34:20</span>
     62 + <span ng-if="numberOfPingsPerMachine !== '' && numberOfPingsPerMachine > 0" class="label label-danger text-center">Received {{numberOfPingsPerMachine}} message<span ng-if="numberOfPingsPerMachine > 1">s</span> from botnet</span>
     63 + <!--
     64 + <span class="label label-primary text-center">Initiator: {{initiator}}</span>
     65 + -->
     66 + </h4>
     67 + <!-- ng-show="hasGraph" -->
     68 + <div id="container"></div>
     69 + </div>
     70 + </div>
     71 + </div>
     72 + </div>
     73 + </div>
     74 +</section>
     75 + 
  • ■ ■ ■ ■ ■
    gui-frontend/src/assets/README.md
     1 +# The `src/assets` Directory
     2 + 
     3 +There's really not much to say here. Every file in this directory is recursively transferred to `dist/assets/`.
     4 + 
     5 + 
  • gui-frontend/src/assets/img/cmm.png
  • gui-frontend/src/assets/img/external-api.png
  • gui-frontend/src/assets/img/hss.png
  • gui-frontend/src/assets/img/mme-disabled.png
  • gui-frontend/src/assets/img/mwc-2018/cscf_blue_cyan.png
  • gui-frontend/src/assets/img/mwc-2018/cscf_blue_white.png
  • gui-frontend/src/assets/img/mwc-2018/cscf_cyan_blue.png
  • gui-frontend/src/assets/img/mwc-2018/cscf_cyan_white.png
  • gui-frontend/src/assets/img/mwc-2018/cscf_gray_white.png
  • gui-frontend/src/assets/img/mwc-2018/cscf_transparent_white.png
  • gui-frontend/src/assets/img/mwc-2018/database_blue_cyan.png
  • gui-frontend/src/assets/img/mwc-2018/database_blue_white.png
  • gui-frontend/src/assets/img/mwc-2018/database_cyan_blue.png
  • gui-frontend/src/assets/img/mwc-2018/database_cyan_white.png
  • gui-frontend/src/assets/img/mwc-2018/database_gray_white.png
  • gui-frontend/src/assets/img/mwc-2018/dialing_cyan_blue.png
  • gui-frontend/src/assets/img/mwc-2018/dialing_transparent_blue.png
  • gui-frontend/src/assets/img/mwc-2018/ims_blue_cyan.png
  • gui-frontend/src/assets/img/mwc-2018/ims_blue_white.png
  • gui-frontend/src/assets/img/mwc-2018/ims_cyan_blue.png
  • gui-frontend/src/assets/img/mwc-2018/ims_cyan_white.png
  • gui-frontend/src/assets/img/mwc-2018/ims_gray_white.png
  • gui-frontend/src/assets/img/mwc-2018/mobile-phone-cropped-dialing-blue.png
  • gui-frontend/src/assets/img/mwc-2018/mobile-phone-cropped-on-call-green.png
  • gui-frontend/src/assets/img/mwc-2018/mobile-phone-cropped-on-hold-orange.png
  • gui-frontend/src/assets/img/mwc-2018/mobile-phone-cropped-ringing-cyan.png
  • gui-frontend/src/assets/img/mwc-2018/mobile-phone-cropped.png
  • gui-frontend/src/assets/img/mwc-2018/mobile_blue_cyan.png
  • gui-frontend/src/assets/img/mwc-2018/mobile_blue_white.png
  • gui-frontend/src/assets/img/mwc-2018/mobile_cyan_blue.png
  • gui-frontend/src/assets/img/mwc-2018/mobile_cyan_white.png
  • gui-frontend/src/assets/img/mwc-2018/mobile_gray_white.png
  • gui-frontend/src/assets/img/mwc-2018/radio_blue_cyan.png
  • gui-frontend/src/assets/img/mwc-2018/radio_blue_white.png
  • gui-frontend/src/assets/img/mwc-2018/radio_cyan_blue.png
  • gui-frontend/src/assets/img/mwc-2018/radio_cyan_white.png
  • gui-frontend/src/assets/img/mwc-2018/radio_gray_white.png
  • gui-frontend/src/assets/img/mwc-2018/sbc_blue_cyan.png
  • gui-frontend/src/assets/img/mwc-2018/sbc_blue_white.png
  • gui-frontend/src/assets/img/mwc-2018/sbc_cyan_blue.png
  • gui-frontend/src/assets/img/mwc-2018/sbc_cyan_white.png
  • gui-frontend/src/assets/img/mwc-2018/sbc_gray_white.png
  • gui-frontend/src/assets/img/mwc-2018/wifi_access_point_blue_cyan.png
  • gui-frontend/src/assets/img/mwc-2018/wifi_access_point_blue_white.png
  • gui-frontend/src/assets/img/mwc-2018/wifi_access_point_cyan_blue.png
  • gui-frontend/src/assets/img/mwc-2018/wifi_access_point_cyan_white.png
  • gui-frontend/src/assets/img/mwc-2018/wifi_access_point_gray_white.png
  • gui-frontend/src/assets/img/nef.png
  • gui-frontend/src/assets/img/nokia_logo_blue_cropped.png
  • gui-frontend/src/assets/img/top-background.jpg
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/common/README.md
     1 +# The `src/common/` Directory
     2 + 
     3 +The `src/common/` directory houses internal and third-party re-usable
     4 +components. Essentially, this folder is for everything that isn't completely
     5 +specific to this application.
     6 + 
     7 +Each component resides in its own directory that may then be structured any way
     8 +the developer desires. The build system will read all `*.js` files that do not
     9 +end in `.spec.js` as source files to be included in the final build, all
     10 +`*.spec.js` files as unit tests to be executed, and all `*.tpl.html` files as
     11 +templates to compiled into the `$templateCache`. There is currently no way to
     12 +handle components that do not meet this pattern.
     13 + 
     14 +```
     15 +src/
     16 + |- common/
     17 + | |- plusOne/
     18 +```
     19 + 
     20 +- `plusOne` - a simple directive to load a Google +1 Button on an element.
     21 + 
     22 +Every component contained here should be drag-and-drop reusable in any other
     23 +project; they should depend on no other components that aren't similarly
     24 +drag-and-drop reusable.
     25 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/common/directives/directives.js
     1 +'use strict';
     2 +angular.module('directives', []);
     3 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/common/filters/filters.js
     1 +'use strict';
     2 +angular.module('filters', [])
     3 +/*
     4 + .filter('filterName', function() {
     5 + return function(value) {
     6 + return '';
     7 + };
     8 + })
     9 +*/
     10 +;
     11 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/common/helpers/modal/modal.js
     1 +'use strict';
     2 +angular.module('modal', ['ui.bootstrap']).controller('ModalInstanceCtrl', function($scope, $modalInstance) {
     3 + $scope.ok = function() {
     4 + $modalInstance.close();
     5 + };
     6 + $scope.cancel = function() {
     7 + $modalInstance.dismiss('cancel');
     8 + };
     9 +});
     10 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/common/helpers/modal/modal.tpl.html
     1 +<div class="modal-body">
     2 + {{'CONFIRM_PROCEED_MODAL' | translate}}
     3 +</div>
     4 +<div class="modal-footer">
     5 + <button class="btn btn-primary" ng-click="ok()" ng-bind=" 'YES' | translate "></button>
     6 + <button class="btn btn-warning" ng-click="cancel()" ng-bind=" 'NO' | translate "></button>
     7 +</div>
     8 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/common/helpers/scroll-top/scroll-top.js
     1 +'use strict';
     2 +angular.module('scroll-top', [])
     3 + .directive('scrollToTop', function($window) {
     4 + function backToTop(scope, element) {
     5 + var visibilityVal = 'hidden',
     6 + opacityVal = '0';
     7 + var topScrollTo = function(reduceOffset, timeout) {
     8 + if ($window.pageYOffset !== 0) {
     9 + setTimeout(function() {
     10 + $window.scrollTo(0, $window.pageYOffset - reduceOffset);
     11 + topScrollTo(reduceOffset, timeout);
     12 + }, timeout);
     13 + }
     14 + };
     15 + element.find('button').bind('click', function() {
     16 + topScrollTo(50, 0);
     17 + });
     18 + angular.element($window).bind('scroll', function() {
     19 + visibilityVal = (this.pageYOffset > 1000) ? 'visible' : 'hidden';
     20 + opacityVal = (this.pageYOffset > 1000) ? '1' : '0';
     21 + element.find('button')
     22 + .css({
     23 + 'visibility': visibilityVal,
     24 + 'opacity': opacityVal
     25 + });
     26 + });
     27 + }
     28 + return {
     29 + 'restrict': 'E',
     30 + 'template': '<button title="back-to-top-button" \n'
     31 + + 'class="back-top btn btn-primary">'
     32 + + '<i class="fa fa-angle-up fa-3x"></i></button>',
     33 + 'link': backToTop
     34 + };
     35 + });
     36 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/common/services/services.js
     1 +'use strict';
     2 +/**
     3 + * Services module
     4 + *
     5 + * This module defines:
     6 + * - the host IP addresses of the REST APIs
     7 + * - the endpoints of the REST web services
     8 + */
     9 +angular.module('services', ['ngResource'])
     10 + // Configuration of service module
     11 + .config(function($resourceProvider) {
     12 + $resourceProvider.defaults.stripTrailingSlashes = false;
     13 + })
     14 + // constant variables
     15 + .constant('context', {
     16 + 'protocol': 'http',
     17 + 'host': '127.0.0.1',
     18 + 'port': 5000,
     19 + 'base_api_context': '/api'
     20 + })
     21 + /**
     22 + * Example
     23 + .factory('CheckUsername', ['$resource', 'context', function ($resource, context) {
     24 + return $resource(
     25 + context.protocol + "://" + context.host + ":" + context.port + context.base_apicontext.protocol + '://' + context.host + ':' + context.port + context.base_api_context + 'rest-auth/username/:username', {username: '@username'}, {'method': 'GET'}
     26 + );
     27 + }])
     28 + 
     29 + .factory('getTopology', ['$resource', 'context', function($resource, context) {
     30 + return $resource(context.protocol + '://' + context.host + ':' + context.port + context.base_api_context + '/topology/v1/', {}, {
     31 + 'get': {
     32 + 'method': 'GET'
     33 + }
     34 + });
     35 + }])
     36 + */
     37 + .factory('graphElements', ['$resource', 'context', function($resource, context) {
     38 + return $resource(context.protocol + '://' + context.host + ':' + context.port + context.base_api_context + '/anomaly_detection/v1/', {}, {
     39 + 'get': {
     40 + 'method': 'GET'
     41 + },
     42 + 'post': {
     43 + 'method': 'POST'
     44 + }
     45 + });
     46 + }])
     47 + ;
     48 + 
  • gui-frontend/src/fonts/NokiaIcons.woff
    Binary file.
  • gui-frontend/src/fonts/NokiaPureHWeb_Bd.woff
    Binary file.
  • gui-frontend/src/fonts/NokiaPureHWeb_Lt.woff
    Binary file.
  • gui-frontend/src/fonts/NokiaPureHWeb_Rg.woff
    Binary file.
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/index.html
     1 +<!DOCTYPE html>
     2 +<html ng-app="fe-client" ng-controller="AppCtrl" lang="en">
     3 + <head>
     4 + <title ng-bind="pageTitle"></title>
     5 + <meta name="viewport" content="width=device-width, initial-scale=1">
     6 + <meta http-equiv="X-UA-Compatible" content="IE=edge" />
     7 + <meta charset="UTF-8">
     8 + <!-- compiled CSS --><% styles.forEach( function ( file ) { %>
     9 + <link rel="stylesheet" type="text/css" href="<%= file %>" /><% }); %>
     10 + <!-- compiled JavaScript --><% scripts.forEach( function ( file ) { %>
     11 + <script type="text/javascript" src="<%= file %>"></script><% }); %>
     12 + <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
     13 + <!--[if lt IE 9]>
     14 + <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
     15 + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
     16 + <![endif]-->
     17 + </head>
     18 + <body>
     19 + <!-- Fixed navbar -->
     20 + <nav class="navbar navbar-default"> <!-- navbar-fixed-top -->
     21 + <!--
     22 + <div class="top-background"></div>
     23 + -->
     24 + <div class="container">
     25 + <div class="navbar-header">
     26 + <button ng-init="isCollapsed = true" ng-click="isCollapsed = !isCollapsed" type="button" class="navbar-toggle collapsed">
     27 + <span class="sr-only">Toggle navigation</span>
     28 + <span class="icon-bar"></span>
     29 + <span class="icon-bar"></span>
     30 + <span class="icon-bar"></span>
     31 + </button>
     32 + <span class="text-center navbar-brand">
     33 + <img class="logo-img" src="assets/img/nokia_logo_blue_cropped.png" alt="logo" />
     34 + <!--
     35 + <span class="clearfix header-small">Graph Explorer<!-- Shared Data Layer - -></span>
     36 + -->
     37 + </span>
     38 + </div>
     39 + <!--
     40 + <div class="navbar-collapse" collapse="isCollapsed">
     41 + <ul class="nav navbar-nav">
     42 + <li ng-class=" { 'active' : $state.current.name === 'home' }">
     43 + <a ui-sref="home"><i class="fa fa-home"></i> Home</a>
     44 + <div class="menu-border"></div>
     45 + </li>
     46 + </ul>
     47 + </div>
     48 + --> <!--/.nav-collapse -->
     49 + </div>
     50 + </nav>
     51 + <!--
     52 + <div class="container breadcrumb-container" autoscroll="true">
     53 + <span class="pull-left breadcrumb-image-home">You are here: </span>
     54 + <div class="pull-left" ncy-breadcrumb></div>
     55 + </div>
     56 + -->
     57 + <!-- Begin page content -->
     58 + <div ui-view="main" class="container"></div>
     59 + <footer class="footer text-center">
     60 + <div class="container">
     61 + <small class="text-dark"><!-- Nokia - Mobile World Congress 2018 --><!-- Shared Data Layer --></small>
     62 + </div>
     63 + </footer>
     64 + <scroll-to-top></scroll-to-top>
     65 + <%
     66 + if( mode == 'dev' || true ) {
     67 + print( '<script src="http://localhost:35729/livereload.js"></script>' );
     68 + }
     69 + %>
     70 + </body>
     71 +</html>
     72 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/languages/enUS.json
     1 +{}
     2 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/less/README.md
     1 +# The `src/less` Directory
     2 + 
     3 +This folder is actually fairly self-explanatory: it contains your LESS/CSS files to be compiled during the build.
     4 +The only important thing to note is that *only* `main.less` will be processed during the build, meaning that all
     5 +other stylesheets must be *imported* into that one.
     6 + 
     7 +This should operate somewhat like the routing; the `main.less` file contains all of the site-wide styles, while
     8 +any styles that are route-specific should be imported into here from LESS files kept alongside the JavaScript
     9 +and HTML sources of that component. For example, the `home` section of the site has some custom styles, which
     10 +are imported like so:
     11 + 
     12 +```css
     13 +@import '../app/home/home.less';
     14 +```
     15 + 
     16 +The same principal, though not demonstrated in the code, would also apply to reusable components. CSS or LESS
     17 +files from external components would also be imported. If, for example, we had a Twitter feed directive with
     18 +an accompanying template and style, we would similarly import it:
     19 + 
     20 +```css
     21 +@import '../common/twitterFeed/twitterFeedDirective.less';
     22 +```
     23 + 
     24 +Using this decentralized approach for all our code (JavaScript, HTML, and CSS) creates a framework where a
     25 +component's directory can be dragged and dropped into *any other project* and it will "just work".
     26 + 
     27 +I would like to eventually automate the importing during the build so that manually importing it here would no
     28 +longer be required, but more thought must be put in to whether this is the best approach.
     29 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/less/alert.less
     1 +.alert {
     2 + position: fixed;
     3 + z-index: 15;
     4 + max-width: 400px;
     5 + width: 0;
     6 + left: 0;
     7 + top: 100px;
     8 + padding-right: 40px;
     9 + opacity: 0;
     10 + font-size: 1.1em;
     11 + animation-name: alertAnimation;
     12 + animation-duration:5.5s;
     13 + animation-iteration-count: 1;
     14 + animation-timing-function: ease;
     15 + animation-fill-mode: forwards;
     16 + -webkit-animation-name: alertAnimation;
     17 + -webkit-animation-duration:5.5s;
     18 + -webkit-animation-iteration-count: 1;
     19 + -webkit-animation-timing-function: ease;
     20 + -webkit-animation-fill-mode: forwards;
     21 + -moz-animation-name: alertAnimation;
     22 + -moz-animation-duration:2.5s;
     23 + -moz-animation-iteration-count: 1;
     24 + -moz-animation-timing-function: ease;
     25 + -moz-animation-fill-mode: forwards;
     26 + color: #ffffff;
     27 +}
     28 +@keyframes alertAnimation {
     29 + from {
     30 + opacity: 0;
     31 + width: 0%;
     32 + }
     33 + to {
     34 + opacity: 1;
     35 + width: 100%;
     36 + }
     37 +}
     38 +@-webkit-keyframes alertAnimation {
     39 + from {
     40 + opacity: 0;
     41 + width: 0%;
     42 + }
     43 + to {
     44 + opacity: 1;
     45 + width: 100%;
     46 + }
     47 +}
     48 +.alert .alert-message {
     49 + display: block;
     50 + margin-left: 20px;
     51 + margin-top: -23px;
     52 +}
     53 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/less/breadcrumb.less
     1 +body > .breadcrumb-container {
     2 + margin-top: 98px;
     3 + padding: 0px 15px 0px 15px !important;
     4 +}
     5 +.breadcrumb-image-home {
     6 + padding: 10px 0px;
     7 +}
     8 +.breadcrumb {
     9 + background: none;
     10 + margin-bottom: 0px;
     11 + margin-top: 0px;
     12 + padding-top: 10px;
     13 + padding-bottom: 10px;
     14 +}
     15 +.breadcrumb > .active {
     16 + color: @gray;
     17 +}
     18 +.breadcrumb > li a {
     19 + text-decoration: underline;
     20 +}
     21 +.breadcrumb > li + li::before {
     22 + content: "» ";
     23 + color: @brand-primary;
     24 +}
     25 +@media screen and (max-width: 486px) {
     26 + .breadcrumb > li,
     27 + .breadcrumb-image-home {
     28 + display: none;
     29 + }
     30 + .breadcrumb > li:last-child {
     31 + display: block;
     32 + }
     33 +}
     34 +.oveflow-hidden-text-breadcrumb {
     35 + max-width: 200px;
     36 + white-space: nowrap;
     37 + overflow: hidden !important;
     38 + text-overflow: ellipsis;
     39 +}
     40 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/less/cytoscape.less
     1 +.cscf1-active-label,
     2 +.cscf1-passive-label,
     3 +.cscf2-active-label,
     4 +.cscf2-passive-label,
     5 +.cscf1-activating-label,
     6 +.cscf2-activating-label,
     7 +.cscf1-semi-active-label,
     8 +.cscf2-semi-active-label,
     9 +.ims-label,
     10 +.radio-label,
     11 +.sdl-label {
     12 + padding-right: 15px;
     13 + padding-left: 15px;
     14 + text-align: center;
     15 + color: white;
     16 + background-color: @brand-primary;
     17 + border-radius: 3px;
     18 +}
     19 + 
     20 +.call-established-label,
     21 +.call-waiting-label,
     22 +.call-on-hold-label {
     23 + padding-top: 5px;
     24 + padding-right: 10px;
     25 + padding-left: 10px;
     26 + text-align: center;
     27 + color: white;
     28 + background-color: @gray;
     29 + border-radius: 3px;
     30 + 
     31 + i {
     32 + font-size: 1.7em;
     33 + padding-bottom: 5px;
     34 + }
     35 +}
     36 + 
     37 +.call-established-label {
     38 + background-color: @brand-primary;
     39 +}
     40 + 
     41 +.sdl-label {
     42 + font-size: 1.2em;
     43 +}
     44 + 
     45 +.ims-label,
     46 +.radio-label {
     47 + padding-top: 10px;
     48 + 
     49 + p {
     50 + padding-top: 5px;
     51 + }
     52 +}
     53 + 
     54 +.cscf1-semi-active-label,
     55 +.cscf2-semi-active-label,
     56 +.cscf1-activating-label,
     57 +.cscf2-activating-label {
     58 + opacity: 0.65;
     59 +}
     60 + 
     61 +.cscf1-passive-label,
     62 +.cscf2-passive-label {
     63 + background-color: @gray;
     64 + opacity: 0.5;
     65 + 
     66 + i {
     67 + font-size: 1.2em;
     68 + }
     69 +}
     70 + 
     71 +.subscriber1-label,
     72 +.subscriber2-label {
     73 + padding-top: 10px;
     74 + padding-right: 15px;
     75 + padding-left: 15px;
     76 + text-align: center;
     77 + 
     78 + p {
     79 + margin-top: 5px;
     80 + }
     81 +}
     82 + 
     83 + 
     84 +@media only screen and (min-width: 1700px) {
     85 + .subscriber1-label,
     86 + .subscriber2-label,
     87 + .cscf1-active-label,
     88 + .cscf1-passive-label,
     89 + .cscf2-active-label,
     90 + .cscf2-passive-label,
     91 + .cscf1-activating-label,
     92 + .cscf2-activating-label,
     93 + .cscf1-semi-active-label,
     94 + .cscf2-semi-active-label,
     95 + .ims-label,
     96 + .radio-label,
     97 + .sdl-label {
     98 + font-size: 2.3em;
     99 + padding-right: 25px;
     100 + padding-left: 25px;
     101 + }
     102 + 
     103 + .call-established-label,
     104 + .call-waiting-label,
     105 + .call-on-hold-label {
     106 + font-size: 2.3em;
     107 + padding-top: 15px;
     108 + padding-right: 20px;
     109 + padding-left: 20px;
     110 + 
     111 + i {
     112 + padding-bottom: 15px;
     113 + }
     114 + }
     115 +}
     116 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/less/magic-bootstrap.less
     1 +// Accent colors
     2 +// -------------------------
     3 +@blue: #2E8BCC;
     4 +@green: #339933;
     5 +@red: #E51400;
     6 +@yellow: #ffc40d;
     7 +@pink: #E671B8;
     8 +@purple: #7B4F9D;
     9 +@lime: #8CBF26;
     10 +@magenta: #FF0097;
     11 +@teal: #00ABA9;
     12 +@white: #FFFFFF;
     13 + 
     14 +// Flat colors
     15 +// Reference: http://flatuicolors.com/
     16 +// -------------------------
     17 +@turquoise: #1abc9c;
     18 +@green-sea: #16a085;
     19 +@emerald: #2ecc71;
     20 +@nephritis: #27ae60;
     21 +@peter-river: #3498db;
     22 +@belize-hole: #2980b9;
     23 +@amethyst: #9b59b6;
     24 +@wisteria: #8e44ad;
     25 +@wet-asphalt: #34495e;
     26 +@midnight-blue: #2c3e50;
     27 +@sun-flower: #f1c40f;
     28 +@orange: #f39c12;
     29 +@carrot: #e67e22;
     30 +@pumpkin: #d35400;
     31 +@alizarin: #e74c3c;
     32 +@pomegranate: #c0392b;
     33 +@clouds: #ecf0f1;
     34 +@silver: #bdc3c7;
     35 +@concrete: #95a5a6;
     36 +@asbestos: #7f8c8d;
     37 +@gray-light: #AAEEDD;
     38 + 
     39 +/*
     40 +* pikock http://www.pikock.com/ , autreplanete http://www.autreplanete.com/
     41 +*
     42 +**/
     43 + 
     44 + 
     45 +// Grays
     46 +@gray-darker: #222222;
     47 +@gray-dark: #333333;
     48 +@gray: #68717A;
     49 +@gray-light: #D8D9DA;
     50 +@gray-lighter: #EFEFEF;
     51 +@gray-medium: #A8BBC0;
     52 + 
     53 + 
     54 +// Brand Colors
     55 +@brand-primary: #124191; //#0D2D65;
     56 +@brand-success: #3DAA00;
     57 +@brand-warning: fadeout(@gray, 40%); // #be5900;
     58 +@brand-danger: #991713;
     59 +@brand-info: #124191;
     60 + 
     61 +// Scaffolding
     62 +@body-bg: #ffffff;
     63 +@text-color: #1b1b1b;
     64 +@link-color: @brand-primary;
     65 +@link-hover-color: darken(@link-color, 15%);
     66 +@padding-base-vertical: 10px;
     67 +@padding-base-horizontal: 20px;
     68 +@padding-large-vertical: 14px;
     69 +@padding-large-horizontal: 24px;
     70 +@padding-small-vertical: 7px;
     71 +@padding-small-horizontal: 14px;
     72 +@border-radius-base: 0px;
     73 +@border-radius-large: 0px;
     74 +@border-radius-small: 0px;
     75 +@line-height-large: 1.33;
     76 +@line-height-small: 1.5;
     77 +@component-active-bg: @brand-primary;
     78 + 
     79 +// Buttons
     80 +@btn-font-weight: normal;
     81 +@btn-default-color: @gray-lighter;
     82 +@btn-default-bg: @gray-dark;
     83 +@btn-default-border: transparent;
     84 +@btn-primary-color: #fff;
     85 +@btn-primary-bg: @brand-primary;
     86 +@btn-primary-border: transparent;
     87 +@btn-success-color: #fff;
     88 +@btn-success-bg: @brand-success;
     89 +@btn-success-border: transparent;
     90 +@btn-warning-color: #fff;
     91 +@btn-warning-bg: @brand-warning;
     92 +@btn-warning-border: transparent;
     93 +@btn-danger-color: #fff;
     94 +@btn-danger-bg: @brand-danger;
     95 +@btn-danger-border: transparent;
     96 +@btn-info-color: #fff;
     97 +@btn-info-bg: @brand-info;
     98 +@btn-info-border: transparent;
     99 +@btn-link-disabled-color: @gray-light;
     100 + 
     101 + 
     102 +// Dropdowns
     103 +@dropdown-bg: #ffffff;
     104 +@dropdown-border: rgba(0,0,0,.15);
     105 +@dropdown-divider-bg: #e5e5e5;
     106 +@dropdown-link-active-color: #ffffff;
     107 +@dropdown-link-active-bg: #f1f1f1;
     108 +@dropdown-link-color: @gray;
     109 +@dropdown-link-hover-color: @gray-darker;
     110 +@dropdown-link-hover-bg: @dropdown-link-active-bg;
     111 +@dropdown-link-disabled-color: @gray-light;
     112 +@dropdown-header-color: @gray-light;
     113 +@dropdown-caret-color: #000;
     114 + 
     115 + 
     116 +// Forms
     117 +@input-bg: #fff;
     118 +@input-bg-disabled: @gray-lighter;
     119 +@input-color: @gray;
     120 +@input-border: #dbdbdb;
     121 +@input-border-radius: @border-radius-base;
     122 +@input-color-placeholder: @gray-light;
     123 +@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 6);
     124 +@input-height-large: (floor(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 6);
     125 +@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 6);
     126 +@legend-color: @gray-light;
     127 +@legend-border-color: #dbdbdb;
     128 +@input-group-addon-bg: @gray-lighter;
     129 +@input-group-addon-border-color: @input-border;
     130 + 
     131 + 
     132 +// Table
     133 +@table-cell-padding: 8px;
     134 +@table-condensed-cell-padding: 5px;
     135 +@table-cell-padding: 8px;
     136 +@table-condensed-cell-padding: 5px;
     137 +@table-bg: transparent;
     138 +@table-bg-accent: #f9f9f9;
     139 +@table-bg-hover: #f5f5f5;
     140 +@table-bg-active: @table-bg-hover;
     141 +@table-border-color: #ddd;
     142 + 
     143 + 
     144 +// Navbar
     145 +@grid-gutter-width: 20px;
     146 +@font-size-small: 10px;
     147 +@font-size-base: 14px;
     148 +@font-size-large: 18px;
     149 +//** Unit-less `line-height` for use in components like buttons.
     150 +@line-height-base: 1.428571429; // 20/14
     151 +//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
     152 +@line-height-computed: floor((@font-size-base * @line-height-base)); // ~20px
     153 + 
     154 +@navbar-height: 65px;
     155 +@navbar-margin-bottom: @line-height-computed;
     156 +@navbar-default-color: @gray-darker;
     157 +@navbar-default-bg: #ffffff;
     158 +@navbar-default-border: transparent;// darken(@navbar-default-bg, 6.5%);
     159 +@navbar-border-radius: @border-radius-base;
     160 +@navbar-padding-horizontal: floor(@grid-gutter-width / 2);
     161 +@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2);
     162 +@navbar-default-link-color: @gray-dark;
     163 +@navbar-default-link-hover-color: @gray-darker;
     164 +@navbar-default-link-hover-bg: darken(@navbar-default-bg, 2.5%);
     165 +@navbar-default-link-active-color: #000000;
     166 +@navbar-default-link-active-bg: darken(@navbar-default-bg, 2.5%);
     167 +@navbar-default-link-disabled-color: #ccc;
     168 +@navbar-default-link-disabled-bg: transparent;
     169 +@navbar-default-brand-color: @navbar-default-link-color;
     170 +@navbar-default-brand-hover-color: darken(@navbar-default-link-color, 10%);
     171 +@navbar-default-brand-hover-bg: transparent;
     172 +@navbar-default-toggle-hover-bg: #ddd;
     173 +@navbar-default-toggle-icon-bar-bg: #888;
     174 +@navbar-default-toggle-border-color: #e8e8e8;
     175 + 
     176 +@navbar-inverse-bg: @brand-primary;
     177 +@navbar-inverse-link-hover-bg: darken(@navbar-inverse-bg, 2.5%);
     178 +@navbar-inverse-link-color: @gray-lighter;
     179 +@navbar-inverse-link-hover-color: #ffffff;
     180 +@navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 6.5%);
     181 + 
     182 +// Navs Tabs
     183 +@nav-link-padding: 12px 19px;
     184 +@nav-link-hover-bg: @gray-lighter;
     185 +@nav-disabled-link-color: @gray-light;
     186 +@nav-disabled-link-hover-color: @gray-lighter;
     187 +@nav-tabs-border-color: @gray-light;
     188 +@nav-tabs-link-hover-border-color: @gray-lighter;
     189 +@nav-tabs-active-link-hover-bg: @body-bg;
     190 +@nav-tabs-active-link-hover-color: @gray;
     191 +@nav-tabs-active-link-hover-border-color: @gray-light;
     192 +@nav-tabs-justified-link-border-color: @gray-light;
     193 +@nav-tabs-justified-active-link-border-color: @body-bg;
     194 +@nav-pills-border-radius: @border-radius-base;
     195 +@nav-pills-active-link-hover-bg: @component-active-bg;
     196 +@nav-pills-active-link-hover-color: #fff;
     197 + 
     198 + 
     199 +// Jumbotron
     200 +@jumbotron-padding: 30px;
     201 +@jumbotron-color: inherit;
     202 +@jumbotron-bg: @gray-lighter;
     203 +@jumbotron-font-size: ceil((@font-size-base * 1.5));
     204 + 
     205 + 
     206 +// Pagination
     207 +@pagination-bg: #fff;
     208 +@pagination-border: #ddd;
     209 +@pagination-hover-bg: @gray-lighter;
     210 +@pagination-hover-color: @link-hover-color;
     211 +@pagination-hover-border: #ddd;
     212 +@pagination-active-bg: @brand-primary;
     213 +@pagination-active-color: #fff;
     214 +@pagination-active-border: @brand-primary;
     215 +@pagination-disabled-color: @gray-light;
     216 +@pagination-disabled-bg: #fff;
     217 +@pagination-disabled-border: #ddd;
     218 +@pager-bg: @pagination-bg;
     219 +@pager-border: @pagination-border;
     220 +@pager-border-radius: 15px;
     221 +@pager-hover-bg: @pagination-hover-bg;
     222 +@pager-active-bg: @pagination-active-bg;
     223 +@pager-active-color: @pagination-active-color;
     224 +@pager-bg: @pagination-bg;
     225 +@pager-disabled-color: @gray-light;
     226 + 
     227 +@state-warning-text: lighten(@brand-warning, 55%);
     228 +@state-warning-bg: @brand-warning;
     229 +@state-warning-border: @brand-warning;
     230 +@state-danger-text: lighten(@brand-danger, 13%);
     231 +@state-danger-bg: @brand-danger;
     232 +@state-danger-border: @brand-danger;
     233 +@state-success-text: lighten(@brand-success, 35%);
     234 +@state-success-bg: @brand-success;
     235 +@state-success-border: @brand-success;
     236 +@state-info-text: lighten(@brand-info, 55%);
     237 +@state-info-bg: @brand-info;
     238 +@state-info-border: @brand-info;
     239 + 
     240 + 
     241 +// ToolTip
     242 +@tooltip-max-width: 200px;
     243 +@tooltip-color: #fff;
     244 +@tooltip-bg: #000;
     245 +@tooltip-arrow-width: 5px;
     246 +@tooltip-arrow-color: @tooltip-bg;
     247 +@tooltip-opacity: .9;
     248 + 
     249 + 
     250 +// Popover
     251 +@popover-bg: #fff;
     252 +@popover-max-width: 276px;
     253 +@popover-border-color: rgba(0,0,0,.2);
     254 +@popover-fallback-border-color: #ccc;
     255 +@popover-title-bg: darken(@popover-bg, 3%);
     256 +@popover-arrow-width: 10px;
     257 +@popover-arrow-color: #fff;
     258 +@popover-arrow-outer-width: (@popover-arrow-width + 1);
     259 +@popover-arrow-outer-color: rgba(0,0,0,.25);
     260 +@popover-arrow-outer-fallback-color: #999;
     261 + 
     262 + 
     263 +// List Group
     264 +@list-group-bg: #fff;
     265 +@list-group-border: #ddd;
     266 +@list-group-border-radius: @border-radius-base;
     267 +@list-group-hover-bg: #f5f5f5;
     268 +@list-group-active-color: #fff;
     269 +@list-group-active-bg: @component-active-bg;
     270 +@list-group-active-border: @list-group-active-bg;
     271 +@list-group-active-text-color: lighten(@list-group-active-bg, 40%);
     272 +@list-group-link-color: #555;
     273 +@list-group-link-heading-color: #333;
     274 + 
     275 +// Tiles
     276 +@tile-border-bg: @white;
     277 +@tile-bg: @blue;
     278 +@tile-text-color: @white;
     279 +@tile-light-text-color: @wet-asphalt;
     280 + 
     281 +@tile-success-bg: @state-success-bg;
     282 +@tile-info-bg: @state-info-bg;
     283 +@tile-warning-bg: @state-warning-bg;
     284 +@tile-danger-bg: @state-danger-bg;
     285 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/less/main.less
     1 +/**
     2 + * This is the main application stylesheet. It should include or import all
     3 + * stylesheets used throughout the application as this is the only stylesheet in
     4 + * the Grunt configuration that is automatically processed.
     5 + */
     6 +/**
     7 + * First, we include the Twitter Bootstrap LESS files. Only the ones used in the
     8 + * project should be imported as the rest are just wasting space.
     9 + */
     10 +@import "../../node_modules/bootstrap/less/variables.less";
     11 +@import "../../node_modules/bootstrap/less/mixins.less"; // Reset
     12 +@import "../../node_modules/bootstrap/less/normalize.less";
     13 +@import "../../node_modules/bootstrap/less/print.less"; // Core CSS
     14 +@import "../../node_modules/bootstrap/less/scaffolding.less";
     15 +@import "../../node_modules/bootstrap/less/type.less";
     16 +@import "../../node_modules/bootstrap/less/code.less";
     17 +@import "../../node_modules/bootstrap/less/grid.less";
     18 +@import "../../node_modules/bootstrap/less/tables.less";
     19 +@import "../../node_modules/bootstrap/less/forms.less";
     20 +@import "../../node_modules/bootstrap/less/buttons.less"; // Components
     21 +@import "../../node_modules/bootstrap/less/component-animations.less";
     22 +@import "../../node_modules/bootstrap/less/glyphicons.less";
     23 +@import "../../node_modules/bootstrap/less/dropdowns.less";
     24 +@import "../../node_modules/bootstrap/less/button-groups.less";
     25 +@import "../../node_modules/bootstrap/less/input-groups.less";
     26 +@import "../../node_modules/bootstrap/less/navs.less";
     27 +@import "../../node_modules/bootstrap/less/navbar.less";
     28 +@import "../../node_modules/bootstrap/less/breadcrumbs.less";
     29 +@import "../../node_modules/bootstrap/less/pagination.less";
     30 +@import "../../node_modules/bootstrap/less/pager.less";
     31 +@import "../../node_modules/bootstrap/less/labels.less";
     32 +@import "../../node_modules/bootstrap/less/badges.less";
     33 +@import "../../node_modules/bootstrap/less/jumbotron.less";
     34 +@import "../../node_modules/bootstrap/less/thumbnails.less";
     35 +@import "../../node_modules/bootstrap/less/alerts.less";
     36 +@import "../../node_modules/bootstrap/less/progress-bars.less";
     37 +@import "../../node_modules/bootstrap/less/media.less";
     38 +@import "../../node_modules/bootstrap/less/list-group.less";
     39 +@import "../../node_modules/bootstrap/less/panels.less";
     40 +@import "../../node_modules/bootstrap/less/wells.less";
     41 +@import "../../node_modules/bootstrap/less/close.less"; // Components w/ JavaScript
     42 +@import "../../node_modules/bootstrap/less/modals.less";
     43 +@import "../../node_modules/bootstrap/less/tooltip.less";
     44 +@import "../../node_modules/bootstrap/less/popovers.less";
     45 +@import "../../node_modules/bootstrap/less/carousel.less"; // Utility classes
     46 +@import "../../node_modules/bootstrap/less/utilities.less";
     47 +@import "../../node_modules/bootstrap/less/responsive-utilities.less"; // font-awesome
     48 +@import "../../node_modules/font-awesome/less/font-awesome.less"; // ionicons
     49 +// @import "../../node_modules/ionicons/less/ionicons.less";
     50 +/**
     51 + * This is our main variables file.
     52 + * We must include it last so we can overwrite any variable
     53 + * definitions in our imported stylesheets.
     54 + */
     55 +@import 'magic-bootstrap.less'; // custom less files
     56 +@import 'navbar.less'; // @import 'breadcrumb.less';
     57 +// @import 'alert.less';
     58 +@import 'nav-wizard.less';
     59 +@import 'tree-vertical.less';
     60 +@import 'sigma.less';
     61 + 
     62 +* {
     63 + font-family: 'Nokia Pure';
     64 +}
     65 + 
     66 +html {
     67 + position: relative;
     68 + min-height: 100%;
     69 +}
     70 + 
     71 +body {
     72 + margin-bottom: 60px;
     73 +}
     74 +@font-face {
     75 + font-family: 'Nokia Pure';
     76 + font-style: normal;
     77 + font-weight: 300;
     78 + src: url('../fonts/NokiaPureHWeb_Lt.woff') format('woff');
     79 +}
     80 +@font-face {
     81 + font-family: 'Nokia Pure';
     82 + font-style: normal;
     83 + font-weight: normal;
     84 + src: url('../fonts/NokiaPureHWeb_Rg.woff') format('woff');
     85 +}
     86 +@font-face {
     87 + font-family: 'Nokia Pure';
     88 + font-style: normal;
     89 + font-weight: bold;
     90 + src: url('../fonts/NokiaPureHWeb_Bd.woff') format('woff');
     91 +}
     92 +@font-face {
     93 + font-family: 'Icons';
     94 + src: url('../fonts/NokiaIcons.woff') format('woff');
     95 +}
     96 + 
     97 +.footer {
     98 + box-sizing: border-box;
     99 + padding: 5px 0;
     100 + position: absolute;
     101 + bottom: 0;
     102 + width: 100%;
     103 + height: 50px;
     104 + // background: url('img/top-background.jpg') repeat-x bottom;
     105 +}
     106 + 
     107 +body > .container:nth-child(2) {
     108 + margin-top: 27px;
     109 + padding: 0 15px;
     110 + background-color: lighten(@navbar-default-bg, 6.5%);
     111 + border: none;
     112 +}
     113 + 
     114 +body > .container {
     115 + margin-top: 20px;
     116 + padding: 20px 30px 70px;
     117 + background-color: lighten(@navbar-default-bg, 6.5%);
     118 + border: none;
     119 +}
     120 + 
     121 +.footer > .container {
     122 + padding-right: 15px;
     123 + padding-left: 15px;
     124 + color: white;
     125 +}
     126 + 
     127 +.icon-effect i,
     128 +.menu-border,
     129 +a,
     130 +button,
     131 +li {
     132 + // -o-transition: 0.5s;
     133 + // -ms-transition: 0.5s;
     134 + // -moz-transition: 0.5s;
     135 + // -webkit-transition: 0.5s;
     136 + // transition: 0.5s;
     137 +}
     138 + 
     139 +.top-background {
     140 + height: 3px;
     141 + background: url('img/top-background.jpg') repeat;
     142 + width: 100%;
     143 +}
     144 + 
     145 +.back-top {
     146 + visibility: hidden;
     147 + opacity: 0;
     148 + z-index: 1000;
     149 + position: fixed;
     150 + right: 0;
     151 + top: 100%;
     152 + margin-top: -65px;
     153 +}
     154 + 
     155 +input,
     156 +select,
     157 +textarea {
     158 + border-width: 2px !important;
     159 +}
     160 + 
     161 +textarea {
     162 + resize: vertical;
     163 +}
     164 + 
     165 +.text-dark {
     166 + color: @gray-darker;
     167 +}
     168 + 
     169 +.header-small {
     170 + // font-size: 0.6em;
     171 + font-size: 0.51em;
     172 + // color: @gray-medium;
     173 + margin: 5px 0;
     174 + padding: 0;
     175 +}
     176 + 
     177 +.page-title {
     178 + padding: 20px 30px 10px;
     179 + margin: -20px -30px 20px;
     180 + border-bottom: 1px solid @gray-light;
     181 +}
     182 + 
     183 +.jumbotron {
     184 + background: #fefefe;
     185 + border: 1px solid @gray-lighter;
     186 +}
     187 + 
     188 +.pre-style {
     189 + background: #ffffff;
     190 + font-size: 1.5em;
     191 + padding: 30px;
     192 +}
     193 + 
     194 +.spinner {
     195 + box-sizing: border-box;
     196 + height: 20px;
     197 + width: 20px;
     198 + margin-top: 10px;
     199 + margin-left: 10px;
     200 + position: absolute;
     201 + -webkit-animation: rotation 0.6s infinite linear;
     202 + -moz-animation: rotation 0.6s infinite linear;
     203 + -o-animation: rotation 0.6s infinite linear;
     204 + animation: rotation 0.6s infinite linear;
     205 + border-left: 2px solid @brand-info;
     206 + border-right: 2px solid @brand-info;
     207 + border-bottom: 2px solid @brand-info;
     208 + border-top: 2px solid lighten(@brand-info, 35%);
     209 + border-radius: 100%;
     210 +}
     211 +@-webkit-keyframes rotation {
     212 + from {
     213 + -webkit-transform: rotate(0deg);
     214 + }
     215 + 
     216 + to {
     217 + -webkit-transform: rotate(359deg);
     218 + }
     219 +}
     220 +@-moz-keyframes rotation {
     221 + from {
     222 + -moz-transform: rotate(0deg);
     223 + }
     224 + 
     225 + to {
     226 + -moz-transform: rotate(359deg);
     227 + }
     228 +}
     229 +@-o-keyframes rotation {
     230 + from {
     231 + -o-transform: rotate(0deg);
     232 + }
     233 + 
     234 + to {
     235 + -o-transform: rotate(359deg);
     236 + }
     237 +}
     238 +@keyframes rotation {
     239 + from {
     240 + transform: rotate(0deg);
     241 + }
     242 + 
     243 + to {
     244 + transform: rotate(359deg);
     245 + }
     246 +}
     247 + 
     248 +.max-height-288 {
     249 + max-height: 288px;
     250 + overflow-y: scroll;
     251 +}
     252 + 
     253 +.min-height-350 {
     254 + min-height: 350px;
     255 +}
     256 + 
     257 +.border-left {
     258 + border-left: 1px solid #EEEEEE;
     259 +}
     260 + 
     261 +.text-left {
     262 + text-align: left;
     263 +}
     264 + 
     265 +.bs-applications li {
     266 + font-size: 12px;
     267 + width: 12.5%;
     268 +}
     269 + 
     270 +.bs-applications li {
     271 + background-color: #f9f9f9;
     272 + float: left;
     273 + font-size: 10px;
     274 + height: 80px;
     275 + line-height: 1.4;
     276 + text-align: center;
     277 + width: 30%;
     278 +}
     279 + 
     280 +.bs-applications-list {
     281 + list-style: outside none none;
     282 +}
     283 + 
     284 +.bs-applications .fa {
     285 + font-size: 20px;
     286 + margin-bottom: 10px;
     287 + margin-top: 5px;
     288 +}
     289 + 
     290 +.shared-data-layer-container {
     291 + border-radius: 3px;
     292 + background-color: @brand-primary;
     293 + border: 3px solid @brand-primary;
     294 + margin-left: 0;
     295 + margin-right: 0;
     296 +}
     297 + 
     298 +.bs-applications-heading {
     299 + background-color: white;
     300 + // border: 3px solid @brand-primary;
     301 + color: @brand-primary;
     302 + padding: 10px;
     303 + margin: 0;
     304 + text-align: center;
     305 +}
     306 + 
     307 +.bs-applications li {
     308 + font-size: 10px;
     309 + line-height: 1.4;
     310 + text-align: center;
     311 + border: 2px solid @gray;
     312 + color: #FFFFFF;//@gray-medium;
     313 + background-color: @gray;
     314 + border-radius: 3px;
     315 + margin-left: 2.4%;
     316 +}
     317 + 
     318 +.bs-applications li.active {
     319 + border: 2px solid @brand-primary;
     320 + background-color: @brand-primary;
     321 + color: @gray-lighter;
     322 +}
     323 + 
     324 +.bs-applications li.active-success {
     325 + border: 2px solid @brand-success;
     326 + background-color: @brand-success;
     327 + color: @gray-lighter;
     328 +}
     329 + 
     330 +.bs-applications li.empty {
     331 + border: none;
     332 + background: none;
     333 +}
     334 + 
     335 +.northbound-list {
     336 + margin-bottom: 0 !important;
     337 +}
     338 + 
     339 +.northbound-list li {
     340 + width: 30%;
     341 + // margin-left: 0 !important;
     342 + margin-left: 16.5%;
     343 +}
     344 + 
     345 +.bs-applications-list {
     346 + list-style: outside none none;
     347 + padding-left: 0;
     348 +}
     349 + 
     350 +.bs-applications {
     351 + margin-left: 0;
     352 + margin-right: 0;
     353 +}
     354 + 
     355 +.bs-applications {
     356 + margin: 0 -10px 20px;
     357 + overflow: hidden;
     358 +}
     359 + 
     360 +.applications-class {
     361 + font-size: 1.5em;
     362 +}
     363 + 
     364 +.applications-class-small {
     365 + font-size: 0.8em;
     366 +}
     367 + 
     368 +.component-img {
     369 + margin-top: -5px;
     370 +}
     371 + 
     372 +.transfer-container {
     373 + padding-left: 0;
     374 + font-size: 2em;
     375 + transform: rotate(270deg);
     376 + transform-origin: left top 0;
     377 + text-align: left;
     378 + height: 5px;
     379 + width: 32px;
     380 + background-color: @brand-primary;
     381 +}
     382 + 
     383 +.transfer-container-hss {
     384 + margin: 32px 0 -8px 17%;
     385 +}
     386 + 
     387 +.transfer-container-cmg {
     388 + margin: 32px 0 -8px 25.3%;
     389 +}
     390 + 
     391 +.transfer-container-mme {
     392 + margin: 1px 0 -8px 81.6%;
     393 +}
     394 + 
     395 +.transfer-container-sdl {
     396 + margin: 32px 0 -5px 31.2%;
     397 +}
     398 + 
     399 +.transfer-container-horizontal {
     400 + padding-left: 2px;
     401 + font-size: 2em;
     402 + transform-origin: left top 0;
     403 + text-align: left;
     404 + margin: 0 0 -43px 50px;
     405 + top: 40px;
     406 + position: absolute;
     407 + height: 5px;
     408 + width: 33px;
     409 + background-color: @brand-primary;
     410 +}
     411 + 
     412 +@horizontalmax: ~"only screen and (max-width: 1200px)";
     413 +@horizontalmin: ~"only screen and (min-width: 1200px)";
     414 +@media @horizontalmax {
     415 + .transfer-container-horizontal {
     416 + left: 33.2%;
     417 + }
     418 +}
     419 +@media @horizontalmin {
     420 + .transfer-container-horizontal {
     421 + left: 35.5%;
     422 + }
     423 +}
     424 + 
     425 +.tranfer-indication {
     426 + width: 1px;
     427 + overflow: hidden;
     428 + display: block;
     429 + border-top: 3px dotted @gray-lighter;
     430 + margin-top: 1px;
     431 + margin-left: 1px;
     432 + font-size: 0.3em;
     433 +}
     434 + 
     435 +.loading {
     436 + -webkit-animation-name: transfer;
     437 + -webkit-animation-duration: 2s;
     438 + -webkit-animation-iteration-count: infinite;
     439 + -webkit-animation-timing-function: linear;
     440 + -webkit-animation-delay: 0s;
     441 + -moz-animation-name: transfer;
     442 + -moz-animation-duration: 2s;
     443 + -moz-animation-iteration-count: infinite;
     444 + -moz-animation-timing-function: linear;
     445 + -moz-animation-delay: 0s;
     446 + -o-animation-name: transfer;
     447 + -o-animation-duration: 2s;
     448 + -o-animation-iteration-count: infinite;
     449 + -o-animation-timing-function: linear;
     450 + -o-animation-delay: 0s;
     451 + animation-name: transfer;
     452 + animation-duration: 2s;
     453 + animation-iteration-count: infinite;
     454 + animation-timing-function: linear;
     455 + animation-delay: 0s;
     456 +}
     457 +@-webkit-keyframes transfer {
     458 + 0% {
     459 + width: 0;
     460 + }
     461 + 
     462 + 100% {
     463 + width: 30px;
     464 + }
     465 +}
     466 + 
     467 +.margin-top-73 {
     468 + margin-top: 73px;
     469 +}
     470 + 
     471 +.logo {
     472 + margin-left: 20px;
     473 +}
     474 + 
     475 +.logo-img {
     476 + height: 20px;
     477 +}
     478 + 
     479 +.gray-light-text {
     480 + color: darken(@gray-light, 10%);
     481 +}
     482 + 
     483 +.animated-font {
     484 + -webkit-animation: color-change 1.5s infinite;
     485 + -moz-animation: color-change 1.5s infinite;
     486 + -o-animation: color-change 1.5s infinite;
     487 + -ms-animation: color-change 1.5s infinite;
     488 + animation: color-change 1.5s infinite;
     489 +}
     490 +@-webkit-keyframes color-change {
     491 + 0% {
     492 + color: darken(@gray-light, 10%);
     493 + }
     494 + 
     495 + 50% {
     496 + color: @brand-success;
     497 + }
     498 + 
     499 + 100% {
     500 + color: darken(@gray-light, 10%);
     501 + }
     502 +}
     503 +@-moz-keyframes color-change {
     504 + 0% {
     505 + color: darken(@gray-light, 10%);
     506 + }
     507 + 
     508 + 50% {
     509 + color: @brand-success;
     510 + }
     511 + 
     512 + 100% {
     513 + color: darken(@gray-light, 10%);
     514 + }
     515 +}
     516 +@-ms-keyframes color-change {
     517 + 0% {
     518 + color: darken(@gray-light, 10%);
     519 + }
     520 + 
     521 + 50% {
     522 + color: @brand-success;
     523 + }
     524 + 
     525 + 100% {
     526 + color: darken(@gray-light, 10%);
     527 + }
     528 +}
     529 +@-o-keyframes color-change {
     530 + 0% {
     531 + color: darken(@gray-light, 10%);
     532 + }
     533 + 
     534 + 50% {
     535 + color: @brand-success;
     536 + }
     537 + 
     538 + 100% {
     539 + color: darken(@gray-light, 10%);
     540 + }
     541 +}
     542 +@keyframes color-change {
     543 + 0% {
     544 + color: darken(@gray-light, 10%);
     545 + }
     546 + 
     547 + 50% {
     548 + color: @brand-success;
     549 + }
     550 + 
     551 + 100% {
     552 + color: darken(@gray-light, 10%);
     553 + }
     554 +}
     555 + 
     556 +.heading-dashboard {
     557 + margin-top: 5px;
     558 + margin-bottom: 0;
     559 +}
     560 + 
     561 +.heading-level-2 {
     562 + border-bottom: 1px solid @gray-lighter;
     563 + padding-bottom: 10px;
     564 +}
     565 + 
     566 +.panel-default {
     567 + border: none;
     568 + box-shadow: none;
     569 +}
     570 + 
     571 +.panel-default > .panel-heading {
     572 + background-color: white;
     573 + border-color: @gray-light;
     574 + color: #1B1B1B;
     575 +}
     576 + 
     577 +.endpoint-container {
     578 + background-color: @brand-primary;
     579 + color: @gray-lighter;
     580 + text-align: center;
     581 +}
     582 + 
     583 +.endpoint-container p {
     584 + font-size: 0.65em;
     585 + padding: 4px 0 3px;
     586 + margin: 0;
     587 +}
     588 + 
     589 +.margin-left-32 {
     590 + margin-left: 32px !important;
     591 +}
     592 + 
     593 +.ott-services {
     594 + span {
     595 + font-size: 2em !important;
     596 + margin: -7px auto;
     597 + width: 100px;
     598 + height: 200px;
     599 + display: block;
     600 + }
     601 +}
     602 + 
     603 +.cmm-component {
     604 + color: #00C9FF !important;
     605 +}
     606 + 
     607 +.opaque-component {
     608 + opacity: .6;
     609 +}
     610 + 
     611 +/**
     612 + * Include specific styles for each screen
     613 + */
     614 +// @import '../app/home/home.less';
     615 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/less/nav-wizard.less
     1 +@arrow-size: 28px;
     2 +@arrow-sep: 6px;
     3 + 
     4 +.arrow(@color) {
     5 + width: 0;
     6 + height: 0;
     7 + border-top: @arrow-size inset transparent;
     8 + border-bottom: @arrow-size inset transparent;
     9 + border-left: @arrow-size solid @color;
     10 + position: absolute;
     11 + content: "";
     12 + top: 0;
     13 +}
     14 +// Nav Wizard
     15 +// From github.com/acornejo/bootstrap-nav-wizard
     16 +// -------------------------
     17 + 
     18 +.nav-wizard {
     19 + width: 880px;
     20 + margin: 0 auto 30px;
     21 + 
     22 + > li {
     23 + float: left;
     24 + 
     25 + > label {
     26 + position: relative;
     27 + background-color: @gray-lighter;
     28 + padding: 15px 39px;
     29 + font-size: 1.6em;
     30 + height: 56px;
     31 + padding-top: 0;
     32 + padding-bottom: 0;
     33 + line-height: 56px;
     34 + margin-bottom: 0;
     35 + color: @gray-medium;
     36 + 
     37 + -webkit-transition: all .3s ease-in-out;
     38 + -moz-transition: all .3s ease-in-out;
     39 + -o-transition: all .3s ease-in-out;
     40 + transition: all .3s ease-in-out;
     41 + 
     42 + .badge {
     43 + margin-left: 3px;
     44 + color: @nav-link-hover-bg;
     45 + background-color: @badge-active-color;
     46 + }
     47 + 
     48 + &:after {
     49 + -webkit-transition: all .3s ease-in-out;
     50 + -moz-transition: all .3s ease-in-out;
     51 + -o-transition: all .3s ease-in-out;
     52 + transition: all .3s ease-in-out;
     53 + }
     54 + }
     55 + 
     56 + &:not(:first-child) > label {
     57 + padding-left: 2*@arrow-size - @arrow-sep;
     58 + 
     59 + &:before {
     60 + .arrow(#fff);
     61 + left: 0;
     62 + }
     63 + }
     64 + 
     65 + &:not(:last-child) > label {
     66 + margin-right: @arrow-sep;
     67 + 
     68 + &:after {
     69 + .arrow(@gray-lighter);
     70 + right: -@arrow-size;
     71 + z-index: 2;
     72 + }
     73 + }
     74 + 
     75 + &:first-child > label {
     76 + border-top-left-radius: @nav-pills-border-radius;
     77 + border-bottom-left-radius: @nav-pills-border-radius;
     78 + }
     79 + 
     80 + &:last-child > label {
     81 + border-top-right-radius: @nav-pills-border-radius;
     82 + border-bottom-right-radius: @nav-pills-border-radius;
     83 + }
     84 + /*
     85 + &.done:hover > label,
     86 + &:hover > label {
     87 + background-color: darken(@nav-link-hover-bg, 10%);
     88 + 
     89 + &:before {
     90 + border-right-color: darken(@nav-link-hover-bg, 10%);
     91 + }
     92 + 
     93 + &:after {
     94 + border-left-color: darken(@nav-link-hover-bg, 10%);
     95 + }
     96 + }
     97 + */
     98 + &.done > label {
     99 + background-color: darken(@nav-link-hover-bg, 5%);
     100 + 
     101 + &:before {
     102 + border-right-color: darken(@nav-link-hover-bg, 5%);
     103 + }
     104 + 
     105 + &:after {
     106 + border-left-color: darken(@nav-link-hover-bg, 5%);
     107 + }
     108 + }
     109 + 
     110 + &.active > label {
     111 + &,
     112 + &:focus,
     113 + &:hover {
     114 + color: @nav-pills-active-link-hover-color;
     115 + background-color: @brand-primary;
     116 + }
     117 + 
     118 + &:after {
     119 + border-left-color: @brand-primary;
     120 + }
     121 + 
     122 + .badge {
     123 + color: @badge-active-color;
     124 + background-color: @badge-active-bg;
     125 + }
     126 + }
     127 + 
     128 + &.disabled > label {
     129 + color: @nav-disabled-link-color;
     130 + 
     131 + &:focus,
     132 + &:hover {
     133 + color: @nav-disabled-link-color;
     134 + text-decoration: none;
     135 + background-color: @nav-link-hover-bg;
     136 + cursor: default;
     137 + }
     138 + 
     139 + &:before {
     140 + border-right-color: @nav-link-hover-bg;
     141 + }
     142 + 
     143 + &:after {
     144 + border-left-color: @nav-link-hover-bg;
     145 + }
     146 + }
     147 + // &.active ~ li > a {
     148 + // color: @nav-disabled-link-color;
     149 + // &:hover,
     150 + // &:focus {
     151 + // color: @nav-disabled-link-hover-color;
     152 + // text-decoration: none;
     153 + // background-color: transparent;
     154 + // cursor: not-allowed;
     155 + // }
     156 + // // background-color: darken(@nav-link-hover-bg, 20%);
     157 + // // &:before {
     158 + // // border-right-color: darken(@nav-link-hover-bg, 20%);
     159 + // // }
     160 + // // &:after {
     161 + // // border-left-color: darken(@nav-link-hover-bg, 20%);
     162 + // // }
     163 + // }
     164 + }
     165 +}
     166 + 
     167 +.nav-wizard.nav-justified {
     168 + > li {
     169 + float: none;
     170 + 
     171 + > label {
     172 + padding: @nav-link-padding;
     173 + }
     174 + }
     175 + // Small screens size, remove the "arrows" and just show it like stacked pills.
     176 + @media (max-width: @screen-sm-min) {
     177 + > li > label {
     178 + border-radius: @nav-pills-border-radius;
     179 + margin-right: 0;
     180 + 
     181 + &:after,
     182 + &:before {
     183 + border: none !important;
     184 + }
     185 + }
     186 + }
     187 +}
     188 + 
     189 +.menu-link {
     190 + font-size: 1.1em;
     191 + padding: 0;
     192 + height: 30px;
     193 + line-height: 30px;
     194 +}
     195 + 
     196 +.left-icon {
     197 + float: left;
     198 + width: 30px;
     199 + height: 29px;
     200 + padding-top: 6px;
     201 + font-size: 1.1em;
     202 + display: inline-block;
     203 + color: white;
     204 + margin-right: 15px;
     205 + border-right: 1px solid white;
     206 +}
     207 + 
     208 +.right-icon,
     209 +.right-icon-warning {
     210 + margin-top: 7px;
     211 + float: right;
     212 + width: 40px;
     213 + height: 40px;
     214 + border-radius: 50%;
     215 + font-size: 1em;
     216 + padding: 7px;
     217 + margin-left: 10px;
     218 +}
     219 + 
     220 +.right-icon {
     221 + border: 2px solid @gray-lighter;
     222 + color: @gray-lighter;
     223 +}
     224 + 
     225 +.right-icon-warning {
     226 + border: 2px solid @gray-medium;
     227 +}
     228 + 
     229 +.right-icon-warning-spinner {
     230 + margin-left: 20px;
     231 +}
     232 + 
     233 +.right-icon-bottom {
     234 + margin-top: 7px;
     235 + float: right;
     236 + margin-right: 7px;
     237 +}
     238 + 
     239 +.menu-action {
     240 + padding-right: 80px;
     241 + text-align: left;
     242 +}
     243 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/less/navbar.less
     1 +.menu-border {
     2 + height: 2px;
     3 + width: 1px;
     4 + background-color: transparent;
     5 +}
     6 +.navbar-default .navbar-nav > .active > .menu-border,
     7 +.navbar-default .nav > li a:hover + .menu-border,
     8 +.navbar-default .dropdown.open .menu-border {
     9 + width: 100%;
     10 + background-color: @brand-primary;
     11 +}
     12 +.navbar-inverse .navbar-nav > .active > .menu-border,
     13 +.navbar-inverse .nav > li a:hover + .menu-border,
     14 +.navbar-inverse .dropdown.open .menu-border {
     15 + width: 100%;
     16 + background-color: @gray-lighter;
     17 +}
     18 +.open > .dropdown-menu {
     19 + animation-name: slidenavAnimation;
     20 + animation-duration:.5s;
     21 + animation-iteration-count: 1;
     22 + animation-timing-function: ease;
     23 + animation-fill-mode: forwards;
     24 + -webkit-animation-name: slidenavAnimation;
     25 + -webkit-animation-duration:.5s;
     26 + -webkit-animation-iteration-count: 1;
     27 + -webkit-animation-timing-function: ease;
     28 + -webkit-animation-fill-mode: forwards;
     29 + -moz-animation-name: slidenavAnimation;
     30 + -moz-animation-duration:.5s;
     31 + -moz-animation-iteration-count: 1;
     32 + -moz-animation-timing-function: ease;
     33 + -moz-animation-fill-mode: forwards;
     34 +}
     35 +@keyframes slidenavAnimation {
     36 + from {
     37 + opacity: 0;
     38 + top: 120%;
     39 + }
     40 + to {
     41 + opacity: 1;
     42 + top: 100%;
     43 + }
     44 +}
     45 +@-webkit-keyframes slidenavAnimation {
     46 + from {
     47 + opacity: 0;
     48 + top: 120%;
     49 + }
     50 + to {
     51 + opacity: 1;
     52 + top: 100%;
     53 + }
     54 +}
     55 +.navbar-right .dropdown-menu:before {
     56 + position: absolute;
     57 + top: -7px;
     58 + right: 9px;
     59 + display: inline-block;
     60 + border-right: 7px solid transparent;
     61 + border-left: 7px solid transparent;
     62 + content: '';
     63 +}
     64 +.navbar-right .dropdown-menu:after {
     65 + position: absolute;
     66 + top: -6px;
     67 + right: 10px;
     68 + display: inline-block;
     69 + border-right: 6px solid transparent;
     70 + border-left: 6px solid transparent;
     71 + content: '';
     72 +}
     73 +.navbar-right .dropdown-menu.container-warning:before {
     74 + border-bottom: 7px solid @brand-warning;
     75 +}
     76 +.navbar-right .dropdown-menu.container-warning:after {
     77 + border-bottom: 6px solid @brand-warning;
     78 +}
     79 +.navbar-right .dropdown-menu.container-primary:before {
     80 + border-bottom: 7px solid @brand-primary;
     81 +}
     82 +.navbar-right .dropdown-menu.container-primary:after {
     83 + border-bottom: 6px solid @brand-primary;
     84 +}
     85 +.navbar-right .dropdown-menu.container-info:before {
     86 + border-bottom: 7px solid @brand-info;
     87 +}
     88 +.navbar-right .dropdown-menu.container-info:after {
     89 + border-bottom: 6px solid @brand-info;
     90 +}
     91 +.navbar-right .dropdown-menu.container-default:before {
     92 + border-bottom: 7px solid #ffffff;
     93 +}
     94 +.navbar-right .dropdown-menu.container-default:after {
     95 + border-bottom: 6px solid #ffffff;
     96 +}
     97 +@media screen and (max-width: 768px) {
     98 + .navbar-right .dropdown-menu.container-warning:before {
     99 + border-bottom: 0px solid @brand-warning;
     100 + }
     101 + .navbar-right .dropdown-menu.container-warning:after {
     102 + border-bottom: 0px solid @brand-warning;
     103 + }
     104 + .navbar-right .dropdown-menu.container-primary:before {
     105 + border-bottom: 0px solid @brand-primary;
     106 + }
     107 + .navbar-right .dropdown-menu.container-primary:after {
     108 + border-bottom: 0px solid @brand-primary;
     109 + }
     110 + .navbar-right .dropdown-menu.container-info:before {
     111 + border-bottom: 0px solid @brand-info;
     112 + }
     113 + .navbar-right .dropdown-menu.container-info:after {
     114 + border-bottom: 0px solid @brand-info;
     115 + }
     116 + .navbar-right .dropdown-menu.container-default:before {
     117 + border-bottom: 0px solid #ffffff;
     118 + }
     119 + .navbar-right .dropdown-menu.container-default:after {
     120 + border-bottom: 0px solid #ffffff;
     121 + }
     122 +}
     123 +.navbar-brand {
     124 + padding: 20px 15px;
     125 + margin: 0px;
     126 + line-height: 1em;
     127 +}
     128 +.navbar {
     129 + // box-shadow: 0px 1px 2px #EEEEEE;
     130 +}
     131 +@media screen and (max-width: 992px) {
     132 + .nav > li > a {
     133 + padding-left: 11px;
     134 + padding-right: 11px;
     135 + font-size: .9em;
     136 + }
     137 +}
     138 +.dropdown-menu > li > a {
     139 + padding: 15px 20px;
     140 +}
     141 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/less/sigma.less
     1 +#container {
     2 + max-width: 100%;
     3 + height: 550px;
     4 + margin: auto;
     5 +}
     6 + 
     7 +.subject-list {
     8 + margin-bottom: 10px;
     9 + 
     10 + .subject-list-link {
     11 + font-size: 0.9em;
     12 + }
     13 +}
     14 + 
     15 +.graph-alert {
     16 + font-size: 0.8em;
     17 +}
     18 + 
     19 +.graph-input {
     20 + font-size: 0.8em;
     21 +}
     22 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/src/less/tree-vertical.less
     1 +/**
     2 + * Framework starts from here ...
     3 + * ------------------------------
     4 + */
     5 +.tree-vertical,
     6 +.tree-vertical ul {
     7 + margin: 0 0 0 1em;
     8 + /* indentation */
     9 + padding: 5px 0 0;
     10 + list-style: none;
     11 + color: @gray-light;
     12 + position: relative;
     13 +}
     14 + 
     15 +.tree-vertical ul {
     16 + margin-left: 0.5em;
     17 +}
     18 +/* (indentation/2) */
     19 +.tree-vertical ul:before,
     20 +.tree-vertical:before {
     21 + content: "";
     22 + display: block;
     23 + width: 0;
     24 + position: absolute;
     25 + top: -1px;
     26 + bottom: 0;
     27 + left: 15px;
     28 + border-left: 3px solid;
     29 +}
     30 + 
     31 +.tree-vertical li {
     32 + margin: 0;
     33 + padding: 0 0 0 3.5em;
     34 + /* indentation + .5em */
     35 + line-height: 2em;
     36 + /* default list item's `line-height` */
     37 + position: relative;
     38 +}
     39 + 
     40 +.tree-vertical li:before {
     41 + content: "";
     42 + display: block;
     43 + width: 32px;
     44 + /* same with indentation */
     45 + height: 0;
     46 + border-top: 3px solid;
     47 + margin-top: -1px;
     48 + /* border top width */
     49 + position: absolute;
     50 + top: 1em;
     51 + /* (line-height/2) */
     52 + left: 15px;
     53 +}
     54 + 
     55 +.tree-vertical li:last-child:before {
     56 + background: white;
     57 + /* same with body background */
     58 + height: auto;
     59 + top: 1em;
     60 + /* (line-height/2) */
     61 + bottom: 0;
     62 +}
     63 + 
     64 +.tree-item {
     65 + border: 3px solid @brand-info;
     66 + // background-color: @brand-info;
     67 + color: @brand-info;
     68 + // border-radius: 0;
     69 + // font-weight: 300;
     70 +}
     71 + 
     72 +.tree-item-ldap {
     73 + max-width: 300px;
     74 + overflow: hidden;
     75 + text-overflow: ellipsis;
     76 + display: block;
     77 +}
     78 + 
     79 +.tree-item-success {
     80 + border: 3px solid @brand-info;
     81 + // background-color: @brand-info;
     82 + color: @brand-info; // #00C9FF;
     83 +}
     84 + 
     85 +.endpoints-link {
     86 + color: #777777;
     87 + font-size: 0.8em;
     88 +}
     89 + 
     90 +.network-topology {
     91 + min-height: 350px;
     92 +}
     93 + 
  • ■ ■ ■ ■ ■ ■
    gui-frontend/tools.md
     1 +# The Tools Used in `ngBoilerplate`
     2 + 
     3 +## Introduction
     4 + 
     5 +`ngBoilerplate` is standards-based, so it uses all the usual tools to manage
     6 +and develop client-side code. If you've developed modern, highly-organized
     7 +JavaScript projects before, you are probably already familiar with at least most
     8 +of these tools. What follows is a simple description of the tools of which this
     9 +project makes use and how they fit in to the `ngBoilerplate` picture.
     10 + 
     11 +## Git
     12 + 
     13 +[Git](http://git-scm.com/) is a distributed version control system.
     14 +`ngBoilerplate` uses git to manage its codebase. While in theory you don't have
     15 +to use Git once you download `ngBoilerplate`, this project makes the assumption
     16 +that you do. If you're on GitHub, I assume you already have a basic
     17 +understanding of Git, which is all you need to make effective use of this
     18 +project. You just need to be able to commit and push and junk - nothing funky.
     19 +If you're not familiar with it, check out the documentation linked to above.
     20 +GitHub also has a great [help section](https://help.github.com/).
     21 + 
     22 +## Node.js & NPM
     23 + 
     24 +[Node.js](http://nodejs.org) is a platform based on Chrome's JavaScript runtime,
     25 +called [V8](http://code.google.com/p/v8/). It allows you to develop all kinds of
     26 +software using the JavaScript you already know and love.
     27 + 
     28 +A great feature of Node.js is its wide variety of existing libraries and tools.
     29 +As the developer community is absolutely massive and incredibly active, Node.js
     30 +has a basic package manager called NPM that you can use to install Node.js-based
     31 +software and libraries from the command line.
     32 + 
     33 +While `ngBoilerplate` makes heavy use of Node.js behind the scenes, you as the
     34 +application developer don't need to really think about it much. Most of the
     35 +interaction with Node.js will occur through Grunt (see next section), so you
     36 +really only need to know how get the initial setup working.
     37 + 
     38 +`package.json` is an NPM package description file written in JSON. It contains
     39 +basic metadata about your application, like its name, version, and dependencies.
     40 +By default, several packages are required for the build process to work; so when
     41 +you first start with `ngBoilerplate` you have to tell NPM to install the
     42 +packages; this is covered in detail in the [main README](README.md). Some of
     43 +the required packages are Grunt build tasks (see below), while others are
     44 +command-line tools either we (or the build system) need, like Karma, Grunt, and
     45 +Bower.
     46 + 
     47 +Don't worry about knowing Node.js in order to use `ngBoilerplate`; Grunt is
     48 +where the magic happens.
     49 + 
     50 +## Grunt.js
     51 + 
     52 +[Grunt](http://gruntjs.com) is a JavaScript task runner that runs on top of
     53 +Node.js. Most importantly, Grunt brings us automation. There are lots of steps
     54 +that go into taking our manageable codebase and making it into a
     55 +production-ready website; we must gather, lint, test, annotate, and copy files
     56 +about. Instead of doing all of that manually, we write (and use others') Grunt
     57 +tasks to do things for us.
     58 + 
     59 +When we want to build our site, we can just type:
     60 + 
     61 +```sh
     62 +$ grunt
     63 +```
     64 + 
     65 +This will do everything needed and place our built code inside a folder called
     66 +`bin/`. Even more magical, we can tell Grunt to watch for file changes we make
     67 +so it can re-build our site on-the-fly:
     68 + 
     69 +```sh
     70 +$ grunt watch
     71 +```
     72 + 
     73 +The built files will be in `build/`. See the main [README](README.md) for more
     74 +info.
     75 + 
     76 +The next time we change a source file, Grunt will re-build the changed parts of
     77 +the site. If you have a Live Reload plugin installed in your browser, it will
     78 +even auto-refresh your browser for you. You lazy bum.
     79 + 
     80 +Grunt is controlled through `Gruntfile.js`. This file is heavily documented in
     81 +the source, so I will only provide a high-altitude overview here. Also note that
     82 +unless you need to modify the build process, you don't need to know anything
     83 +else from this section. The two commands above really are all you need to know
     84 +to get started with `ngBoilerplate`. But for those curious or looking to go a
     85 +little more advanced, here's what you'll find.
     86 + 
     87 +First, we tell Grunt which tasks we might want to use:
     88 + 
     89 +```js
     90 +// ...
     91 +grunt.loadNpmTasks('grunt-recess');
     92 +grunt.loadNpmTasks('grunt-contrib-clean');
     93 +grunt.loadNpmTasks('grunt-contrib-copy');
     94 +grunt.loadNpmTasks('grunt-contrib-jshint');
     95 +// ...
     96 +```
     97 + 
     98 +Each of these tasks must already be installed. Remember the dependencies from
     99 +`package.json` that NPM installed for us? Well, this is where they get used!
     100 + 
     101 +Then we get the opportunity to tell the tasks to behave like we want by
     102 +defining a configuration object. While we can (and do) define all sorts of
     103 +custom configuration values that we reference later on, tasks look for
     104 +configuration properties of their own name. For example, the `clean` task just
     105 +takes an array of files to delete when the task runs:
     106 + 
     107 +```js
     108 +clean: [ '<%= build_dir %>', '<%= compile_dir %>' ],
     109 +```
     110 + 
     111 +In Grunt, the `<%= varName %>` is a way of re-using configuration variables.
     112 +In the `build.config.js`, we defined what `build_dir` meant:
     113 + 
     114 +```js
     115 +build_dir: 'build',
     116 +```
     117 + 
     118 +When the clean task runs, it will delete the `build/` folder entirely so that
     119 +when our new build runs, we don't encounter any problems with stale or old
     120 +files. Most tasks, however, have considerably more complicated configuration
     121 +requirements, but I've tried to document what each one is doing and what the
     122 +configuration properties mean. If I was vague or ambiguous or just plain
     123 +unclear, please file an issue and I'll get it fixed. Boom - problem solved.
     124 + 
     125 +After our configuration is complete, we can define some of our own tasks. For
     126 +example, we could do the build by running all of the separate tasks that we
     127 +installed from NPM and configured as above:
     128 + 
     129 +```sh
     130 +$ grunt clean
     131 +$ grunt html2js
     132 +$ grunt jshint
     133 +$ grunt karma:continuous
     134 +$ grunt concat
     135 +$ grunt ngmin:dist
     136 +$ grunt uglify
     137 +$ grunt recess
     138 +$ grunt index
     139 +$ grunt copy
     140 +```
     141 + 
     142 +But how automated is that? So instead we define a composite task that executes
     143 +all that for us. The commands above make up the `default` tasks, which can be
     144 +run by typing *either* of these commands:
     145 + 
     146 +```js
     147 +$ grunt
     148 +$ grunt default
     149 +```
     150 + 
     151 +We also define the `watch` task discussed earlier. This is covered in more
     152 +detail in the main (README)[README.md].
     153 + 
     154 +Grunt is the engine behind `ngBoilerplate`. It's the magic that makes it move.
     155 +Just getting started, you won't need to alter `Gruntfile.js` at all, but
     156 +as you get into more advanced application development, you will probably need to
     157 +add more tasks and change some steps around to make this build your own.
     158 +Hopefully, this readme and the documentation within `Gruntfile.js` (as well as
     159 +of course the documentation at gruntjs.com) will set you on the right path.
     160 + 
     161 +## Bower
     162 + 
     163 +[Bower](bower.io) is a package manager for the web. It's similar in many
     164 +respects to NPM, though it is significantly simpler and only contains code for
     165 +web projects, like Twitter Bootstrap and its AngularJS counterpart Angular
     166 +Bootstrap. Bower allows us to say that our app depends in some way on these
     167 +other libraries so that we can manage all of them in one simple place.
     168 + 
     169 +`ngBoilerplate` comes with a `bower.json` file that looks something like this:
     170 + 
     171 +```js
     172 +{
     173 + "name": "ng-boilerplate",
     174 + "version": "0.2.0-SNAPSHOT",
     175 + "devDependencies": {
     176 + "angular": "~1.0.7",
     177 + "angular-mocks": "~1.0.7",
     178 + "bootstrap": "~2.3.2",
     179 + "angular-bootstrap": "~0.3.0",
     180 + "angular-ui-router": "~0.0.1",
     181 + "angular-ui-utils": "~0.0.3"
     182 + },
     183 + "dependencies": {}
     184 +}
     185 +```
     186 + 
     187 +This file is fairly self-explanatory; it gives the package name and version
     188 +(duplicated from `package.json`, but this is unavoidable) as well as a list of
     189 +dependencies our application needs in order to work. If we simply call
     190 + 
     191 +```sh
     192 +$ bower install
     193 +```
     194 + 
     195 +it will read these three dependencies and install them into the `vendor/` folder
     196 +(along with any dependencies they have) so that we can use them in our app. If
     197 +we want to add a new package like AngularUI's
     198 +[ngGrid](http://angular-ui.github.io/ng-grid/), then we can tell Bower to
     199 +install that from the web, place it into the `vendor/` folder for us to use, and
     200 +then add it as a dependency to `bower.json`:
     201 + 
     202 +```js
     203 +$ bower install angular-grid --save-dev
     204 +```
     205 + 
     206 +Bower can also update all of our packages for us at a later date, though that
     207 +and its many other awesome features are beyond the scope of this simple
     208 +overview.
     209 + 
     210 +One last thing to note is that packages installed with Bower are not
     211 +standardized, so we cannot automatically add them to the build process; anything
     212 +installed with Bower (or placed in the `vendor/` directory manually) *must* be
     213 +added to your `build.config.js` file manually; look for the Bower libs included
     214 +in `ngBoilerplate` by default in there to see what I mean.
     215 + 
     216 +## Where to Go From Here
     217 + 
     218 +That's it! Now that you have a basic understanding of the tools involved, read
     219 +through the [main README](README.md) to dive another level deeper and apply what
     220 +you've learned for great good. I promise it will all make sense it short order.
     221 + 
     222 +Happy programming!
     223 + 
     224 + 
Please wait...
Page is in error, reload to recover