diff --git a/.gitignore b/.gitignore index b741bbfd..2547f3f0 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ js/vendor/jquery.js js/vendor/jquery-ui.js js/vendor/lodash.js js/vendor/ace/*.js +js/vendor/jasmine*.js js/vendor/jquery.jstree.js js/vendor/jquery.dataTables*.js js/vendor/dataTables*.js @@ -50,3 +51,7 @@ js/vendor/ICanHaz.js js/vendor/require.js js/vendor/twitter/*.js js/vendor/URI + +#RVM default version files +.ruby-version +.ruby-gemset diff --git a/.travis.yml b/.travis.yml index 4d7aab0d..b4b30c03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,3 +3,6 @@ node_js: - "0.10" before_install: - npm install -g grunt-cli + - cp config/backend.json.sample config/backend.json +install: + - npm install \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index 9ed93a0c..3c92a16b 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,226 +1,210 @@ /*jshint smarttabs:true */ /*global module:false*/ module.exports = function(grunt) { - - // Project configuration. - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - meta: { - banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + - '<%= grunt.template.today("yyyy-mm-dd") %>\n' + - '* https://github.com/TranscendComputing/StackStudio\n' + - '* Copyright (c) <%= grunt.template.today("yyyy") %> ' + - 'Transcend Computing; Licensed APL2 */' - }, - source: { - files: ['js/interpreters/**/*.js', - 'js/models/**/*.js', - 'js/views/**/*.js', - 'js/collections/**/*.js', - 'js/aws/**/*.js', - 'js/openstack/**/*.js'] - }, - spec: { - files: ['spec/**/*.js'] - }, - lint: { - files: ['Gruntfile.js', - 'js/stackplace.build.js', - '<%= source.files %>'] - }, - concat: { - options: { - stripBanners: true, - banner: '<%= meta.banner %>' - }, - dist: { - src: ['js/main.js', 'js/plugins.js'], - dest: 'dist/<%= pkg.name %>.js' - } - }, - uglify: { - options: { - stripBanners: true, - banner: '<%= meta.banner %>' - }, - misc: { - files: { - 'dist/<%= pkg.name %>.min.js': ['<%= source.files %>', '<%= concat.dist.dest %>'] - } - } - }, - // Download some CDN assets to serve as backups (served locally as last resort) - curl: { - 'js/vendor/require.js': 'http://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.5/require.min.js', - 'js/vendor/jquery.js': 'http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js', - 'js/vendor/jquery.dataTables.js': 'http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.js', - 'js/vendor/dataTables.bootstrap.js': 'https://raw.github.com/DataTables/Plugins/master/integration/bootstrap/3/dataTables.bootstrap.js', - 'css/dataTables.bootstrap.css': 'https://raw.github.com/DataTables/Plugins/master/integration/bootstrap/3/dataTables.bootstrap.css', - 'js/vendor/ace/ace.js': 'https://github.com/ajaxorg/ace-builds/blob/master/src-min/ace.js', - 'js/vendor/backbone.js': 'http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js', - 'js/vendor/lodash.js': 'http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.1.0/lodash.min.js', - 'js/vendor/jquery-ui.js': 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js', - 'js/vendor/jquery.jstree.js': 'http://cdn.jsdelivr.net/jquery.jstree/pre1.0/jquery.jstree.js', - 'js/vendor/jquery.terminal.js': 'http://cdn.jsdelivr.net/jquery.terminal/0.7.8/jquery.terminal-min.js', - 'js/vendor/ICanHaz.js': 'https://raw.github.com/HenrikJoreteg/ICanHaz.js/master/ICanHaz.js', - 'js/vendor/twitter/typeahead.js': 'http://cdn.jsdelivr.net/typeahead.js/0.9.3/typeahead.min.js', - 'js/vendor/URI/URI.js': 'http://cdn.jsdelivr.net/uri.js/1.10.2/URI.js', - 'js/vendor/URI/punycode.js': 'http://cdn.jsdelivr.net/uri.js/1.10.2/punycode.js', - 'js/vendor/URI/IPv6.js': 'http://cdn.jsdelivr.net/uri.js/1.10.2/IPv6.js', - 'js/vendor/URI/SecondLevelDomains.js': 'http://cdn.jsdelivr.net/uri.js/1.10.2/SecondLevelDomains.js' - }, - clean: ['js/vendor/require.js', - 'js/vendor/jquery.js', - 'js/vendor/jquery.dataTables.js', - 'js/vendor/ace/ace.js', - 'js/vendor/backbone.js', - 'js/vendor/lodash.js', - 'js/vendor/jquery-ui.js', - 'js/vendor/jquery.jstree.js', - 'js/vendor/jquery.terminal.js', - 'js/vendor/ICanHaz.js', - 'js/vendor/twitter/typeahead.js', - 'js/vendor/URI/URI.js', - 'js/vendor/URI/punycode.js', - 'js/vendor/URI/IPv6.js', - 'js/vendor/URI/SecondLevelDomains.js' - ], - watch: { - files: '<%= lint.files %>', - tasks: 'default' - }, - jshint: { - options: { - curly: true, - eqeqeq: true, - immed: true, - latedef: true, - newcap: true, - noarg: true, - sub: true, - undef: true, - boss: true, - eqnull: true, - browser: true, - smarttabs: true, - devel:true, - globals: { - jQuery: true, - console: true, - require: true, - requirejs: true - } - }, - source_files: '<%= lint.files %>', - spec_files: { - options: { - globals: { - describe: true, - it: true, - expect: true - } + // Project configuration. + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + meta: { + banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + + '<%= grunt.template.today("yyyy-mm-dd") %>\n' + + '* https://github.com/TranscendComputing/StackStudio\n' + + '* Copyright (c) <%= grunt.template.today("yyyy") %> ' + + 'Transcend Computing; Licensed APL2 */' }, - files: { - src: '<%= spec.files %>' - } - } - }, - server: { - port: 9002 - }, - connect: { - sstudio: { - options: { - port: 9001, - hostname: "*" - } - }, - test : { - port : 9002 - } - }, - selenium: { - options: { - startURL: 'http://localhost:9001/', - browsers: ['firefox'] - }, - suite: { - files: { - 'StackStudio': ['test/*.suite'] - } - } - }, - jasmine: { - test: { - options: { - specs: '<%= spec.files %>', - template: require('grunt-template-jasmine-requirejs'), - templateOptions: { - requireConfig: { - baseUrl: '', - // The shim config allows us to configure dependencies for - // scripts that do not call define() to register a module - shim: { - 'jquery-ui': { - deps: ['jquery'] - }, - 'underscore': { - exports: '_' - }, - 'backbone': { - deps: [ - 'underscore', - 'jquery' - ], - exports: 'Backbone' - }, - 'icanhaz': { - deps: ['jquery'], - exports: 'ich' - }, - 'jquery.terminal': { - deps: ['jquery', 'jquery.mousewheel'], - exports: 'jQuery.fn.terminal' - }, - 'jquery.dataTables': { - deps: ['jquery'], - exports: 'jQuery.fn.dataTable' - }, - 'jquery.purr': { - deps: ['jquery'], - exports: 'jQuery.fn.purr' - }, - 'jquery.mousewheel': { - deps: ['jquery'], - exports: 'jQuery.fn.mousewheel' - } - }, - paths: { - collections: 'js/collections', - models: 'js/models', - routers: 'js/routers', - views: 'js/views', - interpreters: 'js/interpreters', - 'jquery': 'js/vendor/jquery-1.9.1.min', - 'jquery-ui': 'js/vendor/jquery-ui', - 'underscore': 'js/vendor/lodash', - 'backbone': 'js/vendor/backbone', - 'icanhaz': 'js/vendor/ICanHaz', - 'jquery.terminal': 'js/vendor/jquery.terminal-0.7.3', - 'jquery.mousewheel': 'js/vendor/jquery.mousewheel-min' + source: { + files: ['js/interpreters/**/*.js', + 'js/models/**/*.js', + 'js/views/**/*.js', + 'js/collections/**/*.js', + 'js/aws/**/*.js', + 'js/openstack/**/*.js', + 'js/vcloud/**/*.js'] + }, + spec: { + files: ['spec/**/*.js'] + }, + lint: { + files: ['Gruntfile.js', + 'js/config/*.js', + '<%= source.files %>'] + }, + concat: { + options: { + stripBanners: true, + banner: '<%= meta.banner %>' + }, + dist: { + src: ['js/main.js', 'js/plugins.js'], + dest: 'dist/<%= pkg.name %>.js' + } + }, + uglify: { + options: { + stripBanners: true, + banner: '<%= meta.banner %>' + }, + misc: { + files: { + 'dist/<%= pkg.name %>.min.js': ['<%= source.files %>', '<%= concat.dist.dest %>'] + } + } + }, + // Download some CDN assets to serve as backups (served locally as last resort) + curl: { + 'js/vendor/require.js': 'http://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.5/require.min.js', + 'js/vendor/jquery.js': 'http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js', + 'js/vendor/jquery.dataTables.js': 'http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.js', + 'js/vendor/dataTables.bootstrap.js': 'https://raw.github.com/DataTables/Plugins/master/integration/bootstrap/3/dataTables.bootstrap.js', + 'css/dataTables.bootstrap.css': 'https://raw.github.com/DataTables/Plugins/master/integration/bootstrap/3/dataTables.bootstrap.css', + 'js/vendor/ace/ace.js': 'https://github.com/ajaxorg/ace-builds/blob/master/src-min/ace.js', + 'js/vendor/backbone.js': 'http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js', + 'js/vendor/lodash.js': 'http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.1.0/lodash.min.js', + 'js/vendor/jquery-ui.js': 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js', + 'js/vendor/jquery.jstree.js': 'http://cdn.jsdelivr.net/jquery.jstree/pre1.0/jquery.jstree.js', + 'js/vendor/jquery.terminal.js': 'http://cdn.jsdelivr.net/jquery.terminal/0.7.8/jquery.terminal-min.js', + 'js/vendor/ICanHaz.js': 'https://raw.github.com/HenrikJoreteg/ICanHaz.js/master/ICanHaz.js', + 'js/vendor/twitter/typeahead.js': 'http://cdn.jsdelivr.net/typeahead.js/0.9.3/typeahead.min.js', + 'js/vendor/URI/URI.js': 'http://cdn.jsdelivr.net/uri.js/1.10.2/URI.js', + 'js/vendor/URI/punycode.js': 'http://cdn.jsdelivr.net/uri.js/1.10.2/punycode.js', + 'js/vendor/URI/IPv6.js': 'http://cdn.jsdelivr.net/uri.js/1.10.2/IPv6.js', + 'js/vendor/URI/SecondLevelDomains.js': 'http://cdn.jsdelivr.net/uri.js/1.10.2/SecondLevelDomains.js', + 'js/vendor/jasmine-jquery-1.3.0.js': 'https://raw.githubusercontent.com/velesin/jasmine-jquery/1.3.0/lib/jasmine-jquery.js' + }, + clean: ['js/vendor/require.js', + 'js/vendor/jquery.js', + 'js/vendor/jquery.dataTables.js', + 'js/vendor/ace/ace.js', + 'js/vendor/backbone.js', + 'js/vendor/lodash.js', + 'js/vendor/jquery-ui.js', + 'js/vendor/jquery.jstree.js', + 'js/vendor/jquery.terminal.js', + 'js/vendor/ICanHaz.js', + 'js/vendor/twitter/typeahead.js', + 'js/vendor/URI/URI.js', + 'js/vendor/URI/punycode.js', + 'js/vendor/URI/IPv6.js', + 'js/vendor/URI/SecondLevelDomains.js', + 'js/vendor/jasmine-jquery-1.3.0.js' + ], + watch: { + files: '<%= lint.files %>', + tasks: 'default' + }, + jshint: { + options: { + curly: true, + eqeqeq: true, + immed: true, + latedef: true, + newcap: true, + noarg: true, + sub: true, + undef: true, + boss: true, + eqnull: true, + browser: true, + smarttabs: true, + devel:true, + expr: true, + globals: { + jQuery: true, + console: true, + require: true, + requirejs: true + } + }, + source_files: '<%= lint.files %>', + spec_files: { + options: { + jshintrc: 'spec/.jshintrc' + }, + files: { + src: '<%= spec.files %>' + } + } + }, + server: { + port: 9002 + }, + connect: { + sstudio: { + options: { + port: 9001, + hostname: "*", + keepalive: true + } + }, + test : { + port : 9002 + } + }, + selenium: { + options: { + startURL: 'http://localhost:9001/', + browsers: ['firefox'] + }, + suite: { + files: { + 'StackStudio': ['test/*.suite'] + } + } + }, + jasmine: { + test: { + options: { + specs: '<%= spec.files %>', + template: require('grunt-template-jasmine-requirejs'), + templateOptions: { + requireConfigFile: 'js/config/rjsConfig.js', + requireConfig: { + /* + The application requires the absense of protocol when loading + remote resources so it can work with http and https. + + Phantom however, does not do well with missing protocol when + executing unit tests. This inline config block is used to override, + via merge down, the default config set in rjsConfig.js above. + */ + shim: { + 'jasmine' : {exports: 'jasmine'}, + 'jquery-ui': { deps: ['jquery']}, + 'jasmine-jquery': {exports: 'jasmine'}, + 'jquery.multiselect': {deps: ['jquery']} + }, + paths: { + 'backbone' : 'http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min', + 'jquery' : 'http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min', + 'jquery-ui' : 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min', + 'jquery.form' : 'http://cdnjs.cloudflare.com/ajax/libs/jquery.form/3.45/jquery.form', + 'jquery.multiselect': 'http://cdn.jsdelivr.net/jquery.multiselect/1.13/jquery.multiselect.min', + 'jquery.jstree' : 'http://cdn.jsdelivr.net/jquery.jstree/pre1.0/jquery.jstree', + 'jquery-migrate' : 'http://code.jquery.com/jquery-migrate-1.1.0', + 'jasmine-jquery' : 'http://cloud.github.com/downloads/velesin/jasmine-jquery/jasmine-jquery-1.3.0', + 'underscore' : 'http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.1.0/lodash.min', + 'bootstrap' : 'https://netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min', + 'ace' : 'http://cdnjs.cloudflare.com/ajax/libs/ace/1.1.01/ace', + 'mode-json' : 'http://cdnjs.cloudflare.com/ajax/libs/ace/1.1.01/mode-json', + 'jquery.multiselect.filter': 'http://cdn.jsdelivr.net/jquery.multiselect/1.13/jquery.multiselect.filter.min' + }, + map: { + '*': { + /* Map any path used by a vendor or plugin here as neccessary */ + //'//code.jquery.com/jquery-migrate-1.1.0.js': 'jquery-migrate', + } + } } - } } - } } - }, - less: { - "2.0.0-rc1": { - options: { + } + }, + less: { + "2.0.0-rc1": { + options: { paths: ["css"], compress: true - }, - files: { + }, + files: { "css/main.css": "css/main.less", "css/jquery.dataTables.css": "css/jquery.dataTables.less", "css/jquery.terminal.css": "css/jquery.terminal.less", @@ -228,27 +212,27 @@ module.exports = function(grunt) { "css/jquery.multiselect.filter.css": "css/jquery.multiselect.filter.less", "css/jquery-ui.css": "css/jquery-ui.less", "css/morris.css": "css/morris.less" - } } - } - }); + } + } + }); - grunt.loadNpmTasks('grunt-contrib-jasmine'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-contrib-concat'); - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-less'); - grunt.loadNpmTasks('grunt-contrib-connect'); - grunt.loadNpmTasks('grunt-selenium'); - grunt.loadNpmTasks('grunt-curl'); - grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-jasmine'); + grunt.loadNpmTasks('grunt-contrib-jshint'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-less'); + grunt.loadNpmTasks('grunt-contrib-connect'); + grunt.loadNpmTasks('grunt-selenium'); + grunt.loadNpmTasks('grunt-curl'); + grunt.loadNpmTasks('grunt-contrib-clean'); - // Default task. - grunt.registerTask('test', ['jshint', 'less', 'curl', 'jasmine']); - grunt.registerTask('default', ['jshint', 'less', 'curl', 'jasmine']); - grunt.registerTask('run', ['jshint', 'less', 'curl', 'connect:sstudio', 'watch']); - grunt.registerTask('build', ['jshint', 'curl', 'jasmine', 'concat', 'uglify']); - grunt.registerTask('uncurl', ['clean']); + // Default task. + grunt.registerTask('test', ['jshint', 'less', 'curl', 'jasmine']); + grunt.registerTask('default', ['jshint', 'less', 'curl', 'jasmine']); + grunt.registerTask('run', ['jshint', 'less', 'curl', 'connect:sstudio', 'watch']); + grunt.registerTask('build', ['jshint', 'curl', 'jasmine', 'concat', 'uglify']); + grunt.registerTask('uncurl', ['clean']); }; diff --git a/README.md b/README.md index 644dd65c..2f11e906 100644 --- a/README.md +++ b/README.md @@ -42,10 +42,10 @@ Getting Started Copy backend.json.sample to backend.json ``` - cp backend.json.sample backend.json + cp config/backend.json.sample config/backend.json ``` - Edit backend.json @backend_endpoint@ field to point to your CloudMux backend. + Edit config/backend.json @backend_endpoint@ field to point to your CloudMux backend. (e.g. "http://localhost:9292") diff --git a/SpecRunner.html b/SpecRunner.html index 40298160..d3ed5979 100644 --- a/SpecRunner.html +++ b/SpecRunner.html @@ -5,10 +5,15 @@ Jasmine Test Runner - + + You can use something JSCover to check code coverage with this page. + E.g. run JSCover: + java -jar JSCover-all.jar -ws --document-root=. --port-dir=. + Load this page: + http://localhost:8080/jscoverage.html?SpecRunner.html
diff --git a/TESTING.md b/TESTING.md new file mode 100644 index 00000000..936b5be6 --- /dev/null +++ b/TESTING.md @@ -0,0 +1,7 @@ +# Testing StackStudio # + +This project uses [Jasmine](http://jasmine.github.io/1.3/introduction.html) as its testing framework. + +To run all of the tests with grunt: + + $ grunt test \ No newline at end of file diff --git a/build.xml b/build.xml index 963c9eb8..79612be1 100644 --- a/build.xml +++ b/build.xml @@ -109,7 +109,7 @@ - + diff --git a/backend.json.sample b/config/backend.json.sample similarity index 100% rename from backend.json.sample rename to config/backend.json.sample diff --git a/css/FeedEk.less b/css/FeedEk.less index af903599..15785890 100644 --- a/css/FeedEk.less +++ b/css/FeedEk.less @@ -32,3 +32,6 @@ .dashboard h1{ font-weight:bold; } +#getstarted { + display:none; +} diff --git a/css/account.management.less b/css/account.management.less index 5dc4c9be..b25ed617 100644 --- a/css/account.management.less +++ b/css/account.management.less @@ -18,7 +18,6 @@ label{ #credential_list{ min-height: 200px; } - div.fieldSet{ border: solid black thin; width: 500px; @@ -81,6 +80,30 @@ label.sub-field{ text-align: right; padding-right: 5px; } + +#home_container { + .input-group-addon { + min-width: 170px; + text-align: left; + } + + .input-group { + &:last-of-type { + margin-bottom: 20px; + } + } + +} + +.password-restrictions { + ul:empty { + display:none; + } +} +.password-restrictions-info { + margin-bottom: 0 !important; +} + input.sub-field{ float:left; margin-left: 50px; @@ -146,3 +169,5 @@ fieldset button{ #home_container { padding-bottom: 40px; } + + diff --git a/css/main.less b/css/main.less index 757cf504..46091a2a 100644 --- a/css/main.less +++ b/css/main.less @@ -37,6 +37,9 @@ @import "resource.reserved-instance.less"; @import "stacks.less"; +@import "tutorial.less"; +@import "ui-container.less"; +@import "treeView.less"; /* ========================================================================== Base styles: opinionated defaults @@ -152,6 +155,12 @@ textarea { padding: 5px; } +.modal { + .input-group, .btn-group { + margin-bottom: 5px; + } +} + /** Add content before footer, to ensure no real content is covered by fixed footer. */ #foooter:before { content: "&npsp;"; @@ -334,12 +343,14 @@ div.button_bar { } img, object, embed { -max-width: 100%; + max-width: 100%; } - img { height: auto; } +#account_login { + cursor: pointer; +} /* @@ -611,6 +622,18 @@ footer { color: #ffffff; } + +#error_modal { + .modal-dialog { + margin-top: 25%; + + .error-title { + color: red; + } + } + +} + /* Regular CSS files, imported via less to make 1 request. */ @import "jquery.dataTables.less"; @import "jquery.terminal.less"; diff --git a/css/opentip.less b/css/opentip.less new file mode 100644 index 00000000..94ee0ded --- /dev/null +++ b/css/opentip.less @@ -0,0 +1,278 @@ +.opentip-container, +.opentip-container * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.opentip-container { + position: absolute; + max-width: 300px; + z-index: 100; + -webkit-transition: -webkit-transform 1s ease-in-out; + -moz-transition: -moz-transform 1s ease-in-out; + -o-transition: -o-transform 1s ease-in-out; + -ms-transition: -ms-transform 1s ease-in-out; + transition: transform 1s ease-in-out; + pointer-events: none; + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -o-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); +} +.opentip-container.ot-fixed.ot-hidden.stem-top.stem-center, +.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-center, +.opentip-container.ot-fixed.ot-hiding.stem-top.stem-center { + -webkit-transform: translateY(-5px); + -moz-transform: translateY(-5px); + -o-transform: translateY(-5px); + -ms-transform: translateY(-5px); + transform: translateY(-5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-top.stem-right, +.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-right, +.opentip-container.ot-fixed.ot-hiding.stem-top.stem-right { + -webkit-transform: translateY(-5px) translateX(5px); + -moz-transform: translateY(-5px) translateX(5px); + -o-transform: translateY(-5px) translateX(5px); + -ms-transform: translateY(-5px) translateX(5px); + transform: translateY(-5px) translateX(5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-middle.stem-right, +.opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-right, +.opentip-container.ot-fixed.ot-hiding.stem-middle.stem-right { + -webkit-transform: translateX(5px); + -moz-transform: translateX(5px); + -o-transform: translateX(5px); + -ms-transform: translateX(5px); + transform: translateX(5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-right, +.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-right, +.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-right { + -webkit-transform: translateY(5px) translateX(5px); + -moz-transform: translateY(5px) translateX(5px); + -o-transform: translateY(5px) translateX(5px); + -ms-transform: translateY(5px) translateX(5px); + transform: translateY(5px) translateX(5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-center, +.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-center, +.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-center { + -webkit-transform: translateY(5px); + -moz-transform: translateY(5px); + -o-transform: translateY(5px); + -ms-transform: translateY(5px); + transform: translateY(5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-bottom.stem-left, +.opentip-container.ot-fixed.ot-going-to-show.stem-bottom.stem-left, +.opentip-container.ot-fixed.ot-hiding.stem-bottom.stem-left { + -webkit-transform: translateY(5px) translateX(-5px); + -moz-transform: translateY(5px) translateX(-5px); + -o-transform: translateY(5px) translateX(-5px); + -ms-transform: translateY(5px) translateX(-5px); + transform: translateY(5px) translateX(-5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-middle.stem-left, +.opentip-container.ot-fixed.ot-going-to-show.stem-middle.stem-left, +.opentip-container.ot-fixed.ot-hiding.stem-middle.stem-left { + -webkit-transform: translateX(-5px); + -moz-transform: translateX(-5px); + -o-transform: translateX(-5px); + -ms-transform: translateX(-5px); + transform: translateX(-5px); +} +.opentip-container.ot-fixed.ot-hidden.stem-top.stem-left, +.opentip-container.ot-fixed.ot-going-to-show.stem-top.stem-left, +.opentip-container.ot-fixed.ot-hiding.stem-top.stem-left { + -webkit-transform: translateY(-5px) translateX(-5px); + -moz-transform: translateY(-5px) translateX(-5px); + -o-transform: translateY(-5px) translateX(-5px); + -ms-transform: translateY(-5px) translateX(-5px); + transform: translateY(-5px) translateX(-5px); +} +.opentip-container.ot-fixed .opentip { + pointer-events: auto; +} +.opentip-container.ot-hidden { + display: none; +} +.opentip-container .opentip { + position: relative; + font-size: 13px; + line-height: 120%; + padding: 9px 14px; + color: #4f4b47; + text-shadow: -1px -1px 0px rgba(255,255,255,0.2); +} +.opentip-container .opentip .header { + margin: 0; + padding: 0; +} +.opentip-container .opentip .ot-close { + pointer-events: auto; + display: block; + position: absolute; + top: -12px; + left: 60px; + color: rgba(0,0,0,0.5); + background: rgba(0,0,0,0); + text-decoration: none; +} +.opentip-container .opentip .ot-close span { + display: none; +} +.opentip-container .opentip .ot-loading-indicator { + display: none; +} +.opentip-container.ot-loading .ot-loading-indicator { + width: 30px; + height: 30px; + font-size: 30px; + line-height: 30px; + font-weight: bold; + display: block; +} +.opentip-container.ot-loading .ot-loading-indicator span { + display: block; + -webkit-animation: otloading 2s linear infinite; + -moz-animation: otloading 2s linear infinite; + -o-animation: otloading 2s linear infinite; + -ms-animation: otloading 2s linear infinite; + animation: otloading 2s linear infinite; + text-align: center; +} +.opentip-container.style-dark .opentip, +.opentip-container.style-alert .opentip { + color: #f8f8f8; + text-shadow: 1px 1px 0px rgba(0,0,0,0.2); +} +.opentip-container.style-glass .opentip { + padding: 15px 25px; + color: #317cc5; + text-shadow: 1px 1px 8px rgba(0,94,153,0.3); +} +.opentip-container.ot-hide-effect-fade { + -webkit-transition: -webkit-transform 0.5s ease-in-out, opacity 1s ease-in-out; + -moz-transition: -moz-transform 0.5s ease-in-out, opacity 1s ease-in-out; + -o-transition: -o-transform 0.5s ease-in-out, opacity 1s ease-in-out; + -ms-transition: -ms-transform 0.5s ease-in-out, opacity 1s ease-in-out; + transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; + opacity: 1; + -ms-filter: none; + filter: none; +} +.opentip-container.ot-hide-effect-fade.ot-hiding { + opacity: 0; + filter: alpha(opacity=0); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; +} +.opentip-container.ot-show-effect-appear.ot-going-to-show, +.opentip-container.ot-show-effect-appear.ot-showing { + -webkit-transition: -webkit-transform 0.5s ease-in-out, opacity 1s ease-in-out; + -moz-transition: -moz-transform 0.5s ease-in-out, opacity 1s ease-in-out; + -o-transition: -o-transform 0.5s ease-in-out, opacity 1s ease-in-out; + -ms-transition: -ms-transform 0.5s ease-in-out, opacity 1s ease-in-out; + transition: transform 0.5s ease-in-out, opacity 1s ease-in-out; +} +.opentip-container.ot-show-effect-appear.ot-going-to-show { + opacity: 0; + filter: alpha(opacity=0); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; +} +.opentip-container.ot-show-effect-appear.ot-showing { + opacity: 1; + -ms-filter: none; + filter: none; +} +.opentip-container.ot-show-effect-appear.ot-visible { + opacity: 1; + -ms-filter: none; + filter: none; +} +@-moz-keyframes otloading { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-webkit-keyframes otloading { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-o-keyframes otloading { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-ms-keyframes otloading { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes otloading { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/css/resourceApp.less b/css/resourceApp.less index ddb73b4e..b8ea4216 100644 --- a/css/resourceApp.less +++ b/css/resourceApp.less @@ -26,10 +26,56 @@ border-collapse:inherit; } +.panel-body { + padding: 0; + padding-top: 15px; + + .nav-tabs { + li:first-of-type { + margin-left: 15px; + } + } +} + +dl.dl-horizontal { + width: 100%; + min-width: 400px; + max-width: 1200px; + margin: 1em 0; + padding: 0; + margin-top: 0; + border: 1px solid #cccccc; + + dt, dd { + border-top: 1px solid #cccccc; + margin-top: -1px; + padding-top: 5px; + padding-bottom: 5px; + } + + dt { + margin-top: -1px; + border-top: 1px solid #cccccc; + border-right: 1px solid #cccccc; + padding-left: 10px; + text-align: left; + } + + dd { + border-left: 1px solid #cccccc; + margin-left: 159px; + padding-left: 20px; + } +} + .resource_link { padding-left:2px; } +.panel .tab-content { + padding: 20px; +} + #native_service_label { -webkit-transform-origin: 200% 200%; -webkit-transform: rotate(-90deg); /* Safari Chrome */ @@ -54,6 +100,15 @@ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); /* Internet Explorer */ } +#modal-placeholder .modal-dialog { + margin-top: 25%; + + .tab-pane { + padding: 20px; + padding-top: 10px; + } +} + .service_group_label { width:15px; text-align:center; @@ -161,6 +216,9 @@ #service_menu { float:left; margin-top:5px; + width: 20%; + min-width: 150px; + max-width: 300px; } #subservice_menu { @@ -219,16 +277,20 @@ li.subservice { .detail_panel { padding-bottom:20px; + + label { + min-width: 50px; + } + + tr { + padding: 10px 0px; + } } .spec_select{ float:left; } -.cloud_spec_select{ - height: 20px; -} - #native_services_table{ width:90%; margin-right:25px; diff --git a/css/treeView.less b/css/treeView.less new file mode 100644 index 00000000..c62ed379 --- /dev/null +++ b/css/treeView.less @@ -0,0 +1,15 @@ +.maple-wrapper { + + float: left; + width: 25%; + min-width: 200px; + max-width: 300px; + overflow-x: auto; +} + +.tree-subview { + float: left; + width: 75%; + max-width: 75%; + padding-left: 30px; +} \ No newline at end of file diff --git a/css/tutorial.less b/css/tutorial.less new file mode 100644 index 00000000..ec27f96d --- /dev/null +++ b/css/tutorial.less @@ -0,0 +1,172 @@ +.instructor { + position: fixed; + z-index: 100000; + background-color: #fff; + box-shadow: 0px -2px 10px #2e2e2e; + bottom: 35px; + left: 0; + right: 0; + margin: auto; + width: 95%; + max-width: 95%; + height: auto !important; + + -webkit-transition: -webkit-transform 1s ease-in; /* Changed here */ + -moz-transition: -moz-transform 1s ease-in; + -o-transition: -o-transform 1s ease-in; + transition: transform 1s ease-in; + + &.hiding { + -webkit-transform: translateY(500px); + -moz-transform: translateY(500px); + -ms-transform: translateY(500px); + -o-transform: translateY(500px); + transform: translateY(500px); + } + + &.minimized { + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -ms-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; + + .toggle-tutorial { + -webkit-transform: scale(1.5, 1.5) !important; + -moz-transform: scale(1.5, 1.5) !important; + -ms-transform: scale(1.5, 1.5) !important; + -o-transform: scale(1.5, 1.5) !important; + transform: scale(1.5, 1.5) !important; + + line-height: 1 !important; + + &:hover { + -webkit-transform: scale(2, 2) !important; + -moz-transform: scale(2, 2) !important; + -ms-transform: scale(2, 2) !important; + -o-transform: scale(2, 2) !important; + transform: scale(2, 2) !important; + } + } + } + + &.minimized-tab { + right: 2.5% !important; + left: auto !important; + max-width: 300px !important; + } + + .panel-heading { + position: relative; + + .panel-title { + font-size: 3rem !important; + } + + .tutorial-menu-actions { + + position: absolute; + top: 0; + bottom: 0; + right: 0.3em; + display: block; + margin: auto; + height: 25px; + + // &:hover { + // background-image: none !important; + // } + + .close-tutorial-button, .toggle-tutorial { + height: 17px; + width: 17px; + + position: absolute; + top: 0; + bottom: 0; + margin: auto; + display: block; + + border-radius: 5px; + text-align: center; + } + + .close-tutorial-button { + right: 0; + + -webkit-transform: scale(1.5, 1.5); + -moz-transform: scale(1.5, 1.5); + -ms-transform: scale(1.5, 1.5); + -o-transform: scale(1.5, 1.5); + transform: scale(1.5, 1.5); + + &:hover { + -webkit-transform: scale(2.0, 2.0); + -moz-transform: scale(2.0, 2.0); + -ms-transform: scale(2.0, 2.0); + -o-transform: scale(2.0, 2.0); + transform: scale(2.0, 2.0); + } + } + + .toggle-tutorial { + right: 25px; + font-size: 17px; + height: 17px; + line-height: 0.85; + color: #000; + font-weight: bold; + + -webkit-transform: scale(1, 2); + -moz-transform: scale(1, 2); + -ms-transform: scale(1, 2); + -o-transform: scale(1, 2); + transform: scale(1, 2); + + &:hover { + -webkit-transform: scale(1.25, 2.25); + -moz-transform: scale(1.25, 2.25); + -ms-transform: scale(1.25, 2.25); + -o-transform: scale(1.25, 2.25); + transform: scale(1.25, 2.25); + } + } + } + + } + + .panel-body { + font-size: 2rem !important; + max-height: 500px; + transition: all 0.2s linear, padding 0; + + &.minimized { + overflow: hidden !important; + padding-top: 0px !important; + padding-bottom: 0px !important; + max-height: 0px !important; + } + } + + .instructor-step-label { + + a { + font-size: 2rem; + } + + .completed-icon { + visibility: hidden; + display:inline-block; + height: 100%; + font-size: 30px; + color: green; + padding-left: 10px; + } + + &.completed { + .completed-icon { + visibility: visible; + } + } + } +} \ No newline at end of file diff --git a/css/ui-container.less b/css/ui-container.less new file mode 100644 index 00000000..7dee770a --- /dev/null +++ b/css/ui-container.less @@ -0,0 +1,13 @@ +@main-bg-color: #f2f2f2; + +.purple-ui-header { + border-bottom-style:none; + background:#4a2e83 url(/images/jqueryUI/ui-bg_highlight-soft_65_4A2E83_1x100.png) 50% 50% repeat-x; + color: #ffffff; + text-align: center; + box-shadow: 0 0 5px #888; +} + +.ui-content-area { + background-color: @main-bg-color; +} \ No newline at end of file diff --git a/images/CloudLogos/vmware.jpg b/images/CloudLogos/vmware.jpg new file mode 100644 index 00000000..e8ace45f Binary files /dev/null and b/images/CloudLogos/vmware.jpg differ diff --git a/images/CloudLogos/vmware.png b/images/CloudLogos/vmware.png new file mode 100644 index 00000000..becac785 Binary files /dev/null and b/images/CloudLogos/vmware.png differ diff --git a/images/IconPNGs/__MACOSX/._16ClosedArrow.png b/images/IconPNGs/__MACOSX/._16ClosedArrow.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16ClosedArrow.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16ClosedFolder.png b/images/IconPNGs/__MACOSX/._16ClosedFolder.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16ClosedFolder.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16Copy.png b/images/IconPNGs/__MACOSX/._16Copy.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16Copy.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16CopyDisabled.png b/images/IconPNGs/__MACOSX/._16CopyDisabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16CopyDisabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16DRCloud.png b/images/IconPNGs/__MACOSX/._16DRCloud.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16DRCloud.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16DRCloudDisabled.png b/images/IconPNGs/__MACOSX/._16DRCloudDisabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16DRCloudDisabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16File.png b/images/IconPNGs/__MACOSX/._16File.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16File.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16Group.png b/images/IconPNGs/__MACOSX/._16Group.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16Group.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16GroupDisabled.png b/images/IconPNGs/__MACOSX/._16GroupDisabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16GroupDisabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16Link.png b/images/IconPNGs/__MACOSX/._16Link.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16Link.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16LinkDisabled.png b/images/IconPNGs/__MACOSX/._16LinkDisabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16LinkDisabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16NetworkSettings.png b/images/IconPNGs/__MACOSX/._16NetworkSettings.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16NetworkSettings.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16NetworkSettingsDisabled.png b/images/IconPNGs/__MACOSX/._16NetworkSettingsDisabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16NetworkSettingsDisabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16OpenArrow.png b/images/IconPNGs/__MACOSX/._16OpenArrow.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16OpenArrow.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16OpenFolder.png b/images/IconPNGs/__MACOSX/._16OpenFolder.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16OpenFolder.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16Paste.png b/images/IconPNGs/__MACOSX/._16Paste.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16Paste.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16PasteDisabled.png b/images/IconPNGs/__MACOSX/._16PasteDisabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16PasteDisabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16Promote.png b/images/IconPNGs/__MACOSX/._16Promote.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16Promote.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16PromoteDisabled.png b/images/IconPNGs/__MACOSX/._16PromoteDisabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16PromoteDisabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16Provision.png b/images/IconPNGs/__MACOSX/._16Provision.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16Provision.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16ProvisionDisabled.png b/images/IconPNGs/__MACOSX/._16ProvisionDisabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16ProvisionDisabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16Text.png b/images/IconPNGs/__MACOSX/._16Text.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16Text.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16TextDisabled.png b/images/IconPNGs/__MACOSX/._16TextDisabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16TextDisabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16Timer.png b/images/IconPNGs/__MACOSX/._16Timer.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16Timer.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16TimerDisabled.png b/images/IconPNGs/__MACOSX/._16TimerDisabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16TimerDisabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16Ungroup.png b/images/IconPNGs/__MACOSX/._16Ungroup.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16Ungroup.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._16UngroupDisabled.png b/images/IconPNGs/__MACOSX/._16UngroupDisabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._16UngroupDisabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._Autorestart.png b/images/IconPNGs/__MACOSX/._Autorestart.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._Autorestart.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._Autoscale.png b/images/IconPNGs/__MACOSX/._Autoscale.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._Autoscale.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._DeletionPolicyWizard.png b/images/IconPNGs/__MACOSX/._DeletionPolicyWizard.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._DeletionPolicyWizard.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._DeletionPolicyWizard_Disabled.png b/images/IconPNGs/__MACOSX/._DeletionPolicyWizard_Disabled.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._DeletionPolicyWizard_Disabled.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._HotStandby.png b/images/IconPNGs/__MACOSX/._HotStandby.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._HotStandby.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._IdentityAccessMngmt_Config.png b/images/IconPNGs/__MACOSX/._IdentityAccessMngmt_Config.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._IdentityAccessMngmt_Config.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBasicServer.png b/images/IconPNGs/__MACOSX/._NewBasicServer.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBasicServer.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBasicServerConfigured.png b/images/IconPNGs/__MACOSX/._NewBasicServerConfigured.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBasicServerConfigured.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBeanstalk.png b/images/IconPNGs/__MACOSX/._NewBeanstalk.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBeanstalk.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBeanstalkConfigured.png b/images/IconPNGs/__MACOSX/._NewBeanstalkConfigured.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBeanstalkConfigured.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBeanstalkLaunch.png b/images/IconPNGs/__MACOSX/._NewBeanstalkLaunch.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBeanstalkLaunch.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBeanstalkLaunchFailed.png b/images/IconPNGs/__MACOSX/._NewBeanstalkLaunchFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBeanstalkLaunchFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBeanstalkRestart.png b/images/IconPNGs/__MACOSX/._NewBeanstalkRestart.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBeanstalkRestart.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBeanstalkRun.png b/images/IconPNGs/__MACOSX/._NewBeanstalkRun.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBeanstalkRun.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBeanstalkStop.png b/images/IconPNGs/__MACOSX/._NewBeanstalkStop.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBeanstalkStop.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBeanstalkStopFailed.png b/images/IconPNGs/__MACOSX/._NewBeanstalkStopFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBeanstalkStopFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBeanstalkTerminate.png b/images/IconPNGs/__MACOSX/._NewBeanstalkTerminate.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBeanstalkTerminate.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewBeanstalkTerminateFailed.png b/images/IconPNGs/__MACOSX/._NewBeanstalkTerminateFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewBeanstalkTerminateFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewDB.png b/images/IconPNGs/__MACOSX/._NewDB.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewDB.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewDBConfigured.png b/images/IconPNGs/__MACOSX/._NewDBConfigured.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewDBConfigured.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewDBLaunch.png b/images/IconPNGs/__MACOSX/._NewDBLaunch.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewDBLaunch.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewDBLaunchFailed.png b/images/IconPNGs/__MACOSX/._NewDBLaunchFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewDBLaunchFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewDBRestart.png b/images/IconPNGs/__MACOSX/._NewDBRestart.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewDBRestart.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewDBRun.png b/images/IconPNGs/__MACOSX/._NewDBRun.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewDBRun.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewDBStop.png b/images/IconPNGs/__MACOSX/._NewDBStop.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewDBStop.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewDBStopFailed.png b/images/IconPNGs/__MACOSX/._NewDBStopFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewDBStopFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewDBTerminate.png b/images/IconPNGs/__MACOSX/._NewDBTerminate.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewDBTerminate.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewDBTerminateFailed.png b/images/IconPNGs/__MACOSX/._NewDBTerminateFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewDBTerminateFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewLB.png b/images/IconPNGs/__MACOSX/._NewLB.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewLB.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewLBConfigured.png b/images/IconPNGs/__MACOSX/._NewLBConfigured.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewLBConfigured.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewLBLaunch.png b/images/IconPNGs/__MACOSX/._NewLBLaunch.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewLBLaunch.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewLBLaunchFailed.png b/images/IconPNGs/__MACOSX/._NewLBLaunchFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewLBLaunchFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewLBRestart.png b/images/IconPNGs/__MACOSX/._NewLBRestart.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewLBRestart.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewLBRun.png b/images/IconPNGs/__MACOSX/._NewLBRun.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewLBRun.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewLBStop.png b/images/IconPNGs/__MACOSX/._NewLBStop.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewLBStop.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewLBStopFailed.png b/images/IconPNGs/__MACOSX/._NewLBStopFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewLBStopFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewLBTerminate.png b/images/IconPNGs/__MACOSX/._NewLBTerminate.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewLBTerminate.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewLBTerminateFailed.png b/images/IconPNGs/__MACOSX/._NewLBTerminateFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewLBTerminateFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewMessage.png b/images/IconPNGs/__MACOSX/._NewMessage.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewMessage.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewMessageConfigured.png b/images/IconPNGs/__MACOSX/._NewMessageConfigured.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewMessageConfigured.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewMessageLaunch.png b/images/IconPNGs/__MACOSX/._NewMessageLaunch.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewMessageLaunch.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewMessageLaunchFailed.png b/images/IconPNGs/__MACOSX/._NewMessageLaunchFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewMessageLaunchFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewMessageRestart.png b/images/IconPNGs/__MACOSX/._NewMessageRestart.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewMessageRestart.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewMessageRun.png b/images/IconPNGs/__MACOSX/._NewMessageRun.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewMessageRun.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewMessageStop.png b/images/IconPNGs/__MACOSX/._NewMessageStop.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewMessageStop.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewMessageStopFailed.png b/images/IconPNGs/__MACOSX/._NewMessageStopFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewMessageStopFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewMessageTerminate.png b/images/IconPNGs/__MACOSX/._NewMessageTerminate.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewMessageTerminate.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewMessageTerminateFailed.png b/images/IconPNGs/__MACOSX/._NewMessageTerminateFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewMessageTerminateFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewServerLaunch.png b/images/IconPNGs/__MACOSX/._NewServerLaunch.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewServerLaunch.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewServerLaunchFailed.png b/images/IconPNGs/__MACOSX/._NewServerLaunchFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewServerLaunchFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewServerRestart.png b/images/IconPNGs/__MACOSX/._NewServerRestart.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewServerRestart.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewServerRun.png b/images/IconPNGs/__MACOSX/._NewServerRun.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewServerRun.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewServerStop.png b/images/IconPNGs/__MACOSX/._NewServerStop.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewServerStop.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewServerStopFailed.png b/images/IconPNGs/__MACOSX/._NewServerStopFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewServerStopFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewServerTerminate.png b/images/IconPNGs/__MACOSX/._NewServerTerminate.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewServerTerminate.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewServerTerminateFailed.png b/images/IconPNGs/__MACOSX/._NewServerTerminateFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewServerTerminateFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewSimpleStorage.png b/images/IconPNGs/__MACOSX/._NewSimpleStorage.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewSimpleStorage.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewSimpleStorageConfigured.png b/images/IconPNGs/__MACOSX/._NewSimpleStorageConfigured.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewSimpleStorageConfigured.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewSimpleStorageLaunch.png b/images/IconPNGs/__MACOSX/._NewSimpleStorageLaunch.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewSimpleStorageLaunch.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewSimpleStorageLaunchFailed.png b/images/IconPNGs/__MACOSX/._NewSimpleStorageLaunchFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewSimpleStorageLaunchFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewSimpleStorageRestart.png b/images/IconPNGs/__MACOSX/._NewSimpleStorageRestart.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewSimpleStorageRestart.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewSimpleStorageRun.png b/images/IconPNGs/__MACOSX/._NewSimpleStorageRun.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewSimpleStorageRun.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewSimpleStorageStop.png b/images/IconPNGs/__MACOSX/._NewSimpleStorageStop.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewSimpleStorageStop.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewSimpleStorageStopFailed.png b/images/IconPNGs/__MACOSX/._NewSimpleStorageStopFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewSimpleStorageStopFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewSimpleStorageTerminate.png b/images/IconPNGs/__MACOSX/._NewSimpleStorageTerminate.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewSimpleStorageTerminate.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewSimpleStorageTerminateFailed.png b/images/IconPNGs/__MACOSX/._NewSimpleStorageTerminateFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewSimpleStorageTerminateFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewVolume.png b/images/IconPNGs/__MACOSX/._NewVolume.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewVolume.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewVolumeConfigured.png b/images/IconPNGs/__MACOSX/._NewVolumeConfigured.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewVolumeConfigured.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewVolumeLaunch.png b/images/IconPNGs/__MACOSX/._NewVolumeLaunch.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewVolumeLaunch.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewVolumeLaunchFailed.png b/images/IconPNGs/__MACOSX/._NewVolumeLaunchFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewVolumeLaunchFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewVolumeRestart.png b/images/IconPNGs/__MACOSX/._NewVolumeRestart.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewVolumeRestart.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewVolumeRun.png b/images/IconPNGs/__MACOSX/._NewVolumeRun.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewVolumeRun.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewVolumeStop.png b/images/IconPNGs/__MACOSX/._NewVolumeStop.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewVolumeStop.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewVolumeStopFailed.png b/images/IconPNGs/__MACOSX/._NewVolumeStopFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewVolumeStopFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewVolumeTerminate.png b/images/IconPNGs/__MACOSX/._NewVolumeTerminate.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewVolumeTerminate.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._NewVolumeTerminateFailed.png b/images/IconPNGs/__MACOSX/._NewVolumeTerminateFailed.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._NewVolumeTerminateFailed.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._ResourcePolicy.png b/images/IconPNGs/__MACOSX/._ResourcePolicy.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._ResourcePolicy.png and /dev/null differ diff --git a/images/IconPNGs/__MACOSX/._ResourcePolicy_Configured.png b/images/IconPNGs/__MACOSX/._ResourcePolicy_Configured.png deleted file mode 100644 index 67b08cf3..00000000 Binary files a/images/IconPNGs/__MACOSX/._ResourcePolicy_Configured.png and /dev/null differ diff --git a/images/grey.png b/images/grey.png new file mode 100644 index 00000000..f0fdf46b Binary files /dev/null and b/images/grey.png differ diff --git a/images/storm.png b/images/storm.png new file mode 100644 index 00000000..0effc111 Binary files /dev/null and b/images/storm.png differ diff --git a/images/sun.png b/images/sun.png new file mode 100644 index 00000000..13528d91 Binary files /dev/null and b/images/sun.png differ diff --git a/index.html b/index.html index 1a43f23c..5a179f70 100644 --- a/index.html +++ b/index.html @@ -1,7 +1,8 @@ - + + StackStudio @@ -15,6 +16,7 @@ + + +
@@ -55,7 +73,8 @@ -
+ @@ -113,6 +132,9 @@
+ +
+

@@ -143,13 +165,18 @@ var target = document.getElementById('loading_content'); var spinner = new Spinner(opts).spin(target); - + + + + - +

diff --git a/js/SpecRunner.js b/js/SpecRunner.js deleted file mode 100644 index 428c4d98..00000000 --- a/js/SpecRunner.js +++ /dev/null @@ -1,54 +0,0 @@ -/*! - * StackStudio 2.0.0-rc.1 - * (c) 2012 Transcend Computing - * Available under ASL2 license - */ -BASE_URL = 'js/vendor'; - -EXTRA_PATHS = {}; - -// Add the following to allow tests to force a reload of JS every time. -var URL_ARGS = 'cb=' + Math.random(); - -require(['./common'], function (common) { - require({ - paths: { - 'jasmine-html': 'jasmine-1.3.1/jasmine-html', - 'jasmine': 'jasmine-1.3.1/jasmine' - }, - shim: { - jasmine: { - exports: 'jasmine' - }, - 'jasmine-html': { - deps: ['jasmine'], - exports: 'jasmine' - } - - } - }, - ['underscore', 'jquery', 'jasmine-html'], function(_, $, jasmine){ - var jasmineEnv = jasmine.getEnv(); - jasmineEnv.updateInterval = 1000; - - var trivialReporter = new jasmine.TrivialReporter(); - - jasmineEnv.addReporter(trivialReporter); - - jasmineEnv.specFilter = function(spec) { - return trivialReporter.specFilter(spec); - }; - - var specs = []; - - specs.push('../../spec/console'); - - $(function(){ - require(specs, function(){ - jasmineEnv.execute(); - }); - }); - - }); -}); - diff --git a/js/aws/collections/autoscale/awsAutoscaleGroups.js b/js/aws/collections/autoscale/awsAutoscaleGroups.js index 76fec17b..bf19ff3b 100644 --- a/js/aws/collections/autoscale/awsAutoscaleGroups.js +++ b/js/aws/collections/autoscale/awsAutoscaleGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/autoscale/awsAutoscaleGroup.js', + 'aws/models/autoscale/awsAutoscaleGroup', 'common' ], function( $, Backbone, AutoscaleGroup, Common ) { 'use strict'; diff --git a/js/aws/collections/beanstalk/awsApplications.js b/js/aws/collections/beanstalk/awsApplications.js index b1062d72..482fd41a 100644 --- a/js/aws/collections/beanstalk/awsApplications.js +++ b/js/aws/collections/beanstalk/awsApplications.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/beanstalk/awsApplication.js', + 'aws/models/beanstalk/awsApplication', 'common' ], function( $, Backbone, Application, Common ) { 'use strict'; diff --git a/js/aws/collections/block_storage/awsSnapshots.js b/js/aws/collections/block_storage/awsSnapshots.js index 68d6ce01..e47970c9 100644 --- a/js/aws/collections/block_storage/awsSnapshots.js +++ b/js/aws/collections/block_storage/awsSnapshots.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/block_storage/awsSnapshot.js', + 'aws/models/block_storage/awsSnapshot', 'common' ], function( $, Backbone, Snapshot, Common ) { 'use strict'; diff --git a/js/aws/collections/block_storage/awsVolumes.js b/js/aws/collections/block_storage/awsVolumes.js index ae89fd6e..454ac508 100644 --- a/js/aws/collections/block_storage/awsVolumes.js +++ b/js/aws/collections/block_storage/awsVolumes.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/block_storage/awsVolume.js', + 'aws/models/block_storage/awsVolume', 'common' ], function( $, Backbone, Volume, Common ) { 'use strict'; diff --git a/js/aws/collections/cache/awsCacheClusters.js b/js/aws/collections/cache/awsCacheClusters.js index 8e4c459c..7b18056e 100644 --- a/js/aws/collections/cache/awsCacheClusters.js +++ b/js/aws/collections/cache/awsCacheClusters.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/cache/awsCacheCluster.js', + 'aws/models/cache/awsCacheCluster', 'common' ], function( $, Backbone, CacheCluster, Common ) { 'use strict'; diff --git a/js/aws/collections/cache/awsCacheParameterGroups.js b/js/aws/collections/cache/awsCacheParameterGroups.js index 72fe359d..77a8fcb8 100644 --- a/js/aws/collections/cache/awsCacheParameterGroups.js +++ b/js/aws/collections/cache/awsCacheParameterGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/cache/awsCacheParameterGroup.js', + 'aws/models/cache/awsCacheParameterGroup', 'common' ], function( $, Backbone, CacheParameterGroup, Common ) { 'use strict'; diff --git a/js/aws/collections/cache/awsCacheSecurityGroups.js b/js/aws/collections/cache/awsCacheSecurityGroups.js index 8000ae04..3d732810 100644 --- a/js/aws/collections/cache/awsCacheSecurityGroups.js +++ b/js/aws/collections/cache/awsCacheSecurityGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/cache/awsCacheSecurityGroup.js', + 'aws/models/cache/awsCacheSecurityGroup', 'common' ], function( $, Backbone, CacheSecurityGroup, Common ) { 'use strict'; diff --git a/js/aws/collections/cloud_formation/awsStacks.js b/js/aws/collections/cloud_formation/awsStacks.js index 0f47beee..a8877692 100644 --- a/js/aws/collections/cloud_formation/awsStacks.js +++ b/js/aws/collections/cloud_formation/awsStacks.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/cloud_formation/awsStack.js', + 'aws/models/cloud_formation/awsStack', 'common' ], function( $, Backbone, Stack, Common ) { 'use strict'; diff --git a/js/aws/collections/cloud_watch/awsAlarms.js b/js/aws/collections/cloud_watch/awsAlarms.js index 3b173573..6bac01d1 100644 --- a/js/aws/collections/cloud_watch/awsAlarms.js +++ b/js/aws/collections/cloud_watch/awsAlarms.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/cloud_watch/awsAlarm.js', + 'aws/models/cloud_watch/awsAlarm', 'common' ], function( $, Backbone, Alarm, Common ) { 'use strict'; diff --git a/js/aws/collections/cloud_watch/awsMetricStatistics.js b/js/aws/collections/cloud_watch/awsMetricStatistics.js index ceccaea0..cd929a2a 100644 --- a/js/aws/collections/cloud_watch/awsMetricStatistics.js +++ b/js/aws/collections/cloud_watch/awsMetricStatistics.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/cloud_watch/awsMetricStatistic.js', + 'aws/models/cloud_watch/awsMetricStatistic', 'common' ], function( $, Backbone, MetricStatistic, Common ) { 'use strict'; diff --git a/js/aws/collections/cloud_watch/awsMetrics.js b/js/aws/collections/cloud_watch/awsMetrics.js index d6afd6ed..c51bced6 100644 --- a/js/aws/collections/cloud_watch/awsMetrics.js +++ b/js/aws/collections/cloud_watch/awsMetrics.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/cloud_watch/awsMetric.js', + 'aws/models/cloud_watch/awsMetric', 'common' ], function( $, Backbone, Metric, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsAvailabilityZones.js b/js/aws/collections/compute/awsAvailabilityZones.js index f7aa8f6c..4d66768f 100644 --- a/js/aws/collections/compute/awsAvailabilityZones.js +++ b/js/aws/collections/compute/awsAvailabilityZones.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsAvailabilityZone.js', + 'aws/models/compute/awsAvailabilityZone', 'common' ], function( $, Backbone, AvailabilityZone, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsDefaultImages.js b/js/aws/collections/compute/awsDefaultImages.js index 6be41e08..b191e1a0 100644 --- a/js/aws/collections/compute/awsDefaultImages.js +++ b/js/aws/collections/compute/awsDefaultImages.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsImage.js', + 'aws/models/compute/awsImage', 'common' ], function( $, Backbone, Image, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsElasticIPs.js b/js/aws/collections/compute/awsElasticIPs.js index b5de2b54..fb2487ae 100644 --- a/js/aws/collections/compute/awsElasticIPs.js +++ b/js/aws/collections/compute/awsElasticIPs.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsElasticIP.js', + 'aws/models/compute/awsElasticIP', 'common' ], function( $, Backbone, ElasticIP, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsFlavors.js b/js/aws/collections/compute/awsFlavors.js index 60623cb2..76507520 100644 --- a/js/aws/collections/compute/awsFlavors.js +++ b/js/aws/collections/compute/awsFlavors.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsFlavor.js', + 'aws/models/compute/awsFlavor', 'common' ], function( $, Backbone, Flavor, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsImages.js b/js/aws/collections/compute/awsImages.js index cdea4a82..83c08ac0 100644 --- a/js/aws/collections/compute/awsImages.js +++ b/js/aws/collections/compute/awsImages.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsImage.js', + 'aws/models/compute/awsImage', 'common' ], function( $, Backbone, Image, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsInstances.js b/js/aws/collections/compute/awsInstances.js index 0832f8df..3b67d46a 100644 --- a/js/aws/collections/compute/awsInstances.js +++ b/js/aws/collections/compute/awsInstances.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsInstance.js', + 'aws/models/compute/awsInstance', 'common' ], function( $, Backbone, Instance, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsKeyPairs.js b/js/aws/collections/compute/awsKeyPairs.js index febf590c..d1a6cf24 100644 --- a/js/aws/collections/compute/awsKeyPairs.js +++ b/js/aws/collections/compute/awsKeyPairs.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsKeyPair.js', + 'aws/models/compute/awsKeyPair', 'common' ], function( $, Backbone, KeyPair, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsReservedInstances.js b/js/aws/collections/compute/awsReservedInstances.js index fee4892a..3bdd00d4 100644 --- a/js/aws/collections/compute/awsReservedInstances.js +++ b/js/aws/collections/compute/awsReservedInstances.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsReservedInstance.js', + 'aws/models/compute/awsReservedInstance', 'common' ], function( $, Backbone, ReservedInstance, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsReservedInstancesOfferings.js b/js/aws/collections/compute/awsReservedInstancesOfferings.js index e0fe66e4..b5e01390 100644 --- a/js/aws/collections/compute/awsReservedInstancesOfferings.js +++ b/js/aws/collections/compute/awsReservedInstancesOfferings.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsReservedInstancesOffering.js', + 'aws/models/compute/awsReservedInstancesOffering', 'common' ], function( $, Backbone, ReservedInstancesOffering, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsSecurityGroups.js b/js/aws/collections/compute/awsSecurityGroups.js index 08b4e4d8..af3ffa8e 100644 --- a/js/aws/collections/compute/awsSecurityGroups.js +++ b/js/aws/collections/compute/awsSecurityGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsSecurityGroup.js', + 'aws/models/compute/awsSecurityGroup', 'common' ], function( $, Backbone, SecurityGroup, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsSpotInstanceRequests.js b/js/aws/collections/compute/awsSpotInstanceRequests.js index abf7daea..f3557d12 100644 --- a/js/aws/collections/compute/awsSpotInstanceRequests.js +++ b/js/aws/collections/compute/awsSpotInstanceRequests.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsSpotInstanceRequest.js', + 'aws/models/compute/awsSpotInstanceRequest', 'common' ], function( $, Backbone, SpotInstance, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsSpotPrices.js b/js/aws/collections/compute/awsSpotPrices.js index ceaa558d..fdfa8bd1 100644 --- a/js/aws/collections/compute/awsSpotPrices.js +++ b/js/aws/collections/compute/awsSpotPrices.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsSpotPrice.js', + 'aws/models/compute/awsSpotPrice', 'common' ], function( $, Backbone, SpotPrice, Common ) { 'use strict'; diff --git a/js/aws/collections/compute/awsTags.js b/js/aws/collections/compute/awsTags.js index fe8ee8e7..5fd0cd34 100644 --- a/js/aws/collections/compute/awsTags.js +++ b/js/aws/collections/compute/awsTags.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/compute/awsTag.js', + 'aws/models/compute/awsTag', 'common' ], function( $, Backbone, KeyPair, Common ) { 'use strict'; diff --git a/js/aws/collections/dns/awsHostedZones.js b/js/aws/collections/dns/awsHostedZones.js index 2e7901cc..61a26bf4 100644 --- a/js/aws/collections/dns/awsHostedZones.js +++ b/js/aws/collections/dns/awsHostedZones.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/dns/awsHostedZone.js', + 'aws/models/dns/awsHostedZone', 'common' ], function( $, Backbone, HostedZone, Common ) { 'use strict'; diff --git a/js/aws/collections/dns/awsRecordSets.js b/js/aws/collections/dns/awsRecordSets.js index 877de540..b9ef5529 100644 --- a/js/aws/collections/dns/awsRecordSets.js +++ b/js/aws/collections/dns/awsRecordSets.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/dns/awsRecordSet.js', + 'aws/models/dns/awsRecordSet', 'common' ], function( $, Backbone, RecordSet, Common ) { 'use strict'; diff --git a/js/aws/collections/iam/awsGroupUsers.js b/js/aws/collections/iam/awsGroupUsers.js index 22aba0d1..b2fb6ab1 100644 --- a/js/aws/collections/iam/awsGroupUsers.js +++ b/js/aws/collections/iam/awsGroupUsers.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/iam/awsGroupUser.js', + 'aws/models/iam/awsGroupUser', 'common' ], function( $, Backbone, GroupUser, Common ) { 'use strict'; diff --git a/js/aws/collections/iam/awsGroups.js b/js/aws/collections/iam/awsGroups.js index 56a9f046..34a838fe 100644 --- a/js/aws/collections/iam/awsGroups.js +++ b/js/aws/collections/iam/awsGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/iam/awsGroup.js', + 'aws/models/iam/awsGroup', 'common' ], function( $, Backbone, Group, Common ) { 'use strict'; diff --git a/js/aws/collections/iam/awsUsers.js b/js/aws/collections/iam/awsUsers.js index 0bf2ada7..b4ef6030 100644 --- a/js/aws/collections/iam/awsUsers.js +++ b/js/aws/collections/iam/awsUsers.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/iam/awsUser.js', + 'aws/models/iam/awsUser', 'common' ], function( $, Backbone, User, Common ) { 'use strict'; diff --git a/js/aws/collections/load_balancer/awsListeners.js b/js/aws/collections/load_balancer/awsListeners.js index 261c2ff2..c5dce82d 100644 --- a/js/aws/collections/load_balancer/awsListeners.js +++ b/js/aws/collections/load_balancer/awsListeners.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/load_balancer/awsListener.js', + 'aws/models/load_balancer/awsListener', 'common' ], function( $, Backbone, Listener, Common ) { 'use strict'; diff --git a/js/aws/collections/load_balancer/awsLoadBalancers.js b/js/aws/collections/load_balancer/awsLoadBalancers.js index 9341dd97..ca36365c 100644 --- a/js/aws/collections/load_balancer/awsLoadBalancers.js +++ b/js/aws/collections/load_balancer/awsLoadBalancers.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/load_balancer/awsLoadBalancer.js', + 'aws/models/load_balancer/awsLoadBalancer', 'common' ], function( $, Backbone, LoadBalancer, Common ) { 'use strict'; diff --git a/js/aws/collections/notification/awsSubscriptions.js b/js/aws/collections/notification/awsSubscriptions.js index 8e9ad688..1a1c29b9 100644 --- a/js/aws/collections/notification/awsSubscriptions.js +++ b/js/aws/collections/notification/awsSubscriptions.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/notification/awsSubscription.js', + 'aws/models/notification/awsSubscription', 'common' ], function( $, Backbone, Subscription, Common ) { 'use strict'; diff --git a/js/aws/collections/notification/awsTopics.js b/js/aws/collections/notification/awsTopics.js index 92718827..a7885a68 100644 --- a/js/aws/collections/notification/awsTopics.js +++ b/js/aws/collections/notification/awsTopics.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/notification/awsTopic.js', + 'aws/models/notification/awsTopic', 'common' ], function( $, Backbone, Topic, Common ) { 'use strict'; diff --git a/js/aws/collections/object_storage/awsBuckets.js b/js/aws/collections/object_storage/awsBuckets.js index 36050ae2..191871ae 100644 --- a/js/aws/collections/object_storage/awsBuckets.js +++ b/js/aws/collections/object_storage/awsBuckets.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/object_storage/awsBucket.js', + 'aws/models/object_storage/awsBucket', 'common' ], function( $, Backbone, Bucket, Common ) { 'use strict'; diff --git a/js/aws/collections/object_storage/awsFiles.js b/js/aws/collections/object_storage/awsFiles.js index fcc1a2fc..1f5fb745 100644 --- a/js/aws/collections/object_storage/awsFiles.js +++ b/js/aws/collections/object_storage/awsFiles.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/object_storage/awsFile.js', + 'aws/models/object_storage/awsFile', 'common' ], function( $, Backbone, File, Common ) { 'use strict'; diff --git a/js/aws/collections/queue/awsQueues.js b/js/aws/collections/queue/awsQueues.js index 51405884..ce4a7194 100644 --- a/js/aws/collections/queue/awsQueues.js +++ b/js/aws/collections/queue/awsQueues.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/queue/awsQueue.js', + 'aws/models/queue/awsQueue', 'common' ], function( $, Backbone, Queue, Common ) { 'use strict'; diff --git a/js/aws/collections/rds/awsDBEngineVersions.js b/js/aws/collections/rds/awsDBEngineVersions.js index 3ac8d49c..25b302c9 100644 --- a/js/aws/collections/rds/awsDBEngineVersions.js +++ b/js/aws/collections/rds/awsDBEngineVersions.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/rds/awsDBEngineVersion.js', + 'aws/models/rds/awsDBEngineVersion', 'common' ], function( $, Backbone, DBEngineVersion, Common ) { 'use strict'; diff --git a/js/aws/collections/rds/awsDBParameterGroups.js b/js/aws/collections/rds/awsDBParameterGroups.js index 0fa8d544..7e80f7f2 100644 --- a/js/aws/collections/rds/awsDBParameterGroups.js +++ b/js/aws/collections/rds/awsDBParameterGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/rds/awsDBParameterGroup.js', + 'aws/models/rds/awsDBParameterGroup', 'common' ], function( $, Backbone, DBParameterGroup, Common ) { 'use strict'; diff --git a/js/aws/collections/rds/awsDBSecurityGroups.js b/js/aws/collections/rds/awsDBSecurityGroups.js index ea471bb0..a8e8fc69 100644 --- a/js/aws/collections/rds/awsDBSecurityGroups.js +++ b/js/aws/collections/rds/awsDBSecurityGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/rds/awsDBSecurityGroup.js', + 'aws/models/rds/awsDBSecurityGroup', 'common' ], function( $, Backbone, DBSecurityGroup, Common ) { 'use strict'; diff --git a/js/aws/collections/rds/awsRelationalDatabases.js b/js/aws/collections/rds/awsRelationalDatabases.js index 1ca207cf..4e78d4da 100644 --- a/js/aws/collections/rds/awsRelationalDatabases.js +++ b/js/aws/collections/rds/awsRelationalDatabases.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/rds/awsRelationalDatabase.js', + 'aws/models/rds/awsRelationalDatabase', 'common' ], function( $, Backbone, RelationalDatabase, Common ) { 'use strict'; diff --git a/js/aws/collections/simple_db/awsSimpleDatabases.js b/js/aws/collections/simple_db/awsSimpleDatabases.js index 6b115f25..5019c2d5 100644 --- a/js/aws/collections/simple_db/awsSimpleDatabases.js +++ b/js/aws/collections/simple_db/awsSimpleDatabases.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/simple_db/awsSimpleDatabase.js', + 'aws/models/simple_db/awsSimpleDatabase', 'common' ], function( $, Backbone, SimpleDB, Common ) { 'use strict'; diff --git a/js/aws/collections/vpc/awsDhcpOptionsSets.js b/js/aws/collections/vpc/awsDhcpOptionsSets.js index 29fd5eb6..9d4f75e2 100644 --- a/js/aws/collections/vpc/awsDhcpOptionsSets.js +++ b/js/aws/collections/vpc/awsDhcpOptionsSets.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/vpc/awsDhcpOptionsSet.js', + 'aws/models/vpc/awsDhcpOptionsSet', 'common' ], function( $, Backbone, DhcpOptionsSet, Common ) { 'use strict'; diff --git a/js/aws/collections/vpc/awsInternetGateways.js b/js/aws/collections/vpc/awsInternetGateways.js index fe36d999..dcee650c 100644 --- a/js/aws/collections/vpc/awsInternetGateways.js +++ b/js/aws/collections/vpc/awsInternetGateways.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/vpc/awsInternetGateway.js', + 'aws/models/vpc/awsInternetGateway', 'common' ], function( $, Backbone, InternetGateway, Common ) { 'use strict'; diff --git a/js/aws/collections/vpc/awsNetworkAcls.js b/js/aws/collections/vpc/awsNetworkAcls.js index 7f140685..7d79fad5 100644 --- a/js/aws/collections/vpc/awsNetworkAcls.js +++ b/js/aws/collections/vpc/awsNetworkAcls.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/vpc/awsNetworkAcl.js', + 'aws/models/vpc/awsNetworkAcl', 'common' ], function( $, Backbone, NetworkAcl, Common ) { 'use strict'; @@ -21,7 +21,7 @@ define([ // Reference to this collection's model. model: NetworkAcl, - url: 'samples/networkAcls.json' + url: Common.apiUrl + '/stackstudio/v1/cloud_management/aws/compute/network_acls' }); diff --git a/js/aws/collections/vpc/awsRouteTables.js b/js/aws/collections/vpc/awsRouteTables.js index 1cadc4eb..78f175dd 100644 --- a/js/aws/collections/vpc/awsRouteTables.js +++ b/js/aws/collections/vpc/awsRouteTables.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/vpc/awsRouteTable.js', + 'aws/models/vpc/awsRouteTable', 'common' ], function( $, Backbone, RouteTable, Common ) { 'use strict'; @@ -21,7 +21,7 @@ define([ // Reference to this collection's model. model: RouteTable, - url: 'samples/routeTables.json' + url: Common.apiUrl + '/stackstudio/v1/cloud_management/aws/compute/route_tables' }); // Create our global collection of **RouteTables**. diff --git a/js/aws/collections/vpc/awsSubnets.js b/js/aws/collections/vpc/awsSubnets.js index 8bbc1966..2817971a 100644 --- a/js/aws/collections/vpc/awsSubnets.js +++ b/js/aws/collections/vpc/awsSubnets.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/vpc/awsSubnet.js', + 'aws/models/vpc/awsSubnet', 'common' ], function( $, Backbone, Subnet, Common ) { 'use strict'; diff --git a/js/aws/collections/vpc/awsVpcs.js b/js/aws/collections/vpc/awsVpcs.js index 3b845d42..6ea4bd0d 100644 --- a/js/aws/collections/vpc/awsVpcs.js +++ b/js/aws/collections/vpc/awsVpcs.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/aws/models/vpc/awsVpc.js', + 'aws/models/vpc/awsVpc', 'common' ], function( $, Backbone, Vpc, Common ) { 'use strict'; diff --git a/js/aws/models/vpc/awsNetworkAcl.js b/js/aws/models/vpc/awsNetworkAcl.js index 685cc58b..692f2207 100644 --- a/js/aws/models/vpc/awsNetworkAcl.js +++ b/js/aws/models/vpc/awsNetworkAcl.js @@ -6,12 +6,12 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - 'jquery', - 'backbone' -], function( $, Backbone ) { + 'models/resource/resourceModel', + 'common' +], function( ResourceModel, Common ) { 'use strict'; - // Base NetworkAcl Model + // Network ACL Model // ---------- /** @@ -22,31 +22,30 @@ define([ * @param {Object} initialization object. * @returns {Object} Returns a NetworkAcl instance. */ - var NetworkAcl = Backbone.Model.extend({ + var NetworkAcl = ResourceModel.extend({ - idAttribute: "networkAclId", + idAttribute: "network_acl_id", /** Default attributes for compute */ defaults: { - "networkAclId": '', - "vpcId": '', - "default": '', - "entrySet": [], - "associationSet": [], - "tagSet": [] - }, + network_acl_id: '', + vpc_id: '', + "default": false, + entries: [], + associations: [], + tags: [] + }, + + create: function(options, credentialId, region) { + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/aws/compute/network_acls?cred_id=" + credentialId + "®ion=" + region; + this.sendAjaxAction(url, "POST", {"network_acl": options}, "networkAclAppRefresh"); + }, + + destroy: function(credentialId, region) { + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/aws/compute/network_acls/" + this.attributes.network_acl_id + "?_method=DELETE&cred_id=" + credentialId + "®ion=" + region; + this.sendAjaxAction(url, "POST", undefined, "networkAclAppRefresh"); + } - /** - * Override the base Backbone set method, for debugging. - * - * @memberOf NetworkAcl - * @category Internal - * @param {Object} hash of attribute values to set. - * @param {Object} (optional) options to tweak (see Backbone docs). - */ - set: function(attributes, options) { - Backbone.Model.prototype.set.apply(this, arguments); - } }); return NetworkAcl; diff --git a/js/aws/models/vpc/awsRouteTable.js b/js/aws/models/vpc/awsRouteTable.js index cd05f682..549e4c4b 100644 --- a/js/aws/models/vpc/awsRouteTable.js +++ b/js/aws/models/vpc/awsRouteTable.js @@ -6,12 +6,12 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - 'jquery', - 'backbone' -], function( $, Backbone ) { + 'models/resource/resourceModel', + 'common' +], function( ResourceModel, Common ) { 'use strict'; - // Base RouteTable Model + // RouteTable Model // ---------- /** @@ -22,41 +22,39 @@ define([ * @param {Object} initialization object. * @returns {Object} Returns a RouteTable instance. */ - var RouteTable = Backbone.Model.extend({ + var RouteTable = ResourceModel.extend({ - idAttribute: "routeTableId", + idAttribute: "id", /** Default attributes for compute */ defaults: { - routeTableId: '', - vpcId: '', - routeSet: [], - associationSet: [], - propagatingVgwSet: [], - tagSet: [] + id: '', + vpc_id: '', + routes: [], + associations: [], + propagating_vpn: [], + tags: [] }, - /** - * Override the base Backbone set method, for debugging. - * - * @memberOf RouteTable - * @category Internal - * @param {Object} hash of attribute values to set. - * @param {Object} (optional) options to tweak (see Backbone docs). - */ - set: function(attributes, options) { - Backbone.Model.prototype.set.apply(this, arguments); - } - - /* - get: function(attr) { - if (typeof this[attr] == 'function') { - return this[attr](); - } - - return Backbone.Model.prototype.get.call(this, attr); - } - */ + create: function(options, credentialId, region) { + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/aws/compute/route_tables?cred_id=" + credentialId + "®ion=" + region; + this.sendAjaxAction(url, "POST", {"route_table": options}, "routeTableAppRefresh"); + }, + + destroy: function(credentialId, region) { + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/aws/compute/route_tables/" + this.attributes.id + "?_method=DELETE&cred_id=" + credentialId + "®ion=" + region; + this.sendAjaxAction(url, "POST", undefined, "routeTableAppRefresh"); + }, + + associate: function(options, credentialId, region) { + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/aws/compute/route_tables/" + this.attributes.id + "/associate?cred_id=" + credentialId + "®ion=" + region; + this.sendAjaxAction(url, "POST", {"subnet_id": options.subnet_id}, "routeTableAppRefresh"); + }, + + disassociate: function(options, credentialId, region) { + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/aws/compute/route_tables/" + this.attributes.id + "/disassociate?cred_id=" + credentialId + "®ion=" + region; + this.sendAjaxAction(url, "POST", {"association_id": options.association_id}, "routeTableAppRefresh"); + } }); return RouteTable; diff --git a/js/aws/views/autoscale/awsAutoscaleGroupCreateView.js b/js/aws/views/autoscale/awsAutoscaleGroupCreateView.js index c0bc307c..bf12e238 100644 --- a/js/aws/views/autoscale/awsAutoscaleGroupCreateView.js +++ b/js/aws/views/autoscale/awsAutoscaleGroupCreateView.js @@ -11,12 +11,12 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/autoscale/awsAutoscaleGroupCreateTemplate.html', - '/js/aws/models/autoscale/awsAutoscaleGroup.js', - '/js/aws/collections/compute/awsImages.js', - '/js/aws/collections/compute/awsAvailabilityZones.js', - '/js/aws/collections/compute/awsFlavors.js', - '/js/aws/collections/compute/awsKeyPairs.js', - '/js/aws/collections/compute/awsSecurityGroups.js', + 'aws/models/autoscale/awsAutoscaleGroup', + 'aws/collections/compute/awsImages', + 'aws/collections/compute/awsAvailabilityZones', + 'aws/collections/compute/awsFlavors', + 'aws/collections/compute/awsKeyPairs', + 'aws/collections/compute/awsSecurityGroups', 'common', 'jquery.multiselect', 'jquery.multiselect.filter' diff --git a/js/aws/views/autoscale/awsAutoscalegroupsAppView.js b/js/aws/views/autoscale/awsAutoscalegroupsAppView.js index 0baf40d6..0750d373 100644 --- a/js/aws/views/autoscale/awsAutoscalegroupsAppView.js +++ b/js/aws/views/autoscale/awsAutoscalegroupsAppView.js @@ -12,10 +12,10 @@ define([ 'views/resource/resourceAppView', 'views/resource/resourceRowView', 'text!templates/aws/autoscale/awsAutoscaleAppTemplate.html', - '/js/aws/models/autoscale/awsAutoscaleGroup.js', - '/js/aws/collections/autoscale/awsAutoscaleGroups.js', - '/js/aws/views/autoscale/awsAutoscaleGroupCreateView.js', - '/js/aws/collections/cloud_watch/awsMetricStatistics.js', + 'aws/models/autoscale/awsAutoscaleGroup', + 'aws/collections/autoscale/awsAutoscaleGroups', + 'aws/views/autoscale/awsAutoscaleGroupCreateView', + 'aws/collections/cloud_watch/awsMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', @@ -60,12 +60,21 @@ define([ events: { 'click .create_button': 'createNew', - 'click #action_menu ul li': 'performAction', + 'click #action_menu li': 'performAction', 'click #resource_table tr': "clickOne", 'click #monitoring': 'refreshMonitors', 'click #refresh_monitors_button': 'refreshMonitors' }, + createButton : true, + + createText : "Create Auto Scale", + + actions : [ + { text: "Spin Down Group", type: "row" }, + { text: "Delete Group", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -73,7 +82,14 @@ define([ if(options.region) { this.region = options.region; } + + this.$el.html(this.template); + + this.loadData(); + this.render(); + + this.loadTable(); var topicApp = this; Common.vent.on("autoscaleAppRefresh", function() { diff --git a/js/aws/views/beanstalk/awsApplicationCreateView.js b/js/aws/views/beanstalk/awsApplicationCreateView.js index fff9e42e..6992ec0c 100644 --- a/js/aws/views/beanstalk/awsApplicationCreateView.js +++ b/js/aws/views/beanstalk/awsApplicationCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/beanstalk/awsApplicationCreateTemplate.html', - '/js/aws/models/beanstalk/awsApplication.js', + 'aws/models/beanstalk/awsApplication', 'common', 'jquery.multiselect', 'jquery.multiselect.filter', diff --git a/js/aws/views/beanstalk/awsApplicationsAppView.js b/js/aws/views/beanstalk/awsApplicationsAppView.js index 3e6136e7..57497579 100644 --- a/js/aws/views/beanstalk/awsApplicationsAppView.js +++ b/js/aws/views/beanstalk/awsApplicationsAppView.js @@ -11,12 +11,12 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/beanstalk/awsApplicationAppTemplate.html', - '/js/aws/models/beanstalk/awsApplication.js', - '/js/aws/collections/beanstalk/awsApplications.js', - '/js/aws/views/beanstalk/awsApplicationCreateView.js', - '/js/aws/views/beanstalk/awsVersionCreateView.js', - '/js/aws/views/beanstalk/awsEnvironmentCreateView.js', - '/js/aws/views/beanstalk/awsEnvironmentModifyView.js', + 'aws/models/beanstalk/awsApplication', + 'aws/collections/beanstalk/awsApplications', + 'aws/views/beanstalk/awsApplicationCreateView', + 'aws/views/beanstalk/awsVersionCreateView', + 'aws/views/beanstalk/awsEnvironmentCreateView', + 'aws/views/beanstalk/awsEnvironmentModifyView', 'icanhaz', 'common', 'jquery.dataTables' @@ -67,6 +67,13 @@ define([ 'click #version_action_menu ul li': 'performVersionAction' }, + createButton: true, + createText: "Create Application", + + actions: [ + { text: "Delete Application", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -74,8 +81,12 @@ define([ if(options.region) { this.region = options.region; } - + + this.$el.html(this.template); + + this.loadData(); this.render(); + this.loadTable(); var applicationApp = this; Common.vent.on("applicationAppRefresh", function() { diff --git a/js/aws/views/beanstalk/awsEnvironmentCreateView.js b/js/aws/views/beanstalk/awsEnvironmentCreateView.js index fbf01db6..50168a2b 100644 --- a/js/aws/views/beanstalk/awsEnvironmentCreateView.js +++ b/js/aws/views/beanstalk/awsEnvironmentCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/beanstalk/awsEnvironmentCreateTemplate.html', - '/js/aws/models/beanstalk/awsApplication.js', + 'aws/models/beanstalk/awsApplication', 'common', 'jquery.multiselect', 'jquery.multiselect.filter', diff --git a/js/aws/views/beanstalk/awsEnvironmentModifyView.js b/js/aws/views/beanstalk/awsEnvironmentModifyView.js index a4922d99..29e1cfda 100644 --- a/js/aws/views/beanstalk/awsEnvironmentModifyView.js +++ b/js/aws/views/beanstalk/awsEnvironmentModifyView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/beanstalk/awsEnvironmentCreateTemplate.html', - '/js/aws/models/beanstalk/awsApplication.js', + 'aws/models/beanstalk/awsApplication', 'common', 'jquery.multiselect', 'jquery.multiselect.filter', diff --git a/js/aws/views/beanstalk/awsVersionCreateView.js b/js/aws/views/beanstalk/awsVersionCreateView.js index 2c7db576..f2b740e6 100644 --- a/js/aws/views/beanstalk/awsVersionCreateView.js +++ b/js/aws/views/beanstalk/awsVersionCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/beanstalk/awsVersionCreateTemplate.html', - '/js/aws/models/beanstalk/awsApplication.js', + 'aws/models/beanstalk/awsApplication', 'common', 'jquery.multiselect', 'jquery.multiselect.filter', diff --git a/js/aws/views/block_storage/awsSnapshotCreateView.js b/js/aws/views/block_storage/awsSnapshotCreateView.js index d22ed2ca..5a259b97 100644 --- a/js/aws/views/block_storage/awsSnapshotCreateView.js +++ b/js/aws/views/block_storage/awsSnapshotCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/block_storage/awsSnapshotCreateTemplate.html', - '/js/aws/models/block_storage/awsSnapshot.js', + 'aws/models/block_storage/awsSnapshot', 'common' ], function( $, _, Backbone, DialogView, snapshotCreateTemplate, Snapshot, Common ) { diff --git a/js/aws/views/block_storage/awsVolumeAttachView.js b/js/aws/views/block_storage/awsVolumeAttachView.js index 9b7eae95..a80b4c08 100644 --- a/js/aws/views/block_storage/awsVolumeAttachView.js +++ b/js/aws/views/block_storage/awsVolumeAttachView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/block_storage/awsVolumeAttachTemplate.html', - '/js/aws/collections/compute/awsInstances.js', + 'aws/collections/compute/awsInstances', 'common' ], function( $, _, Backbone, DialogView, volumeAttachTemplate, Instances, Common ) { diff --git a/js/aws/views/block_storage/awsVolumeCreateView.js b/js/aws/views/block_storage/awsVolumeCreateView.js index 259d918c..ad0e4513 100644 --- a/js/aws/views/block_storage/awsVolumeCreateView.js +++ b/js/aws/views/block_storage/awsVolumeCreateView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/block_storage/awsVolumeCreateTemplate.html', - '/js/aws/models/block_storage/awsVolume.js', - '/js/aws/collections/compute/awsAvailabilityZones.js', - '/js/aws/collections/block_storage/awsSnapshots.js', + 'aws/models/block_storage/awsVolume', + 'aws/collections/compute/awsAvailabilityZones', + 'aws/collections/block_storage/awsSnapshots', 'icanhaz', 'common', 'jquery.multiselect', diff --git a/js/aws/views/block_storage/awsVolumesAppView.js b/js/aws/views/block_storage/awsVolumesAppView.js index 398ecb87..6917981d 100644 --- a/js/aws/views/block_storage/awsVolumesAppView.js +++ b/js/aws/views/block_storage/awsVolumesAppView.js @@ -11,12 +11,12 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/block_storage/awsVolumeAppTemplate.html', - '/js/aws/models/block_storage/awsVolume.js', - '/js/aws/collections/block_storage/awsVolumes.js', - '/js/aws/views/block_storage/awsVolumeCreateView.js', - '/js/aws/views/block_storage/awsVolumeAttachView.js', - '/js/aws/views/block_storage/awsSnapshotCreateView.js', - '/js/aws/collections/cloud_watch/awsMetricStatistics.js', + 'aws/models/block_storage/awsVolume', + 'aws/collections/block_storage/awsVolumes', + 'aws/views/block_storage/awsVolumeCreateView', + 'aws/views/block_storage/awsVolumeAttachView', + 'aws/views/block_storage/awsSnapshotCreateView', + 'aws/collections/cloud_watch/awsMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', @@ -70,6 +70,17 @@ define([ 'click #monitoring': 'refreshMonitors' }, + createButton: true, + createText: "Create Volume", + + actions: [ + { text: "Delete Volume", type: "row"}, + { text: "Attach Volume", type: "row"}, + { text: "Detach Volume", type: "row"}, + { text: "Force Detach", type: "row"}, + { text: "Create Snapshot", type: "row"} + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -77,7 +88,10 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + + this.$el.html(this.template); + + this.loadData({render: true}); var volumeApp = this; Common.vent.on("volumeAppRefresh", function() { diff --git a/js/aws/views/cache/awsClusterCreateView.js b/js/aws/views/cache/awsClusterCreateView.js index b52b9932..8d68df01 100644 --- a/js/aws/views/cache/awsClusterCreateView.js +++ b/js/aws/views/cache/awsClusterCreateView.js @@ -11,11 +11,11 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/cache/awsCacheClusterCreateTemplate.html', - '/js/aws/models/cache/awsCacheCluster.js', - '/js/aws/collections/cache/awsCacheParameterGroups.js', - '/js/aws/collections/cache/awsCacheSecurityGroups.js', - '/js/aws/collections/notification/awsTopics.js', - '/js/aws/collections/compute/awsAvailabilityZones.js', + 'aws/models/cache/awsCacheCluster', + 'aws/collections/cache/awsCacheParameterGroups', + 'aws/collections/cache/awsCacheSecurityGroups', + 'aws/collections/notification/awsTopics', + 'aws/collections/compute/awsAvailabilityZones', 'common', 'jquery.multiselect', 'jquery.multiselect.filter' diff --git a/js/aws/views/cache/awsClustersAppView.js b/js/aws/views/cache/awsClustersAppView.js index 61d05971..387c5d5c 100644 --- a/js/aws/views/cache/awsClustersAppView.js +++ b/js/aws/views/cache/awsClustersAppView.js @@ -11,11 +11,11 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/cache/awsCacheClusterAppTemplate.html', - '/js/aws/models/cache/awsCacheCluster.js', - '/js/aws/collections/cache/awsCacheClusters.js', - '/js/aws/views/cache/awsClusterCreateView.js', - '/js/aws/views/cache/awsClusterModifyView.js', - '/js/aws/collections/cloud_watch/awsMetricStatistics.js', + 'aws/models/cache/awsCacheCluster', + 'aws/collections/cache/awsCacheClusters', + 'aws/views/cache/awsClusterCreateView', + 'aws/views/cache/awsClusterModifyView', + 'aws/collections/cloud_watch/awsMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', @@ -85,6 +85,14 @@ define([ 'click #monitoring': 'selectNode' }, + createButton: true, + createText: 'Create Cluster', + + actions: [ + { text: "Delete", type: "row" }, + { text: "Modify Node Count", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -92,7 +100,10 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + + this.$el.html(this.template); + + this.loadData({ render: true }); var cacheApp = this; Common.vent.on("cacheAppRefresh", function() { diff --git a/js/aws/views/cache/awsParameterGroupCreateView.js b/js/aws/views/cache/awsParameterGroupCreateView.js index 11008fa0..8a495de8 100644 --- a/js/aws/views/cache/awsParameterGroupCreateView.js +++ b/js/aws/views/cache/awsParameterGroupCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/cache/awsParameterGroupCreateTemplate.html', - '/js/aws/models/cache/awsCacheParameterGroup.js', + 'aws/models/cache/awsCacheParameterGroup', 'icanhaz', 'common' diff --git a/js/aws/views/cache/awsParametergroupsAppView.js b/js/aws/views/cache/awsParametergroupsAppView.js index 9a5b72ac..58d7efb3 100644 --- a/js/aws/views/cache/awsParametergroupsAppView.js +++ b/js/aws/views/cache/awsParametergroupsAppView.js @@ -12,9 +12,9 @@ define([ 'views/featureNotImplementedView', 'views/resource/resourceAppView', 'text!templates/aws/cache/awsParameterGroupAppTemplate.html', - '/js/aws/models/cache/awsCacheParameterGroup.js', - '/js/aws/collections/cache/awsCacheParameterGroups.js', - '/js/aws/views/cache/awsParameterGroupCreateView.js', + 'aws/models/cache/awsCacheParameterGroup', + 'aws/collections/cache/awsCacheParameterGroups', + 'aws/views/cache/awsParameterGroupCreateView', 'icanhaz', 'common', 'jquery.dataTables' @@ -47,6 +47,10 @@ define([ 'click #resource_table tr': 'clickOne' }, + actions: [ + { text: "Delete", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -54,7 +58,9 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + + this.$el.html(this.template); + this.loadData({ render: true }); var cacheApp = this; Common.vent.on("parameterGroupAppRefresh", function() { diff --git a/js/aws/views/cache/awsSecurityGroupCreateView.js b/js/aws/views/cache/awsSecurityGroupCreateView.js index eca07827..1d6af5eb 100644 --- a/js/aws/views/cache/awsSecurityGroupCreateView.js +++ b/js/aws/views/cache/awsSecurityGroupCreateView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/compute/awsSecurityGroupCreateTemplate.html', - '/js/aws/models/cache/awsCacheSecurityGroup.js', - '/js/aws/collections/vpc/awsVpcs.js', + 'aws/models/cache/awsCacheSecurityGroup', + 'aws/collections/vpc/awsVpcs', 'icanhaz', 'common' diff --git a/js/aws/views/cache/awsSecuritygroupsAppView.js b/js/aws/views/cache/awsSecuritygroupsAppView.js index 6271c527..50c56d54 100644 --- a/js/aws/views/cache/awsSecuritygroupsAppView.js +++ b/js/aws/views/cache/awsSecuritygroupsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/cache/awsSecurityGroupAppTemplate.html', - '/js/aws/models/cache/awsCacheSecurityGroup.js', - '/js/aws/collections/cache/awsCacheSecurityGroups.js', - '/js/aws/views/cache/awsSecurityGroupCreateView.js', + 'aws/models/cache/awsCacheSecurityGroup', + 'aws/collections/cache/awsCacheSecurityGroups', + 'aws/views/cache/awsSecurityGroupCreateView', 'icanhaz', 'common', 'jquery.dataTables' @@ -58,6 +58,10 @@ define([ 'click #resource_table tr': "clickOne" }, + actions: [ + { text: "Delete Security Group", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -65,7 +69,9 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + + this.$el.html(this.template); + this.loadData({render: true}); var securityGroupApp = this; Common.vent.on("securityGroupAppRefresh", function() { diff --git a/js/aws/views/cloud_formation/awsCloudFormationAppView.js b/js/aws/views/cloud_formation/awsCloudFormationAppView.js index 59cea414..27b19be8 100644 --- a/js/aws/views/cloud_formation/awsCloudFormationAppView.js +++ b/js/aws/views/cloud_formation/awsCloudFormationAppView.js @@ -12,10 +12,10 @@ define([ 'views/resource/resourceAppView', 'views/resource/resourceRowView', 'text!templates/aws/cloud_formation/awsCloudFormationAppTemplate.html', - '/js/aws/models/cloud_formation/awsStack.js', - '/js/aws/collections/cloud_formation/awsStacks.js', - '/js/aws/views/cloud_formation/awsCloudFormationStackCreateView.js', - '/js/aws/views/cloud_formation/awsCloudFormationStackUpdateView.js', + 'aws/models/cloud_formation/awsStack', + 'aws/collections/cloud_formation/awsStacks', + 'aws/views/cloud_formation/awsCloudFormationStackCreateView', + 'aws/views/cloud_formation/awsCloudFormationStackUpdateView', 'icanhaz', 'common', 'morris', @@ -53,6 +53,11 @@ define([ 'tabsactivate' : 'loadStackResources' }, + actions: [ + { text: "Update Stack", type: "row" }, + { text: "Delete Stack", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -60,7 +65,9 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + + this.$el.html(this.template); + this.loadData({render: true}); var topicApp = this; Common.vent.on("cloudFormationAppRefresh", function() { diff --git a/js/aws/views/cloud_formation/awsCloudFormationStackCreateView.js b/js/aws/views/cloud_formation/awsCloudFormationStackCreateView.js index 8f23f23b..b5a05795 100644 --- a/js/aws/views/cloud_formation/awsCloudFormationStackCreateView.js +++ b/js/aws/views/cloud_formation/awsCloudFormationStackCreateView.js @@ -11,15 +11,15 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/cloud_formation/awsStackCreateTemplate.html', - '/js/aws/models/cloud_formation/awsStack.js', - '/js/aws/collections/notification/awsTopics.js', - '/js/aws/models/notification/awsTopic.js', - '/js/aws/models/notification/awsSubscription.js', + 'aws/models/cloud_formation/awsStack', + 'aws/collections/notification/awsTopics', + 'aws/models/notification/awsTopic', + 'aws/models/notification/awsSubscription', 'collections/cloudCredentials', 'common', 'spinner', 'messenger', - '/js/models/ansibleQueueItem.js', + 'models/ansibleQueueItem', 'jquery.form' ], function( $, _, Backbone, DialogView, StackCreateTemplate, @@ -228,10 +228,10 @@ define([ $.each(this.cloudDefinitions[this.cloudProvider].regions, function(index, region) { //regions check var addRegion = false; - if(JSON.parse(sessionStorage.group_policies)[0] == null){ + if(Common.account.group_policies[0] == null){ addRegion = true; }else{ - $.each(JSON.parse(sessionStorage.group_policies), function(index,value){ + $.each(Common.account.group_policies, function(index,value){ if(value != null){ var usable_regions = value.group_policy.aws_governance.usable_regions; if($.inArray(region.name, usable_regions) !== -1){ diff --git a/js/aws/views/cloud_formation/awsCloudFormationStackUpdateView.js b/js/aws/views/cloud_formation/awsCloudFormationStackUpdateView.js index 784a09dc..bdce7824 100644 --- a/js/aws/views/cloud_formation/awsCloudFormationStackUpdateView.js +++ b/js/aws/views/cloud_formation/awsCloudFormationStackUpdateView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/cloud_formation/awsStackUpdateTemplate.html', - '/js/aws/models/cloud_formation/awsStack.js', - '/js/aws/collections/notification/awsTopics.js', - '/js/aws/models/notification/awsTopic.js', - '/js/aws/models/notification/awsSubscription.js', + 'aws/models/cloud_formation/awsStack', + 'aws/collections/notification/awsTopics', + 'aws/models/notification/awsTopic', + 'aws/models/notification/awsSubscription', 'common', 'jquery.form' diff --git a/js/aws/views/cloud_watch/awsAlarmCreateView.js b/js/aws/views/cloud_watch/awsAlarmCreateView.js index 3986cb0e..5eb11a9a 100644 --- a/js/aws/views/cloud_watch/awsAlarmCreateView.js +++ b/js/aws/views/cloud_watch/awsAlarmCreateView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/cloud_watch/awsAlarmCreateTemplate.html', - '/js/aws/models/cloud_watch/awsAlarm.js', - '/js/aws/collections/cloud_watch/awsMetrics.js', - '/js/aws/collections/notification/awsTopics.js', + 'aws/models/cloud_watch/awsAlarm', + 'aws/collections/cloud_watch/awsMetrics', + 'aws/collections/notification/awsTopics', 'common' ], function( $, _, Backbone, DialogView, alarmCreateTemplate, Alarm, Metrics, Topics, Common ) { diff --git a/js/aws/views/cloud_watch/awsAlarmsAppView.js b/js/aws/views/cloud_watch/awsAlarmsAppView.js index 2c9b38a3..54fc62f6 100644 --- a/js/aws/views/cloud_watch/awsAlarmsAppView.js +++ b/js/aws/views/cloud_watch/awsAlarmsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/cloud_watch/awsAlarmAppTemplate.html', - '/js/aws/models/cloud_watch/awsAlarm.js', - '/js/aws/collections/cloud_watch/awsAlarms.js', - '/js/aws/views/cloud_watch/awsAlarmCreateView.js', + 'aws/models/cloud_watch/awsAlarm', + 'aws/collections/cloud_watch/awsAlarms', + 'aws/views/cloud_watch/awsAlarmCreateView', 'icanhaz', 'common', 'jquery.dataTables' @@ -58,6 +58,10 @@ define([ 'click #history_tab' : 'refreshHistoryTab' }, + actions: [ + { text: "Delete Alarm", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -65,7 +69,10 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + + this.$el.html(this.template); + + this.loadData({render: true}); $("#alarm_history").dataTable({ "bJQueryUI": true, diff --git a/js/aws/views/cloud_watch/awsDefaultAlarmCreateView.js b/js/aws/views/cloud_watch/awsDefaultAlarmCreateView.js index 43be1412..11e77aff 100644 --- a/js/aws/views/cloud_watch/awsDefaultAlarmCreateView.js +++ b/js/aws/views/cloud_watch/awsDefaultAlarmCreateView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/cloud_watch/awsAlarmCreateTemplate.html', - '/js/aws/models/cloud_watch/awsAlarm.js', - '/js/aws/collections/cloud_watch/awsMetrics.js', - '/js/aws/collections/notification/awsTopics.js', + 'aws/models/cloud_watch/awsAlarm', + 'aws/collections/cloud_watch/awsMetrics', + 'aws/collections/notification/awsTopics', 'common' ], function( $, _, Backbone, DialogView, alarmCreateTemplate, Alarm, Metrics, Topics, Common ) { diff --git a/js/aws/views/compute/awsElasticIPAssociateView.js b/js/aws/views/compute/awsElasticIPAssociateView.js index 7981d535..7e50efd0 100644 --- a/js/aws/views/compute/awsElasticIPAssociateView.js +++ b/js/aws/views/compute/awsElasticIPAssociateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/compute/awsElasticIPAssociateTemplate.html', - '/js/aws/collections/compute/awsInstances.js', + 'aws/collections/compute/awsInstances', 'icanhaz', 'common' diff --git a/js/aws/views/compute/awsElasticIPsCreateView.js b/js/aws/views/compute/awsElasticIPsCreateView.js index df09e75d..09b10728 100644 --- a/js/aws/views/compute/awsElasticIPsCreateView.js +++ b/js/aws/views/compute/awsElasticIPsCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/compute/awsElasticIPCreateTemplate.html', - '/js/aws/models/compute/awsElasticIP.js', + 'aws/models/compute/awsElasticIP', 'icanhaz', 'common' diff --git a/js/aws/views/compute/awsElasticipsAppView.js b/js/aws/views/compute/awsElasticipsAppView.js index 2bfa7fee..0682fc9d 100644 --- a/js/aws/views/compute/awsElasticipsAppView.js +++ b/js/aws/views/compute/awsElasticipsAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/compute/awsElasticIPAppTemplate.html', - '/js/aws/models/compute/awsElasticIP.js', - '/js/aws/collections/compute/awsElasticIPs.js', - '/js/aws/views/compute/awsElasticIPsCreateView.js', - '/js/aws/views/compute/awsElasticIPAssociateView.js', + 'aws/models/compute/awsElasticIP', + 'aws/collections/compute/awsElasticIPs', + 'aws/views/compute/awsElasticIPsCreateView', + 'aws/views/compute/awsElasticIPAssociateView', 'icanhaz', 'common', 'jquery.dataTables' @@ -58,6 +58,14 @@ define([ 'click #resource_table tr': "clickOne" }, + createText: "Allocate New Address", + + actions: [ + { text: "Release Address", type: "row"}, + { text: "Associate Address", type: "row"}, + { text: "Disassociate Adress", type: "row"} + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -65,7 +73,9 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + + this.$el.html(this.template); + this.loadData({render: true}); var elasticIpApp = this; Common.vent.on("elasticIPAppRefresh", function() { diff --git a/js/aws/views/compute/awsInstanceCreateView.js b/js/aws/views/compute/awsInstanceCreateView.js index 5e6b7077..39be7f2d 100644 --- a/js/aws/views/compute/awsInstanceCreateView.js +++ b/js/aws/views/compute/awsInstanceCreateView.js @@ -11,12 +11,12 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/compute/awsInstanceCreateTemplate.html', - '/js/aws/models/compute/awsInstance.js', - '/js/aws/collections/compute/awsImages.js', - '/js/aws/collections/compute/awsAvailabilityZones.js', - '/js/aws/collections/compute/awsFlavors.js', - '/js/aws/collections/compute/awsKeyPairs.js', - '/js/aws/collections/compute/awsSecurityGroups.js', + 'aws/models/compute/awsInstance', + 'aws/collections/compute/awsImages', + 'aws/collections/compute/awsAvailabilityZones', + 'aws/collections/compute/awsFlavors', + 'aws/collections/compute/awsKeyPairs', + 'aws/collections/compute/awsSecurityGroups', 'common', 'jquery.multiselect', 'jquery.multiselect.filter' @@ -86,14 +86,14 @@ define([ } }); $("#accordion").accordion(); - $("#radio").buttonset(); + $("#radio").buttonset(); $("#security_group_select").multiselect({ selectedList: 3, noneSelectedText: "Select Security Group(s)" }).multiselectfilter(); - if(JSON.parse(sessionStorage.group_policies).length > 0){ - this.addPolicyImages(JSON.parse(sessionStorage.group_policies)); + if(Common.account.group_policies.length > 0){ + this.addPolicyImages(Common.account.group_policies); } this.images.on( 'reset', this.addAllImages, this ); this.images.fetch({reset: true}); diff --git a/js/aws/views/compute/awsInstancesAppView.js b/js/aws/views/compute/awsInstancesAppView.js index 58f4e3b8..4c05569b 100644 --- a/js/aws/views/compute/awsInstancesAppView.js +++ b/js/aws/views/compute/awsInstancesAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/compute/awsInstanceAppTemplate.html', - '/js/aws/models/compute/awsInstance.js', - '/js/aws/collections/compute/awsInstances.js', - '/js/aws/views/compute/awsInstanceCreateView.js', - '/js/aws/collections/cloud_watch/awsMetricStatistics.js', + 'aws/models/compute/awsInstance', + 'aws/collections/compute/awsInstances', + 'aws/views/compute/awsInstanceCreateView', + 'aws/collections/cloud_watch/awsMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', @@ -80,6 +80,14 @@ define([ 'click #refresh_monitors_button': 'refreshMonitors' }, + actions: [ + { text: "Start", type: "row" }, + { text: "Stop", type: "row" }, + { text: "Reboot", type: "row" }, + { text: "Terminate", type: "row" }, + { text: "Disassociate Address", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -87,7 +95,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({render: true}); var instanceApp = this; Common.vent.on("instanceAppRefresh", function() { diff --git a/js/aws/views/compute/awsKeyPairCreateView.js b/js/aws/views/compute/awsKeyPairCreateView.js index 6763c317..f7eaefa9 100644 --- a/js/aws/views/compute/awsKeyPairCreateView.js +++ b/js/aws/views/compute/awsKeyPairCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/compute/awsKeyPairCreateTemplate.html', - '/js/aws/models/compute/awsKeyPair.js', + 'aws/models/compute/awsKeyPair', 'icanhaz', 'common' diff --git a/js/aws/views/compute/awsKeyPairImportView.js b/js/aws/views/compute/awsKeyPairImportView.js index 4b905b78..8d40d424 100644 --- a/js/aws/views/compute/awsKeyPairImportView.js +++ b/js/aws/views/compute/awsKeyPairImportView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/compute/awsKeyPairImportTemplate.html', - '/js/aws/models/compute/awsKeyPair.js', + 'aws/models/compute/awsKeyPair', 'icanhaz', 'common' diff --git a/js/aws/views/compute/awsKeypairsAppView.js b/js/aws/views/compute/awsKeypairsAppView.js index da4a7081..493a025e 100644 --- a/js/aws/views/compute/awsKeypairsAppView.js +++ b/js/aws/views/compute/awsKeypairsAppView.js @@ -11,14 +11,14 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/compute/awsKeyPairAppTemplate.html', - '/js/aws/models/compute/awsKeyPair.js', - '/js/aws/collections/compute/awsKeyPairs.js', - '/js/aws/views/compute/awsKeyPairCreateView.js', - '/js/aws/views/compute/awsKeyPairUploadView.js', + 'aws/models/compute/awsKeyPair', + 'aws/collections/compute/awsKeyPairs', + 'aws/views/compute/awsKeyPairCreateView', + 'aws/views/compute/awsKeyPairImportView', 'icanhaz', 'common', 'jquery.dataTables' -], function( $, _, Backbone, ResourceAppView, awsKeyPairAppTemplate, Keypair, Keypairs, AwsKeyPairCreate, AwsKeyPairUpload, ich, Common ) { +], function( $, _, Backbone, ResourceAppView, awsKeyPairAppTemplate, Keypair, Keypairs, AwsKeyPairCreate, AwsKeyPairImport, ich, Common ) { 'use strict'; // Aws Security Group Application View @@ -51,15 +51,22 @@ define([ subtype: "keypairs", CreateView: AwsKeyPairCreate, - UploadView: AwsKeyPairUpload, + ImportView: AwsKeyPairImport, events: { 'click .create_button': 'createNew', - 'click .upload_button' : 'uploadKey', + 'click .import_button' : 'importKey', 'click #action_menu ul li': 'performAction', 'click #resource_table tr': "clickOne" }, + createText: "Create Key Pair", + + actions: [ + { text: "Import Key Pair", type: "table", cssClass: "import_button" }, + { text: "Delete Key Pair", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -67,7 +74,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({render: true}); var keyPairApp = this; Common.vent.on("keyPairAppRefresh", function() { @@ -84,14 +92,14 @@ define([ //Disable any needed actions }, - uploadKey: function(e) { - var UploadView = this.UploadView; + importKey: function(e) { + var ImportView = this.ImportView; if(this.region) { - this.uploadKeyDialog = new UploadView({cred_id: this.credentialId, region: this.region}); + this.importKeyDialog = new ImportView({cred_id: this.credentialId, region: this.region}); }else { - this.uploadKeyDialog = new UploadView({cred_id: this.credentialId}); + this.importKeyDialog = new ImportView({cred_id: this.credentialId}); } - this.uploadKeyDialog.render(); + this.importKeyDialog.render(); }, performAction: function(event) { diff --git a/js/aws/views/compute/awsReservedInstanceCreateView.js b/js/aws/views/compute/awsReservedInstanceCreateView.js index 8aaf3cb7..5e7ce124 100644 --- a/js/aws/views/compute/awsReservedInstanceCreateView.js +++ b/js/aws/views/compute/awsReservedInstanceCreateView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/compute/awsReservedInstanceCreateTemplate.html', - '/js/aws/models/compute/awsReservedInstance.js', - '/js/aws/collections/compute/awsReservedInstancesOfferings.js', + 'aws/models/compute/awsReservedInstance', + 'aws/collections/compute/awsReservedInstancesOfferings', 'icanhaz', 'common', 'jquery.dataTables', diff --git a/js/aws/views/compute/awsReservedinstancesAppView.js b/js/aws/views/compute/awsReservedinstancesAppView.js index f373a6da..f46c04bb 100644 --- a/js/aws/views/compute/awsReservedinstancesAppView.js +++ b/js/aws/views/compute/awsReservedinstancesAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/compute/awsReservedInstanceAppTemplate.html', - '/js/aws/models/compute/awsReservedInstance.js', - '/js/aws/collections/compute/awsReservedInstances.js', - '/js/aws/views/compute/awsReservedInstanceCreateView.js', + 'aws/models/compute/awsReservedInstance', + 'aws/collections/compute/awsReservedInstances', + 'aws/views/compute/awsReservedInstanceCreateView', 'icanhaz', 'common', 'jquery.dataTables' @@ -56,6 +56,13 @@ define([ 'click #resource_table tr': 'clickOne' }, + createText: "Purchase Reserved Instance", + + actions: [ + { text: "Purchase More Like This", type: "row"}, + { text: "Sell Reserved Instance", type: "row"} + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -63,7 +70,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({ render: true }); var reservedInstanceApp = this; Common.vent.on("reservedInstanceAppRefresh", function() { diff --git a/js/aws/views/compute/awsSecurityGroupCreateView.js b/js/aws/views/compute/awsSecurityGroupCreateView.js index ab948fed..3b40dbc3 100644 --- a/js/aws/views/compute/awsSecurityGroupCreateView.js +++ b/js/aws/views/compute/awsSecurityGroupCreateView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/compute/awsSecurityGroupCreateTemplate.html', - '/js/aws/models/compute/awsSecurityGroup.js', - '/js/aws/collections/vpc/awsVpcs.js', + 'aws/models/compute/awsSecurityGroup', + 'aws/collections/vpc/awsVpcs', 'icanhaz', 'common' diff --git a/js/aws/views/compute/awsSecuritygroupsAppView.js b/js/aws/views/compute/awsSecuritygroupsAppView.js index 7828fb92..ca1f9925 100644 --- a/js/aws/views/compute/awsSecuritygroupsAppView.js +++ b/js/aws/views/compute/awsSecuritygroupsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/compute/awsSecurityGroupAppTemplate.html', - '/js/aws/models/compute/awsSecurityGroup.js', - '/js/aws/collections/compute/awsSecurityGroups.js', - '/js/aws/views/compute/awsSecurityGroupCreateView.js', + 'aws/models/compute/awsSecurityGroup', + 'aws/collections/compute/awsSecurityGroups', + 'aws/views/compute/awsSecurityGroupCreateView', 'icanhaz', 'common', 'jquery.dataTables' @@ -60,6 +60,10 @@ define([ 'click button#add_rule_button': 'addRule' }, + actions: [ + { text: "Delete Security Group", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -67,7 +71,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({render: true}); var securityGroupApp = this; Common.vent.on("securityGroupAppRefresh", function() { diff --git a/js/aws/views/compute/awsSpotInstanceCreateView.js b/js/aws/views/compute/awsSpotInstanceCreateView.js index dbb6f234..9604f673 100644 --- a/js/aws/views/compute/awsSpotInstanceCreateView.js +++ b/js/aws/views/compute/awsSpotInstanceCreateView.js @@ -11,13 +11,13 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/compute/awsSpotInstanceCreateTemplate.html', - '/js/aws/models/compute/awsSpotInstanceRequest.js', - '/js/aws/models/compute/awsSpotPrice.js', - '/js/aws/collections/compute/awsImages.js', - '/js/aws/collections/compute/awsAvailabilityZones.js', - '/js/aws/collections/compute/awsFlavors.js', - '/js/aws/collections/compute/awsKeyPairs.js', - '/js/aws/collections/compute/awsSecurityGroups.js', + 'aws/models/compute/awsSpotInstanceRequest', + 'aws/models/compute/awsSpotPrice', + 'aws/collections/compute/awsImages', + 'aws/collections/compute/awsAvailabilityZones', + 'aws/collections/compute/awsFlavors', + 'aws/collections/compute/awsKeyPairs', + 'aws/collections/compute/awsSecurityGroups', 'icanhaz', 'common', 'jquery.multiselect', diff --git a/js/aws/views/compute/awsSpotPriceHistoryView.js b/js/aws/views/compute/awsSpotPriceHistoryView.js index 703f4d51..39eec0cd 100644 --- a/js/aws/views/compute/awsSpotPriceHistoryView.js +++ b/js/aws/views/compute/awsSpotPriceHistoryView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/compute/awsSpotPriceHistoryTemplate.html', - '/js/aws/collections/compute/awsSpotPrices.js', - '/js/aws/collections/compute/awsFlavors.js', - '/js/aws/collections/compute/awsAvailabilityZones.js', + 'aws/collections/compute/awsSpotPrices', + 'aws/collections/compute/awsFlavors', + 'aws/collections/compute/awsAvailabilityZones', 'morris', 'common', 'jquery.multiselect', diff --git a/js/aws/views/compute/awsSpotinstancesAppView.js b/js/aws/views/compute/awsSpotinstancesAppView.js index 0f9ef132..6a173d99 100644 --- a/js/aws/views/compute/awsSpotinstancesAppView.js +++ b/js/aws/views/compute/awsSpotinstancesAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/compute/awsSpotInstanceAppTemplate.html', - '/js/aws/models/compute/awsSpotInstanceRequest.js', - '/js/aws/collections/compute/awsSpotInstanceRequests.js', - '/js/aws/views/compute/awsSpotInstanceCreateView.js', - '/js/aws/views/compute/awsSpotPriceHistoryView.js', + 'aws/models/compute/awsSpotInstanceRequest', + 'aws/collections/compute/awsSpotInstanceRequests', + 'aws/views/compute/awsSpotInstanceCreateView', + 'aws/views/compute/awsSpotPriceHistoryView', 'icanhaz', 'common', 'jquery.dataTables' @@ -59,6 +59,11 @@ define([ 'click #resource_table tr': 'clickOne' }, + actions: [ + { text: "Price History", type: "table", id: "price_history_button" }, + { text: "Cancel", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -66,7 +71,9 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + + this.loadData({ render: true }); var spotInstanceApp = this; Common.vent.on("spotInstanceAppRefresh", function() { diff --git a/js/aws/views/compute/awsTagsAppView.js b/js/aws/views/compute/awsTagsAppView.js index 1ecf5f00..03db4726 100644 --- a/js/aws/views/compute/awsTagsAppView.js +++ b/js/aws/views/compute/awsTagsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/compute/awsTagsAppTemplate.html', - '/js/aws/models/compute/awsTag.js', - '/js/aws/collections/compute/awsTags.js', - '/js/aws/views/compute/awsKeyPairCreateView.js', + 'aws/models/compute/awsTag', + 'aws/collections/compute/awsTags', + 'aws/views/compute/awsKeyPairCreateView', 'icanhaz', 'common', 'jquery.dataTables' @@ -39,7 +39,7 @@ define([ columns: ["key","value","resource_id", "resource_type"], - idColumnNumber: 1, + idColumnNumber: 0, model: Keypair, @@ -57,6 +57,10 @@ define([ 'click #resource_table tr': "clickOne" }, + actions: [ + { text: "Delete Key Pair", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -64,7 +68,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({ render: true }); var keyPairApp = this; Common.vent.on("keyPairAppRefresh", function() { diff --git a/js/aws/views/dns/awsHostedZoneCreateView.js b/js/aws/views/dns/awsHostedZoneCreateView.js index 7889b130..24f6c0fb 100644 --- a/js/aws/views/dns/awsHostedZoneCreateView.js +++ b/js/aws/views/dns/awsHostedZoneCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/dns/awsHostedZoneCreateTemplate.html', - '/js/aws/models/dns/awsHostedZone.js', + 'aws/models/dns/awsHostedZone', 'common' ], function( $, _, Backbone, DialogView, hostedZoneCreateTemplate, HostedZone, Common ) { diff --git a/js/aws/views/dns/awsHostedzonesAppView.js b/js/aws/views/dns/awsHostedzonesAppView.js index 3f985b47..274e37fe 100644 --- a/js/aws/views/dns/awsHostedzonesAppView.js +++ b/js/aws/views/dns/awsHostedzonesAppView.js @@ -11,13 +11,13 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/dns/awsHostedZoneAppTemplate.html', - '/js/aws/models/dns/awsHostedZone.js', - '/js/aws/collections/dns/awsHostedZones.js', - '/js/aws/models/dns/awsRecordSet.js', - '/js/aws/collections/dns/awsRecordSets.js', - '/js/aws/views/dns/awsHostedZoneCreateView.js', + 'aws/models/dns/awsHostedZone', + 'aws/collections/dns/awsHostedZones', + 'aws/models/dns/awsRecordSet', + 'aws/collections/dns/awsRecordSets', + 'aws/views/dns/awsHostedZoneCreateView', 'views/resource/resourceRowView', - '/js/aws/views/dns/awsRecordSetCreateView.js', + 'aws/views/dns/awsRecordSetCreateView', 'icanhaz', 'common', 'jquery.dataTables' @@ -58,11 +58,18 @@ define([ 'click #record_set_action_menu ul li': 'performRecordSetAction' }, + createText: "Create Hosted Zone", + + actions: [ + { text: "Delete Hosted Zone", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; } - this.render(); + this.$el.html(this.template); + this.loadData({ render: true }); var hostedZoneApp = this; Common.vent.on("hostedZoneAppRefresh", function() { diff --git a/js/aws/views/dns/awsRecordSetCreateView.js b/js/aws/views/dns/awsRecordSetCreateView.js index e9e7abd7..0bc46e2f 100644 --- a/js/aws/views/dns/awsRecordSetCreateView.js +++ b/js/aws/views/dns/awsRecordSetCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/dns/awsRecordSetCreateTemplate.html', - '/js/aws/models/dns/awsRecordSet.js', + 'aws/models/dns/awsRecordSet', 'common' ], function( $, _, Backbone, DialogView, recordSetCreateTemplate, RecordSet, Common ) { diff --git a/js/aws/views/iam/awsAddUsersToGroupView.js b/js/aws/views/iam/awsAddUsersToGroupView.js index 2b89274e..8478a4cd 100644 --- a/js/aws/views/iam/awsAddUsersToGroupView.js +++ b/js/aws/views/iam/awsAddUsersToGroupView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/iam/awsAddUsersToGroupTemplate.html', - '/js/aws/models/iam/awsGroup.js', - '/js/aws/collections/iam/awsUsers.js', + 'aws/models/iam/awsGroup', + 'aws/collections/iam/awsUsers', 'common' ], function( $, _, Backbone, DialogView, addUsersToGroupTemplate, Group, Users, Common ) { diff --git a/js/aws/views/iam/awsGroupCreateView.js b/js/aws/views/iam/awsGroupCreateView.js index be407dcc..f106d3c7 100644 --- a/js/aws/views/iam/awsGroupCreateView.js +++ b/js/aws/views/iam/awsGroupCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/iam/awsGroupCreateTemplate.html', - '/js/aws/models/iam/awsGroup.js', + 'aws/models/iam/awsGroup', 'common' ], function( $, _, Backbone, DialogView, groupCreateTemplate, Group, Common ) { diff --git a/js/aws/views/iam/awsGroupsAppView.js b/js/aws/views/iam/awsGroupsAppView.js index 81e9009e..73e37307 100644 --- a/js/aws/views/iam/awsGroupsAppView.js +++ b/js/aws/views/iam/awsGroupsAppView.js @@ -11,11 +11,11 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/iam/awsGroupAppTemplate.html', - '/js/aws/models/iam/awsGroup.js', - '/js/aws/collections/iam/awsGroups.js', - '/js/aws/collections/iam/awsGroupUsers.js', - '/js/aws/views/iam/awsGroupCreateView.js', - '/js/aws/views/iam/awsAddUsersToGroupView.js', + 'aws/models/iam/awsGroup', + 'aws/collections/iam/awsGroups', + 'aws/collections/iam/awsGroupUsers', + 'aws/views/iam/awsGroupCreateView', + 'aws/views/iam/awsAddUsersToGroupView', 'icanhaz', 'common' ], function( $, _, Backbone, ResourceAppView, GroupAppTemplate, Group, Groups, GroupUsers, GroupCreateView, AddUsersToGroupView, ich, Common ) { @@ -52,11 +52,16 @@ define([ 'click #add_users_to_group_button': 'addUsersToGroup' }, + actions: [ + { text: "Delete Group", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; } - this.render(); + this.$el.html(this.template); + this.loadData({ render: true }); var groupApp = this; Common.vent.off("groupAppRefresh"); diff --git a/js/aws/views/iam/awsUserCreateView.js b/js/aws/views/iam/awsUserCreateView.js index 7790e2b4..25679b07 100644 --- a/js/aws/views/iam/awsUserCreateView.js +++ b/js/aws/views/iam/awsUserCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/iam/awsUserCreateTemplate.html', - '/js/aws/models/iam/awsUser.js', + 'aws/models/iam/awsUser', 'common' ], function( $, _, Backbone, DialogView, userCreateTemplate, User, Common ) { diff --git a/js/aws/views/iam/awsUsersAppView.js b/js/aws/views/iam/awsUsersAppView.js index a1f31985..df5b53c7 100644 --- a/js/aws/views/iam/awsUsersAppView.js +++ b/js/aws/views/iam/awsUsersAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/iam/awsUserAppTemplate.html', - '/js/aws/models/iam/awsUser.js', - '/js/aws/collections/iam/awsUsers.js', - '/js/aws/views/iam/awsUserCreateView.js', - '/js/aws/views/iam/awsUserKeyDisplayView.js', + 'aws/models/iam/awsUser', + 'aws/collections/iam/awsUsers', + 'aws/views/iam/awsUserCreateView', + 'aws/views/iam/awsUserKeyDisplayView', 'icanhaz', 'common' ], function( $, _, Backbone, ResourceAppView, UserAppTemplate, User, Users, UserCreateView, UserDisplayKeyView, ich, Common ) { @@ -46,6 +46,10 @@ define([ 'click #resource_table tr': "clickOne" }, + actions: [ + { text: "Delete User", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -53,7 +57,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({ render: true }); var userApp = this; Common.vent.off("userAppRefresh"); diff --git a/js/aws/views/load_balancer/awsLoadBalancerCreateView.js b/js/aws/views/load_balancer/awsLoadBalancerCreateView.js index 000afa21..62f24209 100644 --- a/js/aws/views/load_balancer/awsLoadBalancerCreateView.js +++ b/js/aws/views/load_balancer/awsLoadBalancerCreateView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/load_balancer/awsLoadBalancerCreateTemplate.html', - '/js/aws/models/load_balancer/awsLoadBalancer.js', - '/js/aws/collections/vpc/awsVpcs.js', - '/js/aws/collections/vpc/awsSubnets.js', - '/js/aws/collections/compute/awsAvailabilityZones.js', + 'aws/models/load_balancer/awsLoadBalancer', + 'aws/collections/vpc/awsVpcs', + 'aws/collections/vpc/awsSubnets', + 'aws/collections/compute/awsAvailabilityZones', 'common', 'jquery.multiselect', 'jquery.multiselect.filter', diff --git a/js/aws/views/load_balancer/awsLoadbalancersAppView.js b/js/aws/views/load_balancer/awsLoadbalancersAppView.js index 6b18c9b6..cc67f706 100644 --- a/js/aws/views/load_balancer/awsLoadbalancersAppView.js +++ b/js/aws/views/load_balancer/awsLoadbalancersAppView.js @@ -12,13 +12,13 @@ define([ 'views/resource/resourceAppView', 'views/resource/resourceRowView', 'text!templates/aws/load_balancer/awsLoadBalancerAppTemplate.html', - '/js/aws/models/load_balancer/awsLoadBalancer.js', - '/js/aws/collections/load_balancer/awsLoadBalancers.js', - '/js/aws/views/load_balancer/awsLoadBalancerCreateView.js', - '/js/aws/views/load_balancer/awsRegisterInstancesView.js', - '/js/aws/views/load_balancer/awsManageAvailabilityZonesView.js', - '/js/aws/collections/load_balancer/awsListeners.js', - '/js/aws/collections/cloud_watch/awsMetricStatistics.js', + 'aws/models/load_balancer/awsLoadBalancer', + 'aws/collections/load_balancer/awsLoadBalancers', + 'aws/views/load_balancer/awsLoadBalancerCreateView', + 'aws/views/load_balancer/awsRegisterInstancesView', + 'aws/views/load_balancer/awsManageAvailabilityZonesView', + 'aws/collections/load_balancer/awsListeners', + 'aws/collections/cloud_watch/awsMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', @@ -75,6 +75,10 @@ define([ 'click #manage_availability_zones_button' : 'manageAvailabilityZones' }, + actions: [ + { text: "Delete Load Balancer", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -82,7 +86,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({ render: true }); var loadBalancerApp = this; Common.vent.on("loadBalancerAppRefresh", function() { diff --git a/js/aws/views/load_balancer/awsManageAvailabilityZonesView.js b/js/aws/views/load_balancer/awsManageAvailabilityZonesView.js index 8174e0cb..53faeac5 100644 --- a/js/aws/views/load_balancer/awsManageAvailabilityZonesView.js +++ b/js/aws/views/load_balancer/awsManageAvailabilityZonesView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/load_balancer/awsManageAvailabilityZonesTemplate.html', - '/js/aws/collections/compute/awsAvailabilityZones.js', + 'aws/collections/compute/awsAvailabilityZones', 'common' ], function( $, _, Backbone, DialogView, manageAvailabilityZones, AvailabilityZones, Common ) { diff --git a/js/aws/views/load_balancer/awsRegisterInstancesView.js b/js/aws/views/load_balancer/awsRegisterInstancesView.js index 884de8fe..fc3e3a05 100644 --- a/js/aws/views/load_balancer/awsRegisterInstancesView.js +++ b/js/aws/views/load_balancer/awsRegisterInstancesView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/load_balancer/awsRegisterInstancesTemplate.html', - '/js/aws/collections/compute/awsInstances.js', + 'aws/collections/compute/awsInstances', 'common' ], function( $, _, Backbone, DialogView, registerInstancesTemplate, Instances, Common ) { diff --git a/js/aws/views/notification/awsSubscriptionCreateView.js b/js/aws/views/notification/awsSubscriptionCreateView.js index 10d1f076..aed82c89 100644 --- a/js/aws/views/notification/awsSubscriptionCreateView.js +++ b/js/aws/views/notification/awsSubscriptionCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/notification/awsSubscriptionCreateTemplate.html', - '/js/aws/models/notification/awsSubscription.js', + 'aws/models/notification/awsSubscription', 'common' ], function( $, _, Backbone, DialogView, subscriptionCreateTemplate, Subscription, Common ) { diff --git a/js/aws/views/notification/awsTopicsAppView.js b/js/aws/views/notification/awsTopicsAppView.js index 225268b3..aba64c1e 100644 --- a/js/aws/views/notification/awsTopicsAppView.js +++ b/js/aws/views/notification/awsTopicsAppView.js @@ -12,13 +12,13 @@ define([ 'views/resource/resourceAppView', 'views/resource/resourceRowView', 'text!templates/aws/notification/awsTopicAppTemplate.html', - '/js/aws/models/notification/awsTopic.js', - '/js/aws/collections/notification/awsTopics.js', - '/js/aws/collections/notification/awsSubscriptions.js', - '/js/aws/views/notification/awsTopicsCreateView.js', - '/js/aws/views/notification/awsPublishToTopicView.js', - '/js/aws/views/notification/awsTopicDisplayNameEditView.js', - '/js/aws/views/notification/awsSubscriptionCreateView.js', + 'aws/models/notification/awsTopic', + 'aws/collections/notification/awsTopics', + 'aws/collections/notification/awsSubscriptions', + 'aws/views/notification/awsTopicsCreateView', + 'aws/views/notification/awsPublishToTopicView', + 'aws/views/notification/awsTopicDisplayNameEditView', + 'aws/views/notification/awsSubscriptionCreateView', 'icanhaz', 'common' ], function( $, _, Backbone, ResourceAppView, ResourceRowView, awsTopicAppTemplate, Topic, Topics, Subscriptions, AwsTopicCreate, PublishToTopic, EditTopicDisplayName, SuscriptionCreate, ich, Common ) { @@ -58,6 +58,12 @@ define([ 'click #delete_subscription_button': 'deleteSubscription' }, + actions: [ + { text: "Publish to this Topic", type: "row" }, + { text: "Delete Topic", type: "row" }, + { text: "Edit Topic Display Name", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -65,7 +71,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({ render: true }); var topicApp = this; Common.vent.on("topicAppRefresh", function() { diff --git a/js/aws/views/notification/awsTopicsCreateView.js b/js/aws/views/notification/awsTopicsCreateView.js index aea5bbae..e7974458 100644 --- a/js/aws/views/notification/awsTopicsCreateView.js +++ b/js/aws/views/notification/awsTopicsCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/notification/awsTopicCreateTemplate.html', - '/js/aws/models/notification/awsTopic.js', + 'aws/models/notification/awsTopic', 'common' ], function( $, _, Backbone, DialogView, topicCreateTemplate, Topic, Common ) { diff --git a/js/aws/views/object_storage/awsBucketCreateView.js b/js/aws/views/object_storage/awsBucketCreateView.js index 8f9ce957..94860fa2 100644 --- a/js/aws/views/object_storage/awsBucketCreateView.js +++ b/js/aws/views/object_storage/awsBucketCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/object_storage/awsBucketCreateTemplate.html', - '/js/aws/models/object_storage/awsBucket.js', + 'aws/models/object_storage/awsBucket', 'common' ], function( $, _, Backbone, DialogView, bucketCreateTemplate, Bucket, Common ) { diff --git a/js/aws/views/object_storage/awsBucketsAppView.js b/js/aws/views/object_storage/awsBucketsAppView.js index 93f2fe03..d7b5ebde 100644 --- a/js/aws/views/object_storage/awsBucketsAppView.js +++ b/js/aws/views/object_storage/awsBucketsAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/object_storage/awsBucketAppTemplate.html', - '/js/aws/models/object_storage/awsBucket.js', - '/js/aws/collections/object_storage/awsBuckets.js', - '/js/aws/views/object_storage/awsBucketCreateView.js', - '/js/aws/collections/object_storage/awsFiles.js', + 'aws/models/object_storage/awsBucket', + 'aws/collections/object_storage/awsBuckets', + 'aws/views/object_storage/awsBucketCreateView', + 'aws/collections/object_storage/awsFiles', 'views/resource/resourceRowView', 'icanhaz', 'common', @@ -72,6 +72,10 @@ define([ 'click #object_action_menu ul li': 'performObjectAction' }, + actions: [ + { text: "Delete", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -79,8 +83,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); - + this.$el.html(this.template); + this.loadData({ render: true }); var objectStorageApp = this; Common.vent.on("objectStorageAppRefresh", function() { objectStorageApp.render(); diff --git a/js/aws/views/queue/awsQueueCreateView.js b/js/aws/views/queue/awsQueueCreateView.js index 0450f139..a75c078b 100644 --- a/js/aws/views/queue/awsQueueCreateView.js +++ b/js/aws/views/queue/awsQueueCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/queue/awsQueueCreateTemplate.html', - '/js/aws/models/queue/awsQueue.js', + 'aws/models/queue/awsQueue', 'common' ], function( $, _, Backbone, DialogView, queueCreateTemplate, Queue, Common ) { diff --git a/js/aws/views/queue/awsQueuesAppView.js b/js/aws/views/queue/awsQueuesAppView.js index 36094b5f..421ff59c 100644 --- a/js/aws/views/queue/awsQueuesAppView.js +++ b/js/aws/views/queue/awsQueuesAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/queue/awsQueueAppTemplate.html', - '/js/aws/models/queue/awsQueue.js', - '/js/aws/collections/queue/awsQueues.js', - '/js/aws/views/queue/awsQueueCreateView.js', + 'aws/models/queue/awsQueue', + 'aws/collections/queue/awsQueues', + 'aws/views/queue/awsQueueCreateView', 'icanhaz', 'common' ], function( $, _, Backbone, ResourceAppView, queueAppTemplate, Queue, Queues, QueueCreateView, ich, Common ) { @@ -45,6 +45,10 @@ define([ 'click #resource_table tr': "clickOne" }, + actions: [ + { text: "Delete Queue", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -52,7 +56,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({ render : true }); var userApp = this; Common.vent.off("queueAppRefresh"); diff --git a/js/aws/views/rds/awsParameterGroupCreateView.js b/js/aws/views/rds/awsParameterGroupCreateView.js index ff716630..658e230b 100644 --- a/js/aws/views/rds/awsParameterGroupCreateView.js +++ b/js/aws/views/rds/awsParameterGroupCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/rds/awsParameterGroupCreateTemplate.html', - '/js/aws/models/rds/awsDBParameterGroup.js', + 'aws/models/rds/awsDBParameterGroup', 'icanhaz', 'common' diff --git a/js/aws/views/rds/awsParametergroupsAppView.js b/js/aws/views/rds/awsParametergroupsAppView.js index e6489ceb..e7f8c832 100644 --- a/js/aws/views/rds/awsParametergroupsAppView.js +++ b/js/aws/views/rds/awsParametergroupsAppView.js @@ -12,9 +12,9 @@ define([ 'views/featureNotImplementedView', 'views/resource/resourceAppView', 'text!templates/aws/rds/awsParameterGroupAppTemplate.html', - '/js/aws/models/rds/awsDBParameterGroup.js', - '/js/aws/collections/rds/awsDBParameterGroups.js', - '/js/aws/views/rds/awsParameterGroupCreateView.js', + 'aws/models/rds/awsDBParameterGroup', + 'aws/collections/rds/awsDBParameterGroups', + 'aws/views/rds/awsParameterGroupCreateView', 'icanhaz', 'common', 'jquery.dataTables' @@ -47,6 +47,10 @@ define([ 'click #resource_table tr': 'clickOne' }, + actions: [ + { text: "Delete", type: "row"} + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -54,7 +58,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({ render: true }); var cacheApp = this; Common.vent.on("parameterGroupAppRefresh", function() { diff --git a/js/aws/views/rds/awsRelationalDatabaseCreateView.js b/js/aws/views/rds/awsRelationalDatabaseCreateView.js index 9c551bcf..ecf94a60 100644 --- a/js/aws/views/rds/awsRelationalDatabaseCreateView.js +++ b/js/aws/views/rds/awsRelationalDatabaseCreateView.js @@ -11,11 +11,11 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/rds/awsRelationalDatabaseCreateTemplate.html', - '/js/aws/models/rds/awsRelationalDatabase.js', - '/js/aws/collections/rds/awsDBEngineVersions.js', - '/js/aws/collections/rds/awsDBParameterGroups.js', - '/js/aws/collections/rds/awsDBSecurityGroups.js', - '/js/aws/collections/compute/awsAvailabilityZones.js', + 'aws/models/rds/awsRelationalDatabase', + 'aws/collections/rds/awsDBEngineVersions', + 'aws/collections/rds/awsDBParameterGroups', + 'aws/collections/rds/awsDBSecurityGroups', + 'aws/collections/compute/awsAvailabilityZones', 'common', 'jquery.multiselect', 'jquery.multiselect.filter' diff --git a/js/aws/views/rds/awsRelationaldatabasesAppView.js b/js/aws/views/rds/awsRelationaldatabasesAppView.js index 006917a8..b07aa192 100644 --- a/js/aws/views/rds/awsRelationaldatabasesAppView.js +++ b/js/aws/views/rds/awsRelationaldatabasesAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/rds/awsRelationalDatabaseAppTemplate.html', - '/js/aws/models/rds/awsRelationalDatabase.js', - '/js/aws/collections/rds/awsRelationalDatabases.js', - '/js/aws/views/rds/awsRelationalDatabaseCreateView.js', - '/js/aws/collections/cloud_watch/awsMetricStatistics.js', + 'aws/models/rds/awsRelationalDatabase', + 'aws/collections/rds/awsRelationalDatabases', + 'aws/views/rds/awsRelationalDatabaseCreateView', + 'aws/collections/cloud_watch/awsMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', @@ -78,6 +78,10 @@ define([ 'click #refresh_monitors_button': 'refreshMonitors' }, + actions: [ + { text: "Delete", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -85,7 +89,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({ render: true }); var rdsApp = this; Common.vent.on("rdsAppRefresh", function() { diff --git a/js/aws/views/rds/awsSecurityGroupCreateView.js b/js/aws/views/rds/awsSecurityGroupCreateView.js index 0e4adde1..d8abb556 100644 --- a/js/aws/views/rds/awsSecurityGroupCreateView.js +++ b/js/aws/views/rds/awsSecurityGroupCreateView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/compute/awsSecurityGroupCreateTemplate.html', - '/js/aws/models/rds/awsDBSecurityGroup.js', - '/js/aws/collections/vpc/awsVpcs.js', + 'aws/models/rds/awsDBSecurityGroup', + 'aws/collections/vpc/awsVpcs', 'icanhaz', 'common' diff --git a/js/aws/views/rds/awsSecuritygroupsAppView.js b/js/aws/views/rds/awsSecuritygroupsAppView.js index e89439fa..0b062513 100644 --- a/js/aws/views/rds/awsSecuritygroupsAppView.js +++ b/js/aws/views/rds/awsSecuritygroupsAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/cache/awsSecurityGroupAppTemplate.html', - '/js/aws/models/rds/awsDBSecurityGroup.js', - '/js/aws/collections/rds/awsDBSecurityGroups.js', - '/js/aws/views/rds/awsSecurityGroupCreateView.js', - '/js/aws/collections/compute/awsSecurityGroups.js', + 'aws/models/rds/awsDBSecurityGroup', + 'aws/collections/rds/awsDBSecurityGroups', + 'aws/views/rds/awsSecurityGroupCreateView', + 'aws/collections/compute/awsSecurityGroups', 'icanhaz', 'common', 'jquery.dataTables' @@ -62,6 +62,10 @@ define([ 'click .revoke-btn':'revokeRule' }, + actions: [ + { text: "Delete Security Group", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; @@ -69,7 +73,8 @@ define([ if(options.region) { this.region = options.region; } - this.render(); + this.$el.html(this.template); + this.loadData({ render: true }); var securityGroupApp = this; Common.vent.on("securityGroupAppRefresh", function() { diff --git a/js/aws/views/simple_db/awsSimpleDatabaseCreateView.js b/js/aws/views/simple_db/awsSimpleDatabaseCreateView.js index 53176064..3844950f 100644 --- a/js/aws/views/simple_db/awsSimpleDatabaseCreateView.js +++ b/js/aws/views/simple_db/awsSimpleDatabaseCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/simple_db/awsSimpleDBCreateTemplate.html', - '/js/aws/models/simple_db/awsSimpleDatabase.js', + 'aws/models/simple_db/awsSimpleDatabase', 'common' ], function( $, _, Backbone, DialogView, simpleDBCreateTemplate, SimpleDB, Common ) { diff --git a/js/aws/views/simple_db/awsSimpledatabasesAppView.js b/js/aws/views/simple_db/awsSimpledatabasesAppView.js index 679bfd22..9ba3949c 100644 --- a/js/aws/views/simple_db/awsSimpledatabasesAppView.js +++ b/js/aws/views/simple_db/awsSimpledatabasesAppView.js @@ -12,9 +12,9 @@ define([ 'views/resource/resourceAppView', 'views/resource/resourceRowView', 'text!templates/aws/simple_db/awsSimpleDBAppTemplate.html', - '/js/aws/models/simple_db/awsSimpleDatabase.js', - '/js/aws/collections/simple_db/awsSimpleDatabases.js', - '/js/aws/views/simple_db/awsSimpleDatabaseCreateView.js', + 'aws/models/simple_db/awsSimpleDatabase', + 'aws/collections/simple_db/awsSimpleDatabases', + 'aws/views/simple_db/awsSimpleDatabaseCreateView', 'icanhaz', 'common' ], function( $, _, Backbone, ResourceAppView, ResourceRowView, awsSimpleDBAppTemplate, SimpleDB, SimpleDBs, AwsSimpleDBCreate, ich, Common ) { @@ -46,6 +46,10 @@ define([ 'click #resource_table tr': "clickOne" }, + actions: [ + { text: "Delete Domain", type: "row" } + ], + initialize: function(options) { if(options.cred_id) { this.credentialId = options.cred_id; diff --git a/js/aws/views/vpc/awsAssociateDhcpOptionsView.js b/js/aws/views/vpc/awsAssociateDhcpOptionsView.js index 2885ef16..9127cf78 100644 --- a/js/aws/views/vpc/awsAssociateDhcpOptionsView.js +++ b/js/aws/views/vpc/awsAssociateDhcpOptionsView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/vpc/awsAssociateDhcpOptionsTemplate.html', - '/js/aws/models/vpc/awsVpc.js', - '/js/aws/collections/vpc/awsDhcpOptionsSets.js', + 'aws/models/vpc/awsVpc', + 'aws/collections/vpc/awsDhcpOptionsSets', 'common' ], function( $, _, Backbone, DialogView, associateDhcpOptionTemplate, Vpc, DhcpOptions, Common ) { diff --git a/js/aws/views/vpc/awsDhcpOptionsSetCreateView.js b/js/aws/views/vpc/awsDhcpOptionsSetCreateView.js index 87290ada..8b363ab6 100644 --- a/js/aws/views/vpc/awsDhcpOptionsSetCreateView.js +++ b/js/aws/views/vpc/awsDhcpOptionsSetCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/vpc/awsDhcpOptionsSetCreateTemplate.html', - '/js/aws/models/vpc/awsDhcpOptionsSet.js', + 'aws/models/vpc/awsDhcpOptionsSet', 'icanhaz', 'common', 'jquery.multiselect', diff --git a/js/aws/views/vpc/awsDhcpoptionsetsAppView.js b/js/aws/views/vpc/awsDhcpoptionsetsAppView.js index 31fe00a3..31a46efd 100644 --- a/js/aws/views/vpc/awsDhcpoptionsetsAppView.js +++ b/js/aws/views/vpc/awsDhcpoptionsetsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/vpc/awsDhcpOptionsSetAppTemplate.html', - '/js/aws/models/vpc/awsDhcpOptionsSet.js', - '/js/aws/collections/vpc/awsDhcpOptionsSets.js', - '/js/aws/views/vpc/awsDhcpOptionsSetCreateView.js', + 'aws/models/vpc/awsDhcpOptionsSet', + 'aws/collections/vpc/awsDhcpOptionsSets', + 'aws/views/vpc/awsDhcpOptionsSetCreateView', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/aws/views/vpc/awsInternetGatewayAttachView.js b/js/aws/views/vpc/awsInternetGatewayAttachView.js index 244ef8f9..63d6fcf8 100644 --- a/js/aws/views/vpc/awsInternetGatewayAttachView.js +++ b/js/aws/views/vpc/awsInternetGatewayAttachView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/vpc/awsInternetGatewayAttachTemplate.html', - '/js/aws/collections/vpc/awsVpcs.js', + 'aws/collections/vpc/awsVpcs', 'common' ], function( $, _, Backbone, DialogView, internetGatewayAttachTemplate, Vpcs, Common ) { diff --git a/js/aws/views/vpc/awsInternetGatewayCreateView.js b/js/aws/views/vpc/awsInternetGatewayCreateView.js index bae13ed2..f048b4b1 100644 --- a/js/aws/views/vpc/awsInternetGatewayCreateView.js +++ b/js/aws/views/vpc/awsInternetGatewayCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/vpc/awsInternetGatewayCreateTemplate.html', - '/js/aws/models/vpc/awsInternetGateway.js', + 'aws/models/vpc/awsInternetGateway', 'common' ], function( $, _, Backbone, DialogView, internetGatewayCreateTemplate, InternetGateway, Common ) { diff --git a/js/aws/views/vpc/awsInternetgatewaysAppView.js b/js/aws/views/vpc/awsInternetgatewaysAppView.js index 43a9cd3a..152544d0 100644 --- a/js/aws/views/vpc/awsInternetgatewaysAppView.js +++ b/js/aws/views/vpc/awsInternetgatewaysAppView.js @@ -11,11 +11,11 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/vpc/awsInternetGatewayAppTemplate.html', - '/js/aws/models/vpc/awsInternetGateway.js', - '/js/aws/collections/vpc/awsInternetGateways.js', - '/js/aws/views/vpc/awsInternetGatewayCreateView.js', - '/js/aws/views/vpc/awsInternetGatewayAttachView.js', - '/js/aws/views/vpc/awsInternetGatewayDetachView.js', + 'aws/models/vpc/awsInternetGateway', + 'aws/collections/vpc/awsInternetGateways', + 'aws/views/vpc/awsInternetGatewayCreateView', + 'aws/views/vpc/awsInternetGatewayAttachView', + 'aws/views/vpc/awsInternetGatewayDetachView', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/aws/views/vpc/awsNetworkAclCreateView.js b/js/aws/views/vpc/awsNetworkAclCreateView.js index f9de7909..6d4e0569 100644 --- a/js/aws/views/vpc/awsNetworkAclCreateView.js +++ b/js/aws/views/vpc/awsNetworkAclCreateView.js @@ -11,14 +11,15 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/vpc/awsNetworkAclCreateTemplate.html', - '/js/aws/models/vpc/awsNetworkAcl.js', + 'aws/collections/vpc/awsVpcs', + 'aws/models/vpc/awsNetworkAcl', 'icanhaz', 'common', 'jquery.multiselect', 'jquery.multiselect.filter' -], function( $, _, Backbone, DialogView, networkAclCreateTemplate, NetworkAcl, ich, Common ) { - +], function( $, _, Backbone, DialogView, networkAclCreateTemplate, Vpcs, NetworkAcl, ich, Common ) { + /** * NetworkAclCreateView is UI form to create compute. * @@ -28,26 +29,37 @@ define([ * @param {Object} initialization object. * @returns {Object} Returns a NetworkAclCreateView instance. */ - - var NetworkAclCreateView = DialogView.extend({ - - template: _.template(networkAclCreateTemplate), - // Delegated events for creating new instances, etc. - events: { - "dialogclose": "close" - }, + + var NetworkAclCreateView = DialogView.extend({ + + credentialId: undefined, + + region: undefined, + + vpcs: new Vpcs(), + + networkAcl: new NetworkAcl(), + + template: _.template(networkAclCreateTemplate), - initialize: function() { - //TODO - }, + // Delegated events for creating new instances, etc. + events: { + "dialogclose": "close" + }, - render: function() { - var createView = this; + initialize: function(options) { + //TODO + this.credentialId = options.cred_id; + this.region = options.region; + }, + + render: function() { + var createView = this; this.$el.html(this.template); this.$el.dialog({ autoOpen: true, - title: "Create Network ACL", + title: "Create Network Acl", width:500, minHeight: 150, resizable: false, @@ -60,17 +72,41 @@ define([ createView.cancel(); } } + }); - return this; - }, - - create: function() { - //Validate and create - this.$el.dialog('close'); - } + this.vpcs.on( 'reset', this.addAllVpcs, this ); + this.vpcs.fetch({ data: $.param({ cred_id: this.credentialId, region: this.region }), reset: true }); + }, + + addAllVpcs: function() { + $("#vpc_select").empty(); + this.vpcs.each(function(vpc) { + $("#vpc_select").append($("")); + }); + }, + + create: function() { + var networkAcl = this.networkAcl; + var options = {}; + var issue = false; + + //Validate and create + if($("#vpc_select").val !== null && $("#vpc_select").val() !== "") { + options.vpc_id = $("#vpc_select").val(); + }else { + issue = true; + } + + if(!issue) { + networkAcl.create(options, this.credentialId, this.region); + this.$el.dialog('close'); + }else { + Common.errorDialog("Invalid Request", "Please supply all required fields."); + } + } - }); + }); - return NetworkAclCreateView; + return NetworkAclCreateView; }); diff --git a/js/aws/views/vpc/awsNetworkaclsAppView.js b/js/aws/views/vpc/awsNetworkaclsAppView.js index 8f5f4631..38f6ec7e 100644 --- a/js/aws/views/vpc/awsNetworkaclsAppView.js +++ b/js/aws/views/vpc/awsNetworkaclsAppView.js @@ -9,67 +9,98 @@ define([ 'jquery', 'underscore', 'backbone', - 'views/featureNotImplementedView', 'views/resource/resourceAppView', 'text!templates/aws/vpc/awsNetworkAclAppTemplate.html', - '/js/aws/models/vpc/awsNetworkAcl.js', - '/js/aws/collections/vpc/awsNetworkAcls.js', - '/js/aws/views/vpc/awsNetworkAclCreateView.js', + 'aws/models/vpc/awsNetworkAcl', + 'aws/collections/vpc/awsNetworkAcls', + 'aws/views/vpc/awsNetworkAclCreateView', + 'views/featureNotImplementedDialogView', 'icanhaz', 'common', 'jquery.dataTables' -], function( $, _, Backbone, FeatureNotImplementedView, AppView, awsNetworkAclAppTemplate, NetworkAcl, NetworkAcls, AwsNetworkAclCreateView, ich, Common ) { - 'use strict'; +], function( $, _, Backbone, AppView, awsNetworkAclAppTemplate, NetworkAcl, NetworkAcls, awsNetworkAclCreateView, FeatureNotImplementedDialogView, ich, Common ) { + 'use strict'; - // Aws Application View - // ------------------------------ + // Aws NetworkAcl Application View + // ------------------------------ /** - * Aws AppView is UI view list of cloud items. + * AwsNetworkAclAppView is UI view list of cloud Network Acls. * - * @name AppView + * @name NetworkAclAppView * @constructor * @category Resources * @param {Object} initialization object. - * @returns {Object} Returns an AwsAppView instance. + * @returns {Object} Returns a AwsNetworkAclsAppView instance. */ - var AwsNetworkAclsAppView = AppView.extend({ - template: _.template(awsNetworkAclAppTemplate), - + var AwsNetworkAclsAppView = AppView.extend({ + template: _.template(awsNetworkAclAppTemplate), + modelStringIdentifier: "network_acl_id", - + model: NetworkAcl, - + idColumnNumber: 0, - columns: ["network_acl_id","vpc_id", "default"], + columns: ["network_acl_id", "vpc_id", "default"], collectionType: NetworkAcls, type: "vpc", - subtype: "networkAcls", + subtype: "networkacls", + + CreateView: awsNetworkAclCreateView, - CreateView: AwsNetworkAclCreateView, - events: { 'click .create_button': 'createNew', + 'click #action_menu ul li': 'performAction', 'click #resource_table tr': 'clickOne' }, - initialize: function() { + initialize: function(options) { + if(options.cred_id) { + this.credentialId = options.cred_id; + } + if(options.region) { + this.region = options.region; + } + + + var networkAclApp = this; + Common.vent.on("networkAclAppRefresh", function() { + networkAclApp.render(); + }); this.render(); }, - render: function() { - var featureNotImplemented = new FeatureNotImplementedView({feature_url: "https://github.com/TranscendComputing/StackStudio/issues/8", element: "#resource_app"}); - featureNotImplemented.render(); - }, - toggleActions: function(e) { //Disable any needed actions + this.networkAcl = this.collection.get(this.selectedId); + }, + + toggleButton: function(target, toggle){ + if(toggle === true){ + target.attr("disabled", true); + target.addClass("ui-state-disabled"); + }else{ + target.removeAttr("disabled"); + target.removeClass("ui-state-disabled"); + } + }, + + performAction: function(event) { + var networkAcl = this.networkAcl; + + switch(event.target.text) + { + case "Delete": + networkAcl.destroy(this.credentialId, this.region); + break; + } } - }); + + }); - return AwsNetworkAclsAppView; + return AwsNetworkAclsAppView; }); diff --git a/js/aws/views/vpc/awsRouteTableAssociateView.js b/js/aws/views/vpc/awsRouteTableAssociateView.js new file mode 100644 index 00000000..72513b1f --- /dev/null +++ b/js/aws/views/vpc/awsRouteTableAssociateView.js @@ -0,0 +1,111 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'views/dialogView', + 'text!templates/aws/vpc/awsRouteTableAssociateTemplate.html', + 'aws/collections/vpc/awsSubnets', + 'icanhaz', + 'common', + 'jquery.multiselect', + 'jquery.multiselect.filter' + +], function( $, _, Backbone, DialogView, routeTableAssociateTemplate, Subnets, ich, Common ) { + + /** + * RouteTableCreateView is UI form to create compute. + * + * @name RouteTableCreateView + * @constructor + * @category RouteTable + * @param {Object} initialization object. + * @returns {Object} Returns a RouteTableCreateView instance. + */ + + var RouteTableAssociateView = DialogView.extend({ + + credentialId: undefined, + + region: undefined, + + subnets: new Subnets(), + + template: _.template(routeTableAssociateTemplate), + + // Delegated events for creating new instances, etc. + events: { + "dialogclose": "close" + }, + + initialize: function(options) { + //TODO + this.credentialId = options.cred_id; + this.region = options.region; + this.routeTable = options.routeTable; + this.render(); + }, + + render: function() { + var createView = this; + this.$el.html(this.template); + + this.$el.dialog({ + autoOpen: true, + title: "Associate Route Table", + width:500, + minHeight: 150, + resizable: false, + modal: true, + buttons: { + Associate: function () { + createView.associate(); + }, + Cancel: function() { + createView.cancel(); + } + } + + }); + + this.subnets.on( 'reset', this.addAllSubnets, this ); + this.subnets.fetch({ data: $.param({ cred_id: this.credentialId, region: this.region }), reset: true }); + }, + + addAllSubnets: function() { + $("#subnet_select").empty(); + this.subnets.each(function(subnet) { + $("#subnet_select").append($("")); + }); + }, + + associate: function() { + var routeTable = this.routeTable; + var options = {}; + var issue = false; + + //Validate and create + if($("#subnet_select").val !== null && $("#subnet_select").val() !== "") { + options.subnet_id = $("#subnet_select").val(); + }else { + issue = true; + } + + if(!issue) { + routeTable.associate(options, this.credentialId, this.region); + this.$el.dialog('close'); + }else { + Common.errorDialog("Invalid Request", "Please supply all required fields."); + } + } + + }); + + return RouteTableAssociateView; +}); diff --git a/js/aws/views/vpc/awsRouteTableCreateView.js b/js/aws/views/vpc/awsRouteTableCreateView.js index e75f7563..965782ca 100644 --- a/js/aws/views/vpc/awsRouteTableCreateView.js +++ b/js/aws/views/vpc/awsRouteTableCreateView.js @@ -11,13 +11,14 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/vpc/awsRouteTableCreateTemplate.html', - '/js/aws/models/vpc/awsRouteTable.js', + 'aws/collections/vpc/awsVpcs', + 'aws/models/vpc/awsRouteTable', 'icanhaz', 'common', 'jquery.multiselect', 'jquery.multiselect.filter' -], function( $, _, Backbone, DialogView, routeTableCreateTemplate, RouteTable, ich, Common ) { +], function( $, _, Backbone, DialogView, routeTableCreateTemplate, Vpcs, RouteTable, ich, Common ) { /** * RouteTableCreateView is UI form to create compute. @@ -31,14 +32,25 @@ define([ var RouteTableCreateView = DialogView.extend({ + credentialId: undefined, + + region: undefined, + + vpcs: new Vpcs(), + + routeTable: new RouteTable(), + template: _.template(routeTableCreateTemplate), + // Delegated events for creating new instances, etc. events: { "dialogclose": "close" }, - initialize: function() { + initialize: function(options) { //TODO + this.credentialId = options.cred_id; + this.region = options.region; }, render: function() { @@ -60,14 +72,38 @@ define([ createView.cancel(); } } + }); - return this; + this.vpcs.on( 'reset', this.addAllVpcs, this ); + this.vpcs.fetch({ data: $.param({ cred_id: this.credentialId, region: this.region }), reset: true }); }, + addAllVpcs: function() { + $("#vpc_select").empty(); + this.vpcs.each(function(vpc) { + $("#vpc_select").append($("")); + }); + }, + create: function() { - //Validate and create - this.$el.dialog('close'); + var routeTable = this.routeTable; + var options = {}; + var issue = false; + + //Validate and create + if($("#vpc_select").val !== null && $("#vpc_select").val() !== "") { + options.vpc_id = $("#vpc_select").val(); + }else { + issue = true; + } + + if(!issue) { + routeTable.create(options, this.credentialId, this.region); + this.$el.dialog('close'); + }else { + Common.errorDialog("Invalid Request", "Please supply all required fields."); + } } }); diff --git a/js/aws/views/vpc/awsRoutetablesAppView.js b/js/aws/views/vpc/awsRoutetablesAppView.js index 86dde557..2ba397cf 100644 --- a/js/aws/views/vpc/awsRoutetablesAppView.js +++ b/js/aws/views/vpc/awsRoutetablesAppView.js @@ -9,16 +9,17 @@ define([ 'jquery', 'underscore', 'backbone', - 'views/featureNotImplementedView', 'views/resource/resourceAppView', 'text!templates/aws/vpc/awsRouteTableAppTemplate.html', - '/js/aws/models/vpc/awsRouteTable.js', - '/js/aws/collections/vpc/awsRouteTables.js', - '/js/aws/views/vpc/awsRouteTableCreateView.js', + 'aws/models/vpc/awsRouteTable', + 'aws/collections/vpc/awsRouteTables', + 'aws/views/vpc/awsRouteTableCreateView', + 'views/featureNotImplementedDialogView', + 'aws/views/vpc/awsRouteTableAssociateView', 'icanhaz', 'common', 'jquery.dataTables' -], function( $, _, Backbone, FeatureNotImplementedView, ResourceAppView, awsRouteTableAppTemplate, RouteTable, RouteTables, AwsRouteTableCreate, ich, Common ) { +], function( $, _, Backbone, AppView, awsRouteTableAppTemplate, RouteTable, RouteTables, awsRouteTableCreateView, FeatureNotImplementedDialogView, RouteTableAssociateView, ich, Common ) { 'use strict'; // Aws RouteTable Application View @@ -33,16 +34,16 @@ define([ * @param {Object} initialization object. * @returns {Object} Returns a AwsRouteTablesAppView instance. */ - var AwsRouteTablesAppView = ResourceAppView.extend({ + var AwsRouteTablesAppView = AppView.extend({ template: _.template(awsRouteTableAppTemplate), - modelStringIdentifier: "route_table_id", - - columns: ["vpc_id", "route_table_id"], - - idColumnNumber: 1, - + modelStringIdentifier: "id", + model: RouteTable, + + idColumnNumber: 0, + + columns: ["id", "vpc_id"], collectionType: RouteTables, @@ -50,24 +51,144 @@ define([ subtype: "routetables", - CreateView: AwsRouteTableCreate, + CreateView: awsRouteTableCreateView, events: { 'click .create_button': 'createNew', - 'click #resource_table tr': 'clickOne' + 'click #action_menu ul li': 'performAction', + 'click .add-button': 'featureNotImplemented', //Remove when feture is implemented. + 'click #resource_table tr': 'clickOne', + 'click #add_association_button' : 'addAssociation', + 'click #associations_table tr': 'selectTableRow', + 'click #remove_association_button' : 'removeAssociation' }, - initialize: function() { + initialize: function(options) { + if(options.cred_id) { + this.credentialId = options.cred_id; + } + if(options.region) { + this.region = options.region; + } + + + var routeTableApp = this; + Common.vent.on("routeTableAppRefresh", function() { + routeTableApp.render(); + }); this.render(); }, - render: function() { - var featureNotImplemented = new FeatureNotImplementedView({feature_url: "https://github.com/TranscendComputing/StackStudio/issues/8", element: "#resource_app"}); - featureNotImplemented.render(); - }, - toggleActions: function(e) { //Disable any needed actions + this.routeTable = this.collection.get(this.selectedId); + this.addTableDetails(); + this.addAllTableElements(); + this.toggleButton($(".remove-button"),true); + }, + + addTableDetails: function(){ + var model = this.routeTable; + if(model.attributes.associations.length > 0){ + var count = 0; + var totalsubnets = 0; + $.each(model.attributes.associations, function(j,association){ + if(association.main === true){ + count++; + } + if(association.subnetId){ + totalsubnets++; + } + }); + if(count > 0){ + $("#main_route_table_info").text("True"); + }else{ + $("#main_route_table_info").text("False"); + } + $("#subnet_association_info").text(totalsubnets.toString()); + } + // }); + }, + + toggleButton: function(target, toggle){ + if(toggle === true){ + target.attr("disabled", true); + target.addClass("ui-state-disabled"); + }else{ + target.removeAttr("disabled"); + target.removeClass("ui-state-disabled"); + } + }, + + addAllTableElements: function(){ + var model = this.routeTable; + if(model.attributes.length !== 0){ + $(".sub-route-table").dataTable().fnClearTable(); + $.each(model.attributes, function(attribute,value) { + if(attribute === "routes"){ + $.each(value,function(i,route){ + var rowData = [route.destinationCidrBlock,route.gatewayId,route.state]; + $("#routes_table").dataTable().fnAddData(rowData); + }); + } + else if(attribute === "associations"){ + $.each(value,function(i,association){ + var hasSubnet = "none"; + if(association.subnetId){ + hasSubnet = association.subnetId; + } + var rowData = [association.routeTableAssociationId,association.routeTableId,hasSubnet,association.main]; + $("#associations_table").dataTable().fnAddData(rowData); + }); + } + else if(attribute === "propagating_vpn"){ + $.each(value,function(i,propagation){ + var rowData = [propagation.vpc_id]; + $("#route_propagation_table").dataTable().fnAddData(rowData); + }); + } + }); + } + }, + + performAction: function(event) { + var routeTable = this.routeTable; + + switch(event.target.text) + { + case "Delete": + routeTable.destroy(this.credentialId, this.region); + break; + } + }, + + addAssociation: function(event) { + var thisView = this; + + new RouteTableAssociateView({routeTable: thisView.routeTable, cred_id: thisView.credentialId , region: thisView.region}); + }, + + removeAssociation: function(event) { + var thisView = this; + var selectedRow = $(".sub-route-table .row_selected"); + var associationsTable = selectedRow.parents("table").dataTable(); + var associationId = associationsTable.fnGetData(selectedRow[0])[0]; + + this.routeTable.disassociate({association_id: associationId}, thisView.credentialId, thisView.region ); + }, + + selectTableRow: function(event){ + var target = event.currentTarget; + + $(".sub-route-table tr").removeClass('row_selected'); + $(target).addClass('row_selected'); + this.toggleButton($("#remove_association_button"),false); + }, + + //Remove once features have been implemented. + featureNotImplemented: function(){ + var thisView = this; + new FeatureNotImplementedDialogView({feature_url: "https://github.com/TranscendComputing/StackStudio/issues/11"}); } }); diff --git a/js/aws/views/vpc/awsSubnetCreateView.js b/js/aws/views/vpc/awsSubnetCreateView.js index 870aa75b..75acabc5 100644 --- a/js/aws/views/vpc/awsSubnetCreateView.js +++ b/js/aws/views/vpc/awsSubnetCreateView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/vpc/awsSubnetCreateTemplate.html', - '/js/aws/models/vpc/awsSubnet.js', - '/js/aws/collections/vpc/awsVpcs.js', - '/js/aws/collections/compute/awsAvailabilityZones.js', + 'aws/models/vpc/awsSubnet', + 'aws/collections/vpc/awsVpcs', + 'aws/collections/compute/awsAvailabilityZones', 'common' ], function( $, _, Backbone, DialogView, subnetCreateTemplate, Subnet, Vpcs, AvailabilityZones, Common ) { diff --git a/js/aws/views/vpc/awsSubnetsAppView.js b/js/aws/views/vpc/awsSubnetsAppView.js index 12adf64c..98ebe4ff 100644 --- a/js/aws/views/vpc/awsSubnetsAppView.js +++ b/js/aws/views/vpc/awsSubnetsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/vpc/awsSubnetAppTemplate.html', - '/js/aws/models/vpc/awsSubnet.js', - '/js/aws/collections/vpc/awsSubnets.js', - '/js/aws/views/vpc/awsSubnetCreateView.js', + 'aws/models/vpc/awsSubnet', + 'aws/collections/vpc/awsSubnets', + 'aws/views/vpc/awsSubnetCreateView', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/aws/views/vpc/awsVpcCreateView.js b/js/aws/views/vpc/awsVpcCreateView.js index 07356b81..47270402 100644 --- a/js/aws/views/vpc/awsVpcCreateView.js +++ b/js/aws/views/vpc/awsVpcCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/vpc/awsVpcCreateTemplate.html', - '/js/aws/models/vpc/awsVpc.js', + 'aws/models/vpc/awsVpc', 'icanhaz', 'common', 'jquery.multiselect', diff --git a/js/aws/views/vpc/awsVpcsAppView.js b/js/aws/views/vpc/awsVpcsAppView.js index 31d8f384..8fb093ba 100644 --- a/js/aws/views/vpc/awsVpcsAppView.js +++ b/js/aws/views/vpc/awsVpcsAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/vpc/awsVpcAppTemplate.html', - '/js/aws/models/vpc/awsVpc.js', - '/js/aws/collections/vpc/awsVpcs.js', - '/js/aws/views/vpc/awsVpcCreateView.js', - '/js/aws/views/vpc/awsAssociateDhcpOptionsView.js', + 'aws/models/vpc/awsVpc', + 'aws/collections/vpc/awsVpcs', + 'aws/views/vpc/awsVpcCreateView', + 'aws/views/vpc/awsAssociateDhcpOptionsView', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/collections/ansibleQueueItems.js b/js/collections/ansibleQueueItems.js index 16a1c97e..fa2cb909 100644 --- a/js/collections/ansibleQueueItems.js +++ b/js/collections/ansibleQueueItems.js @@ -24,7 +24,7 @@ define([ return model.get("stack_name"); }, fetch: function(options){ - options.data = $.paam({account_id:sessionStorage.accound_id}); + options.data = $.param({account_id:Common.account.id}); Backbone.Collection.prototype.fetch.apply(this, arguments); }, diff --git a/js/collections/appliances.js b/js/collections/appliances.js new file mode 100644 index 00000000..e93ddb9d --- /dev/null +++ b/js/collections/appliances.js @@ -0,0 +1,29 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2014 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true alert:true*/ +define([ + 'jquery', + 'backbone', + 'models/appliance', + 'common' +], function( $, Backbone, Appliance, Common) { + 'use strict'; + + var ApplianceList = Backbone.Collection.extend({ + + model: Appliance, + + url: function(options){ + // return Common.apiUrl + '/stackstudio/v1/appliances/org/' + sessionStorage.org_id; + return 'test/fixtures/meshes/appliances_list.json'; + } + + }); + + return ApplianceList; + +}); diff --git a/js/collections/assemblies.js b/js/collections/assemblies.js index 203d0a4b..65353213 100644 --- a/js/collections/assemblies.js +++ b/js/collections/assemblies.js @@ -26,7 +26,7 @@ define([ return model.get("name"); }, fetch: function(options){ - options.data = $.param({account_id:sessionStorage.account_id}); + options.data = $.param({account_id:Common.account.id}); Backbone.Collection.prototype.fetch.apply(this, arguments); }, diff --git a/js/collections/capsules.js b/js/collections/capsules.js new file mode 100644 index 00000000..02fed962 --- /dev/null +++ b/js/collections/capsules.js @@ -0,0 +1,29 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2014 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true alert:true*/ +define([ + 'jquery', + 'backbone', + 'models/capsule', + 'common' +], function( $, Backbone, Capsule, Common) { + 'use strict'; + + var CapsuleList = Backbone.Collection.extend({ + + model: Capsule, + + url: function(options){ + // return Common.apiUrl + '/stackstudio/v1/capsules/org/' + sessionStorage.org_id; + return 'test/fixtures/meshes/capsules_list.json'; + } + + }); + + return CapsuleList; + +}); diff --git a/js/collections/cloudCredentials.js b/js/collections/cloudCredentials.js index 381c76e3..9f0abff9 100644 --- a/js/collections/cloudCredentials.js +++ b/js/collections/cloudCredentials.js @@ -1,141 +1,135 @@ -/*! - * StackStudio 2.0.0-rc.1 - * (c) 2012 Transcend Computing - * Available under ASL2 license - */ -/*jshint smarttabs:true*/ -/*global define:true console:true alert:true*/ -define([ - 'jquery', - 'backbone', - 'models/cloudCredential', - 'common', - 'messenger' -], function( $, Backbone, CloudCredential, Common, Messenger ) { - 'use strict'; - - // Cloud Credential Collection - // --------------- - - var CloudCredentialList = Backbone.Collection.extend({ - - // Reference to this collection's model. - model: CloudCredential, - - /** - * Override Collection.fetch() because CloudCredentials are - * stored in session storage for a user when logged in (views/accountLoginView) - * @param {Object} options - * @return {nil} - */ - fetch: function(options) { - var cloudCreds = []; - if(sessionStorage.cloud_credentials) { - var cloudCredentials = JSON.parse(sessionStorage.cloud_credentials); - $.each(cloudCredentials, function(index, value) { - var cloudCred = new CloudCredential(value.cloud_credential); - cloudCreds.push(cloudCred); - }); - } - this.reset(cloudCreds); - - }, - /** - * Creates a new set of cloud credentials for the user - * @param {CloudCredential} model - * @param {Object} options - * @return {nil} - */ - create: function(model, options) { - Messenger.options = { - extraClasses: 'messenger-fixed messenger-on-bottom messenger-on-right', - theme: 'future' - }; - var coll = this; - var url = Common.apiUrl + "/identity/v1/accounts/" + sessionStorage.account_id + "/" + options.cloud_account_id + "/cloud_credentials"; - var cloudCredential = {"cloud_credential": model.attributes}; - new Messenger().run({ - errorMessage: "Unable to save credentials.", - successMessage: "Credentials saved.", - showCloseButton: true, - hideAfter: 2, - hideOnNavigate: true - },{ - url: url, - type: 'POST', - contentType: 'application/x-www-form-urlencoded', - dataType: 'json', - data: JSON.stringify(cloudCredential), - success: function(data) { - var cloudCreds = []; - sessionStorage.cloud_credentials = JSON.stringify(data.account.cloud_credentials); - var cloudCredentials = JSON.parse(sessionStorage.cloud_credentials); - $.each(cloudCredentials, function(index, value) { - var cloudCred = new CloudCredential(value.cloud_credential); - cloudCreds.push(cloudCred); - }); - coll.reset(cloudCreds); - Common.vent.trigger("cloudCredentialCreated"); - } - }, coll); - }, - /** - * Updates a users cloud credential - * @param {CloudCredential} model - * @param {Object} options - * @return {nil} - */ - update: function(model, options) { - var url = Common.apiUrl + "/identity/v1/accounts/" + sessionStorage.account_id + "/cloud_credentials/" + model.attributes.id + "?_method=PUT"; - var cloudCredential = {"cloud_credential": model.attributes}; - new Messenger().run({ - errorMessage: "Unable to save credentials.", - successMessage: "Credentials saved.", - showCloseButton: true, - hideAfter: 2, - hideOnNavigate: true - },{ - url: url, - type: 'POST', - contentType: 'application/x-www-form-urlencoded', - dataType: 'json', - data: JSON.stringify(cloudCredential), - success: function(data) { - sessionStorage.cloud_credentials = JSON.stringify(data.account.cloud_credentials); - Common.vent.trigger("cloudCredentialSaved"); - } - }); - }, - /** - * Deletes a users cloud credential - * @param {Model} cloudCredential - * @return {nil} - */ - deleteCredential: function(cloudCredential) { - var coll = this; - var url = Common.apiUrl + "/identity/v1/accounts/" + sessionStorage.account_id + "/cloud_credentials/" + cloudCredential.id + "?_method=DELETE"; - new Messenger().run({ - errorMessage: "Unable to delete credentials.", - successMessage: "Credentials deleted.", - showCloseButton: true, - hideAfter: 2, - hideOnNavigate: true - },{ - url: url, - type: 'POST', - dataType: 'json', - contentType: 'application/x-www-form-urlencoded', - success: function(data) { - sessionStorage.cloud_credentials = JSON.stringify(data.account.cloud_credentials); - coll.remove(cloudCredential); - Common.vent.trigger("cloudCredentialDeleted"); - } - }); - } - - - }); - - return CloudCredentialList; - -}); +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true*/ +/*global define:true console:true alert:true*/ +define( + [ + 'jquery', + 'backbone', + 'models/cloudCredential', + 'common', + 'messenger' + ], + function( $, Backbone, CloudCredential, Common, Messenger ) { + 'use strict'; + + var CloudCredentialList = Backbone.Collection.extend({ + + // Reference to this collection's model. + model: CloudCredential, + + /** + * Override Collection.fetch() because CloudCredentials are + * stored in session storage for a user when logged in (views/accountLoginView) + * @param {Object} options + * @return {nil} + */ + fetch: function(options) { + var cloudCreds = []; + if(Common.credentials) { + $.each(Common.credentials, function(index, value) { + var cloudCred = new CloudCredential(value.cloud_credential); + cloudCreds.push(cloudCred); + }); + } + this.reset(cloudCreds); + }, + + /** + * Creates a new set of cloud credentials for the user + * @param {CloudCredential} model + * @param {Object} options + * @return {nil} + */ + create: function(model, options) { + Messenger.options = { + extraClasses: 'messenger-fixed messenger-on-bottom messenger-on-right', + theme: 'future' + }; + var coll = this; + var url = Common.apiUrl + "/identity/v1/accounts/" + Common.account.id + "/" + options.cloud_account_id + "/cloud_credentials"; + var cloudCredential = {"cloud_credential": model.attributes}; + new Messenger().run({ + errorMessage: "Unable to save credentials.", + successMessage: "Credentials saved.", + showCloseButton: true, + hideAfter: 2, + hideOnNavigate: true + },{ + url: url, + type: 'POST', + contentType: 'application/x-www-form-urlencoded', + dataType: 'json', + data: JSON.stringify(cloudCredential), + success: function(data) { + Common.credentials = data.account.cloud_credentials; + coll.reset(data.account.cloud_credentials); + Common.vent.trigger("cloudCredentialCreated"); + }, + error: function(err, status) { + Common.errorDialog(err, status); + } + }, coll); + }, + + /** + * Updates a users cloud credential + * @param {CloudCredential} model + * @param {Object} options + * @return {nil} + */ + update: function(model, options) { + var url = Common.apiUrl + "/identity/v1/accounts/" + Common.account.id + "/cloud_credentials/" + model.attributes.id + "?_method=PUT"; + var cloudCredential = {"cloud_credential": model.attributes}; + new Messenger().run({ + errorMessage: "Unable to save credentials.", + successMessage: "Credentials saved.", + showCloseButton: true, + hideAfter: 2, + hideOnNavigate: true + },{ + url: url, + type: 'POST', + contentType: 'application/x-www-form-urlencoded', + dataType: 'json', + data: JSON.stringify(cloudCredential), + success: function(data) { + Common.credentials = data.account.cloud_credentials; + Common.vent.trigger("cloudCredentialSaved"); + } + }); + }, + + /** + * Deletes a users cloud credential + * @param {Model} cloudCredential + * @return {nil} + */ + deleteCredential: function(cloudCredential) { + var coll = this; + var url = Common.apiUrl + "/identity/v1/accounts/" + Common.account.id + "/cloud_credentials/" + cloudCredential.id + "?_method=DELETE"; + new Messenger().run({ + errorMessage: "Unable to delete credentials.", + successMessage: "Credentials deleted.", + showCloseButton: true, + hideAfter: 2, + hideOnNavigate: true + },{ + url: url, + type: 'POST', + dataType: 'json', + contentType: 'application/x-www-form-urlencoded', + success: function(data) { + Common.credentials = data.account.cloud_credentials; + coll.remove(cloudCredential); + Common.vent.trigger("cloudCredentialDeleted"); + } + }); + } + }); + + return CloudCredentialList; +}); diff --git a/js/collections/configManagers.js b/js/collections/configManagers.js index 28a9c13d..34374cf6 100644 --- a/js/collections/configManagers.js +++ b/js/collections/configManagers.js @@ -17,10 +17,10 @@ define([ model: ConfigManager, - url: function(options){return Common.apiUrl + '/api/v1/orchestration/managers/org/' + sessionStorage.org_id;} + url: function(options){return Common.apiUrl + '/api/v1/orchestration/managers/org/' + Common.account.org_id;} }); return ConfigManagerList; -}); \ No newline at end of file +}); diff --git a/js/collections/continuousIntegrationServers.js b/js/collections/continuousIntegrationServers.js index 72c4b8d3..058b04ea 100644 --- a/js/collections/continuousIntegrationServers.js +++ b/js/collections/continuousIntegrationServers.js @@ -17,7 +17,7 @@ define([ model: ContinuousIntegrationServer, - url: function(options){return Common.apiUrl + '/api/v1/continuous_integration_servers/org/' + sessionStorage.org_id;} + url: function(options){return Common.apiUrl + '/api/v1/continuous_integration_servers/org/' + Common.account.org_id;} }); diff --git a/js/collections/grids.js b/js/collections/grids.js new file mode 100644 index 00000000..0f36a0eb --- /dev/null +++ b/js/collections/grids.js @@ -0,0 +1,29 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2014 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true alert:true*/ +define([ + 'jquery', + 'backbone', + 'models/grid', + 'common' +], function( $, Backbone, Grid, Common) { + 'use strict'; + + var GridList = Backbone.Collection.extend({ + + model: Grid, + + url: function(options){ + // return Common.apiUrl + '/stackstudio/v1/grids/org/' + sessionStorage.org_id; + return 'test/fixtures/meshes/grids_list.json'; + } + + }); + + return GridList; + +}); diff --git a/js/collections/groups.js b/js/collections/groups.js index db7d2c32..08935179 100644 --- a/js/collections/groups.js +++ b/js/collections/groups.js @@ -17,7 +17,7 @@ define([ model: Group, - url: function(){return Common.apiUrl + '/identity/v1/orgs/' + sessionStorage.org_id + '.json';}, + url: function(){return Common.apiUrl + '/identity/v1/orgs/' + Common.account.org_id + '.json';}, parse: function(resp) { return resp.org.groups; diff --git a/js/collections/offerings.js b/js/collections/offerings.js index 24907cfc..8ccd779b 100644 --- a/js/collections/offerings.js +++ b/js/collections/offerings.js @@ -17,7 +17,7 @@ define([ model: Offering, - url: function(){return Common.apiUrl + '/stackstudio/v1/offerings/account/' + sessionStorage.account_id;} + url: function(){return Common.apiUrl + '/stackstudio/v1/offerings/account/' + Common.account.id;} }); diff --git a/js/collections/packedImages.js b/js/collections/packedImages.js index 47498685..19785256 100644 --- a/js/collections/packedImages.js +++ b/js/collections/packedImages.js @@ -17,7 +17,7 @@ define([ model: PackedImage, - url: function(){return Common.apiUrl + "/stackstudio/v1/packed_images/templates/"+ sessionStorage.org_id;} + url: function(){return Common.apiUrl + "/stackstudio/v1/packed_images/templates/"+ Common.account.org_id;} }); diff --git a/js/collections/portfolios.js b/js/collections/portfolios.js index c3e51436..5b07f96d 100644 --- a/js/collections/portfolios.js +++ b/js/collections/portfolios.js @@ -17,7 +17,7 @@ define([ model: Portfolio, - url: function(options){return Common.apiUrl + '/stackstudio/v1/portfolios/org/' + sessionStorage.org_id;} + url: function(options){return Common.apiUrl + '/stackstudio/v1/portfolios/org/' + Common.account.org_id;} }); diff --git a/js/collections/sourceControlRepositories.js b/js/collections/sourceControlRepositories.js index 83756a0f..c6ff596b 100644 --- a/js/collections/sourceControlRepositories.js +++ b/js/collections/sourceControlRepositories.js @@ -17,7 +17,7 @@ define([ model: SourceControlRepository, - url: function(options){return Common.apiUrl + '/api/v1/source_control_repositories/org/' + sessionStorage.org_id;} + url: function(options){return Common.apiUrl + '/api/v1/source_control_repositories/org/' + Common.account.org_id;} }); diff --git a/js/collections/stacks.js b/js/collections/stacks.js index 38f316a9..2e0b8947 100644 --- a/js/collections/stacks.js +++ b/js/collections/stacks.js @@ -14,13 +14,9 @@ define([ 'use strict'; var StackList = Backbone.Collection.extend({ - model: Stack, - - url: function(){return Common.apiUrl + '/stackstudio/v1/stacks/account/' + sessionStorage.account_id;} - + url: Common.apiUrl + '/stackstudio/v1/stacks/account/' //+ Common.account.id }); return StackList; - -}); \ No newline at end of file +}); diff --git a/js/collections/users.js b/js/collections/users.js index 7227c698..7fc392a6 100644 --- a/js/collections/users.js +++ b/js/collections/users.js @@ -18,7 +18,7 @@ define([ model: User, url: function(){ - return Common.apiUrl + '/identity/v1/orgs/' + sessionStorage.org_id + '.json'; + return Common.apiUrl + '/identity/v1/orgs/' + Common.account.org_id + '.json'; }, parse: function(resp) { diff --git a/js/common.js b/js/common.js index 64cea43d..94d042fd 100644 --- a/js/common.js +++ b/js/common.js @@ -3,157 +3,8 @@ * (c) 2012 Transcend Computing * Available under ASL2 license */ -// Configure defaults for require.js -requirejs.config({ - baseUrl: 'js/vendor', - nodeRequire: require, - // The shim config allows us to configure dependencies for - // scripts that do not call define() to register a module - shim: { - 'jquery-ui': { - deps: ['jquery'] - }, - 'underscore': { - exports: '_' - }, - 'backbone': { - deps: [ - 'underscore', - 'jquery' - ], - exports: 'Backbone' - }, - 'backbone.queryparams': { - deps: [ - 'backbone' - ] - }, - 'backbone.stickit': { - deps: [ - 'backbone', - 'underscore', - 'jquery' - ] - }, - 'backbone-validation': { - deps: [ - 'backbone', - 'jquery' - ] - }, - 'base64': { - exports: 'Base64' - }, - 'dataTables.bootstrap': { - deps: ['jquery.dataTables'] - }, - 'dataTables.fnReloadAjax': { - deps: ['jquery.dataTables'], - exports: 'fnReloadAjax' - }, - 'dataTables.fnProcessingIndicator': { - deps: ['jquery.dataTables'], - exports: 'fnProcessingIndicator' - }, - 'FeedEk': { - deps: ['jquery'] - }, - 'github': { - deps: ['base64', 'underscore'], - exports: 'Github' - }, - 'gh3': { - deps: ['underscore', 'jquery'], - exports: 'Gh3' - }, - 'icanhaz': { - deps: ['jquery'], - exports: 'ich' - }, - 'jquery.form': { - deps: ['jquery'] - }, - 'jquery.list': { - deps: ['jquery'] - }, - 'jquery.terminal': { - deps: ['jquery', 'jquery.mousewheel'], - exports: 'jQuery.fn.terminal' - }, - 'jquery.dataTables': { - deps: ['jquery'], - exports: 'jQuery.fn.dataTable' - }, - 'jquery.purr': { - deps: ['jquery'], - exports: 'jQuery.fn.purr' - }, - 'jquery.mousewheel': { - deps: ['jquery'], - exports: 'jQuery.fn.mousewheel' - }, - 'jquery.jstree': { - deps: ['jquery', 'jquery.cookie'], - exports: 'jQuery.fn.jstree' - }, - 'morris': { - deps: ['jquery', 'raphael'], - exports: 'Morris' - }, - 'messenger': { - exports: 'Messenger' - }, - 'raphael': { - deps: ['jquery'], - exports: 'Raphael' - }, - 'spinner': { - exports: 'Spinner' - }, - 'URIjs': { - - } - }, - paths: { - collections: '../collections', - models: '../models', - routers: '../routers', - views: '../views', - interpreters: '../interpreters', - templates: '../../templates', - wrappers: '../../wrappers', - 'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min', - 'jquery-ui': '//ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min', - 'underscore': '//cdnjs.cloudflare.com/ajax/libs/lodash.js/1.1.0/lodash.min', - 'backbone': '//cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min', - 'backbone.stickit': 'backbone.stickit.min', - 'backbone-validation': 'backbone-validation.min', - 'icanhaz': 'ICanHaz', - 'jquery.form': '//cdnjs.cloudflare.com/ajax/libs/jquery.form/3.45/jquery.form', - 'jquery.terminal': 'jquery.terminal', - 'jquery.mousewheel': 'jquery.mousewheel-min', - 'jquery.multiselect': '//cdn.jsdelivr.net/jquery.multiselect/1.13/jquery.multiselect.min', - 'jquery.multiselect.filter': '//cdn.jsdelivr.net/jquery.multiselect/1.13/jquery.multiselect.filter.min', - 'jquery.jstree': '//cdn.jsdelivr.net/jquery.jstree/pre1.0/jquery.jstree', - 'messenger': 'messenger.min', - 'raphael': 'raphael-min', - 'spinner': 'spin.min', - URIjs: 'URI', - 'bootstrap': '//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min', - 'typeahead': '../vendor/twitter/typeahead', - 'ace': '//cdnjs.cloudflare.com/ajax/libs/ace/1.1.01/ace', - 'mode-json': '//cdnjs.cloudflare.com/ajax/libs/ace/1.1.01/mode-json' - } -}); - -var URL_ARGS = URL_ARGS || ''; - -requirejs.config({ - urlArgs: URL_ARGS -}); - -/** +/* * This require block requires the core apps loaded by CDN, and fails back to * a local copy if not available (e.g. working disconnected). */ @@ -163,190 +14,250 @@ require( 'underscore', 'backbone', 'icanhaz', - 'jquery-ui' + 'jquery-ui', + 'jquery.jstree' ], - function ($, _, Backbone, ich) { - - }, - function (err) { - //The errback, error callback - //The error has a list of modules that failed + function() {}, + function(err) { + // The errback, error callback + // The error has a list of modules that failed for (var i = 0; err.requireModules && i < err.requireModules.length; i++) { var failedId = err.requireModules[i]; - if (failedId === 'jquery') { - // undef is function only on the global requirejs object. - // Use it to clear internal knowledge of jQuery. Any modules - // that were dependent on jQuery and in the middle of loading - // will not be loaded yet, they will wait until a valid jQuery - // does load. - requirejs.undef(failedId); - - // Set the path to jQuery to local path - console.log("Redirecting to local path."); - requirejs.config({ - paths: { - jquery: '../vendor/jquery' - } - }); + var offlineVendorPaths = { + 'jquery' : {'jquery' : 'js/vendor/jquery'}, + 'jquery-ui' : {'jquery-ui' : 'js/vendor/jquery-ui'}, + 'underscore' : {'underscore' : 'js/vendor/lodash'}, + 'icanhaz' : {'icanhaz' : 'js/vendor/ICanHaz'}, + 'backbone' : {'backbone' : 'js/vendor/backbone'}, + 'jquery.jstree' : {'jquery.jstree' : 'js/vendor/jquery.jstree'} + }; - // Try again. Note that the above require callback - // with the "Do something with $ here" comment will - // be called if this new attempt to load jQuery succeeds. - require(['jquery'], function () {}); - } else if (failedId === 'jquery-ui') { - requirejs.undef(failedId); - console.log("Redirecting to local path:" + failedId); - requirejs.config({ - paths: { - 'jquery-ui': '../vendor/jquery-ui' - } - }); - require(['jquery-ui'], function () {console.log("Got it now.")}); - } else if (failedId === 'underscore') { - requirejs.undef(failedId); - requirejs.config({ - paths: { - 'underscore': 'lodash' - } - }); - require(['underscore'], function () {}); - } else if (failedId === 'icanhaz') { - requirejs.undef(failedId); - requirejs.config({ - paths: { - 'icanhaz': 'ICanHaz' - } - }); - require(['icanhaz'], function () {}); - } else if (failedId === 'backbone') { - requirejs.undef(failedId); - requirejs.config({ - paths: { - 'backbone': 'backbone' - } - }); - require(['backbone'], function () {}); - } else if (failedId === 'jquery.jstree') { - requirejs.undef(failedId); - requirejs.config({ - paths: { - 'jquery.jstree': 'jquery.jstree' - } - }); - require(['jquery.jstree'], function () {}); - } else { + // If failedId does not match anything we expect, + // generate error message and skip to next loop iteration + if (! offlineVendorPaths[failedId]) { console.log("Unhandled require failure:" +failedId); + continue; } + + // undef is function only on the global requirejs object. + // Use it to clear internal knowledge of jQuery. Any modules + // that were dependent on jQuery and in the middle of loading + // will not be loaded yet, they will wait until a valid jQuery + // does load. + requirejs.undef(failedId); + + // Overwrite RequireJS config to set offline path for vendor lib + requirejs.config({paths: offlineVendorPaths[failedId]}); } } ); - /** - * This require block initializes core apps/views that are common to most - * pages. + * This require block initializes core apps/views that are common to most pages. */ define( - ['jquery', - 'underscore', - 'backbone', - 'views/consoleAppView', - 'routers/router', - 'views/errorDialog', - 'text!/backend.json', - 'jquery-ui', - 'jquery-ui-plugins', - 'backbone.stickit', - 'jquery.dataTables', - 'dataTables.bootstrap' - ], function ($, _, Backbone, CommandLineView, Router, ErrorDialog, backendTxt) { - - // Added custom handler for select - Backbone.Stickit.addHandler({ - selector: 'select', - initialize: function($el, model, options) { - if($el.is("select[multiple]")) - { - $el.multiselect({ - selectedList: options.selectedList, - noneSelectedText: options.noneSelectedText - }).multiselectfilter(); + [ + 'jquery', + 'underscore', + 'backbone', + 'icanhaz', + 'ace', + 'views/consoleAppView', + 'routers/router', + 'views/errorDialog', + 'text!config/backend.json', + 'bootstrap', + 'jquery-ui', + 'jquery-plugins', + 'jquery-ui-plugins', + 'jquery.jstree', + 'jquery.form', + 'jquery.dataTables', + 'backbone.stickit' + //'dataTables.bootstrap' // not yet ready + ], + function( $, _, Backbone, Ich, Ace, CommandLineView, Router, ErrorDialog, backendTxt ) { + // Added custom handler for select + Backbone.Stickit.addHandler({ + selector: 'select', + initialize: function($el, model, options) { + if ($el.is("select[multiple]")) { + $el.multiselect({ + selectedList: options.selectedList, + noneSelectedText: options.noneSelectedText + }).multiselectfilter(); + } } - } - }); - - // Within this scope, jquery and jquery UI have been loaded. + }); - // Initialize routing - router = new Router(); + // Within this scope, jquery and jquery UI have been loaded. + + // Initialize routing + var router = new Router(); + + //Base url for API calls + var apiUrl = JSON.parse(backendTxt).backend_endpoint; + //apiUrl = JSON.parse(backendTxt).backend_endpoint; + + // Initialize custom events object + var vent = _.extend({}, Backbone.Events); + + // Set up our icons + var icons = { + chef: "", + puppet: "", + salt: "", + ansible: "", + jenkins: "", + git: "" + }; + + $(document).on('click', '.no-default', function( e ) { + e.preventDefault(); + }); - /** http://backbonejs.org/#Sync-emulateHTTP */ - //Backbone.emulateHTTP = true; + String.prototype.capitalize = function() { + return this.charAt(0).toUpperCase() + this.slice(1); + }; + + // Initialize the command line, since that's global to all pages. + var consoleAppView = new CommandLineView(); - //Base url for API calls - var apiUrl; - apiUrl = JSON.parse(backendTxt).backend_endpoint; + var Common = { + InstanceFilter: '', // Which filter (empty, active, completed)? + ENTER_KEY: 13, // Define enter key constant? + router: router, // Router object instance + apiUrl: apiUrl, // Base API URI + vent: vent, // Custom event handlng object + consoleAppView: consoleAppView, // Self explanatory + icons: icons, // Icon object instance + jquery: $, + underscore: _, + backbone: Backbone, // Backbone framework instance + //bootstrap: Bootstrap, + ace: Ace, + icanhaz: Ich, + previousView: {}, // Default previousView object + cacheCollection: {}, // Default cacheCollection object - // Initialize custom events object - var vent = _.extend({}, Backbone.Events); + // RSS Feed URI + rssFeed: 'http://www.transcendcomputing.com/feed/', - // Set up our icons - var icons = { - chef: "", - puppet: "", - salt: "", - ansible: "", - jenkins: "", - git: "" - }; + cache : function( key, value ) { + var self = this; + if(!value) { + if(!this.cacheCollection[key]) { + var sessionValue; + try { + var sessionValue = sessionStorage[key] + self.cacheCollection[key] = JSON.parse(sessionStorage[key]); + } catch ( err ) { + this.cacheCollection[key] = sessionValue; + } + } + return this.cacheCollection[key]; + } - // Initialize the command line, since that's global to all pages. - var consoleAppView = new CommandLineView(); + this.cacheCollection[key] = value; + if(typeof Storage !== 'undefined') { + sessionStorage[key] = JSON.stringify(value); + } + }, - // Return some "globals". - return { - // Which filter are we using? - InstanceFilter: '', // empty, active, completed + clearCache : function() { + this.cacheCollection = {}; + if(typeof Storage !== 'undefined') { + sessionStorage.clear(); + } + }, - // What is the enter key constant? - ENTER_KEY: 13, + login : function( options ) { + this.router.navigate('#', { trigger: true }); + require([ + 'views/account/accountLoginView' + ], function( LoginView ) { + var loginView = new LoginView(options); + loginView.render(); + }); + }, - // The common router - router: router, + authenticate : function( options ) { + options = options || {}; + if(!this.account) { + if(options.redirect === 'here') { + options.redirect = window.location.hash; + } + this.login(options); + } + return !!this.account; + }, + + errorDialog: function(title, message) { + new ErrorDialog({title: title, message: message}); + }, + + // Function tracks previous state + setPreviousState: function( view ) { + this.previousView = view; + this.previousState = document.location.hash; + }, + + unloadPreviousState: function() { + if (!$.isEmptyObject(this.previousView)) { + this.previousView.close(); + } + }, + + gotoPreviousState: function() { + router.navigate(this.previousState, {trigger: true}); + }, - // The base API url - apiUrl: apiUrl, - - // The global variable to handle custom events - vent: vent, - - consoleAppView: consoleAppView, + logo : function( key ) { + var logos = { + aws : '/images/ImageLogos/amazon20.png', + redhat : '/images/ImageLogos/redhead20.png', + suse : '/images/ImageLogos/suse20.png', + ubuntu : '/images/ImageLogos/canonical20.gif', + windows : '/images/ImageLogos/windows20.png', + centos : '/images/ImageLogos/centos.gif', + fedora : '/images/ImageLogos/fedora36.png' + }; + return logos[key]; + } + }; - icons: icons, + Common.__defineGetter__("account", function() { + return Common.cache('account'); + }); - backbone: Backbone, + Common.__defineSetter__("account", function( val ) { + Common.cache('account', val); + }); - previousView: {}, + Common.__defineGetter__("credentials", function () { + return Common.account.cloud_credentials; + }); - errorDialog: function(title, message) { - new ErrorDialog({title: title, message: message}); - }, + Common.__defineSetter__("credentials", function( val ) { + if(!Common.account) { + Common.account = {}; + } - // Function tracks previous state - setPreviousState: function( view ) { - this.previousView = view; - this.previousState = document.location.hash; - }, + Common.account.cloud_credentials = val; - unloadPreviousState: function() { - if(!$.isEmptyObject(this.previousView)) - { - this.previousView.close(); - } - }, + // Have to update update sessionStorage here as well since Cloud.cache + // gets its initial values from sessionStorage when page is refreshed + // + // Also, sessionStorage is a flat key/value pair store. Meaning that + // sessionStorage is an object but sessionStorage.account is a string + // and not a nested object. In order to update properly, we need to convert + // sessionStorage.acount into an object, update cloud_credentials and then + // re-assign as converted string. + var sess_account = JSON.parse(sessionStorage.account); + sess_account.cloud_credentials = val; + sessionStorage.account = JSON.stringify(sess_account); + }); - gotoPreviousState: function() { - router.navigate(this.previousState, {trigger: true}); - } - }; -}); + return Common; + } +); diff --git a/js/config/SpecRunner.js b/js/config/SpecRunner.js new file mode 100644 index 00000000..257c0b47 --- /dev/null +++ b/js/config/SpecRunner.js @@ -0,0 +1,63 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ + +// Add the following to allow tests to force a reload of JS every time. +//var URL_ARGS = 'cb=' + Math.random(); +//var BASE_URL = 'js/vendor'; +//var EXTRA_PATHS = {}; +require(['rjsConfig'], function(undefined) { + require(['common'], function (common) { + require({ + paths: { + 'jasmine': '../../node_modules/grunt-contrib-jasmine/vendor/jasmine-1.3.0/jasmine', + 'jasmine-html': '../../node_modules/grunt-contrib-jasmine/vendor/jasmine-1.3.0/jasmine-html', + 'jasmine-jquery': 'https://raw.githubusercontent.com/velesin/jasmine-jquery/master/lib/jasmine-jquery.js' + + }, + shim: { + 'jasmine': { + exports: 'jasmine' + }, + 'jasmine-html': { + deps: ['jasmine'], + exports: 'jasmine' + }, + 'jasmine-jquery': { + deps: ['jasmine'], + exports: 'jasmine' + } + } + }, + ['underscore', 'jquery', 'jasmine-html'], function(_, $, jasmine) { + var jasmineEnv = jasmine.getEnv(); + jasmineEnv.updateInterval = 1000; + + // TrivialReporter depreccated in favor of HTMLReporter + var trivialReporter = new jasmine.TrivialReporter(); + + jasmineEnv.addReporter(trivialReporter); + + jasmineEnv.specFilter = function(spec) { + return trivialReporter.specFilter(spec); + }; + + var specs = [ + '../../spec/console', + '../../spec/routerSpec', + '../../spec/dockerSpec', + '../../spec/stacksSpec', + '../../spec/views/accountManagementSpec' + ]; + + $(function(){ + require(specs, function(){ + jasmineEnv.execute(); + }); + }); + + }); + }); +}); diff --git a/js/build.js b/js/config/build.js similarity index 96% rename from js/build.js rename to js/config/build.js index 40a05c30..108b8d5f 100644 --- a/js/build.js +++ b/js/config/build.js @@ -4,7 +4,7 @@ dir: "../../StackStudio-build", modules: [ { - name: "main", + name: "main" }, { name: "collections" @@ -25,4 +25,4 @@ 'jquery.terminal': 'jquery.terminal-0.7.3', 'jquery.mousewheel': 'jquery.mousewheel-min' } -}); \ No newline at end of file +}); diff --git a/js/less_config.js b/js/config/less_config.js similarity index 98% rename from js/less_config.js rename to js/config/less_config.js index e694f5f1..8475fb83 100644 --- a/js/less_config.js +++ b/js/config/less_config.js @@ -6,7 +6,7 @@ /** * Configuration for Less CSS library. */ -less = { +var less = { //async: false, // load imports async //fileAsync: false, // load imports async when in a page under // a file protocol diff --git a/js/config/rjsConfig.js b/js/config/rjsConfig.js new file mode 100644 index 00000000..91fdeead --- /dev/null +++ b/js/config/rjsConfig.js @@ -0,0 +1,191 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/* jshint smarttabs:true */ +requirejs.config({ + baseUrl: '', + nodeRequire: require, + // The shim config allows us to configure dependencies for + // scripts that do not call define() to register a module + shim: { + 'jquery-ui': { + deps: ['jquery'] + }, + 'typeahead': { + deps: ['jquery'] + }, + 'underscore': { + exports: '_' + }, + 'bootstrap': { + deps: ['jquery'] + }, + 'backbone': { + deps: ['underscore', 'jquery'], + exports: 'Backbone' + }, + 'backbone.queryparams': { + deps: ['backbone'] + }, + 'backbone.stickit': { + deps: ['backbone', 'underscore', 'jquery'] + }, + 'backbone-validation': { + deps: ['backbone', 'jquery'] + }, + 'opentip': { + deps: ['jquery'] + }, + 'base64': { + exports: 'Base64' + }, + 'dataTables.bootstrap': { + deps: ['jquery.dataTables'] + }, + 'dataTables.fnReloadAjax': { + deps: ['jquery.dataTables'], + exports: 'fnReloadAjax' + }, + 'dataTables.fnProcessingIndicator': { + deps: ['jquery.dataTables'], + exports: 'fnProcessingIndicator' + }, + 'jquery.multiselect': { + deps: ['jquery'] + }, + 'jquery.multiselect.filter': { + deps: ['jquery', 'jquery.multiselect'] + }, + 'FeedEk': { + deps: ['jquery'] + }, + 'github': { + deps: ['base64', 'underscore'], + exports: 'Github' + }, + 'gh3': { + deps: ['underscore', 'jquery'], + exports: 'Gh3' + }, + 'icanhaz': { + deps: ['jquery'], + exports: 'ich' + }, + 'jquery.form': { + deps: ['jquery'] + }, + 'jquery.list': { + deps: ['jquery'] + }, + 'jquery.terminal': { + deps: ['jquery', 'jquery.mousewheel'], + exports: 'jQuery.fn.terminal' + }, + 'jquery.dataTables': { + deps: ['jquery'], + exports: 'jQuery.fn.dataTable' + }, + 'jquery.purr': { + deps: ['jquery'], + exports: 'jQuery.fn.purr' + }, + 'jquery.mousewheel': { + deps: ['jquery'], + exports: 'jQuery.fn.mousewheel' + }, + 'jquery.jstree': { + deps: ['jquery', 'jquery.cookie'], + exports: 'jQuery.fn.jstree' + }, + 'morris': { + deps: ['jquery', 'raphael'], + exports: 'Morris' + }, + 'messenger': { + deps: ['jquery', 'backbone'], + exports: 'Messenger' + }, + 'raphael': { + deps: ['jquery'], + exports: 'Raphael' + }, + 'spinner': { + exports: 'Spinner' + }, + 'URIjs': {}, + 'instructor': { + deps: ['jquery', 'jquery-ui'] + } + }, + paths: { + /* + Configure absolute paths here so application can use relative reference. + We still want to allow RequireJS to use it's baseUrl and add file + extension for us so dont include leading / or trailing extension. + + *NOTE: Remote resource paths should NOT include protocol designation. + */ + collections : 'js/collections', + models : 'js/models', + routers : 'js/routers', + views : 'js/views', + interpreters: 'js/interpreters', + templates : 'templates', + wrappers : 'wrappers', + openstack : 'js/openstack', + topstack : 'js/topstack', + URIjs : 'js/vendor/URI', + aws : 'js/aws', + util : 'js/util', + vcloud : 'js/vcloud', + google : 'js/google', + sites : 'js/sites', + 'common' : 'js/common', + /* Backbone Stuff */ + 'backbone': '//cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min', + 'backbone.stickit' : 'js/vendor/backbone.stickit.min', + 'backbone-validation' : 'js/vendor/backbone-validation.min', + 'backbone.queryparams': 'js/vendor/backbone.queryparams', + /* jQuery Stuff */ + 'jquery' : '//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min', + 'jquery-ui' : '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min', + 'jquery.form' : '//cdnjs.cloudflare.com/ajax/libs/jquery.form/3.45/jquery.form', + 'jquery.terminal' : 'js/vendor/jquery.terminal', + 'jquery.mousewheel' : 'js/vendor/jquery.mousewheel-min', + 'jquery.multiselect': '//cdn.jsdelivr.net/jquery.multiselect/1.13/jquery.multiselect.min', + 'jquery.jstree' : '//cdn.jsdelivr.net/jquery.jstree/pre1.0/jquery.jstree', + 'jquery-migrate' : '//code.jquery.com/jquery-migrate-1.1.0', + 'jquery.cookie' : 'js/vendor/jquery.cookie', + 'jquery-plugins' : 'js/vendor/jquery-plugins', + 'jquery-ui-plugins' : 'js/vendor/jquery-ui-plugins', + 'jquery.dataTables' : 'js/vendor/jquery.dataTables', + 'jquery.purr' : 'js/vendor/jquery.purr', + 'jquery.sortable' : 'js/vendor/jquery.sortable', + 'jquery.coverscroll.min': 'js/vendor/jquery.coverscroll.min', + 'jquery.dataTables.fnProcessingIndicator': 'js/vendor/jquery.dataTables.fnProcessingIndicator', + 'jquery.multiselect.filter': '//cdn.jsdelivr.net/jquery.multiselect/1.13/jquery.multiselect.filter.min', + /* Other Stuff */ + 'underscore' : '//cdnjs.cloudflare.com/ajax/libs/lodash.js/1.1.0/lodash.min', + 'icanhaz' : 'js/vendor/ICanHaz', + 'messenger' : 'js/vendor/messenger.min', + 'raphael' : 'js/vendor/raphael-min', + 'morris' : 'js/vendor/morris', + 'spinner' : 'js/vendor/spin.min', + 'text' : 'js/vendor/text', + 'bootstrap' : '//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min', + 'typeahead' : 'js/vendor/twitter/typeahead', + 'ace' : '//cdnjs.cloudflare.com/ajax/libs/ace/1.1.01/ace', + 'mode-json' : '//cdnjs.cloudflare.com/ajax/libs/ace/1.1.01/mode-json', + 'FeedEk' : 'js/vendor/FeedEk', + 'opentip' : 'js/vendor/opentip', + 'gh3' : 'js/vendor/gh3', + 'base64' : 'js/vendor/base64', + 'instructor' : 'js/vendor/instructor', + 'mixins' : 'js/vendor/mixins', + 'github' : 'js/vendor/github', + 'dataTables.bootstrap': 'js/vendor/dataTables.bootstrap', + 'dataTables.fnReloadAjax': 'js/vendor/dataTables.fnReloadAjax' + } +}); diff --git a/js/stackplace-build.js b/js/config/stackplace-build.js similarity index 87% rename from js/stackplace-build.js rename to js/config/stackplace-build.js index 610b130a..eb0b21b2 100644 --- a/js/stackplace-build.js +++ b/js/config/stackplace-build.js @@ -14,10 +14,10 @@ 'views/projectAppView', 'views/projectResourceSidebarView', 'views/projectEditView', - 'views/resource/resourceNavigationView', + 'views/resource/resourceNavigationView' ], excludeShallow: ['jquery.jstree'], // doesn't play well minified. - mainConfigFile: 'common.js', + mainConfigFile: 'common', optimize: "uglify2", generateSourceMaps: true, @@ -26,6 +26,6 @@ paths: { // r.js can't find this file. - common: '../common', + common: '../common' } -}) +}); diff --git a/js/google/collections/compute/googleAvailabilityZones.js b/js/google/collections/compute/googleAvailabilityZones.js index 06b796f0..f4c89553 100644 --- a/js/google/collections/compute/googleAvailabilityZones.js +++ b/js/google/collections/compute/googleAvailabilityZones.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/google/models/compute/googleAvailabilityZone.js', + 'google/models/compute/googleAvailabilityZone', 'common' ], function( $, Backbone, AvailabilityZone, Common ) { 'use strict'; diff --git a/js/google/collections/compute/googleDisks.js b/js/google/collections/compute/googleDisks.js index cfcd960b..85825718 100644 --- a/js/google/collections/compute/googleDisks.js +++ b/js/google/collections/compute/googleDisks.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/google/models/compute/googleDisk.js', + 'google/models/compute/googleDisk', 'common' ], function( $, Backbone, Disk, Common ) { 'use strict'; diff --git a/js/google/collections/compute/googleFirewalls.js b/js/google/collections/compute/googleFirewalls.js index 043eaeeb..2daff14d 100644 --- a/js/google/collections/compute/googleFirewalls.js +++ b/js/google/collections/compute/googleFirewalls.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/google/models/compute/googleFirewall.js', + 'google/models/compute/googleFirewall', 'common' ], function( $, Backbone, Firewall, Common ) { 'use strict'; diff --git a/js/google/collections/compute/googleImages.js b/js/google/collections/compute/googleImages.js index de6d6cd7..1c6f6856 100644 --- a/js/google/collections/compute/googleImages.js +++ b/js/google/collections/compute/googleImages.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/google/models/compute/googleImage.js', + 'google/models/compute/googleImage', 'common' ], function( $, Backbone, Image, Common ) { 'use strict'; diff --git a/js/google/collections/compute/googleInstances.js b/js/google/collections/compute/googleInstances.js index 38507841..7097d7ba 100644 --- a/js/google/collections/compute/googleInstances.js +++ b/js/google/collections/compute/googleInstances.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/google/models/compute/googleInstance.js', + 'google/models/compute/googleInstance', 'common' ], function( $, Backbone, Instance, Common ) { 'use strict'; diff --git a/js/google/collections/compute/googleKeyPairs.js b/js/google/collections/compute/googleKeyPairs.js index 656db3ca..6af40891 100644 --- a/js/google/collections/compute/googleKeyPairs.js +++ b/js/google/collections/compute/googleKeyPairs.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/google/models/compute/googleKeyPair.js', + 'google/models/compute/googleKeyPair', 'common' ], function( $, Backbone, KeyPair, Common ) { 'use strict'; diff --git a/js/google/collections/compute/googleNetworks.js b/js/google/collections/compute/googleNetworks.js index aa9c944f..c0a136c6 100644 --- a/js/google/collections/compute/googleNetworks.js +++ b/js/google/collections/compute/googleNetworks.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/google/models/compute/googleNetwork.js', + 'google/models/compute/googleNetwork', 'common' ], function( $, Backbone, Network, Common ) { 'use strict'; diff --git a/js/google/collections/compute/googleSecurityGroups.js b/js/google/collections/compute/googleSecurityGroups.js index ad5afcd1..765d29a7 100644 --- a/js/google/collections/compute/googleSecurityGroups.js +++ b/js/google/collections/compute/googleSecurityGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/google/models/compute/googleSecurityGroup.js', + 'google/models/compute/googleSecurityGroup', 'common' ], function( $, Backbone, SecurityGroup, Common ) { 'use strict'; diff --git a/js/google/collections/compute/googleSnapshots.js b/js/google/collections/compute/googleSnapshots.js index 42ffd686..6565e02f 100644 --- a/js/google/collections/compute/googleSnapshots.js +++ b/js/google/collections/compute/googleSnapshots.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/google/models/compute/googleSnapshot.js', + 'google/models/compute/googleSnapshot', 'common' ], function( $, Backbone, Snapshot, Common ) { 'use strict'; diff --git a/js/google/collections/object_storage/googleBuckets.js b/js/google/collections/object_storage/googleBuckets.js index ad16bae7..9d417147 100644 --- a/js/google/collections/object_storage/googleBuckets.js +++ b/js/google/collections/object_storage/googleBuckets.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/google/models/object_storage/googleBucket.js', + 'google/models/object_storage/googleBucket', 'common' ], function( $, Backbone, Bucket, Common ) { 'use strict'; diff --git a/js/google/collections/object_storage/googleFiles.js b/js/google/collections/object_storage/googleFiles.js index f05c5a53..6f662ce1 100644 --- a/js/google/collections/object_storage/googleFiles.js +++ b/js/google/collections/object_storage/googleFiles.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/google/models/object_storage/googleFile.js', + 'google/models/object_storage/googleFile', 'common' ], function( $, Backbone, File, Common ) { 'use strict'; diff --git a/js/google/views/compute/googleDiskCreateView.js b/js/google/views/compute/googleDiskCreateView.js index 80608a52..e44e0e0c 100644 --- a/js/google/views/compute/googleDiskCreateView.js +++ b/js/google/views/compute/googleDiskCreateView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/google/compute/googleDiskCreateTemplate.html', - '/js/google/models/compute/googleDisk.js', - '/js/google/collections/compute/googleAvailabilityZones.js', + 'google/models/compute/googleDisk', + 'google/collections/compute/googleAvailabilityZones', 'icanhaz', 'common' diff --git a/js/google/views/compute/googleFirewallCreateView.js b/js/google/views/compute/googleFirewallCreateView.js index cd6b821a..9e585c72 100644 --- a/js/google/views/compute/googleFirewallCreateView.js +++ b/js/google/views/compute/googleFirewallCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/google/compute/googleFirewallCreateTemplate.html', - '/js/google/models/compute/googleFirewall.js', + 'google/models/compute/googleFirewall', 'icanhaz', 'common', 'jquery.multiselect' diff --git a/js/google/views/compute/googleImageCreateView.js b/js/google/views/compute/googleImageCreateView.js index 72266c5c..57afe5e9 100644 --- a/js/google/views/compute/googleImageCreateView.js +++ b/js/google/views/compute/googleImageCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/google/compute/googleImageCreateTemplate.html', - '/js/google/models/compute/googleImage.js', + 'google/models/compute/googleImage', 'icanhaz', 'common' diff --git a/js/google/views/compute/googleImagesAppView.js b/js/google/views/compute/googleImagesAppView.js index 89fd5fcd..62fd6220 100644 --- a/js/google/views/compute/googleImagesAppView.js +++ b/js/google/views/compute/googleImagesAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/google/compute/googleImageAppTemplate.html', - '/js/google/models/compute/googleImage.js', - '/js/google/collections/compute/googleImages.js', - '/js/google/views/compute/googleImageCreateView.js', + 'google/models/compute/googleImage', + 'google/collections/compute/googleImages', + 'google/views/compute/googleImageCreateView', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', diff --git a/js/google/views/compute/googleInstanceCreateView.js b/js/google/views/compute/googleInstanceCreateView.js index 45cd4af7..6ab90512 100644 --- a/js/google/views/compute/googleInstanceCreateView.js +++ b/js/google/views/compute/googleInstanceCreateView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/google/compute/googleInstanceCreateTemplate.html', - '/js/google/models/compute/googleInstance.js', - '/js/google/collections/compute/googleAvailabilityZones.js', + 'google/models/compute/googleInstance', + 'google/collections/compute/googleAvailabilityZones', 'icanhaz', 'common' diff --git a/js/google/views/compute/googleInstancesAppView.js b/js/google/views/compute/googleInstancesAppView.js index 71bdb287..bd2e25f0 100644 --- a/js/google/views/compute/googleInstancesAppView.js +++ b/js/google/views/compute/googleInstancesAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/google/compute/googleInstanceAppTemplate.html', - '/js/google/models/compute/googleInstance.js', - '/js/google/collections/compute/googleInstances.js', - '/js/google/views/compute/googleInstanceCreateView.js', - '/js/aws/collections/cloud_watch/awsMetricStatistics.js', + 'google/models/compute/googleInstance', + 'google/collections/compute/googleInstances', + 'google/views/compute/googleInstanceCreateView', + 'aws/collections/cloud_watch/awsMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', diff --git a/js/google/views/compute/googleNetworkCreateView.js b/js/google/views/compute/googleNetworkCreateView.js index 00f53db1..8d7ba718 100644 --- a/js/google/views/compute/googleNetworkCreateView.js +++ b/js/google/views/compute/googleNetworkCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/google/compute/googleNetworkCreateTemplate.html', - '/js/google/models/compute/googleNetwork.js', + 'google/models/compute/googleNetwork', 'icanhaz', 'common' diff --git a/js/google/views/compute/googleSnapshotCreateView.js b/js/google/views/compute/googleSnapshotCreateView.js index 3003de25..4777babe 100644 --- a/js/google/views/compute/googleSnapshotCreateView.js +++ b/js/google/views/compute/googleSnapshotCreateView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/google/compute/googleSnapshotCreateTemplate.html', - '/js/google/models/compute/googleSnapshot.js', - '/js/google/collections/compute/googleAvailabilityZones.js', + 'google/models/compute/googleSnapshot', + 'google/collections/compute/googleAvailabilityZones', 'icanhaz', 'common' diff --git a/js/google/views/disk/googleDisksAppView.js b/js/google/views/disk/googleDisksAppView.js index 6a70671c..418b588d 100644 --- a/js/google/views/disk/googleDisksAppView.js +++ b/js/google/views/disk/googleDisksAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/google/compute/googleDiskAppTemplate.html', - '/js/google/models/compute/googleDisk.js', - '/js/google/collections/compute/googleDisks.js', - '/js/google/views/compute/googleDiskCreateView.js', - '/js/aws/collections/cloud_watch/awsMetricStatistics.js', + 'google/models/compute/googleDisk', + 'google/collections/compute/googleDisks', + 'google/views/compute/googleDiskCreateView', + 'aws/collections/cloud_watch/awsMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', diff --git a/js/google/views/disk/googleSnapshotsAppView.js b/js/google/views/disk/googleSnapshotsAppView.js index 4396bd69..1b10587d 100644 --- a/js/google/views/disk/googleSnapshotsAppView.js +++ b/js/google/views/disk/googleSnapshotsAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/google/compute/googleSnapshotAppTemplate.html', - '/js/google/models/compute/googleSnapshot.js', - '/js/google/collections/compute/googleSnapshots.js', - '/js/google/views/compute/googleSnapshotCreateView.js', - '/js/aws/collections/cloud_watch/awsMetricStatistics.js', + 'google/models/compute/googleSnapshot', + 'google/collections/compute/googleSnapshots', + 'google/views/compute/googleSnapshotCreateView', + 'aws/collections/cloud_watch/awsMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', diff --git a/js/google/views/network/googleFirewallsAppView.js b/js/google/views/network/googleFirewallsAppView.js index 355f449f..17032586 100644 --- a/js/google/views/network/googleFirewallsAppView.js +++ b/js/google/views/network/googleFirewallsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/google/compute/googleFirewallAppTemplate.html', - '/js/google/models/compute/googleFirewall.js', - '/js/google/collections/compute/googleFirewalls.js', - '/js/google/views/compute/googleFirewallCreateView.js', + 'google/models/compute/googleFirewall', + 'google/collections/compute/googleFirewalls', + 'google/views/compute/googleFirewallCreateView', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', diff --git a/js/google/views/network/googleNetworksAppView.js b/js/google/views/network/googleNetworksAppView.js index 46eead45..4981c33f 100644 --- a/js/google/views/network/googleNetworksAppView.js +++ b/js/google/views/network/googleNetworksAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/google/compute/googleNetworkAppTemplate.html', - '/js/google/models/compute/googleNetwork.js', - '/js/google/collections/compute/googleNetworks.js', - '/js/google/views/compute/googleNetworkCreateView.js', + 'google/models/compute/googleNetwork', + 'google/collections/compute/googleNetworks', + 'google/views/compute/googleNetworkCreateView', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', diff --git a/js/google/views/object_storage/googleBucketCreateView.js b/js/google/views/object_storage/googleBucketCreateView.js index a07a2408..4fa7b9f8 100644 --- a/js/google/views/object_storage/googleBucketCreateView.js +++ b/js/google/views/object_storage/googleBucketCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/aws/object_storage/awsBucketCreateTemplate.html', - '/js/google/models/object_storage/googleBucket.js', + 'google/models/object_storage/googleBucket', 'common' ], function( $, _, Backbone, DialogView, bucketCreateTemplate, Bucket, Common ) { diff --git a/js/google/views/object_storage/googleBucketsAppView.js b/js/google/views/object_storage/googleBucketsAppView.js index 6e4143e4..b60049b1 100644 --- a/js/google/views/object_storage/googleBucketsAppView.js +++ b/js/google/views/object_storage/googleBucketsAppView.js @@ -9,12 +9,12 @@ define([ 'jquery', 'underscore', 'backbone', - '/js/aws/views/object_storage/awsBucketsAppView.js', + 'aws/views/object_storage/awsBucketsAppView', 'text!templates/google/object_storage/googleBucketAppTemplate.html', - '/js/google/models/object_storage/googleBucket.js', - '/js/google/collections/object_storage/googleBuckets.js', - '/js/google/views/object_storage/googleBucketCreateView.js', - '/js/google/collections/object_storage/googleFiles.js', + 'google/models/object_storage/googleBucket', + 'google/collections/object_storage/googleBuckets', + 'google/views/object_storage/googleBucketCreateView', + 'google/collections/object_storage/googleFiles', 'views/resource/resourceRowView', 'icanhaz', 'common', diff --git a/js/main.js b/js/main.js index a3523bd6..d58c1342 100644 --- a/js/main.js +++ b/js/main.js @@ -1,67 +1,36 @@ -/*! - * StackStudio 2.0.0-rc.1 - * (c) 2012 Transcend Computing - * Available under ASL2 license - */ -/*jshint smarttabs:true */ -/*global define:true console:true */ -var URL_ARGS, DEBUG; - -if (DEBUG) { - URL_ARGS = 'cb=' + Math.random(); -} - -require(['./common'], function (common) { - var dashboardView; - dashboardView = "views/dashboardView"; - common.rssFeed = "http://www.transcendcomputing.com/feed/"; - /* NOT WORKING - var site = window.location.hostname.split(".")[0]; - var siteParam = window.location.search.replace("?site=", ""); - if(site.indexOf("localhost") > -1 || site.indexOf("stackstudio") > -1 || site.indexOf("devessex") > -1 || site.length < 2) - { - dashboardView = "views/dashboardView"; - common.rssFeed = "http://www.transcendcomputing.com/feed/"; - } - if(dashboardView === undefined || siteParam !== "") - { - if(siteParam !== "") - { - site = siteParam.toLowerCase(); - } - var siteCss = "css/sites/" + site + ".css"; - var siteJs = "./js/sites/" + site + ".js"; - var fileref=document.createElement("link"); - fileref.setAttribute("rel", "stylesheet"); - fileref.setAttribute("type", "text/css"); - fileref.setAttribute("href", siteCss); - document.getElementsByTagName("head")[0].appendChild(fileref); - require([siteJs], function(){}); - dashboardView = "views/mspDashboardView"; - } - */ - require([ - 'views/topNav', - 'views/account/navLogin', - dashboardView, - 'views/projectSidebarView', - 'views/account/accountManagementView', - 'views/projectAppView', - // 'views/projectNavigationSidebarView', - 'views/projectResourceSidebarView', - // 'views/projectListItemView', - 'views/projectEditView', - 'views/resource/resourceNavigationView', - 'views/images/imagesView', - 'views/assemblies/assembliesView', - 'views/platform_components/platformComponentsView', - 'views/stacks/stacksView', - 'views/offerings/offeringsView' - ], function(TopNavView, NavLogin, DashboardView) { - var topNav = new TopNavView(), - navLogin = new NavLogin(); - topNav.render(); - navLogin.render(); - common.backbone.history.start(); - }); -}); +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/* jshint smarttabs:true */ +/* global define:true */ +var DEBUG = false; +require(['config/rjsConfig'], function(undefined) { + if (DEBUG) { + requirejs.config({urlArgs: 'cb=' + Math.random()}); + } + + require( + [ + 'common', + // Load all main navigation views here so they are accessible + // from top level and let all sub-views be loaded by these views + 'views/account/navLogin', + 'views/dashboardView', + 'views/account/accountManagementView', + 'views/cloud_setup/cloudSetupView', + 'views/images/imagesView', + 'views/platform_components/platformComponentsView', + 'views/assemblies/assembliesView', + 'views/stacks/stacksView', + 'views/offerings/offeringsView', + 'views/resource/resourceNavigationView', + 'views/meshes/meshesView' + ], + function(Common, NavLogin) { + new NavLogin().render(); + Common.backbone.history.start(); + } + ); +}); diff --git a/js/models/account.js b/js/models/account.js index fa963e36..0fa8f358 100644 --- a/js/models/account.js +++ b/js/models/account.js @@ -70,7 +70,7 @@ define([ }, getUser: function(){ - var url = Common.apiUrl + "/identity/v1/accounts/" + sessionStorage.account_id +".json"; + var url = Common.apiUrl + "/identity/v1/accounts/" + Common.account.id +".json"; $.ajax({ url: url, type: 'GET', @@ -85,7 +85,7 @@ define([ }, setUser: function(options){ - var url = Common.apiUrl + "/identity/v1/accounts/" + sessionStorage.account_id + "/update?_method=PUT"; + var url = Common.apiUrl + "/identity/v1/accounts/" + Common.account.id + "/update?_method=PUT"; $.ajax({ url: url, type: "POST", @@ -93,7 +93,12 @@ define([ dataType: 'json', data: JSON.stringify(options), success: function(data) { - sessionStorage.rss_url = data.rss_url; + var account = Common.account; + account.rss_url = data.rss_url; + account.email = data.email; + + Common.account = account; + new Messenger().post({type:"success", message:"User Updated..."}); }, error: function(jqXHR) { diff --git a/js/models/ansibleQueueItem.js b/js/models/ansibleQueueItem.js index 62b16c66..566091b3 100644 --- a/js/models/ansibleQueueItem.js +++ b/js/models/ansibleQueueItem.js @@ -36,12 +36,12 @@ define([ }, create : function(cred_id, stack_name, host_name, jobs){ - var url = Common.apiUrl + "/stackstudio/v1/queue/item/"+ "?account_id="+ sessionStorage.account_id; + var url = Common.apiUrl + "/stackstudio/v1/queue/item/"+ "?account_id="+ Common.account.id; this.sendAjaxAction(url, "POST", {"credential_id" : cred_id, "stack_name": stack_name, "host_name":host_name, "jobs": jobs}); }, save : function(cred_id, stack_name, host_name, jobs){ - var url = Common.apiUrl + "/stackstudio/v1/queue/item/"+ "?account_id="+ sessionStorage.account_id; + var url = Common.apiUrl + "/stackstudio/v1/queue/item/"+ "?account_id="+ Common.account.id; this.sendAjaxAction(url, "POST", {"credential_id" : cred_id, "stack_name": stack_name, "host_name":host_name, "jobs": jobs}); } diff --git a/js/models/appliance.js b/js/models/appliance.js new file mode 100644 index 00000000..1a49b748 --- /dev/null +++ b/js/models/appliance.js @@ -0,0 +1,49 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2014 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'models/resource/resourceModel', + 'common' +], function( ResourceModel, Common ) { + 'use strict'; + + var Appliance = ResourceModel.extend({ + idAttribute: 'Name', + + defaults: { + _id: '', + Name: 'New Appliance', + spec_url: '', + instance_count: '1' + }, + + parse: function(resp) { + return resp.Appliance; + }, + + create: function(options) { + // var url = Common.apiUrl + "/stackstudio/v1/appliances"; + // var successMessage = options.name + " created"; + // this.sendAjaxAction(url, "POST", options, "applianceCreated", successMessage); + }, + + update: function(options) { + // var url = Common.apiUrl + "/stackstudio/v1/appliances/" + this.id +"?_method=PUT"; + // var successMessage = this.get("name") + " updated"; + // this.sendAjaxAction(url, "POST", options, "applianceUpdated", successMessage); + }, + + destroy:function() { + // var url = Common.apiUrl + "/stackstudio/v1/appliances/" + this.id +"?_method=DELETE"; + // var successMessage = this.get("name") + " deleted"; + // this.sendAjaxAction(url, "POST", undefined, "applianceDeleted", successMessage); + } + + }); + + return Appliance; +}); \ No newline at end of file diff --git a/js/models/assembly.js b/js/models/assembly.js index 764ad073..e6baa264 100644 --- a/js/models/assembly.js +++ b/js/models/assembly.js @@ -7,8 +7,9 @@ /*global define:true console:true */ define([ 'jquery', - 'backbone' -], function( $, Backbone ) { + 'backbone', + 'common' +], function( $, Backbone, Common ) { 'use strict'; // App Model @@ -30,7 +31,7 @@ define([ configurations: {} }, url: function(){ - return Backbone.Model.prototype.url.apply(this, arguments) + "?account_id="+ sessionStorage.account_id; + return Backbone.Model.prototype.url.apply(this, arguments) + "?account_id="+ Common.account.id; } }); diff --git a/js/models/capsule.js b/js/models/capsule.js new file mode 100644 index 00000000..0085aed8 --- /dev/null +++ b/js/models/capsule.js @@ -0,0 +1,49 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2014 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'models/resource/resourceModel', + 'common' +], function( ResourceModel, Common ) { + 'use strict'; + + var Capsule = ResourceModel.extend({ + idAttribute: 'Name', + + defaults: { + _id: '', + Name: 'New Capsule', + StartCMD: '', + ServicePorts: [] + }, + + parse: function(resp) { + return resp.CapsuleSpec; + }, + + create: function(options) { + // var url = Common.apiUrl + "/stackstudio/v1/appliances"; + // var successMessage = options.name + " created"; + // this.sendAjaxAction(url, "POST", options, "applianceCreated", successMessage); + }, + + update: function(options) { + // var url = Common.apiUrl + "/stackstudio/v1/appliances/" + this.id +"?_method=PUT"; + // var successMessage = this.get("name") + " updated"; + // this.sendAjaxAction(url, "POST", options, "applianceUpdated", successMessage); + }, + + destroy:function() { + // var url = Common.apiUrl + "/stackstudio/v1/appliances/" + this.id +"?_method=DELETE"; + // var successMessage = this.get("name") + " deleted"; + // this.sendAjaxAction(url, "POST", undefined, "applianceDeleted", successMessage); + } + + }); + + return Capsule; +}); \ No newline at end of file diff --git a/js/models/cloudAccount.js b/js/models/cloudAccount.js index 21eff810..9b5032ae 100644 --- a/js/models/cloudAccount.js +++ b/js/models/cloudAccount.js @@ -61,6 +61,7 @@ define([ }, destroy: function(login) { + var deleteCreds = this; var url = Common.apiUrl + "/stackstudio/v1/cloud_accounts/" + this.id + "?_method=DELETE" + "&login=" + login; $.ajax({ @@ -68,15 +69,32 @@ define([ type: "POST", contentType: 'application/x-www-form-urlencoded', success: function(data) { + deleteCreds.deleteAssocCredentials(login); Common.vent.trigger("managementRefresh"); }, error: function(jqXHR) { Common.errorDialog(jqXHR.statusText, jqXHR.responseText); } }); - }, - + + deleteAssocCredentials: function(login) { + var url = Common.apiUrl + "/identity/v1/accounts/" + sessionStorage.account_id + "/cloud_account_credentials/" + this.id + "?_method=DELETE"; + + $.ajax({ + url: url, + type: "POST", + contentType: 'application/x-www-form-urlencoded', + success: function(data) { + sessionStorage.cloud_credentials = JSON.stringify(data.account.cloud_credentials); + Common.vent.trigger("cloudCredentialsRefresh"); + }, + error: function(jqXHR) { + Common.errorDialog(jqXHR.statusText, jqXHR.responseText); + } + }); + }, + addService: function(options,login) { var url = Common.apiUrl + "/stackstudio/v1/cloud_accounts/" + this.id + "/services?_method=POST" + "&login=" + login; @@ -89,7 +107,7 @@ define([ dataType: 'json', data: JSON.stringify(cloud_service), success: function(data) { - Common.vent.trigger("servicesRefresh"); + Common.vent.trigger("servicesRefresh",data); }, error: function(jqXHR) { Common.errorDialog(jqXHR.statusText, jqXHR.responseText); diff --git a/js/models/cloudCredential.js b/js/models/cloudCredential.js index 56f9aac6..ad6bcaff 100644 --- a/js/models/cloudCredential.js +++ b/js/models/cloudCredential.js @@ -7,8 +7,9 @@ /*global define:true console:true */ define([ 'jquery', - 'backbone' -], function( $, Backbone ) { + 'backbone', + 'common' +], function( $, Backbone, Common ) { 'use strict'; // Cloud Credential Model @@ -39,7 +40,6 @@ define([ topstack_enabled: false, topstack_configured: false } - }); return CloudCredential; diff --git a/js/models/grid.js b/js/models/grid.js new file mode 100644 index 00000000..7f03e6a2 --- /dev/null +++ b/js/models/grid.js @@ -0,0 +1,51 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2014 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'models/resource/resourceModel', + 'common' +], function( ResourceModel, Common ) { + 'use strict'; + + var Grid = ResourceModel.extend({ + idAttribute: 'StackName', + + defaults: { + StackName: 'New Grid Stack', + TemplateURL: "http://some.s3bucket.com/CFTemplates/Grid.json", + SSHKeyPair: "griduser", + NodeCount: 2, + InstanceType: "m1.small", + CapacityOverview: {} + }, + + parse: function(resp) { + return resp.Grid; + }, + + create: function(options) { + // var url = Common.apiUrl + "/stackstudio/v1/appliances"; + // var successMessage = options.name + " created"; + // this.sendAjaxAction(url, "POST", options, "applianceCreated", successMessage); + }, + + update: function(options) { + // var url = Common.apiUrl + "/stackstudio/v1/appliances/" + this.id +"?_method=PUT"; + // var successMessage = this.get("name") + " updated"; + // this.sendAjaxAction(url, "POST", options, "applianceUpdated", successMessage); + }, + + destroy:function() { + // var url = Common.apiUrl + "/stackstudio/v1/appliances/" + this.id +"?_method=DELETE"; + // var successMessage = this.get("name") + " deleted"; + // this.sendAjaxAction(url, "POST", undefined, "applianceDeleted", successMessage); + } + + }); + + return Grid; +}); \ No newline at end of file diff --git a/js/models/group.js b/js/models/group.js index 9a68b44c..05cb281e 100644 --- a/js/models/group.js +++ b/js/models/group.js @@ -28,14 +28,14 @@ define([ }, create: function(options,login) { - var url = Common.apiUrl + "/identity/v1/orgs/" + sessionStorage.org_id + "/groups?&login=" + login; + var url = Common.apiUrl + "/identity/v1/orgs/" + Common.account.org_id + "/groups?&login=" + login; var group = {group: options}; this.sendPostAction(url, group); }, addUser: function(accountId, login) { $.ajax({ - url: Common.apiUrl + "/identity/v1/orgs/" + sessionStorage.org_id + "/groups/" + this.attributes.id + "/accounts/" + accountId + "?&login=" + login, + url: Common.apiUrl + "/identity/v1/orgs/" + Common.account.org_id + "/groups/" + this.attributes.id + "/accounts/" + accountId + "?&login=" + login, type: 'POST', contentType: 'application/x-www-form-urlencoded', success: function(data) { @@ -49,7 +49,7 @@ define([ removeUser: function(accountId, login) { $.ajax({ - url: Common.apiUrl + "/identity/v1/orgs/" + sessionStorage.org_id + "/groups/" + this.attributes.id + "/accounts/" + accountId + "?_method=DELETE" + "&login=" + login, + url: Common.apiUrl + "/identity/v1/orgs/" + Common.account.org_id + "/groups/" + this.attributes.id + "/accounts/" + accountId + "?_method=DELETE" + "&login=" + login, type: 'POST', contentType: 'application/x-www-form-urlencoded', success: function(data) { diff --git a/js/models/packedImage.js b/js/models/packedImage.js index 79d7c857..5c3d5de4 100644 --- a/js/models/packedImage.js +++ b/js/models/packedImage.js @@ -21,16 +21,16 @@ define([ }, save: function() { - var url = Common.apiUrl + "/stackstudio/v1/packed_images/save?uid=" + sessionStorage.org_id; + var url = Common.apiUrl + "/stackstudio/v1/packed_images/save?uid=" + Common.account.org_id; if(this.attributes.doc_id !== "test"){ - url = Common.apiUrl + "/stackstudio/v1/packed_images/save?uid=" + sessionStorage.org_id + "&docid=" + this.attributes.doc_id; + url = Common.apiUrl + "/stackstudio/v1/packed_images/save?uid=" + Common.account.org_id + "&docid=" + this.attributes.doc_id; } this.sendAjaxAction(url, "POST", {"packed_image": this.attributes.packed_image,"name":this.attributes.name,"base_image":this.attributes.base_image}, "packedImageAppRefresh", "Image Saved..."); //this.deployIndicator(); }, deploy: function() { - var url = Common.apiUrl + "/stackstudio/v1/packed_images/deploy?uid=" + sessionStorage.org_id + "&doc_id=" + this.attributes.doc_id; + var url = Common.apiUrl + "/stackstudio/v1/packed_images/deploy?uid=" + Common.account.org_id + "&doc_id=" + this.attributes.doc_id; this.sendAjaxAction(url, "POST", undefined, "packedImageAppRefresh", "Deploying "+this.attributes.name+"..."); this.deployIndicator(); }, @@ -61,7 +61,7 @@ define([ }, destroy: function(){ - var url = Common.apiUrl + "/stackstudio/v1/packed_images/templates/" + sessionStorage.org_id + "/" + this.attributes.doc_id + "?_method=DELETE"; + var url = Common.apiUrl + "/stackstudio/v1/packed_images/templates/" + Common.account.org_id + "/" + this.attributes.doc_id + "?_method=DELETE"; this.sendAjaxAction(url, "POST", undefined, "packedImageAppDelete", "Image Deleted..."); } diff --git a/js/models/resource/resourceModel.js b/js/models/resource/resourceModel.js index 899047fb..cb1ba237 100644 --- a/js/models/resource/resourceModel.js +++ b/js/models/resource/resourceModel.js @@ -18,9 +18,9 @@ define([ sendAjaxAction: function(url, type, options, triggerString, messengerString) { /* - + TODO: Incorporate this example to wrap our models ajax call to create messages - + Messenger.options = { extraClasses: 'messenger-fixed messenger-on-bottom messenger-on-left' }; diff --git a/js/models/tutorialState.js b/js/models/tutorialState.js new file mode 100644 index 00000000..53ef6cc7 --- /dev/null +++ b/js/models/tutorialState.js @@ -0,0 +1,56 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true alert:true*/ + +define([ + 'jquery', + 'backbone', + 'gh3', + 'base64', + 'common', + 'messenger' + ], function ( $, Backbone, Gh3, Base64, Common, Messenger ) { + + var TutorialState = Backbone.Model.extend({ + + baseUrl : Common.apiUrl + "/stackstudio/v1/tutorial_states", + + save : function ( state ) { + var tutorial = this; + $.ajax({ + url : tutorial.baseUrl, + type: 'POST', + contentType: 'application/x-www-form-urlencoded', + data: state, + success: function ( res ) { + console.log('Tutorial state saved'); + } + }); + }, + + get : function ( account_id, cb ) { + var tutorial = this; + $.ajax({ + url: tutorial.baseUrl, + type: 'GET', + data: { + account_id: account_id + }, + success: function ( res ) { + if(cb) { + cb(res); + } + }, + error: function ( err, status, errorThrown ) { + console.error(err, status, errorThrown); + } + }); + } + }); + + return TutorialState; + }); \ No newline at end of file diff --git a/js/models/user.js b/js/models/user.js index 047ca51a..9241c230 100644 --- a/js/models/user.js +++ b/js/models/user.js @@ -8,8 +8,9 @@ define([ 'jquery', 'backbone', - 'common' -], function( $, Backbone, Common ) { + 'common', + 'messenger' +], function( $, Backbone, Common, Messenger ) { 'use strict'; var User = Backbone.Model.extend({ @@ -76,6 +77,51 @@ define([ }); }, + removePermission: function(permissionID) { + $.ajax({ + url: Common.apiUrl + "/identity/v1/accounts/" + this.attributes.id + "/permissions/" + permissionID + "?_method=DELETE", + type: 'POST', + contentType: 'application/x-www-form-urlencoded', + error: function(jqXHR) { + Common.errorDialog(jqXHR.statusText, jqXHR.responseText); + } + }); + }, + + updateAttributes: function(options, addAdmin){ + var userUpdate = this; + var url = Common.apiUrl + "/identity/v1/accounts/" + this.attributes.id + "/update?_method=PUT"; + $.ajax({ + url: url, + type: 'POST', + contentType: 'application/x-www-form-urlencoded', + dataType: 'json', + data: JSON.stringify(options), + success: function(data) { + userUpdate.updatePermissions(addAdmin); + Common.vent.trigger("userRefresh"); + new Messenger().post({type:"success", message:"User " + userUpdate.attributes.login + " Updated..."}); + }, + error: function(jqXHR) { + Common.errorDialog(jqXHR.statusText, jqXHR.responseText); + } + }); + }, + + updatePermissions: function(addAdmin){ + var userUpdate = this; + var adminInfo = userUpdate.attributes.permissions; + if(addAdmin && adminInfo.length > 0){ + if(!(adminInfo[0].permission.name === "admin" && adminInfo[0].permission.environment === "transcend")){ + userUpdate.addPermission("admin","transcend"); + } + }else if(addAdmin && adminInfo.length === 0){ + userUpdate.addPermission("admin","transcend"); + }else if(!addAdmin && adminInfo.length > 0) { + userUpdate.removePermission(adminInfo[0].permission.id); + } + }, + destroy: function() { $.ajax({ url: Common.apiUrl + "/identity/v1/accounts/" + this.attributes.id + "?_method=DELETE", diff --git a/js/openstack/collections/block_storage/openstackSnapshots.js b/js/openstack/collections/block_storage/openstackSnapshots.js index 15434015..39abfe5c 100644 --- a/js/openstack/collections/block_storage/openstackSnapshots.js +++ b/js/openstack/collections/block_storage/openstackSnapshots.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/block_storage/openstackSnapshot.js', + 'openstack/models/block_storage/openstackSnapshot', 'common' ], function( $, Backbone, Snapshot, Common ) { 'use strict'; diff --git a/js/openstack/collections/block_storage/openstackVolumes.js b/js/openstack/collections/block_storage/openstackVolumes.js index f03f549b..573d2ca0 100644 --- a/js/openstack/collections/block_storage/openstackVolumes.js +++ b/js/openstack/collections/block_storage/openstackVolumes.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/block_storage/openstackVolume.js', + 'openstack/models/block_storage/openstackVolume', 'common' ], function( $, Backbone, Volume, Common ) { 'use strict'; diff --git a/js/openstack/collections/compute/openstackAddressPools.js b/js/openstack/collections/compute/openstackAddressPools.js index 8cc18303..6b2fb52e 100644 --- a/js/openstack/collections/compute/openstackAddressPools.js +++ b/js/openstack/collections/compute/openstackAddressPools.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/compute/openstackAddressPool.js', + 'openstack/models/compute/openstackAddressPool', 'common' ], function( $, Backbone, AddressPool, Common ) { 'use strict'; diff --git a/js/openstack/collections/compute/openstackAvailabilityZones.js b/js/openstack/collections/compute/openstackAvailabilityZones.js index 0c2da184..6334c457 100644 --- a/js/openstack/collections/compute/openstackAvailabilityZones.js +++ b/js/openstack/collections/compute/openstackAvailabilityZones.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/compute/openstackAvailabilityZone.js', + 'openstack/models/compute/openstackAvailabilityZone', 'common' ], function( $, Backbone, AvailabilityZone, Common ) { 'use strict'; diff --git a/js/openstack/collections/compute/openstackElasticIPs.js b/js/openstack/collections/compute/openstackElasticIPs.js index 2382e69b..5580fc36 100644 --- a/js/openstack/collections/compute/openstackElasticIPs.js +++ b/js/openstack/collections/compute/openstackElasticIPs.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/compute/openstackElasticIP.js', + 'openstack/models/compute/openstackElasticIP', 'common' ], function( $, Backbone, ElasticIP, Common ) { 'use strict'; diff --git a/js/openstack/collections/compute/openstackFlavors.js b/js/openstack/collections/compute/openstackFlavors.js index 769b810a..faba037f 100644 --- a/js/openstack/collections/compute/openstackFlavors.js +++ b/js/openstack/collections/compute/openstackFlavors.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/compute/openstackFlavor.js', + 'openstack/models/compute/openstackFlavor', 'common' ], function( $, Backbone, Flavor, Common ) { 'use strict'; diff --git a/js/openstack/collections/compute/openstackImages.js b/js/openstack/collections/compute/openstackImages.js index cf90783a..8ec31e71 100644 --- a/js/openstack/collections/compute/openstackImages.js +++ b/js/openstack/collections/compute/openstackImages.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/compute/openstackImage.js', + 'openstack/models/compute/openstackImage', 'common' ], function( $, Backbone, Image, Common ) { 'use strict'; diff --git a/js/openstack/collections/compute/openstackInstances.js b/js/openstack/collections/compute/openstackInstances.js index 65381782..c34f21b8 100644 --- a/js/openstack/collections/compute/openstackInstances.js +++ b/js/openstack/collections/compute/openstackInstances.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/compute/openstackInstance.js', + 'openstack/models/compute/openstackInstance', 'common' ], function( $, Backbone, Instance, Common ) { 'use strict'; diff --git a/js/openstack/collections/compute/openstackKeyPairs.js b/js/openstack/collections/compute/openstackKeyPairs.js index a0d8f2b8..11c2dd29 100644 --- a/js/openstack/collections/compute/openstackKeyPairs.js +++ b/js/openstack/collections/compute/openstackKeyPairs.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/compute/openstackKeyPair.js', + 'openstack/models/compute/openstackKeyPair', 'common' ], function( $, Backbone, KeyPair, Common ) { 'use strict'; diff --git a/js/openstack/collections/compute/openstackSecurityGroups.js b/js/openstack/collections/compute/openstackSecurityGroups.js index 5069353c..605d4d51 100644 --- a/js/openstack/collections/compute/openstackSecurityGroups.js +++ b/js/openstack/collections/compute/openstackSecurityGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/compute/openstackSecurityGroup.js', + 'openstack/models/compute/openstackSecurityGroup', 'common' ], function( $, Backbone, SecurityGroup, Common ) { 'use strict'; diff --git a/js/openstack/collections/identity/openstackRoles.js b/js/openstack/collections/identity/openstackRoles.js index df37505f..2ea267fd 100644 --- a/js/openstack/collections/identity/openstackRoles.js +++ b/js/openstack/collections/identity/openstackRoles.js @@ -9,7 +9,7 @@ define([ 'jquery', 'underscore', 'backbone', - '/js/openstack/models/identity/openstackRole.js', + 'openstack/models/identity/openstackRole', 'common' ], function( $, _, Backbone, Role, Common ) { 'use strict'; diff --git a/js/openstack/collections/identity/openstackTenants.js b/js/openstack/collections/identity/openstackTenants.js index 0d0a248e..8b2be552 100644 --- a/js/openstack/collections/identity/openstackTenants.js +++ b/js/openstack/collections/identity/openstackTenants.js @@ -9,7 +9,7 @@ define([ 'jquery', 'underscore', 'backbone', - '/js/openstack/models/identity/openstackTenant.js', + 'openstack/models/identity/openstackTenant', 'common' ], function( $, _, Backbone, Tenant, Common ) { 'use strict'; diff --git a/js/openstack/collections/identity/openstackUsers.js b/js/openstack/collections/identity/openstackUsers.js index 4020600d..1c2e4ddb 100644 --- a/js/openstack/collections/identity/openstackUsers.js +++ b/js/openstack/collections/identity/openstackUsers.js @@ -9,7 +9,7 @@ define([ 'jquery', 'underscore', 'backbone', - '/js/openstack/models/identity/openstackUser.js', + 'openstack/models/identity/openstackUser', 'common' ], function( $, _, Backbone, User, Common ) { 'use strict'; diff --git a/js/openstack/collections/network/openstackFloatingIps.js b/js/openstack/collections/network/openstackFloatingIps.js index de93aa8e..33abd48f 100644 --- a/js/openstack/collections/network/openstackFloatingIps.js +++ b/js/openstack/collections/network/openstackFloatingIps.js @@ -9,7 +9,7 @@ define([ 'jquery', 'underscore', 'backbone', - '/js/openstack/models/network/openstackFloatingIp.js', + 'openstack/models/network/openstackFloatingIp', 'common' ], function( $, _, Backbone, FloatingIp, Common ) { 'use strict'; diff --git a/js/openstack/collections/network/openstackNetworks.js b/js/openstack/collections/network/openstackNetworks.js index 372edce9..3fa2a379 100644 --- a/js/openstack/collections/network/openstackNetworks.js +++ b/js/openstack/collections/network/openstackNetworks.js @@ -9,7 +9,7 @@ define([ 'jquery', 'underscore', 'backbone', - '/js/openstack/models/network/openstackNetwork.js', + 'openstack/models/network/openstackNetwork', 'common' ], function( $, _, Backbone, Network, Common ) { 'use strict'; diff --git a/js/openstack/collections/network/openstackPorts.js b/js/openstack/collections/network/openstackPorts.js index a7d71030..74bcce65 100644 --- a/js/openstack/collections/network/openstackPorts.js +++ b/js/openstack/collections/network/openstackPorts.js @@ -9,7 +9,7 @@ define([ 'jquery', 'underscore', 'backbone', - '/js/openstack/models/network/openstackPort.js', + 'openstack/models/network/openstackPort', 'common' ], function( $, _, Backbone, Port, Common ) { 'use strict'; diff --git a/js/openstack/collections/network/openstackRouters.js b/js/openstack/collections/network/openstackRouters.js new file mode 100644 index 00000000..f660e361 --- /dev/null +++ b/js/openstack/collections/network/openstackRouters.js @@ -0,0 +1,32 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'openstack/models/network/openstackRouter', + 'common' +], function( $, _, Backbone, Router, Common ) { + 'use strict'; + + // Router Collection + // --------------- + + var RouterList = Backbone.Collection.extend({ + + // Reference to this collection's model. + model: Router, + + // CloudMux url for Openstack Router APIs + url: Common.apiUrl + '/stackstudio/v1/cloud_management/openstack/network/routers' + }); + + // Create our global collection of **Routers**. + return RouterList; + +}); \ No newline at end of file diff --git a/js/openstack/collections/network/openstackSubnets.js b/js/openstack/collections/network/openstackSubnets.js index 57300042..d6f9fe3b 100644 --- a/js/openstack/collections/network/openstackSubnets.js +++ b/js/openstack/collections/network/openstackSubnets.js @@ -9,7 +9,7 @@ define([ 'jquery', 'underscore', 'backbone', - '/js/openstack/models/network/openstackSubnet.js', + 'openstack/models/network/openstackSubnet', 'common' ], function( $, _, Backbone, Subnet, Common ) { 'use strict'; diff --git a/js/openstack/collections/object_storage/openstackBuckets.js b/js/openstack/collections/object_storage/openstackBuckets.js index 577d9d9e..498b8487 100644 --- a/js/openstack/collections/object_storage/openstackBuckets.js +++ b/js/openstack/collections/object_storage/openstackBuckets.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/object_storage/openstackBucket.js', + 'openstack/models/object_storage/openstackBucket', 'common' ], function( $, Backbone, Bucket, Common ) { 'use strict'; diff --git a/js/openstack/collections/object_storage/openstackFiles.js b/js/openstack/collections/object_storage/openstackFiles.js index eaa26405..35aaf8d5 100644 --- a/js/openstack/collections/object_storage/openstackFiles.js +++ b/js/openstack/collections/object_storage/openstackFiles.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/openstack/models/object_storage/openstackFile.js', + 'openstack/models/object_storage/openstackFile', 'common' ], function( $, Backbone, File, Common ) { 'use strict'; diff --git a/js/openstack/models/compute/openstackInstance.js b/js/openstack/models/compute/openstackInstance.js index dd8fe83c..4fef1b10 100644 --- a/js/openstack/models/compute/openstackInstance.js +++ b/js/openstack/models/compute/openstackInstance.js @@ -67,6 +67,15 @@ define([ terminate: function(credentialId, region) { var url = Common.apiUrl + "/stackstudio/v1/cloud_management/openstack/compute/instances/" + this.attributes.id + "?_method=DELETE&cred_id=" + credentialId + "®ion=" + region; this.sendAjaxAction(url, "POST", undefined, "instanceAppRefresh"); + }, + getSecurityGroups: function(credentialId, region){ + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/openstack/compute/instances/" + this.attributes.id + "/security_groups?_method=GET&cred_id=" + credentialId + "®ion=" + region; + this.sendAjaxAction(url, "GET", undefined, "instanceGroupsFetched"); + }, + + changeSecurityGroups: function(changes, credentialId, region){ + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/openstack/compute/instances/" + this.attributes.id + "/change_groups?_method=POST&cred_id=" + credentialId + "®ion=" + region; + this.sendAjaxAction(url, "POST", changes, "securityGroupsChanged"); } }); diff --git a/js/openstack/models/compute/openstackKeyPair.js b/js/openstack/models/compute/openstackKeyPair.js index 0781d298..ae846dd7 100644 --- a/js/openstack/models/compute/openstackKeyPair.js +++ b/js/openstack/models/compute/openstackKeyPair.js @@ -24,7 +24,11 @@ define([ idAttribute: "name", create: function(options, credentialId) { - var url = "?cred_id=" + credentialId; + var url = ""; + if(options["public_key"]){ + url = "/import"; + } + url += "?cred_id=" + credentialId; this.sendPostAction(url, {key_pair: options}); }, diff --git a/js/openstack/models/compute/openstackSecurityGroup.js b/js/openstack/models/compute/openstackSecurityGroup.js index 35835a46..73e5c7bd 100644 --- a/js/openstack/models/compute/openstackSecurityGroup.js +++ b/js/openstack/models/compute/openstackSecurityGroup.js @@ -10,7 +10,7 @@ define([ 'underscore', 'backbone', 'common', - '/js/openstack/models/compute/openstackSecurityGroupRule.js' + 'openstack/models/compute/openstackSecurityGroupRule' ], function( $, _, Backbone, Common ) { 'use strict'; diff --git a/js/openstack/models/network/openstackRouter.js b/js/openstack/models/network/openstackRouter.js new file mode 100644 index 00000000..888f8cce --- /dev/null +++ b/js/openstack/models/network/openstackRouter.js @@ -0,0 +1,46 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'models/resource/resourceModel', + 'common' +], function( ResourceModel, Common ) { + 'use strict'; + + var Router = ResourceModel.extend({ + + validate: function(attrs, options) { + if(attrs.name === "" || attrs.name === undefined) + { + return this.validationError; + } + }, + + create: function(options, credentialId, region) { + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/openstack/network/routers?cred_id=" + credentialId; + this.sendAjaxAction(url, "POST", {"router": options}, "routerAppRefresh"); + }, + + destroy: function(credentialId) { + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/openstack/network/routers/"+ this.attributes.id +"?_method=DELETE&cred_id=" + credentialId; + this.sendAjaxAction(url, "POST", undefined, "routerAppRefresh"); + }, + + addInterface: function(options, credentialId, region) { + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/openstack/network/routers/" + this.attributes.id + "/add_router_interface?_method=PUT&cred_id=" + credentialId; + this.sendAjaxAction(url, "POST", {"router": options}, "router:interfaceRefresh"); + }, + + removeInterface: function(options,credentialId) { + var url = Common.apiUrl + "/stackstudio/v1/cloud_management/openstack/network/routers/" + this.attributes.id + "/remove_router_interface?_method=PUT&cred_id=" + credentialId; + this.sendAjaxAction(url, "POST", {"router": options}, "router:interfaceRefresh"); + } + + }); + + return Router; +}); \ No newline at end of file diff --git a/js/openstack/views/autoscale/openstackAutoscaleGroupCreateView.js b/js/openstack/views/autoscale/openstackAutoscaleGroupCreateView.js index cefe75e9..da296aed 100644 --- a/js/openstack/views/autoscale/openstackAutoscaleGroupCreateView.js +++ b/js/openstack/views/autoscale/openstackAutoscaleGroupCreateView.js @@ -7,12 +7,12 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/autoscale/topstackAutoscaleGroupCreateView.js', - '/js/openstack/collections/compute/openstackImages.js', - '/js/openstack/collections/compute/openstackAvailabilityZones.js', - '/js/openstack/collections/compute/openstackFlavors.js', - '/js/openstack/collections/compute/openstackKeyPairs.js', - '/js/openstack/collections/compute/openstackSecurityGroups.js' + 'topstack/views/autoscale/topstackAutoscaleGroupCreateView', + 'openstack/collections/compute/openstackImages', + 'openstack/collections/compute/openstackAvailabilityZones', + 'openstack/collections/compute/openstackFlavors', + 'openstack/collections/compute/openstackKeyPairs', + 'openstack/collections/compute/openstackSecurityGroups' ], function( Backbone, TopStackAutoScaleCreateView, Images, AvailabilityZones, Flavors, KeyPairs, SecurityGroups) { var AutoscaleGroupCreateView = TopStackAutoScaleCreateView.extend({ diff --git a/js/openstack/views/autoscale/openstackAutoscalegroupsAppView.js b/js/openstack/views/autoscale/openstackAutoscalegroupsAppView.js index 49ec4573..727cd2f3 100644 --- a/js/openstack/views/autoscale/openstackAutoscalegroupsAppView.js +++ b/js/openstack/views/autoscale/openstackAutoscalegroupsAppView.js @@ -6,8 +6,8 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/autoscale/topstackAutoscaleGroupsAppView.js', - '/js/openstack/views/autoscale/openstackAutoscaleGroupCreateView.js' + 'topstack/views/autoscale/topstackAutoscaleGroupsAppView', + 'openstack/views/autoscale/openstackAutoscaleGroupCreateView' ], function( TopStackAutoScaleGroupsAppView, OpenStackAutoScaleGroupCreateView ) { 'use strict'; diff --git a/js/openstack/views/beanstalk/openstackApplicationsAppView.js b/js/openstack/views/beanstalk/openstackApplicationsAppView.js index ecfd5b9d..020556ea 100644 --- a/js/openstack/views/beanstalk/openstackApplicationsAppView.js +++ b/js/openstack/views/beanstalk/openstackApplicationsAppView.js @@ -6,8 +6,8 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/beanstalk/topstackApplicationsAppView.js', - '/js/openstack/views/rds/openstackSecurityGroupCreateView.js' + 'topstack/views/beanstalk/topstackApplicationsAppView', + 'openstack/views/rds/openstackSecurityGroupCreateView' ], function( TopStackApplicationsAppView, OpenStackSecurityGroupCreateView ) { 'use strict'; diff --git a/js/openstack/views/block_storage/openstackSnapshotCreateView.js b/js/openstack/views/block_storage/openstackSnapshotCreateView.js index ab6e5726..20e66864 100644 --- a/js/openstack/views/block_storage/openstackSnapshotCreateView.js +++ b/js/openstack/views/block_storage/openstackSnapshotCreateView.js @@ -13,8 +13,8 @@ define([ 'icanhaz', 'views/dialogView', 'text!templates/openstack/block_storage/openstackSnapshotCreateTemplate.html', - '/js/openstack/collections/block_storage/openstackSnapshots.js', - '/js/openstack/collections/block_storage/openstackVolumes.js', + 'openstack/collections/block_storage/openstackSnapshots', + 'openstack/collections/block_storage/openstackVolumes', 'jquery.multiselect', 'jquery.multiselect.filter' ], function( $, _, Backbone, Common, ich, DialogView, snapshotCreateTemplate, Snapshots, Volumes ) { diff --git a/js/openstack/views/block_storage/openstackSnapshotsAppView.js b/js/openstack/views/block_storage/openstackSnapshotsAppView.js index 7ed72841..4323ff23 100644 --- a/js/openstack/views/block_storage/openstackSnapshotsAppView.js +++ b/js/openstack/views/block_storage/openstackSnapshotsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/block_storage/openstackSnapshotAppTemplate.html', - '/js/openstack/models/block_storage/openstackSnapshot.js', - '/js/openstack/collections/block_storage/openstackSnapshots.js', - '/js/openstack/views/block_storage/openstackSnapshotCreateView.js', + 'openstack/models/block_storage/openstackSnapshot', + 'openstack/collections/block_storage/openstackSnapshots', + 'openstack/views/block_storage/openstackSnapshotCreateView', 'icanhaz', 'common' ], function( $, _, Backbone, AppView, openstackSnapshotAppTemplate, Snapshot, Snapshots, OpenstackSnapshotCreateView, ich, Common ) { diff --git a/js/openstack/views/block_storage/openstackVolumeAttachView.js b/js/openstack/views/block_storage/openstackVolumeAttachView.js index e0164133..1424639a 100644 --- a/js/openstack/views/block_storage/openstackVolumeAttachView.js +++ b/js/openstack/views/block_storage/openstackVolumeAttachView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/openstack/block_storage/openstackVolumeAttachTemplate.html', - '/js/openstack/collections/compute/openstackInstances.js', + 'openstack/collections/compute/openstackInstances', 'common' ], function( $, _, Backbone, DialogView, volumeAttachTemplate, Instances, Common ) { diff --git a/js/openstack/views/block_storage/openstackVolumeCreateView.js b/js/openstack/views/block_storage/openstackVolumeCreateView.js index 1b9a3009..7d643263 100644 --- a/js/openstack/views/block_storage/openstackVolumeCreateView.js +++ b/js/openstack/views/block_storage/openstackVolumeCreateView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/dialogView', 'text!templates/openstack/block_storage/openstackVolumeCreateTemplate.html', - '/js/openstack/collections/block_storage/openstackVolumes.js', - '/js/openstack/collections/compute/openstackAvailabilityZones.js', - '/js/openstack/collections/block_storage/openstackSnapshots.js', + 'openstack/collections/block_storage/openstackVolumes', + 'openstack/collections/compute/openstackAvailabilityZones', + 'openstack/collections/block_storage/openstackSnapshots', 'common', 'jquery.multiselect', 'jquery.multiselect.filter' diff --git a/js/openstack/views/block_storage/openstackVolumesAppView.js b/js/openstack/views/block_storage/openstackVolumesAppView.js index 24e37bd2..6a336cf6 100644 --- a/js/openstack/views/block_storage/openstackVolumesAppView.js +++ b/js/openstack/views/block_storage/openstackVolumesAppView.js @@ -11,12 +11,12 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/block_storage/openstackVolumeAppTemplate.html', - '/js/openstack/models/block_storage/openstackVolume.js', - '/js/openstack/collections/block_storage/openstackVolumes.js', - '/js/openstack/views/block_storage/openstackVolumeCreateView.js', - '/js/openstack/views/block_storage/openstackVolumeAttachView.js', - '/js/openstack/views/block_storage/openstackSnapshotCreateView.js', - '/js/topstack/collections/cloud_watch/topstackMetricStatistics.js', + 'openstack/models/block_storage/openstackVolume', + 'openstack/collections/block_storage/openstackVolumes', + 'openstack/views/block_storage/openstackVolumeCreateView', + 'openstack/views/block_storage/openstackVolumeAttachView', + 'openstack/views/block_storage/openstackSnapshotCreateView', + 'topstack/collections/cloud_watch/topstackMetricStatistics', 'icanhaz', 'common', 'morris', diff --git a/js/openstack/views/cache/openstackClusterCreateView.js b/js/openstack/views/cache/openstackClusterCreateView.js index 1750dab2..092bda41 100644 --- a/js/openstack/views/cache/openstackClusterCreateView.js +++ b/js/openstack/views/cache/openstackClusterCreateView.js @@ -7,8 +7,8 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/cache/topstackClusterCreateView.js', - '/js/openstack/collections/compute/openstackAvailabilityZones.js' + 'topstack/views/cache/topstackClusterCreateView', + 'openstack/collections/compute/openstackAvailabilityZones' ], function( Backbone, TopStackClusterCreateView, AvailabilityZones ) { var OpenStackClusterCreateView = TopStackClusterCreateView.extend({ @@ -22,4 +22,4 @@ define([ }); return OpenStackClusterCreateView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/cache/openstackClusterModifyView.js b/js/openstack/views/cache/openstackClusterModifyView.js index 7a10ba9f..7f389930 100644 --- a/js/openstack/views/cache/openstackClusterModifyView.js +++ b/js/openstack/views/cache/openstackClusterModifyView.js @@ -7,7 +7,7 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/cache/topstackClusterModifyView.js' + 'topstack/views/cache/topstackClusterModifyView' ], function( Backbone, TopStackClusterModifyView ) { var OpenStackClusterModifyView = TopStackClusterModifyView.extend({ @@ -19,4 +19,4 @@ define([ }); return OpenStackClusterModifyView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/cache/openstackClustersAppView.js b/js/openstack/views/cache/openstackClustersAppView.js index a94fae14..787c746b 100644 --- a/js/openstack/views/cache/openstackClustersAppView.js +++ b/js/openstack/views/cache/openstackClustersAppView.js @@ -6,9 +6,9 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/cache/topstackClustersAppView.js', - '/js/openstack/views/cache/openstackClusterCreateView.js', - '/js/openstack/views/cache/openstackClusterModifyView.js' + 'topstack/views/cache/topstackClustersAppView', + 'openstack/views/cache/openstackClusterCreateView', + 'openstack/views/cache/openstackClusterModifyView' ], function( TopStackClusterAppView, OpenStackClusterCreateView, OpenStackClusterModifyView ) { 'use strict'; @@ -21,4 +21,4 @@ define([ }); return OpenstackClusterAppView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/cache/openstackParameterGroupCreateView.js b/js/openstack/views/cache/openstackParameterGroupCreateView.js index 17ac14d0..a3ade405 100644 --- a/js/openstack/views/cache/openstackParameterGroupCreateView.js +++ b/js/openstack/views/cache/openstackParameterGroupCreateView.js @@ -7,7 +7,7 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/cache/topstackParameterGroupCreateView.js' + 'topstack/views/cache/topstackParameterGroupCreateView' ], function( Backbone, TopStackParameterGroupCreateView ) { var OpenStackParameterGroupCreateView = TopStackParameterGroupCreateView.extend({ @@ -19,4 +19,4 @@ define([ }); return OpenStackParameterGroupCreateView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/cache/openstackParametergroupsAppView.js b/js/openstack/views/cache/openstackParametergroupsAppView.js index 28fb0280..8d0154a9 100644 --- a/js/openstack/views/cache/openstackParametergroupsAppView.js +++ b/js/openstack/views/cache/openstackParametergroupsAppView.js @@ -6,8 +6,8 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/cache/topstackParametergroupsAppView.js', - '/js/openstack/views/cache/openstackParameterGroupCreateView.js' + 'topstack/views/cache/topstackParametergroupsAppView', + 'openstack/views/cache/openstackParameterGroupCreateView' ], function( TopStackParameterGroupAppView, OpenStackParameterGroupCreateView ) { 'use strict'; @@ -18,4 +18,4 @@ define([ }); return OpenstackParameterGroupAppView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/cache/openstackSecurityGroupCreateView.js b/js/openstack/views/cache/openstackSecurityGroupCreateView.js index 7eaaca67..47a0a24d 100644 --- a/js/openstack/views/cache/openstackSecurityGroupCreateView.js +++ b/js/openstack/views/cache/openstackSecurityGroupCreateView.js @@ -7,7 +7,7 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/cache/topstackSecurityGroupCreateView.js' + 'topstack/views/cache/topstackSecurityGroupCreateView' ], function( Backbone, TopStackSecurityGroupCreateView ) { var OpenStackSecurityGroupCreateView = TopStackSecurityGroupCreateView.extend({ @@ -19,4 +19,4 @@ define([ }); return OpenStackSecurityGroupCreateView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/cache/openstackSecuritygroupsAppView.js b/js/openstack/views/cache/openstackSecuritygroupsAppView.js index fb7f3981..4c8e5f5e 100644 --- a/js/openstack/views/cache/openstackSecuritygroupsAppView.js +++ b/js/openstack/views/cache/openstackSecuritygroupsAppView.js @@ -6,8 +6,8 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/cache/topstackSecuritygroupsAppView.js', - '/js/openstack/views/cache/openstackSecurityGroupCreateView.js' + 'topstack/views/cache/topstackSecuritygroupsAppView', + 'openstack/views/cache/openstackSecurityGroupCreateView' ], function( TopStackSecurityGroupAppView, OpenStackSecurityGroupCreateView ) { 'use strict'; @@ -18,4 +18,4 @@ define([ }); return OpenstackSecurityGroupAppView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/cloud_watch/openstackAlarmCreateView.js b/js/openstack/views/cloud_watch/openstackAlarmCreateView.js index a8575240..8f87a6d5 100644 --- a/js/openstack/views/cloud_watch/openstackAlarmCreateView.js +++ b/js/openstack/views/cloud_watch/openstackAlarmCreateView.js @@ -7,7 +7,7 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/cloud_watch/topstackAlarmCreateView.js' + 'topstack/views/cloud_watch/topstackAlarmCreateView' ], function( Backbone, TopStackAlarmCreateView ) { var OpenStackAlarmCreateView = TopStackAlarmCreateView.extend({ diff --git a/js/openstack/views/cloud_watch/openstackAlarmsAppView.js b/js/openstack/views/cloud_watch/openstackAlarmsAppView.js index 71f380a3..e5d10fd1 100644 --- a/js/openstack/views/cloud_watch/openstackAlarmsAppView.js +++ b/js/openstack/views/cloud_watch/openstackAlarmsAppView.js @@ -6,8 +6,8 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/cloud_watch/topstackAlarmsAppView.js', - '/js/openstack/views/cloud_watch/openstackAlarmCreateView.js' + 'topstack/views/cloud_watch/topstackAlarmsAppView', + 'openstack/views/cloud_watch/openstackAlarmCreateView' ], function( TopStackAlarmsAppView, OpenStackAlarmCreateView ) { 'use strict'; diff --git a/js/openstack/views/compute/openstackElasticIPAssociateView.js b/js/openstack/views/compute/openstackElasticIPAssociateView.js index 32a3a959..75292757 100644 --- a/js/openstack/views/compute/openstackElasticIPAssociateView.js +++ b/js/openstack/views/compute/openstackElasticIPAssociateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/openstack/compute/openstackElasticIPAssociateTemplate.html', - '/js/openstack/collections/compute/openstackInstances.js', + 'openstack/collections/compute/openstackInstances', 'icanhaz', 'common' diff --git a/js/openstack/views/compute/openstackElasticIPsCreateView.js b/js/openstack/views/compute/openstackElasticIPsCreateView.js index 41db296a..a2ec3e5f 100644 --- a/js/openstack/views/compute/openstackElasticIPsCreateView.js +++ b/js/openstack/views/compute/openstackElasticIPsCreateView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/openstack/compute/openstackElasticIPCreateTemplate.html', - '/js/openstack/models/compute/openstackElasticIP.js', - '/js/openstack/collections/compute/openstackAddressPools.js', + 'openstack/models/compute/openstackElasticIP', + 'openstack/collections/compute/openstackAddressPools', 'common' ], function( $, _, Backbone, DialogView, elasticIPCreateTemplate, ElasticIP, AddressPools, Common ) { diff --git a/js/openstack/views/compute/openstackElasticipsAppView.js b/js/openstack/views/compute/openstackElasticipsAppView.js index 263f32d8..e9814e68 100644 --- a/js/openstack/views/compute/openstackElasticipsAppView.js +++ b/js/openstack/views/compute/openstackElasticipsAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/compute/openstackElasticIPAppTemplate.html', - '/js/openstack/models/compute/openstackElasticIP.js', - '/js/openstack/collections/compute/openstackElasticIPs.js', - '/js/openstack/views/compute/openstackElasticIPsCreateView.js', - '/js/openstack/views/compute/openstackElasticIPAssociateView.js', + 'openstack/models/compute/openstackElasticIP', + 'openstack/collections/compute/openstackElasticIPs', + 'openstack/views/compute/openstackElasticIPsCreateView', + 'openstack/views/compute/openstackElasticIPAssociateView', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/openstack/views/compute/openstackInstanceChangeGroupsView.js b/js/openstack/views/compute/openstackInstanceChangeGroupsView.js new file mode 100644 index 00000000..e2b6c2ea --- /dev/null +++ b/js/openstack/views/compute/openstackInstanceChangeGroupsView.js @@ -0,0 +1,136 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'views/dialogView', + 'text!templates/openstack/compute/openstackInstanceChangeGroupTemplate.html', + 'openstack/models/compute/openstackInstance', + 'openstack/collections/compute/openstackSecurityGroups', + 'common', + 'spinner', + 'jquery.multiselect', + 'jquery.multiselect.filter' +], function( $, _, Backbone, DialogView, instanceCreateTemplate, Instance, SecurityGroups, Common, Spinner) { + + var InstanceCreateView = DialogView.extend({ + + template: _.template(instanceCreateTemplate), + + credentialId: undefined, + + region: undefined, + + securityGroups: new SecurityGroups(), + + instance: new Instance(), + + // Delegated events for creating new instances, etc. + events: { + "focus #image_select": "openImageList", + "dialogclose": "close" + }, + + initialize: function(options) { + this.credentialId = options.cred_id; + this.region = options.region; + this.instance = options.instance; + }, + + render: function() { + var changeGroupsView = this; + this.$el.html(this.template); + + this.$el.dialog({ + autoOpen: true, + title: "Change Security Groups", + width:575, + minHeight: 150, + resizable: false, + modal: true, + buttons: { + Change: function () { + changeGroupsView.change(); + }, + Cancel: function() { + changeGroupsView.cancel(); + } + } + }); + + $("#instance_name").val(this.instance.get("name")).attr("disabled", true); + this.groupSelect = $("#security_group_select").multiselect({ + selectedList: 3, + noneSelectedText: "Select Security Group(s)" + }).multiselectfilter(); + + this.securityGroups.on( 'reset', this.addAllSecurityGroups, this ); + this.securityGroups.fetch({ data: $.param({ cred_id: this.credentialId, region: this.region }), reset: true }); + + var spinnerOptions = { + //lines: 13, // The number of lines to draw + length: 50, // The length of each line + width: 12, // The line thickness + radius: 25, // The radius of the inner circle + corners: 1, // Corner roundness (0..1) + rotate: 0, // The rotation offset + color: '#000', // #rgb or #rrggbb + speed: 1, // Rounds per second + trail: 60, // Afterglow percentage + shadow: false, // Whether to render a shadow + hwaccel: false, // Whether to use hardware acceleration + className: 'spinner', // The CSS class to assign to the spinner + zIndex: 2e9 // The z-index (defaults to 2000000000) + //top: 150, Top position relative to parent in px + //left: 211 Left position relative to parent in px + }; + + new Spinner(spinnerOptions).spin($("#instance_change_groups").get(0)); + }, + + addAllSecurityGroups: function() { + $("#security_group_select").empty(); + this.securityGroups.each(function(sg) { + if(sg.attributes.name) { + $("#security_group_select").append($("").text(sg.get("name")).val(sg.get("name"))); + } + }); + $("#security_group_select").multiselect("refresh"); + this.instance.getSecurityGroups(this.credentialId, this.region); + + Common.vent.once("instanceGroupsFetched", function(groups){ + this.instanceGroups = groups.map(function(group){return group.name;}); + + $(".spinner").remove(); + for(var i = 0; i < groups.length; i++){ + $("#security_group_select option[value='"+ groups[i].name+"'").attr("selected", true); + } + $("#security_group_select").multiselect("refresh"); + }, this); + }, + + change: function() { + var selected = $("#security_group_select").multiselect("getChecked") + .map(function(index, node){ + return $(node).val(); + }); + var removed = $(this.instanceGroups).not(selected).get(); + var added = $(selected).not(this.instanceGroups).get(); + var changes = {"add": added, "remove":removed}; + + this.instance.changeSecurityGroups(changes, this.credentialId, this.region); + + Common.vent.once("securityGroupsChanged", function(){ + this.$el.dialog('close'); + },this); + } + }); + + return InstanceCreateView; +}); diff --git a/js/openstack/views/compute/openstackInstanceCreateView.js b/js/openstack/views/compute/openstackInstanceCreateView.js index 9c1de546..6357c609 100644 --- a/js/openstack/views/compute/openstackInstanceCreateView.js +++ b/js/openstack/views/compute/openstackInstanceCreateView.js @@ -11,12 +11,12 @@ define([ 'backbone', 'views/dialogView', 'text!templates/openstack/compute/openstackInstanceCreateTemplate.html', - '/js/openstack/models/compute/openstackInstance.js', - '/js/openstack/collections/compute/openstackImages.js', - '/js/openstack/collections/compute/openstackAvailabilityZones.js', - '/js/openstack/collections/compute/openstackFlavors.js', - '/js/openstack/collections/compute/openstackKeyPairs.js', - '/js/openstack/collections/compute/openstackSecurityGroups.js', + 'openstack/models/compute/openstackInstance', + 'openstack/collections/compute/openstackImages', + 'openstack/collections/compute/openstackAvailabilityZones', + 'openstack/collections/compute/openstackFlavors', + 'openstack/collections/compute/openstackKeyPairs', + 'openstack/collections/compute/openstackSecurityGroups', 'common', 'spinner', 'jquery.multiselect', @@ -116,9 +116,9 @@ define([ $(".spinner").remove(); var createView = this; - var policies = JSON.parse(sessionStorage.group_policies); + var policies = Common.account.group_policies; var default_images = []; - var permissions = JSON.parse(sessionStorage.permissions); + var permissions = Common.account.permissions; //Check if this user has a policy for images they can use if not use all images. if(policies.length > 0 && permissions.length < 1){ default_images = policies[0].group_policy.os_governance.default_images; diff --git a/js/openstack/views/compute/openstackInstancesAppView.js b/js/openstack/views/compute/openstackInstancesAppView.js index b15adde7..0dd003e6 100644 --- a/js/openstack/views/compute/openstackInstancesAppView.js +++ b/js/openstack/views/compute/openstackInstancesAppView.js @@ -11,16 +11,17 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/compute/openstackInstanceAppTemplate.html', - '/js/openstack/models/compute/openstackInstance.js', - '/js/openstack/collections/compute/openstackInstances.js', - '/js/openstack/views/compute/openstackInstanceCreateView.js', - '/js/topstack/collections/cloud_watch/topstackMetricStatistics.js', + 'openstack/models/compute/openstackInstance', + 'openstack/collections/compute/openstackInstances', + 'openstack/views/compute/openstackInstanceCreateView', + 'openstack/views/compute/openstackInstanceChangeGroupsView', + 'topstack/collections/cloud_watch/topstackMetricStatistics', 'icanhaz', 'common', 'morris', 'spinner', 'jquery.dataTables' -], function( $, _, Backbone, ResourceAppView, openstackInstanceAppTemplate, Instance, Instances, OpenstackInstanceCreate, MetricStatistics, ich, Common, Morris, Spinner ) { +], function( $, _, Backbone, ResourceAppView, openstackInstanceAppTemplate, Instance, Instances, OpenstackInstanceCreate, OpenstackInstanceChangeGroups, MetricStatistics, ich, Common, Morris, Spinner ) { 'use strict'; // Openstack Instance Application View @@ -54,6 +55,8 @@ define([ subtype: "instances", CreateView: OpenstackInstanceCreate, + + ChangeGroupsView: OpenstackInstanceChangeGroups, initialMonitorLoad: false, @@ -176,6 +179,9 @@ define([ case "Terminate": instance.terminate(this.credentialId); break; + case "Change Security Groups": + this.changeGroups(); + break; /* case "Disassociate Address": var address = instance.get("addresses").private[1].addr; @@ -338,7 +344,19 @@ define([ labels: ['Network Out Bytes'], lineColors: ["#FF0066"] }); + }, + + changeGroups: function(){ + var ChangeGroupsView = this.ChangeGroupsView; + if(this.region) { + this.changeGroupsDialog = new ChangeGroupsView({instance: this.collection.get(this.selectedId), cred_id: this.credentialId, region: this.region}); + }else { + this.changeGroupsDialog = new ChangeGroupsView({instance: this.collection.get(this.selectedId), cred_id: this.credentialId}); + } + this.changeGroupsDialog.render(); + } + }); return OpenstackInstancesAppView; diff --git a/js/openstack/views/compute/openstackKeyPairCreateView.js b/js/openstack/views/compute/openstackKeyPairCreateView.js index 2467aef8..5fab71ff 100644 --- a/js/openstack/views/compute/openstackKeyPairCreateView.js +++ b/js/openstack/views/compute/openstackKeyPairCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/openstack/compute/openstackKeyPairCreateTemplate.html', - '/js/openstack/collections/compute/openstackKeyPairs.js', + 'openstack/collections/compute/openstackKeyPairs', 'icanhaz', 'common' diff --git a/js/openstack/views/compute/openstackKeyPairImportView.js b/js/openstack/views/compute/openstackKeyPairImportView.js new file mode 100644 index 00000000..1ad235e6 --- /dev/null +++ b/js/openstack/views/compute/openstackKeyPairImportView.js @@ -0,0 +1,101 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true alert:true*/ +define([ + 'jquery', + 'underscore', + 'backbone', + 'views/dialogView', + 'text!templates/openstack/compute/openstackKeyPairImportTemplate.html', + 'openstack/models/compute/openstackKeyPair', + 'icanhaz', + 'common' + +], function( $, _, Backbone, DialogView, keyPairImportTemplate, KeyPair, ich, Common ) { + + var OpenstackKeyPairImportView = DialogView.extend({ + + credentialId: undefined, + + region: undefined, + + keyPair: new KeyPair(), + + events: { + "dialogclose": "close", + "change #keypair_file": "changeFile" + }, + + initialize: function(options) { + this.credentialId = options.cred_id; + this.region = options.region; + var importView = this; + var compiledTemplate = _.template(keyPairImportTemplate); + this.$el.html(compiledTemplate); + + this.$el.dialog({ + autoOpen: true, + title: "Import Key Pair", + width:350, + resizable: false, + modal: true, + buttons: { + Import: function () { + importView.importKey(); + }, + Cancel: function() { + importView.cancel(); + } + } + }); + }, + + render: function() { + + }, + changeFile: function(e){ + var file = e.target.files[0]; + var reader = new FileReader(); + // Closure to capture the file information. + reader.onload = (function(theFile) { + return function(e) { + $("#public_key").val(e.target.result); + }; + })(file); + reader.readAsText(file); + }, + importKey: function(e) { + var params = {}; + var issue = $("#keypair_name").val() === "" || $("#public_key").val() === ""; + if(!issue){ + params["name"] = $("#keypair_name").val(); + params["public_key"] = $("#public_key").val(); + $.ajax({ + url: Common.apiUrl + "/stackstudio/v1/cloud_management/openstack/compute/key_pairs/import?cred_id=" + this.credentialId + "®ion=" + this.region, + data: JSON.stringify({"key_pair":params}), + type: "POST", + contentType: 'application/x-www-form-urlencoded', + success: function(){ + Common.vent.trigger("keyPairAppRefresh"); + }, + error: function(jqXHR) { + Common.errorDialog(jqXHR.statusText, jqXHR.responseText); + } + }); + Common.vent.once("keyPairAppRefresh", _.bind(function(){ + this.$el.dialog('close'); + }, this)); + } + else{ + Common.errorDialog("Invalid Request", "Please supply all required fields."); + } + } + + }); + + return OpenstackKeyPairImportView; +}); diff --git a/js/openstack/views/compute/openstackKeypairsAppView.js b/js/openstack/views/compute/openstackKeypairsAppView.js index d8193102..44d0ddd6 100644 --- a/js/openstack/views/compute/openstackKeypairsAppView.js +++ b/js/openstack/views/compute/openstackKeypairsAppView.js @@ -11,13 +11,14 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/compute/openstackKeyPairAppTemplate.html', - '/js/openstack/models/compute/openstackKeyPair.js', - '/js/openstack/collections/compute/openstackKeyPairs.js', - '/js/openstack/views/compute/openstackKeyPairCreateView.js', + 'openstack/models/compute/openstackKeyPair', + 'openstack/collections/compute/openstackKeyPairs', + 'openstack/views/compute/openstackKeyPairCreateView', + 'openstack/views/compute/openstackKeyPairImportView', 'icanhaz', 'common', 'jquery.dataTables' -], function( $, _, Backbone, ResourceAppView, openstackKeyPairAppTemplate, Keypair, Keypairs, OpenstackKeyPairCreate, ich, Common ) { +], function( $, _, Backbone, ResourceAppView, openstackKeyPairAppTemplate, Keypair, Keypairs, OpenstackKeyPairCreate, OpenstackKeyPairImport, ich, Common ) { 'use strict'; // Openstack Security Group Application View @@ -50,9 +51,11 @@ define([ subtype: "keypairs", CreateView: OpenstackKeyPairCreate, + ImportView: OpenstackKeyPairImport, events: { 'click .create_button': 'createNew', + 'click .import_button': 'importKey', 'click #action_menu ul li': 'performAction', 'click #resource_table tr': "clickOne" }, @@ -80,6 +83,15 @@ define([ toggleActions: function(e) { //Disable any needed actions }, + importKey: function(e) { + var ImportView = this.ImportView; + if(this.region) { + this.importKeyDialog = new ImportView({cred_id: this.credentialId, region: this.region}); + }else { + this.importKeyDialog = new ImportView({cred_id: this.credentialId}); + } + this.importKeyDialog.render(); + }, performAction: function(event) { var keyPair = this.collection.get(this.selectedId); diff --git a/js/openstack/views/compute/openstackSecurityGroupCreateView.js b/js/openstack/views/compute/openstackSecurityGroupCreateView.js index 5d57fae1..e35426ad 100644 --- a/js/openstack/views/compute/openstackSecurityGroupCreateView.js +++ b/js/openstack/views/compute/openstackSecurityGroupCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/openstack/compute/openstackSecurityGroupCreateTemplate.html', - '/js/openstack/models/compute/openstackSecurityGroup.js', + 'openstack/models/compute/openstackSecurityGroup', 'icanhaz', 'common' diff --git a/js/openstack/views/compute/openstackSecuritygroupsAppView.js b/js/openstack/views/compute/openstackSecuritygroupsAppView.js index 72c8babe..0345a438 100644 --- a/js/openstack/views/compute/openstackSecuritygroupsAppView.js +++ b/js/openstack/views/compute/openstackSecuritygroupsAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/compute/openstackSecurityGroupAppTemplate.html', - '/js/openstack/models/compute/openstackSecurityGroup.js', - '/js/openstack/models/compute/openstackSecurityGroupRule.js', - '/js/openstack/collections/compute/openstackSecurityGroups.js', - '/js/openstack/views/compute/openstackSecurityGroupCreateView.js', + 'openstack/models/compute/openstackSecurityGroup', + 'openstack/models/compute/openstackSecurityGroupRule', + 'openstack/collections/compute/openstackSecurityGroups', + 'openstack/views/compute/openstackSecurityGroupCreateView', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/openstack/views/dns/openstackHostedZoneCreateView.js b/js/openstack/views/dns/openstackHostedZoneCreateView.js index a728e715..a3abe1a8 100644 --- a/js/openstack/views/dns/openstackHostedZoneCreateView.js +++ b/js/openstack/views/dns/openstackHostedZoneCreateView.js @@ -7,7 +7,7 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/dns/topstackHostedZoneCreateView.js' + 'topstack/views/dns/topstackHostedZoneCreateView' ], function( Backbone, TopStackHostedZoneCreateView ) { var OpenStackHostedZoneCreateView = TopStackHostedZoneCreateView.extend({ @@ -18,4 +18,4 @@ define([ }); return OpenStackHostedZoneCreateView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/dns/openstackHostedzonesAppView.js b/js/openstack/views/dns/openstackHostedzonesAppView.js index e0d5b10d..95704f7b 100644 --- a/js/openstack/views/dns/openstackHostedzonesAppView.js +++ b/js/openstack/views/dns/openstackHostedzonesAppView.js @@ -6,9 +6,9 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/dns/topstackHostedzonesAppView.js', - '/js/openstack/views/dns/openstackHostedZoneCreateView.js', - '/js/openstack/views/dns/openstackRecordSetCreateView.js' + 'topstack/views/dns/topstackHostedzonesAppView', + 'openstack/views/dns/openstackHostedZoneCreateView', + 'openstack/views/dns/openstackRecordSetCreateView' ], function( TopStackHostedZonesAppView, OpenStackHostedZoneCreateView, OpenStackRecordSetCreateView ) { 'use strict'; @@ -21,4 +21,4 @@ define([ }); return OpenstackHostedZoneAppView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/dns/openstackRecordSetCreateView.js b/js/openstack/views/dns/openstackRecordSetCreateView.js index b629858f..af88add3 100644 --- a/js/openstack/views/dns/openstackRecordSetCreateView.js +++ b/js/openstack/views/dns/openstackRecordSetCreateView.js @@ -7,7 +7,7 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/dns/topstackRecordSetCreateView.js' + 'topstack/views/dns/topstackRecordSetCreateView' ], function( Backbone, TopStackRecordSetCreateView ) { var OpenStackRecordSetCreateView = TopStackRecordSetCreateView.extend({ @@ -20,4 +20,4 @@ define([ }); return OpenStackRecordSetCreateView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/identity/openstackRoleCreateView.js b/js/openstack/views/identity/openstackRoleCreateView.js index b3ea1edc..736a2ded 100644 --- a/js/openstack/views/identity/openstackRoleCreateView.js +++ b/js/openstack/views/identity/openstackRoleCreateView.js @@ -13,8 +13,8 @@ define([ 'icanhaz', 'views/dialogView', 'text!templates/openstack/identity/openstackRoleCreateTemplate.html', - '/js/openstack/models/identity/openstackRole.js', - '/js/openstack/collections/identity/openstackRoles.js', + 'openstack/models/identity/openstackRole', + 'openstack/collections/identity/openstackRoles', 'jquery.multiselect', 'jquery.multiselect.filter' ], function( $, _, Backbone, Common, ich, DialogView, roleCreateTemplate, Role, Roles ) { diff --git a/js/openstack/views/identity/openstackRolesAppView.js b/js/openstack/views/identity/openstackRolesAppView.js index 1967e926..b88de8e8 100644 --- a/js/openstack/views/identity/openstackRolesAppView.js +++ b/js/openstack/views/identity/openstackRolesAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/identity/openstackRoleAppTemplate.html', - '/js/openstack/models/identity/openstackRole.js', - '/js/openstack/collections/identity/openstackRoles.js', - '/js/openstack/views/identity/openstackRoleCreateView.js', + 'openstack/models/identity/openstackRole', + 'openstack/collections/identity/openstackRoles', + 'openstack/views/identity/openstackRoleCreateView', 'icanhaz', 'common' ], function( $, _, Backbone, AppView, openstackRoleAppTemplate, Role, Roles, OpenstackRoleCreateView, ich, Common ) { diff --git a/js/openstack/views/identity/openstackTenantAddUsersView.js b/js/openstack/views/identity/openstackTenantAddUsersView.js index c5a56b12..ab0ee549 100644 --- a/js/openstack/views/identity/openstackTenantAddUsersView.js +++ b/js/openstack/views/identity/openstackTenantAddUsersView.js @@ -13,8 +13,8 @@ define([ 'icanhaz', 'views/dialogView', 'text!templates/openstack/identity/openstackTenantAddUsersTemplate.html', - '/js/openstack/collections/identity/openstackRoles.js', - '/js/openstack/collections/identity/openstackUsers.js', + 'openstack/collections/identity/openstackRoles', + 'openstack/collections/identity/openstackUsers', 'jquery.multiselect', 'jquery.multiselect.filter', 'dataTables.fnReloadAjax' diff --git a/js/openstack/views/identity/openstackTenantCreateView.js b/js/openstack/views/identity/openstackTenantCreateView.js index 5e807539..30758731 100644 --- a/js/openstack/views/identity/openstackTenantCreateView.js +++ b/js/openstack/views/identity/openstackTenantCreateView.js @@ -12,7 +12,7 @@ define([ 'common', 'views/dialogView', 'text!templates/openstack/identity/openstackTenantCreateTemplate.html', - '/js/openstack/models/identity/openstackTenant.js' + 'openstack/models/identity/openstackTenant' ], function( $, _, Backbone, Common, DialogView, tenantCreateTemplate, Tenant ) { var TenantCreateView = DialogView.extend({ diff --git a/js/openstack/views/identity/openstackTenantEditUserView.js b/js/openstack/views/identity/openstackTenantEditUserView.js index 0bf6a423..bf7991df 100644 --- a/js/openstack/views/identity/openstackTenantEditUserView.js +++ b/js/openstack/views/identity/openstackTenantEditUserView.js @@ -13,7 +13,7 @@ define([ 'icanhaz', 'views/dialogView', 'text!templates/openstack/identity/openstackTenantEditUserTemplate.html', - '/js/openstack/collections/identity/openstackRoles.js', + 'openstack/collections/identity/openstackRoles', 'jquery.multiselect' ], function( $, _, Backbone, Common, ich, DialogView, tenantEditUserTemplate, Roles ) { diff --git a/js/openstack/views/identity/openstackTenantsAppView.js b/js/openstack/views/identity/openstackTenantsAppView.js index 498fa485..2536a73c 100644 --- a/js/openstack/views/identity/openstackTenantsAppView.js +++ b/js/openstack/views/identity/openstackTenantsAppView.js @@ -11,12 +11,12 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/identity/openstackTenantAppTemplate.html', - '/js/openstack/models/identity/openstackTenant.js', - '/js/openstack/collections/identity/openstackTenants.js', - '/js/openstack/collections/identity/openstackUsers.js', - '/js/openstack/views/identity/openstackTenantCreateView.js', - '/js/openstack/views/identity/openstackTenantAddUsersView.js', - '/js/openstack/views/identity/openstackTenantEditUserView.js', + 'openstack/models/identity/openstackTenant', + 'openstack/collections/identity/openstackTenants', + 'openstack/collections/identity/openstackUsers', + 'openstack/views/identity/openstackTenantCreateView', + 'openstack/views/identity/openstackTenantAddUsersView', + 'openstack/views/identity/openstackTenantEditUserView', 'icanhaz', 'common', 'messenger', diff --git a/js/openstack/views/identity/openstackUserCreateView.js b/js/openstack/views/identity/openstackUserCreateView.js index 5db55aa3..cf2af9b7 100644 --- a/js/openstack/views/identity/openstackUserCreateView.js +++ b/js/openstack/views/identity/openstackUserCreateView.js @@ -12,8 +12,8 @@ define([ 'common', 'views/dialogView', 'text!templates/openstack/identity/openstackUserCreateTemplate.html', - '/js/openstack/models/identity/openstackUser.js', - '/js/openstack/collections/identity/openstackTenants.js' + 'openstack/models/identity/openstackUser', + 'openstack/collections/identity/openstackTenants' ], function( $, _, Backbone, Common, DialogView, userCreateTemplate, User, Tenants ) { var UserCreateView = DialogView.extend({ diff --git a/js/openstack/views/identity/openstackUsersAppView.js b/js/openstack/views/identity/openstackUsersAppView.js index 7ba6cb35..ae347136 100644 --- a/js/openstack/views/identity/openstackUsersAppView.js +++ b/js/openstack/views/identity/openstackUsersAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/identity/openstackUserAppTemplate.html', - '/js/openstack/models/identity/openstackUser.js', - '/js/openstack/collections/identity/openstackUsers.js', - '/js/openstack/views/identity/openstackUserCreateView.js', + 'openstack/models/identity/openstackUser', + 'openstack/collections/identity/openstackUsers', + 'openstack/views/identity/openstackUserCreateView', 'icanhaz', 'common' ], function( $, _, Backbone, AppView, openstackUserAppTemplate, User, Users, OpenstackUserCreateView, ich, Common ) { diff --git a/js/openstack/views/load_balancer/openstackLoadBalancerCreateView.js b/js/openstack/views/load_balancer/openstackLoadBalancerCreateView.js index 9b9dc8f8..6f50ea00 100644 --- a/js/openstack/views/load_balancer/openstackLoadBalancerCreateView.js +++ b/js/openstack/views/load_balancer/openstackLoadBalancerCreateView.js @@ -7,8 +7,8 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/load_balancer/topstackLoadBalancerCreateView.js', - '/js/openstack/collections/compute/openstackAvailabilityZones.js' + 'topstack/views/load_balancer/topstackLoadBalancerCreateView', + 'openstack/collections/compute/openstackAvailabilityZones' ], function( Backbone, TopStackLoadBalancerCreateView, AvailabilityZones ) { var OpenStackLoadBalancerCreateView = TopStackLoadBalancerCreateView.extend({ diff --git a/js/openstack/views/load_balancer/openstackLoadbalancersAppView.js b/js/openstack/views/load_balancer/openstackLoadbalancersAppView.js index baebafb2..b5eab6a5 100644 --- a/js/openstack/views/load_balancer/openstackLoadbalancersAppView.js +++ b/js/openstack/views/load_balancer/openstackLoadbalancersAppView.js @@ -6,10 +6,10 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/load_balancer/topstackLoadbalancersAppView.js', - '/js/openstack/views/load_balancer/openstackLoadBalancerCreateView.js', - '/js/openstack/views/load_balancer/openstackManageAvailabilityZonesView.js', - '/js/openstack/views/load_balancer/openstackRegisterInstancesView.js' + 'topstack/views/load_balancer/topstackLoadbalancersAppView', + 'openstack/views/load_balancer/openstackLoadBalancerCreateView', + 'openstack/views/load_balancer/openstackManageAvailabilityZonesView', + 'openstack/views/load_balancer/openstackRegisterInstancesView' ], function( TopStackLoadBalancerAppView, OpenStackLoadBalancerCreateView, OpenStackManageAvailabilityZonesView, OpenStackRegisterInstancesView ) { 'use strict'; diff --git a/js/openstack/views/load_balancer/openstackManageAvailabilityZonesView.js b/js/openstack/views/load_balancer/openstackManageAvailabilityZonesView.js index 05556135..83022ddf 100644 --- a/js/openstack/views/load_balancer/openstackManageAvailabilityZonesView.js +++ b/js/openstack/views/load_balancer/openstackManageAvailabilityZonesView.js @@ -7,8 +7,8 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/load_balancer/topstackManageAvailabilityZonesView.js', - '/js/openstack/collections/compute/openstackAvailabilityZones.js' + 'topstack/views/load_balancer/topstackManageAvailabilityZonesView', + 'openstack/collections/compute/openstackAvailabilityZones' ], function( Backbone, TopStackManageAvailabilityZonesView, AvailabilityZones ) { var OpenStackManageAvailabilityZonesView = TopStackManageAvailabilityZonesView.extend({ diff --git a/js/openstack/views/load_balancer/openstackRegisterInstancesView.js b/js/openstack/views/load_balancer/openstackRegisterInstancesView.js index f02d7c7b..91ce2fbf 100644 --- a/js/openstack/views/load_balancer/openstackRegisterInstancesView.js +++ b/js/openstack/views/load_balancer/openstackRegisterInstancesView.js @@ -7,8 +7,8 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/load_balancer/topstackRegisterInstancesView.js', - '/js/openstack/collections/compute/openstackInstances.js' + 'topstack/views/load_balancer/topstackRegisterInstancesView', + 'openstack/collections/compute/openstackInstances' ], function( Backbone, TopStackRegisterInstancesView, Instances ) { var OpenStackRegisterInstancesView = TopStackRegisterInstancesView.extend({ diff --git a/js/openstack/views/network/openstackFloatingIpCreateView.js b/js/openstack/views/network/openstackFloatingIpCreateView.js index 44da024f..8f458a80 100644 --- a/js/openstack/views/network/openstackFloatingIpCreateView.js +++ b/js/openstack/views/network/openstackFloatingIpCreateView.js @@ -13,8 +13,8 @@ define([ 'icanhaz', 'views/dialogView', 'text!templates/openstack/network/openstackFloatingIpCreateTemplate.html', - '/js/openstack/models/network/openstackFloatingIp.js', - '/js/openstack/collections/network/openstackFloatingIps.js', + 'openstack/models/network/openstackFloatingIp', + 'openstack/collections/network/openstackFloatingIps', 'jquery.multiselect', 'jquery.multiselect.filter' ], function( $, _, Backbone, Common, ich, DialogView, floatingIpCreateTemplate, FloatingIp ) { diff --git a/js/openstack/views/network/openstackFloatingIpsAppView.js b/js/openstack/views/network/openstackFloatingIpsAppView.js index 8b67c4f0..b5390ac0 100644 --- a/js/openstack/views/network/openstackFloatingIpsAppView.js +++ b/js/openstack/views/network/openstackFloatingIpsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/network/openstackFloatingIpAppTemplate.html', - '/js/openstack/models/network/openstackFloatingIp.js', - '/js/openstack/collections/network/openstackFloatingIps.js', - '/js/openstack/views/network/openstackFloatingIpCreateView.js', + 'openstack/models/network/openstackFloatingIp', + 'openstack/collections/network/openstackFloatingIps', + 'openstack/views/network/openstackFloatingIpCreateView', 'icanhaz', 'common' ], function( $, _, Backbone, AppView, openstackFloatingIpAppTemplate, FloatingIp, FloatingIps, OpenstackFloatingIpCreateView, ich, Common ) { diff --git a/js/openstack/views/network/openstackNetworkCreateView.js b/js/openstack/views/network/openstackNetworkCreateView.js index b796bcb5..15e02399 100644 --- a/js/openstack/views/network/openstackNetworkCreateView.js +++ b/js/openstack/views/network/openstackNetworkCreateView.js @@ -13,9 +13,9 @@ define([ 'icanhaz', 'views/dialogView', 'text!templates/openstack/network/openstackNetworkCreateTemplate.html', - '/js/openstack/models/network/openstackNetwork.js', - '/js/openstack/collections/network/openstackNetworks.js', - '/js/openstack/collections/identity/openstackTenants.js', + 'openstack/models/network/openstackNetwork', + 'openstack/collections/network/openstackNetworks', + 'openstack/collections/identity/openstackTenants', 'jquery.multiselect', 'jquery.multiselect.filter' ], function( $, _, Backbone, Common, ich, DialogView, networkCreateTemplate, Network, Tenants ) { diff --git a/js/openstack/views/network/openstackNetworksAppView.js b/js/openstack/views/network/openstackNetworksAppView.js index 5696a739..d9991649 100644 --- a/js/openstack/views/network/openstackNetworksAppView.js +++ b/js/openstack/views/network/openstackNetworksAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/network/openstackNetworkAppTemplate.html', - '/js/openstack/models/network/openstackNetwork.js', - '/js/openstack/collections/network/openstackNetworks.js', - '/js/openstack/views/network/openstackNetworkCreateView.js', + 'openstack/models/network/openstackNetwork', + 'openstack/collections/network/openstackNetworks', + 'openstack/views/network/openstackNetworkCreateView', 'icanhaz', 'common' ], function( $, _, Backbone, AppView, openstackNetworkAppTemplate, Network, Networks, OpenstackNetworkCreateView, ich, Common ) { diff --git a/js/openstack/views/network/openstackPortCreateView.js b/js/openstack/views/network/openstackPortCreateView.js index 2a9ce1fd..021d3b77 100644 --- a/js/openstack/views/network/openstackPortCreateView.js +++ b/js/openstack/views/network/openstackPortCreateView.js @@ -13,8 +13,8 @@ define([ 'icanhaz', 'views/dialogView', 'text!templates/openstack/network/openstackPortCreateTemplate.html', - '/js/openstack/models/network/openstackPort.js', - '/js/openstack/collections/network/openstackNetworks.js', + 'openstack/models/network/openstackPort', + 'openstack/collections/network/openstackNetworks', 'jquery.multiselect', 'jquery.multiselect.filter', 'backbone.stickit' diff --git a/js/openstack/views/network/openstackPortsAppView.js b/js/openstack/views/network/openstackPortsAppView.js index d1e3475c..3cbd16e4 100644 --- a/js/openstack/views/network/openstackPortsAppView.js +++ b/js/openstack/views/network/openstackPortsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/network/openstackPortAppTemplate.html', - '/js/openstack/models/network/openstackPort.js', - '/js/openstack/collections/network/openstackPorts.js', - '/js/openstack/views/network/openstackPortCreateView.js', + 'openstack/models/network/openstackPort', + 'openstack/collections/network/openstackPorts', + 'openstack/views/network/openstackPortCreateView', 'icanhaz', 'common' ], function( $, _, Backbone, AppView, openstackPortAppTemplate, Port, Ports, OpenstackPortCreateView, ich, Common ) { diff --git a/js/openstack/views/network/openstackRouterCreateView.js b/js/openstack/views/network/openstackRouterCreateView.js new file mode 100644 index 00000000..28aa9224 --- /dev/null +++ b/js/openstack/views/network/openstackRouterCreateView.js @@ -0,0 +1,97 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common', + 'icanhaz', + 'views/dialogView', + 'text!templates/openstack/network/openstackRouterCreateTemplate.html', + 'openstack/models/network/openstackRouter', + 'openstack/collections/network/openstackNetworks', + 'jquery.multiselect', + 'jquery.multiselect.filter', + 'backbone.stickit' +], function( $, _, Backbone, Common, ich, DialogView, routerCreateTemplate, Router, Networks ) { + + var RouterCreateView = DialogView.extend({ + credentialId: undefined, + region: undefined, + template: _.template(routerCreateTemplate), + model: new Router(), + + events: { + "dialogclose": "close" + }, + + initialize: function(options) { + this.credentialId = options.cred_id; + this.region = options.region; + this.networks = new Networks(); + this.networks.on("reset", this.addAllNetworks, this); + this.networks.fetch({ data: $.param({ cred_id: this.credentialId, region: this.region}), reset: true }); + this.render(); + }, + + render: function() { + var createView = this; + this.$el.html(this.template); + this.$el.dialog({ + autoOpen: true, + title: "Create Router", + width: 450, + minHeight: 150, + resizable: false, + modal: true, + buttons: { + Create: function () { + createView.create(); + }, + Cancel: function() { + createView.cancel(); + } + } + }); + }, + + addAllNetworks: function() { + $("#network_select").empty(); + this.networks.each(function(network) { + if(network.attributes["router:external"]){ + $("#network_select").append($("")); + } + }); + }, + + create: function() { + var newRouter = this.model; + var options = {}; + options.external_gateway_info = {}; + var issue = false; + + options.external_gateway_info.network_id = $("#network_select").val(); + if($("#name_input").val() !== "") { + options.name = $("#name_input").val(); + } + if($("#admin_state_up_checkbox").is(":checked")) { + options.admin_state_up = true; + }else { + options.admin_state_up = false; + } + + if(!issue) { + this.model.create(options, this.credentialId, this.region); + this.$el.dialog('close'); + } + } + + }); + + return RouterCreateView; +}); diff --git a/js/openstack/views/network/openstackRouterDestroyView.js b/js/openstack/views/network/openstackRouterDestroyView.js new file mode 100644 index 00000000..3be0fedf --- /dev/null +++ b/js/openstack/views/network/openstackRouterDestroyView.js @@ -0,0 +1,71 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common', + 'icanhaz', + 'views/dialogView', + 'text!templates/openstack/network/openstackRouterDestroyTemplate.html', + 'openstack/models/network/openstackRouter', + 'jquery.multiselect', + 'jquery.multiselect.filter', + 'backbone.stickit' +], function( $, _, Backbone, Common, ich, DialogView, routerDestroyTemplate, Router ) { + + var RouterDestroyView = DialogView.extend({ + credentialId: undefined, + region: undefined, + template: _.template(routerDestroyTemplate), + model: undefined, + + events: { + "dialogclose": "close" + }, + + initialize: function(options) { + this.credentialId = options.cred_id; + this.region = options.region; + this.model = options.router; + this.render(); + }, + + render: function() { + var createView = this; + this.$el.html(this.template); + this.$el.dialog({ + autoOpen: true, + title: "Warning", + width: 450, + minHeight: 150, + resizable: false, + modal: true, + buttons: { + Continue: function () { + createView.destroyRouter(); + }, + Cancel: function() { + createView.cancel(); + } + } + }); + }, + + destroyRouter: function() { + var issue = false; + if(!issue) { + this.model.destroy(this.credentialId); + this.$el.dialog('close'); + } + } + + }); + + return RouterDestroyView; +}); diff --git a/js/openstack/views/network/openstackRouterInterfaceCreateView.js b/js/openstack/views/network/openstackRouterInterfaceCreateView.js new file mode 100644 index 00000000..e715e78b --- /dev/null +++ b/js/openstack/views/network/openstackRouterInterfaceCreateView.js @@ -0,0 +1,85 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common', + 'icanhaz', + 'views/dialogView', + 'text!templates/openstack/network/openstackRouterInterfaceCreateTemplate.html', + 'openstack/models/network/openstackRouter', + 'openstack/collections/network/openstackSubnets', + 'jquery.multiselect', + 'jquery.multiselect.filter', + 'backbone.stickit' +], function( $, _, Backbone, Common, ich, DialogView, routerInterfaceCreateTemplate, Router, Subnets ) { + + var RouterInterfaceCreateView = DialogView.extend({ + credentialId: undefined, + region: undefined, + template: _.template(routerInterfaceCreateTemplate), + model: undefined, + + events: { + "dialogclose": "close" + }, + + initialize: function(options) { + this.credentialId = options.cred_id; + this.region = options.region; + this.model = options.router; + this.subnets = new Subnets(); + this.subnets.on("reset", this.addAllSubnets, this); + this.subnets.fetch({ data: $.param({ cred_id: this.credentialId, region: this.region}), reset: true }); + this.render(); + }, + + render: function() { + var createView = this; + this.$el.html(this.template); + this.$el.dialog({ + autoOpen: true, + title: "Add Router Interface", + width: 450, + minHeight: 150, + resizable: false, + modal: true, + buttons: { + Create: function () { + createView.addInterface(); + }, + Cancel: function() { + createView.cancel(); + } + } + }); + }, + + addAllSubnets: function() { + $("#subnet_select").empty(); + this.subnets.each(function(subnet) { + $("#subnet_select").append($("")); + }); + }, + + addInterface: function() { + var options = {}; + var issue = false; + + options.subnet_id = $("#subnet_select").val(); + if(!issue) { + this.model.addInterface(options, this.credentialId, this.region); + this.$el.dialog('close'); + } + } + + }); + + return RouterInterfaceCreateView; +}); diff --git a/js/openstack/views/network/openstackRoutersAppView.js b/js/openstack/views/network/openstackRoutersAppView.js new file mode 100644 index 00000000..aae15d73 --- /dev/null +++ b/js/openstack/views/network/openstackRoutersAppView.js @@ -0,0 +1,171 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'views/resource/resourceAppView', + 'text!templates/openstack/network/openstackRouterAppTemplate.html', + 'openstack/models/network/openstackRouter', + 'openstack/collections/network/openstackRouters', + 'openstack/collections/network/openstackPorts', + 'openstack/views/network/openstackRouterCreateView', + 'openstack/views/network/openstackRouterDestroyView', + 'openstack/views/network/openstackRouterInterfaceCreateView', + 'icanhaz', + 'common', + 'jquery.dataTables' +], function( $, _, Backbone, AppView, openstackRouterAppTemplate, Router, Routers, Ports, OpenstackRouterCreateView, OpenstackRouterDestroyView, OpenstackRouterInterfaceCreateView, ich, Common ) { + 'use strict'; + + // Openstack Application View + // ------------------------------ + + /** + * Openstack AppView is UI view list of cloud items. + * + * @name AppView + * @constructor + * @category Resources + * @param {Object} initialization object. + * @returns {Object} Returns an OpenstackAppView instance. + */ + var OpenstackRoutersAppView = AppView.extend({ + template: _.template(openstackRouterAppTemplate), + + modelStringIdentifier: "id", + + columns: ["name", "id", "status"], + + idColumnNumber: 1, + + model: Router, + + collectionType: Routers, + + type: "network", + + subtype: "routers", + + CreateView: OpenstackRouterCreateView, + + events: { + 'click .create_button': 'createNew', + 'click #action_menu ul li': 'performAction', + 'click #resource_table tr': "clickOne", + 'click #add_interface_button': "clickAddInterface", + 'click #interfaces_table tr': 'clickInterface', + 'click #remove_interface_button': "clickRemoveInterface" + + }, + + initialize: function(options) { + if(options.cred_id) { + this.credentialId = options.cred_id; + } + if(options.region) { + this.region = options.region; + } + var routerApp = this; + this.ports = new Ports(); + this.ports.on("reset", this.addAllInterfaces, this); + this.ports.fetch({ data: $.param({ cred_id: this.credentialId, region: this.region}), reset: true }); + Common.vent.off("router:interfaceRefresh"); + Common.vent.on("router:interfaceRefresh", function() { + //refetch ports + routerApp.ports.fetch({ + data: $.param({ cred_id: routerApp.credentialId, region: routerApp.region}), + reset: true + }); + routerApp.render(); + }); + Common.vent.on("routerAppRefresh", function() { + routerApp.render(); + }); + this.render(); + }, + + toggleActions: function(e) { + //Disable any needed actions + this.addAllInterfaces(); + this.toggleButton($("#remove_interface_button"),true); + }, + toggleButton: function(target, toggle){ + if(toggle === true){ + target.attr("disabled", true); + target.addClass("ui-state-disabled"); + }else{ + target.removeAttr("disabled"); + target.removeClass("ui-state-disabled"); + } + }, + addAllInterfaces: function(collection){ + if($("#interfaces_table").length !== 0){ + var router = this.collection.get(this.selectedId); + var routerID = router.id; + $("#interfaces_table").dataTable().fnClearTable(); + this.ports.each(function(port) { + if(port.attributes.device_id === routerID){ + var rowData = [port.attributes.fixed_ips[0].subnet_id,port.attributes.fixed_ips[0].ip_address,port.attributes.id]; + $("#interfaces_table").dataTable().fnAddData(rowData); + } + }); + } + }, + hasInterface: function() { + var router = this.collection.get(this.selectedId); + var routerID = router.id; + var check = null; + this.ports.each(function(port) { + if(port.attributes.device_id === routerID){ + check = port; + } + }); + return check; + }, + clickAddInterface: function(){ + var router = this.collection.get(this.selectedId); + new OpenstackRouterInterfaceCreateView({cred_id: this.credentialId, router: router}); + }, + clickRemoveInterface: function(target){ + var router = this.collection.get(this.selectedId); + var options = {}; + options.subnet_id = this.selectedInterface[0]; + router.removeInterface(options, this.credentialId); + }, + clickInterface: function(event){ + if($(event.target).parents('table').attr('id') === "interfaces_table" && ! $(event.target).hasClass("dataTables_empty") ){ + this.selectInterface(event.currentTarget); + } + }, + + selectInterface: function(target){ + $(".row_selected").removeClass('row_selected'); + $(target).addClass('row_selected'); + this.toggleButton($("#remove_interface_button"),false); + this.selectedInterface = $("#interfaces_table").dataTable().fnGetData(target); + }, + + performAction: function(event) { + var router = this.collection.get(this.selectedId); + switch(event.target.text) + { + case "Delete Router": + if($("#interfaces_table").dataTable().fnGetData().length > 0){ + new OpenstackRouterDestroyView({cred_id: this.credentialId, router: router}); + }else{ + router.destroy(this.credentialId); + } + break; + } + + } + }); + + return OpenstackRoutersAppView; +}); diff --git a/js/openstack/views/network/openstackSubnetCreateView.js b/js/openstack/views/network/openstackSubnetCreateView.js index 9b7a775a..7d3a7553 100644 --- a/js/openstack/views/network/openstackSubnetCreateView.js +++ b/js/openstack/views/network/openstackSubnetCreateView.js @@ -13,8 +13,8 @@ define([ 'icanhaz', 'views/dialogView', 'text!templates/openstack/network/openstackSubnetCreateTemplate.html', - '/js/openstack/models/network/openstackSubnet.js', - '/js/openstack/collections/network/openstackNetworks.js', + 'openstack/models/network/openstackSubnet', + 'openstack/collections/network/openstackNetworks', 'jquery.multiselect', 'jquery.multiselect.filter', 'backbone.stickit' @@ -88,7 +88,9 @@ define([ this.displayValid(false, "#cidr_input"); issue = true; } - + if($("#subnet_name_input").val() !== "") { + options.name = $("#subnet_name_input").val(); + } options.ip_version = $("#ip_version_select").val(); if($("#gateway_ip_input").val() !== "") { options.gateway_ip = $("#gateway_ip_input").val(); diff --git a/js/openstack/views/network/openstackSubnetsAppView.js b/js/openstack/views/network/openstackSubnetsAppView.js index 3f69e286..179951b3 100644 --- a/js/openstack/views/network/openstackSubnetsAppView.js +++ b/js/openstack/views/network/openstackSubnetsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/network/openstackSubnetAppTemplate.html', - '/js/openstack/models/network/openstackSubnet.js', - '/js/openstack/collections/network/openstackSubnets.js', - '/js/openstack/views/network/openstackSubnetCreateView.js', + 'openstack/models/network/openstackSubnet', + 'openstack/collections/network/openstackSubnets', + 'openstack/views/network/openstackSubnetCreateView', 'icanhaz', 'common' ], function( $, _, Backbone, AppView, openstackSubnetAppTemplate, Subnet, Subnets, OpenstackSubnetCreateView, ich, Common ) { diff --git a/js/openstack/views/object_storage/openstackBucketCreateView.js b/js/openstack/views/object_storage/openstackBucketCreateView.js index b3e7dbae..152f9796 100644 --- a/js/openstack/views/object_storage/openstackBucketCreateView.js +++ b/js/openstack/views/object_storage/openstackBucketCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/openstack/object_storage/openstackBucketCreateTemplate.html', - '/js/openstack/models/object_storage/openstackBucket.js', + 'openstack/models/object_storage/openstackBucket', 'common' ], function( $, _, Backbone, DialogView, bucketCreateTemplate, Bucket, Common ) { diff --git a/js/openstack/views/object_storage/openstackBucketsAppView.js b/js/openstack/views/object_storage/openstackBucketsAppView.js index 197f3686..c4ea955a 100644 --- a/js/openstack/views/object_storage/openstackBucketsAppView.js +++ b/js/openstack/views/object_storage/openstackBucketsAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/openstack/object_storage/openstackBucketAppTemplate.html', - '/js/openstack/models/object_storage/openstackBucket.js', - '/js/openstack/collections/object_storage/openstackBuckets.js', - '/js/openstack/views/object_storage/openstackBucketCreateView.js', - '/js/openstack/collections/object_storage/openstackFiles.js', + 'openstack/models/object_storage/openstackBucket', + 'openstack/collections/object_storage/openstackBuckets', + 'openstack/views/object_storage/openstackBucketCreateView', + 'openstack/collections/object_storage/openstackFiles', 'views/resource/resourceRowView', 'icanhaz', 'common', diff --git a/js/openstack/views/queue/openstackQueueCreateView.js b/js/openstack/views/queue/openstackQueueCreateView.js index 6df3da75..30c4a922 100644 --- a/js/openstack/views/queue/openstackQueueCreateView.js +++ b/js/openstack/views/queue/openstackQueueCreateView.js @@ -7,7 +7,7 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/queue/topstackQueueCreateView.js' + 'topstack/views/queue/topstackQueueCreateView' ], function( Backbone, TopStackQueueCreateView) { var OpenStackQueueCreateView = TopStackQueueCreateView.extend({ diff --git a/js/openstack/views/queue/openstackQueuesAppView.js b/js/openstack/views/queue/openstackQueuesAppView.js index 43a0236f..ac8cdc83 100644 --- a/js/openstack/views/queue/openstackQueuesAppView.js +++ b/js/openstack/views/queue/openstackQueuesAppView.js @@ -6,8 +6,8 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/queue/topstackQueuesAppView.js', - '/js/openstack/views/queue/openstackQueueCreateView.js' + 'topstack/views/queue/topstackQueuesAppView', + 'openstack/views/queue/openstackQueueCreateView' ], function( TopStackQueueAppView, OpenStackQueueCreateView ) { 'use strict'; diff --git a/js/openstack/views/rds/openstackParameterGroupCreateView.js b/js/openstack/views/rds/openstackParameterGroupCreateView.js index 161e916e..3f8651d2 100644 --- a/js/openstack/views/rds/openstackParameterGroupCreateView.js +++ b/js/openstack/views/rds/openstackParameterGroupCreateView.js @@ -7,7 +7,7 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/rds/topstackParameterGroupCreateView.js' + 'topstack/views/rds/topstackParameterGroupCreateView' ], function( Backbone, TopStackParameterGroupCreateView ) { var OpenStackParameterGroupCreateView = TopStackParameterGroupCreateView.extend({ @@ -19,4 +19,4 @@ define([ }); return OpenStackParameterGroupCreateView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/rds/openstackParametergroupsAppView.js b/js/openstack/views/rds/openstackParametergroupsAppView.js index 32ee7de9..e54ad5a5 100644 --- a/js/openstack/views/rds/openstackParametergroupsAppView.js +++ b/js/openstack/views/rds/openstackParametergroupsAppView.js @@ -6,8 +6,8 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/rds/topstackParametergroupsAppView.js', - '/js/openstack/views/rds/openstackParameterGroupCreateView.js' + 'topstack/views/rds/topstackParametergroupsAppView', + 'openstack/views/rds/openstackParameterGroupCreateView' ], function( TopStackParameterGroupAppView, OpenStackParameterGroupCreateView ) { 'use strict'; @@ -18,4 +18,4 @@ define([ }); return OpenstackParameterGroupAppView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/rds/openstackRelationalDatabaseCreateView.js b/js/openstack/views/rds/openstackRelationalDatabaseCreateView.js index aec897c8..3587dbcb 100644 --- a/js/openstack/views/rds/openstackRelationalDatabaseCreateView.js +++ b/js/openstack/views/rds/openstackRelationalDatabaseCreateView.js @@ -7,8 +7,8 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/rds/topstackRelationalDatabaseCreateView.js', - '/js/openstack/collections/compute/openstackAvailabilityZones.js' + 'topstack/views/rds/topstackRelationalDatabaseCreateView', + 'openstack/collections/compute/openstackAvailabilityZones' ], function( Backbone, TopStackRelationalDatabaseCreateView, AvailabilityZones ) { var RelationalDatabaseCreateView = TopStackRelationalDatabaseCreateView.extend({ diff --git a/js/openstack/views/rds/openstackRelationaldatabasesAppView.js b/js/openstack/views/rds/openstackRelationaldatabasesAppView.js index 495fd31c..8aad8b49 100644 --- a/js/openstack/views/rds/openstackRelationaldatabasesAppView.js +++ b/js/openstack/views/rds/openstackRelationaldatabasesAppView.js @@ -6,8 +6,8 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/rds/topstackRelationaldatabasesAppView.js', - '/js/openstack/views/rds/openstackRelationalDatabaseCreateView.js' + 'topstack/views/rds/topstackRelationaldatabasesAppView', + 'openstack/views/rds/openstackRelationalDatabaseCreateView' ], function( TopStackRelationalDatabaseAppView, OpenStackRelationalDatabaseCreateView ) { 'use strict'; diff --git a/js/openstack/views/rds/openstackSecurityGroupCreateView.js b/js/openstack/views/rds/openstackSecurityGroupCreateView.js index d659d524..e0083c79 100644 --- a/js/openstack/views/rds/openstackSecurityGroupCreateView.js +++ b/js/openstack/views/rds/openstackSecurityGroupCreateView.js @@ -7,7 +7,7 @@ /*global define:true console:true */ define([ 'backbone', - '/js/topstack/views/rds/topstackSecurityGroupCreateView.js' + 'topstack/views/rds/topstackSecurityGroupCreateView' ], function( Backbone, TopStackSecurityGroupCreateView ) { var OpenStackSecurityGroupCreateView = TopStackSecurityGroupCreateView.extend({ @@ -19,4 +19,4 @@ define([ }); return OpenStackSecurityGroupCreateView; -}); \ No newline at end of file +}); diff --git a/js/openstack/views/rds/openstackSecuritygroupsAppView.js b/js/openstack/views/rds/openstackSecuritygroupsAppView.js index 09098f07..dfb6eb2e 100644 --- a/js/openstack/views/rds/openstackSecuritygroupsAppView.js +++ b/js/openstack/views/rds/openstackSecuritygroupsAppView.js @@ -6,8 +6,8 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - '/js/topstack/views/rds/topstackSecuritygroupsAppView.js', - '/js/openstack/views/rds/openstackSecurityGroupCreateView.js' + 'topstack/views/rds/topstackSecuritygroupsAppView', + 'openstack/views/rds/openstackSecurityGroupCreateView' ], function( TopStackSecurityGroupAppView, OpenStackSecurityGroupCreateView ) { 'use strict'; @@ -18,4 +18,4 @@ define([ }); return OpenstackSecurityGroupAppView; -}); \ No newline at end of file +}); diff --git a/js/plugins.js b/js/plugins.js index a4775d1e..f7faa9fd 100644 --- a/js/plugins.js +++ b/js/plugins.js @@ -26,4 +26,4 @@ } }()); -// Place any jQuery/helper plugins in here. +// Place any jQuery/helper plugins in here. \ No newline at end of file diff --git a/js/routers/router.js b/js/routers/router.js index fed4e716..a4f87b3e 100644 --- a/js/routers/router.js +++ b/js/routers/router.js @@ -6,125 +6,141 @@ /*jshint smarttabs:true */ /*global define:true console:true */ define([ - 'jquery', - 'backbone', - 'common', - 'backbone.queryparams' -], function( $, Backbone, Common ) { - 'use strict'; + 'jquery', + 'backbone', + 'common', + 'backbone.queryparams' +], function ( $, Backbone, Common ) { + 'use strict'; - /** - * Router the central dispatcher for matching URLs to code. - * - * @name Router - * @constructor - * @category Core - * @param {Object} initialization object. - * @returns {Object} Returns a Router instance. - */ + /** + * Router the central dispatcher for matching URLs to code. + * + * @name Router + * @constructor + * @category Core + * @param {Object} initialization object. + * @returns {Object} Returns a Router instance. + */ - if(window.app === "stackplace") { - Backbone.Router.namedParameters = true; - }else { - Backbone.Router.namedParameters = false; - } + if (window.app === "stackplace") { + Backbone.Router.namedParameters = true; + } else { + Backbone.Router.namedParameters = false; + } - var Router = Backbone.Router.extend({ + var Router = Backbone.Router.extend({ + routes: { + 'account/cloudcredentials': 'cloudCredentials', + 'cloud/setup/:action/:id': 'cloudSetupRoute', + 'cloud/setup/:action': 'cloudSetupRoute', + 'cloud/setup': 'cloudSetupRoute', + 'account/management': 'accountManagementRoute', + 'resources': 'resourcesRoute', + 'resources/:cloud': 'resourcesRoute', + 'resources/:cloud/:region': 'resourcesRoute', + 'resources/:cloud/:region/:type': 'resourcesRoute', + 'resources/:cloud/:region/:type/:subtype': 'resourcesRoute', + 'resources/:cloud/:region/:type/:subtype/:id': 'resourcesRoute', + 'images': 'imagesRoute', + 'images/:id': 'imagesRoute', + 'assemblies': 'assembliesRoute', + 'platform_components': 'platformComponentsRoute', + 'stacks': 'stacksRoute', + 'offerings': 'offeringsRoute', + 'meshes': 'meshesRoute', + 'projects': 'projects', + 'project/new': 'projectCreate', + 'projects/:url': 'projectEdit', + 'open?:url': 'loadTemplate', + 'projects/:id/update/:resource': 'projectUpdate', + '*actions': 'defaultRoute' + }, - routes:{ - 'account/cloudcredentials': 'cloudCredentials', - 'account/management(/:action)': 'accountManagementRoute', - 'resources': 'resourcesRoute', - 'resources/:cloud': 'resourcesRoute', - 'resources/:cloud/:region': 'resourcesRoute', - 'resources/:cloud/:region/:type': 'resourcesRoute', - 'resources/:cloud/:region/:type/:subtype' : 'resourcesRoute', - 'resources/:cloud/:region/:type/:subtype/:id': 'resourcesRoute', - 'images': 'imagesRoute', - 'images/:id': 'imagesRoute', - 'assemblies': 'assembliesRoute', - 'platform_components': 'platformComponentsRoute', - 'stacks': 'stacksRoute', - 'offerings': 'offeringsRoute', - 'projects': 'projects', - 'project/new': 'projectCreate', - 'projects/:url': 'projectEdit', - 'open?:url': 'loadTemplate', - 'projects/:id/update/:resource': 'projectUpdate', - '*actions': 'defaultRoute' - }, + defaultRoute: function(actions) { + if (window.app === "stackplace") { + if ((typeof actions === 'object') && (actions.url !== undefined)) { + this.trigger('route:projectEdit', actions.url); + } else { + this.trigger('route:projectEdit'); + } + } else { + $("#sidebar").empty(); + $("#sidebar").hide(); + $(".main-nav a").removeClass("nav_selected"); + $("#dashboard_nav").addClass("nav_selected"); + this.trigger("route:dashboard"); + } + }, - defaultRoute: function( actions ) { - if (window.app === "stackplace") { - if ( (typeof actions === 'object') && (actions.url !== undefined) ) { - this.trigger('route:projectEdit', actions.url); - } else { - this.trigger('route:projectEdit'); - } - } else { - $("#sidebar").empty(); - $("#sidebar").hide(); - $(".main-nav a").removeClass("nav_selected"); - this.trigger("route:dashboard"); - } - }, + resourcesRoute: function(cloud, region, type, subtype, id, action) { + $("#sidebar").empty(); + $("#sidebar").hide(); + $(".main-nav a").removeClass("nav_selected"); + $("#resources_nav").addClass("nav_selected"); + this.trigger("route:resources", cloud, region, type, subtype, id); + }, - resourcesRoute: function(cloud, region, type, subtype, id, action) { - $("#sidebar").empty(); - $("#sidebar").hide(); - $(".main-nav a").removeClass("nav_selected"); - $("#resources_nav").addClass("nav_selected"); - this.trigger("route:resources", cloud, region, type, subtype, id); - }, + imagesRoute: function(action) { + $("#sidebar").empty(); + $("#sidebar").hide(); + $(".main-nav a").removeClass("nav_selected"); + $("#images_nav").addClass("nav_selected"); + this.trigger("route:images", action); + }, - imagesRoute: function(action) { - $("#sidebar").empty(); - $("#sidebar").hide(); - $(".main-nav a").removeClass("nav_selected"); - $("#images_nav").addClass("nav_selected"); - this.trigger("route:images", action); - }, + assembliesRoute: function(action) { + $("#sidebar").empty(); + $("#sidebar").hide(); + $(".main-nav a").removeClass("nav_selected"); + $("#assemblies_nav").addClass("nav_selected"); + this.trigger("route:assemblies"); + }, - assembliesRoute: function(action) { - $("#sidebar").empty(); - $("#sidebar").hide(); - $(".main-nav a").removeClass("nav_selected"); - $("#assemblies_nav").addClass("nav_selected"); - this.trigger("route:assemblies"); - }, + platformComponentsRoute: function(action) { + $("#sidebar").empty(); + $("#sidebar").hide(); + $(".main-nav a").removeClass("nav_selected"); + $("#platform_nav").addClass("nav_selected"); + this.trigger("route:platformComponents"); + }, - platformComponentsRoute: function(action) { - $("#sidebar").empty(); - $("#sidebar").hide(); - $(".main-nav a").removeClass("nav_selected"); - $("#platform_nav").addClass("nav_selected"); - this.trigger("route:platformComponents"); - }, + stacksRoute: function(action) { + $("#sidebar").empty(); + $("#sidebar").hide(); + $(".main-nav a").removeClass("nav_selected"); + $("#stacks_nav").addClass("nav_selected"); + this.trigger("route:stacks"); + }, - stacksRoute: function(action) { - $("#sidebar").empty(); - $("#sidebar").hide(); - $(".main-nav a").removeClass("nav_selected"); - $("#stacks_nav").addClass("nav_selected"); - this.trigger("route:stacks"); - }, + offeringsRoute: function(action) { + $("#sidebar").empty(); + $("#sidebar").hide(); + $(".main-nav a").removeClass("nav_selected"); + $("#offerings_nav").addClass("nav_selected"); + this.trigger("route:offerings"); + }, - offeringsRoute: function(action) { - $("#sidebar").empty(); - $("#sidebar").hide(); - $(".main-nav a").removeClass("nav_selected"); - $("#offerings_nav").addClass("nav_selected"); - this.trigger("route:offerings"); - }, + meshesRoute: function(action) { + $("#sidebar").empty(); + $("#sidebar").hide(); + $(".main-nav a").removeClass("nav_selected"); + $("#meshes_nav").addClass("nav_selected"); + this.trigger("route:meshes"); + }, - accountManagementRoute: function(action) { - $("#sidebar").empty(); - $("#sidebar").hide(); - $(".main-nav a").removeClass("nav_selected"); - $("#nav_account").addClass("nav_selected"); - this.trigger("route:accountManagement", action); - } - }); + accountManagementRoute: function(action) { + this.trigger("route:account/management", action); + }, + + cloudSetupRoute: function ( action, id ) { + $("#sidebar").empty(); + $("#sidebar").hide(); + $(".main-nav a").removeClass("nav_selected"); + $("#cloud_setup_nav").addClass('nav_selected'); + this.trigger("route:cloudSetup", action, id); + } + }); - return Router; + return Router; }); diff --git a/js/topstack/collections/autoscale/topstackAutoscaleGroups.js b/js/topstack/collections/autoscale/topstackAutoscaleGroups.js index 0edfe06a..246e02a8 100644 --- a/js/topstack/collections/autoscale/topstackAutoscaleGroups.js +++ b/js/topstack/collections/autoscale/topstackAutoscaleGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/autoscale/topstackAutoscaleGroup.js', + 'topstack/models/autoscale/topstackAutoscaleGroup', 'common' ], function( $, Backbone, AutoscaleGroup, Common ) { 'use strict'; diff --git a/js/topstack/collections/beanstalk/topstackApplications.js b/js/topstack/collections/beanstalk/topstackApplications.js index 71e17cab..39967524 100644 --- a/js/topstack/collections/beanstalk/topstackApplications.js +++ b/js/topstack/collections/beanstalk/topstackApplications.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/beanstalk/topstackApplication.js', + 'topstack/models/beanstalk/topstackApplication', 'common' ], function( $, Backbone, Application, Common ) { 'use strict'; diff --git a/js/topstack/collections/cache/topstackCacheClusters.js b/js/topstack/collections/cache/topstackCacheClusters.js index f583017e..c9834da8 100644 --- a/js/topstack/collections/cache/topstackCacheClusters.js +++ b/js/topstack/collections/cache/topstackCacheClusters.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/cache/topstackCacheCluster.js', + 'topstack/models/cache/topstackCacheCluster', 'common' ], function( $, Backbone, CacheCluster, Common ) { 'use strict'; diff --git a/js/topstack/collections/cache/topstackCacheParameterGroups.js b/js/topstack/collections/cache/topstackCacheParameterGroups.js index f4f163b5..d9a4747b 100644 --- a/js/topstack/collections/cache/topstackCacheParameterGroups.js +++ b/js/topstack/collections/cache/topstackCacheParameterGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/cache/topstackCacheParameterGroup.js', + 'topstack/models/cache/topstackCacheParameterGroup', 'common' ], function( $, Backbone, CacheParameterGroup, Common ) { 'use strict'; diff --git a/js/topstack/collections/cache/topstackCacheSecurityGroups.js b/js/topstack/collections/cache/topstackCacheSecurityGroups.js index e68ebd6f..64385f1e 100644 --- a/js/topstack/collections/cache/topstackCacheSecurityGroups.js +++ b/js/topstack/collections/cache/topstackCacheSecurityGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/cache/topstackCacheSecurityGroup.js', + 'topstack/models/cache/topstackCacheSecurityGroup', 'common' ], function( $, Backbone, CacheSecurityGroup, Common ) { 'use strict'; diff --git a/js/topstack/collections/cloud_watch/topstackAlarms.js b/js/topstack/collections/cloud_watch/topstackAlarms.js index e2c2cae6..919baa5e 100644 --- a/js/topstack/collections/cloud_watch/topstackAlarms.js +++ b/js/topstack/collections/cloud_watch/topstackAlarms.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/cloud_watch/topstackAlarm.js', + 'topstack/models/cloud_watch/topstackAlarm', 'common' ], function( $, Backbone, Alarm, Common ) { 'use strict'; diff --git a/js/topstack/collections/cloud_watch/topstackMetricStatistics.js b/js/topstack/collections/cloud_watch/topstackMetricStatistics.js index 2719f943..cbaaceea 100644 --- a/js/topstack/collections/cloud_watch/topstackMetricStatistics.js +++ b/js/topstack/collections/cloud_watch/topstackMetricStatistics.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/cloud_watch/topstackMetricStatistic.js', + 'topstack/models/cloud_watch/topstackMetricStatistic', 'common' ], function( $, Backbone, MetricStatistic, Common ) { 'use strict'; diff --git a/js/topstack/collections/cloud_watch/topstackMetrics.js b/js/topstack/collections/cloud_watch/topstackMetrics.js index b9eed63a..e4370749 100644 --- a/js/topstack/collections/cloud_watch/topstackMetrics.js +++ b/js/topstack/collections/cloud_watch/topstackMetrics.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/cloud_watch/topstackMetric.js', + 'topstack/models/cloud_watch/topstackMetric', 'common' ], function( $, Backbone, Metric, Common ) { 'use strict'; diff --git a/js/topstack/collections/dns/topstackHostedZones.js b/js/topstack/collections/dns/topstackHostedZones.js index d9c4de1b..230439f3 100644 --- a/js/topstack/collections/dns/topstackHostedZones.js +++ b/js/topstack/collections/dns/topstackHostedZones.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/dns/topstackHostedZone.js', + 'topstack/models/dns/topstackHostedZone', 'common' ], function( $, Backbone, HostedZone, Common ) { 'use strict'; diff --git a/js/topstack/collections/dns/topstackRecordSets.js b/js/topstack/collections/dns/topstackRecordSets.js index 652d412a..e1160e73 100644 --- a/js/topstack/collections/dns/topstackRecordSets.js +++ b/js/topstack/collections/dns/topstackRecordSets.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/dns/topstackRecordSet.js', + 'topstack/models/dns/topstackRecordSet', 'common' ], function( $, Backbone, RecordSet, Common ) { 'use strict'; diff --git a/js/topstack/collections/load_balancer/topstackListeners.js b/js/topstack/collections/load_balancer/topstackListeners.js index f6fb4953..56f0f22b 100644 --- a/js/topstack/collections/load_balancer/topstackListeners.js +++ b/js/topstack/collections/load_balancer/topstackListeners.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/load_balancer/topstackListener.js', + 'topstack/models/load_balancer/topstackListener', 'common' ], function( $, Backbone, Listener, Common ) { 'use strict'; diff --git a/js/topstack/collections/load_balancer/topstackLoadBalancers.js b/js/topstack/collections/load_balancer/topstackLoadBalancers.js index 9f464301..111d8836 100644 --- a/js/topstack/collections/load_balancer/topstackLoadBalancers.js +++ b/js/topstack/collections/load_balancer/topstackLoadBalancers.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/load_balancer/topstackLoadBalancer.js', + 'topstack/models/load_balancer/topstackLoadBalancer', 'common' ], function( $, Backbone, LoadBalancer, Common ) { 'use strict'; diff --git a/js/topstack/collections/queue/topstackQueues.js b/js/topstack/collections/queue/topstackQueues.js index b668e046..eca856b6 100644 --- a/js/topstack/collections/queue/topstackQueues.js +++ b/js/topstack/collections/queue/topstackQueues.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/queue/topstackQueue.js', + 'topstack/models/queue/topstackQueue', 'common' ], function( $, Backbone, Queue, Common ) { 'use strict'; diff --git a/js/topstack/collections/rds/topstackDBEngineVersions.js b/js/topstack/collections/rds/topstackDBEngineVersions.js index fd02a48f..7402d125 100644 --- a/js/topstack/collections/rds/topstackDBEngineVersions.js +++ b/js/topstack/collections/rds/topstackDBEngineVersions.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/rds/topstackDBEngineVersion.js', + 'topstack/models/rds/topstackDBEngineVersion', 'common' ], function( $, Backbone, DBEngineVersion, Common ) { 'use strict'; diff --git a/js/topstack/collections/rds/topstackDBParameterGroups.js b/js/topstack/collections/rds/topstackDBParameterGroups.js index 0a3c5273..4adc252a 100644 --- a/js/topstack/collections/rds/topstackDBParameterGroups.js +++ b/js/topstack/collections/rds/topstackDBParameterGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/rds/topstackDBParameterGroup.js', + 'topstack/models/rds/topstackDBParameterGroup', 'common' ], function( $, Backbone, DBParameterGroup, Common ) { 'use strict'; diff --git a/js/topstack/collections/rds/topstackDBSecurityGroups.js b/js/topstack/collections/rds/topstackDBSecurityGroups.js index 5ee8db2c..7d09ccee 100644 --- a/js/topstack/collections/rds/topstackDBSecurityGroups.js +++ b/js/topstack/collections/rds/topstackDBSecurityGroups.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/rds/topstackDBSecurityGroup.js', + 'topstack/models/rds/topstackDBSecurityGroup', 'common' ], function( $, Backbone, DBSecurityGroup, Common ) { 'use strict'; diff --git a/js/topstack/collections/rds/topstackRelationalDatabases.js b/js/topstack/collections/rds/topstackRelationalDatabases.js index d5bcfa46..baa3575d 100644 --- a/js/topstack/collections/rds/topstackRelationalDatabases.js +++ b/js/topstack/collections/rds/topstackRelationalDatabases.js @@ -8,7 +8,7 @@ define([ 'jquery', 'backbone', - '/js/topstack/models/rds/topstackRelationalDatabase.js', + 'topstack/models/rds/topstackRelationalDatabase', 'common' ], function( $, Backbone, RelationalDatabase, Common ) { 'use strict'; diff --git a/js/topstack/views/admin/topstackAdminconsoleAppView.js b/js/topstack/views/admin/topstackAdminconsoleAppView.js index 2ceec8a1..e6f1fc42 100644 --- a/js/topstack/views/admin/topstackAdminconsoleAppView.js +++ b/js/topstack/views/admin/topstackAdminconsoleAppView.js @@ -59,7 +59,7 @@ define([ $("#resource_app").html(""); }else if (this.adminConsoleUrl){ //Find credentials to log in to console with access key and secret key - var credentials = JSON.parse(sessionStorage.cloud_credentials); + var credentials = Common.credentials; var credential = {}; for(var i = 0; i < credentials.length; i++){ if(this.selectedCloudAccount === credentials[i].cloud_credential.cloud_account_id){ @@ -90,7 +90,7 @@ define([ this.cloudAccounts = new CloudAccountsType(); this.cloudAccounts.on( 'reset', this.setCloudAccount, this ); this.cloudAccounts.fetch({ - data: $.param({ org_id: sessionStorage.org_id, account_id: sessionStorage.account_id}), + data: $.param({ org_id: Common.account.org_id, account_id: Common.account.id}), reset: true }); }else { diff --git a/js/topstack/views/autoscale/topstackAutoscaleGroupCreateView.js b/js/topstack/views/autoscale/topstackAutoscaleGroupCreateView.js index 8c971b18..8ef65cfc 100644 --- a/js/topstack/views/autoscale/topstackAutoscaleGroupCreateView.js +++ b/js/topstack/views/autoscale/topstackAutoscaleGroupCreateView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/autoscale/topstackAutoscaleGroupCreateTemplate.html', - '/js/topstack/models/autoscale/topstackAutoscaleGroup.js', - '/js/openstack/collections/compute/openstackImages.js', + 'topstack/models/autoscale/topstackAutoscaleGroup', + 'openstack/collections/compute/openstackImages', 'common', 'spinner', 'jquery.multiselect', @@ -137,9 +137,9 @@ define([ $(".spinner").remove(); var createView = this; - var policies = JSON.parse(sessionStorage.group_policies); + var policies = Common.account.group_policies; var default_images = []; - var permissions = JSON.parse(sessionStorage.permissions); + var permissions = Common.account.permissions; //Check if this user has a policy for images they can use if not use all images. if(policies.length > 0 && permissions.length < 1){ default_images = policies[0].group_policy.os_governance.default_images; diff --git a/js/topstack/views/autoscale/topstackAutoscaleGroupUpdateView.js b/js/topstack/views/autoscale/topstackAutoscaleGroupUpdateView.js index 0ffb8ffd..bf43524d 100644 --- a/js/topstack/views/autoscale/topstackAutoscaleGroupUpdateView.js +++ b/js/topstack/views/autoscale/topstackAutoscaleGroupUpdateView.js @@ -11,12 +11,12 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/autoscale/topstackAutoscaleGroupCreateTemplate.html', - '/js/topstack/models/autoscale/topstackAutoscaleGroup.js', - '/js/openstack/collections/compute/openstackImages.js', - '/js/openstack/collections/compute/openstackFlavors.js', - '/js/openstack/collections/compute/openstackAvailabilityZones.js', - '/js/openstack/collections/compute/openstackKeyPairs.js', - '/js/openstack/collections/compute/openstackSecurityGroups.js', + 'topstack/models/autoscale/topstackAutoscaleGroup', + 'openstack/collections/compute/openstackImages', + 'openstack/collections/compute/openstackFlavors', + 'openstack/collections/compute/openstackAvailabilityZones', + 'openstack/collections/compute/openstackKeyPairs', + 'openstack/collections/compute/openstackSecurityGroups', 'common', 'jquery.multiselect', 'jquery.multiselect.filter' diff --git a/js/topstack/views/autoscale/topstackAutoscaleGroupsAppView.js b/js/topstack/views/autoscale/topstackAutoscaleGroupsAppView.js index 110af1fe..161151ba 100644 --- a/js/topstack/views/autoscale/topstackAutoscaleGroupsAppView.js +++ b/js/topstack/views/autoscale/topstackAutoscaleGroupsAppView.js @@ -12,10 +12,10 @@ define([ 'views/resource/resourceAppView', 'views/resource/resourceRowView', 'text!templates/topstack/autoscale/topstackAutoscaleAppTemplate.html', - '/js/topstack/models/autoscale/topstackAutoscaleGroup.js', - '/js/topstack/collections/autoscale/topstackAutoscaleGroups.js', - '/js/topstack/views/autoscale/topstackAutoscaleGroupUpdateView.js', - '/js/topstack/collections/cloud_watch/topstackMetricStatistics.js', + 'topstack/models/autoscale/topstackAutoscaleGroup', + 'topstack/collections/autoscale/topstackAutoscaleGroups', + 'topstack/views/autoscale/topstackAutoscaleGroupUpdateView', + 'topstack/collections/cloud_watch/topstackMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', diff --git a/js/topstack/views/beanstalk/topstackApplicationsAppView.js b/js/topstack/views/beanstalk/topstackApplicationsAppView.js index 4f5cbab8..237a8d4a 100644 --- a/js/topstack/views/beanstalk/topstackApplicationsAppView.js +++ b/js/topstack/views/beanstalk/topstackApplicationsAppView.js @@ -11,12 +11,12 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/aws/beanstalk/awsApplicationAppTemplate.html', - '/js/topstack/models/beanstalk/topstackApplication.js', - '/js/topstack/collections/beanstalk/topstackApplications.js', - '/js/aws/views/beanstalk/awsApplicationCreateView.js', - '/js/aws/views/beanstalk/awsVersionCreateView.js', - '/js/aws/views/beanstalk/awsEnvironmentCreateView.js', - '/js/aws/views/beanstalk/awsEnvironmentModifyView.js', + 'topstack/models/beanstalk/topstackApplication', + 'topstack/collections/beanstalk/topstackApplications', + 'aws/views/beanstalk/awsApplicationCreateView', + 'aws/views/beanstalk/awsVersionCreateView', + 'aws/views/beanstalk/awsEnvironmentCreateView', + 'aws/views/beanstalk/awsEnvironmentModifyView', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/topstack/views/cache/topstackClusterCreateView.js b/js/topstack/views/cache/topstackClusterCreateView.js index 96d953c6..2840d225 100644 --- a/js/topstack/views/cache/topstackClusterCreateView.js +++ b/js/topstack/views/cache/topstackClusterCreateView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/cache/topstackCacheClusterCreateTemplate.html', - '/js/topstack/models/cache/topstackCacheCluster.js', - '/js/topstack/collections/cache/topstackCacheParameterGroups.js', - '/js/topstack/collections/cache/topstackCacheSecurityGroups.js', + 'topstack/models/cache/topstackCacheCluster', + 'topstack/collections/cache/topstackCacheParameterGroups', + 'topstack/collections/cache/topstackCacheSecurityGroups', 'common', 'jquery.multiselect', 'jquery.multiselect.filter' diff --git a/js/topstack/views/cache/topstackClustersAppView.js b/js/topstack/views/cache/topstackClustersAppView.js index ea66f37b..9863497c 100644 --- a/js/topstack/views/cache/topstackClustersAppView.js +++ b/js/topstack/views/cache/topstackClustersAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/topstack/cache/topstackCacheClusterAppTemplate.html', - '/js/topstack/models/cache/topstackCacheCluster.js', - '/js/topstack/collections/cache/topstackCacheClusters.js', - '/js/topstack/collections/cloud_watch/topstackMetricStatistics.js', + 'topstack/models/cache/topstackCacheCluster', + 'topstack/collections/cache/topstackCacheClusters', + 'topstack/collections/cloud_watch/topstackMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', diff --git a/js/topstack/views/cache/topstackParameterGroupCreateView.js b/js/topstack/views/cache/topstackParameterGroupCreateView.js index 36c66a6e..e54b0284 100644 --- a/js/topstack/views/cache/topstackParameterGroupCreateView.js +++ b/js/topstack/views/cache/topstackParameterGroupCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/cache/topstackParameterGroupCreateTemplate.html', - '/js/topstack/models/cache/topstackCacheParameterGroup.js', + 'topstack/models/cache/topstackCacheParameterGroup', 'icanhaz', 'common' diff --git a/js/topstack/views/cache/topstackParametergroupsAppView.js b/js/topstack/views/cache/topstackParametergroupsAppView.js index 7d285128..34986e3b 100644 --- a/js/topstack/views/cache/topstackParametergroupsAppView.js +++ b/js/topstack/views/cache/topstackParametergroupsAppView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/topstack/cache/topstackParameterGroupAppTemplate.html', - '/js/topstack/models/cache/topstackCacheParameterGroup.js', - '/js/topstack/collections/cache/topstackCacheParameterGroups.js', + 'topstack/models/cache/topstackCacheParameterGroup', + 'topstack/collections/cache/topstackCacheParameterGroups', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/topstack/views/cache/topstackSecurityGroupCreateView.js b/js/topstack/views/cache/topstackSecurityGroupCreateView.js index 8d33af56..19ea51ee 100644 --- a/js/topstack/views/cache/topstackSecurityGroupCreateView.js +++ b/js/topstack/views/cache/topstackSecurityGroupCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/cache/topstackSecurityGroupCreateTemplate.html', - '/js/topstack/models/cache/topstackCacheSecurityGroup.js', + 'topstack/models/cache/topstackCacheSecurityGroup', 'icanhaz', 'common' diff --git a/js/topstack/views/cache/topstackSecuritygroupsAppView.js b/js/topstack/views/cache/topstackSecuritygroupsAppView.js index de2c0647..7d56594a 100644 --- a/js/topstack/views/cache/topstackSecuritygroupsAppView.js +++ b/js/topstack/views/cache/topstackSecuritygroupsAppView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/topstack/cache/topstackSecurityGroupAppTemplate.html', - '/js/topstack/models/cache/topstackCacheSecurityGroup.js', - '/js/topstack/collections/cache/topstackCacheSecurityGroups.js', + 'topstack/models/cache/topstackCacheSecurityGroup', + 'topstack/collections/cache/topstackCacheSecurityGroups', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/topstack/views/cloud_watch/topstackAlarmCreateView.js b/js/topstack/views/cloud_watch/topstackAlarmCreateView.js index 296e3882..ec2d4755 100644 --- a/js/topstack/views/cloud_watch/topstackAlarmCreateView.js +++ b/js/topstack/views/cloud_watch/topstackAlarmCreateView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/cloud_watch/topstackAlarmCreateTemplate.html', - '/js/topstack/models/cloud_watch/topstackAlarm.js', - '/js/topstack/collections/cloud_watch/topstackMetrics.js', + 'topstack/models/cloud_watch/topstackAlarm', + 'topstack/collections/cloud_watch/topstackMetrics', 'common' ], function( $, _, Backbone, DialogView, alarmCreateTemplate, Alarm, Metrics, Common ) { diff --git a/js/topstack/views/cloud_watch/topstackAlarmsAppView.js b/js/topstack/views/cloud_watch/topstackAlarmsAppView.js index 0a725db6..cbac5e06 100644 --- a/js/topstack/views/cloud_watch/topstackAlarmsAppView.js +++ b/js/topstack/views/cloud_watch/topstackAlarmsAppView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/topstack/cloud_watch/topstackAlarmAppTemplate.html', - '/js/topstack/models/cloud_watch/topstackAlarm.js', - '/js/topstack/collections/cloud_watch/topstackAlarms.js', + 'topstack/models/cloud_watch/topstackAlarm', + 'topstack/collections/cloud_watch/topstackAlarms', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/topstack/views/dns/topstackHostedZoneCreateView.js b/js/topstack/views/dns/topstackHostedZoneCreateView.js index 3b2107b1..d0304664 100644 --- a/js/topstack/views/dns/topstackHostedZoneCreateView.js +++ b/js/topstack/views/dns/topstackHostedZoneCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/dns/topstackHostedZoneCreateTemplate.html', - '/js/topstack/models/dns/topstackHostedZone.js', + 'topstack/models/dns/topstackHostedZone', 'common' ], function( $, _, Backbone, DialogView, hostedZoneCreateTemplate, HostedZone, Common ) { diff --git a/js/topstack/views/dns/topstackHostedzonesAppView.js b/js/topstack/views/dns/topstackHostedzonesAppView.js index 45900b38..becf5515 100644 --- a/js/topstack/views/dns/topstackHostedzonesAppView.js +++ b/js/topstack/views/dns/topstackHostedzonesAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/topstack/dns/topstackHostedZoneAppTemplate.html', - '/js/topstack/models/dns/topstackHostedZone.js', - '/js/topstack/collections/dns/topstackHostedZones.js', - '/js/topstack/models/dns/topstackRecordSet.js', - '/js/topstack/collections/dns/topstackRecordSets.js', + 'topstack/models/dns/topstackHostedZone', + 'topstack/collections/dns/topstackHostedZones', + 'topstack/models/dns/topstackRecordSet', + 'topstack/collections/dns/topstackRecordSets', 'views/resource/resourceRowView', 'icanhaz', 'common', diff --git a/js/topstack/views/dns/topstackRecordSetCreateView.js b/js/topstack/views/dns/topstackRecordSetCreateView.js index cf38357e..914d75ea 100644 --- a/js/topstack/views/dns/topstackRecordSetCreateView.js +++ b/js/topstack/views/dns/topstackRecordSetCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/dns/topstackRecordSetCreateTemplate.html', - '/js/topstack/models/dns/topstackRecordSet.js', + 'topstack/models/dns/topstackRecordSet', 'common' ], function( $, _, Backbone, DialogView, recordSetCreateTemplate, RecordSet, Common ) { diff --git a/js/topstack/views/load_balancer/topstackLoadBalancerCreateView.js b/js/topstack/views/load_balancer/topstackLoadBalancerCreateView.js index 33d52f56..4e14e319 100644 --- a/js/topstack/views/load_balancer/topstackLoadBalancerCreateView.js +++ b/js/topstack/views/load_balancer/topstackLoadBalancerCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/load_balancer/topstackLoadBalancerCreateTemplate.html', - '/js/topstack/models/load_balancer/topstackLoadBalancer.js', + 'topstack/models/load_balancer/topstackLoadBalancer', 'common', 'jquery.multiselect', 'jquery.multiselect.filter', diff --git a/js/topstack/views/load_balancer/topstackLoadbalancersAppView.js b/js/topstack/views/load_balancer/topstackLoadbalancersAppView.js index b7419249..8162307a 100644 --- a/js/topstack/views/load_balancer/topstackLoadbalancersAppView.js +++ b/js/topstack/views/load_balancer/topstackLoadbalancersAppView.js @@ -12,10 +12,10 @@ define([ 'views/resource/resourceAppView', 'views/resource/resourceRowView', 'text!templates/topstack/load_balancer/topstackLoadBalancerAppTemplate.html', - '/js/topstack/models/load_balancer/topstackLoadBalancer.js', - '/js/topstack/collections/load_balancer/topstackLoadBalancers.js', - '/js/topstack/collections/load_balancer/topstackListeners.js', - '/js/topstack/collections/cloud_watch/topstackMetricStatistics.js', + 'topstack/models/load_balancer/topstackLoadBalancer', + 'topstack/collections/load_balancer/topstackLoadBalancers', + 'topstack/collections/load_balancer/topstackListeners', + 'topstack/collections/cloud_watch/topstackMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', diff --git a/js/topstack/views/queue/topstackQueueCreateView.js b/js/topstack/views/queue/topstackQueueCreateView.js index 91847861..67e3bde9 100644 --- a/js/topstack/views/queue/topstackQueueCreateView.js +++ b/js/topstack/views/queue/topstackQueueCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/queue/topstackQueueCreateTemplate.html', - '/js/topstack/models/queue/topstackQueue.js', + 'topstack/models/queue/topstackQueue', 'common' ], function( $, _, Backbone, DialogView, queueCreateTemplate, Queue, Common ) { diff --git a/js/topstack/views/queue/topstackQueuesAppView.js b/js/topstack/views/queue/topstackQueuesAppView.js index 18d37d91..309af95e 100644 --- a/js/topstack/views/queue/topstackQueuesAppView.js +++ b/js/topstack/views/queue/topstackQueuesAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/topstack/queue/topstackQueueAppTemplate.html', - '/js/topstack/models/queue/topstackQueue.js', - '/js/topstack/collections/queue/topstackQueues.js', - '/js/topstack/views/queue/topstackQueueCreateView.js', + 'topstack/models/queue/topstackQueue', + 'topstack/collections/queue/topstackQueues', + 'topstack/views/queue/topstackQueueCreateView', 'icanhaz', 'common' ], function( $, _, Backbone, ResourceAppView, queueAppTemplate, Queue, Queues, QueueCreateView, ich, Common ) { diff --git a/js/topstack/views/rds/topstackParameterGroupCreateView.js b/js/topstack/views/rds/topstackParameterGroupCreateView.js index 97a091fe..ad9b0cd9 100644 --- a/js/topstack/views/rds/topstackParameterGroupCreateView.js +++ b/js/topstack/views/rds/topstackParameterGroupCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/rds/topstackParameterGroupCreateTemplate.html', - '/js/topstack/models/rds/topstackDBParameterGroup.js', + 'topstack/models/rds/topstackDBParameterGroup', 'icanhaz', 'common' diff --git a/js/topstack/views/rds/topstackParametergroupsAppView.js b/js/topstack/views/rds/topstackParametergroupsAppView.js index 19b711e0..74e87682 100644 --- a/js/topstack/views/rds/topstackParametergroupsAppView.js +++ b/js/topstack/views/rds/topstackParametergroupsAppView.js @@ -11,8 +11,8 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/topstack/cache/topstackParameterGroupAppTemplate.html', - '/js/topstack/models/rds/topstackDBParameterGroup.js', - '/js/topstack/collections/rds/topstackDBParameterGroups.js', + 'topstack/models/rds/topstackDBParameterGroup', + 'topstack/collections/rds/topstackDBParameterGroups', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/topstack/views/rds/topstackRelationalDatabaseCreateView.js b/js/topstack/views/rds/topstackRelationalDatabaseCreateView.js index 521e90a3..96793a9e 100644 --- a/js/topstack/views/rds/topstackRelationalDatabaseCreateView.js +++ b/js/topstack/views/rds/topstackRelationalDatabaseCreateView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/rds/topstackRelationalDatabaseCreateTemplate.html', - '/js/topstack/models/rds/topstackRelationalDatabase.js', - '/js/topstack/collections/rds/topstackDBEngineVersions.js', - '/js/topstack/collections/rds/topstackDBParameterGroups.js', - '/js/topstack/collections/rds/topstackDBSecurityGroups.js', + 'topstack/models/rds/topstackRelationalDatabase', + 'topstack/collections/rds/topstackDBEngineVersions', + 'topstack/collections/rds/topstackDBParameterGroups', + 'topstack/collections/rds/topstackDBSecurityGroups', 'common', 'jquery.multiselect', 'jquery.multiselect.filter' diff --git a/js/topstack/views/rds/topstackRelationaldatabasesAppView.js b/js/topstack/views/rds/topstackRelationaldatabasesAppView.js index 10272f1b..b80b2fa0 100644 --- a/js/topstack/views/rds/topstackRelationaldatabasesAppView.js +++ b/js/topstack/views/rds/topstackRelationaldatabasesAppView.js @@ -11,10 +11,10 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/topstack/rds/topstackRelationalDatabaseAppTemplate.html', - '/js/topstack/models/rds/topstackRelationalDatabase.js', - '/js/topstack/collections/rds/topstackRelationalDatabases.js', - '/js/topstack/views/rds/topstackRelationalDatabaseCreateView.js', - '/js/topstack/collections/cloud_watch/topstackMetricStatistics.js', + 'topstack/models/rds/topstackRelationalDatabase', + 'topstack/collections/rds/topstackRelationalDatabases', + 'topstack/views/rds/topstackRelationalDatabaseCreateView', + 'topstack/collections/cloud_watch/topstackMetricStatistics', 'text!templates/emptyGraphTemplate.html', 'icanhaz', 'common', diff --git a/js/topstack/views/rds/topstackSecurityGroupCreateView.js b/js/topstack/views/rds/topstackSecurityGroupCreateView.js index d2ea174f..9b3244d6 100644 --- a/js/topstack/views/rds/topstackSecurityGroupCreateView.js +++ b/js/topstack/views/rds/topstackSecurityGroupCreateView.js @@ -11,7 +11,7 @@ define([ 'backbone', 'views/dialogView', 'text!templates/topstack/cache/topstackSecurityGroupCreateTemplate.html', - '/js/topstack/models/rds/topstackDBSecurityGroup.js', + 'topstack/models/rds/topstackDBSecurityGroup', 'icanhaz', 'common' diff --git a/js/topstack/views/rds/topstackSecuritygroupsAppView.js b/js/topstack/views/rds/topstackSecuritygroupsAppView.js index da67498b..47d24e49 100644 --- a/js/topstack/views/rds/topstackSecuritygroupsAppView.js +++ b/js/topstack/views/rds/topstackSecuritygroupsAppView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/resource/resourceAppView', 'text!templates/topstack/cache/topstackSecurityGroupAppTemplate.html', - '/js/topstack/models/rds/topstackDBSecurityGroup.js', - '/js/topstack/collections/rds/topstackDBSecurityGroups.js', - '/js/openstack/collections/compute/openstackSecurityGroups.js', + 'topstack/models/rds/topstackDBSecurityGroup', + 'topstack/collections/rds/topstackDBSecurityGroups', + 'openstack/collections/compute/openstackSecurityGroups', 'icanhaz', 'common', 'jquery.dataTables' diff --git a/js/util/url.js b/js/util/url.js new file mode 100644 index 00000000..fb52cb6e --- /dev/null +++ b/js/util/url.js @@ -0,0 +1,20 @@ +define(['URIjs/URI'], function (URI) { + + // Check for valid URL, and return callback with true or false + URI.validate = function(url, callback) { + var tag = document.createElement('script'); + tag.src = url; + tag.async = true; + tag.onload = function (e) { + document.getElementsByTagName('head')[0].removeChild(tag); + callback(true); + } + tag.onerror = function (e) { + document.getElementsByTagName('head')[0].removeChild(tag); + callback(false) + } + document.getElementsByTagName('head')[0].appendChild(tag); + }; + + return URI; +}); diff --git a/js/vcloud/collections/catalog/vcloudCatalogItems.js b/js/vcloud/collections/catalog/vcloudCatalogItems.js new file mode 100644 index 00000000..c37aa582 --- /dev/null +++ b/js/vcloud/collections/catalog/vcloudCatalogItems.js @@ -0,0 +1,31 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'backbone', + 'common', + 'vcloud/collections/vcloudCollection', + 'vcloud/models/catalog/vcloudCatalogItem' +], function ( Backbone, Common, VCloudCollection, VCloudCatalogItem ) { + 'use strict'; + + var CatalogItems = VCloudCollection.extend({ + + initialize : function ( options ) { + this.catalog = options.catalog; + + VCloudCollection.prototype.initialize.call(this, options); + }, + + model : VCloudCatalogItem, + + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/catalog_items' + + }); + + return CatalogItems; +}); diff --git a/js/vcloud/collections/catalog/vcloudCatalogs.js b/js/vcloud/collections/catalog/vcloudCatalogs.js new file mode 100644 index 00000000..59fac31e --- /dev/null +++ b/js/vcloud/collections/catalog/vcloudCatalogs.js @@ -0,0 +1,24 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'backbone', + 'common', + 'vcloud/models/catalog/vcloudCatalog' +], function ( Backbone, Common, VCloudCatalog ) { + 'use strict'; + + var Catalogs = Backbone.Collection.extend({ + + model : VCloudCatalog, + + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/catalogs' + + }); + + return Catalogs; +}); diff --git a/js/vcloud/collections/compute/vcloudDataCenters.js b/js/vcloud/collections/compute/vcloudDataCenters.js new file mode 100644 index 00000000..d73cc474 --- /dev/null +++ b/js/vcloud/collections/compute/vcloudDataCenters.js @@ -0,0 +1,23 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'backbone', + 'common', + 'vcloud/models/compute/vcloudDataCenter' +], function ( Backbone, Common, VCloudDataCenter ) { + 'use strict'; + + var DataCenters = Backbone.Collection.extend({ + + model : VCloudDataCenter, + + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers' + }); + + return DataCenters; +}); diff --git a/js/vcloud/collections/compute/vcloudVapps.js b/js/vcloud/collections/compute/vcloudVapps.js new file mode 100644 index 00000000..b88eacec --- /dev/null +++ b/js/vcloud/collections/compute/vcloudVapps.js @@ -0,0 +1,36 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'backbone', + 'common', + 'vcloud/models/compute/vcloudVapp' +], function ( Backbone, Common, VCloudVapp ) { + 'use strict'; + + var Vapps = Backbone.Collection.extend({ + + model : VCloudVapp, + + initialize : function ( options ) { + this.url = Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + encodeURIComponent(options.vdc_id) + '/vapps'; + Backbone.Collection.prototype.initialize.call(this); + this.cred_id = options.cred_id; + }, + + fetch : function ( options ) { + options = options || {}; + options.data = options.data || {}; + options.data.cred_id = this.cred_id; + + Backbone.Collection.prototype.fetch.call(this, options); + } + + }); + + return Vapps; +}); diff --git a/js/vcloud/collections/compute/vcloudVms.js b/js/vcloud/collections/compute/vcloudVms.js new file mode 100644 index 00000000..94e94868 --- /dev/null +++ b/js/vcloud/collections/compute/vcloudVms.js @@ -0,0 +1,33 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'backbone', + 'common', + 'vcloud/models/compute/vcloudVm' +], function ( Backbone, Common, VCloudVm ) { + 'use strict'; + + var Vms = Backbone.Collection.extend({ + + model : VCloudVm, + + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/vms', + + initialize : function ( options ) { + if(!(options && options.vdc_id && options.vapp_id)) { + Backbone.Collection.prototype.initialize.call(this); + } + + this.options = options; + this.url = Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/vms?cred_id=' + options.cred_id; + Backbone.Collection.prototype.initialize.call(this, options); + } + }); + + return Vms; +}); diff --git a/js/vcloud/collections/network/vcloudNetworks.js b/js/vcloud/collections/network/vcloudNetworks.js new file mode 100644 index 00000000..f40422e9 --- /dev/null +++ b/js/vcloud/collections/network/vcloudNetworks.js @@ -0,0 +1,23 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'backbone', + 'common', + 'vcloud/models/network/vcloudNetwork' +], function ( Backbone, Common, VCloudNetwork ) { + 'use strict'; + + var Networks = Backbone.Collection.extend({ + + model : VCloudNetwork, + + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/networks/' + }); + + return Networks; +}); diff --git a/js/vcloud/models/catalog/vcloudCatalog.js b/js/vcloud/models/catalog/vcloudCatalog.js new file mode 100644 index 00000000..bab55c30 --- /dev/null +++ b/js/vcloud/models/catalog/vcloudCatalog.js @@ -0,0 +1,39 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common', + 'models/resource/resourceModel' +], function ( $, _, Backbone, Common, ResourceModel ) { + var VCloudCatalog = ResourceModel.extend({ + + defaults : { + name : '' + }, + + instantiateVapp : function ( options ) { + var url = Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/catalogs/' + options.cat_id + '/items/' + options.item_id + '/vapp?cred_id=' + options.cred_id; + $.ajax({ + type : 'POST', + url : url, + data : { + cred_id : options.cred_id, + vapp_name : options.vapp_name, + vapp_options : options.vapp_options + }, + success: function ( result ) { + console.log(result); + } + }); + } + }); + + return VCloudCatalog; +}); \ No newline at end of file diff --git a/js/vcloud/models/catalog/vcloudCatalogItem.js b/js/vcloud/models/catalog/vcloudCatalogItem.js new file mode 100644 index 00000000..382a66a6 --- /dev/null +++ b/js/vcloud/models/catalog/vcloudCatalogItem.js @@ -0,0 +1,22 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common', + 'models/resource/resourceModel' +], function ( $, _, Backbone, Common, ResourceModel ) { + var VCloudCatalogItem = ResourceModel.extend({ + defaults : { + name : '' + } + }); + + return VCloudCatalogItem; +}); \ No newline at end of file diff --git a/js/vcloud/models/compute/vcloudDataCenter.js b/js/vcloud/models/compute/vcloudDataCenter.js new file mode 100644 index 00000000..b71f7b2d --- /dev/null +++ b/js/vcloud/models/compute/vcloudDataCenter.js @@ -0,0 +1,25 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common', + 'models/resource/resourceModel' +], function ( $, _, Backbone, Common, ResourceModel ) { + var VCloudDataCenter = ResourceModel.extend({ + + defaults : { + name : '' + }, + + apiUrl : Common.apiUrl + "stackstudio/v1/cloud_management/vcloud/compute/data_centers" + }); + + return VCloudDataCenter; +}); \ No newline at end of file diff --git a/js/vcloud/models/compute/vcloudOrganization.js b/js/vcloud/models/compute/vcloudOrganization.js new file mode 100644 index 00000000..2d93fa55 --- /dev/null +++ b/js/vcloud/models/compute/vcloudOrganization.js @@ -0,0 +1,33 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common', + 'models/resource/resourceModel' +], function ( $, _, Backbone, Common, ResourceModel ) { + var VCloudOrganization = ResourceModel.extend({ + + defaults : { + name : '' + }, + + apiUrl : Common.apiUrl + "stackstudio/v1/cloud_management/vcloud/compute/organizations", + + create : function ( credentialId, options ) { + var ajaxOptions = { + cred_id : credentialId, + "organization" : options + }; + this.sendAjaxAction(this.apiUrl, "POST", ajaxOptions); + } + }); + + return VCloudOrganization; +}); \ No newline at end of file diff --git a/js/vcloud/models/compute/vcloudVapp.js b/js/vcloud/models/compute/vcloudVapp.js new file mode 100644 index 00000000..c6500355 --- /dev/null +++ b/js/vcloud/models/compute/vcloudVapp.js @@ -0,0 +1,204 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common', + 'models/resource/resourceModel' +], function ( $, _, Backbone, Common, ResourceModel ) { + var VCloudVapp = ResourceModel.extend({ + + defaults : { + cred_id : '' + }, + + parse : function ( res ) { + res.status = this.getStatus(res.status); + return res; + }, + + getStatus : function ( code ) { + switch(parseInt(code, 10)) { + case 2: + return "Deployed"; + case 3: + return "Suspended"; + case 4: + return "Powered On"; + case 8: + return "Powered Off"; + case 10: + return "Mixed"; + default: + return "Unknown"; + } + }, + + defaultErrorHandler : function ( err ) { + var status; + var message; + if(!err) { + status = "Unknown"; + message = "An unknown error has occurred."; + return Common.errorDialog(status, message); + } + + console.log("AJAX Error: ", err); + + status = err.status || err.status_code || err.errorCode || err.minorErrorCode || "Unknown"; + message = (typeof err === 'string') ? err : err.responseText || err.message; + if(typeof message !== 'string') { + message = "An unknown error has occurred."; + } + return Common.errorDialog("Error (" + status + ")", message); + }, + + destroy : function ( options ) { + $.ajax({ + type: 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '?_method=DELETE&cred_id=' + options.cred_id, + success : options.success || function ( result ) { + console.log(result); + }, + error : options.error || this.defaultErrorHandler + }); + }, + + + createSnapshot : function ( options ) { + $.ajax({ + type : 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/snapshot', + data : { + cred_id : options.cred_id + }, + success : options.success || function ( result ) { + console.log(result); + }, + error : options.error || this.defaultErrorHandler + }); + }, + + revert : function ( options ) { + $.ajax({ + type : 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/revert_to_snapshot', + data : { + cred_id : options.cred_id + }, + success : options.success || function ( result ) { + console.log(result); + }, + error : options.error || this.defaultErrorHandler + }); + }, + + removeSnapshots : function ( options ) { + $.ajax({ + type : 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/snapshot?_method=DELETE&cred_id=' + options.cred_id, + data : { + cred_id : options.cred_id + }, + success : options.success || function ( result ) { + console.log(result); + }, + error : options.error || this.defaultErrorHandler + }); + }, + + powerOff : function ( options ) { + $.ajax({ + type: 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/power_off', + data : { + cred_id : options.cred_id + }, + success: options.success || function ( result ) { + console.log(result); + }, + error : options.error || this.defaultErrorHandler + }); + }, + + powerOn : function ( options ) { + $.ajax({ + type: 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/power_on', + data : { + cred_id : options.cred_id + }, + success: options.success || function ( result ) { + console.log(result); + }, + error : options.error || this.defaultErrorHandler + }); + }, + + reboot : function ( options ) { + $.ajax({ + type: 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/reboot', + data : { + cred_id : options.cred_id + }, + success: options.success || function ( result ) { + console.log(result); + }, + error : options.error || this.defaultErrorHandler + }); + }, + + reset : function ( options ) { + $.ajax({ + type: 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/reset', + data : { + cred_id : options.cred_id + }, + success: options.success || function ( result ) { + console.log(result); + }, + error : options.error || this.defaultErrorHandler + }); + }, + + suspend : function ( options ) { + $.ajax({ + type: 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/suspend', + data : { + cred_id : options.cred_id + }, + success: options.success || function ( result ) { + console.log(result); + }, + error : options.error || this.defaultErrorHandler + }); + }, + + clone : function ( options ) { + $.ajax({ + type: 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/clone', + data : { + cred_id : options.cred_id, + vapp_name : options.vapp_name, + vapp_options : options.vapp_options + }, + success: options.success || function ( result ) { + console.log(result); + }, + error : options.error || this.defaultErrorHandler + }); + } + }); + + return VCloudVapp; +}); \ No newline at end of file diff --git a/js/vcloud/models/compute/vcloudVm.js b/js/vcloud/models/compute/vcloudVm.js new file mode 100644 index 00000000..9d860a91 --- /dev/null +++ b/js/vcloud/models/compute/vcloudVm.js @@ -0,0 +1,177 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common', + 'models/resource/resourceModel', + 'mixins' +], function ( $, _, Backbone, Common, ResourceModel ) { + var VCloudVm = ResourceModel.extend({ + + defaults : { + cred_id : '' + }, + + defaultErrorHandler : function ( err ) { + var status; + var message; + if(!err) { + status = "Unknown"; + message = "An unknown error has occurred."; + return Common.errorDialog(status, message); + } + + console.log("AJAX Error: ", err); + + status = err.status; + message = (typeof err === 'string') ? err : err.responseText; + if(typeof message !== 'string') { + message = "An unknown error has occurred."; + } + return Common.errorDialog(status + ' Error', message); + }, + + + initialize : function ( options ) { + this.vdc_id = this.collection.options.vdc_id; + this.vapp_id = this.collection.options.vapp_id; + this.cred_id = this.collection.options.cred_id; + + this.baseUrl = Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + this.vdc_id + '/vapps/' + this.vapp_id + '/vms/' + this.attributes.id; + }, + + powerOff : function ( options ) { + var ajaxOptions = { + type : 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/vms/' + options.vm_id, + data : { + status : 'off', + cred_id : options.cred_id + }, + success : function ( vm ) { + Common.vent.trigger('vmAppRefresh', vm); + }, + error : options.error || this.defaultErrorHandler + }; + + $.ajax(ajaxOptions); + }, + + powerOn : function ( options ) { + var ajaxOptions = { + type : 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/vms/' + options.vm_id, + data : { + status : 'on', + cred_id : options.cred_id + }, + success : function ( vm ) { + Common.vent.trigger('vmAppRefresh', vm); + }, + error : options.error || this.defaultErrorHandler + }; + + $.ajax(ajaxOptions); + }, + + modify : function ( options ) { + var mdl = this; + var ajaxOptions = { + type : 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/vms/' + options.vm_id, + data : options.data, + success : options.success || function ( vm ) { + Common.vent.trigger('vmAppRefresh', vm); + }, + error : options.error || function ( err ) { + if(!(err && err.responseText)) { + return mdl.defaultErrorHandler(err); + } + var message; + if(err.responseText.indexOf('multiple of') > -1) { + message = "The virtual machine memory size must be a multiple of 4 MB."; + } else { // if (err.responseText.indexOf('support') > -1) { + message = "Error modifying VM. Make sure that the VM is powered on and that both the the vCloud VM configuration and the VM operating system itself support this action."; + } + Common.errorDialog(err.status + ' Error', message); + } + }; + + $.ajax(ajaxOptions); + }, + + loadNetwork : function ( options ) { + var ajaxOptions = { + type : 'GET', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/vms/' + options.vm_id + '/network', + data : { + cred_id : options.cred_id + }, + success : function ( vm ) { + Common.vent.trigger('vmAppRefresh', vm); + }, + error : options.error || function ( err ) { + Common.vent.trigger('vmNetworkLoadError', err); + } + }; + + $.ajax(ajaxOptions); + }, + + updateNetwork : function ( options ) { + var refinedOptions = _.refine(options); + var ajaxOptions = { + type : 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/vms/' + options.vm_id + '/network', + data : refinedOptions, + success : function ( network ) { + Common.vent.trigger('networkRefresh', network); + }, + error : options.error || this.defaultErrorHandler + }; + + $.ajax(ajaxOptions); + }, + + loadDisks : function ( options ) { + var ajaxOptions = { + type : 'GET', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/vms/' + options.vm_id + '/disks', + data : { + cred_id : options.cred_id + }, + success : function ( disks ) { + Common.vent.trigger('disksLoaded', disks); + }, + error : options.error || function ( err ) { + Common.vent.trigger('vmDiskLoadError', err); + } + }; + $.ajax(ajaxOptions); + }, + + createDisk : function ( options ) { + var ajaxOptions = { + type : 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/compute/data_centers/' + options.vdc_id + '/vapps/' + options.vapp_id + '/vms/' + options.vm_id + '/disks', + data : { + cred_id : options.cred_id, + size : options.size + }, + success : options.success, + error : options.error || this.defaultErrorHandler + }; + + $.ajax(ajaxOptions); + } + }); + + return VCloudVm; +}); \ No newline at end of file diff --git a/js/vcloud/models/network/vcloudNetwork.js b/js/vcloud/models/network/vcloudNetwork.js new file mode 100644 index 00000000..341508a5 --- /dev/null +++ b/js/vcloud/models/network/vcloudNetwork.js @@ -0,0 +1,31 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'common', + 'models/resource/resourceModel' +], function ( $, _, Backbone, Common, ResourceModel ) { + var VCloudNetwork = ResourceModel.extend({ + + defaults : { + cred_id : '' + }, + + initialize : function ( options ) { + options = options || {}; + }, + + idAttribute : 'name', + + apiUrl : Common.apiUrl + "/stackstudio/v1/cloud_management/vcloud/networks" + }); + + return VCloudNetwork; +}); \ No newline at end of file diff --git a/js/vcloud/views/account/vCloudCredentialFormView.js b/js/vcloud/views/account/vCloudCredentialFormView.js new file mode 100644 index 00000000..3c29ea8a --- /dev/null +++ b/js/vcloud/views/account/vCloudCredentialFormView.js @@ -0,0 +1,51 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'icanhaz', + 'common', + 'text!templates/vcloud/account/vcloudCredentialForm.html', + 'models/cloudCredential', + 'collections/cloudCredentials' +], function ( $, _ , Backbone, ich, Common, Template, CloudCredential, CloudCredentials ) { + 'use strict'; + + var VCloudCredentialFormView = Backbone.View.extend({ + + cloudCredentials : undefined, + + initialize : function ( options ) { + + //render template + this.$el.html(this.template); + + this.cloudCredentials = new CloudCredentials(); + if(options ) { + this.$el = options.el || this.$el; + + this.credential = options.credential; + } + this.render(); + }, + + render : function () { + + //fill template and render the result + if(!ich['vcloud_credential_form']) { + ich.grabTemplates(); + } + + var credentialForm = ich.vcloud_credential_form(this.credential); + this.$el.html(credentialForm); + } + }); + + return VCloudCredentialFormView; +}); diff --git a/js/vcloud/views/catalog/vcloudCatalogItemAppView.js b/js/vcloud/views/catalog/vcloudCatalogItemAppView.js new file mode 100644 index 00000000..8c088f80 --- /dev/null +++ b/js/vcloud/views/catalog/vcloudCatalogItemAppView.js @@ -0,0 +1,61 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'views/resource/resourceDetailView', + 'text!templates/vcloud/catalog/vcloudCatalogItemTemplate.html', + 'text!templates/emptyGraphTemplate.html', + 'icanhaz', + 'common', + 'morris', + 'spinner', + 'jquery.dataTables' +], function( $, _, Backbone, ResourceDetailView, VCloudCatalogItemTemplate, emptyGraph, ich, Common, Morris, Spinner ) { + 'use strict'; + + var VCloudCatalogAppView = ResourceDetailView.extend({ + + template : _.template(VCloudCatalogItemTemplate), + + initialize : function ( options ) { + options = options || {}; + this.cred_id = options.cred_id; + this.render(); + }, + + events : { + 'click #create_vapp_button' : 'instantiate' + }, + + instantiate : function () { + + var appView = this; + + $.ajax({ + type : 'POST', + url : Common.apiUrl + '/stackstudio/v1/cloud_management/vcloud/catalogs/instance', + data : { + id : appView.model.catalog, + template : appView.model.name, + name : 'testing_instantiate_vapp', + cred_id : appView.cred_id + }, + success : function ( result ) { + console.log('result: ', result); + } + }); + } + }); + + return VCloudCatalogAppView; +}); + + + diff --git a/js/vcloud/views/catalog/vcloudCatalogsAppView.js b/js/vcloud/views/catalog/vcloudCatalogsAppView.js new file mode 100644 index 00000000..95bb8e76 --- /dev/null +++ b/js/vcloud/views/catalog/vcloudCatalogsAppView.js @@ -0,0 +1,97 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'views/resource/resourceAppView', + 'text!templates/vcloud/catalog/vcloudCatalogAppTemplate.html', + '/js/vcloud/models/catalog/vcloudCatalog.js', + '/js/vcloud/collections/catalog/vcloudCatalogs.js', + 'text!templates/emptyGraphTemplate.html', + 'icanhaz', + 'common', + 'morris', + 'spinner', + 'jquery.dataTables', + 'jquery.dataTables.fnProcessingIndicator' +], function( $, _, Backbone, ResourceAppView, VCloudCatalogTemplate, Catalog, Catalogs, emptyGraph, ich, Common, Morris, Spinner ) { + 'use strict'; + + var VCloudCatalogsAppView = ResourceAppView.extend({ + + template : _.template(VCloudCatalogTemplate), + + modelStringIdentifier: "name", + + columns : ["name", "status"], + + idColumnNumber : 0, + + model : Catalog, + + collectionType : Catalogs, + + type : 'catalog', + + subtype : 'catalogs', + + CreateView : undefined, + + UpdateView : undefined, + + events : { + 'click #resource_table tr': "clickOne", + 'click .instantiate_vapp': "instantiateVapp" + }, + + actions: [ + { text: "Delete Catalog", type: "row" } + ], + + initialize : function ( options ) { + + var appView = this; + this.vdc = options.data_center; + + options = options || {}; + this.credentialId = options.cred_id; + + this.$el.html(this.template); + appView.loadData({ render: true, data: { vdc: this.vdc }}); + + Common.vent.on("vcloudAppRefresh", appView.render.bind(appView)); + }, + + toggleActions : function () { + + }, + + instantiateVapp : function ( event ) { + var item_id = $(event.currentTarget).parents('tr').attr('item-id'); + var cat_id = $(event.currentTarget).parents('table').attr('cat-id'); + + var catalog = new this.model(); + + catalog.instantiateVapp({ + cred_id : this.credentialId, + cat_id : cat_id, + item_id : item_id, + vapp_name : 'Vapp-' + 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8); + return v.toString(16); + }), + vapp_options : { + vdc_id : this.vdc + } + }); + } + }); + + return VCloudCatalogsAppView; +}); \ No newline at end of file diff --git a/js/vcloud/views/compute/vcloudDataCenterAppView.js b/js/vcloud/views/compute/vcloudDataCenterAppView.js new file mode 100755 index 00000000..d6a40710 --- /dev/null +++ b/js/vcloud/views/compute/vcloudDataCenterAppView.js @@ -0,0 +1,29 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'views/resource/resourceDetailView', + 'text!templates/vcloud/compute/vcloudDataCentersTemplate.html', + 'vcloud/models/compute/vcloudDataCenter', + 'vcloud/collections/compute/vcloudDataCenters' +], function( $, _, Backbone, ResourceDetailView, VCloudDataCenterTemplate, DataCenter, DataCenters ) { + 'use strict'; + + var VCloudDataCentersAppView = ResourceDetailView.extend({ + + template : _.template(VCloudDataCenterTemplate), + + initialize : function () { + this.render(); + } + }); + + return VCloudDataCentersAppView; +}); diff --git a/js/vcloud/views/compute/vcloudDataCenterListView.js b/js/vcloud/views/compute/vcloudDataCenterListView.js new file mode 100644 index 00000000..d1ffb315 --- /dev/null +++ b/js/vcloud/views/compute/vcloudDataCenterListView.js @@ -0,0 +1,69 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'views/resource/resourceAppView', + 'views/resource/resourceRowView', + 'text!templates/vcloud/compute/vcloudDataCenterAppTemplate.html', + 'vcloud/models/compute/vcloudDataCenter', + 'vcloud/collections/compute/vcloudDataCenters', + 'text!templates/emptyGraphTemplate.html', + 'icanhaz', + 'common', + 'morris', + 'spinner' +], function( $, _, Backbone, ResourceAppView, ResourceRowView, vcloudDataCenterAppTemplate, DataCenter, DataCenters, emptyGraph, ich, Common, Morris, Spinner ) { + 'use strict'; + + var DataCenterAppView = ResourceAppView.extend({ + + template: _.template(vcloudDataCenterAppTemplate), + + modelStringIdentifier: "id", + + columns: ["id", "name", "is_loaded"], + + idColumnNumber: 0, + + model: DataCenter, + + collectionType: DataCenters, + + type: "compute", + + subtype: "dataCenters", + + events: { + // 'click .create_button': 'createNew', + // 'click #action_menu ul li': 'performAction', + // 'click #resource_table tr': "clickOne", + // 'click #monitoring': 'refreshMonitors', + // 'click #refresh_monitors_button': 'refreshMonitors' + }, + + initialize: function ( options ) { + if(options.cred_id) { + this.credentialId = options.cred_id; + } + if(options.region) { + this.region = options.region; + } + + this.render(); + + var App = this; + Common.vent.on("DataCenterAppRefresh", function() { + App.render(); + }); + } + }); + + return DataCenterAppView; +}); diff --git a/js/vcloud/views/compute/vcloudOrganizationsAppView.js b/js/vcloud/views/compute/vcloudOrganizationsAppView.js new file mode 100755 index 00000000..e9fa6a47 --- /dev/null +++ b/js/vcloud/views/compute/vcloudOrganizationsAppView.js @@ -0,0 +1,65 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'vcloud/views/compute/vcloudTreeView', + 'text!templates/vcloud/compute/vcloudOrganizationsTemplate.html', + 'vcloud/models/compute/vcloudOrganization', + 'vcloud/collections/compute/vcloudOrganizations', + 'text!templates/emptyGraphTemplate.html', + 'icanhaz', + 'common', + 'morris', + 'spinner', + 'jquery.dataTables' +], function( $, _, Backbone, VCloudTreeView, VCloudOrganizationsAppTemplate, Organization, Organizations, emptyGraph, ich, Common, Morris, Spinner ) { + 'use strict'; + + var VCloudOrganizationsAppView = VCloudTreeView.extend({ + + template : _.template(VCloudOrganizationsAppTemplate), + + // emptyGraphTemplate : _.template(emptyGraph), + + // columns : ["name", "id"], + + // idColumnNumber : 1, + + model : Organization, + + collectionType : Organizations, + + subtype : "organizations", + + events: { + 'click #action_menu ul li': 'performAction', + 'click #resource_table tr': "clickOne", + 'click #monitoring': 'refreshMonitors', + 'click #refresh_monitors_button': 'refreshMonitors' + }, + + initialize : function ( options ) { + if(options.cred_id) { + this.credentialId = options.cred_id; + } + if(options.region) { + this.region = options.region; + } + this.render(); + + var orgsApp = this; + Common.vent.on("snapshotAppRefresh", function() { + orgsApp.render(); + }); + } + }); + + return VCloudOrganizationsAppView; +}); diff --git a/js/vcloud/views/compute/vcloudTreeView.js b/js/vcloud/views/compute/vcloudTreeView.js new file mode 100644 index 00000000..d1cee2aa --- /dev/null +++ b/js/vcloud/views/compute/vcloudTreeView.js @@ -0,0 +1,263 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true, laxcomma:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'icanhaz', + 'common', + 'vendor/maple/js/maple', + 'views/resource/resourceTreeView', + 'views/resource/resourceAppView', + 'text!templates/vcloud/vcloudTreeViewTemplate.html', + 'vcloud/collections/compute/vcloudDataCenters', + 'vcloud/collections/network/vcloudNetworks', + 'vcloud/collections/catalog/vcloudCatalogs', + 'vcloud/collections/catalog/vcloudCatalogItems', + 'vcloud/collections/compute/vcloudVapps', + 'vcloud/collections/compute/vcloudVms' +], function ( $, _, Backbone, ich, Common, maple, ResourceTreeView, ResourceAppView, vcloudTreeViewTemplate, DataCenters, Networks, Catalogs, CatalogItems, Vapps, Vms ) { + 'use strict'; + + var vcloudTree = ResourceTreeView.extend({ + + template: _.template(vcloudTreeViewTemplate), + + Networks : Networks, + + Catalogs : Catalogs, + + Vapps : Vapps, + + Vms : Vms, + + vdc : undefined, + + render : function () { + this.$el.html(this.template); + $("#resource_app").html(this.$el); + + this.buildTree(); + }, + + buildTree : function () { + var treeView = this; + + $('#vcloud_tree').maple({ + tree : { + branches : [ + { + name: 'vApps', + type: 'folder', + cssClass : 'vapp-item', + preload : true, + getData : treeView.getFetchFunction(treeView.Vapps, treeView.formatVapp, { vdc : treeView.vdc }) + }, + { + name : 'Networks', + type: 'folder', + preload: true, + getData : treeView.getFetchFunction(treeView.Networks, treeView.formatNetwork) + }, + { + name: 'Catalogs', + type: 'folder', + preload : true, + getData : treeView.getFetchFunction(treeView.Catalogs, treeView.formatCatalog) + } + ] + } + }); + }, + + getFetchFunction : function ( Collection, format, data ) { + var treeView = this; + + return function ( cb ) { + var collection = new Collection({ + cred_id : treeView.credentialId + }); + + var options = { + success : function ( models ) { + models = models.models.map(format.bind(treeView)); + cb(models); + } + }; + + if(data) { + options.data = data; + } + + collection.fetch(options); + }; + }, + + formatNetwork : function ( network ) { + var treeView = this; + + return { + name : network.attributes.name, + cssClass : 'network-item', + attributes : { + "object-type" : 'network' + }, + onClicked : function ( $network ) { + var view = "/js/vcloud/views/network/vcloudNetworkAppView.js"; + treeView.loadChildView(view, { model : network, parentView : treeView }); + + $('.maple-selected').removeClass('maple-selected'); + $(this).find('span').addClass('maple-selected'); + } + }; + }, + + formatCatalog : function ( catalog ) { + var treeView = this; + + return { + name: catalog.attributes.name, + cssClass : 'catalog-item', + attributes : { + 'object-type' : 'catalog' + }, + type : 'folder', + getData : function ( cb ) { + catalog.attributes.items = catalog.attributes.items.map(function ( item ) { + return _.extend(item, { + catalog : catalog.attributes.name + }); + }); + var items = catalog.attributes.items.map(treeView.formatCatalogItem.bind(treeView)); + cb(items); + }//, + + // onClicked: function ( $catalog ) { + // var view = '/js/vcloud/views/catalog/vcloudCatalogAppView.js'; + // treeView.loadChildView(view, { model : catalog, parentView : treeView }); + + // $('.maple-selected').removeClass('maple-selected'); + // $(this).find('span').addClass('maple-selected'); + // } + }; + }, + + formatCatalogItem : function ( item ) { + var treeView = this; + + return { + name : item.name, + attributes : { + 'object-type' : 'catalog-item' + }, + onClicked : function ( $item ) { + var view = '/js/vcloud/views/catalog/vcloudCatalogItemAppView.js'; + treeView.loadChildView(view, { model : item, parentView : treeView }); + $('.maple-selected').removeClass('maple-selected'); + $(this).find('span').addClass('maple-selected'); + } + }; + }, + + formatVapp : function ( vapp ) { + var treeView = this; + + var attributes = vapp.attributes; + return { + name : attributes.name, + cssClass : 'vapp-item', + + attributes : { + "object-type" : "vapp" + }, + + branches : [ + { + name : 'VMs', + cssClass : 'vms-folder', + type : 'folder', + getData : function ( cb ) { + var VMs = new treeView.Vms({ + cred_id : treeView.credentialId + }); + + VMs.fetch({ + data : { + vdc : attributes.vdc, + vapp : attributes.name + }, + success : function ( vms ) { + vms = vms.models.map(treeView.formatVm.bind(treeView)); + cb(vms); + } + }); + }, + preload : true + } + ], + + onClicked : function ( $vapp ) { + treeView.selectedVapp = vapp; + var view = '/js/vcloud/views/compute/vcloudVappAppView.js'; + treeView.loadChildView(view , { + model : vapp, + parentView : treeView + }); + + $('.maple-selected').removeClass('maple-selected'); + $vapp.children('span').addClass('maple-selected'); + } + }; + }, + + formatVm : function ( vm ) { + var treeView = this; + var atts = vm.attributes; + + return { + name: atts.name, + + cssClass : 'vm-item', + + attributes : { + "object-type" : "vm", + "vapp" : atts.vapp, + "vdc" : atts.vdc + }, + + onClicked: function ( $vm ) { + var view = '/js/vcloud/views/compute/vcloudVmAppView.js' + , vapp = atts.vapp + , vdc = atts.vdc; + + treeView.loadChildView(view, { model: vm, parentView : treeView, vdc : vdc, vapp : vapp }); + } + }; + }, + + loadChildView : function ( view, options ) { + var treeView = this; + require([view], function ( AppView ) { + + var appViewParams = { + $container : $('#tree_subview'), + cred_id : treeView.credentialId + }; + + if(typeof options !== 'undefined') { + appViewParams = _.extend(appViewParams, options); + } + + var appView = new AppView(appViewParams); + }); + } + }); + + return vcloudTree; + +}); diff --git a/js/vcloud/views/compute/vcloudVappsAppView.js b/js/vcloud/views/compute/vcloudVappsAppView.js new file mode 100644 index 00000000..93483a76 --- /dev/null +++ b/js/vcloud/views/compute/vcloudVappsAppView.js @@ -0,0 +1,258 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'views/resource/resourceAppView', + 'text!templates/vcloud/compute/vcloudVappAppTemplate.html', + '/js/vcloud/models/compute/vcloudVapp.js', + '/js/vcloud/collections/compute/vcloudVapps.js', + '/js/vcloud/collections/compute/vcloudVms.js', + '/js/vcloud/views/compute/vcloudVmAppView.js', + 'text!templates/emptyGraphTemplate.html', + 'text!templates/vcloud/compute/vcloudVmListTemplate.html', + 'icanhaz', + 'common', + 'morris', + 'spinner', + 'jquery.dataTables', + 'jquery.dataTables.fnProcessingIndicator' +], function( $, _, Backbone, ResourceAppView, VCloudVappTemplate, Vapp, Vapps, Vms, VmDialogView, emptyGraph, vmListTemplate, ich, Common, Morris, Spinner ) { + 'use strict'; + + var VCloudVappsAppView = ResourceAppView.extend({ + + template : _.template(VCloudVappTemplate), + + modelStringIdentifier: "name", + + columns : ["name", "description", "deployed", "status"], + + idColumnNumber : 0, + + model : Vapp, + + collectionType : Vapps, + + type : 'compute', + + subtype : 'vapps', + + CreateView : undefined, + + UpdateView : undefined, + + events : { + 'click #resource_table tr': "loadVapp", + 'click #power_on_vapp' : "powerOn", + 'click #power_off_vapp' : "powerOff", + 'click #reboot_vapp' : "reboot", + 'click #suspend_vapp' : "suspend", + 'click #delete_vapp': "deleteVapp", + 'click #create_snapshot': "createSnapshot", + 'click #revert_to_snapshot': "revert", + 'click #remove_snapshots': "deleteSnapshots" + }, + + createButton : false, + + actions : [ + { text: "Power On", id: "power_on_vapp", type : "row" }, + { text: "Power Off", id: "power_off_vapp", type : "row" }, + { text: "Reboot", id: "reboot_vapp", type : "row" }, + { text: "Suspend", id: "suspend_vapp", type: "row" }, + { text: "Delete", id: "delete_vapp", type: "row" }, + { text: "Create Snapshot", id:"create_snapshot", type: "row" }, + { text: "Revert", id:"revert_to_snapshot", type: "row"}, + { text: "Remove Snapshots", id: "remove_snapshots", type: "row"} + ], + + initialize : function ( options ) { + var self = this; + this.$el.html(this.template); + + this.parent = options.navView; + + var appView = this; + this.vdc = options.data_center; + + options = options || {}; + this.credentialId = options.cred_id; + + this.collection = new Vapps({ + vdc_id : this.vdc, + cred_id : this.credentialId + }); + + this.loadData({ + data : { + vdc_id : this.vdc + } + }); + + this.render(); + + this.loadTable(); + + Common.vent.on('vappVmsLoaded', this.vmsLoaded, this); + }, + + vmsLoaded : function ( vms ) { + var appView = this; + var $tabs = $('#detail_tabs'); + + if($('#vapp_vms').length === 0) { + //need to keep this template for later + var $vm_list = _.template(vmListTemplate); + $('body').append($vm_list); + } + + if(!ich.templates.vapp_vms) { + ich.refresh(); + } + + var $vm_tab = ich.vapp_vms({ vms : _.pluck(vms.models, "attributes") }); + + + $vm_tab.find('tbody tr').click(function () { + var id = $(this).attr('vm_id'); + appView.vmDialog = new VmDialogView({ + cred_id: appView.credentialId, + vapp : appView.selectedVapp, + data_center : appView.vdc, + model : vms.get(id) + }); + appView.vmDialog.render(); + }); + + this.$el.find('#tabs-2').html($vm_tab); + }, + + loadVapp : function ( event ) { + + //get vms + var id = $(event.currentTarget).data('id'); + var vms = new Vms({ + vdc_id : this.vdc, + vapp_id : id, + cred_id : this.credentialId + }); + + this.selectedVapp = id; + + vms.fetch({ + success : function ( vms ) { + Common.vent.trigger('vappVmsLoaded', vms); + } + }); + + this.clickOne.call(this, event); + }, + + powerOn : function () { + var vapp = this.collection.get(this.selectedVapp); + + vapp.powerOn({ + cred_id : this.credentialId, + vdc_id : this.vdc, + vapp_id : this.selectedVapp + }); + }, + + powerOff : function () { + var vapp = this.collection.get(this.selectedVapp); + + vapp.powerOff({ + cred_id : this.credentialId, + vdc_id : this.vdc, + vapp_id : this.selectedVapp + }); + }, + + reboot : function () { + var vapp = this.collection.get(this.selectedVapp); + + vapp.reboot({ + cred_id : this.credentialId, + vdc_id : this.vdc, + vapp_id : this.selectedVapp + }); + }, + + suspend : function () { + var vapp = this.collection.get(this.selectedVapp); + + vapp.suspend({ + cred_id : this.credentialId, + vdc_id : this.vdc, + vapp_id : this.selectedVapp + }); + }, + + toggleActions : function () { + //not really any actions right now + }, + + deleteVapp : function ( event ) { + var appView = this; + var id = this.selectedVapp; + var vapp = this.collection.get(id); + + vapp.destroy({ + cred_id : this.credentialId, + vapp_id : id, + vdc_id : this.vdc, + success : function ( result ) { + console.log(result); + appView.collection.remove(vapp); + appView.collection.reset(appView.collection.models); + } + }); + }, + + createSnapshot : function ( event ) { + var appView = this; + var id = this.selectedVapp; + var vapp = this.collection.get(id); + + //this will overwrite existing snapshot + //todo: inform user of this + vapp.createSnapshot({ + cred_id : this.credentialId, + vdc_id : this.vdc, + vapp_id : id + }); + }, + + revert : function ( event ) { + var appView = this; + var id = this.selectedVapp; + var vapp = this.collection.get(id); + + vapp.revert({ + cred_id : this.credentialId, + vdc_id : this.vdc, + vapp_id : id + }); + }, + + deleteSnapshots : function ( event ) { + var id = this.selectedVapp; + var vapp = this.collection.get(id); + + vapp.removeSnapshots({ + cred_id : this.credentialId, + vdc_id : this.vdc, + vapp_id : id + }); + } + }); + + return VCloudVappsAppView; +}); \ No newline at end of file diff --git a/js/vcloud/views/compute/vcloudVmAppView.js b/js/vcloud/views/compute/vcloudVmAppView.js new file mode 100755 index 00000000..a77023ff --- /dev/null +++ b/js/vcloud/views/compute/vcloudVmAppView.js @@ -0,0 +1,220 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true, laxcomma:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'icanhaz', + 'common', + 'views/modalView', + 'text!templates/vcloud/compute/vcloudVmTemplate.html', + 'vcloud/models/compute/vcloudVm', + 'vcloud/collections/compute/vcloudVms' +], function( $, _, Backbone, ich, Common, ModalView, VCloudVmTemplate, Vm, Vms ) { + 'use strict'; + + var VCloudVmsAppView = ModalView.extend({ + + template : _.template(VCloudVmTemplate), + + events: { + "click #power_off_vm": "powerOff", + "click #power_on_vm": "powerOn", + "click #modify_vm" : "modifyVm", + "click #update_network" : "updateNetwork", + "click #create_disk" : "createDisk", + "click #create_disk_submit" : "createDiskSubmit" + }, + + initialize : function ( options ) { + var appView = this; + this.credentialId = options.cred_id; + this.vapp = options.vapp; + this.vdc = options.data_center; + this.model = options.model; + + Common.vent.on('networkLoaded', this.refreshNetwork); + Common.vent.on('networkRefresh', this.refreshNetwork); + + Common.vent.on('disksLoaded', this.refreshDisks); + Common.vent.on('disksRefresh', this.refreshDisks); + + this.vmOptions = { + cred_id : this.credentialId, + vdc_id : this.vdc, + vapp_id : this.vapp, + vm_id : this.model.attributes.id + }; + + this.$el.find('.modal-body').html(this.template); + + if(!ich.templates.resource_detail_modal) { + ich.grabTemplates(); + } + + $.each(this.model.attributes, function ( attr ) { + attr = attr.capitalize(); + }); + + //replace template variables + this.$el.find('.modal-body').html(ich.resource_detail_modal(this.model.attributes)); + + this.$el.find('.modal-title').text('VM Details: ' + this.model.attributes.name); + + if(this.model.attributes.status === 'on') { + this.$el.find('#power_on_vm').hide(); + this.$el.find('#power_off_vm').show(); + } else { + this.$el.find('#power_off_vm').hide(); + this.$el.find('#power_on_vm').show(); + } + + $('.disk-hidden').hide(); + + this.setupValidation(); + + var $table = $('#vm_disk_list'); + + $table.dataTable({ + "bJQueryUI": true, + "bProcessing": true, + "bDestroy": true, + "bSort" : false, + "bFilter" : false + }); + + this.model.loadNetwork(this.vmOptions); + this.model.loadDisks(this.vmOptions); + + $table.dataTable().fnProcessingIndicator(true); + + this.render(); + }, + + setupValidation : function () { + + this.$el.on('change', '#memory', function ( e ) { + var val = parseInt($(this).val(), 10); + if(isNaN(val)) { + e.preventDefault(); + return; + } + }); + + this.$el.on('change', '#memory', function ( e ) { + var val = parseInt($(this).val(), 10); + var rem = val % 4; + + if(rem !== 0) { + var correctedValue; + if(rem <= 2) { + correctedValue = val - rem; + } else { + correctedValue = val + 4 - rem; + } + + $(this).val(correctedValue); + } + }); + }, + + refreshNetwork : function ( network ) { + this.network = network; + + if(!ich.templates.vm_network) { + var $temp = $('
'); + $temp.html(this.template()); + var updatedTemplate = $temp.find('#vm_network'); + ich.addTemplate("resource_detail", updatedTemplate.html()); + } + + $('#vm_network_tab').html(ich.vm_network(network)); + }, + + refreshDisks : function ( disks ) { + this.disks = disks; + + var $table = $('#vm_disk_list'); + + $table.dataTable().fnClearTable(); + $.each(disks, function () { + $table.dataTable().fnAddData([this.name, this.capacity.toString()]); + }); + + $table.fnProcessingIndicator(false); + }, + + createDisk : function () { + $('#create_disk').hide(); + $('.disk-hidden').show(); + }, + + createDiskSubmit : function () { + var diskOptions = _.extend(this.vmOptions, { + size : $('#new_disk_size').val(), + success: function () { + $('#new_disk_size').val(''); + } + }); + + this.model.createDisk(diskOptions); + + var $diskPlaceholder = $('Creating..' + $('#new_disk_size').val() + ''); + + $('.disk-hidden').hide(); + $('#create_disk').show(); + $('#vm_disk_list').find('tbody').append($diskPlaceholder); + }, + + powerOff : function () { + this.model.powerOff(this.vmOptions); + }, + + powerOn : function () { + this.model.powerOn(this.vmOptions); + }, + + modifyVm : function () { + + var options = { + vdc_id : this.vdc, + vapp_id : this.vapp, + vm_id : this.model.attributes.id, + data : { + cred_id : this.credentialId + } + }; + + var cpus = $('#number_of_cpus').val(); + var memory = $('#memory').val(); + if(cpus) { + options.data.cpu = parseInt(cpus, 10); + } + if(memory) { + options.data.memory = parseInt(memory, 10); + } + this.model.modify(options); + }, + + updateNetwork : function () { + var options = {}; + $('[id^="network_"]').each(function () { + var prop = $(this).attr('name') + , val = $(this).val(); + + options[prop] = $(this).val(); + }); + + options = _.extend(options, this.vmOptions); + + this.model.updateNetwork(options); + } + }); + + return VCloudVmsAppView; +}); diff --git a/js/vcloud/views/network/vcloudNetworksAppView.js b/js/vcloud/views/network/vcloudNetworksAppView.js new file mode 100644 index 00000000..fb4eef23 --- /dev/null +++ b/js/vcloud/views/network/vcloudNetworksAppView.js @@ -0,0 +1,72 @@ +/*! + * StackStudio 2.0.0-rc.1 + * (c) 2012 Transcend Computing + * Available under ASL2 license + */ +/*jshint smarttabs:true */ +/*global define:true console:true */ +define([ + 'jquery', + 'underscore', + 'backbone', + 'views/resource/resourceAppView', + 'text!templates/vcloud/network/vcloudNetworkAppTemplate.html', + '/js/vcloud/models/network/vcloudNetwork.js', + '/js/vcloud/collections/network/vcloudNetworks.js', + 'text!templates/emptyGraphTemplate.html', + 'icanhaz', + 'common', + 'morris', + 'spinner', + 'jquery.dataTables', + 'jquery.dataTables.fnProcessingIndicator' +], function( $, _, Backbone, ResourceAppView, VCloudNetworkTemplate, Network, Networks, emptyGraph, ich, Common, Morris, Spinner ) { + 'use strict'; + + var VCloudNetworksAppView = ResourceAppView.extend({ + + template : _.template(VCloudNetworkTemplate), + + modelStringIdentifier: "name", + + columns : ["name", "status"], + + actions: [ + { text: "Update Network", type: "row" } + ], + + idColumnNumber : 0, + + model : Network, + + collectionType : Networks, + + type : 'network', + + subtype : 'networks', + + CreateView : undefined, + + UpdateView : undefined, + + events: { + 'click #resource_table tr': "clickOne" + }, + + initialize : function ( options ) { + + var appView = this; + this.vdc = options.data_center; + + options = options || {}; + this.credentialId = options.cred_id; + + this.$el.html(this.template); + this.loadData({ render: true, data: { vdc: this.vdc }}); + + Common.vent.on("vcloudAppRefresh", appView.render.bind(appView)); + } + }); + + return VCloudNetworksAppView; +}); \ No newline at end of file diff --git a/js/vendor/bower_components/typeahead.js/Gruntfile.js b/js/vendor/bower_components/typeahead.js/Gruntfile.js index 2db4bf33..21e0c4f6 100644 --- a/js/vendor/bower_components/typeahead.js/Gruntfile.js +++ b/js/vendor/bower_components/typeahead.js/Gruntfile.js @@ -1,17 +1,17 @@ var semver = require('semver'), f = require('util').format, jsFiles = [ - 'src/version.js', - 'src/utils.js', - 'src/event_target.js', - 'src/event_bus.js', - 'src/persistent_storage.js', - 'src/request_cache.js', - 'src/transport.js', - 'src/dataset.js', - 'src/input_view.js', - 'src/dropdown_view.js', - 'src/typeahead_view.js', + 'src/version', + 'src/utils', + 'src/event_target', + 'src/event_bus', + 'src/persistent_storage', + 'src/request_cache', + 'src/transport', + 'src/dataset', + 'src/input_view', + 'src/dropdown_view', + 'src/typeahead_view', 'src/typeahead.js' ]; @@ -81,7 +81,7 @@ module.exports = function(grunt) { js: { src: jsFiles, options: { - specs: 'test/*_spec.js', + specs: 'test/*_spec', helpers: 'test/helpers/*', vendor: 'test/vendor/*' } @@ -112,8 +112,8 @@ module.exports = function(grunt) { }, publish_assets: { cmd: [ - 'cp -r <%= buildDir %> typeahead.js', - 'zip -r typeahead.js/typeahead.js.zip typeahead.js', + 'cp -r <%= buildDir %> typeahead', + 'zip -r typeahead.js/typeahead.js.zip typeahead', 'git checkout gh-pages', 'rm -rf releases/latest', 'cp -r typeahead.js releases/<%= version %>', diff --git a/js/vendor/bower_components/typeahead.js/test/playground.html b/js/vendor/bower_components/typeahead.js/test/playground.html index 7ec00da2..54c0ce58 100644 --- a/js/vendor/bower_components/typeahead.js/test/playground.html +++ b/js/vendor/bower_components/typeahead.js/test/playground.html @@ -134,8 +134,8 @@ $('.regex-symbols').typeahead({ local: [ - '*.js', - '[Tt]ypeahead.js', + '*', + '[Tt]ypeahead', '^typeahead.js$', 'typeahead.js(0.8.2)', 'typeahead.js(@\\d.\\d.\\d)', diff --git a/js/vendor/instructor.js b/js/vendor/instructor.js new file mode 100644 index 00000000..96701c94 --- /dev/null +++ b/js/vendor/instructor.js @@ -0,0 +1,329 @@ +(function ( $ ) { + + $.widget("msi.instructor", { + + options : { + steps : [], + nextTipOnClick : false, + onClose: null, + onProgressChange: null, + afterRender: null, + afterTipRender: null, + fromExisting: null + }, + + _create : function () { + var self = this; + + if(this.options.afterRender) { + this.afterRender = this.options.afterRender; + } + if(this.options.afterTipRender) { + this.afterTipRender = this.options.afterTipRender; + } + + this.steps = this.options.steps; + this.previousTips = []; + + var firstStep = this.steps[0]; + this._initIndexes(); + + if(this.options.fromExisting) { + $.each(this.options.fromExisting.progress, function ( index, step ) { + var thisStep = self.options.steps[step.stepIndex]; + thisStep.lastTip = thisStep.tips[step.lastTipIndex]; + thisStep.started = (step.started === "true" || step.completed === true); + thisStep.completed = (step.completed === "true" || step.completed === true); + }); + + this.completed = this.options.fromExisting.completed; + var currentStep = _.first(_.where(this.options.steps, { started: true, completed: false })); + } + + this._initTutorialView(); + + if(this.options.fromExisting) { + this.goToStep(currentStep.title, false, true); + } else { + this.goToStep(firstStep.title, false, true); + } + + this.onClose = this.options.onClose; + this.onProgressChange = this.options.onProgressChange; + this.started = true; + }, + + _initIndexes : function () { + var stepIndex = 0 + , tipIndex = 0; + $.each(this.steps, function ( index, step ) { + step.num = stepIndex; + tipIndex = 0; + $.each(step.tips, function ( idx, tip ){ + tip.num = tipIndex; + tipIndex++; + }); + stepIndex++; + }); + }, + + _initTutorialView : function () { + var self = this + , tutView = this._getByAttr('data-instructor-view-for', this.element.attr('id')) + , numSteps = self.steps.length + , $stepLabel; + + this.view = tutView; + + if(!tutView.length) return; + + $.each(this.steps, function ( index, step ) { + $stepLabel = $(''); + if(step.completed) { + $stepLabel.addClass('completed'); + } + $stepLabel.click(function ( e ) { + e.preventDefault(); + self.goToStep(step.title, true); + }); + + // var widthPercentage = parseFloat(100) / numSteps; + // $stepLabel.css('width', widthPercentage + '%'); + tutView.find('.tutorial-steps').append($stepLabel); + }); + + tutView.find('.tutorial-steps').append('
'); + this.element.find('.close-tutorial-button').click(function () { + self.close(); + }); + + if(this.afterRender) { + this.afterRender(this); + } + }, + + _getProgress : function () { + + var completed = true; + var self = this; + + $.each(this.steps, function ( index, step ) { + if(!step.completed) { + completed = false; + } + }); + return { + started: this.started, + progress: this.steps.map(function ( step ) { + return { + stepIndex : step.num, + started : !!step.started, + completed : !!step.completed, + lastTipIndex : step.lastTip ? step.lastTip.num : 0 + }; + }), + completed: completed + }; + }, + + _getById : function ( id ) { + var $el = $('#' + id); + if($el.length) { + return $el; + } else { + console.error('No element found with id "' + id + '"'); + } + }, + + _getByAttr : function ( attrName, attrVal ) { + if(!attrVal) { + return $('[' + attrName + ']'); + } + return $('[' + attrName + '="' + attrVal + '"]'); + }, + + _getStepByName : function ( name ) { + var step; + $.each(this.steps, function ( index, item ) { + if(item.title == name) { + step = item; + } + }); + + if (!step) { + throw new Error('Step "' + name + '" was not found'); + } + + return step; + }, + + _getUpdated : function ( $el ) { + return $($el.selector); + }, + + _attachClickEvent : function ( tip ) { + //set up click event for new tip + var $el = $(tip.element.selector); + var clickHandler = tip.onClicked; + if(clickHandler) { + if(clickHandler === 'nextTip') { + $($el.selector).unbind('click', this.nextTip); + $(document).one('click', $el.selector, this.nextTip.bind(this)); + } else { + $($el.selector).unbind('click', clickHandler); + $(document).one('click', $el.selector, clickHandler); + } + } + }, + + _stepCompleted : function ( step ) { + $('[data-instructor-step="' + step.title + '"]').addClass('completed'); + step.completed = true; + }, + + _findTip : function ( id ) { + var self = this; + $.each(this.steps, function ( index, step ) { + $.each(step.tips, function ( idx, tip ) { + if(tip.id && tip.id === id) { + return { + step : step, + tip : tip + }; + } + }); + }); + }, + + tooltip : function ( $el , message, title ) { + var options = { + target: true, + tipJoint:"left", + targetJoint: "right", + showOn: "creation", + hideTrigger: 'closeButton', + hideOn: [] + }; + return new Opentip($el, message, title, options); + }, + + hideTips : function () { + $.each(this.previousTips, function ( index, tip ) { + tip.openTip.hide(); + }); + }, + + goToStep : function ( title, callChangeEvt, skipUpdates ) { + var $stepLabel = this._getByAttr('data-instructor-step', title) + , step = this._getStepByName(title); + + step.started = true; + + this.hideOldTips(); + $('.current-step').removeClass('current-step'); + this._getUpdated($stepLabel).addClass('current-step'); + + this.currentStep = step; + this.currentTip = step.tips[0]; + + if(step.messageElement && step.message) { + this._getUpdated(step.messageElement).html(step.message); + } + + this._attachClickEvent(this.currentTip); + if(step.onStart) { + step.onStart.call(step); + } + + if(this.options.onStepSelect && callChangeEvt === true) { + this.options.onStepSelect(step); + } + + if(this.options.onProgressChange && !skipUpdates) { + this.options.onProgressChange(this._getProgress()); + } + }, + + nextStep : function () { + var currentStepIndex = this.currentStep.num + , nextStep = this.steps[currentStepIndex + 1] || {} + , nextStepIndex = nextStep.num; + + this._stepCompleted(this.currentStep); + if(nextStepIndex > -1) { + this.goToStep(nextStep.title, false); + return true; + } else { + console.log('No more steps in tutorial'); + this.hideOldTips(); + return false; + } + }, + + nextTip : function ( show, skipUpdates ) { + var self = this; + var currentTipIndex = this.currentTip.num + , nextTip = this.currentStep.tips[currentTipIndex + 1] || {} + , nextTipIndex = nextTip.num; + //if there is another tip in this step, that's our tip + if(this.currentStep.tips.length > nextTipIndex) { + this.currentTip = nextTip; + + if(this.onProgressChange && !skipUpdates) { + this.onProgressChange(this._getProgress()); + } + } else { //otherwise, go to next step + this.nextStep(); + } + + this._attachClickEvent(this.currentTip); + this.hideOldTips(); + + if(show === true) { + this.showTip(); + } + }, + + goToTip : function ( id, show ) { + var tip = this._findTip(id); + if(tip) { + this.goToStep(tip.step.title, false, false, false); + this.currentTip = tip.tip; + if(this.onProgressChange) { + this.onProgressChange(this._getProgress()); + } + if(show) { + this.showTip(); + } + } + }, + + showTip : function ( ) { + this.hideOldTips(); + this.currentTip.openTip = this.tooltip(this._getUpdated(this.currentTip.element), this.currentTip.message, this.currentTip.title); + this.currentStep.lastTip = this.currentTip; + this.previousTips.push(this.currentTip); + if(this.afterTipRender) { + this.afterTipRender(this.currentTip.openTip); + } + }, + + hideOldTips : function () { + if(this.previousTips && this.previousTips.length > 0) { + $.each(this.previousTips, function ( index, tip ) { + tip.openTip.hide(); + }); + } + }, + + close : function () { + this.hideOldTips(); + this.steps = []; + this.view.hide(); + + if(this.onClose) { + this.onClose(this); + } + } + }); +})(jQuery); \ No newline at end of file diff --git a/js/vendor/jquery-plugins.js b/js/vendor/jquery-plugins.js index 7f3443b6..cf2c0a45 100644 --- a/js/vendor/jquery-plugins.js +++ b/js/vendor/jquery-plugins.js @@ -13,7 +13,7 @@ define( function(jQuery){ jQuery.migrateMute = true; require([ - '//code.jquery.com/jquery-migrate-1.1.0.js', + 'jquery-migrate', 'jquery.coverscroll.min', 'jquery.purr' ], function() { diff --git a/js/vendor/maple/.sass-cache/7cde79c3df438dcd7b14d2a9fbb8831b5e7df41e/_variables.scssc b/js/vendor/maple/.sass-cache/7cde79c3df438dcd7b14d2a9fbb8831b5e7df41e/_variables.scssc new file mode 100644 index 00000000..a834684d Binary files /dev/null and b/js/vendor/maple/.sass-cache/7cde79c3df438dcd7b14d2a9fbb8831b5e7df41e/_variables.scssc differ diff --git a/js/vendor/maple/.sass-cache/7cde79c3df438dcd7b14d2a9fbb8831b5e7df41e/main.scssc b/js/vendor/maple/.sass-cache/7cde79c3df438dcd7b14d2a9fbb8831b5e7df41e/main.scssc new file mode 100644 index 00000000..a379d30c Binary files /dev/null and b/js/vendor/maple/.sass-cache/7cde79c3df438dcd7b14d2a9fbb8831b5e7df41e/main.scssc differ diff --git a/js/vendor/maple/app.js b/js/vendor/maple/app.js new file mode 100644 index 00000000..80ee4de1 --- /dev/null +++ b/js/vendor/maple/app.js @@ -0,0 +1,32 @@ +var bogart = require('bogart') + , router = bogart.router() + , app = bogart.app() + , path = require('path') + , viewEngine = bogart.viewEngine('mustache', path.join(__dirname, 'views')); + +router.get('/', function ( req ) { + return viewEngine.respond('index.html'); +}); + +router.get('/animals', function ( req ) { + return bogart.json(['dogs', 'cats', 'horses']); +}); + +router.get('/dogs', function ( req ) { + return bogart.json(['labs', 'poodles']); +}); + +router.get('/labs', function ( req ) { + return bogart.json([{ + name : 'lassie', + weight : 70 + }]); +}) + +router.get('/js/*', function (req) { + return bogart.file(path.join(bogart.maindir(), 'js', req.params.splat[0])); +}); + +app.use(router); +app.start({ port: 8585 }); + diff --git a/js/vendor/maple/config.rb b/js/vendor/maple/config.rb new file mode 100644 index 00000000..decfb972 --- /dev/null +++ b/js/vendor/maple/config.rb @@ -0,0 +1,4 @@ +http_path = "/" +css_dir = "css" +sass_dir = "scss" +output_style = :compressed \ No newline at end of file diff --git a/js/vendor/maple/css/images/ajax-loader.gif b/js/vendor/maple/css/images/ajax-loader.gif new file mode 100644 index 00000000..e192ca89 Binary files /dev/null and b/js/vendor/maple/css/images/ajax-loader.gif differ diff --git a/js/vendor/maple/css/images/download.jpg b/js/vendor/maple/css/images/download.jpg new file mode 100644 index 00000000..676f0565 Binary files /dev/null and b/js/vendor/maple/css/images/download.jpg differ diff --git a/js/vendor/maple/css/images/expand-icon.png b/js/vendor/maple/css/images/expand-icon.png new file mode 100644 index 00000000..6a0d7725 Binary files /dev/null and b/js/vendor/maple/css/images/expand-icon.png differ diff --git a/js/vendor/maple/css/images/folder.png b/js/vendor/maple/css/images/folder.png new file mode 100644 index 00000000..6f09419c Binary files /dev/null and b/js/vendor/maple/css/images/folder.png differ diff --git a/js/vendor/maple/css/images/loading-spinner.gif b/js/vendor/maple/css/images/loading-spinner.gif new file mode 100644 index 00000000..db83a08d Binary files /dev/null and b/js/vendor/maple/css/images/loading-spinner.gif differ diff --git a/js/vendor/maple/css/main.css b/js/vendor/maple/css/main.css new file mode 100644 index 00000000..617ee520 --- /dev/null +++ b/js/vendor/maple/css/main.css @@ -0,0 +1 @@ +.maple-wrapper{border:1px solid #a8a8a8;border-radius:5px;display:inline-block;padding:10px;min-width:200px}.maple-wrapper ul,.maple-wrapper li{list-style-type:none;margin:0;padding:0}.maple-wrapper .maple-tree{padding:0}.maple-wrapper .maple-tree li{padding-top:5px;padding-bottom:5px}.maple-wrapper .maple-tree .maple-subtree{margin-left:20px}.maple-wrapper li{position:relative}.maple-wrapper li>span{display:inline-block;height:20px;line-height:20px;vertical-align:middle}.maple-wrapper li>span.maple-selected{background-color:#2e2e2e;color:white}.maple-wrapper li>img{display:inline-block;height:20px;width:20px;padding:0;margin:0;width:auto;margin-right:5px;vertical-align:middle;cursor:pointer}.maple-wrapper li.maple-folder>.maple-subtree{margin-left:40px}.maple-wrapper li.maple-folder:not(.loading)>img{content:url(images/folder.png)}.maple-wrapper li.maple-folder:not(.loading).expanded>img{content:url(images/expand-icon.png);-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}.maple-wrapper li.maple-folder.loading>img{content:url(images/ajax-loader.gif)}.maple-wrapper li.maple-item>span:before{content:"-";font-size:24px;text-align:center;margin-right:5px;cursor:pointer} diff --git a/js/vendor/maple/index.html b/js/vendor/maple/index.html new file mode 100644 index 00000000..332ca22b --- /dev/null +++ b/js/vendor/maple/index.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/js/vendor/maple/js/maple.js b/js/vendor/maple/js/maple.js new file mode 100644 index 00000000..20c95562 --- /dev/null +++ b/js/vendor/maple/js/maple.js @@ -0,0 +1,279 @@ +$(function () { + $.widget('msi.maple', { + + options : { + tree : {} + }, + + _create : function () { + $(this.element).addClass('maple-wrapper'); + + var maple = this; + maple.tree = maple.options.tree; + maple.rootBranches = []; + var $rootTree = $('
    '); + maple.element.append($rootTree); + + $.each(maple.tree.branches, function ( index, branch ) { + + var opts = branch; + opts.tree = maple; + opts.show = true; + + branch = _makeBranch(opts, true); + + maple.rootBranches.push(branch); + + $rootTree.append(branch.$el); + }); + } + }); +}); + + +function Branch ( options ) { + this.name = options.name; + this.branches = options.branches; + this.type = options.type; + this.cssClass = options.cssClass; + this.preload = options.preload; + this.parent = options.parent; + this.tree = options.tree || this.parent.tree; + this.onLoaded = options.onLoaded; + this.onChildrenLoaded = options.onChildrenLoaded; + this.getData = options.getData; + + var branch = this + , tree = this.tree; + + if(options.url ) { + this.url = options.url; + } + + this.$el = options.$el; + + //add data attributes + if(options.attributes) { + for(var i in options.attributes) { + if(options.attributes.hasOwnProperty(i)) { + branch.$el.attr('data-' + i, options.attributes[i]); + } + } + } + + + if(options.cssClass) { + this.$el.addClass(options.cssClass); + } + + if(options.type === 'folder') { + this.$el.addClass('maple-folder'); + this.$icon = $(''); + this.$el.prepend(this.$icon); + } else { + this.$el.addClass('maple-item'); + } + + this.data = options.data || {}; + this.children = options.children || []; + this.onClicked = options.onClicked; + + this.render = function () { + var $parent; + if(!this.parent) { + $parent = tree.element.find('.maple-subtree').first(); + } else { + $parent = this.parent.$el.children('.maple-subtree'); + } + $parent.append(this.$el); + }.bind(this); + + this.loadChildren = function ( cb ) { + + if(this.$el.hasClass('loading')) { + return; + } + + var fetchMethod; + if(this.url) { + fetchMethod = "url"; + this.loading = true; + } else if (this.getData && isFunction(this.getData)) { + fetchMethod = "function"; + this.loading = true; + } else { + fetchMethod = "json"; + } + + switch(fetchMethod) { + case "url": + loadFromUrl(branch, cb); + break; + case "function": + var children = branch.getData(function ( children ) { + branch.$el.removeClass('loading'); + branch.children = children.map(function ( child ) { + child.parent = branch; + var newBranch = _makeBranch(child); + return newBranch; + }); + + branch.loading = false; + branch.loaded = true; + + if (typeof(cb) !== 'undefined') { + cb(branch.children); + } + + if(branch.onChildrenLoaded) { + branch.onChildrenLoaded(branch.children); + } + }); + break; + case "json": + if(this.branches) { + this.children = this.branches.map(function ( childBranch ) { + childBranch.parent = branch; + var newBranch = _makeBranch(childBranch); + return newBranch; + }); + } else { + this.children = []; + } + + if(typeof(cb) !== 'undefined') { + cb(this.children); + } + break; + } + + }.bind(this); + + this.renderChildren = function () { + if(branch.populated) { + + if(branch.$el.hasClass('maple-collapsed')) { + branch.$el.children('.maple-subtree').show(); + branch.$el.addClass('expanded'); + branch.$el.removeClass('maple-collapsed'); + } else { + branch.$el.children('.maple-subtree').hide(); + branch.$el.removeClass('loading'); + branch.$el.removeClass('expanded'); + branch.$el.addClass('maple-collapsed'); + } + return; + } + + $.each(this.children, function ( index, child ) { + child.render(); + }); + + this.populated = true; + this.onChildrenLoaded = undefined; + this.$el.addClass('expanded'); + }.bind(this); + + this.populateChildren = function ( e ) { + + //if this is being called from an event, prevent default and propagation + if(typeof(e) !== 'undefined') { + e.preventDefault(); + e.stopPropagation(); + } + + if(this.loading) { + this.$el.addClass('loading'); + this.onChildrenLoaded = this.renderChildren; + + return; + } + + if(this.loaded) { + this.renderChildren(); + return; + } + + this.loadChildren(this.renderChildren); + }.bind(this); + + this.assignParent = function ( child ) { + child.parent = this; + return child; + }; + + if(this.url || (this.getData && isFunction(this.getData))) { + if(this.$icon) { + this.$icon.on('click', this.populateChildren); + } else { + if(tree.options.populateOnBranchClick === true) { + this.$el.on('click', this.populateChildren); + } + } + } + + if(this.onClicked) { + this.$el.children('span').on('click', function ( e ) { + e.stopPropagation(); + branch.onClicked.call(e, branch.$el, options); + }); + + this.$el.children('span').css('cursor', 'pointer'); + } + + + if(this.preload || this.type != 'folder') { + this.loadChildren(); + } + + if(options.show || this.type == 'folder') { + this.render(); + } + + return this; +} + +function loadFromUrl ( branch, cb ) { + $.ajax({ + type : 'GET', + url : branch.url, + data: branch.data, + success: function ( result ) { + + branch.$el.removeClass('loading'); + if(branch.onLoaded) { + result = branch.onLoaded(result, branch.$el); + } + + branch.children = result.map(function ( child ) { + child.parent = branch; + return _makeBranch(child); + }); + + branch.loading = false; + branch.loaded = true; + + if(typeof(cb) !== 'undefined') { + cb(branch.children); + } + + if(branch.onChildrenLoaded) { + branch.onChildrenLoaded(branch.children); + } + } + }); +} + +function _makeBranch ( options, root ) { + var branchTemplate = '
  • ' + options.name + '
    • '; + + options.$el = $(branchTemplate); + var branch = new Branch(options); + + return branch; +} + +/* Borrowed from underscore.js */ +function isFunction ( obj ) { + return !!(obj && obj.constructor && obj.call && obj.apply); +} \ No newline at end of file diff --git a/js/vendor/maple/js/mapleSetup.js b/js/vendor/maple/js/mapleSetup.js new file mode 100644 index 00000000..2dc59c47 --- /dev/null +++ b/js/vendor/maple/js/mapleSetup.js @@ -0,0 +1,47 @@ +$(function () { + var mapleTree = $('#tree').maple({ + tree : { + branches : [ + { + name : 'animals', + url : '/animals', + onLoaded : animalsLoaded + } + ] + } + }); +}); + +function animalsLoaded ( animals ) { + return animals.map(function ( animal ) { + return { + name: animal, + url : "/" + animal, + onLoaded : speciesLoaded + } + }); +} + + +function speciesLoaded ( species ) { + return species.map( function ( speciesName ) { + return { + name: speciesName, + url : "/" + speciesName, + onLoaded : specificAnimalsLoaded + } + }); +} + +function specificAnimalsLoaded ( animals ) { + return animals.map(function ( animal ) { + return { + name: animal.name, + onClicked : function () { + window.location.href= "/animal/" + animal.name; + } + } + }); +} + + diff --git a/js/vendor/maple/maple.js b/js/vendor/maple/maple.js new file mode 100644 index 00000000..41fef8c0 --- /dev/null +++ b/js/vendor/maple/maple.js @@ -0,0 +1,83 @@ +$(function () { + $.widget('msi.maple', { + + options : { + tree : {} + }, + + _create : function () { + var maple = this; + + this.tree = this.options.tree; + this.rootBranches = []; + var $rootTree = $('
        '); + this.element.append($rootTree); + + $.each(this.tree.branches, function ( index, branch ) { + + var branch = maple._makeBranch({ + name : branch.name, + url : branch.url, + tree : maple, + children : branch.children + }, true); + + maple.rootBranches.push(branch); + $rootTree.append(branch.$el); + + }); + }, + + _makeBranch : function ( options, root ) { + var branchTemplate = '
      • ' + options.name + '
        • '; + //var branchTemplate = '
          ' + options.$el = $(branchTemplate); + var branch = new Branch(options, this); + + // this.element.on('click', '[data-branch="' + options.name + '"]', function ( e ) { + // branch.populateChildren(); + // }); + + return branch; + } + }); +}); + +function Branch ( options, tree ) { + var branch = this; + this.name = options.name; + this.url = options.url; + this.$el = options.$el; + this.data = options.data || { branch : options.name } + this.children = options.children || []; + + this.populateChildren = function () { + var tree = this; + + $.ajax({ + type : 'GET', + url : branch.url, + data: branch.data, + success: function ( result ) { + if (options.onLoad) { + result = options.onLoad(result); + } + + branch.children = result; + $.each(branch.children, function ( index, child ) { + var subBranch = tree._makeBranch({ + name : child.name, + url : child.url, + tree : tree + }); + + branch.$el.find('.maple-subtree').append(subBranch.$el); + }); + } + }); + } + + this.$el.on('click', this.populateChildren); + + return this; +} \ No newline at end of file diff --git a/js/vendor/maple/package.json b/js/vendor/maple/package.json new file mode 100644 index 00000000..e52eb00c --- /dev/null +++ b/js/vendor/maple/package.json @@ -0,0 +1,16 @@ +{ + "name": "maple", + "version": "0.0.0", + "description": "", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Phillip Schmidt", + "license": "ISC", + "dependencies": { + "bogart": "^0.5.21", + "nodependency": "^0.1.2", + "path": "^0.4.9" + } +} diff --git a/js/vendor/maple/samples/app.js b/js/vendor/maple/samples/app.js new file mode 100644 index 00000000..bef6965f --- /dev/null +++ b/js/vendor/maple/samples/app.js @@ -0,0 +1,53 @@ +var bogart = require('bogart') + , router = bogart.router() + , app = bogart.app() + , path = require('path') + , viewEngine = bogart.viewEngine('mustache', path.join(__dirname, 'views')); + +router.get('/', function ( req ) { + return viewEngine.respond('index.html'); +}); + +router.get('/animals', function ( req ) { + return bogart.json(['dogs', 'cats', 'horses']); +}); + +router.get('/dogs', function ( req ) { + return bogart.json(['labs', 'poodles']); +}); + +router.get('/labs', function ( req ) { + return bogart.json([{ + name : 'lassie', + weight : 70 + }]); +}) + +router.get('/poodles', function ( req ) { + return bogart.json([ + { + name : 'Doodle', + weidht: 50 + } + ]); +}); + +router.get('/cats', function ( req ) { + return bogart.json(['fluffy']); +}); + +router.get('/horses', function ( req ) { + return bogart.json(['Seabiscuit']); +}); + +router.get('/js/*', function (req) { + return bogart.file(path.join(bogart.maindir(), 'js', req.params.splat[0])); +}); + +router.get('/css/*', function (req) { + return bogart.file(path.join(bogart.maindir(), 'css', req.params.splat[0])); +}); + +app.use(router); +app.start({ port: 8585 }); + diff --git a/js/vendor/maple/samples/css/images/ajax-loader.gif b/js/vendor/maple/samples/css/images/ajax-loader.gif new file mode 100644 index 00000000..e192ca89 Binary files /dev/null and b/js/vendor/maple/samples/css/images/ajax-loader.gif differ diff --git a/js/vendor/maple/samples/css/images/expand-icon.png b/js/vendor/maple/samples/css/images/expand-icon.png new file mode 100644 index 00000000..6a0d7725 Binary files /dev/null and b/js/vendor/maple/samples/css/images/expand-icon.png differ diff --git a/js/vendor/maple/samples/css/images/folder.png b/js/vendor/maple/samples/css/images/folder.png new file mode 100644 index 00000000..6f09419c Binary files /dev/null and b/js/vendor/maple/samples/css/images/folder.png differ diff --git a/js/vendor/maple/samples/css/main.css b/js/vendor/maple/samples/css/main.css new file mode 100644 index 00000000..7b2ead1d --- /dev/null +++ b/js/vendor/maple/samples/css/main.css @@ -0,0 +1 @@ +.maple-wrapper{border:1px solid #a8a8a8;border-radius:5px;display:inline-block;padding:10px;min-width:100px}.maple-wrapper ul,.maple-wrapper li{list-style-type:none;margin:0;padding:0}.maple-wrapper .maple-tree{padding:0}.maple-wrapper .maple-tree li{padding-top:5px;padding-bottom:5px}.maple-wrapper .maple-tree .maple-subtree{margin-left:20px}.maple-wrapper li{position:relative}.maple-wrapper li>span{display:inline-block;height:20px;line-height:20px;vertical-align:middle}.maple-wrapper li>span.maple-selected{background-color:#2e2e2e;color:white}.maple-wrapper li>img{display:inline-block;height:20px;width:20px;padding:0;margin:0;width:auto;margin-right:5px;vertical-align:middle;cursor:pointer}.maple-wrapper li.maple-folder>.maple-subtree{margin-left:40px}.maple-wrapper li.maple-folder:not(.loading)>img{content:url(images/folder.png)}.maple-wrapper li.maple-folder:not(.loading).expanded>img{content:url(images/expand-icon.png);-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}.maple-wrapper li.maple-folder.loading>img{content:url(images/ajax-loader.gif)}.maple-wrapper li.maple-item>span:before{content:"-";font-size:24px;text-align:center;margin-right:5px;cursor:pointer} diff --git a/js/vendor/maple/samples/js/maple.js b/js/vendor/maple/samples/js/maple.js new file mode 100644 index 00000000..9e1bc691 --- /dev/null +++ b/js/vendor/maple/samples/js/maple.js @@ -0,0 +1,158 @@ +$(function () { + $.widget('msi.maple', { + + options : { + tree : {} + }, + + _create : function () { + $(this.element).addClass('maple-wrapper'); + + var maple = this; + maple.tree = maple.options.tree; + maple.rootBranches = []; + var $rootTree = $('
            '); + maple.element.append($rootTree); + + $.each(maple.tree.branches, function ( index, branch ) { + + branch.tree = maple; + branch = maple._makeBranch(branch, true); + + maple.rootBranches.push(branch); + + $rootTree.append(branch.$el); + }); + }, + + _makeBranch : function ( options, root ) { + var branchTemplate = '
          • ' + options.name + '
            • '; + + options.$el = $(branchTemplate); + var branch = new Branch(options, this); + + return branch; + } + }); +}); + + +function Branch ( options, tree ) { + var branch = this; + + this.name = options.name; + this.branches = options.branches; + this.type = options.type; + this.cssClass = options.cssClass; + + if(options.url ) { + this.url = options.url; + } + + this.$el = options.$el; + + //add data attributes + if(options.attributes) { + for(var i in options.attributes) { + if(options.attributes.hasOwnProperty(i)) { + branch.$el.attr('data-' + i, options.attributes[i]); + } + } + } + + + if(options.cssClass) { + this.$el.addClass(options.cssClass); + } + + if(options.type === 'folder') { + this.$el.addClass('maple-folder'); + this.$icon = $(''); + this.$el.prepend(this.$icon); + } else { + this.$el.addClass('maple-item'); + } + + this.data = options.data || {}; + this.children = options.children || []; + this.onClicked = options.onClicked; + + this.populateChildren = function ( e ) { + e.preventDefault(); + e.stopPropagation(); + + if(branch.populated) { + + if(branch.$el.hasClass('maple-collapsed')) { + branch.$el.children('.maple-subtree').show(); + branch.$el.addClass('expanded'); + branch.$el.removeClass('maple-collapsed'); + } else { + branch.$el.children('.maple-subtree').hide(); + branch.$el.removeClass('loading'); + branch.$el.removeClass('expanded'); + branch.$el.addClass('maple-collapsed'); + } + return; + } + + branch.$el.addClass('loading'); + + $.ajax({ + type : 'GET', + url : branch.url, + data: branch.data, + success: function ( result ) { + + branch.$el.removeClass('loading'); + branch.$el.addClass('expanded'); + + if(options.onLoaded) { + result = options.onLoaded(result, branch.$el); + } + + branch.children = result; + + renderChildren(branch.children, branch, tree); + + branch.populated = true; + } + }); + } + + if(this.url) { + if(this.$icon) { + this.$icon.on('click', this.populateChildren); + } else { + if(tree.options.populateOnBranchClick === true) { + this.$el.on('click', this.populateChildren); + } + } + } + + if(this.onClicked) { + this.$el.children('span').on('click', function ( e ) { + e.stopPropagation(); + branch.onClicked.call(e, branch.$el, options); + }); + + this.$el.children('span').css('cursor', 'pointer'); + } + + + if (branch.branches && branch.branches.length) { + renderChildren(branch.branches, branch, tree); + } + + return this; +} + +function renderChildren ( children, parent, tree ) { + $.each(children, function ( index, child ) { + + child.tree = tree; + var subBranch = tree._makeBranch(child); + + parent.$el.children('.maple-subtree').append(subBranch.$el); + }); +} \ No newline at end of file diff --git a/js/vendor/maple/samples/package.json b/js/vendor/maple/samples/package.json new file mode 100644 index 00000000..e52eb00c --- /dev/null +++ b/js/vendor/maple/samples/package.json @@ -0,0 +1,16 @@ +{ + "name": "maple", + "version": "0.0.0", + "description": "", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Phillip Schmidt", + "license": "ISC", + "dependencies": { + "bogart": "^0.5.21", + "nodependency": "^0.1.2", + "path": "^0.4.9" + } +} diff --git a/js/vendor/maple/samples/views/index.html b/js/vendor/maple/samples/views/index.html new file mode 100644 index 00000000..3525f252 --- /dev/null +++ b/js/vendor/maple/samples/views/index.html @@ -0,0 +1,60 @@ +
              + + \ No newline at end of file diff --git a/js/vendor/maple/samples/views/layout.html b/js/vendor/maple/samples/views/layout.html new file mode 100644 index 00000000..5fe8022d --- /dev/null +++ b/js/vendor/maple/samples/views/layout.html @@ -0,0 +1,13 @@ + + + + + + + + + + + {{{body}}} + + \ No newline at end of file diff --git a/js/vendor/maple/scss/_variables.scss b/js/vendor/maple/scss/_variables.scss new file mode 100644 index 00000000..48f69dfb --- /dev/null +++ b/js/vendor/maple/scss/_variables.scss @@ -0,0 +1,4 @@ +$imagesDir : 'images'; +$iconWidth : 20px; +$iconHeight : 20px; +$indentWidth: 20px; \ No newline at end of file diff --git a/js/vendor/maple/scss/main.scss b/js/vendor/maple/scss/main.scss new file mode 100644 index 00000000..4da0a2a8 --- /dev/null +++ b/js/vendor/maple/scss/main.scss @@ -0,0 +1,99 @@ +@import 'variables'; + +.maple-wrapper { + border: 1px solid #a8a8a8; + border-radius: 5px; + display: inline-block; + padding: 10px; + min-width: 200px; + + ul, li { + list-style-type: none; + margin: 0; + padding: 0; + } + + .maple-tree { + padding: 0; + + li { + padding-top: 5px; + padding-bottom: 5px; + } + + .maple-subtree { + margin-left: $indentWidth; + } + } + + li { + position: relative; + + &>span { + display: inline-block; + height: $iconHeight; + line-height: $iconHeight; + vertical-align: middle; + + &.maple-selected { + background-color: #2e2e2e; + color: white; + } + } + + &>img { + display: inline-block; + height: $iconHeight; + width: $iconWidth; + padding: 0; + margin: 0; + width: auto; + margin-right: 5px; + vertical-align: middle; + cursor: pointer; + } + + &.maple-folder { + + &>.maple-subtree { + margin-left: $iconWidth + $indentWidth; + } + + &:not(.loading) { + &>img { + content: url(#{$imagesDir}/folder.png); + } + + &.expanded { + + &>img { + content: url(#{$imagesDir}/expand-icon.png); + -webkit-transform: rotate(-180deg); + -moz-transform: rotate(-180deg); + -ms-transform: rotate(-180deg); + -o-transform: rotate(-180deg); + transform: rotate(-180deg); + } + } + } + + &.loading { + &>img { + content: url(#{$imagesDir}/ajax-loader.gif) + } + } + } + + &.maple-item { + &>span { + &:before { + content: "-"; + font-size: 24px; + text-align: center; + margin-right: 5px; + cursor: pointer; + } + } + } + } +} \ No newline at end of file diff --git a/js/vendor/maple/views/index.html b/js/vendor/maple/views/index.html new file mode 100644 index 00000000..332ca22b --- /dev/null +++ b/js/vendor/maple/views/index.html @@ -0,0 +1 @@ +
              \ No newline at end of file diff --git a/js/vendor/maple/views/layout.html b/js/vendor/maple/views/layout.html new file mode 100644 index 00000000..ff1d175e --- /dev/null +++ b/js/vendor/maple/views/layout.html @@ -0,0 +1,12 @@ + + + + +{{{body}}} + + + + + + + \ No newline at end of file diff --git a/js/vendor/mixins.js b/js/vendor/mixins.js new file mode 100644 index 00000000..9deefab8 --- /dev/null +++ b/js/vendor/mixins.js @@ -0,0 +1,39 @@ +define(['jquery', 'underscore'], function ( $, _ ) { + + //underscore mixins + _.mixin({ + isNullOrEmpty : function ( val ) { + var isEmpty; + if(typeof(val) === 'string' || typeof(val) === 'number') { + isEmpty = !(/\S/.test(val.toString())); + } else if ($.isArray(val)) { + isEmpty = !(_.filter(val, function ( value ) { + return !!value || value === false; + }).length > 0); + } else { + isEmpty == !val; + } + return isEmpty; + } + }); + + _.mixin({ + refine : function ( obj ) { + if($.isArray(obj)) { + return _.filter(obj, function ( value ) { + return !_.isNullOrEmpty(value); + }); + } else { + for(var i in obj) { + if (obj.hasOwnProperty(i)) { + var value = obj[i]; + if(_.isNullOrEmpty(value)) { + delete obj[i]; + } + } + } + return obj; + } + } + }); +}); \ No newline at end of file diff --git a/js/vendor/opentip.js b/js/vendor/opentip.js new file mode 100644 index 00000000..0a73911b --- /dev/null +++ b/js/vendor/opentip.js @@ -0,0 +1,2722 @@ +// Generated by CoffeeScript 1.4.0 +/* +# +# Opentip v2.4.6 +# +# More info at [www.opentip.org](http://www.opentip.org) +# +# Copyright (c) 2012, Matias Meno +# Graphics by Tjandra Mayerhold +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +*/ + +var Opentip, firstAdapter, i, mouseMoved, mousePosition, mousePositionObservers, position, vendors, _i, _len, _ref, + __slice = [].slice, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + __hasProp = {}.hasOwnProperty; + +Opentip = (function() { + + Opentip.prototype.STICKS_OUT_TOP = 1; + + Opentip.prototype.STICKS_OUT_BOTTOM = 2; + + Opentip.prototype.STICKS_OUT_LEFT = 1; + + Opentip.prototype.STICKS_OUT_RIGHT = 2; + + Opentip.prototype["class"] = { + container: "opentip-container", + opentip: "opentip", + header: "ot-header", + content: "ot-content", + loadingIndicator: "ot-loading-indicator", + close: "ot-close", + goingToHide: "ot-going-to-hide", + hidden: "ot-hidden", + hiding: "ot-hiding", + goingToShow: "ot-going-to-show", + showing: "ot-showing", + visible: "ot-visible", + loading: "ot-loading", + ajaxError: "ot-ajax-error", + fixed: "ot-fixed", + showEffectPrefix: "ot-show-effect-", + hideEffectPrefix: "ot-hide-effect-", + stylePrefix: "style-" + }; + + function Opentip(element, content, title, options) { + var elementsOpentips, hideTrigger, methodToBind, optionSources, prop, styleName, _i, _j, _len, _len1, _ref, _ref1, _ref2, _tmpStyle, + _this = this; + this.id = ++Opentip.lastId; + this.debug("Creating Opentip."); + Opentip.tips.push(this); + this.adapter = Opentip.adapter; + elementsOpentips = this.adapter.data(element, "opentips") || []; + elementsOpentips.push(this); + this.adapter.data(element, "opentips", elementsOpentips); + this.triggerElement = this.adapter.wrap(element); + if (this.triggerElement.length > 1) { + throw new Error("You can't call Opentip on multiple elements."); + } + if (this.triggerElement.length < 1) { + throw new Error("Invalid element."); + } + this.loaded = false; + this.loading = false; + this.visible = false; + this.waitingToShow = false; + this.waitingToHide = false; + this.currentPosition = { + left: 0, + top: 0 + }; + this.dimensions = { + width: 100, + height: 50 + }; + this.content = ""; + this.redraw = true; + this.currentObservers = { + showing: false, + visible: false, + hiding: false, + hidden: false + }; + options = this.adapter.clone(options); + if (typeof content === "object") { + options = content; + content = title = void 0; + } else if (typeof title === "object") { + options = title; + title = void 0; + } + if (title != null) { + options.title = title; + } + if (content != null) { + this.setContent(content); + } + if (options["extends"] == null) { + if (options.style != null) { + options["extends"] = options.style; + } else { + options["extends"] = Opentip.defaultStyle; + } + } + optionSources = [options]; + _tmpStyle = options; + while (_tmpStyle["extends"]) { + styleName = _tmpStyle["extends"]; + _tmpStyle = Opentip.styles[styleName]; + if (_tmpStyle == null) { + throw new Error("Invalid style: " + styleName); + } + optionSources.unshift(_tmpStyle); + if (!((_tmpStyle["extends"] != null) || styleName === "standard")) { + _tmpStyle["extends"] = "standard"; + } + } + options = (_ref = this.adapter).extend.apply(_ref, [{}].concat(__slice.call(optionSources))); + options.hideTriggers = (function() { + var _i, _len, _ref1, _results; + _ref1 = options.hideTriggers; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + hideTrigger = _ref1[_i]; + _results.push(hideTrigger); + } + return _results; + })(); + if (options.hideTrigger && options.hideTriggers.length === 0) { + options.hideTriggers.push(options.hideTrigger); + } + _ref1 = ["tipJoint", "targetJoint", "stem"]; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + prop = _ref1[_i]; + if (options[prop] && typeof options[prop] === "string") { + options[prop] = new Opentip.Joint(options[prop]); + } + } + if (options.ajax && (options.ajax === true || !options.ajax)) { + if (this.adapter.tagName(this.triggerElement) === "A") { + options.ajax = this.adapter.attr(this.triggerElement, "href"); + } else { + options.ajax = false; + } + } + if (options.showOn === "click" && this.adapter.tagName(this.triggerElement) === "A") { + this.adapter.observe(this.triggerElement, "click", function(e) { + e.preventDefault(); + e.stopPropagation(); + return e.stopped = true; + }); + } + if (options.target) { + options.fixed = true; + } + if (options.stem === true) { + options.stem = new Opentip.Joint(options.tipJoint); + } + if (options.target === true) { + options.target = this.triggerElement; + } else if (options.target) { + options.target = this.adapter.wrap(options.target); + } + this.currentStem = options.stem; + if (options.delay == null) { + options.delay = options.showOn === "mouseover" ? 0.2 : 0; + } + if (options.targetJoint == null) { + options.targetJoint = new Opentip.Joint(options.tipJoint).flip(); + } + this.showTriggers = []; + this.showTriggersWhenVisible = []; + this.hideTriggers = []; + if (options.showOn && options.showOn !== "creation") { + this.showTriggers.push({ + element: this.triggerElement, + event: options.showOn + }); + } + if (options.ajaxCache != null) { + options.cache = options.ajaxCache; + delete options.ajaxCache; + } + this.options = options; + this.bound = {}; + _ref2 = ["prepareToShow", "prepareToHide", "show", "hide", "reposition"]; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + methodToBind = _ref2[_j]; + this.bound[methodToBind] = (function(methodToBind) { + return function() { + return _this[methodToBind].apply(_this, arguments); + }; + })(methodToBind); + } + this.adapter.domReady(function() { + _this.activate(); + if (_this.options.showOn === "creation") { + return _this.prepareToShow(); + } + }); + } + + Opentip.prototype._setup = function() { + var hideOn, hideTrigger, hideTriggerElement, i, _i, _j, _len, _len1, _ref, _ref1, _results; + this.debug("Setting up the tooltip."); + this._buildContainer(); + this.hideTriggers = []; + _ref = this.options.hideTriggers; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + hideTrigger = _ref[i]; + hideTriggerElement = null; + hideOn = this.options.hideOn instanceof Array ? this.options.hideOn[i] : this.options.hideOn; + if (typeof hideTrigger === "string") { + switch (hideTrigger) { + case "trigger": + hideOn = hideOn || "mouseout"; + hideTriggerElement = this.triggerElement; + break; + case "tip": + hideOn = hideOn || "mouseover"; + hideTriggerElement = this.container; + break; + case "target": + hideOn = hideOn || "mouseover"; + hideTriggerElement = this.options.target; + break; + case "closeButton": + break; + default: + throw new Error("Unknown hide trigger: " + hideTrigger + "."); + } + } else { + hideOn = hideOn || "mouseover"; + hideTriggerElement = this.adapter.wrap(hideTrigger); + } + if (hideTriggerElement) { + this.hideTriggers.push({ + element: hideTriggerElement, + event: hideOn, + original: hideTrigger + }); + } + } + _ref1 = this.hideTriggers; + _results = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + hideTrigger = _ref1[_j]; + _results.push(this.showTriggersWhenVisible.push({ + element: hideTrigger.element, + event: "mouseover" + })); + } + return _results; + }; + + Opentip.prototype._buildContainer = function() { + this.container = this.adapter.create("
              "); + this.adapter.css(this.container, { + position: "absolute" + }); + if (this.options.ajax) { + this.adapter.addClass(this.container, this["class"].loading); + } + if (this.options.fixed) { + this.adapter.addClass(this.container, this["class"].fixed); + } + if (this.options.showEffect) { + this.adapter.addClass(this.container, "" + this["class"].showEffectPrefix + this.options.showEffect); + } + if (this.options.hideEffect) { + return this.adapter.addClass(this.container, "" + this["class"].hideEffectPrefix + this.options.hideEffect); + } + }; + + Opentip.prototype._buildElements = function() { + var headerElement, titleElement; + this.tooltipElement = this.adapter.create("
              "); + this.backgroundCanvas = this.adapter.wrap(document.createElement("canvas")); + this.adapter.css(this.backgroundCanvas, { + position: "absolute" + }); + if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { + G_vmlCanvasManager.initElement(this.adapter.unwrap(this.backgroundCanvas)); + } + headerElement = this.adapter.find(this.tooltipElement, "." + this["class"].header); + if (this.options.title) { + titleElement = this.adapter.create("

              "); + this.adapter.update(titleElement, this.options.title, this.options.escapeTitle); + this.adapter.append(headerElement, titleElement); + } + if (this.options.ajax && !this.loaded) { + this.adapter.append(this.tooltipElement, this.adapter.create("
              ↻
              ")); + } + if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { + this.closeButtonElement = this.adapter.create("Close"); + this.adapter.append(headerElement, this.closeButtonElement); + } + this.adapter.append(this.container, this.backgroundCanvas); + this.adapter.append(this.container, this.tooltipElement); + this.adapter.append(document.body, this.container); + this._newContent = true; + return this.redraw = true; + }; + + Opentip.prototype.setContent = function(content) { + this.content = content; + this._newContent = true; + if (typeof this.content === "function") { + this._contentFunction = this.content; + this.content = ""; + } else { + this._contentFunction = null; + } + if (this.visible) { + return this._updateElementContent(); + } + }; + + Opentip.prototype._updateElementContent = function() { + var contentDiv; + if (this._newContent || (!this.options.cache && this._contentFunction)) { + contentDiv = this.adapter.find(this.container, "." + this["class"].content); + if (contentDiv != null) { + if (this._contentFunction) { + this.debug("Executing content function."); + this.content = this._contentFunction(this); + } + this.adapter.update(contentDiv, this.content, this.options.escapeContent); + } + this._newContent = false; + } + this._storeAndLockDimensions(); + return this.reposition(); + }; + + Opentip.prototype._storeAndLockDimensions = function() { + var prevDimension; + if (!this.container) { + return; + } + prevDimension = this.dimensions; + this.adapter.css(this.container, { + width: "auto", + left: "0px", + top: "0px" + }); + this.dimensions = this.adapter.dimensions(this.container); + this.dimensions.width += 1; + this.adapter.css(this.container, { + width: "" + this.dimensions.width + "px", + top: "" + this.currentPosition.top + "px", + left: "" + this.currentPosition.left + "px" + }); + if (!this._dimensionsEqual(this.dimensions, prevDimension)) { + this.redraw = true; + return this._draw(); + } + }; + + Opentip.prototype.activate = function() { + return this._setupObservers("hidden", "hiding"); + }; + + Opentip.prototype.deactivate = function() { + this.debug("Deactivating tooltip."); + this.hide(); + return this._setupObservers("-showing", "-visible", "-hidden", "-hiding"); + }; + + Opentip.prototype._setupObservers = function() { + var observeOrStop, removeObserver, state, states, trigger, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, + _this = this; + states = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + for (_i = 0, _len = states.length; _i < _len; _i++) { + state = states[_i]; + removeObserver = false; + if (state.charAt(0) === "-") { + removeObserver = true; + state = state.substr(1); + } + if (this.currentObservers[state] === !removeObserver) { + continue; + } + this.currentObservers[state] = !removeObserver; + observeOrStop = function() { + var args, _ref, _ref1; + args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + if (removeObserver) { + return (_ref = _this.adapter).stopObserving.apply(_ref, args); + } else { + return (_ref1 = _this.adapter).observe.apply(_ref1, args); + } + }; + switch (state) { + case "showing": + _ref = this.hideTriggers; + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { + trigger = _ref[_j]; + observeOrStop(trigger.element, trigger.event, this.bound.prepareToHide); + } + observeOrStop((document.onresize != null ? document : window), "resize", this.bound.reposition); + observeOrStop(window, "scroll", this.bound.reposition); + break; + case "visible": + _ref1 = this.showTriggersWhenVisible; + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { + trigger = _ref1[_k]; + observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); + } + break; + case "hiding": + _ref2 = this.showTriggers; + for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) { + trigger = _ref2[_l]; + observeOrStop(trigger.element, trigger.event, this.bound.prepareToShow); + } + break; + case "hidden": + break; + default: + throw new Error("Unknown state: " + state); + } + } + return null; + }; + + Opentip.prototype.prepareToShow = function() { + this._abortHiding(); + this._abortShowing(); + if (this.visible) { + return; + } + this.debug("Showing in " + this.options.delay + "s."); + if (this.container == null) { + this._setup(); + } + if (this.options.group) { + Opentip._abortShowingGroup(this.options.group, this); + } + this.preparingToShow = true; + this._setupObservers("-hidden", "-hiding", "showing"); + this._followMousePosition(); + if (this.options.fixed && !this.options.target) { + this.initialMousePosition = mousePosition; + } + this.reposition(); + return this._showTimeoutId = this.setTimeout(this.bound.show, this.options.delay || 0); + }; + + Opentip.prototype.show = function() { + var _this = this; + this._abortHiding(); + if (this.visible) { + return; + } + this._clearTimeouts(); + if (!this._triggerElementExists()) { + return this.deactivate(); + } + this.debug("Showing now."); + if (this.container == null) { + this._setup(); + } + if (this.options.group) { + Opentip._hideGroup(this.options.group, this); + } + this.visible = true; + this.preparingToShow = false; + if (this.tooltipElement == null) { + this._buildElements(); + } + this._updateElementContent(); + if (this.options.ajax && (!this.loaded || !this.options.cache)) { + this._loadAjax(); + } + this._searchAndActivateCloseButtons(); + this._startEnsureTriggerElement(); + this.adapter.css(this.container, { + zIndex: Opentip.lastZIndex++ + }); + this._setupObservers("-hidden", "-hiding", "-showing", "-visible", "showing", "visible"); + if (this.options.fixed && !this.options.target) { + this.initialMousePosition = mousePosition; + } + this.reposition(); + this.adapter.removeClass(this.container, this["class"].hiding); + this.adapter.removeClass(this.container, this["class"].hidden); + this.adapter.addClass(this.container, this["class"].goingToShow); + this.setCss3Style(this.container, { + transitionDuration: "0s" + }); + this.defer(function() { + var delay; + if (!_this.visible || _this.preparingToHide) { + return; + } + _this.adapter.removeClass(_this.container, _this["class"].goingToShow); + _this.adapter.addClass(_this.container, _this["class"].showing); + delay = 0; + if (_this.options.showEffect && _this.options.showEffectDuration) { + delay = _this.options.showEffectDuration; + } + _this.setCss3Style(_this.container, { + transitionDuration: "" + delay + "s" + }); + _this._visibilityStateTimeoutId = _this.setTimeout(function() { + _this.adapter.removeClass(_this.container, _this["class"].showing); + return _this.adapter.addClass(_this.container, _this["class"].visible); + }, delay); + return _this._activateFirstInput(); + }); + return this._draw(); + }; + + Opentip.prototype._abortShowing = function() { + if (this.preparingToShow) { + this.debug("Aborting showing."); + this._clearTimeouts(); + this._stopFollowingMousePosition(); + this.preparingToShow = false; + return this._setupObservers("-showing", "-visible", "hiding", "hidden"); + } + }; + + Opentip.prototype.prepareToHide = function() { + this._abortShowing(); + this._abortHiding(); + if (!this.visible) { + return; + } + this.debug("Hiding in " + this.options.hideDelay + "s"); + this.preparingToHide = true; + this._setupObservers("-showing", "visible", "-hidden", "hiding"); + return this._hideTimeoutId = this.setTimeout(this.bound.hide, this.options.hideDelay); + }; + + Opentip.prototype.hide = function() { + var _this = this; + this._abortShowing(); + if (!this.visible) { + return; + } + this._clearTimeouts(); + this.debug("Hiding!"); + this.visible = false; + this.preparingToHide = false; + this._stopEnsureTriggerElement(); + this._setupObservers("-showing", "-visible", "-hiding", "-hidden", "hiding", "hidden"); + if (!this.options.fixed) { + this._stopFollowingMousePosition(); + } + if (!this.container) { + return; + } + this.adapter.removeClass(this.container, this["class"].visible); + this.adapter.removeClass(this.container, this["class"].showing); + this.adapter.addClass(this.container, this["class"].goingToHide); + this.setCss3Style(this.container, { + transitionDuration: "0s" + }); + return this.defer(function() { + var hideDelay; + _this.adapter.removeClass(_this.container, _this["class"].goingToHide); + _this.adapter.addClass(_this.container, _this["class"].hiding); + hideDelay = 0; + if (_this.options.hideEffect && _this.options.hideEffectDuration) { + hideDelay = _this.options.hideEffectDuration; + } + _this.setCss3Style(_this.container, { + transitionDuration: "" + hideDelay + "s" + }); + return _this._visibilityStateTimeoutId = _this.setTimeout(function() { + _this.adapter.removeClass(_this.container, _this["class"].hiding); + _this.adapter.addClass(_this.container, _this["class"].hidden); + _this.setCss3Style(_this.container, { + transitionDuration: "0s" + }); + if (_this.options.removeElementsOnHide) { + _this.debug("Removing HTML elements."); + _this.adapter.remove(_this.container); + delete _this.container; + return delete _this.tooltipElement; + } + }, hideDelay); + }); + }; + + Opentip.prototype._abortHiding = function() { + if (this.preparingToHide) { + this.debug("Aborting hiding."); + this._clearTimeouts(); + this.preparingToHide = false; + return this._setupObservers("-hiding", "showing", "visible"); + } + }; + + Opentip.prototype.reposition = function() { + var position, stem, _ref, + _this = this; + position = this.getPosition(); + if (position == null) { + return; + } + stem = this.options.stem; + if (this.options.containInViewport) { + _ref = this._ensureViewportContainment(position), position = _ref.position, stem = _ref.stem; + } + if (this._positionsEqual(position, this.currentPosition)) { + return; + } + if (!(!this.options.stem || stem.eql(this.currentStem))) { + this.redraw = true; + } + this.currentPosition = position; + this.currentStem = stem; + this._draw(); + this.adapter.css(this.container, { + left: "" + position.left + "px", + top: "" + position.top + "px" + }); + return this.defer(function() { + var rawContainer, redrawFix; + rawContainer = _this.adapter.unwrap(_this.container); + rawContainer.style.visibility = "hidden"; + redrawFix = rawContainer.offsetHeight; + return rawContainer.style.visibility = "visible"; + }); + }; + + Opentip.prototype.getPosition = function(tipJoint, targetJoint, stem) { + var additionalHorizontal, additionalVertical, offsetDistance, position, stemLength, targetDimensions, targetPosition, unwrappedTarget, _ref; + if (!this.container) { + return; + } + if (tipJoint == null) { + tipJoint = this.options.tipJoint; + } + if (targetJoint == null) { + targetJoint = this.options.targetJoint; + } + position = {}; + if (this.options.target) { + targetPosition = this.adapter.offset(this.options.target); + targetDimensions = this.adapter.dimensions(this.options.target); + position = targetPosition; + if (targetJoint.right) { + unwrappedTarget = this.adapter.unwrap(this.options.target); + if (unwrappedTarget.getBoundingClientRect != null) { + position.left = unwrappedTarget.getBoundingClientRect().right + ((_ref = window.pageXOffset) != null ? _ref : document.body.scrollLeft); + } else { + position.left += targetDimensions.width; + } + } else if (targetJoint.center) { + position.left += Math.round(targetDimensions.width / 2); + } + if (targetJoint.bottom) { + position.top += targetDimensions.height; + } else if (targetJoint.middle) { + position.top += Math.round(targetDimensions.height / 2); + } + if (this.options.borderWidth) { + if (this.options.tipJoint.left) { + position.left += this.options.borderWidth; + } + if (this.options.tipJoint.right) { + position.left -= this.options.borderWidth; + } + if (this.options.tipJoint.top) { + position.top += this.options.borderWidth; + } else if (this.options.tipJoint.bottom) { + position.top -= this.options.borderWidth; + } + } + } else { + if (this.initialMousePosition) { + position = { + top: this.initialMousePosition.y, + left: this.initialMousePosition.x + }; + } else { + position = { + top: mousePosition.y, + left: mousePosition.x + }; + } + } + if (this.options.autoOffset) { + stemLength = this.options.stem ? this.options.stemLength : 0; + offsetDistance = stemLength && this.options.fixed ? 2 : 10; + additionalHorizontal = tipJoint.middle && !this.options.fixed ? 15 : 0; + additionalVertical = tipJoint.center && !this.options.fixed ? 15 : 0; + if (tipJoint.right) { + position.left -= offsetDistance + additionalHorizontal; + } else if (tipJoint.left) { + position.left += offsetDistance + additionalHorizontal; + } + if (tipJoint.bottom) { + position.top -= offsetDistance + additionalVertical; + } else if (tipJoint.top) { + position.top += offsetDistance + additionalVertical; + } + if (stemLength) { + if (stem == null) { + stem = this.options.stem; + } + if (stem.right) { + position.left -= stemLength; + } else if (stem.left) { + position.left += stemLength; + } + if (stem.bottom) { + position.top -= stemLength; + } else if (stem.top) { + position.top += stemLength; + } + } + } + position.left += this.options.offset[0]; + position.top += this.options.offset[1]; + if (tipJoint.right) { + position.left -= this.dimensions.width; + } else if (tipJoint.center) { + position.left -= Math.round(this.dimensions.width / 2); + } + if (tipJoint.bottom) { + position.top -= this.dimensions.height; + } else if (tipJoint.middle) { + position.top -= Math.round(this.dimensions.height / 2); + } + return position; + }; + + Opentip.prototype._ensureViewportContainment = function(position) { + var needsRepositioning, newSticksOut, originals, revertedX, revertedY, scrollOffset, stem, sticksOut, targetJoint, tipJoint, viewportDimensions, viewportPosition; + stem = this.options.stem; + originals = { + position: position, + stem: stem + }; + if (!(this.visible && position)) { + return originals; + } + sticksOut = this._sticksOut(position); + if (!(sticksOut[0] || sticksOut[1])) { + return originals; + } + tipJoint = new Opentip.Joint(this.options.tipJoint); + if (this.options.targetJoint) { + targetJoint = new Opentip.Joint(this.options.targetJoint); + } + scrollOffset = this.adapter.scrollOffset(); + viewportDimensions = this.adapter.viewportDimensions(); + viewportPosition = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; + needsRepositioning = false; + if (viewportDimensions.width >= this.dimensions.width) { + if (sticksOut[0]) { + needsRepositioning = true; + switch (sticksOut[0]) { + case this.STICKS_OUT_LEFT: + tipJoint.setHorizontal("left"); + if (this.options.targetJoint) { + targetJoint.setHorizontal("right"); + } + break; + case this.STICKS_OUT_RIGHT: + tipJoint.setHorizontal("right"); + if (this.options.targetJoint) { + targetJoint.setHorizontal("left"); + } + } + } + } + if (viewportDimensions.height >= this.dimensions.height) { + if (sticksOut[1]) { + needsRepositioning = true; + switch (sticksOut[1]) { + case this.STICKS_OUT_TOP: + tipJoint.setVertical("top"); + if (this.options.targetJoint) { + targetJoint.setVertical("bottom"); + } + break; + case this.STICKS_OUT_BOTTOM: + tipJoint.setVertical("bottom"); + if (this.options.targetJoint) { + targetJoint.setVertical("top"); + } + } + } + } + if (!needsRepositioning) { + return originals; + } + if (this.options.stem) { + stem = tipJoint; + } + position = this.getPosition(tipJoint, targetJoint, stem); + newSticksOut = this._sticksOut(position); + revertedX = false; + revertedY = false; + if (newSticksOut[0] && (newSticksOut[0] !== sticksOut[0])) { + revertedX = true; + tipJoint.setHorizontal(this.options.tipJoint.horizontal); + if (this.options.targetJoint) { + targetJoint.setHorizontal(this.options.targetJoint.horizontal); + } + } + if (newSticksOut[1] && (newSticksOut[1] !== sticksOut[1])) { + revertedY = true; + tipJoint.setVertical(this.options.tipJoint.vertical); + if (this.options.targetJoint) { + targetJoint.setVertical(this.options.targetJoint.vertical); + } + } + if (revertedX && revertedY) { + return originals; + } + if (revertedX || revertedY) { + if (this.options.stem) { + stem = tipJoint; + } + position = this.getPosition(tipJoint, targetJoint, stem); + } + return { + position: position, + stem: stem + }; + }; + + Opentip.prototype._sticksOut = function(position) { + var positionOffset, scrollOffset, sticksOut, viewportDimensions; + scrollOffset = this.adapter.scrollOffset(); + viewportDimensions = this.adapter.viewportDimensions(); + positionOffset = [position.left - scrollOffset[0], position.top - scrollOffset[1]]; + sticksOut = [false, false]; + if (positionOffset[0] < 0) { + sticksOut[0] = this.STICKS_OUT_LEFT; + } else if (positionOffset[0] + this.dimensions.width > viewportDimensions.width) { + sticksOut[0] = this.STICKS_OUT_RIGHT; + } + if (positionOffset[1] < 0) { + sticksOut[1] = this.STICKS_OUT_TOP; + } else if (positionOffset[1] + this.dimensions.height > viewportDimensions.height) { + sticksOut[1] = this.STICKS_OUT_BOTTOM; + } + return sticksOut; + }; + + Opentip.prototype._draw = function() { + var backgroundCanvas, bulge, canvasDimensions, canvasPosition, closeButton, closeButtonInner, closeButtonOuter, ctx, drawCorner, drawLine, hb, position, stemBase, stemLength, _i, _len, _ref, _ref1, _ref2, + _this = this; + if (!(this.backgroundCanvas && this.redraw)) { + return; + } + this.debug("Drawing background."); + this.redraw = false; + if (this.currentStem) { + _ref = ["top", "right", "bottom", "left"]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + position = _ref[_i]; + this.adapter.removeClass(this.container, "stem-" + position); + } + this.adapter.addClass(this.container, "stem-" + this.currentStem.horizontal); + this.adapter.addClass(this.container, "stem-" + this.currentStem.vertical); + } + closeButtonInner = [0, 0]; + closeButtonOuter = [0, 0]; + if (__indexOf.call(this.options.hideTriggers, "closeButton") >= 0) { + closeButton = new Opentip.Joint(((_ref1 = this.currentStem) != null ? _ref1.toString() : void 0) === "top right" ? "top left" : "top right"); + closeButtonInner = [this.options.closeButtonRadius + this.options.closeButtonOffset[0], this.options.closeButtonRadius + this.options.closeButtonOffset[1]]; + closeButtonOuter = [this.options.closeButtonRadius - this.options.closeButtonOffset[0], this.options.closeButtonRadius - this.options.closeButtonOffset[1]]; + } + canvasDimensions = this.adapter.clone(this.dimensions); + canvasPosition = [0, 0]; + if (this.options.borderWidth) { + canvasDimensions.width += this.options.borderWidth * 2; + canvasDimensions.height += this.options.borderWidth * 2; + canvasPosition[0] -= this.options.borderWidth; + canvasPosition[1] -= this.options.borderWidth; + } + if (this.options.shadow) { + canvasDimensions.width += this.options.shadowBlur * 2; + canvasDimensions.width += Math.max(0, this.options.shadowOffset[0] - this.options.shadowBlur * 2); + canvasDimensions.height += this.options.shadowBlur * 2; + canvasDimensions.height += Math.max(0, this.options.shadowOffset[1] - this.options.shadowBlur * 2); + canvasPosition[0] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[0]); + canvasPosition[1] -= Math.max(0, this.options.shadowBlur - this.options.shadowOffset[1]); + } + bulge = { + left: 0, + right: 0, + top: 0, + bottom: 0 + }; + if (this.currentStem) { + if (this.currentStem.left) { + bulge.left = this.options.stemLength; + } else if (this.currentStem.right) { + bulge.right = this.options.stemLength; + } + if (this.currentStem.top) { + bulge.top = this.options.stemLength; + } else if (this.currentStem.bottom) { + bulge.bottom = this.options.stemLength; + } + } + if (closeButton) { + if (closeButton.left) { + bulge.left = Math.max(bulge.left, closeButtonOuter[0]); + } else if (closeButton.right) { + bulge.right = Math.max(bulge.right, closeButtonOuter[0]); + } + if (closeButton.top) { + bulge.top = Math.max(bulge.top, closeButtonOuter[1]); + } else if (closeButton.bottom) { + bulge.bottom = Math.max(bulge.bottom, closeButtonOuter[1]); + } + } + canvasDimensions.width += bulge.left + bulge.right; + canvasDimensions.height += bulge.top + bulge.bottom; + canvasPosition[0] -= bulge.left; + canvasPosition[1] -= bulge.top; + if (this.currentStem && this.options.borderWidth) { + _ref2 = this._getPathStemMeasures(this.options.stemBase, this.options.stemLength, this.options.borderWidth), stemLength = _ref2.stemLength, stemBase = _ref2.stemBase; + } + backgroundCanvas = this.adapter.unwrap(this.backgroundCanvas); + backgroundCanvas.width = canvasDimensions.width; + backgroundCanvas.height = canvasDimensions.height; + this.adapter.css(this.backgroundCanvas, { + width: "" + backgroundCanvas.width + "px", + height: "" + backgroundCanvas.height + "px", + left: "" + canvasPosition[0] + "px", + top: "" + canvasPosition[1] + "px" + }); + ctx = backgroundCanvas.getContext("2d"); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, backgroundCanvas.width, backgroundCanvas.height); + ctx.beginPath(); + ctx.fillStyle = this._getColor(ctx, this.dimensions, this.options.background, this.options.backgroundGradientHorizontal); + ctx.lineJoin = "miter"; + ctx.miterLimit = 500; + hb = this.options.borderWidth / 2; + if (this.options.borderWidth) { + ctx.strokeStyle = this.options.borderColor; + ctx.lineWidth = this.options.borderWidth; + } else { + stemLength = this.options.stemLength; + stemBase = this.options.stemBase; + } + if (stemBase == null) { + stemBase = 0; + } + drawLine = function(length, stem, first) { + if (first) { + ctx.moveTo(Math.max(stemBase, _this.options.borderRadius, closeButtonInner[0]) + 1 - hb, -hb); + } + if (stem) { + ctx.lineTo(length / 2 - stemBase / 2, -hb); + ctx.lineTo(length / 2, -stemLength - hb); + return ctx.lineTo(length / 2 + stemBase / 2, -hb); + } + }; + drawCorner = function(stem, closeButton, i) { + var angle1, angle2, innerWidth, offset; + if (stem) { + ctx.lineTo(-stemBase + hb, 0 - hb); + ctx.lineTo(stemLength + hb, -stemLength - hb); + return ctx.lineTo(hb, stemBase - hb); + } else if (closeButton) { + offset = _this.options.closeButtonOffset; + innerWidth = closeButtonInner[0]; + if (i % 2 !== 0) { + offset = [offset[1], offset[0]]; + innerWidth = closeButtonInner[1]; + } + angle1 = Math.acos(offset[1] / _this.options.closeButtonRadius); + angle2 = Math.acos(offset[0] / _this.options.closeButtonRadius); + ctx.lineTo(-innerWidth + hb, -hb); + return ctx.arc(hb - offset[0], -hb + offset[1], _this.options.closeButtonRadius, -(Math.PI / 2 + angle1), angle2, false); + } else { + ctx.lineTo(-_this.options.borderRadius + hb, -hb); + return ctx.quadraticCurveTo(hb, -hb, hb, _this.options.borderRadius - hb); + } + }; + ctx.translate(-canvasPosition[0], -canvasPosition[1]); + ctx.save(); + (function() { + var cornerStem, i, lineLength, lineStem, positionIdx, positionX, positionY, rotation, _j, _ref3, _results; + _results = []; + for (i = _j = 0, _ref3 = Opentip.positions.length / 2; 0 <= _ref3 ? _j < _ref3 : _j > _ref3; i = 0 <= _ref3 ? ++_j : --_j) { + positionIdx = i * 2; + positionX = i === 0 || i === 3 ? 0 : _this.dimensions.width; + positionY = i < 2 ? 0 : _this.dimensions.height; + rotation = (Math.PI / 2) * i; + lineLength = i % 2 === 0 ? _this.dimensions.width : _this.dimensions.height; + lineStem = new Opentip.Joint(Opentip.positions[positionIdx]); + cornerStem = new Opentip.Joint(Opentip.positions[positionIdx + 1]); + ctx.save(); + ctx.translate(positionX, positionY); + ctx.rotate(rotation); + drawLine(lineLength, lineStem.eql(_this.currentStem), i === 0); + ctx.translate(lineLength, 0); + drawCorner(cornerStem.eql(_this.currentStem), cornerStem.eql(closeButton), i); + _results.push(ctx.restore()); + } + return _results; + })(); + ctx.closePath(); + ctx.save(); + if (this.options.shadow) { + ctx.shadowColor = this.options.shadowColor; + ctx.shadowBlur = this.options.shadowBlur; + ctx.shadowOffsetX = this.options.shadowOffset[0]; + ctx.shadowOffsetY = this.options.shadowOffset[1]; + } + ctx.fill(); + ctx.restore(); + if (this.options.borderWidth) { + ctx.stroke(); + } + ctx.restore(); + if (closeButton) { + return (function() { + var crossCenter, crossHeight, crossWidth, hcs, linkCenter; + crossWidth = crossHeight = _this.options.closeButtonRadius * 2; + if (closeButton.toString() === "top right") { + linkCenter = [_this.dimensions.width - _this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; + crossCenter = [linkCenter[0] + hb, linkCenter[1] - hb]; + } else { + linkCenter = [_this.options.closeButtonOffset[0], _this.options.closeButtonOffset[1]]; + crossCenter = [linkCenter[0] - hb, linkCenter[1] - hb]; + } + ctx.translate(crossCenter[0], crossCenter[1]); + hcs = _this.options.closeButtonCrossSize / 2; + ctx.save(); + ctx.beginPath(); + ctx.strokeStyle = _this.options.closeButtonCrossColor; + ctx.lineWidth = _this.options.closeButtonCrossLineWidth; + ctx.lineCap = "round"; + ctx.moveTo(-hcs, -hcs); + ctx.lineTo(hcs, hcs); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(hcs, -hcs); + ctx.lineTo(-hcs, hcs); + ctx.stroke(); + ctx.restore(); + return _this.adapter.css(_this.closeButtonElement, { + left: "" + (linkCenter[0] - hcs - _this.options.closeButtonLinkOverscan) + "px", + top: "" + (linkCenter[1] - hcs - _this.options.closeButtonLinkOverscan) + "px", + width: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px", + height: "" + (_this.options.closeButtonCrossSize + _this.options.closeButtonLinkOverscan * 2) + "px" + }); + })(); + } + }; + + Opentip.prototype._getPathStemMeasures = function(outerStemBase, outerStemLength, borderWidth) { + var angle, distanceBetweenTips, halfAngle, hb, rhombusSide, stemBase, stemLength; + hb = borderWidth / 2; + halfAngle = Math.atan((outerStemBase / 2) / outerStemLength); + angle = halfAngle * 2; + rhombusSide = hb / Math.sin(angle); + distanceBetweenTips = 2 * rhombusSide * Math.cos(halfAngle); + stemLength = hb + outerStemLength - distanceBetweenTips; + if (stemLength < 0) { + throw new Error("Sorry but your stemLength / stemBase ratio is strange."); + } + stemBase = (Math.tan(halfAngle) * stemLength) * 2; + return { + stemLength: stemLength, + stemBase: stemBase + }; + }; + + Opentip.prototype._getColor = function(ctx, dimensions, color, horizontal) { + var colorStop, gradient, i, _i, _len; + if (horizontal == null) { + horizontal = false; + } + if (typeof color === "string") { + return color; + } + if (horizontal) { + gradient = ctx.createLinearGradient(0, 0, dimensions.width, 0); + } else { + gradient = ctx.createLinearGradient(0, 0, 0, dimensions.height); + } + for (i = _i = 0, _len = color.length; _i < _len; i = ++_i) { + colorStop = color[i]; + gradient.addColorStop(colorStop[0], colorStop[1]); + } + return gradient; + }; + + Opentip.prototype._searchAndActivateCloseButtons = function() { + var element, _i, _len, _ref; + _ref = this.adapter.findAll(this.container, "." + this["class"].close); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + element = _ref[_i]; + this.hideTriggers.push({ + element: this.adapter.wrap(element), + event: "click" + }); + } + if (this.currentObservers.showing) { + this._setupObservers("-showing", "showing"); + } + if (this.currentObservers.visible) { + return this._setupObservers("-visible", "visible"); + } + }; + + Opentip.prototype._activateFirstInput = function() { + var input; + input = this.adapter.unwrap(this.adapter.find(this.container, "input, textarea")); + return input != null ? typeof input.focus === "function" ? input.focus() : void 0 : void 0; + }; + + Opentip.prototype._followMousePosition = function() { + if (!this.options.fixed) { + return Opentip._observeMousePosition(this.bound.reposition); + } + }; + + Opentip.prototype._stopFollowingMousePosition = function() { + if (!this.options.fixed) { + return Opentip._stopObservingMousePosition(this.bound.reposition); + } + }; + + Opentip.prototype._clearShowTimeout = function() { + return clearTimeout(this._showTimeoutId); + }; + + Opentip.prototype._clearHideTimeout = function() { + return clearTimeout(this._hideTimeoutId); + }; + + Opentip.prototype._clearTimeouts = function() { + clearTimeout(this._visibilityStateTimeoutId); + this._clearShowTimeout(); + return this._clearHideTimeout(); + }; + + Opentip.prototype._triggerElementExists = function() { + var el; + el = this.adapter.unwrap(this.triggerElement); + while (el.parentNode) { + if (el.parentNode.tagName === "BODY") { + return true; + } + el = el.parentNode; + } + return false; + }; + + Opentip.prototype._loadAjax = function() { + var _this = this; + if (this.loading) { + return; + } + this.loaded = false; + this.loading = true; + this.adapter.addClass(this.container, this["class"].loading); + this.setContent(""); + this.debug("Loading content from " + this.options.ajax); + return this.adapter.ajax({ + url: this.options.ajax, + method: this.options.ajaxMethod, + onSuccess: function(responseText) { + _this.debug("Loading successful."); + _this.adapter.removeClass(_this.container, _this["class"].loading); + return _this.setContent(responseText); + }, + onError: function(error) { + var message; + message = _this.options.ajaxErrorMessage; + _this.debug(message, error); + _this.setContent(message); + return _this.adapter.addClass(_this.container, _this["class"].ajaxError); + }, + onComplete: function() { + _this.adapter.removeClass(_this.container, _this["class"].loading); + _this.loading = false; + _this.loaded = true; + _this._searchAndActivateCloseButtons(); + _this._activateFirstInput(); + return _this.reposition(); + } + }); + }; + + Opentip.prototype._ensureTriggerElement = function() { + if (!this._triggerElementExists()) { + this.deactivate(); + return this._stopEnsureTriggerElement(); + } + }; + + Opentip.prototype._ensureTriggerElementInterval = 1000; + + Opentip.prototype._startEnsureTriggerElement = function() { + var _this = this; + return this._ensureTriggerElementTimeoutId = setInterval((function() { + return _this._ensureTriggerElement(); + }), this._ensureTriggerElementInterval); + }; + + Opentip.prototype._stopEnsureTriggerElement = function() { + return clearInterval(this._ensureTriggerElementTimeoutId); + }; + + return Opentip; + +})(); + +vendors = ["khtml", "ms", "o", "moz", "webkit"]; + +Opentip.prototype.setCss3Style = function(element, styles) { + var prop, value, vendor, vendorProp, _results; + element = this.adapter.unwrap(element); + _results = []; + for (prop in styles) { + if (!__hasProp.call(styles, prop)) continue; + value = styles[prop]; + if (element.style[prop] != null) { + _results.push(element.style[prop] = value); + } else { + _results.push((function() { + var _i, _len, _results1; + _results1 = []; + for (_i = 0, _len = vendors.length; _i < _len; _i++) { + vendor = vendors[_i]; + vendorProp = "" + (this.ucfirst(vendor)) + (this.ucfirst(prop)); + if (element.style[vendorProp] != null) { + _results1.push(element.style[vendorProp] = value); + } else { + _results1.push(void 0); + } + } + return _results1; + }).call(this)); + } + } + return _results; +}; + +Opentip.prototype.defer = function(func) { + return setTimeout(func, 0); +}; + +Opentip.prototype.setTimeout = function(func, seconds) { + return setTimeout(func, seconds ? seconds * 1000 : 0); +}; + +Opentip.prototype.ucfirst = function(string) { + if (string == null) { + return ""; + } + return string.charAt(0).toUpperCase() + string.slice(1); +}; + +Opentip.prototype.dasherize = function(string) { + return string.replace(/([A-Z])/g, function(_, character) { + return "-" + (character.toLowerCase()); + }); +}; + +mousePositionObservers = []; + +mousePosition = { + x: 0, + y: 0 +}; + +mouseMoved = function(e) { + var observer, _i, _len, _results; + mousePosition = Opentip.adapter.mousePosition(e); + _results = []; + for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { + observer = mousePositionObservers[_i]; + _results.push(observer()); + } + return _results; +}; + +Opentip.followMousePosition = function() { + return Opentip.adapter.observe(document.body, "mousemove", mouseMoved); +}; + +Opentip._observeMousePosition = function(observer) { + return mousePositionObservers.push(observer); +}; + +Opentip._stopObservingMousePosition = function(removeObserver) { + var observer; + return mousePositionObservers = (function() { + var _i, _len, _results; + _results = []; + for (_i = 0, _len = mousePositionObservers.length; _i < _len; _i++) { + observer = mousePositionObservers[_i]; + if (observer !== removeObserver) { + _results.push(observer); + } + } + return _results; + })(); +}; + +Opentip.Joint = (function() { + + function Joint(pointerString) { + if (pointerString == null) { + return; + } + if (pointerString instanceof Opentip.Joint) { + pointerString = pointerString.toString(); + } + this.set(pointerString); + this; + + } + + Joint.prototype.set = function(string) { + string = string.toLowerCase(); + this.setHorizontal(string); + this.setVertical(string); + return this; + }; + + Joint.prototype.setHorizontal = function(string) { + var i, valid, _i, _j, _len, _len1, _results; + valid = ["left", "center", "right"]; + for (_i = 0, _len = valid.length; _i < _len; _i++) { + i = valid[_i]; + if (~string.indexOf(i)) { + this.horizontal = i.toLowerCase(); + } + } + if (this.horizontal == null) { + this.horizontal = "center"; + } + _results = []; + for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { + i = valid[_j]; + _results.push(this[i] = this.horizontal === i ? i : void 0); + } + return _results; + }; + + Joint.prototype.setVertical = function(string) { + var i, valid, _i, _j, _len, _len1, _results; + valid = ["top", "middle", "bottom"]; + for (_i = 0, _len = valid.length; _i < _len; _i++) { + i = valid[_i]; + if (~string.indexOf(i)) { + this.vertical = i.toLowerCase(); + } + } + if (this.vertical == null) { + this.vertical = "middle"; + } + _results = []; + for (_j = 0, _len1 = valid.length; _j < _len1; _j++) { + i = valid[_j]; + _results.push(this[i] = this.vertical === i ? i : void 0); + } + return _results; + }; + + Joint.prototype.eql = function(pointer) { + return (pointer != null) && this.horizontal === pointer.horizontal && this.vertical === pointer.vertical; + }; + + Joint.prototype.flip = function() { + var flippedIndex, positionIdx; + positionIdx = Opentip.position[this.toString(true)]; + flippedIndex = (positionIdx + 4) % 8; + this.set(Opentip.positions[flippedIndex]); + return this; + }; + + Joint.prototype.toString = function(camelized) { + var horizontal, vertical; + if (camelized == null) { + camelized = false; + } + vertical = this.vertical === "middle" ? "" : this.vertical; + horizontal = this.horizontal === "center" ? "" : this.horizontal; + if (vertical && horizontal) { + if (camelized) { + horizontal = Opentip.prototype.ucfirst(horizontal); + } else { + horizontal = " " + horizontal; + } + } + return "" + vertical + horizontal; + }; + + return Joint; + +})(); + +Opentip.prototype._positionsEqual = function(posA, posB) { + return (posA != null) && (posB != null) && posA.left === posB.left && posA.top === posB.top; +}; + +Opentip.prototype._dimensionsEqual = function(dimA, dimB) { + return (dimA != null) && (dimB != null) && dimA.width === dimB.width && dimA.height === dimB.height; +}; + +Opentip.prototype.debug = function() { + var args; + args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + if (Opentip.debug && ((typeof console !== "undefined" && console !== null ? console.debug : void 0) != null)) { + args.unshift("#" + this.id + " |"); + return console.debug.apply(console, args); + } +}; + +Opentip.findElements = function() { + var adapter, content, element, optionName, optionValue, options, _i, _len, _ref, _results; + adapter = Opentip.adapter; + _ref = adapter.findAll(document.body, "[data-ot]"); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + element = _ref[_i]; + options = {}; + content = adapter.data(element, "ot"); + if (content === "" || content === "true" || content === "yes") { + content = adapter.attr(element, "title"); + adapter.attr(element, "title", ""); + } + content = content || ""; + for (optionName in Opentip.styles.standard) { + optionValue = adapter.data(element, "ot" + (Opentip.prototype.ucfirst(optionName))); + if (optionValue != null) { + if (optionValue === "yes" || optionValue === "true" || optionValue === "on") { + optionValue = true; + } else if (optionValue === "no" || optionValue === "false" || optionValue === "off") { + optionValue = false; + } + options[optionName] = optionValue; + } + } + _results.push(new Opentip(element, content, options)); + } + return _results; +}; + +Opentip.version = "2.4.6"; + +Opentip.debug = false; + +Opentip.lastId = 0; + +Opentip.lastZIndex = 100; + +Opentip.tips = []; + +Opentip._abortShowingGroup = function(group, originatingOpentip) { + var opentip, _i, _len, _ref, _results; + _ref = Opentip.tips; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + opentip = _ref[_i]; + if (opentip !== originatingOpentip && opentip.options.group === group) { + _results.push(opentip._abortShowing()); + } else { + _results.push(void 0); + } + } + return _results; +}; + +Opentip._hideGroup = function(group, originatingOpentip) { + var opentip, _i, _len, _ref, _results; + _ref = Opentip.tips; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + opentip = _ref[_i]; + if (opentip !== originatingOpentip && opentip.options.group === group) { + _results.push(opentip.hide()); + } else { + _results.push(void 0); + } + } + return _results; +}; + +Opentip.adapters = {}; + +Opentip.adapter = null; + +firstAdapter = true; + +Opentip.addAdapter = function(adapter) { + Opentip.adapters[adapter.name] = adapter; + if (firstAdapter) { + Opentip.adapter = adapter; + adapter.domReady(Opentip.findElements); + adapter.domReady(Opentip.followMousePosition); + return firstAdapter = false; + } +}; + +Opentip.positions = ["top", "topRight", "right", "bottomRight", "bottom", "bottomLeft", "left", "topLeft"]; + +Opentip.position = {}; + +_ref = Opentip.positions; +for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + position = _ref[i]; + Opentip.position[position] = i; +} + +Opentip.styles = { + standard: { + "extends": null, + title: void 0, + escapeTitle: true, + escapeContent: false, + className: "standard", + stem: true, + delay: null, + hideDelay: 0.1, + fixed: false, + showOn: "mouseover", + hideTrigger: "trigger", + hideTriggers: [], + hideOn: null, + removeElementsOnHide: false, + offset: [0, 0], + containInViewport: true, + autoOffset: true, + showEffect: "appear", + hideEffect: "fade", + showEffectDuration: 0.3, + hideEffectDuration: 0.2, + stemLength: 5, + stemBase: 8, + tipJoint: "top left", + target: null, + targetJoint: null, + cache: true, + ajax: false, + ajaxMethod: "GET", + ajaxErrorMessage: "There was a problem downloading the content.", + group: null, + style: null, + background: "#fff18f", + backgroundGradientHorizontal: false, + closeButtonOffset: [5, 5], + closeButtonRadius: 7, + closeButtonCrossSize: 4, + closeButtonCrossColor: "#d2c35b", + closeButtonCrossLineWidth: 1.5, + closeButtonLinkOverscan: 6, + borderRadius: 5, + borderWidth: 1, + borderColor: "#f2e37b", + shadow: true, + shadowBlur: 10, + shadowOffset: [3, 3], + shadowColor: "rgba(0, 0, 0, 0.1)" + }, + glass: { + "extends": "standard", + className: "glass", + background: [[0, "rgba(252, 252, 252, 0.8)"], [0.5, "rgba(255, 255, 255, 0.8)"], [0.5, "rgba(250, 250, 250, 0.9)"], [1, "rgba(245, 245, 245, 0.9)"]], + borderColor: "#eee", + closeButtonCrossColor: "rgba(0, 0, 0, 0.2)", + borderRadius: 15, + closeButtonRadius: 10, + closeButtonOffset: [8, 8] + }, + dark: { + "extends": "standard", + className: "dark", + borderRadius: 13, + borderColor: "#444", + closeButtonCrossColor: "rgba(240, 240, 240, 1)", + shadowColor: "rgba(0, 0, 0, 0.3)", + shadowOffset: [2, 2], + background: [[0, "rgba(30, 30, 30, 0.7)"], [0.5, "rgba(30, 30, 30, 0.8)"], [0.5, "rgba(10, 10, 10, 0.8)"], [1, "rgba(10, 10, 10, 0.9)"]] + }, + alert: { + "extends": "standard", + className: "alert", + borderRadius: 1, + borderColor: "#AE0D11", + closeButtonCrossColor: "rgba(255, 255, 255, 1)", + shadowColor: "rgba(0, 0, 0, 0.3)", + shadowOffset: [2, 2], + background: [[0, "rgba(203, 15, 19, 0.7)"], [0.5, "rgba(203, 15, 19, 0.8)"], [0.5, "rgba(189, 14, 18, 0.8)"], [1, "rgba(179, 14, 17, 0.9)"]] + } +}; + +Opentip.defaultStyle = "standard"; + +if (typeof module !== "undefined" && module !== null) { + module.exports = Opentip; +} else { + window.Opentip = Opentip; +} + + +// Generated by CoffeeScript 1.4.0 +var __slice = [].slice; + +(function($) { + var Adapter; + $.fn.opentip = function(content, title, options) { + return new Opentip(this, content, title, options); + }; + Adapter = (function() { + + function Adapter() {} + + Adapter.prototype.name = "jquery"; + + Adapter.prototype.domReady = function(callback) { + return $(callback); + }; + + Adapter.prototype.create = function(html) { + return $(html); + }; + + Adapter.prototype.wrap = function(element) { + element = $(element); + if (element.length > 1) { + throw new Error("Multiple elements provided."); + } + return element; + }; + + Adapter.prototype.unwrap = function(element) { + return $(element)[0]; + }; + + Adapter.prototype.tagName = function(element) { + return this.unwrap(element).tagName; + }; + + Adapter.prototype.attr = function() { + var args, element, _ref; + element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + return (_ref = $(element)).attr.apply(_ref, args); + }; + + Adapter.prototype.data = function() { + var args, element, _ref; + element = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + return (_ref = $(element)).data.apply(_ref, args); + }; + + Adapter.prototype.find = function(element, selector) { + return $(element).find(selector).get(0); + }; + + Adapter.prototype.findAll = function(element, selector) { + return $(element).find(selector); + }; + + Adapter.prototype.update = function(element, content, escape) { + element = $(element); + if (escape) { + return element.text(content); + } else { + return element.html(content); + } + }; + + Adapter.prototype.append = function(element, child) { + return $(element).append(child); + }; + + Adapter.prototype.remove = function(element) { + return $(element).remove(); + }; + + Adapter.prototype.addClass = function(element, className) { + return $(element).addClass(className); + }; + + Adapter.prototype.removeClass = function(element, className) { + return $(element).removeClass(className); + }; + + Adapter.prototype.css = function(element, properties) { + return $(element).css(properties); + }; + + Adapter.prototype.dimensions = function(element) { + return { + width: $(element).outerWidth(), + height: $(element).outerHeight() + }; + }; + + Adapter.prototype.scrollOffset = function() { + return [window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop]; + }; + + Adapter.prototype.viewportDimensions = function() { + return { + width: document.documentElement.clientWidth, + height: document.documentElement.clientHeight + }; + }; + + Adapter.prototype.mousePosition = function(e) { + if (e == null) { + return null; + } + return { + x: e.pageX, + y: e.pageY + }; + }; + + Adapter.prototype.offset = function(element) { + var offset; + offset = $(element).offset(); + return { + left: offset.left, + top: offset.top + }; + }; + + Adapter.prototype.observe = function(element, eventName, observer) { + return $(element).bind(eventName, observer); + }; + + Adapter.prototype.stopObserving = function(element, eventName, observer) { + return $(element).unbind(eventName, observer); + }; + + Adapter.prototype.ajax = function(options) { + var _ref, _ref1; + if (options.url == null) { + throw new Error("No url provided"); + } + return $.ajax({ + url: options.url, + type: (_ref = (_ref1 = options.method) != null ? _ref1.toUpperCase() : void 0) != null ? _ref : "GET" + }).done(function(content) { + return typeof options.onSuccess === "function" ? options.onSuccess(content) : void 0; + }).fail(function(request) { + return typeof options.onError === "function" ? options.onError("Server responded with status " + request.status) : void 0; + }).always(function() { + return typeof options.onComplete === "function" ? options.onComplete() : void 0; + }); + }; + + Adapter.prototype.clone = function(object) { + return $.extend({}, object); + }; + + Adapter.prototype.extend = function() { + var sources, target; + target = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + return $.extend.apply($, [target].concat(__slice.call(sources))); + }; + + return Adapter; + + })(); + return Opentip.addAdapter(new Adapter); +})(jQuery); + + +// Modified by Matias Meno to work in IE8. +// I removed the line 312, as proposed by someone on the google forum. + +// Copyright 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// Known Issues: +// +// * Patterns are not implemented. +// * Radial gradient are not implemented. The VML version of these look very +// different from the canvas one. +// * Clipping paths are not implemented. +// * Coordsize. The width and height attribute have higher priority than the +// width and height style values which isn't correct. +// * Painting mode isn't implemented. +// * Canvas width/height should is using content-box by default. IE in +// Quirks mode will draw the canvas using border-box. Either change your +// doctype to HTML5 +// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) +// or use Box Sizing Behavior from WebFX +// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) +// * Non uniform scaling does not correctly scale strokes. +// * Optimize. There is always room for speed improvements. + +// Only add this code if we do not already have a canvas implementation +if (!document.createElement('canvas').getContext) { + +(function() { + + // alias some functions to make (compiled) code shorter + var m = Math; + var mr = m.round; + var ms = m.sin; + var mc = m.cos; + var abs = m.abs; + var sqrt = m.sqrt; + + // this is used for sub pixel precision + var Z = 10; + var Z2 = Z / 2; + + /** + * This funtion is assigned to the elements as element.getContext(). + * @this {HTMLElement} + * @return {CanvasRenderingContext2D_} + */ + function getContext() { + return this.context_ || + (this.context_ = new CanvasRenderingContext2D_(this)); + } + + var slice = Array.prototype.slice; + + /** + * Binds a function to an object. The returned function will always use the + * passed in {@code obj} as {@code this}. + * + * Example: + * + * g = bind(f, obj, a, b) + * g(c, d) // will do f.call(obj, a, b, c, d) + * + * @param {Function} f The function to bind the object to + * @param {Object} obj The object that should act as this when the function + * is called + * @param {*} var_args Rest arguments that will be used as the initial + * arguments when the function is called + * @return {Function} A new function that has bound this + */ + function bind(f, obj, var_args) { + var a = slice.call(arguments, 2); + return function() { + return f.apply(obj, a.concat(slice.call(arguments))); + }; + } + + var G_vmlCanvasManager_ = { + init: function(opt_doc) { + if (/MSIE/.test(navigator.userAgent) && !window.opera) { + var doc = opt_doc || document; + // Create a dummy element so that IE will allow canvas elements to be + // recognized. + doc.createElement('canvas'); + doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); + } + }, + + init_: function(doc) { + // create xmlns + if (!doc.namespaces['g_vml_']) { + doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', + '#default#VML'); + + } + if (!doc.namespaces['g_o_']) { + doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', + '#default#VML'); + } + + // Setup default CSS. Only add one style sheet per document + if (!doc.styleSheets['ex_canvas_']) { + var ss = doc.createStyleSheet(); + ss.owningElement.id = 'ex_canvas_'; + ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + + // default size is 300x150 in Gecko and Opera + 'text-align:left;width:300px;height:150px}' + + 'g_vml_\\:*{behavior:url(#default#VML)}' + + 'g_o_\\:*{behavior:url(#default#VML)}'; + + } + + // find all canvas elements + var els = doc.getElementsByTagName('canvas'); + for (var i = 0; i < els.length; i++) { + this.initElement(els[i]); + } + }, + + /** + * Public initializes a canvas element so that it can be used as canvas + * element from now on. This is called automatically before the page is + * loaded but if you are creating elements using createElement you need to + * make sure this is called on the element. + * @param {HTMLElement} el The canvas element to initialize. + * @return {HTMLElement} the element that was created. + */ + initElement: function(el) { + if (!el.getContext) { + + el.getContext = getContext; + + // Remove fallback content. There is no way to hide text nodes so we + // just remove all childNodes. We could hide all elements and remove + // text nodes but who really cares about the fallback content. + el.innerHTML = ''; + + // do not use inline function because that will leak memory + el.attachEvent('onpropertychange', onPropertyChange); + el.attachEvent('onresize', onResize); + + var attrs = el.attributes; + if (attrs.width && attrs.width.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setWidth_(attrs.width.nodeValue); + el.style.width = attrs.width.nodeValue + 'px'; + } else { + el.width = el.clientWidth; + } + if (attrs.height && attrs.height.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setHeight_(attrs.height.nodeValue); + el.style.height = attrs.height.nodeValue + 'px'; + } else { + el.height = el.clientHeight; + } + //el.getContext().setCoordsize_() + } + return el; + } + }; + + function onPropertyChange(e) { + var el = e.srcElement; + + switch (e.propertyName) { + case 'width': + el.style.width = el.attributes.width.nodeValue + 'px'; + el.getContext().clearRect(); + break; + case 'height': + el.style.height = el.attributes.height.nodeValue + 'px'; + el.getContext().clearRect(); + break; + } + } + + function onResize(e) { + var el = e.srcElement; + if (el.firstChild) { + el.firstChild.style.width = el.clientWidth + 'px'; + el.firstChild.style.height = el.clientHeight + 'px'; + } + } + + G_vmlCanvasManager_.init(); + + // precompute "00" to "FF" + var dec2hex = []; + for (var i = 0; i < 16; i++) { + for (var j = 0; j < 16; j++) { + dec2hex[i * 16 + j] = i.toString(16) + j.toString(16); + } + } + + function createMatrixIdentity() { + return [ + [1, 0, 0], + [0, 1, 0], + [0, 0, 1] + ]; + } + + function matrixMultiply(m1, m2) { + var result = createMatrixIdentity(); + + for (var x = 0; x < 3; x++) { + for (var y = 0; y < 3; y++) { + var sum = 0; + + for (var z = 0; z < 3; z++) { + sum += m1[x][z] * m2[z][y]; + } + + result[x][y] = sum; + } + } + return result; + } + + function copyState(o1, o2) { + o2.fillStyle = o1.fillStyle; + o2.lineCap = o1.lineCap; + o2.lineJoin = o1.lineJoin; + o2.lineWidth = o1.lineWidth; + o2.miterLimit = o1.miterLimit; + o2.shadowBlur = o1.shadowBlur; + o2.shadowColor = o1.shadowColor; + o2.shadowOffsetX = o1.shadowOffsetX; + o2.shadowOffsetY = o1.shadowOffsetY; + o2.strokeStyle = o1.strokeStyle; + o2.globalAlpha = o1.globalAlpha; + o2.arcScaleX_ = o1.arcScaleX_; + o2.arcScaleY_ = o1.arcScaleY_; + o2.lineScale_ = o1.lineScale_; + } + + function processStyle(styleString) { + var str, alpha = 1; + + styleString = String(styleString); + if (styleString.substring(0, 3) == 'rgb') { + var start = styleString.indexOf('(', 3); + var end = styleString.indexOf(')', start + 1); + var guts = styleString.substring(start + 1, end).split(','); + + str = '#'; + for (var i = 0; i < 3; i++) { + str += dec2hex[Number(guts[i])]; + } + + if (guts.length == 4 && styleString.substr(3, 1) == 'a') { + alpha = guts[3]; + } + } else { + str = styleString; + } + + return {color: str, alpha: alpha}; + } + + function processLineCap(lineCap) { + switch (lineCap) { + case 'butt': + return 'flat'; + case 'round': + return 'round'; + case 'square': + default: + return 'square'; + } + } + + /** + * This class implements CanvasRenderingContext2D interface as described by + * the WHATWG. + * @param {HTMLElement} surfaceElement The element that the 2D context should + * be associated with + */ + function CanvasRenderingContext2D_(surfaceElement) { + this.m_ = createMatrixIdentity(); + + this.mStack_ = []; + this.aStack_ = []; + this.currentPath_ = []; + + // Canvas context properties + this.strokeStyle = '#000'; + this.fillStyle = '#000'; + + this.lineWidth = 1; + this.lineJoin = 'miter'; + this.lineCap = 'butt'; + this.miterLimit = Z * 1; + this.globalAlpha = 1; + this.canvas = surfaceElement; + + var el = surfaceElement.ownerDocument.createElement('div'); + el.style.width = surfaceElement.clientWidth + 'px'; + el.style.height = surfaceElement.clientHeight + 'px'; + // el.style.overflow = 'hidden'; + el.style.position = 'absolute'; + surfaceElement.appendChild(el); + + this.element_ = el; + this.arcScaleX_ = 1; + this.arcScaleY_ = 1; + this.lineScale_ = 1; + } + + var contextPrototype = CanvasRenderingContext2D_.prototype; + contextPrototype.clearRect = function() { + this.element_.innerHTML = ''; + }; + + contextPrototype.beginPath = function() { + // TODO: Branch current matrix so that save/restore has no effect + // as per safari docs. + this.currentPath_ = []; + }; + + contextPrototype.moveTo = function(aX, aY) { + var p = this.getCoords_(aX, aY); + this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); + this.currentX_ = p.x; + this.currentY_ = p.y; + }; + + contextPrototype.lineTo = function(aX, aY) { + var p = this.getCoords_(aX, aY); + this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); + + this.currentX_ = p.x; + this.currentY_ = p.y; + }; + + contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, + aCP2x, aCP2y, + aX, aY) { + var p = this.getCoords_(aX, aY); + var cp1 = this.getCoords_(aCP1x, aCP1y); + var cp2 = this.getCoords_(aCP2x, aCP2y); + bezierCurveTo(this, cp1, cp2, p); + }; + + // Helper function that takes the already fixed cordinates. + function bezierCurveTo(self, cp1, cp2, p) { + self.currentPath_.push({ + type: 'bezierCurveTo', + cp1x: cp1.x, + cp1y: cp1.y, + cp2x: cp2.x, + cp2y: cp2.y, + x: p.x, + y: p.y + }); + self.currentX_ = p.x; + self.currentY_ = p.y; + } + + contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { + // the following is lifted almost directly from + // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes + + var cp = this.getCoords_(aCPx, aCPy); + var p = this.getCoords_(aX, aY); + + var cp1 = { + x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), + y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) + }; + var cp2 = { + x: cp1.x + (p.x - this.currentX_) / 3.0, + y: cp1.y + (p.y - this.currentY_) / 3.0 + }; + + bezierCurveTo(this, cp1, cp2, p); + }; + + contextPrototype.arc = function(aX, aY, aRadius, + aStartAngle, aEndAngle, aClockwise) { + aRadius *= Z; + var arcType = aClockwise ? 'at' : 'wa'; + + var xStart = aX + mc(aStartAngle) * aRadius - Z2; + var yStart = aY + ms(aStartAngle) * aRadius - Z2; + + var xEnd = aX + mc(aEndAngle) * aRadius - Z2; + var yEnd = aY + ms(aEndAngle) * aRadius - Z2; + + // IE won't render arches drawn counter clockwise if xStart == xEnd. + if (xStart == xEnd && !aClockwise) { + xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something + // that can be represented in binary + } + + var p = this.getCoords_(aX, aY); + var pStart = this.getCoords_(xStart, yStart); + var pEnd = this.getCoords_(xEnd, yEnd); + + this.currentPath_.push({type: arcType, + x: p.x, + y: p.y, + radius: aRadius, + xStart: pStart.x, + yStart: pStart.y, + xEnd: pEnd.x, + yEnd: pEnd.y}); + + }; + + contextPrototype.rect = function(aX, aY, aWidth, aHeight) { + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + }; + + contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { + var oldPath = this.currentPath_; + this.beginPath(); + + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.stroke(); + + this.currentPath_ = oldPath; + }; + + contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { + var oldPath = this.currentPath_; + this.beginPath(); + + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.fill(); + + this.currentPath_ = oldPath; + }; + + contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { + var gradient = new CanvasGradient_('gradient'); + gradient.x0_ = aX0; + gradient.y0_ = aY0; + gradient.x1_ = aX1; + gradient.y1_ = aY1; + return gradient; + }; + + contextPrototype.createRadialGradient = function(aX0, aY0, aR0, + aX1, aY1, aR1) { + var gradient = new CanvasGradient_('gradientradial'); + gradient.x0_ = aX0; + gradient.y0_ = aY0; + gradient.r0_ = aR0; + gradient.x1_ = aX1; + gradient.y1_ = aY1; + gradient.r1_ = aR1; + return gradient; + }; + + contextPrototype.drawImage = function(image, var_args) { + var dx, dy, dw, dh, sx, sy, sw, sh; + + // to find the original width we overide the width and height + var oldRuntimeWidth = image.runtimeStyle.width; + var oldRuntimeHeight = image.runtimeStyle.height; + image.runtimeStyle.width = 'auto'; + image.runtimeStyle.height = 'auto'; + + // get the original size + var w = image.width; + var h = image.height; + + // and remove overides + image.runtimeStyle.width = oldRuntimeWidth; + image.runtimeStyle.height = oldRuntimeHeight; + + if (arguments.length == 3) { + dx = arguments[1]; + dy = arguments[2]; + sx = sy = 0; + sw = dw = w; + sh = dh = h; + } else if (arguments.length == 5) { + dx = arguments[1]; + dy = arguments[2]; + dw = arguments[3]; + dh = arguments[4]; + sx = sy = 0; + sw = w; + sh = h; + } else if (arguments.length == 9) { + sx = arguments[1]; + sy = arguments[2]; + sw = arguments[3]; + sh = arguments[4]; + dx = arguments[5]; + dy = arguments[6]; + dw = arguments[7]; + dh = arguments[8]; + } else { + throw Error('Invalid number of arguments'); + } + + var d = this.getCoords_(dx, dy); + + var w2 = sw / 2; + var h2 = sh / 2; + + var vmlStr = []; + + var W = 10; + var H = 10; + + // For some reason that I've now forgotten, using divs didn't work + vmlStr.push(' ' , + '', + ''); + + this.element_.insertAdjacentHTML('BeforeEnd', + vmlStr.join('')); + }; + + contextPrototype.stroke = function(aFill) { + var lineStr = []; + var lineOpen = false; + var a = processStyle(aFill ? this.fillStyle : this.strokeStyle); + var color = a.color; + var opacity = a.alpha * this.globalAlpha; + + var W = 10; + var H = 10; + + lineStr.push(''); + + if (!aFill) { + var lineWidth = this.lineScale_ * this.lineWidth; + + // VML cannot correctly render a line if the width is less than 1px. + // In that case, we dilute the color to make the line look thinner. + if (lineWidth < 1) { + opacity *= lineWidth; + } + + lineStr.push( + '' + ); + } else if (typeof this.fillStyle == 'object') { + var fillStyle = this.fillStyle; + var angle = 0; + var focus = {x: 0, y: 0}; + + // additional offset + var shift = 0; + // scale factor for offset + var expansion = 1; + + if (fillStyle.type_ == 'gradient') { + var x0 = fillStyle.x0_ / this.arcScaleX_; + var y0 = fillStyle.y0_ / this.arcScaleY_; + var x1 = fillStyle.x1_ / this.arcScaleX_; + var y1 = fillStyle.y1_ / this.arcScaleY_; + var p0 = this.getCoords_(x0, y0); + var p1 = this.getCoords_(x1, y1); + var dx = p1.x - p0.x; + var dy = p1.y - p0.y; + angle = Math.atan2(dx, dy) * 180 / Math.PI; + + // The angle should be a non-negative number. + if (angle < 0) { + angle += 360; + } + + // Very small angles produce an unexpected result because they are + // converted to a scientific notation string. + if (angle < 1e-6) { + angle = 0; + } + } else { + var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_); + var width = max.x - min.x; + var height = max.y - min.y; + focus = { + x: (p0.x - min.x) / width, + y: (p0.y - min.y) / height + }; + + width /= this.arcScaleX_ * Z; + height /= this.arcScaleY_ * Z; + var dimension = m.max(width, height); + shift = 2 * fillStyle.r0_ / dimension; + expansion = 2 * fillStyle.r1_ / dimension - shift; + } + + // We need to sort the color stops in ascending order by offset, + // otherwise IE won't interpret it correctly. + var stops = fillStyle.colors_; + stops.sort(function(cs1, cs2) { + return cs1.offset - cs2.offset; + }); + + var length = stops.length; + var color1 = stops[0].color; + var color2 = stops[length - 1].color; + var opacity1 = stops[0].alpha * this.globalAlpha; + var opacity2 = stops[length - 1].alpha * this.globalAlpha; + + var colors = []; + for (var i = 0; i < length; i++) { + var stop = stops[i]; + colors.push(stop.offset * expansion + shift + ' ' + stop.color); + } + + // When colors attribute is used, the meanings of opacity and o:opacity2 + // are reversed. + lineStr.push(''); + } else { + lineStr.push(''); + } + + lineStr.push(''); + + this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); + }; + + contextPrototype.fill = function() { + this.stroke(true); + } + + contextPrototype.closePath = function() { + this.currentPath_.push({type: 'close'}); + }; + + /** + * @private + */ + contextPrototype.getCoords_ = function(aX, aY) { + var m = this.m_; + return { + x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, + y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 + } + }; + + contextPrototype.save = function() { + var o = {}; + copyState(this, o); + this.aStack_.push(o); + this.mStack_.push(this.m_); + this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); + }; + + contextPrototype.restore = function() { + copyState(this.aStack_.pop(), this); + this.m_ = this.mStack_.pop(); + }; + + function matrixIsFinite(m) { + for (var j = 0; j < 3; j++) { + for (var k = 0; k < 2; k++) { + if (!isFinite(m[j][k]) || isNaN(m[j][k])) { + return false; + } + } + } + return true; + } + + function setM(ctx, m, updateLineScale) { + if (!matrixIsFinite(m)) { + return; + } + ctx.m_ = m; + + if (updateLineScale) { + // Get the line scale. + // Determinant of this.m_ means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; + ctx.lineScale_ = sqrt(abs(det)); + } + } + + contextPrototype.translate = function(aX, aY) { + var m1 = [ + [1, 0, 0], + [0, 1, 0], + [aX, aY, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), false); + }; + + contextPrototype.rotate = function(aRot) { + var c = mc(aRot); + var s = ms(aRot); + + var m1 = [ + [c, s, 0], + [-s, c, 0], + [0, 0, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), false); + }; + + contextPrototype.scale = function(aX, aY) { + this.arcScaleX_ *= aX; + this.arcScaleY_ *= aY; + var m1 = [ + [aX, 0, 0], + [0, aY, 0], + [0, 0, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), true); + }; + + contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { + var m1 = [ + [m11, m12, 0], + [m21, m22, 0], + [dx, dy, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), true); + }; + + contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { + var m = [ + [m11, m12, 0], + [m21, m22, 0], + [dx, dy, 1] + ]; + + setM(this, m, true); + }; + + /******** STUBS ********/ + contextPrototype.clip = function() { + // TODO: Implement + }; + + contextPrototype.arcTo = function() { + // TODO: Implement + }; + + contextPrototype.createPattern = function() { + return new CanvasPattern_; + }; + + // Gradient / Pattern Stubs + function CanvasGradient_(aType) { + this.type_ = aType; + this.x0_ = 0; + this.y0_ = 0; + this.r0_ = 0; + this.x1_ = 0; + this.y1_ = 0; + this.r1_ = 0; + this.colors_ = []; + } + + CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { + aColor = processStyle(aColor); + this.colors_.push({offset: aOffset, + color: aColor.color, + alpha: aColor.alpha}); + }; + + function CanvasPattern_() {} + + // set up externs + G_vmlCanvasManager = G_vmlCanvasManager_; + CanvasRenderingContext2D = CanvasRenderingContext2D_; + CanvasGradient = CanvasGradient_; + CanvasPattern = CanvasPattern_; + +})(); + +} // if \ No newline at end of file diff --git a/js/views/account/accountLoginView.js b/js/views/account/accountLoginView.js index 3ceebb6e..23624775 100644 --- a/js/views/account/accountLoginView.js +++ b/js/views/account/accountLoginView.js @@ -9,73 +9,64 @@ define([ 'jquery', 'underscore', 'backbone', + 'common', + 'opentip', 'views/dialogView', 'models/account', 'text!templates/account/stackplaceLoginTemplate.html', 'text!templates/account/stackstudioLoginTemplate.html', - 'views/account/newLoginView', - 'common' -], function( $, _, Backbone, DialogView, Account, stackplaceLoginTemplate, stackstudioLoginTemplate, NewLoginView, Common ) { + 'views/account/newLoginView' +], function( $, _, Backbone, Common, OpenTip, DialogView, Account, stackplaceLoginTemplate, stackstudioLoginTemplate, NewLoginView ) { var AccountLoginView = DialogView.extend({ events: { - "dialogclose": "close" + "dialogclose": "close", + "click #account_login_button": "login", + "click #cancel_button": "close", + "click #show_register_form": "createNew" }, - initialize: function() { - + initialize : function ( options ) { + options = options || {}; + if(options.redirect) { + this.redirect = options.redirect; + } }, render: function() { var accountLoginView = this, title, template; + var $newElement; if (window.app === "stackplace") { title = "GitHub Login"; - template = _.template( stackplaceLoginTemplate ); + $newElement = $(stackplaceLoginTemplate); } else { title = "Login"; - template = _.template( stackstudioLoginTemplate ); + $newElement = (stackstudioLoginTemplate); } - - this.$el.html( template ); - this.$el.dialog({ - title: title, - autoOpen: true, - width:325, - minHeight: 150, - resizable: false, - modal: true, - buttons: [ - { - text: "Login", - click: function() { - accountLoginView.login(); - } - }, - { - text: "Register", - click: function() { - accountLoginView.createNew(); - } - }, - { - text: "Cancel", - click: function() { - accountLoginView.cancel(); - } - } - ] + this.setElement($newElement); + + var $activeLoginModal = $(this.$el.selector); + if($activeLoginModal.length > 0) { + this.setElement($activeLoginModal); + } else { + $('body').append(this.$el); + } + + this.$el.modal({ + show : true, + backdrop : true, + keyboard : true }); + this.$el.keypress(function(e) { - if(e.keyCode === $.ui.keyCode.ENTER) { - accountLoginView.login(); - } + if(e.keyCode === $.ui.keyCode.ENTER) { + accountLoginView.login(); + } }); - this.$(".accordion").accordion(); - this.$el.dialog('open'); }, login: function() { @@ -97,49 +88,55 @@ define([ 'password' : password }, success: function(data) { - accountLoginView.successfulLogin(data); + accountLoginView.successfulLogin(data); }, error: function(jqXHR) { - Common.errorDialog(jqXHR.statusText, jqXHR.responseText); + Common.errorDialog(jqXHR.statusText, jqXHR.responseText); } }); } }, successfulLogin: function(data) { - if(typeof(Storage) !== "undefined") { - sessionStorage.account_id = data.account.id; - sessionStorage.login = data.account.login; - sessionStorage.first_name = data.account.first_name; - sessionStorage.last_name = data.account.last_name; - sessionStorage.company = data.account.company; - sessionStorage.email = data.account.email; - sessionStorage.org_id = data.account.org_id; - sessionStorage.cloud_credentials = JSON.stringify(data.account.cloud_credentials); - sessionStorage.permissions = JSON.stringify(data.account.permissions); - sessionStorage.project_memeberships = JSON.stringify(data.account.project_memberships); - sessionStorage.group_policies = JSON.stringify(data.account.group_policies); - - sessionStorage.rss_url = data.account.rss_url; - - console.log("session login:" + sessionStorage.login); - Common.vent.trigger("loginSuccess"); - if(data.account.cloud_credentials && data.account.cloud_credentials.length > 0) { - Common.router.navigate("#resources", {trigger: true}); - }else { - Common.router.navigate("#account/management/home", {trigger: true}); - } + if(typeof(Storage) !== "undefined") { + sessionStorage.account_id = data.account.id; + sessionStorage.login = data.account.login; + sessionStorage.first_name = data.account.first_name; + sessionStorage.last_name = data.account.last_name; + sessionStorage.company = data.account.company; + sessionStorage.email = data.account.email; + sessionStorage.org_id = data.account.org_id; + sessionStorage.cloud_credentials = JSON.stringify(data.account.cloud_credentials); + sessionStorage.permissions = JSON.stringify(data.account.permissions); + sessionStorage.project_memeberships = JSON.stringify(data.account.project_memberships); + sessionStorage.group_policies = JSON.stringify(data.account.group_policies); + sessionStorage.num_logins = data.account.num_logins; + sessionStorage.rss_url = data.account.rss_url; + } - }else { - Common.errorDialog("Browser Issue", "Your browser does not support web storage."); - } - this.$el.dialog('close'); + Common.cache('account', data.account); + + this.close(); + + console.log("session login:" + Common.account.login); + Common.vent.trigger("loginSuccess"); + if(this.redirect) { + Common.router.navigate(this.redirect, {trigger: true}); + } else { + Common.router.navigate("#account/management/home", {trigger: true}); + } }, createNew: function() { - new NewLoginView(); - } + this.close(); + var registerView = new NewLoginView(); + registerView.LoginView = this; + registerView.render(); + }, + close : function () { + this.$el.modal('hide'); + } }); return AccountLoginView; diff --git a/js/views/account/accountManagementView.js b/js/views/account/accountManagementView.js index 4102e6a3..f007abab 100644 --- a/js/views/account/accountManagementView.js +++ b/js/views/account/accountManagementView.js @@ -6,387 +6,43 @@ /*jshint smarttabs:true */ /*global define:true console:true requirejs:true require:true*/ define([ - 'jquery', - 'underscore', - 'backbone', - 'common', - 'text!templates/account/managementTemplate.html', - 'collections/groups', - 'collections/cloudCredentials', - 'collections/cloudAccounts', - 'collections/policies', - 'views/account/newLoginView', - 'views/account/cloudAccountManagementView', - 'views/account/cloudCredentialManagementView', - 'views/account/cloudCredentialManagementListView', - 'views/account/cloudAccountManagementListView', - 'views/account/usersManagementView', - 'views/account/policiesManagementView', - 'views/account/policyManagementView', - 'views/account/homeView', - 'views/account/groupsManagementView', - 'views/account/groupsManagementListView', - 'views/account/devOpsToolsManagementView', - 'views/account/continuousIntegrationManagementView', - 'views/account/sourceControlRepositoryManagementListView', - 'jquery-plugins', - 'jquery-ui-plugins', - 'jquery.jstree' -], function( $, _, Backbone, Common, managementTemplate, Groups, CloudCredentials, CloudAccounts, Policies, NewLoginView, CloudAccountManagementView, CloudCredentialManagementView, CloudCredentialManagementListView, CloudAccountManagementListView, UsersManagementView, PoliciesManagementView, PolicyManagementView, HomeView, GroupsManagementView, GroupsManagementListView, DevOpsToolsManagementView, ContinuousIntegrationManagementView, SourceControlRepositoryManagementListView ) { + 'jquery', + 'underscore', + 'backbone', + 'common', + 'js/views/account/homeView' + ], + function ( $, _, Backbone, Common, HomeView ) { + var AccountManagementView = Backbone.View.extend({ - /** @type {String} DOM element to attach view to */ - el: "#main", - /** @type {Template} HTML template to generate view from */ - template: _.template(managementTemplate), - /** @type {Object} Object of events for view to listen on */ - events: { - "click .account_list": "selectManagement", - "click .group_item": "selectGroup", - "click .cloud_account_item": "selectCloudAccount", - "click .credential_item": "selectCloudCred", - "click .policy_item": "selectPolicy", - "click #treeAddUser": "addUser" - }, - subApp: undefined, - tree: undefined, - groups: undefined, - cloudCredentials: undefined, - cloudAccounts: undefined, - policies: undefined, - treeGroup: undefined, - treeCloudAccount: undefined, - treeCloudCred: undefined, - treePolicy: undefined, - /** Constructor method for current view */ - initialize: function() { - - this.subViews = []; - //Render my template - this.$el.html(this.template); - - this.groups = new Groups(); - this.groups.on('reset', this.addAllGroups, this); - - this.cloudCredentials = new CloudCredentials(); - this.cloudCredentials.on( 'reset', this.addAllCreds, this ); - - this.cloudAccounts = new CloudAccounts(); - this.cloudAccounts.on( 'reset', this.addAllCloudAccounts, this ); - - this.policies = new Policies(); - this.policies.on( 'reset', this.addAllPolicies, this ); - - //Render my own view - this.render(); - }, - /** Add all of my own html elements */ - render: function () { - var accMan = this; - $("#mCloudAccount_tree").jstree({ - "themeroller":{"item": "jstree_custom_item"}, - "plugins":[ "themeroller", "html_data", "crrm" ] - }).on('loaded.jstree', function() { - //async - accMan.cloudAccounts.fetch({ - data: $.param({ org_id: sessionStorage.org_id, account_id: sessionStorage.account_id}), - reset: true - }); - }); - $("#mCloudCredential_tree").jstree({ - "themeroller":{"item": "jstree_custom_item"}, - "plugins":[ "themeroller", "html_data", "crrm" ] - }).on('loaded.jstree', function() { - //async - accMan.cloudCredentials.fetch({reset: true}); - }); - $("#mGroup_tree").jstree({ - "themeroller":{"item": "jstree_custom_item"}, - "plugins":[ "themeroller", "html_data", "crrm" ] - }).on('loaded.jstree', function() { - //Fetch Collections - accMan.groups.fetch({ - reset: true - }); - }); - $("#mUser_tree").jstree({ - "themeroller":{"item": "jstree_custom_item"}, - "plugins":[ "themeroller", "html_data", "crrm" ] - }).on('loaded.jstree', function() { - $("#mUser_tree").jstree('open_all'); - }); - $("#mPolicy_tree").jstree({ - "themeroller":{"item": "jstree_custom_item"}, - "plugins":[ "themeroller", "html_data", "crrm" ] - }).on('loaded.jstree', function() { - //async - accMan.policies.fetch({ - data: $.param({ org_id: sessionStorage.org_id}), - reset: true - }); - }); - $("#mSCRepos_tree").jstree({ - "themeroller":{"item": "jstree_custom_item"}, - "plugins":[ "themeroller", "html_data", "crrm" ] - }).on('loaded.jstree', function() { - $("#mSCRepos_tree").jstree('open_all'); - }); - $("#mContinuousIntegration_tree").jstree({ - "themeroller":{"item": "jstree_custom_item"}, - "plugins":[ "themeroller", "html_data", "crrm" ] - }).on('loaded.jstree', function() { - $("#mContinuousIntegration_tree").jstree('open_all'); - }); - $("#mdevOps_tree").jstree({ - "themeroller":{"item": "jstree_custom_item"}, - "plugins":[ "themeroller", "html_data", "crrm" ] - }).on('loaded.jstree', function() { - $("#mdevOps_tree").jstree('open_all'); - }); - }, - addAllGroups: function() { - $('.group_item.tree_item').remove(); - this.groups.each(function(group) { - $("#mGroup_tree").jstree("create","#group_list","first",{ attr : {class : "group_item tree_item"} , data : { title: group.attributes.name, attr : { id : group.attributes.id, href : "#account/management/groups", class : "group_item tree_item" }} },false, true); - }); - - if(this.groups.get(this.treeGroup) && typeof(this.subApp.treeSelect) !== "undefined"){ - this.subApp.treeSelect(); - }else{ - $("#selected_group_name").html("No Group Selected"); - } - }, - addAllCreds: function(){ - $('.credential_item.tree_item').remove(); - this.cloudCredentials.each(function(cred) { - $("#mCloudCredential_tree").jstree("create","#cred_list","first",{ attr : {class : "credential_item tree_item"} , data : { title: cred.attributes.name, attr : { id : cred.attributes.id, href : "#account/management/cloud-credentials", class : "credential_item tree_item" }} },false, true); - }); - }, - addAllPolicies: function(){ - $('.policy_item.tree_item').remove(); - this.policies.each(function(policy) { - $("#mPolicy_tree").jstree("create","#policy_list","first",{ attr : {class : "policy_item tree_item"} , data : { title: policy.attributes.name, attr : { id : policy.attributes._id, href : "#account/management/policy", class : "policy_item tree_item" }} },false, true); - }); - }, - addAllCloudAccounts: function(){ - $('.cloud_account_item.tree_item').remove(); - - this.cloudAccounts.each(function(c_account) { - $("#mCloudAccount_tree").jstree("create","#c_account_list","first",{ attr : {class : "cloud_account_item tree_item"} , data : { title: c_account.attributes.name, attr : { id : c_account.attributes.id, href : "#account/management/cloud-accounts", class : "cloud_account_item tree_item" }} },false, true); - }); - - if(!this.treeCloudAccount){ - this.treeCloudAccount = this.cloudAccounts.models[this.cloudAccounts.length-1].id; - } - if(this.cloudAccounts.get(this.treeCloudAccount) && typeof(this.subApp.treeSelectCloudAccount) !== "undefined"){ - this.subApp.treeSelectCloudAccount(); - }else if(typeof(this.subApp.treeSelectCloudAccount) !== "undefined"){ - this.treeCloudAccount = this.cloudAccounts.models[this.cloudAccounts.length-1].id; - this.subApp.treeSelectCloudAccount(); - } - }, - - selectManagement: function(event){ - if(event.target.attributes.href){ - if($("#"+event.target.id).hasClass('policy_item')){ - this.treePolicy = event.target.id; - } - location.href = event.target.attributes.href.nodeValue; - } - }, - selectGroup: function(event){ - this.treeGroup = event.target.id; - if(typeof(this.subApp.treeSelect) !== "undefined"){ - this.subApp.treeSelect(); - } - }, - selectCloudAccount: function(event){ - this.treeCloudAccount = event.target.id; - if(typeof(this.subApp.treeSelectCloudAccount) !== "undefined"){ - this.subApp.treeSelectCloudAccount(); - } - }, - selectCloudCred: function(event){ - this.treeCloudCred = event.target.id; - if(typeof(this.subApp.treeSelectCloudCred) !== "undefined"){ - this.subApp.treeSelectCloudCred(); - } - }, - selectPolicy: function(event){ - this.treePolicy = event.target.id; - if(typeof(this.subApp.treeSelect) !== "undefined"){ - this.subApp.treeSelect(); - } - }, - addUser: function(event){ - new NewLoginView({org_id: sessionStorage.org_id}); - }, - close: function(){ - this.$el.empty(); - this.undelegateEvents(); - this.stopListening(); - this.unbind(); - // handle other unbinding needs, here - _.each(this.subViews, function(childView){ - if (childView.close){ - childView.close(); - } - }); - } - }); - /** Variable to track whether view has been initialized or not */ - var accountManagementView; - - Common.router.on("route:accountManagement", function (action) { - if (this.previousView !== accountManagementView) { - this.unloadPreviousState(); - accountManagementView = new AccountManagementView(); - this.setPreviousState(accountManagementView); - } - switch(action) - { - case "cloud-accounts": - if(accountManagementView.subApp instanceof CloudAccountManagementView) - { - //do nothing - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new CloudAccountManagementView({rootView: accountManagementView}); - } - break; - case "cloud-credentials": - if(accountManagementView.subApp instanceof CloudCredentialManagementView) - { - //do nothing - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new CloudCredentialManagementView({rootView: accountManagementView}); - } - break; - case "users": - if(accountManagementView.subApp instanceof UsersManagementView) - { - //do nothing - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new UsersManagementView(); - } - break; - case "policies": - if(accountManagementView.subApp instanceof PoliciesManagementView) - { - //do nothing - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new PoliciesManagementView({rootView: accountManagementView}); - } - break; - case "policy": - if(accountManagementView.subApp instanceof PolicyManagementView) - { - //do nothing - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new PolicyManagementView({rootView: accountManagementView}); - } - break; - case "groups": - if(accountManagementView.subApp instanceof GroupsManagementView) - { - //do nothing - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new GroupsManagementView({rootView: accountManagementView}); - } - break; - case "groups_list": - if(accountManagementView.subApp instanceof GroupsManagementListView) - { - //do nothing - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new GroupsManagementListView({rootView: accountManagementView}); - } - break; - case "cloud-credentials_list": - if(accountManagementView.subApp instanceof CloudCredentialManagementListView) - { - //do nothing - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new CloudCredentialManagementListView({rootView: accountManagementView}); - } - break; - case "cloud-accounts_list": - if(accountManagementView.subApp instanceof CloudAccountManagementListView) - { - //do nothing - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new CloudAccountManagementListView({rootView: accountManagementView}); - } - break; - case "configuration_managers": - if(accountManagementView.subApp instanceof DevOpsToolsManagementView){ + /** @type {Object} Object of events for view to listen on */ + events: { + "click #addUser": "addUser" + }, - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new DevOpsToolsManagementView({rootView: accountManagementView}); - } - break; - case "continuous_integration": - if(accountManagementView.subApp instanceof ContinuousIntegrationManagementView){ + initialize : function ( options ) { + this.subView = new HomeView(); + }, - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new ContinuousIntegrationManagementView({rootView: accountManagementView}); - } - break; - case "source_control_repositories": - if(accountManagementView.subApp instanceof SourceControlRepositoryManagementListView){ + /** Add all of my own html elements */ + render: function() { + this.subView.render(); + } + }); - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new SourceControlRepositoryManagementListView({rootView: accountManagementView}); - } - break; - case "home": - if(accountManagementView.subApp instanceof HomeView) - { - //do nothing - }else{ - if(accountManagementView.subApp !== undefined){ - accountManagementView.subApp.close(); - } - accountManagementView.subApp = new HomeView({rootView: accountManagementView}); - } - break; - } - }, Common); + Common.router.on('route:account/management', function() { + if (Common.account) { + var accountView = new AccountManagementView(); + accountView.render(); + } else { + Common.router.navigate("", { + trigger: true + }); + Common.login(); + } + }); return AccountManagementView; -}); + } +); diff --git a/js/views/account/cloudAccountCreateView.js b/js/views/account/cloudAccountCreateView.js index e6ea22c2..6492337a 100644 --- a/js/views/account/cloudAccountCreateView.js +++ b/js/views/account/cloudAccountCreateView.js @@ -6,127 +6,145 @@ /*jshint smarttabs:true */ /*global define:true console:true alert:true*/ define([ - 'jquery', - 'underscore', - 'backbone', - 'views/dialogView', - 'text!templates/account/cloudAccountCreateTemplate.html', - '/js/collections/clouds.js', - '/js/models/cloudAccount.js', - 'common' - + 'jquery', + 'underscore', + 'backbone', + 'views/dialogView', + 'text!templates/account/cloudAccountCreateTemplate.html', + 'collections/clouds', + 'models/cloudAccount', + 'common' + ], function( $, _, Backbone, DialogView, cloudAccountCreateTemplate, Clouds, CloudAccount, Common ) { - - var CloudAccountCreateView = DialogView.extend({ + + var CloudAccountCreateView = DialogView.extend({ - cloudAccount: new CloudAccount(), - - org_id: undefined, - - clouds: Clouds, - - events: { - "dialogclose": "close", - "change #cloud_select": "cloudSelect" - }, + cloudAccount: new CloudAccount(), + + org_id: undefined, + + clouds: Clouds, - initialize: function(options) { - this.org_id = options.org_id; - - var createView = this; - var compiledTemplate = _.template(cloudAccountCreateTemplate); - this.$el.html(compiledTemplate); + parentView : undefined, - this.$el.dialog({ - autoOpen: true, - title: "Create Cloud Account", - resizable: false, - width: 325, - modal: true, - buttons: { - Create: function () { - createView.create(); - }, - Cancel: function() { - createView.cancel(); - } - } - }); - }, + onCreated: undefined, + + events: { + "dialogclose": "close", + "change #cloud_select": "cloudSelect" + }, - render: function() { - this.clouds.on('reset', this.addClouds, this); - this.clouds.fetch({ - reset: true - }); - $("#org_html").html(sessionStorage.company); - }, + initialize: function ( options ) { + this.parentView = options.rootView; + this.org_id = options.org_id; + var self = this; + + var createView = this; + var compiledTemplate = _.template(cloudAccountCreateTemplate); + this.$el.html(compiledTemplate); - create: function() { - var newCloudAccount = this.cloudAccount; - var options = {}; - var issue = false; - - if($("#cloud_account_name_input").val() !== "") { - this.displayValid(true, "#cloud_account_name_input"); - options.name = $("#cloud_account_name_input").val(); - }else{ - issue = true; - this.displayValid(false, "#cloud_account_name_input"); - } - - //if OpenStack is Chosen, ensure URL is submitted - if(($("#cloud_select").val() === "51bb825dd39097439c0000f6") && ($("#auth_url_input").val() !== "")) { - this.displayValid(true, "#auth_url_input"); - options.url = $("#auth_url_input").val(); - - //hardcode authurl - /* - options.url = ""; - options.protocol = ""; - options.host = ""; - options.port = "";*/ - - }else if($("#cloud_select").val() !== "51bb825dd39097439c0000f6"){ - //no url if not openstack - }else{ - issue = true; - this.displayValid(false, "#auth_url_input"); - } - - if(!issue){ - newCloudAccount.create(options,sessionStorage.org_id,sessionStorage.login,$("#cloud_select").val()); - this.$el.dialog('close'); - }else{ - Common.errorDialog("Invalid Request", "Please supply all required fields."); - } - }, - - cloudSelect: function(event){ - //show auth url box if OpenStack is chosen - if(event.target.value === "51bb825dd39097439c0000f6"){ - $("#auth_url_row").show(); - }else{ - $("#auth_url_row").hide(); - } - }, - - displayValid: function(valid, selector) { - if(valid) { - $(selector).css("border-color", ""); - }else{ - $(selector).css("border-color", "#FF0000"); - } - }, - - addClouds: function(){ - - $("#cloud_select").empty(); - this.clouds.each(function(cloud) { - $("#cloud_select").append(""); - }); - } - }); - - return CloudAccountCreateView; + this.$el.dialog({ + autoOpen: true, + title: "Create Cloud Account", + resizable: false, + width: 325, + modal: true, + buttons: { + Create: function () { + createView.create(); + }, + Cancel: function() { + createView.cancel(); + } + } + }); + + //make sure other events have been bound first + setTimeout(function () { + if(self.parentView.afterSubAppRender) { + self.parentView.afterSubAppRender(self); + } + }, 5); + }, + + render: function() { + this.clouds.on('reset', this.addClouds, this); + this.clouds.fetch({ + reset: true + }); + $("#org_html").html(Common.account.company); + }, + + create: function() { + var newCloudAccount = this.cloudAccount; + var options = {}; + var issue = false; + + if($("#cloud_account_name_input").val() !== "") { + this.displayValid(true, "#cloud_account_name_input"); + options.name = $("#cloud_account_name_input").val(); + }else{ + issue = true; + this.displayValid(false, "#cloud_account_name_input"); + } + + //if OpenStack is Chosen, ensure URL is submitted + if(($("#cloud_select").val() === "51bb825dd39097439c0000f6") && ($("#auth_url_input").val() !== "")) { + this.displayValid(true, "#auth_url_input"); + options.url = $("#auth_url_input").val(); + + //hardcode authurl + /* + options.url = ""; + options.protocol = ""; + options.host = ""; + options.port = "";*/ + + }else if($("#cloud_select").val() !== "51bb825dd39097439c0000f6"){ + //no url if not openstack + }else{ + issue = true; + this.displayValid(false, "#auth_url_input"); + } + + if(!issue){ + newCloudAccount.create(options,Common.account.org_id,Common.account.login,$("#cloud_select").val()); + this.$el.dialog('close'); + + }else{ + Common.errorDialog("Invalid Request", "Please supply all required fields."); + } + + if(this.onCreated) { + this.onCreated(); + } + }, + + cloudSelect: function(event){ + //show auth url box if OpenStack is chosen + if(event.target.value === "51bb825dd39097439c0000f6"){ + $("#auth_url_row").show(); + }else{ + $("#auth_url_row").hide(); + } + }, + + displayValid: function(valid, selector) { + if(valid) { + $(selector).css("border-color", ""); + }else{ + $(selector).css("border-color", "#FF0000"); + } + }, + + addClouds: function(){ + + $("#cloud_select").empty(); + this.clouds.each(function(cloud) { + $("#cloud_select").append(""); + }); + } + }); + + return CloudAccountCreateView; }); diff --git a/js/views/account/cloudAccountManagementListView.js b/js/views/account/cloudAccountManagementListView.js index 0cbcea98..05affd1a 100644 --- a/js/views/account/cloudAccountManagementListView.js +++ b/js/views/account/cloudAccountManagementListView.js @@ -6,158 +6,170 @@ /*jshint smarttabs:true */ /*global define:true console:true requirejs:true require:true*/ define([ - 'jquery', - 'underscore', - 'backbone', - 'common', - 'text!templates/account/managementCloudAccountListTemplate.html', - 'collections/groups', - 'collections/users', - 'views/account/cloudAccountCreateView', - 'views/account/groupManageUsersView', - 'jquery.dataTables', - 'jquery.dataTables.fnProcessingIndicator' -], function( $, _, Backbone, Common, groupsManagementListTemplate, Groups, Users, CloudAccountCreate, ManageGroupUsers ) { - - var CloudAccountsManagementListView = Backbone.View.extend({ - - tagName: 'div', - - template: _.template(groupsManagementListTemplate), - - rootView: undefined, - - groups: undefined, - - users: new Users(), - - selectedGroup: undefined, - - CloudAccountCreateView: CloudAccountCreate, - - events: { - "click #create_group_button" : "createGroup", - "click #delete_group_button" : "deleteGroup", - 'click #group_users_table tr': 'selectGroup' - }, - - initialize: function() { - this.$el.html(this.template); - this.rootView = this.options.rootView; - $("#submanagement_app").html(this.$el); - $("button").button(); - $("#group_users_table").dataTable({ - "bJQueryUI": true, - "bProcessing": true - }); - - var managementView = this; - Common.vent.on("managementRefresh", function() { - managementView.render(); - }); - - this.selectedGroup = undefined; - this.groups = this.rootView.cloudAccounts; - this.render(); - }, - - render: function () { - this.disableSelectionRequiredButtons(true); - $("#group_users_table").dataTable().fnClearTable(); - - var groupListView = this; - this.groups.fetch({ - data: $.param({ org_id: sessionStorage.org_id, account_id: sessionStorage.account_id}), - reset: true, - success: function(){ - groupListView.addAllGroups(); - } - }); - }, - - selectGroup: function(event){ - $("#group_users_table tr").removeClass('row_selected'); - $(event.currentTarget).addClass('row_selected'); - - var rowData = $("#group_users_table").dataTable().fnGetData(event.currentTarget); - - this.selectedGroup = this.groups.get($.parseHTML(rowData[0])[0]); - - if(this.selectedGroup) { - this.disableSelectionRequiredButtons(false); - } - }, - - addAllGroups: function() { - $("#group_users_table").dataTable().fnClearTable(); - $.each(this.groups.models, function(index, value) { - var auth_url = ""; - if(value.attributes.url){ - auth_url = value.attributes.url; - } - - var rowData = ['", value.attributes.cloud_provider, auth_url]; - $("#group_users_table").dataTable().fnAddData(rowData); - }); - }, - - disableSelectionRequiredButtons: function(toggle) { - if(toggle) { - $("#delete_group_button").attr("disabled", true); - $("#delete_group_button").addClass("ui-state-disabled"); - $("#delete_group_button").removeClass("ui-state-hover"); - $("#manage_group_users_button").attr("disabled", true); - $("#manage_group_users_button").addClass("ui-state-disabled"); - }else { - $("#delete_group_button").removeAttr("disabled"); - $("#delete_group_button").removeClass("ui-state-disabled"); - $("#manage_group_users_button").removeAttr("disabled"); - $("#manage_group_users_button").removeClass("ui-state-disabled"); - } - - this.adminCheck(); - }, - - adminCheck: function(){ - var groupsView = this; - groupsView.users.fetch({success: function(){ - var isAdmin = false; - if(groupsView.users.get(sessionStorage.account_id).attributes.permissions.length > 0){ - isAdmin = groupsView.users.get(sessionStorage.account_id).attributes.permissions[0].permission.name === "admin"; - } - if(!isAdmin){ - $("#delete_group_button").attr("disabled", true); - $("#delete_group_button").addClass("ui-state-disabled"); - $("#delete_group_button").removeClass("ui-state-hover"); - $("#create_group_button").attr("disabled", true); - $("#create_group_button").addClass("ui-state-disabled"); - } - }}); - }, - - createGroup: function() { - var CloudAccountCreateView = this.CloudAccountCreateView; - - this.newResourceDialog = new CloudAccountCreateView({ org_id: sessionStorage.org_id, account_id: sessionStorage.account_id}); - - this.newResourceDialog.render(); - }, - - deleteGroup: function() { - if(this.selectedGroup) { - this.selectedGroup.destroy(sessionStorage.login); - } - }, - - clearSelection: function() { - this.selectedGroup = undefined; - $(".group_item").removeClass("selected_item"); - }, - - close: function(){ - this.$el.remove(); - } - }); - - return CloudAccountsManagementListView; + 'jquery', + 'underscore', + 'backbone', + 'common', + 'text!templates/account/managementCloudAccountListTemplate.html', + 'collections/users', + 'collections/cloudAccounts', + 'views/account/cloudAccountCreateView', + 'jquery.dataTables', + 'jquery.dataTables.fnProcessingIndicator' +], function($, _, Backbone, Common, cloudAccountManagementListTemplate, Users, CloudAccounts, CloudAccountCreate) { + + var CloudAccountsManagementListView = Backbone.View.extend({ + + tagName: 'div', + + template: _.template(cloudAccountManagementListTemplate), + + rootView: undefined, + + cloudAccounts: undefined, + + users: new Users(), + + selectedCloudAccount: undefined, + + CloudAccountCreateView: CloudAccountCreate, + + events: { + "click #create_group_button": "createCloudAccount", + "click #delete_group_button": "deleteCloudAccount", + 'click #group_users_table tr': 'selectCloudAccount' + }, + + initialize: function(options) { + this.$el.html(this.template); + this.rootView = options.rootView; + $("#submanagement_app").html(this.$el); + $("button").button(); + + $("#group_users_table").dataTable({ + "bJQueryUI": true, + "bProcessing": true + }); + + var managementView = this; + Common.vent.on("managementRefresh", function() { + managementView.render(); + }); + + this.cloudAccounts = new CloudAccounts(); + this.rootView.cloudAccounts = this.cloudAccounts; + this.cloudAccounts.on('reset', this.addAllCloudAccounts, this); + + this.render(); + }, + + render: function() { + this.disableSelectionRequiredButtons(true); + $("#group_users_table").dataTable().fnClearTable(); + + var listView = this; + this.cloudAccounts.fetch({ + data: $.param({ + org_id: Common.account.org_id, + account_id: Common.account.id + }), + reset: true, + success: function() { + listView.addAllCloudAccounts(); + } + }); + }, + + selectCloudAccount: function(event) { + $("#group_users_table tr").removeClass('row_selected'); + $(event.currentTarget).addClass('row_selected'); + + var rowData = $("#group_users_table").dataTable().fnGetData(event.currentTarget); + + this.selectedCloudAccount = this.cloudAccounts.get($.parseHTML(rowData[0])[0]); + + if (this.selectedCloudAccount) { + this.disableSelectionRequiredButtons(false); + } + }, + + addAllCloudAccounts: function() { + this.rootView.addAll(this.cloudAccounts, $('#cloud_account_list')); + $("#group_users_table").dataTable().fnClearTable(); + this.cloudAccounts.each(function(cloudAccount) { + var auth_url = ""; + if (cloudAccount.attributes.url) { + auth_url = cloudAccount.attributes.url; + } + + var rowData = ['", cloudAccount.attributes.cloud_provider, auth_url]; + $("#group_users_table").dataTable().fnAddData(rowData); + }); + }, + + disableSelectionRequiredButtons: function(toggle) { + if (toggle) { + $("#delete_group_button").attr("disabled", true); + $("#delete_group_button").addClass("ui-state-disabled"); + $("#delete_group_button").removeClass("ui-state-hover"); + $("#manage_group_users_button").attr("disabled", true); + $("#manage_group_users_button").addClass("ui-state-disabled"); + } else { + $("#delete_group_button").removeAttr("disabled"); + $("#delete_group_button").removeClass("ui-state-disabled"); + $("#manage_group_users_button").removeAttr("disabled"); + $("#manage_group_users_button").removeClass("ui-state-disabled"); + } + + this.adminCheck(); + }, + + adminCheck: function() { + var cloudAccountsView = this; + cloudAccountsView.users.fetch({ + success: function() { + var isAdmin = false; + if (cloudAccountsView.users.get(Common.account.id).attributes.permissions.length > 0) { + isAdmin = cloudAccountsView.users.get(Common.account.id).attributes.permissions[0].permission.name === "admin"; + } + if (!isAdmin) { + $("#delete_group_button").attr("disabled", true); + $("#delete_group_button").addClass("ui-state-disabled"); + $("#delete_group_button").removeClass("ui-state-hover"); + $("#create_group_button").attr("disabled", true); + $("#create_group_button").addClass("ui-state-disabled"); + } + } + }); + }, + + createCloudAccount: function() { + var CloudAccountCreateView = this.CloudAccountCreateView; + + this.newResourceDialog = new CloudAccountCreateView({ + org_id: Common.account.org_id, + account_id: Common.account.id, + rootView: this.rootView + }); + + this.newResourceDialog.render(); + }, + + deleteCloudAccount: function() { + if (this.selectedCloudAccount) { + this.selectedCloudAccount.destroy(Common.account.login); + } + }, + + clearSelection: function() { + this.selectedCloudAccount = undefined; + $(".group_item").removeClass("selected_item"); + }, + + close: function() { + this.$el.remove(); + } + }); + + return CloudAccountsManagementListView; }); \ No newline at end of file diff --git a/js/views/account/cloudAccountManagementView.js b/js/views/account/cloudAccountManagementView.js index 2523aac7..d19d31d8 100644 --- a/js/views/account/cloudAccountManagementView.js +++ b/js/views/account/cloudAccountManagementView.js @@ -41,7 +41,8 @@ define([ "click button.save-manager" : "saveManager" }, - initialize: function(options) { + initialize: function ( options ) { + var self = this; this.template = _.template(managementCloudAccountTemplate); this.$el.html(this.template); $("#submanagement_app").html(this.$el); @@ -53,20 +54,43 @@ define([ Common.vent.on("managementRefresh", function() { thisView.render(); }); - Common.vent.on("servicesRefresh", function() { + Common.vent.on("servicesRefresh", function(data) { + thisView.selectedCloudAccount.attributes = data.cloud_account; thisView.render(); }); Common.vent.on("cloudAccountUpdated", function() { thisView.render(); }); $("input").addClass("form-control"); - this.render(); + + this.cloudAccounts = new CloudAccounts(); + + this.cloudAccounts.on('reset', function ( data ) { + self.selectedCloudAccount = self.cloudAccounts.get(options.selectedId); + self.initFields(); + }); + + if(options.collection && options.collection.models.length > 0) { + this.cloudAccounts.reset(options.collection.models); + } + + if(this.cloudAccounts.models.length === 0) { + this.cloudAccounts.fetch({ + data: $.param({ + org_id: Common.account.org_id, + account_id: Common.account.id + }), + reset : true + }); + } + + }, render: function () { var thisView = this; this.configManagers.fetch({ - data: $.param({org_id: sessionStorage.org_id}), + data: $.param({org_id: Common.account.org_id}), success:function(collection, response, options){ thisView.populateConfigMenus(); } @@ -118,8 +142,8 @@ define([ var thisView = this; thisView.users.fetch({success: function(){ var isAdmin = false; - if(thisView.users.get(sessionStorage.account_id).attributes.permissions.length > 0){ - isAdmin = thisView.users.get(sessionStorage.account_id).attributes.permissions[0].permission.name === "admin"; + if(thisView.users.get(Common.account.id).attributes.permissions.length > 0){ + isAdmin = thisView.users.get(Common.account.id).attributes.permissions[0].permission.name === "admin"; } if(!isAdmin){ $(".delete-button").attr("disabled", true); @@ -133,8 +157,7 @@ define([ }}); }, - treeSelectCloudAccount: function() { - this.selectedCloudAccount = this.rootView.cloudAccounts.get(this.rootView.treeCloudAccount); + initFields : function () { $("#services_tab").html(this.selectedCloudAccount.attributes.name); $("#cloud_provider_label").html(this.selectedCloudAccount.attributes.cloud_provider); @@ -172,7 +195,7 @@ define([ }); service.unset("password"); service.unset("username"); - this.selectedCloudAccount.updateService(service,sessionStorage.login); + this.selectedCloudAccount.updateService(service,Common.account.login); return false; }, @@ -187,9 +210,7 @@ define([ }, newCloudService: function(){ - var CloudServiceCreateView = this.CloudServiceCreateView; - - this.newResourceDialog = new CloudServiceCreateView({ cloud_account: this.selectedCloudAccount}); + this.newResourceDialog = new CloudServiceCreate({ cloud_account: this.selectedCloudAccount}); this.newResourceDialog.render(); @@ -197,9 +218,7 @@ define([ deleteService: function(event) { var serviceData = $(event.currentTarget.parentElement).find("input").data(); - this.selectedCloudAccount.deleteService(serviceData, sessionStorage.login); - - this.refreshServices(); + this.selectedCloudAccount.deleteService(serviceData, Common.account.login); return false; }, diff --git a/js/views/account/cloudCredentialCreateView.js b/js/views/account/cloudCredentialCreateView.js index a6aa5772..4580cf14 100644 --- a/js/views/account/cloudCredentialCreateView.js +++ b/js/views/account/cloudCredentialCreateView.js @@ -11,9 +11,9 @@ define([ 'backbone', 'views/dialogView', 'text!templates/account/cloudCredentialCreateTemplate.html', - '/js/collections/cloudAccounts.js', - '/js/collections/cloudCredentials.js', - '/js/models/cloudCredential.js', + 'collections/cloudAccounts', + 'collections/cloudCredentials', + 'models/cloudCredential', 'views/account/cloudCredentialFormView', 'common' @@ -26,6 +26,10 @@ define([ cloudAccounts: new CloudAccounts(), cloudCredentials: new CloudCredentials(), + + onCreated: undefined, + + parentView: null, events: { "dialogclose": "close", @@ -33,6 +37,10 @@ define([ }, initialize: function(options) { + + if(options) { + this.parentView = options.rootView; + } this.subViews = []; @@ -58,12 +66,20 @@ define([ } }); this.render(); + var self = this; + + if(this.parentView.afterSubAppRender) { + //make sure other events have been bound first + setTimeout(function () { + self.parentView.afterSubAppRender(self); + }, 5); + } }, render: function() { this.cloudAccounts.on('reset', this.addCloudAccounts, this); this.cloudAccounts.fetch({ - data: $.param({ org_id: sessionStorage.org_id, account_id: sessionStorage.account_id }), + data: $.param({ org_id: Common.account.org_id, account_id: Common.account.id }), reset: true }); @@ -96,6 +112,10 @@ define([ if(this.selectedCloudCredential.id === ""){ this.cloudCredentials.create(this.selectedCloudCredential, {cloud_account_id: this.selectedCloudAccount.id}); this.$el.dialog('close'); + this.cloudCredentials.add(this.selectedCloudCredential); + if(this.onCreated) { + this.onCreated(); + } } }, diff --git a/js/views/account/cloudCredentialFormView.js b/js/views/account/cloudCredentialFormView.js index 9a684a56..bd3c54d2 100644 --- a/js/views/account/cloudCredentialFormView.js +++ b/js/views/account/cloudCredentialFormView.js @@ -6,133 +6,128 @@ /*jshint smarttabs:true */ /*global define:true console:true requirejs:true require:true*/ define([ - 'jquery', - 'underscore', - 'backbone', - 'common', - 'icanhaz', - 'jquery-plugins', - 'jquery-ui-plugins', - 'jquery.form' -], function( $, _, Backbone, Common, ich ) { + 'jquery', + 'underscore', + 'backbone', + 'common', + 'icanhaz', + 'jquery-plugins', + 'jquery-ui-plugins', + 'jquery.form' +], function($, _, Backbone, Common, ich) { - var CloudCredentialFormView = Backbone.View.extend({ - /** @type {String} DOM element to attach view to */ - el: "#form_area", - /** @type {Object} Object of events for view to listen on */ - events: { - "change input": "contentChanged", - "change textarea": "contentChanged" - //"submit form[name=submit]":"uploadFile" - }, - /** Constructor method for current view */ - initialize: function() { - this.render(); - }, - /** Add all of my own html elements */ - render: function () { - /** - * [ich.grabTemplates() description] - * - * Looks for any + \ No newline at end of file diff --git a/templates/account/cloudCredentialManagementListTemplate.html b/templates/account/cloudCredentialManagementListTemplate.html index 575b4fb4..d60ad2d5 100644 --- a/templates/account/cloudCredentialManagementListTemplate.html +++ b/templates/account/cloudCredentialManagementListTemplate.html @@ -1,4 +1,4 @@ -
              +

              Manage Cloud Credentials

              diff --git a/templates/account/groupsManagementTemplate.html b/templates/account/groupsManagementTemplate.html index cbaa156d..3786c2d2 100644 --- a/templates/account/groupsManagementTemplate.html +++ b/templates/account/groupsManagementTemplate.html @@ -1,4 +1,4 @@ -
              RDS
              - -
              -
              - - - Unlimited - + +
              +
              + + + Unlimited + +
              +

              *Read replica counts as additional database.

              -

              *Read replica counts as additional database.

              -
              Miscellaneous @@ -344,27 +409,26 @@
              - - - - - + + + + +
              -
              @@ -378,7 +442,7 @@
              Add Default Alarms  Add - +
              diff --git a/templates/account/stackstudioLoginTemplate.html b/templates/account/stackstudioLoginTemplate.html index 5a02557e..7be8c490 100644 --- a/templates/account/stackstudioLoginTemplate.html +++ b/templates/account/stackstudioLoginTemplate.html @@ -1,21 +1,27 @@ -
              -
              -
              - Please enter your username and password. -
              -
              Metric
              - - - - - - - - -
              - -
              - -
              + \ No newline at end of file diff --git a/templates/account/userUpdateTemplate.html b/templates/account/userUpdateTemplate.html new file mode 100644 index 00000000..0c71e891 --- /dev/null +++ b/templates/account/userUpdateTemplate.html @@ -0,0 +1,39 @@ +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              First Name:
              Last Name:
              Username*:
              Email Address*:
              Country*:
              Admin:
              New Password*:
              Confirm New Password*:
              +
              +
              \ No newline at end of file diff --git a/templates/account/usersManagementTemplate.html b/templates/account/usersManagementTemplate.html index 5b6dc1b7..590fc2fa 100644 --- a/templates/account/usersManagementTemplate.html +++ b/templates/account/usersManagementTemplate.html @@ -3,6 +3,7 @@

              Manage Users

              +
              diff --git a/templates/aws/autoscale/awsAutoscaleAppTemplate.html b/templates/aws/autoscale/awsAutoscaleAppTemplate.html index 3988f803..43c57dca 100644 --- a/templates/aws/autoscale/awsAutoscaleAppTemplate.html +++ b/templates/aws/autoscale/awsAutoscaleAppTemplate.html @@ -1,24 +1,5 @@
              -
              - - - - - -
              - - - -
              -
              +
              @@ -36,76 +17,100 @@
              - \ No newline at end of file diff --git a/templates/aws/beanstalk/awsApplicationAppTemplate.html b/templates/aws/beanstalk/awsApplicationAppTemplate.html index a4de65b3..fc098174 100644 --- a/templates/aws/beanstalk/awsApplicationAppTemplate.html +++ b/templates/aws/beanstalk/awsApplicationAppTemplate.html @@ -1,23 +1,5 @@
              -
              - - - - - -
              - - - -
              -
              +
              @@ -34,19 +16,27 @@
              + \ No newline at end of file diff --git a/templates/aws/block_storage/awsVolumeAppTemplate.html b/templates/aws/block_storage/awsVolumeAppTemplate.html index 6d52828b..d5db7f25 100644 --- a/templates/aws/block_storage/awsVolumeAppTemplate.html +++ b/templates/aws/block_storage/awsVolumeAppTemplate.html @@ -1,27 +1,5 @@
              -
              -
              - - - - -
              - - - -
              -
              +
              @@ -40,82 +18,91 @@ \ No newline at end of file diff --git a/templates/aws/cloud_formation/awsCloudFormationAppTemplate.html b/templates/aws/cloud_formation/awsCloudFormationAppTemplate.html index 7d20cbda..18c5f2a0 100644 --- a/templates/aws/cloud_formation/awsCloudFormationAppTemplate.html +++ b/templates/aws/cloud_formation/awsCloudFormationAppTemplate.html @@ -1,24 +1,5 @@
              -
              -
              - - - - -
              - - - -
              -
              +
              @@ -36,60 +17,73 @@
              + \ No newline at end of file diff --git a/templates/aws/cloud_watch/awsAlarmAppTemplate.html b/templates/aws/cloud_watch/awsAlarmAppTemplate.html index 6d0daae8..0f769b48 100644 --- a/templates/aws/cloud_watch/awsAlarmAppTemplate.html +++ b/templates/aws/cloud_watch/awsAlarmAppTemplate.html @@ -1,23 +1,5 @@
              -
              -
              - - - - -
              - - - -
              -
              +
              @@ -34,36 +16,62 @@
              + + \ No newline at end of file diff --git a/templates/aws/compute/awsElasticIPAppTemplate.html b/templates/aws/compute/awsElasticIPAppTemplate.html index 329dde83..7ad9277c 100644 --- a/templates/aws/compute/awsElasticIPAppTemplate.html +++ b/templates/aws/compute/awsElasticIPAppTemplate.html @@ -1,25 +1,5 @@
              -
              -
              - - - - -
              - - - -
              -
              +
              @@ -37,18 +17,27 @@ \ No newline at end of file diff --git a/templates/aws/compute/awsInstanceAppTemplate.html b/templates/aws/compute/awsInstanceAppTemplate.html index 5510b609..4815a30e 100644 --- a/templates/aws/compute/awsInstanceAppTemplate.html +++ b/templates/aws/compute/awsInstanceAppTemplate.html @@ -1,27 +1,5 @@
              -
              -
              - - - - -
              - - - -
              -
              +
              @@ -42,80 +20,89 @@
              + \ No newline at end of file diff --git a/templates/aws/compute/awsKeyPairAppTemplate.html b/templates/aws/compute/awsKeyPairAppTemplate.html index 69928b0f..ad8e666c 100644 --- a/templates/aws/compute/awsKeyPairAppTemplate.html +++ b/templates/aws/compute/awsKeyPairAppTemplate.html @@ -1,26 +1,5 @@
              -
              -
              - - - - - -
              - - - - - -
              -
              +
              @@ -35,19 +14,27 @@
        - \ No newline at end of file diff --git a/templates/aws/compute/awsReservedInstanceAppTemplate.html b/templates/aws/compute/awsReservedInstanceAppTemplate.html index 7d4dfb64..64e9de97 100644 --- a/templates/aws/compute/awsReservedInstanceAppTemplate.html +++ b/templates/aws/compute/awsReservedInstanceAppTemplate.html @@ -1,24 +1,5 @@
        -
        - - - - - -
        - - - -
        -
        +
        @@ -36,25 +17,34 @@ \ No newline at end of file diff --git a/templates/aws/compute/awsSecurityGroupAppTemplate.html b/templates/aws/compute/awsSecurityGroupAppTemplate.html index af751a26..879f6d50 100644 --- a/templates/aws/compute/awsSecurityGroupAppTemplate.html +++ b/templates/aws/compute/awsSecurityGroupAppTemplate.html @@ -1,23 +1,5 @@
        -
        -
        - - - - -
        - - - -
        -
        +
        @@ -34,46 +16,56 @@
        + \ No newline at end of file diff --git a/templates/aws/compute/awsTagsAppTemplate.html b/templates/aws/compute/awsTagsAppTemplate.html index 49be733a..8ce326ac 100644 --- a/templates/aws/compute/awsTagsAppTemplate.html +++ b/templates/aws/compute/awsTagsAppTemplate.html @@ -1,23 +1,5 @@
        -
        -
        - - - - - -
        +
        @@ -34,19 +16,27 @@
        - \ No newline at end of file diff --git a/templates/aws/dns/awsHostedZoneAppTemplate.html b/templates/aws/dns/awsHostedZoneAppTemplate.html index 6aa0d0d8..60bdc31d 100644 --- a/templates/aws/dns/awsHostedZoneAppTemplate.html +++ b/templates/aws/dns/awsHostedZoneAppTemplate.html @@ -1,23 +1,5 @@
        -
        - - - - - -
        - - - -
        -
        +
        @@ -32,20 +14,29 @@ \ No newline at end of file diff --git a/templates/aws/iam/awsGroupAppTemplate.html b/templates/aws/iam/awsGroupAppTemplate.html index af3c17b0..6a496362 100644 --- a/templates/aws/iam/awsGroupAppTemplate.html +++ b/templates/aws/iam/awsGroupAppTemplate.html @@ -1,23 +1,5 @@
        -
        -
        - - - - -
        - - - -
        -
        +
        @@ -31,26 +13,33 @@
        - \ No newline at end of file diff --git a/templates/aws/iam/awsUserAppTemplate.html b/templates/aws/iam/awsUserAppTemplate.html index 22e86cc9..b55ac751 100644 --- a/templates/aws/iam/awsUserAppTemplate.html +++ b/templates/aws/iam/awsUserAppTemplate.html @@ -1,23 +1,5 @@
        -
        - - - - - -
        - - - -
        -
        +
        @@ -33,20 +15,28 @@ \ No newline at end of file diff --git a/templates/aws/load_balancer/awsLoadBalancerAppTemplate.html b/templates/aws/load_balancer/awsLoadBalancerAppTemplate.html index 78dcf7bc..745e8a92 100644 --- a/templates/aws/load_balancer/awsLoadBalancerAppTemplate.html +++ b/templates/aws/load_balancer/awsLoadBalancerAppTemplate.html @@ -1,23 +1,5 @@
        -
        -
        - - - - -
        - - - -
        -
        +
        @@ -35,75 +17,84 @@
        + \ No newline at end of file diff --git a/templates/aws/notification/awsTopicAppTemplate.html b/templates/aws/notification/awsTopicAppTemplate.html index 2e929c9b..cd4b6c69 100644 --- a/templates/aws/notification/awsTopicAppTemplate.html +++ b/templates/aws/notification/awsTopicAppTemplate.html @@ -1,25 +1,5 @@
        -
        -
        - - - - -
        - - - -
        - +
        @@ -36,26 +16,35 @@ \ No newline at end of file diff --git a/templates/aws/object_storage/awsBucketAppTemplate.html b/templates/aws/object_storage/awsBucketAppTemplate.html index 9a933e53..0ee02e6c 100644 --- a/templates/aws/object_storage/awsBucketAppTemplate.html +++ b/templates/aws/object_storage/awsBucketAppTemplate.html @@ -1,23 +1,5 @@
        -
        -
        - - - - -
        - - - -
        - +
        @@ -30,19 +12,28 @@ \ No newline at end of file diff --git a/templates/aws/queue/awsQueueAppTemplate.html b/templates/aws/queue/awsQueueAppTemplate.html index 55ff4592..ce2f7cdb 100644 --- a/templates/aws/queue/awsQueueAppTemplate.html +++ b/templates/aws/queue/awsQueueAppTemplate.html @@ -1,23 +1,5 @@
        -
        -
        - - - - -
        - - - -
        - +
        @@ -34,28 +16,35 @@
        - \ No newline at end of file diff --git a/templates/aws/rds/awsParameterGroupAppTemplate.html b/templates/aws/rds/awsParameterGroupAppTemplate.html index e216a875..bd7f8175 100644 --- a/templates/aws/rds/awsParameterGroupAppTemplate.html +++ b/templates/aws/rds/awsParameterGroupAppTemplate.html @@ -1,23 +1,5 @@
        -
        - - - - - -
        - - - -
        -
        +
        @@ -35,35 +17,44 @@ \ No newline at end of file diff --git a/templates/aws/vpc/awsNetworkAclAppTemplate.html b/templates/aws/vpc/awsNetworkAclAppTemplate.html index 6226988b..2454ec9e 100644 --- a/templates/aws/vpc/awsNetworkAclAppTemplate.html +++ b/templates/aws/vpc/awsNetworkAclAppTemplate.html @@ -22,7 +22,7 @@ - + diff --git a/templates/aws/vpc/awsRouteTableAppTemplate.html b/templates/aws/vpc/awsRouteTableAppTemplate.html index f71dbf0e..38b97367 100644 --- a/templates/aws/vpc/awsRouteTableAppTemplate.html +++ b/templates/aws/vpc/awsRouteTableAppTemplate.html @@ -21,8 +21,8 @@
        Network ACL IDVPCVPC ID Default
        - + @@ -36,48 +36,91 @@ \ No newline at end of file diff --git a/templates/aws/vpc/awsRouteTableAssociateTemplate.html b/templates/aws/vpc/awsRouteTableAssociateTemplate.html new file mode 100644 index 00000000..b780553c --- /dev/null +++ b/templates/aws/vpc/awsRouteTableAssociateTemplate.html @@ -0,0 +1,15 @@ +
        +
        +

        + Select a subnet to associate the current route table with. +

        +
        VPC ID Route Table IDVPC ID
        + + + + +
        Subnet: + +
        +
        + \ No newline at end of file diff --git a/templates/aws/vpc/awsVpcAppTemplate.html b/templates/aws/vpc/awsVpcAppTemplate.html index e468f8b3..a81b6926 100644 --- a/templates/aws/vpc/awsVpcAppTemplate.html +++ b/templates/aws/vpc/awsVpcAppTemplate.html @@ -2,7 +2,7 @@
        - +
        + diff --git a/templates/cloud_setup/cloudSetupTemplate.html b/templates/cloud_setup/cloudSetupTemplate.html new file mode 100644 index 00000000..6ca4d8eb --- /dev/null +++ b/templates/cloud_setup/cloudSetupTemplate.html @@ -0,0 +1,168 @@ + +
        +
        +

        + Cloud Setup +

        +
        +
        + +
        +
        +
        diff --git a/templates/components/mainPage.html b/templates/components/mainPage.html new file mode 100644 index 00000000..f5f3c9d0 --- /dev/null +++ b/templates/components/mainPage.html @@ -0,0 +1,45 @@ +
        +
        +
        +
        +
        +

        COMPONENT LIST

        +
        +
        +
        + + New +
        +
        +
        +
        +
        + +
        +
        + + \ No newline at end of file diff --git a/templates/compute/instanceAppTemplate.html b/templates/compute/instanceAppTemplate.html index 304b46cc..276e77a1 100644 --- a/templates/compute/instanceAppTemplate.html +++ b/templates/compute/instanceAppTemplate.html @@ -1,7 +1,5 @@
        -
        - -
        +
        @@ -20,14 +18,23 @@ \ No newline at end of file diff --git a/templates/dashboard.html b/templates/dashboard.html index 9629e656..0c97df30 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -1,25 +1,25 @@ -
        -

        - Welcome to StackStudio -

        -
        -
        -

        Getting Started

        -

        - To start using StackStudio right away, click the Login link at the top of the page to - login or register as a new user. -

        -

        -
        -

        Contributing

        -

        - If you would like to make StackStudio even better than what it already is, consider contributing - to our project. Checkout our project here. -

        -

        -
        -
        -

        Recent News

        -
        -
        -
        +
        +

        + Welcome to StackStudio +

        +
        +
        +

        Getting Started

        +

        + To start using StackStudio right away, click the Login link at the top of the page to + login or register as a new user. +

        +
        +
        +

        Contributing

        +

        + If you would like to make StackStudio even better than what it already is, consider contributing + to our project. Checkout our project here. +

        +
        +
        +
        +

        Recent News

        +
        +
        +
        diff --git a/templates/errorDialogTemplate.html b/templates/errorDialogTemplate.html index 94938e2b..4d87ceda 100644 --- a/templates/errorDialogTemplate.html +++ b/templates/errorDialogTemplate.html @@ -1,6 +1,15 @@ -
        -

        - - -

        + \ No newline at end of file diff --git a/templates/featureNotImplementedTemplate.html b/templates/featureNotImplementedTemplate.html new file mode 100644 index 00000000..ce0d4242 --- /dev/null +++ b/templates/featureNotImplementedTemplate.html @@ -0,0 +1,4 @@ +
        +
        +
        +
        \ No newline at end of file diff --git a/templates/firstTimeTutorialTemplate.html b/templates/firstTimeTutorialTemplate.html new file mode 100644 index 00000000..a530861d --- /dev/null +++ b/templates/firstTimeTutorialTemplate.html @@ -0,0 +1,8 @@ +
        + x +

        Tutorial

        +
        +
        +

        +
        +
        \ No newline at end of file diff --git a/templates/images/imagesTemplate.html b/templates/images/imagesTemplate.html index f8ce6734..e2ffb975 100644 --- a/templates/images/imagesTemplate.html +++ b/templates/images/imagesTemplate.html @@ -1,355 +1,352 @@
        -
        + + + + + + + + +
        Instance: + +
        Security Group(s): + +
        +
        \ No newline at end of file diff --git a/templates/openstack/compute/openstackKeyPairAppTemplate.html b/templates/openstack/compute/openstackKeyPairAppTemplate.html index e9a04332..a8a971b5 100644 --- a/templates/openstack/compute/openstackKeyPairAppTemplate.html +++ b/templates/openstack/compute/openstackKeyPairAppTemplate.html @@ -5,6 +5,9 @@
        + +
        • diff --git a/templates/openstack/compute/openstackKeyPairImportTemplate.html b/templates/openstack/compute/openstackKeyPairImportTemplate.html new file mode 100644 index 00000000..fe7c37ea --- /dev/null +++ b/templates/openstack/compute/openstackKeyPairImportTemplate.html @@ -0,0 +1,23 @@ +
          + + + + + + + + + + + + + + + + + + + + + + + + + +
          Name*: + +
          Key*: + +
          Username: + +
          Password: + +
          VCloud Director URL + +
          Organization + +
          +
          + \ No newline at end of file diff --git a/templates/vcloud/catalog/vcloudCatalogAppTemplate.html b/templates/vcloud/catalog/vcloudCatalogAppTemplate.html new file mode 100644 index 00000000..7bfa6746 --- /dev/null +++ b/templates/vcloud/catalog/vcloudCatalogAppTemplate.html @@ -0,0 +1,70 @@ +
          +
          + + + + + + + + + + + +
          NameStatus
          +
          +
          + + \ No newline at end of file diff --git a/templates/vcloud/catalog/vcloudCatalogItemTemplate.html b/templates/vcloud/catalog/vcloudCatalogItemTemplate.html new file mode 100644 index 00000000..feeddf39 --- /dev/null +++ b/templates/vcloud/catalog/vcloudCatalogItemTemplate.html @@ -0,0 +1,21 @@ +
          +
          +
          + + + + diff --git a/templates/vcloud/compute/vcloudDataCentersTemplate.html b/templates/vcloud/compute/vcloudDataCentersTemplate.html new file mode 100644 index 00000000..3d0d19b2 --- /dev/null +++ b/templates/vcloud/compute/vcloudDataCentersTemplate.html @@ -0,0 +1,18 @@ +
          +
          +
          + + \ No newline at end of file diff --git a/templates/vcloud/compute/vcloudOrganizationsTemplate.html b/templates/vcloud/compute/vcloudOrganizationsTemplate.html new file mode 100644 index 00000000..fbfb0558 --- /dev/null +++ b/templates/vcloud/compute/vcloudOrganizationsTemplate.html @@ -0,0 +1,23 @@ + + +
          +
          + +
          + +
          + + \ No newline at end of file diff --git a/templates/vcloud/compute/vcloudVappAppTemplate.html b/templates/vcloud/compute/vcloudVappAppTemplate.html new file mode 100644 index 00000000..0b0e2166 --- /dev/null +++ b/templates/vcloud/compute/vcloudVappAppTemplate.html @@ -0,0 +1,41 @@ +
          +
          + + + + + + + + + + + + + +
          NameDescriptionDeployedStatus
          +
          +
          + \ No newline at end of file diff --git a/templates/vcloud/compute/vcloudVmListTemplate.html b/templates/vcloud/compute/vcloudVmListTemplate.html new file mode 100644 index 00000000..31912886 --- /dev/null +++ b/templates/vcloud/compute/vcloudVmListTemplate.html @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/templates/vcloud/compute/vcloudVmTemplate.html b/templates/vcloud/compute/vcloudVmTemplate.html new file mode 100644 index 00000000..d5ce7534 --- /dev/null +++ b/templates/vcloud/compute/vcloudVmTemplate.html @@ -0,0 +1,98 @@ + + + \ No newline at end of file diff --git a/templates/vcloud/network/vcloudNetworkAppTemplate.html b/templates/vcloud/network/vcloudNetworkAppTemplate.html new file mode 100644 index 00000000..5714824f --- /dev/null +++ b/templates/vcloud/network/vcloudNetworkAppTemplate.html @@ -0,0 +1,72 @@ +
          +
          + + + + + + + + + + + +
          NameStatus
          +
          +
          + \ No newline at end of file diff --git a/templates/vcloud/vcloudTreeViewTemplate.html b/templates/vcloud/vcloudTreeViewTemplate.html new file mode 100644 index 00000000..ba9a5d0e --- /dev/null +++ b/templates/vcloud/vcloudTreeViewTemplate.html @@ -0,0 +1,8 @@ + +
          +
          +
          + +
          +
          +
          \ No newline at end of file diff --git a/test/fixtures/meshes/appliances_list.json b/test/fixtures/meshes/appliances_list.json new file mode 100644 index 00000000..95b9db19 --- /dev/null +++ b/test/fixtures/meshes/appliances_list.json @@ -0,0 +1,62 @@ +[ + { + "Appliance": { + "id": "123", + "Name": "DemoSite", + "TenantID": "ddab1f30-83dc-11e3-baa7-0800200c9a66", + "ApplianceTypeURL": "demosite", + "ApplianceInstanceCount": "4", + "ApplianceSpecURL": "http://some.place.com/mytypes/DemoSiteSpec.json", + "ApplianceSpec": { + "Name": "DemoSite", + "PolicyURL": "http://some.place.com/mytypes/DemoSitePolicy.json", + "AccountingURL": "http://some.place.com/mytypes/DemoSiteAcct.json", + "CapsuleSpecURLs": [ + "http://some.place.com/mytypes/Logger.json", + "http://some.place.com/mytypes/ElasticSearch.json", + "http://some.place.com/mytypes/Kibana.json" + ] + } + } + }, + { + "Appliance": { + "id": "456", + "Name": "MyAppliance", + "TenantID": "ddab1f30-83dc-11e3-baa7-0800200c9a66", + "ApplianceTypeURL": "myappliance", + "ApplianceInstanceCount": "3", + "ApplianceSpecURL": "http://some.place.com/mytypes/MyApplianceSpec.json", + "ApplianceSpec": { + "Name": "MyAppliance", + "PolicyURL": "http://some.place.com/mytypes/MyAppliancePolicy.json", + "AccountingURL": "http://some.place.com/mytypes/MyApplianceAcct.json", + "CapsuleSpecURLs": [ + "http://some.place.com/mytypes/Logger.json", + "http://some.place.com/mytypes/ElasticSearch.json", + "http://some.place.com/mytypes/Kibana.json" + ] + } + } + }, + { + "Appliance": { + "id": "789", + "Name": "Logger", + "TenantID": "ddab1f30-83dc-11e3-baa7-0800200c9a66", + "ApplianceTypeURL": "logger", + "ApplianceInstanceCount": "2", + "ApplianceSpecURL": "http://some.place.com/mytypes/LoggerSpec.json", + "ApplianceSpec": { + "Name": "Logger", + "PolicyURL": "http://some.place.com/mytypes/LoggerPolicy.json", + "AccountingURL": "http://some.place.com/mytypes/LoggerAcct.json", + "CapsuleSpecURLs": [ + "http://some.place.com/mytypes/Logger.json", + "http://some.place.com/mytypes/ElasticSearch.json", + "http://some.place.com/mytypes/Kibana.json" + ] + } + } + } +] \ No newline at end of file diff --git a/test/fixtures/meshes/capsules_list.json b/test/fixtures/meshes/capsules_list.json new file mode 100644 index 00000000..f07ec953 --- /dev/null +++ b/test/fixtures/meshes/capsules_list.json @@ -0,0 +1,115 @@ +[ + { + "CapsuleSpec": { + "id": "1234", + "Name": "DemoSite", + "Url": "http://some.s3bucket.com/capsules/DemoSite.json", + "PolicyURL": "http://some.s3bucket.com/polcies/DemoSitePolicy.json", + "AccountingURL": "http://some.s3bucket.com/polcies/DemoSiteAcct.json", + "ImageURL": "tdhite/demosite", + "StartCMD": "/start.sh {{range $index, $peer := .NetworkPeers}} {{$peer.IPAddress}}:{{$peer.Port}} {{end}}", + "ServicePorts": [ + "80", "4136" + ], + "PeerImageURLs": [ + "tdhite/demosite", + "tdhite/mciaas", + "tdhite/etcd" + ], + "TunnelTo": [ + [], + [], + [ + { + "InternalPort": 8080, + "Type": "zebedee" + } + ] + ], + "VolumeSpecs": [ + { + "InternalPath": "/tmp", + "Size": "1M", + "EncryptionKey": "AAAAAA", + "EncryptionModel": "" + } + ] + } + }, + { + "CapsuleSpec": { + "id": "5678", + "Name": "ETCD", + "Url": "http://some.s3bucket.com/capsules/ETCD.json", + "PolicyURL": "http://some.s3bucket.com/polcies/ETCDPolicy.json", + "AccountingURL": "http://some.s3bucket.com/polcies/ETCDAcct.json", + "ImageURL": "tdhite/etcd", + "StartCMD": "/start.sh {{range $index, $peer := .NetworkPeers}} {{$peer.IPAddress}}:{{$peer.Port}} {{end}}", + "ServicePorts": [ + "80" + ], + "PeerImageURLs": [ + "tdhite/demosite", + "tdhite/mciaas", + "tdhite/etcd" + ], + "VolumeSpecs": [ + { + "InternalPath": "/tmp", + "Size": "1M", + "EncryptionKey": "AAAAAA", + "EncryptionModel": "" + } + ] + } + }, + { + "CapsuleSpec": { + "id": "0123", + "Name": "MCIAAS", + "Url": "http://some.s3bucket.com/capsules/MCIAAS.json", + "PolicyURL": "http://some.s3bucket.com/polcies/MCIAASPolicy.json", + "AccountingURL": "http://some.s3bucket.com/polcies/MSIAASAcct.json", + "ImageURL": "tdhite/mciaas", + "StartCMD": "/start.sh {{range $index, $peer := .NetworkPeers}} {{$peer.IPAddress}}:{{$peer.Port}} {{end}}", + "ServicePorts": [ + "80" + ], + "PeerImageURLs": [ + "tdhite/demosite", + "tdhite/mciaas", + "tdhite/etcd" + ], + "TunnelFrom": [ + [ + { + "InternalPort": 8080, + "Type": "zebedee" + } + ], + [], + [] + ], + "VolumeSpecs": [ + { + "InternalPath": "/tmp", + "Size": "1M", + "EncryptionKey": "AAAAAA", + "EncryptionModel": "" + }, + { + "InternalPath": "/dev", + "Size": "10M", + "EncryptionKey": "AAAAAA", + "EncryptionModel": "" + }, + { + "InternalPath": "/share", + "Size": "100M", + "EncryptionKey": "AAAAAA", + "EncryptionModel": "" + } + ] + } + } +] \ No newline at end of file diff --git a/test/fixtures/meshes/grids_list.json b/test/fixtures/meshes/grids_list.json new file mode 100644 index 00000000..7eb400f2 --- /dev/null +++ b/test/fixtures/meshes/grids_list.json @@ -0,0 +1,46 @@ +[ + { + "Grid": { + "id": "123", + "StackName": "Logger1-AWS-East", + "TemplateURL": "http://some.s3bucket.com/CFTemplates/Logger1-AWS-East.json", + "SSHKeyPair": "griduser", + "NodeCount": 5, + "InstanceType": "m3.large", + "CapacityOverview": { + "CPU": "10", + "Mem": "37.5", + "Disk": "160" + } + } + }, + { + "Grid": { + "id": "456", + "StackName": "csMesh1-AWS-East", + "TemplateURL": "http://some.s3bucket.com/CFTemplates/csMesh1-AWS-East.json", + "SSHKeyPair": "griduser", + "NodeCount": 2, + "InstanceType": "m1.small", + "CapacityOverview": { + "CPU": "2", + "Mem": "3.4", + "Disk": "320" + } + } + }, + { + "Grid": { + "id": "789", + "StackName": "csMesh2-AWS-East", + "TemplateURL": "http://some.s3bucket.com/CFTemplates/csMesh2-AWS-East.json", + "SSHKeyPair": "devuser", + "NodeCount": 2, + "InstanceType": "t1.micro", + "CapacityOverview": { + "CPU": "2", + "Mem": "1.226" + } + } + } +] \ No newline at end of file