admin-mongo
Version:
A Web user interface to administer MongoDB databases built using Express
498 lines (442 loc) • 20.6 kB
JavaScript
$(document).ready(function(){
// paginate if value is set
if($('#to_paginate').val() === 'true'){
if(localStorage.getItem('message_text')){
show_notification(localStorage.getItem('message_text'), 'success');
localStorage.setItem('message_text', '');
}
paginate();
}
// To reset we call paginate() with no query object
$(document).on('click', '#searchReset', function(){
if(!$('#searchReset').hasClass('disabled')){
localStorage.removeItem('searchQuery');
window.location.href = $('#app_context').val() + '/app/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/' + $('#coll_name').val() + '/view/1';
}
});
$(document).on('click', '#queryDocumentsAction', function(){
var editor = ace.edit('json');
var editor_val = editor.getValue();
if(editor_val !== ''){
// set the query in localStorage
localStorage.setItem('searchQuery', editor_val);
// go to page 1 to remove any issues being on page X from another query/view
window.location.href = $('#app_context').val() + '/app/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/' + $('#coll_name').val() + '/view/1';
// close the queryDocuments
$('#queryDocuments').modal('hide');
}else{
show_notification('Please enter a query', 'danger');
}
});
// redirect to export
$(document).on('click', '#exportModalAction', function(){
var exportId = $('#exportExcludeID').is(':checked') ? 'true' : 'false';
window.location.href = $('#app_context').val() + '/collection/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/' + $('#export_coll').val() + '/export/' + exportId;
});
// sets the collection name to be used later to export entire collection
$(document).on('click', '.exportLink', function(){
$('#exportExcludeID').prop('checked', false);
$('#export_coll').val($(this).attr('id'));
});
// set the URL search parameters
$(document).on('click', '#searchModalAction', function(){
var key_name = $('#search_key_fields option:selected').text();
var val = $('#search_value_value').val();
if(key_name !== '' && val !== ''){
// build the simply key/value query object and call paginate();
var qry_obj = {};
// check if value is a number/integer
var intReg = new RegExp('^[0-9]+$');
if(val.match(intReg)){
val = parseInt(val);
}else{
// if we find an integer wrapped in quotes
var strIntReg = new RegExp('^"[0-9]"+$');
if(val.match(strIntReg)){
val = val.replace(/"/g, '');
}
}
qry_obj[key_name] = val;
// set the object to local storage to be used if page changes
localStorage.setItem('searchQuery', JSON.stringify(qry_obj));
// go to page 1 to remove any issues being on page X from another query/view
window.location.href = $('#app_context').val() + '/app/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/' + $('#coll_name').val() + '/view/1';
// close the searchModal
$('#searchModal').modal('hide');
}else{
show_notification('Please enter a key (field) and a value to search for', 'danger');
}
});
$(document).on('click', '#coll_name_edit', function(){
var newCollName = $('#coll_name_newval').val();
if(newCollName !== ''){
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/collection/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/' + $('#coll_name').val() + '/coll_name_edit',
data: {'new_collection_name': newCollName}
})
.done(function(data){
$('#headCollectionName').text(newCollName);
$('#collectioName').modal('toggle');
localStorage.setItem('message_text', data.msg);
window.location.href = $('#app_context').val() + '/app/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/' + newCollName + '/view?page=1';
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}else{
show_notification('Please enter an index', 'danger');
}
});
$(document).on('click', '#coll_create', function(){
if($('#new_coll_name').val() !== ''){
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/collection/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/coll_create',
data: {'collection_name': $('#new_coll_name').val()}
})
.done(function(data){
$('#del_coll_name').append('<option>' + $('#new_coll_name').val() + '</option>');
$('#new_coll_name').val('');
show_notification(data.msg, 'success');
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}else{
show_notification('Please enter a collection name', 'danger');
}
});
$(document).on('click', '#coll_delete', function(){
if(confirm('WARNING: Are you sure you want to delete this collection and all documents?') === true){
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/collection/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/coll_delete',
data: {'collection_name': $('#del_coll_name option:selected').text()}
})
.done(function(data){
$("#del_coll_name option:contains('" + data.coll_name + "')").remove();
$('#del_coll_name').val($('#del_coll_name option:first').val());
show_notification(data.msg, 'success');
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}
});
$(document).on('click', '#db_create', function(){
if($('#new_db_name').val() !== ''){
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/database/' + $('#conn_name').val() + '/db_create',
data: {'db_name': $('#new_db_name').val()}
})
.done(function(data){
$('#del_db_name').append('<option>' + $('#new_db_name').val() + '</option>');
$('#new_db_name').val('');
show_notification(data.msg, 'success');
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}else{
show_notification('Please enter a database name', 'danger');
}
});
$(document).on('click', '#db_delete', function(){
if(confirm('WARNING: Are you sure you want to delete this collection and all documents?') === true){
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/database/' + $('#conn_name').val() + '/db_delete',
data: {'db_name': $('#del_db_name option:selected').text()}
})
.done(function(data){
$("#del_db_name option:contains('" + data.db_name + "')").remove();
$('#del_db_name').val($('#del_db_name option:first').val());
show_notification(data.msg, 'success');
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}else{
show_notification('Please enter a database name', 'danger');
}
});
$(document).on('click', '#user_create', function(){
if($('#new_username').val() === ''){
show_notification('Please enter a Username', 'danger');
return;
}
if($('#new_password').val() === '' || $('#new_password_confirm').val() === ''){
show_notification('Please enter a password and confirm', 'danger');
return;
}
if($('#new_password').val() !== $('#new_password_confirm').val()){
show_notification('Passwords do not match', 'danger');
return;
}
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/users/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/user_create',
data: {
'username': $('#new_username').val(),
'user_password': $('#new_password').val(),
'roles_text': $('#new_user_roles').val()
}
})
.done(function(data){
$('#del_user_name').append('<option>' + $('#new_username').val() + '</option>');
show_notification(data.msg, 'success');
// clear items
$('#new_username').val('');
$('#new_password').val('');
$('#new_password_confirm').val('');
$('#new_user_roles').val('');
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
});
$(document).on('click', '#btnqueryDocuments', function(){
var editor = ace.edit('json');
if(localStorage.getItem('searchQuery')){
editor.setValue(localStorage.getItem('searchQuery'));
}else{
editor.setValue('{}');
}
});
$(document).on('click', '#user_delete', function(){
if(confirm('WARNING: Are you sure you want to delete this user?') === true){
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/users/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/user_delete',
data: {'username': $('#del_user_name option:selected').text()}
})
.done(function(data){
$("#del_user_name option:contains('" + $('#del_user_name option:selected').text() + "')").remove();
$('#del_user_name').val($('#del_user_name option:first').val());
show_notification(data.msg, 'success');
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}
});
$(document).on('click', '#add_config', function(){
if($('#new_conf_conn_name').val() !== '' && $('#new_conf_conn_string').val() !== ''){
var editor = ace.edit('json');
var editor_val = editor.getValue();
if(editor_val === ''){
editor_val = {};
}
var data_obj = {};
data_obj[0] = $('#new_conf_conn_name').val();
data_obj[1] = $('#new_conf_conn_string').val();
data_obj[2] = editor_val;
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/config/add_config',
data: data_obj
})
.done(function(data){
show_notification(data.msg, 'success');
setInterval(function(){
location.reload();
}, 2500);
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}else{
show_notification('Please enter both a connection name and connection string', 'danger');
}
});
$(document).on('click', '.btnConnDelete', function(){
if(confirm('WARNING: Are you sure you want to delete this connection?') === true){
var current_name = $(this).parents('.conn_id').attr('id');
var rowElement = $(this).parents('.connectionRow');
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/config/drop_config',
data: {'curr_config': current_name}
})
.done(function(data){
rowElement.remove();
show_notification(data.msg, 'success');
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}
});
$(document).on('click', '.btnConnUpdate', function(){
if($('#conf_conn_name').val() !== '' || $('#conf_conn_string').val() !== ''){
var current_name = $(this).parents('.conn_id').attr('id');
var new_name = $(this).parents('.connectionRow').find('.conf_conn_name').val();
var new_string = $(this).parents('.connectionRow').find('.conf_conn_string').val();
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/config/update_config',
data: {'curr_config': current_name, 'conn_name': new_name, 'conn_string': new_string}
})
.done(function(data){
$(this).parents('.connectionRow').find('.conf_conn_name').val(data.name);
$(this).parents('.connectionRow').find('.conf_conn_string').val(data.string);
show_notification(data.msg, 'success', true);
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}else{
show_notification('Please enter a connection name and connection string', 'danger');
}
});
// redirect to connection
$(document).on('click', '.btnConnConnect', function(){
window.location.href = $('#app_context').val() + '/app/' + $(this).parents('.conn_id').attr('id');
});
});
function paginate(){
$('#doc_load_placeholder').show();
var page_num = $('#page_num').val();
var page_len = $('#docs_per_page').val();
var coll_name = $('#coll_name').val();
var conn_name = $('#conn_name').val();
var db_name = $('#db_name').val();
// get the query (if any)
var query_string = localStorage.getItem('searchQuery');
query_string = toEJSON.serializeString(query_string);
// add search to the API URL if it exists
var api_url = $('#app_context').val() + '/api/' + conn_name + '/' + db_name + '/' + coll_name + '/' + page_num;
var pager_href = $('#app_context').val() + '/app/' + conn_name + '/' + db_name + '/' + coll_name + '/view/{{number}}';
$.ajax({
type: 'POST',
dataType: 'json',
url: api_url,
data: {'query': query_string}
})
.done(function(response){
// show message when none are found
if(response.data === ''){
$('#doc_none_found').removeClass('hidden');
}else{
$('#doc_none_found').addClass('hidden');
}
var total_docs = Math.ceil(response.total_docs / page_len);
$('#pager').bootpag({
total: total_docs,
page: page_num,
maxVisible: 5,
href: pager_href
});
var isFiltered = '';
// enable/disable the reset filter button
if(query_string == null){
$('#searchReset').addClass('disabled');
}else{
$('#searchReset').removeClass('disabled');
isFiltered = " <span class='text-danger'>(filtered)</span>";
}
// set the total record count
$('#recordCount').html(response.total_docs + isFiltered);
// clear the div first
$('#coll_docs').empty();
for(var i = 0; i < response.data.length; i++){
var inner_html = '<div class="col-xs-12 col-md-10 col-lg-10 no-pad-left"><pre class="code-block doc_view"><code class="json">' + JSON.stringify(response.data[i]) + '</code></pre></div>';
inner_html += '<div class="col-md-2 col-lg-2 pad-bottom no-pad-left no-pad-right">';
inner_html += '<div class="btn-group btn-group-justified" role="group" aria-label="...">';
inner_html += '<a href="#" class="btn btn-danger btn-sm" onclick="deleteDoc(\'' + response.data[i]._id + '\')">' + response.deleteButton + '</a>';
inner_html += '<a href="' + $('#app_context').val() + '/app/' + conn_name + '/' + db_name + '/' + coll_name + '/edit/' + response.data[i]._id + '" class="btn btn-success btn-sm">' + response.editButton + '</a>';
inner_html += '</div></div>';
$('#coll_docs').append(inner_html);
};
// Bind the DropDown Select For Fields
var option = '';
for(var x = 0; x < response.fields.length; x++){
option += '<option value="' + response.fields[x] + '">' + response.fields[x] + '</option>';
}
$('#search_key_fields').append(option);
$('#doc_load_placeholder').hide();
// hook up the syntax highlight and prettify the json
$('.code-block').each(function (i, block){
var jsonString = this.textContent;
var jsonPretty = JSON.stringify(JSON.parse(jsonString), null, 2);
$(this).html(jsonPretty);
hljs.highlightBlock(block);
});
// Show extended message if API returns an invalid query
if(response.validQuery === false){
show_notification('Invalid query syntax' + response.queryMessage, 'danger', false, 3000);
}
})
.fail(function(){
show_notification('Error getting data from Query API', 'danger');
});
}
function deleteDoc(doc_id){
if(confirm('WARNING: Are you sure you want to delete this document?') === true){
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/document/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/' + $('#coll_name').val() + '/doc_delete',
data: {'doc_id': doc_id}
})
.done(function(data){
show_notification(data.msg, 'success');
paginate();
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}
}
$(document).on('click', '#coll_addindex', function(){
var edit = ace.edit('json');
var json = $.parseJSON(edit.getValue());
if(json !== '{}'){
var data_obj = {};
data_obj[0] = JSON.stringify(json);
data_obj[1] = $('#index_unique').is(':checked') ? 'true' : 'false';
data_obj[2] = $('#index_sparse').is(':checked') ? 'true' : 'false';
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/collection/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/' + $('#coll_name').val() + '/create_index',
data: data_obj
})
.done(function(data){
show_notification(data.msg, 'success', true);
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}else{
show_notification('Please enter an index', 'danger');
}
});
function dropIndex(index_index){
$.ajax({
method: 'POST',
url: $('#app_context').val() + '/collection/' + $('#conn_name').val() + '/' + $('#db_name').val() + '/' + $('#coll_name').val() + '/drop_index',
data: {'index': index_index}
})
.done(function(data){
$('#index_row_' + index_index).remove();
show_notification(data.msg, 'success');
})
.fail(function(data){
show_notification(data.responseJSON.msg, 'danger');
});
}
// show notification popup
function show_notification(msg, type, reload_page, timeout){
// defaults to false
reload_page = reload_page || false;
timeout = timeout || 3000;
$('#notify_message').removeClass();
$('#notify_message').addClass('notify_message-' + type);
$('#notify_message').html(msg);
$('#notify_message').slideDown(600).delay(timeout).slideUp(600, function(){
if(reload_page === true){
location.reload();
}
});
}