UNPKG

arrow-admin

Version:
315 lines (286 loc) 9.84 kB
/* global LANGUAGES */ /* global ace */ define(['loader','jquery'], function (Loader, $){ return function(sub){ $('body').removeClass('collapsed'); return new Loader('docs' + (sub ? '/' + sub : ''), true, function(){ var c, el, containers = {}, languages = [], _LANGUAGES = typeof(LANGUAGES)==='object' ? LANGUAGES : []; function activateLanguage(language) { if (!language) { return; } if (language === "") { return; } for (var c=0;c<languages.length;c++) { var lang = languages[c]; if (lang === language) { $('.'+languages[c]).show(); } else { $('.'+languages[c]).hide(); } } $(".lang a").removeClass('active'); $(".lang a[data-language-name='" + language + "']").addClass('active'); for (var i=0; i < languages.length; i++) { $(".highlight." + languages[i]).hide(); } $(".highlight." + language).show(); localStorage.setItem("language", language); } function setupLanguages(l) { languages = l; var lang = localStorage.getItem("language") || l[0]; activateLanguage(lang); } var toolbar = '<div class="toolbar lang"><ul>', toolbarSelector=[]; for (c=0;c<_LANGUAGES.length;c++) { var lang = _LANGUAGES[c].replace(/\./,'-'), sel = 'blockquote.unformat > h3[id^=heading-'+lang+']'; $(sel).parent().addClass('language').addClass(lang); toolbarSelector.push('pre.highlight.'+lang); toolbar+='<li><a href="" data-language-name="'+lang+'">'+_LANGUAGES[c].replace(/-/g,'.')+'</a></li>'; } toolbar+='</ul></div>'; $(toolbarSelector.join(',')).each(function(){ var pre = $(this); pre.append(toolbar); for (var c=0;c<_LANGUAGES.length;c++) { var lang = _LANGUAGES[c].replace(/\./,'-'); if (pre.hasClass(lang)) { pre.find('a[data-language-name='+lang+']').addClass('active'); } } }); $('.lang a').on('click',function(){ activateLanguage($(this).data("language-name")); return false; }); // join together blockquote and code as one big block $('blockquote.unformat + pre.highlight').prev().addClass('noborder'); $('blockquote.unformat + pre.highlight div.toolbar').each(function(){ var el = $(this).parent('pre.highlight').prev('blockquote.unformat'); // move it to the blockquote el.append($(this)); }); setupLanguages(_LANGUAGES); function createTestAPI(button) { return function() { var config = JSON.parse(decodeURI(button.attr('opts'))); // console.log('config=>',config); var opts = {}; opts.method = config.method || 'GET'; opts.url = config.url; opts.body = {}; for (var k in config.headers) { if (opts['header-name'] && k in opts['header-name']) { opts['header-name'].push(k); opts['header-value'].push(config.headers[k]); } else { opts['header-name'] = [k]; opts['header-value'] = [config.headers[k]]; } } var id = button.attr('id'), elems = $('input[for-api='+id+'],pre[for-api='+id+'] textarea'), body = {}, keys = 0, json = null, bad; $('p[for=' + id + '],code[for=' + id + ']').remove(); elems.each(function(){ if (bad) { return; } el = $(this); var name = el.attr('name'), val = el.val(); if (el.get(0).nodeName==='TEXTAREA') { json = JSON.parse(containers[id].getValue()); } else { if (opts.method.toUpperCase() === 'GET' && -1 === opts.url.indexOf(':' + name)) { if (val) { opts.url += ((-1 === opts.url.indexOf('?')) ? '?' : '&') + name + '=' + encodeURIComponent(val); } } else { opts.body[name] = val; keys++; } } }); if (!keys) { delete opts.body; } else if (!bad) { var a = document.createElement('a'); a.href = opts.url; opts.url = a.origin + a.pathname.replace(/:(\w+)/g, function(re){ var n = re.substring(1), v = opts.body[n], optional = config.pathParams && config.pathParams[n] && config.pathParams[n].optional; // console.log('n=',n,v,optional); if (!v && !optional) { bad = 'Missing required path parameter: '+n; } else { delete opts.body[n]; keys--; return v; } }); if (a.search) { opts.url += a.search; } if (!keys) { delete opts.body; } } if (bad) { var html = '<p for="'+id+'"><span style="color:#900"><span class="error"></span> Error</span>'; html+='<p for="'+id+'" class="api-result"><code for="'+id+'">'+bad+'</code></p>'; html+='</p>'; button.after(html); return; } if (json) { opts.body = json; } // console.log(opts); button.button('loading'); opts.accepts = $('#select_'+id).val(); var adminIndex = ADMIN_URL.indexOf('://'); adminIndex = ADMIN_URL.indexOf('/', adminIndex+3); // make sure we're on the same domain so we don't get a cross domain error var adminURL = document.location.protocol + '//' + document.location.host + ADMIN_URL.substring(adminIndex); $.ajax({ url: adminURL, type: 'post', data: JSON.stringify(opts), dataType: 'json', contentType: 'application/json', error: function(ajax, status, error) { button.button('reset'); var response = ajax.responseJSON && JSON.stringify(ajax.responseJSON,null,2) || ajax.responseText || 'Error connecting to: '+adminURL; var html = '<p for="'+id+'"><span style="color:#900"><span class="error"></span> '+status+': '+error+'</span>'; html+='<p for="'+id+'" class="api-result"><code for="'+id+'">'+response+'</code>'; html+='</p>'; button.after(html); }, success: function(data){ button.button('reset'); var html = '<p for="'+id+'">', nodata, type = data && data.response && data.response.headers['content-type'], statusCode = data.response.statusCode; if (statusCode === 200) { html+='<span style="color:#090"><span class="success"></span> 200 OK</span>, '; } else if (statusCode > 200 && statusCode < 300) { nodata = true; html+='<span style="color:#090"><span class="success"></span> '+statusCode+'</span>, '; } else if (statusCode === 301 || statusCode === 302) { html+='<span style="color:#090"><span class="success"></span> '+statusCode+'</span>, '; } else { html+='<span style="color:#900"><span class="error"></span> '+(statusCode)+'</span>, '; } if (data.response.headers.location) { nodata = false; data.body_html = 'Location: ' + data.response.headers.location; } html+=data.responseTime+' ms, '; html+=(data.responseSize || 0)+' bytes' + (type?(', '+type):''); if (!nodata) { html+='<p for="'+id+'" class="api-result"><code for="'+id+'">'+data.body_html+'</code></p>'; } html+='</p>'; button.parent().after(html); } }); }; } if (typeof(APIDocOnly)==='undefined') { $('input[replace-with-textarea]').each(function(){ var el = $(this); var html = '<textarea id="'+el.attr('for-api')+'_body" name="body" for-api="'+el.attr('for-api')+'" rows="10" class="'+el.attr('class')+'"></textarea>'; el.replaceWith(html); }); var testable = window.location.protocol!=='file:'; testable=true; if (!testable) { // hide the test $('#api-test, #heading-api-test').hide().next().hide(); $('input.api-button').hide(); } else { // wire up all the test api buttons $('input.api-button').each(function(){ var button = $(this); var fn = createTestAPI(button); button.click(fn); }); } // setup the editors for each textarea $('textarea.api').each(function(){ var e = $(this), el = e.get(0), api = e.attr('for-api'), btn = $('#'+api), model = decodeURIComponent($('#'+api).attr('model')), label = $('label[for='+api+'_body]'); if (!model) { // if we don't have a model, we don't show the textfield label.hide(); return e.hide(); } else { label.show(); e.show(); } var editor = ace.edit(el); editor.setTheme("ace/theme/monokai"); editor.getSession().setMode("ace/mode/json"); editor.getSession().on('changeAnnotation',function(o,p){ // if we have annotations, we have problems - disable button then btn.get(0).disabled = p && p.$annotations && p.$annotations.length; }); containers[api] = editor; $(editor.container).attr('for-api',api); editor.getSession().setValue(model); }); $('div.api-panel .panel-body').each(function(){ var el = $(this); var p = el.find('input.api-button'); var html = '<label class="col-sm-2 text-left">Result format</label>'; html+='<div class="col-sm-10 select">'; html+='<select id="select_'+p.attr('id')+'">'; html+='<option value="text/json">JSON</option>'; html+='<option value="text/xml">XML</option>'; html+='<option value="text/yaml">YAML</option>'; html+='<option value="text/csv">CSV</option>'; html+='<option value="text/plain">TXT</option>'; html+='</select>'; html+='</div>'; el.prepend(html); }); $('input.api-clear').each(function(){ var el = $(this), api = el.data('for'), target = $('#'+api); el.click(function(){ var model = decodeURIComponent(target.attr('model')), editor = containers[api]; editor.getSession().setValue(model); $("p[for="+api+"]").remove(); }); }); } }); }; });