'use strict'; SwaggerUi.Views.OperationView = Backbone.View.extend({ invocationUrl: null, events: { 'submit .sandbox' : 'submitOperation', 'click .submit' : 'submitOperation', 'click .response_hider' : 'hideResponse', 'click .toggleOperation' : 'toggleOperationContent', 'mouseenter .api-ic' : 'mouseEnter', 'dblclick .curl' : 'selectText', }, initialize: function(opts) { opts = opts || {}; this.router = opts.router; this.auths = opts.auths; this.parentId = this.model.parentId; this.nickname = this.model.nickname; this.model.encodedParentId = encodeURIComponent(this.parentId); return this; }, selectText: function(event) { var doc = document, text = event.target.firstChild, range, selection; if (doc.body.createTextRange) { range = document.body.createTextRange(); range.moveToElementText(text); range.select(); } else if (window.getSelection) { selection = window.getSelection(); range = document.createRange(); range.selectNodeContents(text); selection.removeAllRanges(); selection.addRange(range); } }, mouseEnter: function(e) { var elem = $(this.el).find('.content'); var x = e.pageX; var y = e.pageY; var scX = $(window).scrollLeft(); var scY = $(window).scrollTop(); var scMaxX = scX + $(window).width(); var scMaxY = scY + $(window).height(); var wd = elem.width(); var hgh = elem.height(); if (x + wd > scMaxX) { x = scMaxX - wd; } if (x < scX) { x = scX; } if (y + hgh > scMaxY) { y = scMaxY - hgh; } if (y < scY) { y = scY; } var pos = {}; pos.top = y; pos.left = x; elem.css(pos); }, // Note: copied from CoffeeScript compiled file // TODO: redactor render: function() { var a, auth, auths, code, contentTypeModel, isMethodSubmissionSupported, k, key, l, len, len1, len2, len3, len4, m, modelAuths, n, o, p, param, q, ref, ref1, ref2, ref3, ref4, ref5, responseContentTypeView, responseSignatureView, schema, schemaObj, scopeIndex, signatureModel, statusCode, successResponse, type, v, value; isMethodSubmissionSupported = jQuery.inArray(this.model.method, this.model.supportedSubmitMethods()) >= 0; if (!isMethodSubmissionSupported) { this.model.isReadOnly = true; } this.model.description = this.model.description || this.model.notes; this.model.oauth = null; modelAuths = this.model.authorizations || this.model.security; if (modelAuths) { if (Array.isArray(modelAuths)) { for (l = 0, len = modelAuths.length; l < len; l++) { auths = modelAuths[l]; for (key in auths) { for (a in this.auths) { auth = this.auths[a]; if (key === auth.name) { if (auth.type === 'oauth2') { this.model.oauth = {}; this.model.oauth.scopes = []; ref1 = auth.value.scopes; for (k in ref1) { v = ref1[k]; scopeIndex = auths[key].indexOf(k); if (scopeIndex >= 0) { o = { scope: k, description: v }; this.model.oauth.scopes.push(o); } } } } } } } } else { for (k in modelAuths) { v = modelAuths[k]; if (k === 'oauth2') { if (this.model.oauth === null) { this.model.oauth = {}; } if (this.model.oauth.scopes === void 0) { this.model.oauth.scopes = []; } for (m = 0, len1 = v.length; m < len1; m++) { o = v[m]; this.model.oauth.scopes.push(o); } } } } } if (typeof this.model.responses !== 'undefined') { this.model.responseMessages = []; ref2 = this.model.responses; for (code in ref2) { value = ref2[code]; schema = null; schemaObj = this.model.responses[code].schema; if (schemaObj && schemaObj.$ref) { schema = schemaObj.$ref; if (schema.indexOf('#/definitions/') === 0) { schema = schema.substring('#/definitions/'.length); } } this.model.responseMessages.push({ code: code, message: value.description, responseModel: schema }); } } if (typeof this.model.responseMessages === 'undefined') { this.model.responseMessages = []; } signatureModel = null; if (this.model.successResponse) { successResponse = this.model.successResponse; for (key in successResponse) { value = successResponse[key]; this.model.successCode = key; if (typeof value === 'object' && typeof value.createJSONSample === 'function') { signatureModel = { sampleJSON: JSON.stringify(value.createJSONSample(), void 0, 2), isParam: false, signature: value.getMockSignature() }; } } } else if (this.model.responseClassSignature && this.model.responseClassSignature !== 'string') { signatureModel = { sampleJSON: this.model.responseSampleJSON, isParam: false, signature: this.model.responseClassSignature }; } var opts = this.options.swaggerOptions; if (opts.showRequestHeaders) { this.model.showRequestHeaders = true; } $(this.el).html(Handlebars.templates.operation(this.model)); if (signatureModel) { responseSignatureView = new SwaggerUi.Views.SignatureView({ model: signatureModel, router: this.router, tagName: 'div' }); $('.model-signature', $(this.el)).append(responseSignatureView.render().el); } else { this.model.responseClassSignature = 'string'; $('.model-signature', $(this.el)).html(this.model.type); } contentTypeModel = { isParam: false }; contentTypeModel.consumes = this.model.consumes; contentTypeModel.produces = this.model.produces; ref3 = this.model.parameters; for (n = 0, len2 = ref3.length; n < len2; n++) { param = ref3[n]; type = param.type || param.dataType || ''; if (typeof type === 'undefined') { schema = param.schema; if (schema && schema.$ref) { ref = schema.$ref; if (ref.indexOf('#/definitions/') === 0) { type = ref.substring('#/definitions/'.length); } else { type = ref; } } } if (type && type.toLowerCase() === 'file') { if (!contentTypeModel.consumes) { contentTypeModel.consumes = 'multipart/form-data'; } } param.type = type; } responseContentTypeView = new SwaggerUi.Views.ResponseContentTypeView({ model: contentTypeModel, router: this.router }); $('.response-content-type', $(this.el)).append(responseContentTypeView.render().el); ref4 = this.model.parameters; for (p = 0, len3 = ref4.length; p < len3; p++) { param = ref4[p]; this.addParameter(param, contentTypeModel.consumes); } ref5 = this.model.responseMessages; for (q = 0, len4 = ref5.length; q < len4; q++) { statusCode = ref5[q]; this.addStatusCode(statusCode); } return this; }, addParameter: function(param, consumes) { // Render a parameter param.consumes = consumes; var paramView = new SwaggerUi.Views.ParameterView({ model: param, tagName: 'tr', readOnly: this.model.isReadOnly }); $('.operation-params', $(this.el)).append(paramView.render().el); }, addStatusCode: function(statusCode) { // Render status codes var statusCodeView = new SwaggerUi.Views.StatusCodeView({ model: statusCode, tagName: 'tr', router: this.router }); $('.operation-status', $(this.el)).append(statusCodeView.render().el); }, // Note: copied from CoffeeScript compiled file // TODO: redactor submitOperation: function(e) { var error_free, form, isFileUpload, map, opts; if (e !== null) { e.preventDefault(); } form = $('.sandbox', $(this.el)); error_free = true; form.find('input.required').each(function() { $(this).removeClass('error'); if (jQuery.trim($(this).val()) === '') { $(this).addClass('error'); $(this).wiggle({ callback: (function(_this) { return function() { $(_this).focus(); }; })(this) }); error_free = false; } }); form.find('textarea.required').each(function() { $(this).removeClass('error'); if (jQuery.trim($(this).val()) === '') { $(this).addClass('error'); $(this).wiggle({ callback: (function(_this) { return function() { return $(_this).focus(); }; })(this) }); error_free = false; } }); form.find('select.required').each(function() { $(this).removeClass('error'); if (this.selectedIndex === -1) { $(this).addClass('error'); $(this).wiggle({ callback: (function(_this) { return function() { $(_this).focus(); }; })(this) }); error_free = false; } }); if (error_free) { map = this.getInputMap(form); isFileUpload = this.isFileUpload(form); opts = { parent: this }; if (this.options.swaggerOptions) { for(var key in this.options.swaggerOptions) { opts[key] = this.options.swaggerOptions[key]; } } opts.responseContentType = $('div select[name=responseContentType]', $(this.el)).val(); opts.requestContentType = $('div select[name=parameterContentType]', $(this.el)).val(); $('.response_throbber', $(this.el)).show(); if (isFileUpload) { $('.request_url', $(this.el)).html('
'); $('.request_url pre', $(this.el)).text(this.invocationUrl); opts.useJQuery = true; map.parameterContentType = 'multipart/form-data'; return this.model.execute(map, opts, this.showCompleteStatus, this.showErrorStatus, this); } else { this.map = map; return this.model.execute(map, opts, this.showCompleteStatus, this.showErrorStatus, this); } } }, getInputMap: function (form) { var map, ref1, l, len, o, ref2, m, len1, val, ref3, n, len2; map = {}; ref1 = form.find('input'); for (l = 0, len = ref1.length; l < len; l++) { o = ref1[l]; if ((o.value !== null) && jQuery.trim(o.value).length > 0) { map[o.name] = o.value; } if (o.type === 'file') { map[o.name] = o.files[0]; } } ref2 = form.find('textarea'); for (m = 0, len1 = ref2.length; m < len1; m++) { o = ref2[m]; val = this.getTextAreaValue(o); if ((val !== null) && jQuery.trim(val).length > 0) { map[o.name] = val; } } ref3 = form.find('select'); for (n = 0, len2 = ref3.length; n < len2; n++) { o = ref3[n]; val = this.getSelectedValue(o); if ((val !== null) && jQuery.trim(val).length > 0) { map[o.name] = val; } } return map; }, isFileUpload: function (form) { var ref1, l, len, o; var isFileUpload = false; ref1 = form.find('input'); for (l = 0, len = ref1.length; l < len; l++) { o = ref1[l]; if (o.type === 'file') { isFileUpload = true; } } return isFileUpload; }, success: function(response, parent) { parent.showCompleteStatus(response); }, // wraps a jquery response as a shred response wrap: function(data) { var h, headerArray, headers, i, l, len, o; headers = {}; headerArray = data.getAllResponseHeaders().split('\r'); for (l = 0, len = headerArray.length; l < len; l++) { i = headerArray[l]; h = i.match(/^([^:]*?):(.*)$/); if (!h) { h = []; } h.shift(); if (h[0] !== void 0 && h[1] !== void 0) { headers[h[0].trim()] = h[1].trim(); } } o = {}; o.content = {}; o.content.data = data.responseText; o.headers = headers; o.request = {}; o.request.url = this.invocationUrl; o.status = data.status; return o; }, getSelectedValue: function(select) { if (!select.multiple) { return select.value; } else { var options = []; for (var l = 0, len = select.options.length; l < len; l++) { var opt = select.options[l]; if (opt.selected) { options.push(opt.value); } } if (options.length > 0) { return options; } else { return null; } } }, // handler for hide response link hideResponse: function(e) { if (e) { e.preventDefault(); } $('.response', $(this.el)).slideUp(); $('.response_hider', $(this.el)).fadeOut(); }, // Show response from server showResponse: function(response) { var prettyJson = JSON.stringify(response, null, '\t').replace(/\n/g, '').text('no content');
pre = $('').append(code);
// JSON
} else if (contentType === 'application/json' || /\+json$/.test(contentType)) {
var json = null;
try {
json = JSON.stringify(JSON.parse(content), null, ' ');
} catch (_error) {
json = 'can\'t parse JSON. Raw result:\n\n' + content;
}
code = $('').text(json);
pre = $('').append(code);
// XML
} else if (contentType === 'application/xml' || /\+xml$/.test(contentType)) {
code = $('').text(this.formatXml(content));
pre = $('').append(code);
// HTML
} else if (contentType === 'text/html') {
code = $('').html(_.escape(content));
pre = $('').append(code);
// Plain Text
} else if (/text\/plain/.test(contentType)) {
code = $('').text(content);
pre = $('').append(code);
// Image
} else if (/^image\//.test(contentType)) {
pre = $('