arrow-admin
Version:
Arrow Admin Website
315 lines (286 loc) • 9.84 kB
JavaScript
/* 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();
});
});
}
});
};
});