From 846d589a7eb5c7c8b603bdd53a65ed7dbaefea42 Mon Sep 17 00:00:00 2001 From: Mohsen Azimi Date: Thu, 12 Mar 2015 10:05:04 -0700 Subject: [PATCH] Convert SwaggerUI.js and introduce JSHint --- .jshintignore | 2 + .jshintrc | 30 +++++ src/main/coffeescript/SwaggerUi.js | 190 +++++++++++++++++++++++++++++ 3 files changed, 222 insertions(+) create mode 100644 .jshintignore create mode 100644 .jshintrc create mode 100644 src/main/coffeescript/SwaggerUi.js diff --git a/.jshintignore b/.jshintignore new file mode 100644 index 00000000..90d45b85 --- /dev/null +++ b/.jshintignore @@ -0,0 +1,2 @@ +dist +lib \ No newline at end of file diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 00000000..8aa7d8a0 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,30 @@ +{ + "node": true, + "browser": true, + "esnext": true, + "bitwise": true, + "curly": true, + "eqeqeq": true, + "immed": true, + "indent": 2, + "latedef": false, + "newcap": true, + "noarg": true, + "quotmark": "single", + "regexp": true, + "undef": true, + "unused": true, + "strict": true, + "trailing": true, + "smarttabs": true, + "globals": { + "Backbone": false, + "_": false, + "$": false, + "marked": false, + "HeaderView": false, + "MainView": false, + "Docs": false, + "SwaggerClient": false + } +} \ No newline at end of file diff --git a/src/main/coffeescript/SwaggerUi.js b/src/main/coffeescript/SwaggerUi.js new file mode 100644 index 00000000..23cca68e --- /dev/null +++ b/src/main/coffeescript/SwaggerUi.js @@ -0,0 +1,190 @@ +'use strict'; + +var SwaggerUi = Backbone.Router.extend({ + + dom_id: 'swagger_ui', + + // Attributes + options: null, + api: null, + headerView: null, + mainView: null, + + // SwaggerUi accepts all the same options as SwaggerApi + initialize: function(options) { + options = options || {}; + + // Allow dom_id to be overridden + if (options.dom_id) { + this.dom_id = options.dom_id; + delete options.dom_id; + } + + if (!options.supportedSubmitMethods){ + options.supportedSubmitMethods = [ + 'get', + 'put', + 'post', + 'delete', + 'head', + 'options', + 'patch' + ]; + } + + // Create an empty div which contains the dom_id + if (! $('#' + this.dom_id)){ + $('body').append('
') ; + } + + this.options = options; + + // set marked options + marked.setOptions({gfm: true}); + + // Set the callbacks + this.options.success = function() { return this.render(); }; + this.options.progress = function(d) { return this.showMessage(d); }; + this.options.failure = function(d) { return this.onLoadFailure(d); }; + + // Create view to handle the header inputs + this.headerView = new HeaderView({el: $('#header')}); + + // Event handler for when the baseUrl/apiKey is entered by user + this.headerView.on('update-swagger-ui', function(data) { + return this.updateSwaggerUi(data); + }); + }, + + // Set an option after initializing + setOption: function(option, value) { + this.options[option] = value; + }, + + // Get the value of a previously set option + getOption(option) { + return this.options[option]; + }, + + // Event handler for when url/key is received from user + updateSwaggerUi: function(data){ + this.options.url = data.url; + this.load(); + }, + + // Create an api and render + load: function(){ + // Initialize the API object + if (this.mainView) { + this.mainView.clear(); + } + var url = this.options.url; + if (url && url.indexOf('http') !== 0) { + url = this.buildUrl(window.location.href.toString(), url); + } + + this.options.url = url; + this.headerView.update(url); + + this.api = new SwaggerClient(this.options); + }, + + // collapse all sections + collapseAll: function(){ + Docs.collapseEndpointListForResource(''); + }, + + // list operations for all sections + listAll: function(){ + Docs.collapseOperationsForResource(''); + }, + + // expand operations for all sections + expandAll: function(){ + Docs.expandOperationsForResource(''); + }, + + // This is bound to success handler for SwaggerApi + // so it gets called when SwaggerApi completes loading + render: function(){ + this.showMessage('Finished Loading Resource Information. Rendering Swagger UI...'); + this.mainView = new MainView({ + model: this.api, + el: $('#' + this.dom_id), + swaggerOptions: this.options + }).render(); + this.showMessage(); + switch (this.options.docExpansion) { + case 'full': + this.expandAll(); break; + case 'list': + this.listAll(); break; + default: + break; + } + this.renderGFM(); + + if (this.options.onComplete){ + this.options.onComplete(this.api, this); + } + + setTimeout(Docs.shebang.bind(this), 100); + }, + + buildUrl: function(base, url){ + if (url.indexOf('/') === 0) { + var parts = base.split('/'); + base = parts[0] + '//' + parts[2]; + return base + url; + } else { + var endOfPath = base.length; + + if (base.indexOf('?') > -1){ + endOfPath = Math.min(endOfPath, base.indexOf('?')); + } + + if (base.indexOf('#') > -1){ + endOfPath = Math.min(endOfPath, base.indexOf('#')); + } + + base = base.substring(0, endOfPath); + + if (base.indexOf('/', base.length - 1 ) !== -1){ + return base + url; + } + + return base + '/' + url; + } + }, + + // Shows message on topbar of the ui + showMessage: function(data = ''){ + $('#message-bar').removeClass('message-fail'); + $('#message-bar').addClass('message-success'); + $('#message-bar').html(data); + }, + + // shows message in red + onLoadFailure: function(data = ''){ + $('#message-bar').removeClass('message-success'); + $('#message-bar').addClass('message-fail'); + + var val = $('#message-bar').html(data); + + if (this.options.onFailure) { + this.options.onFailure(data); + } + + return val; + }, + + // Renders GFM for elements with 'markdown' class + renderGFM: function(){ + $('.markdown').each(function(){ + $(this).html(marked($(this).html())); + }); + } + +}); + +window.SwaggerUi = SwaggerUi; \ No newline at end of file