First commit of the V2.

New base, new info.
This commit is contained in:
2019-04-18 00:58:59 +02:00
parent 698b6dd865
commit 31d5f7ade4
185 changed files with 32824 additions and 0 deletions

View File

@ -0,0 +1,321 @@
var responseDisplay = 'data'
var coreapi = window.coreapi
var schema = window.schema
function normalizeKeys (arr) {
var _normarr = [];
for (var i = 0; i < arr.length; i++) {
_normarr = _normarr.concat(arr[i].split(' > '));
}
return _normarr;
}
function normalizeHTTPHeader (str) {
// Capitalize HTTP headers for display.
return (str.charAt(0).toUpperCase() + str.substring(1))
.replace(/-(.)/g, function ($1) {
return $1.toUpperCase()
})
.replace(/(Www)/g, function ($1) {
return 'WWW'
})
.replace(/(Xss)/g, function ($1) {
return 'XSS'
})
.replace(/(Md5)/g, function ($1) {
return 'MD5'
})
}
function formEntries (form) {
// Polyfill for new FormData(form).entries()
var formData = new FormData(form)
if (formData.entries !== undefined) {
return Array.from(formData.entries())
}
var entries = []
for (var i = 0; i < form.elements.length; i++) {
var element = form.elements[i]
if (!element.name) {
continue
}
if (element.type === 'file') {
for (var j = 0; j < element.files.length; j++) {
entries.push([element.name, element.files[j]])
}
} else if (element.type === 'select-multiple' || element.type === 'select-one') {
for (var j = 0; j < element.selectedOptions.length; j++) {
entries.push([element.name, element.selectedOptions[j].value])
}
} else if (element.type === 'checkbox') {
if (element.checked) {
entries.push([element.name, element.value])
}
} else {
entries.push([element.name, element.value])
}
}
return entries
}
$(function () {
var $selectedAuthentication = $('#selected-authentication')
var $authControl = $('#auth-control')
var $authTokenModal = $('#auth_token_modal')
var $authBasicModal = $('#auth_basic_modal')
var $authSessionModal = $('#auth_session_modal')
// Language Control
$('#language-control li').click(function (event) {
event.preventDefault()
var $languageMenuItem = $(this).find('a')
var $languageControls = $(this).closest('ul').find('li')
var $languageControlLinks = $languageControls.find('a')
var language = $languageMenuItem.data('language')
$languageControlLinks.not('[data-language="' + language + '"]').parent().removeClass('active')
$languageControlLinks.filter('[data-language="' + language + '"]').parent().addClass('active')
$('#selected-language').text(language)
var $codeBlocks = $('pre.highlight')
$codeBlocks.not('[data-language="' + language + '"]').addClass('hide')
$codeBlocks.filter('[data-language="' + language + '"]').removeClass('hide')
})
// API Explorer
$('form.api-interaction').submit(function (event) {
event.preventDefault()
var $form = $(this).closest('form')
var $requestMethod = $form.find('.request-method')
var $requestUrl = $form.find('.request-url')
var $toggleView = $form.closest('.modal-content').find('.toggle-view')
var $responseStatusCode = $form.find('.response-status-code')
var $meta = $form.find('.meta')
var $responseRawResponse = $form.find('.response-raw-response')
var $requestAwaiting = $form.find('.request-awaiting')
var $responseRaw = $form.find('.response-raw')
var $responseData = $form.find('.response-data')
var key = normalizeKeys($form.data('key'))
var params = {}
var entries = formEntries($form.get()[0])
for (var i = 0; i < entries.length; i++) {
var entry = entries[i]
var paramKey = entry[0]
var paramValue = entry[1]
var $elem = $form.find('[name="' + paramKey + '"]')
var dataType = $elem.data('type') || 'string'
if (dataType === 'integer' && paramValue) {
var value = parseInt(paramValue)
if (!isNaN(value)) {
params[paramKey] = value
}
} else if (dataType === 'number' && paramValue) {
var value = parseFloat(paramValue)
if (!isNaN(value)) {
params[paramKey] = value
}
} else if (dataType === 'boolean' && paramValue) {
var value = {
'true': true,
'false': false
}[paramValue.toLowerCase()]
if (value !== undefined) {
params[paramKey] = value
}
} else if (dataType === 'array' && paramValue) {
try {
params[paramKey] = JSON.parse(paramValue)
} catch (err) {
// Ignore malformed JSON
}
} else if (dataType === 'object' && paramValue) {
try {
params[paramKey] = JSON.parse(paramValue)
} catch (err) {
// Ignore malformed JSON
}
} else if (dataType === 'string' && paramValue) {
params[paramKey] = paramValue
}
}
$form.find(':checkbox').each(function (index) {
// Handle unselected checkboxes
var name = $(this).attr('name')
if (!params.hasOwnProperty(name)) {
params[name] = false
}
})
function requestCallback (request) {
// Fill in the "GET /foo/" display.
var parser = document.createElement('a')
parser.href = request.url
var method = request.options.method
var path = parser.pathname + parser.hash + parser.search
$requestMethod.text(method)
$requestUrl.text(path)
}
function responseCallback (response, responseText) {
// Display the 'Data'/'Raw' control.
$toggleView.removeClass('hide')
// Fill in the "200 OK" display.
$responseStatusCode.removeClass('label-success').removeClass('label-danger')
if (response.ok) {
$responseStatusCode.addClass('label-success')
} else {
$responseStatusCode.addClass('label-danger')
}
$responseStatusCode.text(response.status)
$meta.removeClass('hide')
// Fill in the Raw HTTP response display.
var panelText = 'HTTP/1.1 ' + response.status + ' ' + response.statusText + '\n'
response.headers.forEach(function (header, key) {
panelText += normalizeHTTPHeader(key) + ': ' + header + '\n'
})
if (responseText) {
panelText += '\n' + responseText
}
$responseRawResponse.text(panelText)
}
// Instantiate a client to make the outgoing request.
var options = {
requestCallback: requestCallback,
responseCallback: responseCallback
}
// Setup authentication options.
if (window.auth && window.auth.type === 'token') {
// Header authentication
options.auth = new coreapi.auth.TokenAuthentication({
scheme: window.auth.scheme,
token: window.auth.token
})
} else if (window.auth && window.auth.type === 'basic') {
// Basic authentication
options.auth = new coreapi.auth.BasicAuthentication({
username: window.auth.username,
password: window.auth.password
})
} else if (window.auth && window.auth.type === 'session') {
// Session authentication
options.auth = new coreapi.auth.SessionAuthentication({
csrfCookieName: 'csrftoken',
csrfHeaderName: 'X-CSRFToken'
})
}
var client = new coreapi.Client(options)
client.action(schema, key, params).then(function (data) {
var response = JSON.stringify(data, null, 2)
$requestAwaiting.addClass('hide')
$responseRaw.addClass('hide')
$responseData.addClass('hide').text('').jsonView(response)
if (responseDisplay === 'data') {
$responseData.removeClass('hide')
} else {
$responseRaw.removeClass('hide')
}
}).catch(function (error) {
var response = JSON.stringify(error.content, null, 2)
$requestAwaiting.addClass('hide')
$responseRaw.addClass('hide')
$responseData.addClass('hide').text('').jsonView(response)
if (responseDisplay === 'data') {
$responseData.removeClass('hide')
} else {
$responseRaw.removeClass('hide')
}
})
})
// 'Data'/'Raw' control
$('.toggle-view button').click(function () {
var $modalContent = $(this).closest('.modal-content')
var $modalResponseRaw = $modalContent.find('.response-raw')
var $modalResponseData = $modalContent.find('.response-data')
responseDisplay = $(this).data('display-toggle')
$(this).removeClass('btn-default').addClass('btn-info').siblings().removeClass('btn-info')
if (responseDisplay === 'raw') {
$modalResponseRaw.removeClass('hide')
$modalResponseData.addClass('hide')
} else {
$modalResponseData.removeClass('hide')
$modalResponseRaw.addClass('hide')
}
})
// Authentication: none
$authControl.find("[data-auth='none']").click(function (event) {
event.preventDefault()
window.auth = null
$selectedAuthentication.text('none')
$authControl.find("[data-auth]").closest('li').removeClass('active')
$authControl.find("[data-auth='none']").closest('li').addClass('active')
})
// Authentication: token
$('form.authentication-token-form').submit(function (event) {
event.preventDefault()
var $form = $(this).closest('form')
var scheme = $form.find('input#scheme').val()
var token = $form.find('input#token').val()
window.auth = {
'type': 'token',
'scheme': scheme,
'token': token
}
$selectedAuthentication.text('token')
$authControl.find("[data-auth]").closest('li').removeClass('active')
$authControl.find("[data-auth='token']").closest('li').addClass('active')
$authTokenModal.modal('hide')
})
// Authentication: basic
$('form.authentication-basic-form').submit(function (event) {
event.preventDefault()
var $form = $(this).closest('form')
var username = $form.find('input#username').val()
var password = $form.find('input#password').val()
window.auth = {
'type': 'basic',
'username': username,
'password': password
}
$selectedAuthentication.text('basic')
$authControl.find("[data-auth]").closest('li').removeClass('active')
$authControl.find("[data-auth='basic']").closest('li').addClass('active')
$authBasicModal.modal('hide')
})
// Authentication: session
$('form.authentication-session-form').submit(function (event) {
event.preventDefault()
window.auth = {
'type': 'session'
}
$selectedAuthentication.text('session')
$authControl.find("[data-auth]").closest('li').removeClass('active')
$authControl.find("[data-auth='session']").closest('li').addClass('active')
$authSessionModal.modal('hide')
})
})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,7 @@
/**
* jquery.json-view - jQuery collapsible JSON plugin
* @version v1.0.0
* @link http://github.com/bazh/jquery.json-view
* @license MIT
*/
!function(e){"use strict";var n=function(n){var a=e("<span />",{"class":"collapser",on:{click:function(){var n=e(this);n.toggleClass("collapsed");var a=n.parent().children(".block"),p=a.children("ul");n.hasClass("collapsed")?(p.hide(),a.children(".dots, .comments").show()):(p.show(),a.children(".dots, .comments").hide())}}});return n&&a.addClass("collapsed"),a},a=function(a,p){var t=e.extend({},{nl2br:!0},p),r=function(e){return e.toString()?e.toString().replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;"):""},s=function(n,a){return e("<span />",{"class":a,html:r(n)})},l=function(a,p){switch(e.type(a)){case"object":p||(p=0);var c=e("<span />",{"class":"block"}),d=Object.keys(a).length;if(!d)return c.append(s("{","b")).append(" ").append(s("}","b"));c.append(s("{","b"));var i=e("<ul />",{"class":"obj collapsible level"+p});return e.each(a,function(a,t){d--;var r=e("<li />").append(s('"',"q")).append(a).append(s('"',"q")).append(": ").append(l(t,p+1));-1===["object","array"].indexOf(e.type(t))||e.isEmptyObject(t)||r.prepend(n()),d>0&&r.append(","),i.append(r)}),c.append(i),c.append(s("...","dots")),c.append(s("}","b")),c.append(1===Object.keys(a).length?s("// 1 item","comments"):s("// "+Object.keys(a).length+" items","comments")),c;case"array":p||(p=0);var d=a.length,c=e("<span />",{"class":"block"});if(!d)return c.append(s("[","b")).append(" ").append(s("]","b"));c.append(s("[","b"));var i=e("<ul />",{"class":"obj collapsible level"+p});return e.each(a,function(a,t){d--;var r=e("<li />").append(l(t,p+1));-1===["object","array"].indexOf(e.type(t))||e.isEmptyObject(t)||r.prepend(n()),d>0&&r.append(","),i.append(r)}),c.append(i),c.append(s("...","dots")),c.append(s("]","b")),c.append(1===a.length?s("// 1 item","comments"):s("// "+a.length+" items","comments")),c;case"string":if(a=r(a),/^(http|https|file):\/\/[^\s]+$/i.test(a))return e("<span />").append(s('"',"q")).append(e("<a />",{href:a,text:a})).append(s('"',"q"));if(t.nl2br){var o=/\n/g;o.test(a)&&(a=(a+"").replace(o,"<br />"))}var u=e("<span />",{"class":"str"}).html(a);return e("<span />").append(s('"',"q")).append(u).append(s('"',"q"));case"number":return s(a.toString(),"num");case"undefined":return s("undefined","undef");case"null":return s("null","null");case"boolean":return s(a?"true":"false","bool")}};return l(a)};return e.fn.jsonView=function(n,p){var t=e(this);if(p=e.extend({},{nl2br:!0},p),"string"==typeof n)try{n=JSON.parse(n)}catch(r){}return t.append(e("<div />",{"class":"json-view"}).append(a(n,p))),t}}(jQuery);