autocode-cli
Version:
code automation for every language, framework and platform
1,810 lines (1,624 loc) • 101 kB
JavaScript
jQuery.fn.extend({
visibleWidth: function() {
var o = $(this);
if (o.is(':hidden')) {
return 0;
} else {
return o.outerWidth();
}
}
});
var autocode = {
action: {},
config: {},
data: {
current: {}
},
state: {},
user: {},
initState: function() {
$('a').each(function() {
if ($(this).data('state')) {
return;
}
$(this).data('state', true);
if (navigator.userAgent.match(/mobile/i)) {
$(this).bind({
touchstart: function() {
$(window).removeData('scrolled');
},
touchend: function(e) {
if ($(window).data('scrolled')) {
return false;
}
return autocode.initStateCallback(e, $(this));
}
});
} else {
$(this).click(autocode.initStateCallback);
}
});
},
initStateCallback: function(e, o) {
var o = o || $(this);
var href = o.attr('href');
if (!href) {
return false;
} else if (href.match(/^https?:/)) {
return true;
}
var query = href.split('?');
href = query[0];
query = autocode.query.search(query[1]);
e.preventDefault();
var action = autocode.state[href];
if (action) {
$('input:focus').blur();
action(query);
history.pushState(null, null, '#' + href);
autocode.initState();
}
if (autocode.listener.listeners[href]) {
for (var listener_name in autocode.listener.listeners[href]) {
autocode.listener.listeners[href][listener_name](query);
}
}
autocode.resize.all();
return false;
}
};
$(window).load(autocode.init);
$(window).resize(autocode.resize);;autocode.api = {
url: null,
ajax: function(opts) {
opts.url = autocode.api.url + opts.uri;
var ajax = {
contentType: 'application/json',
dataType: 'json',
method: opts.method,
url: opts.url,
complete: opts.complete,
error: opts.error,
success: opts.success,
xhrFields: {
withCredentials: true
}
};
if (opts.data) {
if (opts.method == 'get') {
for (var name in opts.data) {
if (ajax.url.match(/\?/)) {
ajax.url += '&';
} else {
ajax.url += '?';
}
ajax.url += name + '=' + opts.data[name];
}
} else {
ajax.data = JSON.stringify(opts.data);
}
}
$.ajax(ajax);
},
get: function(opts) {
opts.method = 'get';
return autocode.api.ajax(opts);
},
post: function(opts) {
opts.method = 'post';
return autocode.api.ajax(opts);
}
};;autocode.element = {};;autocode.fuzzy = {
close: function() {
$('#fuzzy').remove();
},
open: function(opts) {
var fuzzy = $('#fuzzy');
if (!fuzzy.length) {
fuzzy = $(document.createElement('div'));
$('body').append(fuzzy);
}
fuzzy.attr('id', 'fuzzy');
fuzzy.data('target', opts.target);
var icons_exist = false;
for (var i = 0; i < opts.rows.length; i++) {
if (opts.rows[i].icon) {
icons_exist = true;
break;
}
}
var table = $(document.createElement('div'));
table.addClass('table');
var row_icon,
row_link,
row_text;
for (var i = 0; i < opts.rows.length; i++) {
row = opts.rows[i];
row_link = $(document.createElement('a'));
row_link.attr('href', row.state);
table.append(row_link);
if (icons_exist) {
row_icon = $(document.createElement('span'));
row_icon.addClass('icon');
if (row.icon) {
if (row.icon.match(/^https?:/)) {
row_icon.css('background-image', 'url(' + row.icon + ')');
} else {
row_icon.addClass(row.icon);
}
}
row_link.append(row_icon);
}
row_text = $(document.createElement('span'));
row_text.addClass('text');
row_text.html(row.text.replace(new RegExp('(' + opts.value + ')', 'i'), '<b>$1</b>'));
row_link.append(row_text);
}
fuzzy.html(table);
autocode.initState();
autocode.resize.fuzzy();
}
};;autocode.hint = {
timer: null,
close: function(opts) {
opts = opts || {};
if (opts.animated === false) {
$('#hint, #hint-arrow').remove();
} else {
$('#hint, #hint-arrow').fadeOut(function() {
$('#hint, #hint-arrow').remove();
});
}
},
init: function() {
$('*[data-hint]').each(function() {
$(this).bind({
mouseenter: function() {
autocode.hint.open({
target: $(this),
text: $(this).data('hint')
});
autocode.resize.hint();
},
mouseleave: function() {
autocode.hint.close();
}
});
});
},
open: function(opts) {
clearTimeout(autocode.hint.timer);
var hint = $('#hint');
if (!hint.length) {
hint = $(document.createElement('div'));
hint.attr('id', 'hint');
$('body').append(hint);
}
if (opts.minTop !== undefined) {
hint.data('minTop', opts.minTop);
} else {
hint.removeData('minTop');
}
if (opts.offsetTop !== undefined) {
hint.data('offsetTop', opts.offsetTop);
} else {
hint.removeData('offsetTop');
}
hint.data('originalText', opts.text);
if (opts.scrollUp) {
hint.data('scrollUp', opts.scrollUp);
} else {
hint.removeData('scrollUp');
}
if (opts.top !== undefined) {
hint.data('top', opts.top);
} else {
hint.removeData('top');
}
var hint_arrow = $('#hint-arrow');
if (!hint_arrow.length) {
hint_arrow = $(document.createElement('div'));
hint_arrow.attr('id', 'hint-arrow');
$('body').append(hint_arrow);
}
hint.data('target', opts.target);
hint.html(opts.text);
if (opts.timer) {
autocode.hint.timer = setTimeout(function() {
autocode.hint.close();
}, opts.timer);
}
}
};;autocode.init = function() {
autocode.api.url = autocode.url.api();
autocode.resize.loader();
$('#loader').animate({ opacity: 1 });
autocode.hint.init()
autocode.shortcut.init()
autocode.initState();
$(window).bind({
keyup: function(e) {
if (e.keyCode == 9 || e.keyCode == 27) {
autocode.fuzzy.close();
}
},
mousedown: function(e) {
var target = $(e.target);
if (
target.attr('id') != 'popover' && !target.parents('#popover').length
&& target.attr('id') != 'menu' && !target.parents('#menu').length
&& target.attr('id') != 'user' && !target.parents('#user').length
) {
autocode.popover.close();
}
if (target.attr('id') != 'fuzzy' && !target.parents('#fuzzy').length) {
autocode.fuzzy.close();
}
},
popstate: function() {
var hash = location.hash.split('#')[1];
if (autocode.state[hash]) {
autocode.state[hash]();
}
},
scroll: function() {
$(this).data('scrolled', true);
}
});
$('#content .content-center').bind('scroll', function() {
if ($('#fuzzy').length) {
autocode.resize.fuzzy();
}
if ($('#hint').length) {
autocode.resize.hint();
}
});
var code = autocode.query.get('code');
history.pushState(null, null, '/');
if (code) {
autocode.api.login.post({
data: {
code: code,
provider: 1
},
error: function(data) {
alert('Unable to login.');
autocode.load();
},
success: autocode.load
});
} else {
autocode.load();
}
autocode.resize.all();
};
$(window).load(autocode.init);;autocode.listener = {
listeners: {},
add: function(name, state, callback) {
if (!autocode.listener.listeners[state]) {
autocode.listener.listeners[state] = {};
}
autocode.listener.listeners[state][name] = callback;
},
remove: function(name, state) {
if (state) {
autocode.listener.listeners[state].splice(
autocode.listener.listeners[state].indexOf(name),
1
);
if (!Object.keys(autocode.listener.listeners[state]).length) {
delete(autocode.listener.listeners[state]);
}
} else {
var listeners;
for (var listener_state in autocode.listener.listeners) {
delete(autocode.listener.listeners[listener_state][name]);
if (!Object.keys(autocode.listener.listeners[listener_state]).length) {
delete(autocode.listener.listeners[listener_state]);
}
}
}
}
};;autocode.load = function() {
autocode.api.auth.get({
error: function(data) {
console.log(data);
alert('Unable to load Autocode. Please contact support.');
},
success: function(data) {
autocode.data.auth = data;
autocode.api.config.get({
data: {
repo: 'crystal/autocode'
},
error: function(data) {
console.log(data);
alert('Unable to load Autocode. Please contact support.');
},
success: function(data) {
autocode.config = jsyaml.safeLoad(data.config);
autocode.api.user.get({
complete: function() {
autocode.action.updateRecent();
var repo = autocode.storage.get('repo');
if (!repo) {
$('#loader').fadeOut(function() {
$('#loader').remove();
$('#container').show();
$('#welcome').hide();
autocode.resize.all();
$('#container').animate({ opacity: 1 },{
complete: function() {
$('#welcome').css({ opacity: 0 }).show().animate({ opacity: 1 });
autocode.resize.all();
}
});
});
return;
}
$('#loader').fadeOut(function() {
$('#loader').remove();
$('#container').show();
$('#welcome').hide();
autocode.resize.all();
$('#container').animate({
opacity: 1
},{
complete: function() {
$('.app').fadeIn();
}
});
});
},
error: function() {
$('#new-option, #load-option').hide();
$('#recent').hide();
},
success: function(data) {
autocode.data.user = data;
autocode.data.user.isLoggedIn = true;
$('#login-option').hide();
$('#user .icon').css('background-image', 'url(' + data.avatar + ')');
$('#user .text').text(data.username);
}
});
}
});
}
});
};;autocode.loader = {
close: function() {
$('#loader').remove();
},
open: function(opts) {
autocode.loader.close();
var loader = $(document.createElement('div'));
loader.attr('id', 'loader');
loader.html('<img class="icon" src="images/loader.svg" />');
$('body').append(loader);
autocode.resize.all(['loader']);
loader.animate({ opacity: 1 });
}
};;autocode.object = {
clone: function(o) {
return JSON.parse(JSON.stringify(o));
},
sort: function(o) {
var sorted = {}, key, a = [];
for (key in o) {
if (o.hasOwnProperty(key)) {
a.push(key);
}
}
a.sort();
for (key = 0; key < a.length; key++) {
sorted[a[key]] = o[a[key]];
}
return sorted;
}
};;autocode.popover = {
close: function() {
$('#popover').remove();
},
open: function(opts) {
var popover = $(document.createElement('div'));
popover.attr('id', 'popover');
if (opts.bottom !== undefined) {
popover.css('bottom', opts.bottom);
}
if (opts.left !== undefined) {
popover.css('left', opts.left);
}
if (opts.right !== undefined) {
popover.css('right', opts.right);
}
if (opts.top !== undefined) {
popover.css('top', opts.top);
}
popover.data('target', opts.target);
if (!opts.content) {
switch (opts.style) {
case 'table':
opts.content = '<div class="table">';
for (var row_i = 0; row_i < opts.rows.length; row_i++) {
opts.content += '<a href="' + opts.rows[row_i].state + '">'
+ '<span class="icon ' + opts.rows[row_i].icon + '"' + (opts.rows[row_i].style == 'divider' ? ' style="border-top: 1px #CCC solid"' : '') + '></span>'
+ '<span class="text"' + (opts.rows[row_i].style == 'divider' ? ' style="border-top: 1px #CCC solid"' : '') + '>' + opts.rows[row_i].text + '</span>'
+ '</a>';
}
opts.content += '</div>';
break;
}
}
popover.html(opts.content);
popover.hide();
$('body').append(popover);
popover.slideDown();
},
toggle: function(opts) {
if ($('#popover').length) {
var target = $('#popover').data('target')
$('#popover').remove();
if (opts.target.attr('id') != target.attr('id')) {
autocode.popover.open(opts);
}
} else {
autocode.popover.open(opts);
}
}
};;autocode.popup = {
close: function() {
$('#popup, #overlay').remove();
},
error: function(msg) {
if (msg === false) {
$('#popup .error').hide();
} else {
$('#popup .error').text(msg).show();
}
autocode.resize.all();
return false;
},
open: function(opts) {
autocode.popup.close();
var popup = $(document.createElement('div'));
popup.attr('id', 'popup');
popup.hide();
var html = '';
if (opts.title) {
html += '<div class="title"' + (opts.content ? '' : ' style="padding-bottom: 0px"') + '>' + opts.title + '</div>';
}
html += '<div class="error"></div>';
if (!opts.content) {
switch (opts.style) {
case 'table':
opts.content = '<div class="table">';
for (var row_i = 0; row_i < opts.rows.length; row_i++) {
opts.content += '<a href="' + opts.rows[row_i].state + '">'
+ '<span class="icon' + (!opts.rows[row_i].icon.match(/^http/) ? ' ' + opts.rows[row_i].icon : '') + '" style="' + (!!opts.rows[row_i].icon.match(/^http/) ? 'background-image: url(' + opts.rows[row_i].icon + ');' : '') + (opts.rows[row_i].style == 'divider' ? 'border-top: 1px #CCC solid' : '') + '"></span>'
+ '<span class="text"' + (opts.rows[row_i].style == 'divider' ? ' style="border-top: 1px #CCC solid"' : '') + '>' + opts.rows[row_i].text + '</span>'
+ '</a>';
}
opts.content += '</div>';
break;
}
}
if (opts.content) {
html += '<div class="content">' + opts.content + '</div>';
}
popup.html(html);
$('body').append(popup);
if (opts.overlay !== false) {
var overlay = $(document.createElement('div'));
overlay.attr('id', 'overlay');
overlay.click(function() {
autocode.popup.close();
});
overlay.hide();
$('body').append(overlay);
$('#overlay').fadeIn();
}
$('#popup').css('opacity', 0.01).show();
$('#popup input').first().focus().keyup();
$('#popup').animate({ opacity: 1 });
autocode.resize.all(['fuzzy', 'overlay', 'popup']);
autocode.initState();
}
};;autocode.query = {
get: function(variable, search) {
var query = search ? search : window.location.search.substring(1);
var vars = query.split('&');
var data = {};
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
if (variable && decodeURIComponent(pair[0]) == variable) {
return decodeURIComponent(pair[1]);
}
}
},
search: function(search) {
var query = search ? search : window.location.search.substring(1);
var vars = query.split('&');
var data = {};
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
data[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
}
return data;
}
};;autocode.resize = {
all: function(resize) {
if (typeof(resize) == 'string') {
resize = [resize];
}
var parts = [
'body',
'content',
'config',
'exports',
'exportsInit',
'header',
'hint',
'init',
'loader',
'output',
'outputInit',
'outputsInit',
'overlay',
'popup',
'fuzzy',
'welcome'
];
var part;
for (var i = 0; i < parts.length; i++) {
part = parts[i];
if (resize && resize.indexOf(part) === -1) {
continue;
}
autocode.resize[part]();
}
}
};
$(window).resize(function() { autocode.resize.all(); });;autocode.shortcut = {
init: function() {
$(window).bind('keydown', function(e) {
if (!e.ctrlKey || !e.shiftKey) {
return;
}
switch (e.keyCode) {
// 1
case 49: {
autocode.state['overview']();
break;
}
// 2
case 50: {
autocode.state['imports']();
break;
}
// 3
case 51: {
autocode.state['config']();
break;
}
// 4
case 52: {
autocode.state['output']();
break;
}
// n
case 78: {
autocode.state['project/new']();
break;
}
// o
case 79: {
autocode.state['project/load']();
break;
}
// s
case 83: {
autocode.state['project/save']();
break;
}
// w
case 87: {
autocode.state['project/close']();
break;
}
}
autocode.resize.all();
return false;
});
}
};;autocode.storage = {
get: function(name, default_item) {
var item = localStorage.getItem(name);
if (item && item.match(/^json:\/\//)) {
item = JSON.parse(item.substr(7));
}
return item || default_item;
},
set: function(name, item) {
if (typeof(item) == 'object') {
item = 'json://' + JSON.stringify(item);
}
return localStorage.setItem(name, item);
}
};;autocode.string = {
escape: function(str) {
return str.replace(/"/g, '"');
}
};;autocode.unload = {
callback: function() {
return 'You will lose any unsaved changes';
},
disable: function() {
if (location.hostname.match(/^alpha/)) {
return;
}
$(window).unbind('beforeunload', autocode.unload.callback);
},
enable: function() {
if (location.hostname.match(/^alpha/)) {
return;
}
$(window).bind('beforeunload', autocode.unload.callback);
}
};;autocode.url = {
api: function(uri) {
if (location.host.match(/^alpha/)) {
return 'http://alpha.api.crystal.sh:3000/' + (uri ? uri : '');
} else {
return 'https://api.crystal.sh/' + (uri ? uri : '');
}
}
};;;;autocode.action.editAuthorEmail = function() {
autocode.popup.open({
title: 'Loading...'
});
autocode.popover.close();
new formulator({
data: {
email: autocode.project.author.email
},
formula: 'formulas/forms/Email.json',
xhr: true,
ready: function(form) {
autocode.popup.open({
title: 'Edit Author Email',
content: form.toString()
});
},
submit: function(data) {
var data = {};
$('#popup input, #popup select, #popup textarea').each(function() {
data[$(this).attr('name')] = $(this).val();
});
if (data.email && data.email.length) {
if (!autocode.project.author) {
autocode.project.author = {};
}
autocode.project.author.email = data.email;
} else {
delete(autocode.project.author.email);
}
autocode.popup.close();
autocode.state['overview/author']();
return false;
}
});
};;autocode.action.editAuthorName = function() {
autocode.popup.open({
title: 'Loading...'
});
autocode.popover.close();
new formulator({
data: {
name: autocode.project.author.name
},
formula: 'formulas/forms/Name.json',
xhr: true,
ready: function(form) {
autocode.popup.open({
title: 'Edit Author Name',
content: form.toString()
});
},
submit: function(data) {
var data = {};
$('#popup input, #popup select, #popup textarea').each(function() {
data[$(this).attr('name')] = $(this).val();
});
if (data.name && data.name.length) {
if (!autocode.project.author) {
autocode.project.author = {};
}
autocode.project.author.name = data.name;
} else {
delete(autocode.project.author.name);
}
autocode.popup.close();
autocode.state['overview/author']();
return false;
}
});
};;autocode.action.editAuthorURL = function() {
autocode.popup.open({
title: 'Loading...'
});
autocode.popover.close();
new formulator({
data: {
url: autocode.project.author.url
},
formula: 'formulas/forms/URL.json',
xhr: true,
ready: function(form) {
autocode.popup.open({
title: 'Edit Author URL',
content: form.toString()
});
},
submit: function(data) {
var data = {};
$('#popup input, #popup select, #popup textarea').each(function() {
data[$(this).attr('name')] = $(this).val();
});
if (data.url && data.url.length) {
if (!autocode.project.author) {
autocode.project.author = {};
}
autocode.project.author.url = data.url;
} else {
delete(autocode.project.author.url);
}
autocode.popup.close();
autocode.state['overview/author']();
return false;
}
});
};;autocode.action.editDescription = function() {
autocode.popup.open({
title: 'Loading...'
});
autocode.popover.close();
new formulator({
data: autocode.project,
formula: 'formulas/forms/Description.json',
xhr: true,
ready: function(form) {
autocode.popup.open({
title: 'Edit Project Description',
content: form.toString()
});
},
submit: function(data) {
var data = {};
$('#popup input, #popup select, #popup textarea').each(function() {
data[$(this).attr('name')] = $(this).val();
});
if (data.description && data.description.length) {
autocode.project.description = data.description;
} else {
delete(autocode.project.description);
}
autocode.popup.close();
autocode.state['overview/general']();
return false;
}
});
};;autocode.action.editImportName = function() {
autocode.popup.open({
title: 'Loading...'
});
autocode.popover.close();
new formulator({
data: {
name: autocode.data.current.import
},
formula: 'formulas/forms/Name.json',
xhr: true,
ready: function(form) {
autocode.popup.open({
title: 'Edit Import Name',
content: form.toString()
});
},
submit: function(data) {
var data = {};
$('#popup input, #popup select, #popup textarea').each(function() {
data[$(this).attr('name')] = $(this).val();
});
if (data.name != autocode.data.current.import) {
autocode.project.imports[data.name] = autocode.object.clone(autocode.project.imports[autocode.data.current.import]);
delete(autocode.project.imports[autocode.data.current.import]);
}
autocode.popup.close();
autocode.state['imports']({ disableSelected: true });
autocode.state['imports/module']({ repo: data.name });
return false;
}
});
};;autocode.action.editImportVersion = function() {
autocode.popup.open({
title: 'Loading...'
});
autocode.popover.close();
new formulator({
data: {
version: autocode.project.imports[autocode.data.current.import]
},
formula: 'formulas/forms/Version.json',
xhr: true,
ready: function(form) {
autocode.popup.open({
title: 'Edit Import Name',
content: form.toString()
});
},
submit: function(data) {
var data = {};
$('#popup input, #popup select, #popup textarea').each(function() {
data[$(this).attr('name')] = $(this).val();
});
if (!data.version || !data.version.length) {
return autocode.popup.error('Version is required.');
}
autocode.project.imports[autocode.data.current.import] = data.version;
autocode.popup.close();
autocode.state['imports']({ disableSelected: true });
autocode.state['imports/module']({ repo: autocode.data.current.import });
return false;
}
});
};;autocode.action.editName = function() {
autocode.popup.open({
title: 'Loading...'
});
autocode.popover.close();
new formulator({
data: autocode.project,
formula: 'formulas/forms/Name.json',
xhr: true,
ready: function(form) {
autocode.popup.open({
title: 'Edit Project Name',
content: form.toString()
});
},
submit: function(data) {
var data = {};
$('#popup input, #popup select, #popup textarea').each(function() {
data[$(this).attr('name')] = $(this).val();
});
if (data.name && data.name.length) {
autocode.project.name = data.name;
} else {
delete(autocode.project.name);
}
autocode.popup.close();
autocode.state['overview/general']();
return false;
}
});
};;autocode.action.editProjectCopyright = function() {
autocode.popup.open({
title: 'Loading...'
});
autocode.popover.close();
new formulator({
data: {
copyright: autocode.project.copyright
},
formula: 'formulas/forms/Copyright.json',
xhr: true,
ready: function(form) {
autocode.popup.open({
title: 'Edit Project Copyright',
content: form.toString()
});
},
submit: function(data) {
var data = {};
$('#popup input, #popup select, #popup textarea').each(function() {
data[$(this).attr('name')] = $(this).val();
});
if (data.copyright && data.copyright.length) {
autocode.project.copyright = data.copyright;
} else {
delete(autocode.project.copyright);
}
autocode.popup.close();
autocode.state['overview/general']();
return false;
}
});
};;autocode.action.editURL = function() {
autocode.popup.open({
title: 'Loading...'
});
autocode.popover.close();
new formulator({
data: autocode.project,
formula: 'formulas/forms/URL.json',
xhr: true,
ready: function(form) {
autocode.popup.open({
title: 'Edit Project URL',
content: form.toString()
});
},
submit: function(data) {
var data = {};
$('#popup input, #popup select, #popup textarea').each(function() {
data[$(this).attr('name')] = $(this).val();
});
if (data.url && data.url.length) {
autocode.project.url = data.url;
} else {
delete(autocode.project.url);
}
autocode.popup.close();
autocode.state['overview/general']();
return false;
}
});
};;autocode.action.toggleColumn = function(id, column, opts) {
opts = opts || {};
autocode.data.current.column = column;
if ($(window).width() > 600) {
$('#content').css({
marginLeft: ''
});
} else if (opts.animated === false) {
$('#content').css({
marginLeft: $(window).width() * -(column - 1)
});
} else {
$('#content').animate({
marginLeft: $(window).width() * -(column - 1)
});
}
};;autocode.action.toggleMenu = function() {
var rows = [];
if (autocode.data.user) {
if (autocode.project) {
rows.push({
text: 'Save Project (Ctrl+Shift+S)',
icon: 'save-icon',
state: 'project/save'
});
rows.push({
text: 'Close Project',
icon: 'close-icon',
state: 'home'
});
rows.push({
icon: 'login-icon',
text: 'View on GitHub',
state: 'github/repo'
});
}
rows.push({
text: 'New Project (Ctrl+Shift+N)',
icon: 'add-icon',
state: 'project/new',
style: 'divider'
});
rows.push({
text: 'Load Project (Ctrl+Shift+O)',
icon: 'load-icon',
state: 'project/load',
});
} else {
rows.push({
text: 'Login with GitHub',
icon: 'login-icon',
state: 'user/login'
});
}
rows.push({
text: 'Take a Tour',
icon: 'tour-icon',
state: 'tour',
style: 'divider'
});
autocode.popover.toggle({
rows: rows,
left: 0,
style: 'table',
target: $('#menu'),
top: $('#main').outerHeight()
});
autocode.initState();
};;autocode.action.toggleSection = function(name, section) {
if (autocode.data.current.tab == 'config') {
var value = $('#config-content .CodeMirror')[0].CodeMirror.getValue();
autocode.project = jsyaml.safeLoad(value);
}
autocode.data.current.tab = name;
autocode.data.current.subtab = section;
$('.content, .tab').removeClass('selected');
$('#' + name + '-content, #' + name + '-tab').addClass('selected');
if (section) {
$('.subcontent').removeClass('selected');
$('#' + name + '-' + section + '-content').addClass('selected');
$('#' + name + '-content .subtab').removeClass('selected');
$('#' + name + '-' + section + '-subtab').addClass('selected');
}
};;autocode.action.toggleUser = function() {
if (autocode.data.user) {
autocode.popover.toggle({
rows: [
/*
{
icon: 'settings-icon',
state: 'user/settings',
text: 'Settings'
},
*/
{
icon: 'login-icon',
text: 'View on GitHub',
state: 'github/user'
},
{
icon: 'logout-icon',
state: 'user/logout',
style: 'divider',
text: 'Logout'
}
],
right: 0,
style: 'table',
target: $('#user'),
top: $('#main').outerHeight()
});
} else {
autocode.state['user/login']();
}
autocode.initState();
};;autocode.action.updateRecent = function() {
if (!autocode.data.user) {
return;
}
var recent_projects = autocode.storage.get('recent', []).reverse();
if (recent_projects.length) {
var html = '';
for (var i = 0; i < recent_projects.length; i++) {
html += '<a href="project/load/repo?name=' + recent_projects[i] + '">' + recent_projects[i] + '</a>';
}
$('#welcome .recent .projects').html(html);
$('#welcome .recent').show();
autocode.initState();
} else {
$('#welcome .recent').hide();
}
};;;autocode.api.auth = {
uri: 'auth',
init: function(opts) {
opts.uri = autocode.api.auth.uri;
return opts;
},
get: function(opts) {
opts = autocode.api.auth.init(opts);
return autocode.api.get(opts);
}
};;autocode.api.config = {
uri: 'config?provider=1',
init: function(opts) {
opts.uri = autocode.api.config.uri;
return opts;
},
get: function(opts) {
opts = autocode.api.config.init(opts);
return autocode.api.get(opts);
},
post: function(opts) {
opts = autocode.api.config.init(opts);
return autocode.api.post(opts);
}
};;autocode.api.generate = {
uri: 'generate',
init: function(opts) {
opts.uri = autocode.api.generate.uri;
return opts;
},
post: function(opts) {
opts = autocode.api.generate.init(opts);
return autocode.api.post(opts);
}
};;autocode.api.init = {
uri: 'init',
init: function(opts) {
opts.uri = autocode.api.init.uri;
return opts;
},
post: function(opts) {
opts = autocode.api.init.init(opts);
return autocode.api.post(opts);
}
};;autocode.api.login = {
uri: 'login',
init: function(opts) {
opts.uri = autocode.api.login.uri;
return opts;
},
post: function(opts) {
opts = autocode.api.login.init(opts);
return autocode.api.post(opts);
}
};;autocode.api.logout = {
uri: 'logout',
init: function(opts) {
opts.uri = autocode.api.logout.uri;
return opts;
},
get: function(opts) {
opts = autocode.api.logout.init(opts);
return autocode.api.get(opts);
}
};;autocode.api.modules = {
uri: 'modules',
init: function(opts) {
opts.uri = autocode.api.modules.uri;
return opts;
},
get: function(opts) {
opts = autocode.api.modules.init(opts);
return autocode.api.get(opts);
}
};;autocode.api.readme = {
uri: 'readme?provider=1',
init: function(opts) {
opts.uri = autocode.api.readme.uri;
return opts;
},
get: function(opts) {
opts = autocode.api.readme.init(opts);
return autocode.api.get(opts);
}
};;autocode.api.releases = {
uri: 'releases',
init: function(opts) {
opts.uri = autocode.api.releases.uri;
return opts;
},
get: function(opts) {
opts = autocode.api.releases.init(opts);
return autocode.api.get(opts);
}
};;autocode.api.repos = {
uri: 'repos',
init: function(opts) {
opts.uri = autocode.api.repos.uri;
return opts;
},
get: function(opts) {
opts = autocode.api.repos.init(opts);
return autocode.api.get(opts);
}
};;autocode.api.user = {
uri: 'user',
init: function(opts) {
opts.uri = autocode.api.user.uri;
return opts;
},
get: function(opts) {
opts = autocode.api.user.init(opts);
return autocode.api.get(opts);
}
};;;autocode.element.input = {
html: function(opts) {
var input = $(document.createElement('input'));
if (opts.autocomplete === true) {
input.attr('autocomplete', 'on');
} else if (opts.autocomplete === false) {
input.attr('autocomplete', 'off');
}
if (opts.class) {
input.addClass(opts.class);
}
if (opts.css) {
input.css(opts.css);
}
if (opts.event) {
var e;
for (var event_name in opts.event) {
e = opts.event[event_name];
input.bind(event_name, e);
}
}
if (opts.name) {
input.attr('name', opts.name);
}
if (opts.placeholder) {
input.attr('placeholder', opts.placeholder);
}
if (opts.value) {
input.val(opts.value);
}
return input;
}
};;autocode.element.radio = {
event: {
click: function() {
var field = $(this);
var selected = $(this).hasClass('selected');
field.parent().find('button').removeClass('selected');
if (!selected) {
field.addClass('selected');
field.parent().find('input[type="hidden"]').val(field.val());
} else {
field.parent().find('input[type="hidden"]').val('');
}
}
},
html: function(opts) {
var span = $(document.createElement('span'));
span.addClass('radio');
var button, option_text;
for (var option_value in opts.options) {
option_text = opts.options[option_value];
button = $(document.createElement('button'));
if ((opts.value || opts.value === false) && opts.value.toString() == option_value.toString()) {
button.addClass('selected');
}
if ((opts.defaultValue || opts.defaultValue === false) && opts.defaultValue.toString() == option_value.toString()) {
button.addClass('default');
}
button.attr('type', 'button');
button.click(autocode.element.radio.event.click);
button.text(option_text);
button.val(option_value);
span.append(button);
}
var input = $(document.createElement('input'));
input.attr('name', opts.name);
input.attr('type', 'hidden');
input.val(opts.value || opts.value === false ? opts.value : '');
span.append(input);
return span;
}
};;;autocode.resize.body = function() {
var body = $('body');
body.css({
marginTop: $('header').outerHeight()
});
};;autocode.resize.config = function() {
var config = $('#config-content .CodeMirror');
config.css({
height: $(window).height() - $('header').outerHeight()
});
};;autocode.resize.content = function() {
if ($(window).width() > 600) {
$('#content').css({
height: $(window).height() - $('header').outerHeight(),
width: $(window).width()
});
} else {
$('#content').css({
height: $(window).height() - $('header').outerHeight(),
width: $(window).width() * ($('.column:visible').length ? $('.column:visible').length : 1)
});
}
if ($(window).outerWidth() < 600) {
$('#content .column').css({
width: $(window).width()
});
$('.content-center').css({
width: $(window).width()
});
$('#content .column').each(function() {
$(this).css({
left: $(window).width() * $(this).index()
})
});
} else {
$('#content .column').css({
width: ''
});
$('.content-center').each(function() {
$(this).css({
width: $(window).width() - $(this).prev().visibleWidth() - $(this).next().visibleWidth()
});
});
$('#content .column').each(function() {
$(this).css({
left: ''
})
});
}
if ($(window).width() > 600) {
$('.content-left, .content-center, .content-right').css({
height: $(window).height() - $('header').outerHeight()
});
} else {
$('.content-left, .content-center, .content-right').css({
height: ''
});
}
};;autocode.resize.exports = function() {
var exports = $('#exports-content .CodeMirror');
exports.css({
height: $(window).height() - $('header').outerHeight() - 20
});
};;autocode.resize.exportsInit = function() {
var exports_init = $('#exports-init');
exports_init.css({
left: ($(window).width() - exports_init.outerWidth()) / 2,
top: ($(window).height() - exports_init.outerHeight()) / 2
});
};;autocode.resize.fuzzy = function() {
var fuzzy = $('#fuzzy');
var fuzzy_target = fuzzy.data('target');
if (fuzzy.length && fuzzy_target.length) {
var fuzzy_box_shadow = '0px 5px 10px #999';
var fuzzy_max_height = $(window).height() - (fuzzy_target.outerHeight() + fuzzy_target.offset().top) - 50;
var fuzzy_max_top = fuzzy_target.outerHeight() + fuzzy_target.offset().top;
if (fuzzy_max_height > 300) {
fuzzy_max_height = 300;
fuzzy.css('maxHeight', fuzzy_max_height);
} else if (fuzzy_max_height < 100) {
fuzzy_box_shadow = '0px -5px 10px #999';
fuzzy_max_height = 300;
fuzzy.css('maxHeight', fuzzy_max_height);
fuzzy_max_top = fuzzy_target.offset().top - fuzzy.outerHeight();
}
fuzzy.css({
boxShadow: fuzzy_box_shadow,
left: fuzzy_target.offset().left,
top: fuzzy_max_top,
width: fuzzy_target.outerWidth()
});
}
};;autocode.resize.header = function() {
$('header').css('width', $(window).width());
};;autocode.resize.hint = function() {
var hint = $('#hint');
var hint_arrow = $('#hint-arrow');
var hint_target = hint.data('target');
if (typeof(hint_target) == 'function') {
hint_target = hint_target();
}
if (!hint.length || !hint_target.length) {
return;
}
var hint_minTop = hint.data('minTop') !== undefined ? hint.data('minTop') : ($('header').outerHeight() + 10);
var hint_offsetTop = hint.data('offsetTop') || 0;
var hint_text = hint.data('originalText');
var hint_width = hint.outerWidth();
var hint_left = hint_target.offset().left - ((hint.outerWidth() - hint_target.outerWidth()) / 2);
if (hint_left < 10) {
hint_left = 10;
} else if (hint_left + hint_width > $(window).width()) {
hint_left = $(window).width() - hint_width - 10;
}
var hint_top;
if (hint.data('top')) {
hint_top = hint.data('top');
} else {
hint_top = hint_target.offset().top + hint_target.outerHeight() + hint_offsetTop + $(window).scrollTop() + 10;
if (hint_top < hint_minTop) {
hint_top = hint_minTop;
if (hint.data('scrollUp')) {
hint_text = hint.data('scrollUp');
}
}
}
hint.css({
left: hint_left,
top: hint_top
});
hint.text(hint_text);
hint_arrow.css({
left: hint_target.offset().left + (hint_target.outerWidth() - hint_arrow.outerWidth()) / 2,
top: hint_top - 14
});
};;autocode.resize.init = function() {
var init = $('#init');
init.css({
left: ($(window).width() - init.outerWidth()) / 2,
top: ($(window).height() - init.outerHeight()) / 2
});
};;autocode.resize.loader = function() {
var loader = $('#loader');
loader.css({
left: ($(window).width() - loader.outerWidth()) / 2,
top: ($(window).height() - loader.outerHeight()) / 2
});
};;autocode.resize.output = function() {
var output = $('#output-content .CodeMirror');
output.css({
height: $(window).height() - $('header').outerHeight()
});
};;autocode.resize.outputInit = function() {
var output_init = $('#output-init');
output_init.css({
left: ($(window).width() - output_init.outerWidth()) / 2,
top: ($(window).height() - output_init.outerHeight()) / 2
});
};;autocode.resize.outputsInit = function() {
var outputs_init = $('#outputs-init');
outputs_init.css({
left: ($(window).width() - outputs_init.outerWidth()) / 2,
top: ($(window).height() - outputs_init.outerHeight()) / 2
});
};;autocode.resize.overlay = function() {
var overlay = $('#overlay');
overlay.css({
height: $(window).height(),
width: $(window).width()
});
};;autocode.resize.popup = function() {
var popup = $('#popup');
$('#popup .content').css('maxHeight', $(window).height() - 100);
popup.css({
left: ($(window).width() - popup.outerWidth()) / 2,
top: ($(window).height() - popup.outerHeight()) / 2
});
};;autocode.resize.welcome = function() {
var welcome = $('#welcome');
if (welcome.outerHeight() > $(window).height() && welcome.outerWidth() > 600) {
welcome.css({
left: ($(window).width() - welcome.outerWidth()) / 2,
position: 'absolute',
top: $('header').outerHeight() + 20
});
} else {
welcome.css({
left: ($(window).width() - welcome.outerWidth()) / 2,
position: '',
top: ($(window).height() - welcome.outerHeight()) / 2
});
}
};;;autocode.state['config'] = function() {
autocode.popup.close();
autocode.action.toggleColumn('config-content', 1, { animated: false });
autocode.action.toggleSection('config');
var code_mirror = $('#config-content .CodeMirror');
var value = jsyaml.safeDump(autocode.project);
if (!code_mirror.length) {
var editor = CodeMirror.fromTextArea($('#config-content textarea')[0], {
lineNumbers: true,
mode: 'yaml'
});
code_mirror = $('#config-content .CodeMirror')
code_mirror[0].CodeMirror.setValue(value);
$('.CodeMirror-scroll').scrollTop(2);
} else {
code_mirror[0].CodeMirror.setValue(value);
}
autocode.resize.all();
};;;autocode.state['exports'] = function() {
if (autocode.project.exports) {
$('#exports-content-container .table a').slice(1).remove();
var exported;
for (var export_name in autocode.project.exports) {
exported = autocode.project.exports[export_name];
$('#exports-content-container .table').append(
'<a class="file" href="exports/export?export=' + export_name + '">'
+ '<span class="icon ' + exported.type + '-icon"></span>'
+ '<span class="info">'
+ '<span class="name">' + export_name + '</span>'
+ '<span class="generator">' + exported.type + '</span>'
+ '</span>'
+ '</a>'
);
}
autocode.initState()
$('#exports-init').hide();
$('#exports-content-container').show();
$('#exports-content-container .table a').eq(1).click();
} else {
$('#exports-init').show();
$('#exports-content-container').hide();
}
autocode.action.toggleSection('exports');
};;;autocode.state['exports/export'] = function(opts) {
var exported = autocode.project.exports[opts.export];
$('#exports-content input[name="name"]').val(opts.export);
$('#exports-content input[name="description"]').val(exported.description);
$('#exports-content input[name="type"]').val(exported.type);
var mode = 'yaml';
var value;
if (exported.type == 'generator') {
mode = exported.format || 'text';
$('#exports-content input[name="engine"]').val(exported.engine);
$('#exports-content input[name="filename"]').val(exported.filename);
$('#exports-content input[name="schema"]').val(exported.schema);
$('#exports-content input[name="format"]').val(mode);
$('#exports-content .engine-field, #exports-content .filename-field, #exports-content .format-field, #exports-content .schema-field').show();
value = exported.template;
} else {
$('#exports-content input[name="engine"]').val('');
$('#exports-content input[name="filename"]').val('');
$('#exports-content input[name="schema"]').val('');
$('#exports-content .engine-field, #exports-content .filename-field, #exports-content .format-field, #exports-content .schema-field').hide();
value = jsyaml.safeDump(exported.schema);
}
var code_mirror = $('#exports-content .CodeMirror');
if (!code_mirror.length) {
var editor = CodeMirror.fromTextArea($('#exports-content textarea')[0], {
lineNumbers: true,
mode: mode
});
code_mirror = $('#exports-content .CodeMirror');
code_mirror[0].CodeMirror.setValue(value);
$('.CodeMirror-scroll').scrollTop(2);
} else {
code_mirror[0].CodeMirror.setOption('mode', mode);
code_mirror[0].CodeMirror.setValue(value);
}
$('#exports-content form .button').attr('href', 'exports/export/save?export=' + opts.export);
};;autocode.state['exports/export/save'] = function(opts) {
if ($('#exports-content input[name="name"]').val() != opts.export) {
var export_name = $('#exports-content input[name="name"]').val();
autocode.project.exports[export_name] = JSON.parse(JSON.stringify(autocode.project.exports[opts.export]));
delete(autocode.project.exports[opts.export]);
} else {
var export_name = opts.export;
}
//autocode.project.exports[opts.export].filename = $('#exports-content input[name="filename"]').val();
autocode.project.exports[export_name].description = $('#exports-content input[name="description"]').val();
autocode.project.exports[export_name].type = $('#exports-content input[name="type"]').val();
if (autocode.project.exports[export_name].type == 'generator' && $('#exports-content input[name="filename"]').val().length) {
autocode.project.exports[export_name].filename = $('#exports-content input[name="filename"]').val();
} else {
delete(autocode.project.exports[export_name].filename);
}
autocode.state['project/save']();
};;;autocode.state['github/repo'] = function() {
autocode.popover.close();
window.open('https://github.com/' + autocode.repo);
};;autocode.state['github/user'] = function() {
autocode.popover.close();
window.open('https://github.com/' + autocode.data.user.username);
};;;autocode.state['home'] = function() {
autocode.popover.close();
if (autocode.data.originalConfig != jsyaml.safeDump(autocode.project)) {
autocode.popup.open({
title: 'Close Project',
content: '<div style="padding-bottom: 15px">Are you sure you want to close this project? <b>You will lose all unsaved changes.</b></div>'
+ '<a class="button" href="popup/close">No, Keep It Open</a> <a class="button secondary" href="home/submit">Yes, Close Project</a> <a class="button secondary" href="project/diff">View Unsaved Changes</a>'
});
return;
}
autocode.state['home/submit']();
};;autocode.state['home/submit'] = function() {
autocode.unload.disable();
autocode.data.current = {};
delete(autocode.project);
autocode.popup.close();
$('.app, #init').fadeOut(function() {
$('#menu .text').text('Menu');
$('#welcome').fadeIn();
});
};;;autocode.state['imports'] = function(opts) {
opts = opts || {};
autocode.popup.close();
autocode.action.toggleColumn('imports-content', 1, {
animated: autocode.data.current.tab == 'imports'
? true
: false
});
autocode.action.toggleSection('imports');
$('#imports-content-container .table a').remove();
var import_index = 0, import_version;
for (var import_name in autocode.object.sort(autocode.project.imports)) {
import_version = autocode.project.imports[import_name];
$('#imports-content-container .table').append(
'<a class="file' + (autocode.data.current.import == import_name ? ' selected' : '') + '" href="imports/module?repo=' + import_name + '&index=' + import_index + '">'
+ '<span class="image"><span class="icon" style="background-image: url(https://cdn.rawgit.com/' + import_name + '/master/.autocode/icon.svg)"></span></span>'
+ '<span class="info">'
+ '<span class="name">' + import_name + '</span>'
+ '<span class="generator">' + import_version + '</span>'
+ '</span>'
+ '</a>'
);
import_index++;
}
autocode.initState();
if (autocode.project.imports) {
$('#imports-content-container .cont