402 lines
12 KiB
JavaScript
402 lines
12 KiB
JavaScript
/*
|
|
* Primary app code
|
|
*/
|
|
|
|
// Global app settings
|
|
|
|
APP_DATA = null;
|
|
APP_EVENTS= {};
|
|
APP_UTIL = {
|
|
parseBoolOption: function(val, def) {
|
|
if (val == null) {
|
|
if (def === undefined)
|
|
return true;
|
|
else
|
|
return def == true;
|
|
}
|
|
|
|
var str = (val + '').toLowerCase();
|
|
return str == '' || str == 'true' || str == '1' || str == 'yes' || str == 'on';
|
|
},
|
|
|
|
isValidBoolOption: function(val) {
|
|
if (val == null)
|
|
return true;
|
|
|
|
var t = (val + '').toLowerCase();
|
|
return val == '' || t == '1' || t == 'true' || t == 'on' || t == 'yes' || t == '0' || t == 'false' || t == 'off' || t == 'no';
|
|
},
|
|
|
|
parseOptionStrings: function(val, dict, validateCallback) {
|
|
dict = dict || {};
|
|
var lines = val.replace('\r', '\n').split('\n');
|
|
for(var i in lines) {
|
|
var line = lines[i].trim();
|
|
if (line != '' && line[0] != '#') {
|
|
if (line.indexOf('--') == 0) {
|
|
line = line.substr(2);
|
|
}
|
|
|
|
var eqpos = line.indexOf('=');
|
|
var key = line;
|
|
var value = true;
|
|
if (eqpos > 0) {
|
|
key = line.substr(0, eqpos).trim();
|
|
value = line.substr(eqpos + 1).trim();
|
|
if (value == '')
|
|
value = true;
|
|
}
|
|
|
|
if (validateCallback)
|
|
if (!validateCallback(dict, key, value))
|
|
return null;
|
|
|
|
dict['--' + key] = value;
|
|
}
|
|
}
|
|
|
|
return dict;
|
|
},
|
|
|
|
fill_form: function(form, data, map, extra) {
|
|
map = map || {};
|
|
data = data || {};
|
|
|
|
for(var k in data) {
|
|
var key = k;
|
|
var m = map[key];
|
|
var v = data[k];
|
|
|
|
if (m !== false) {
|
|
if (m && typeof(m) == typeof(''))
|
|
key = m;
|
|
|
|
if (m && typeof(m) == typeof(function() {})) {
|
|
m(data, key, v, extra);
|
|
} else {
|
|
var n = form.find('#' + key);
|
|
if (n.attr('type') == 'checkbox') {
|
|
n.attr('checked', APP_UTIL.parseBoolOption(v));
|
|
} else {
|
|
n.val(v);
|
|
}
|
|
|
|
n.change();
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
read_form: function(form, map, values, extra) {
|
|
values = values || {};
|
|
map = map || {};
|
|
|
|
form.find('select').each(function(i, e) {
|
|
var key = e.id;
|
|
var m = map[e.id];
|
|
|
|
if (m !== false) {
|
|
if (m && typeof(m) == typeof(function() {})) {
|
|
m(values, key, e, extra);
|
|
} else {
|
|
if (m && typeof(m) == typeof(''))
|
|
key = m;
|
|
|
|
values[key] = $(e).val();
|
|
}
|
|
}
|
|
});
|
|
|
|
form.find('input').each(function(i, e) {
|
|
var key = e.id;
|
|
var m = map[e.id];
|
|
|
|
if (m !== false) {
|
|
if (m && typeof(m) == typeof(function() {})) {
|
|
m(values, key, e, extra);
|
|
} else {
|
|
if (m && typeof(m) == typeof(''))
|
|
key = m;
|
|
|
|
if (e.type == 'checkbox')
|
|
values[key] = $(e).is(':checked');
|
|
else
|
|
values[key] = $(e).val();
|
|
}
|
|
}
|
|
});
|
|
|
|
return values;
|
|
}
|
|
};
|
|
|
|
$(document).ready(function() {
|
|
|
|
// Flag as loaded in case we have plugins
|
|
APP_DATA = {
|
|
plugins: {
|
|
backend: {},
|
|
compression: {},
|
|
encryption: {}
|
|
}
|
|
};
|
|
|
|
var PRIVATE_DATA = {};
|
|
|
|
$('#main-appname').text(APP_CONFIG.branded_name);
|
|
|
|
if ((APP_CONFIG.branded_subtitle || '').length > 0) {
|
|
var subdiv = $('<div id="main-appname-subtitle">');
|
|
subdiv.text(APP_CONFIG.branded_subtitle);
|
|
$('#main-appname').append(subdiv);
|
|
$('#main-appname').addClass('has-subtitle');
|
|
}
|
|
|
|
$('.button').button();
|
|
|
|
$('#main-list-container > div.main-backup-entry').remove();
|
|
$('#loading-dialog').dialog({modal: true}).show();
|
|
|
|
// Register a global function for password strength
|
|
$.passwordStrength = function(password, callback) {
|
|
if (callback == null)
|
|
return;
|
|
|
|
var onUpdate = function(res) {
|
|
try { callback(res); }
|
|
catch (e) { }
|
|
};
|
|
|
|
try { onUpdate(zxcvbn(password)); }
|
|
catch (e) {
|
|
// Not loaded, try this:
|
|
$.getScript('/scripts/zxcvbn.js', function() {
|
|
try {
|
|
onUpdate(zxcvbn(password));
|
|
}
|
|
catch (e) {
|
|
onUpdate(null);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
|
|
PRIVATE_DATA.refresh_server_settings = function(callback, errorhandler) {
|
|
$.ajax({
|
|
url: APP_CONFIG.server_url,
|
|
dataType: 'json',
|
|
data: { action: 'system-info' }
|
|
})
|
|
.done(function(data) {
|
|
PRIVATE_DATA.server_config = data;
|
|
$('#loading-dialog').dialog("close");
|
|
if (callback != null)
|
|
callback(PRIVATE_DATA.server_config);
|
|
})
|
|
.fail(function(data, status) {
|
|
if (errorhandler)
|
|
errorhandler(data, status);
|
|
});
|
|
};
|
|
|
|
PRIVATE_DATA.refresh_backup_list = function(callback, errorhandler) {
|
|
$.ajax({
|
|
url: APP_CONFIG.server_url,
|
|
dataType: 'json',
|
|
data: { action: 'list-backups' }
|
|
})
|
|
.done(function(data) {
|
|
PRIVATE_DATA.backup_list = data;
|
|
$('#loading-dialog').dialog("close");
|
|
|
|
// Clear existing stuff
|
|
$('#main-list-container > div.main-backup-entry').remove();
|
|
if ($('#backup-item-template').length > 0 && data.length > 0)
|
|
$.tmpl($('#backup-item-template'), data).prependTo($('#main-list-container'));
|
|
|
|
//Fill with jQuery template
|
|
|
|
if (callback != null)
|
|
callback(PRIVATE_DATA.backup_list);
|
|
})
|
|
.fail(function(data, status) {
|
|
if (errorhandler)
|
|
errorhandler(data, status);
|
|
});
|
|
};
|
|
|
|
PRIVATE_DATA.refresh_server_settings();
|
|
PRIVATE_DATA.refresh_backup_list();
|
|
|
|
APP_DATA.getServerConfig = function(callback, errorhandler) {
|
|
if (PRIVATE_DATA.server_config == null) {
|
|
PRIVATE_DATA.refresh_server_settings(callback, errorhandler);
|
|
} else {
|
|
callback(PRIVATE_DATA.server_config);
|
|
}
|
|
};
|
|
|
|
APP_DATA.validatePath = function(path, callback) {
|
|
$.ajax({
|
|
url: APP_CONFIG.server_url,
|
|
dataType: 'json',
|
|
data: { action: 'validate-path', path: path }
|
|
})
|
|
.done(function(data) {
|
|
if (callback != null)
|
|
callback(path, true, null);
|
|
})
|
|
.fail(function(data, status) {
|
|
if (callback)
|
|
callback(path, false, data.statusText);
|
|
});
|
|
};
|
|
|
|
APP_DATA.getLabels = function(callback) {
|
|
$.ajax({
|
|
url: APP_CONFIG.server_url,
|
|
dataType: 'json',
|
|
data: { action: 'list-tags' }
|
|
})
|
|
.done(function(data) {
|
|
if (callback != null)
|
|
callback(data, true, null);
|
|
})
|
|
.fail(function(data, status) {
|
|
if (callback)
|
|
callback(null, false, data.statusText);
|
|
});
|
|
};
|
|
|
|
APP_DATA.getBackupDefaults = function(callback, errorhandler) {
|
|
$.ajax({
|
|
url: APP_CONFIG.server_url,
|
|
dataType: 'json',
|
|
data: { action: 'get-backup-defaults' }
|
|
})
|
|
.done(function(data) {
|
|
if (callback != null)
|
|
callback(data, true, null);
|
|
})
|
|
.fail(function(data, status) {
|
|
if (errorhandler)
|
|
errorhandler(null, false, data.statusText);
|
|
});
|
|
};
|
|
|
|
APP_DATA.addBackup = function(cfg, callback, errorhandler) {
|
|
$.ajax({
|
|
url: APP_CONFIG.server_url,
|
|
type: 'POST',
|
|
dataType: 'json',
|
|
data: { action: 'add-backup', data: JSON.stringify(cfg) }
|
|
})
|
|
.done(function(data) {
|
|
PRIVATE_DATA.refresh_backup_list();
|
|
if (callback != null)
|
|
callback(data, true, null);
|
|
})
|
|
.fail(function(data, status) {
|
|
PRIVATE_DATA.refresh_backup_list();
|
|
if (errorhandler)
|
|
errorhandler(null, false, data.statusText);
|
|
});
|
|
};
|
|
|
|
APP_DATA.updateBackup = function(cfg, callback, errorhandler) {
|
|
$.ajax({
|
|
url: APP_CONFIG.server_url,
|
|
type: 'POST',
|
|
dataType: 'json',
|
|
data: { action: 'update-backup', data: JSON.stringify(cfg) }
|
|
})
|
|
.done(function(data) {
|
|
PRIVATE_DATA.refresh_backup_list();
|
|
if (callback != null)
|
|
callback(data, true, null);
|
|
})
|
|
.fail(function(data, status) {
|
|
PRIVATE_DATA.refresh_backup_list();
|
|
if (errorhandler)
|
|
errorhandler(null, false, data.statusText);
|
|
});
|
|
};
|
|
|
|
$('#main-settings').click(function() {
|
|
var pos = $('#main-settings').position();
|
|
var barheight = $('#main-topbar').outerHeight();
|
|
var menuwidth = $('#main-control-menu').outerWidth();
|
|
var buttonwidth = $('#main-settings').outerWidth();
|
|
|
|
$('#main-control-menu').css({
|
|
position: 'absolute',
|
|
top: barheight + 'px',
|
|
right: ($(document).outerWidth() - (pos.left + buttonwidth)) + 'px'
|
|
});
|
|
$('#main-control-menu').toggle();
|
|
});
|
|
|
|
$('#main-donate').click(function() {
|
|
|
|
});
|
|
|
|
$('#main-control').click(function() {
|
|
});
|
|
|
|
$('#main-newbackup').click(function() {
|
|
APP_DATA.getServerConfig(function(data) {
|
|
APP_DATA.getBackupDefaults(function(defaults) {
|
|
$("#edit-dialog").dialog('open');
|
|
|
|
// Bug-fix, this will remove style="width: auto", which breaks Chrome a bit
|
|
$("#edit-dialog").css('width', '');
|
|
|
|
// Send the defaults to the dialog
|
|
$("#edit-dialog").trigger('setup-dialog', defaults.data);
|
|
},
|
|
function() {
|
|
alert('Failed to get server setup...')
|
|
})
|
|
},
|
|
function() {
|
|
alert('Failed to get server setup...')
|
|
});
|
|
|
|
});
|
|
|
|
$('#edit-dialog').tabs({ active: 0 });
|
|
$("#edit-dialog").dialog({
|
|
minWidth: 320,
|
|
width: $('body').width > 600 ? 320 : 600,
|
|
minHeight: 480,
|
|
height: 500,
|
|
modal: true,
|
|
autoOpen: false,
|
|
closeOnEscape: true,
|
|
buttons: [
|
|
{ text: 'Previous', disabled: true, click: function(event, ui) {
|
|
var cur = parseInt($('#edit-dialog').tabs( "option", "active"));
|
|
cur = Math.max(cur-1, 0);
|
|
$('#edit-dialog').tabs( "option", "active", cur);
|
|
}},
|
|
{ text: 'Next', click: function(event, ui) {
|
|
var cur = parseInt($('#edit-dialog').tabs( "option", "active"));
|
|
var max = $('#edit-dialog').parent().find('[role=tablist] > li').size() - 1;
|
|
|
|
if (!EDIT_BACKUP.validate_tab(cur))
|
|
return;
|
|
|
|
event.curPage = cur;
|
|
event.currentTarget.curPage = cur;
|
|
cur = Math.min(cur+1, max);
|
|
$('#edit-dialog').tabs( "option", "active", cur);
|
|
}}
|
|
]
|
|
});
|
|
|
|
// Hack the tabs into the dialog title
|
|
$('#edit-dialog').parent().find('.ui-dialog-titlebar').after($('#edit-dialog').find('.ui-tabs-nav'));
|
|
$('#edit-dialog').parent().addClass('ui-tabs');
|
|
|
|
}); |