123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- 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) || (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')
- })
- })
|