null+****@clear*****
null+****@clear*****
2012年 4月 4日 (水) 10:50:09 JST
Kouhei Sutou 2012-04-04 10:50:09 +0900 (Wed, 04 Apr 2012) New Revision: fb6a8e242d68eb144622d55896398c99a2a01425 Log: admin: extract JavaScript Copied files: data/html/admin/js/groonga-admin.js (from data/html/admin/index.html) Modified files: data/html/admin/index.html Modified: data/html/admin/index.html (+1 -1138) =================================================================== --- data/html/admin/index.html 2012-04-03 18:40:14 +0900 (e72ab0f) +++ data/html/admin/index.html 2012-04-04 10:50:09 +0900 (e2b2e6b) @@ -15,6 +15,7 @@ <script type="text/javascript" src="js/jquery-ui-1.8.1.custom.min.js"></script> <script type="text/javascript" src="js/jquery.json-2.2.min.js"></script> <script type="text/javascript" src="js/jquery.flot-0.7.min.js"></script> +<script type="text/javascript" src="js/groonga-admin.js"></script> </head> <body> <div id="header"> @@ -246,1144 +247,6 @@ Powered by <a href="http://jquery.com/">jQuery</a> and <a href="http://jqueryui.com/">jQuery UI</a>. </div> <script type="text/javascript"> -function prim2html(prim, limit) { - switch(typeof prim) { - case 'undefined': - return 'undefined'; - case 'boolean': - return prim ? 'true' : 'false'; - case 'number': - return String(prim); - case 'string': - if (prim.length > limit) { - prim = prim.substring(0, limit) + '...'; - } - return escapeHTML(prim); - case 'array': - case 'object': - if (prim == null) { - return 'null'; - } else if ($.isArray(prim)) { - return 'array'; /* TODO: implement */ - } else { - return 'object'; /* TODO: implement */ - } - default: - return 'ERROR'; - } -} - -function escapeHTML(str) { - return str.replace(/&/g, "&") - .replace(/"/g, """) - .replace(/</g, "<") - .replace(/>/g, ">"); -} -Groonga = { - key_type_list: ['Int8', 'UInt8', 'Int16', 'UInt16', 'Int32', 'UInt32', - 'Int64', 'UInt64', 'Float', 'Time', 'ShortText', - 'TokyoGeoPoint', 'WGS84GeoPoint'], - value_type_list: ['Object', 'Bool', - 'Int8', 'UInt8', 'Int16', 'UInt16', 'Int32', 'UInt32', - 'Int64', 'UInt64', 'Float', 'Time'], - column_type_list: ['Object', 'Bool', - 'Int8', 'UInt8', 'Int16', 'UInt16', 'Int32', 'UInt32', - 'Int64', 'UInt64', 'Float', 'Time', 'ShortText', - 'Text', 'LongText', 'TokyoGeoPoint', 'WGS84GeoPoint'], - tokenizer_list: ['TokenDelimit', 'TokenUnigram', 'TokenBigram', 'TokenTrigram', 'TokenMecab'], - GRN_OBJ_PERSISTENT: (0x01<<15), - - GRN_OBJ_TABLE_TYPE_MASK: (0x07), - GRN_OBJ_TABLE_HASH_KEY: (0x00), - GRN_OBJ_TABLE_PAT_KEY: (0x01), - GRN_OBJ_TABLE_NO_KEY: (0x03), - - GRN_OBJ_KEY_WITH_SIS: (0x01<<6), - GRN_OBJ_KEY_NORMALIZE: (0x01<<7), - - GRN_OBJ_COLUMN_TYPE_MASK: (0x07), - GRN_OBJ_COLUMN_SCALAR: (0x00), - GRN_OBJ_COLUMN_VECTOR: (0x01), - GRN_OBJ_COLUMN_INDEX: (0x02), - - GRN_OBJ_COMPRESS_MASK: (0x07<<4), - GRN_OBJ_COMPRESS_NONE: (0x00<<4), - GRN_OBJ_COMPRESS_ZLIB: (0x01<<4), - GRN_OBJ_COMPRESS_LZO: (0x02<<4), - - GRN_OBJ_WITH_SECTION: (0x01<<7), - GRN_OBJ_WITH_WEIGHT: (0x01<<8), - GRN_OBJ_WITH_POSITION: (0x01<<9) -}; -GroongaAdmin = { - SELECT_PARAMS_LIST: ['match_columns', 'query', 'filter', 'scorer', 'sortby', 'output_columns', 'offset', 'limit', 'drilldown', 'drilldown_sortby', 'drilldown_output_columns', 'drilldown_offset', 'drilldown_limit'], - initialize: function() { - GroongaAdmin.current_table = null; - GroongaAdmin.statusTimer = null; - GroongaAdmin.semaphore = new Array(); - GroongaAdmin.current_status = 0; - GroongaAdmin.reload_record_func = function(){}; - - GroongaAdmin.database_tabs = $('#database-tabs').tabs({ - show: function(e, ui) { - GroongaAdmin.stop_status_timer(); - if (ui.panel.id == 'database-tab-summary') { - GroongaAdmin.start_status_timer(); - } - } - }); - GroongaAdmin.table_tabs = $('#table-tabs').tabs({ - show: function(e, ui) { - } - }); - $('#tab-tablelist-link').click(function() { - GroongaAdmin.tablelist(); - }); - $('#tab-columnlist-link').click(function() { - GroongaAdmin.columnlist(GroongaAdmin.current_table); - }); - $('#tab-createrecord-link').click(function() { - GroongaAdmin.update_createrecord(GroongaAdmin.current_table); - }); - $('#tab-recordlist-link').click(function() { - GroongaAdmin.reload_record_func(); - }); - $('#createtable-add-table').click(function() { - GroongaAdmin.createtable(); - }); - $('#createrecord-add-record').click(function() { - GroongaAdmin.createrecord(); - }); - $('#createcolumn-add-column').click(function() { - GroongaAdmin.createcolumn(); - }); - $('#recordlist-remove-record').click(function() { - GroongaAdmin.removerecord(); - }); - $('#columnlist-remove-column').click(function() { - GroongaAdmin.removecolumn(); - }); - $('#tablelist-remove-table').click(function() { - GroongaAdmin.removetable(); - }); - $('#tab-recordlist-submit').click(function() { - if ($('#table-tab-recordlist-full-checkbox').attr('checked')) { - // full - var d = { - 'table': GroongaAdmin.current_table - } - $.each(GroongaAdmin.SELECT_PARAMS_LIST, function(i, val) { - var e = $('#tab-recordlist-' + val); - if (e.val()) { - d[val] = e.val(); - } - }); - GroongaAdmin.recordlist(d, true); - } else { - // simple - GroongaAdmin.recordlist_simple( - GroongaAdmin.current_table, - $('#tab-recordlist-simplequery').val(), - $('#tab-recordlist-simplequerytype').val(), - 1); - } - }); - GroongaAdmin.update_tablelist(); - - var e1 = $('#createtable-key-type-builtin'); - $.each(Groonga.key_type_list, function(i, val) { - e1.append($('<option />').val(val).text(val)); - }); - - e1 = $('#createtable-value-type-builtin'); - e1.append($('<option />').val('').text('なし')); - $.each(Groonga.value_type_list, function(i, val) { - e1.append($('<option />').val(val).text(val)); - }); - - e1 = $('#createtable-default-tokenizer-builtin'); - e1.append($('<option />').val('').text('なし')); - $.each(Groonga.tokenizer_list, function(i, val) { - e1.append($('<option />').val(val).text(val)); - }); - - e1 = $('#createcolumn-type-builtin'); - $.each(Groonga.column_type_list, function(i, val) { - e1.append($('<option />').val(val).text(val)); - }); - - $('#tab-recordlist-simplequerytype').change(function() { - if ($(this).val() == 'scorer') { - $('#tab-recordlist-incremental').hide(); - $('#tab-recordlist-incremental-label').hide(); - } else { - $('#tab-recordlist-incremental').show(); - $('#tab-recordlist-incremental-label').show(); - } - $('#tab-recordlist-incremental').change(); - }).change(); - - $('#table-tab-recordlist-full-checkbox').change(function() { - if ($(this).attr('checked')) { - $('#table-tab-recordlist-form-simple').hide(); - $('#table-tab-recordlist-form-full').show(); - } else { - $('#table-tab-recordlist-form-simple').show(); - $('#table-tab-recordlist-form-full').hide(); - } - }).change(); - - $('#tab-recordlist-incremental').change(function() { - $('#tab-recordlist-simplequery').unbind('keyup'); - if ($(this).attr('checked') && - $('#tab-recordlist-simplequerytype').val() != 'scorer') { - $('#tab-recordlist-simplequery').keyup(function(e) { - GroongaAdmin.recordlist_simple( - GroongaAdmin.current_table, - $('#tab-recordlist-simplequery').val(), - $('#tab-recordlist-simplequerytype').val(), - 1, - true); - }); - } - }).change(); - - $('#createcolumn-type').change(function(e) { - var s = $('#createcolumn-type-table option:selected'); - var cs = $('#createcolumn-source'); - if (s.length > 0) { - cs.empty().removeAttr('disabled'); - GroongaAdmin.showloading( - $.ajax({ - url: '/d/column_list', - data: {'table': s.val()}, - dataType: 'json', - success: function(d) { - if(GroongaAdmin.validateajax(d) < 0) { return; } - var idx; - var b = d[1]; - $.each(b[0], function(i, val) { - if (val[0] == 'name') { idx = i; } - }); - if (idx) { - b.shift(); - $.each(b, function(i, val) { - cs.append($('<option />').val(val[idx]).text(val[idx])); - }); - } - GroongaAdmin.hideloading(); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - } else { - cs.empty().attr('disabled', 'disabled'); - } - }); - - GroongaAdmin.recordlist_count = 30; - }, - start_status_timer: function() { - GroongaAdmin.stop_status_timer(); - GroongaAdmin.status(); - GroongaAdmin.statusTimer = setInterval(GroongaAdmin.status, 1000); - }, - change_status_timer: function(time) { - GroongaAdmin.stop_status_timer(); - GroongaAdmin.statusTimer = setInterval(GroongaAdmin.status, time); - }, - stop_status_timer: function() { - if (GroongaAdmin.statusTimer) { - clearInterval(GroongaAdmin.statusTimer); - GroongaAdmin.statusTimer = null; - } - }, - create_table_element: function (d, check, button) { - var elms = ['<table class="records">']; - if ($.isArray(d)) { - elms.push('<thead>'); - var l = d.length; - if (l >= 1) { - var line = d[0]; - elms.push('<thead>'); - if ($.isArray(line)) { - elms.push('<tr>'); - var m = line.length; - if (check) { - elms.push('<th/>'); - } - for (var j = 0; j < m; j++) { - elms.push('<th>'); - elms.push(prim2html(line[j][0], 128)); - elms.push('<br />'); - elms.push(prim2html(line[j][1], 128)); - elms.push('</th>'); - } - if (button) { - elms.push('<th/>'); - } - elms.push('</tr>'); - } - elms.push('</thead>'); - elms.push('<tbody>'); - for (var i = 1; i < l; i++) { - line = d[i]; - if ($.isArray(line)) { - elms.push('<tr>'); - var m = line.length; - switch(check) {// チェックボックスの値を何にするか - case 1: // 1番目の要素(レコード一覧の_id等) - case 2: // 2番目の要素(テーブル・カラム一覧のname等) - elms.push('<td><input type="checkbox" value="'); - elms.push(line[check-1]); - elms.push('" /></td>'); - break; - } - for (var j = 0; j < m; j++) { - elms.push('<td>'); - elms.push(prim2html(line[j], 128)); - elms.push('</td>'); - } - switch(button) { - case 1: // Edit record - elms.push('<td><input type="button" onClick="GroongaAdmin.show_edit_record('); - elms.push(line[0]); - elms.push(');" value="編集" /></td>'); - break; - case 2: // Table - elms.push('<td><input type="button" onClick="$(\'#side-menu-tablelist-link-'); - elms.push(line[1]); - elms.push('\').click();" value="詳細" /></td>'); - break; - } - elms.push('</tr>'); - } - } - elms.push('</tbody>'); - } - } - elms.push('</table>'); - return elms.join(''); - }, - show_edit_record: function(id) { - $('#table-tabs').tabs('select', 2); - GroongaAdmin.update_createrecord(GroongaAdmin.current_table, id); - }, - format_unix_time: function(unix_time) { - var date = new Date(); - date.setTime(unix_time * 1000); - return date.toLocaleString(); - }, - format_duration: function(duration_in_seconds) { - var duration = ""; - var days = Math.floor(duration_in_seconds / 3600 / 24); - var hours = Math.floor(duration_in_seconds / 3600 % 24); - var minutes = Math.floor(duration_in_seconds / 60 % 60); - var seconds = Math.floor(duration_in_seconds % 60); - - if (days > 0) { - duration += days; - if (days == 1) { - duration += " day, "; - } else { - duration += " days, "; - } - } - if (days > 0 || hours > 0) { - duration += hours + ":" + minutes + ":" + seconds; - } else if (minutes > 0) { - duration += minutes + ":" + seconds; - } else { - duration += seconds; - } - - return duration; - }, - maxThroughput: 0, - lastNQueries: -1, - keepLastNData: 100, - throughputData: [], - throughputChart: null, - updateThroughputChart: function(statusData) { - var maxThroughputUpdated = false; - if (this.lastNQueries > 0) { - var throughput = statusData.n_queries - this.lastNQueries; - this.throughputData.push(throughput); - if (this.maxThroughput < throughput) { - this.maxThroughput = throughput; - maxThroughputUpdated = true; - } - } - if (this.throughputData.length > this.keepLastNData) { - this.throughputData.shift(); - } - if (!this.throughputChart) { - this.throughputChart = $.plot($("#throughput-chart"), - [[]], - {xaxis: {min: -(this.keepLastNData - 1), - max: 0}, - yaxis: {min: 0}}); - } - var that = this; - var chartSeries = $.map(this.throughputData, function(n, i) { - return [[-(that.throughputData.length - i) + 1, n]]; - }); - this.throughputChart.setData([chartSeries]); - if (maxThroughputUpdated) { - this.throughputChart.setupGrid(); - } - this.throughputChart.draw(); - this.lastNQueries = statusData.n_queries; - }, - status: function() { - if (GroongaAdmin.current_status > 0) { return; } - GroongaAdmin.current_status++; - $.ajax({ - url: '/d/status', - data: {}, - dataType: 'json', - success: function(b) { - GroongaAdmin.current_status--; - if (!b) { - GroongaAdmin.change_status_timer(10000); - return; - } - var d = b[1]; - $('#status-starttime').text(GroongaAdmin.format_unix_time(d.starttime)); - $('#status-uptime').text(GroongaAdmin.format_duration(d.uptime)); - $('#status-n-queries').text(d.n_queries); - $('#status-cache-hit-rate').text(d.cache_hit_rate); - GroongaAdmin.updateThroughputChart(d); - GroongaAdmin.change_status_timer(1000); - }, - error: function() { - GroongaAdmin.current_status--; - GroongaAdmin.change_status_timer(10000); - } - }); - }, - update_tablelist: function() { - GroongaAdmin.showloading( - $.ajax({ - url: '/d/table_list', - data: {}, - dataType: 'json', - success: function(d) { - if (GroongaAdmin.validateajax(d) < 0) { return; } - d.shift(); - var tl = $('#side-menu-tablelist').empty(); - var tt = $('#createtable-key-type-table').empty(); - var vt = $('#createtable-value-type-table').empty(); - var ct = $('#createcolumn-type-table').empty(); - tl.append( - $('<li />').append( - $('<a />').attr('href', '#side-menu-database') - .text('サマリー') - .click(function() { - GroongaAdmin.current_table = null; - $('#table-tabs').hide(); - $('#database-tabs').show(); - GroongaAdmin.start_status_timer(); - }) - ) - ) - var b = d.shift(); - b.shift(); - $.each(b, function(i, val) { - var table_name = val[1]; - tl.append( - $('<li />').append( - $('<a />') - .attr('id', 'side-menu-tablelist-link-' + table_name) - .attr('href', '#side-menu-tablelist-' + table_name) - .text(table_name) - .click(function() { - GroongaAdmin.current_table = table_name; - $('#database-tabs').hide(); - GroongaAdmin.stop_status_timer(); - $('#table-tabs').show(); - GroongaAdmin.columnlist(table_name); - $('#tab-recordlist-simplequery').val(''); - GroongaAdmin.recordlist_simple(table_name, null, null, 1); - GroongaAdmin.update_createrecord(GroongaAdmin.current_table); - }) - ) - ); - tt.append($('<option />').val(val[1]).text(val[1])); - vt.append($('<option />').val(val[1]).text(val[1])); - ct.append($('<option />').val(val[1]).text(val[1])); - }); - GroongaAdmin.hideloading(); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - }, - tablelist: function() { - $('#tab-tablelist-table').empty(); - GroongaAdmin.showloading( - $.ajax({ - url: '/d/table_list', - data: {}, - dataType: 'json', - success: function(d) { - if (GroongaAdmin.validateajax(d) < 0) { return; } - var b = d[1]; - var table = $(GroongaAdmin.create_table_element(b, 2, 2)); - $('#tab-tablelist-table').append($('<h1 />').text('テーブル一覧')).append(table); - GroongaAdmin.hideloading(); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - }, - pager_element_factory: function(per_page, current_page, show_num, func) { - return function (total) { - var ret = $('<div />').addClass('pager'); - if (total) { - var last_page = Math.floor((total - 1) / per_page) + 1; - var st = current_page - Math.floor(show_num / 2); - st = (st < 1) ? 1 : st; - var ed = st + show_num - 1; - ed = (ed > last_page) ? last_page : ed; - - if (st > 1) { - ret.append( - $('<span />').addClass('pager').append( - $('<a />').attr('href', '#').text('1').click(func) - ) - ).append($('<span />').text('....')); - } - for (var i = st; i <= ed; i++) { - var s = $('<span />').append( - $('<a />').attr('href', '#').text(String(i)).click(func) - ); - if (i == current_page) { - s.addClass('pager-current'); - } else { - s.addClass('pager'); - } - ret.append(s); - } - if (ed < last_page) { - ret.append($('<span />').text('....')).append( - $('<span />').addClass('pager').append( - $('<a />').attr('href', '#').text(String(last_page)).click(func) - ) - ) - } - } - return ret; - } - }, - recordlist_simple: function(table_name, simplequery, simplequery_type, page, hide_dialog) { - var d = { - 'table': table_name, - 'offset': (page - 1) * GroongaAdmin.recordlist_count, - 'limit': GroongaAdmin.recordlist_count - } - switch (simplequery_type) { - case 'query': - case 'filter': - case null: - if (simplequery) { - d[simplequery_type] = simplequery; - } - GroongaAdmin.recordlist(d, true, hide_dialog); - break; - } - }, - recordlist: function(params, show_pager, hide_dialog) { - GroongaAdmin.reload_record_func = function(){ - GroongaAdmin.recordlist(params, show_pager, hide_dialog); - }; - GroongaAdmin.showloading( - $.ajax({ - url: '/d/select', - data: params, - dataType: 'json', - success: function(d) { - if (GroongaAdmin.validateajax(d, hide_dialog) < 0) { return; } - var rc = d.shift(); - if (rc[0] != 0) { - alert('error'); - return false; - } - var body = d.shift(); - var recs = body.shift(); - var all_count = recs.shift()[0]; - var pager; - if (show_pager) { - offset = params['offset'] || 0; - rows = params['limit'] || 10; - if (rows < 0){ - rows = all_count + parseInt(rows) + 1; - } - if (rows != '' && !parseInt(rows)) { - pager = $('<span />'); - } else { - pager = - GroongaAdmin.pager_element_factory( - rows, - Math.floor(offset/rows)+1, - 13, - function() { - params['offset'] = (Number($(this).text()) - 1) * rows; - GroongaAdmin.recordlist(params, true, false); - return false; - } - )(all_count); - } - } else { - pager = $('<span />'); - } - $('#tab-recordlist-table') - .empty() - .append($('<h1 />').text('レコード一覧: ' + params['table'])) - .append($('<p />').text('総件数: ' + all_count)) - .append(pager.clone(true)) - .append($('<div />').html(GroongaAdmin.create_table_element(recs, 1, 1))) - .append(pager); - GroongaAdmin.hideloading(); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - GroongaAdmin.errorloading(XMLHttpRequest, hide_dialog); - } - }) - ,hide_dialog); - }, - columnlist: function(table_name) { - $('#tab-columnlist-table').empty(); - GroongaAdmin.showloading( - $.ajax({ - url: '/d/column_list', - data: {'table': table_name}, - dataType: 'json', - success: function(d) { - if (GroongaAdmin.validateajax(d) < 0) { return; } - var b = d[1]; - var table = $(GroongaAdmin.create_table_element(b, 2)); - $('#tab-columnlist-table') - .append($('<h1 />').text('カラム一覧: ' + table_name)) - .append(table); - GroongaAdmin.hideloading(); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - }, - add_record_inputbox: function(type, value) { - var inputbox = null; - switch(type){ - case "Bool": - inputbox = $('<input />') - .attr("type","checkbox") - .attr("value","true"); - if (value) { - inputbox.attr("checked",""); - } - break; - case "UInt8": - case "UInt16": - case "UInt32": - case "UInt64": - case "Int8": - case "Int16": - case "Int32": - case "Int64": - case "Float": - inputbox = $('<input />') - .attr("type", "text") - .val(isNaN(value) ? "" : value); - break; - case "Text": - case "ShortText": - case "LongText": - inputbox = $('<textarea />') - .attr("cols", "50") - .attr("rows", "2") - .text(value ? value : ""); - break; - case "TokyoGeoPoint": - case "WGS84GeoPoint": - case "Time": - inputbox = $('<input />') - .attr("type", "text") - .attr("size", "40") - .val(value ? value : ""); - break; - case "Object": - inputbox = $('<input />') - .attr("type", "text") - .attr("disabled", "disabled"); - break; - default: - inputbox = $('<input />') - .attr("type", "text") - .val(value ? value : ""); - } - inputbox.addClass('column_values'); - return inputbox; - }, - add_record_deletebutton: function(){ - var ret = - $('<span />') - .append("[×]") - .css('cursor', 'pointer') - .click(function() { - $(this).prev().remove(); - $(this).next().remove(); - $(this).remove(); - }); - return ret; - }, - update_createrecord_loadcomplete: function(d_sel, d_col) { - var b = d_sel[1][0]; - var columns = $('<tbody />'); - var listofs = b[1].length - (d_col[1].length - 1); - for (var i = 1; i < b[1].length; i++) { - var line = b[1][i]; - var value = null; - if (b[2]) value = b[2][i]; - if ($.isArray(line)) { - var tr = $('<tr/ >') - .addClass('create-record-columns') - .append( - $('<td />') - .addClass('columnname') - .append(prim2html(line[0], 128)) - ) - .append( - $('<td />') - .addClass('columntype') - .append("(") - .append($('<span />') - .append(prim2html(line[1], 128)) - ) - .append(")") - ); - var inputtd = $('<td />').addClass('columnval'); - if (i >= listofs && d_col[1][i - listofs + 1][4].indexOf("COLUMN_VECTOR") >= 0){ - var type = line[1]; - if (value != null) { - for (var j = 0; j < value.length; j++) { - inputtd - .append(GroongaAdmin.add_record_inputbox(line[1], value[j])) - .append(GroongaAdmin.add_record_deletebutton()) - .append('<br />'); - } - } - inputtd - .append($('<span />') - .append("[値を追加]") - .css('cursor', 'pointer') - .click(function() { - var target = $(this).parent(); - target - .append(GroongaAdmin.add_record_inputbox($(this).parent().prev().children().text())) - .append(GroongaAdmin.add_record_deletebutton()) - .append("<br />"); - $(this).appendTo(target); - }) - ); - } else { - inputtd.append(GroongaAdmin.add_record_inputbox(line[1], value)); - if (line[0] == "_key" && value != null) { - inputtd.children().attr("disabled", "disabled"); - } - } - tr.append(inputtd); - columns.append(tr); - } - } - $("#table-createrecord").append(columns); - GroongaAdmin.hideloading(); - }, - update_createrecord: function(table_name, id) { - var d_sel = null; - var d_col = null; - $('#table-createrecord').empty(); - GroongaAdmin.showloading( - $.ajax({ - url: '/d/select', - data: { - 'table' : table_name, - 'limit' : 1, - 'query' : '_id:' + id - }, - dataType: 'json', - success: function(d) { - if (GroongaAdmin.validateajax(d) < 0) { return; } - d_sel = d; - if (d_col) { - GroongaAdmin.update_createrecord_loadcomplete(d_sel, d_col); - } - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - GroongaAdmin.showloading( - $.ajax({ - url: '/d/column_list', - data: { - 'table' : table_name - }, - dataType: 'json', - success: function(d) { - if (GroongaAdmin.validateajax(d) < 0) { return; } - d_col = d; - if (d_sel) { - GroongaAdmin.update_createrecord_loadcomplete(d_sel, d_col); - } - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - }, - createtable: function() { - var flags = 0; - $('#createtable-flags>input:checked').each(function() { - flags |= Groonga[$(this).val()]; - }); - flags |= Groonga[$('#createtable-key-index').val()]; - GroongaAdmin.showloading( - $.ajax({ - url: '/d/table_create', - data: { - name: $('#createtable-name').val(), - 'flags': flags, - key_type: $('#createtable-key-type').val(), - value_type: $('#createtable-value-type').val(), - default_tokenizer: $('#createtable-default-tokenizer').val() - }, - dataType: 'json', - success: function(d) { - if (GroongaAdmin.validateajax(d) < 0) { return; } - GroongaAdmin.hideloading(); - alert('テーブルを作成しました。'); - GroongaAdmin.update_tablelist(); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - }, - createcolumn: function() { - var flags = 0; - $('#createcolumn-flags>input:checked').each(function() { - flags |= Groonga[$(this).val()]; - }); - $('#createcolumn-ii-flags>input:checked').each(function() { - flags |= Groonga[$(this).val()]; - }); - flags |= Groonga[$('#createcolumn-column-type').val()]; - flags |= Groonga[$('#createcolumn-column-compress').val()]; - d = { - table: GroongaAdmin.current_table, - name: $('#createcolumn-name').val(), - 'flags': flags, - type: $('#createcolumn-type').val() - }; - if ($('#createcolumn-source').val()) { - d['source'] = $('#createcolumn-source').val(); - } - GroongaAdmin.showloading( - $.ajax({ - url: '/d/column_create', - data: d, - dataType: 'json', - success: function(d) { - if (GroongaAdmin.validateajax(d) < 0) { return; } - GroongaAdmin.hideloading(); - alert('カラムを作成しました。'); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - }, - createrecord_getvalue: function(type, inputbox) { - switch(type){ - case "Bool": - if (inputbox.is('input:checked')) { - return true; - } else { - return false; - } - default: - return inputbox.val(); - } - }, - createrecord: function() { - var d = {}; - $('.create-record-columns').each(function() { - if (!$(this).children('.columnval').children().attr('disabled') - || $(this).children('.columnname').text() == "_key") { - var type = $(this).children('.columntype').children().text(); - if ($(this).children('.columnval').children('span').length) { - var arr = []; - $(this).children('.columnval').children('.column_values').each(function() { - arr.push(GroongaAdmin.createrecord_getvalue(type, $(this))); - }); - d[$(this).children('.columnname').text()] = arr; - } else { - d[$(this).children('.columnname').text()] = - GroongaAdmin.createrecord_getvalue(type, $(this).children('.columnval').children()); - } - } - }); - GroongaAdmin.showloading( - $.ajax({ - url: '/d/load', - data: { - "table" : GroongaAdmin.current_table, - "input_type" : "json", - "output_type" : "json", - "values" : $.toJSON([d]) - }, - dataType: 'json', - success: function(d) { - if (GroongaAdmin.validateajax(d) < 0) { return; } - GroongaAdmin.hideloading(); - alert('レコードを作成しました。'); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - }, - removerecord: function() { - var checklist = $("#tab-recordlist-table").find("input:checked"); - var completecount = checklist.length; - if (completecount > 0) { - $('<div />') - .append("選択した" + completecount + "件のレコードを削除しますか?") - .dialog({ - modal: true, - buttons: { - 'いいえ': function() { - $(this).dialog('close'); - }, - 'はい': function() { - $(this).dialog('close'); - checklist.each(function(i, val) { - GroongaAdmin.showloading( - $.ajax({ - url: '/d/delete', - data: { - "table" : GroongaAdmin.current_table, - "id" : val.value - }, - dataType: 'json', - success: function() { - if (--completecount == 0) { - $('#tab-recordlist-submit').click(); - alert('レコードを削除しました。'); - } else if (completecount < 0){ - GroongaAdmin.hideloading(); - } - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - completecount = 0; - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - }); - } - } - }); - } - }, - removecolumn: function() { - var checklist = $("#tab-columnlist-table").find("input:checked"); - var completecount = checklist.length; - if (completecount) { - $('<div />') - .append("選択した" + completecount + "件のカラムを削除しますか?") - .dialog({ - modal: true, - buttons: { - 'いいえ': function() { - $(this).dialog('close'); - }, - 'はい': function() { - $(this).dialog('close'); - checklist.each(function(i, val) { - GroongaAdmin.showloading( - $.ajax({ - url: '/d/column_remove', - data: { - "table" : GroongaAdmin.current_table, - "name" : val.value - }, - dataType: 'json', - success: function() { - if (!(--completecount)) { - GroongaAdmin.columnlist(GroongaAdmin.current_table); - alert('カラムを削除しました。'); - } else if (completecount < 0){ - GroongaAdmin.hideloading(); - } - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - completecount = 0; - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - }); - } - } - }); - } - }, - removetable: function() { - var checklist = $("#tab-tablelist-table").find("input:checked"); - var completecount = checklist.length; - if (completecount > 0) { - $('<div />') - .append("選択した" + completecount + "件のテーブルを削除しますか?") - .dialog({ - modal: true, - buttons: { - 'いいえ': function() { - $(this).dialog('close'); - }, - 'はい': function() { - $(this).dialog('close'); - checklist.each(function(i, val) { - GroongaAdmin.showloading( - $.ajax({ - url: '/d/table_remove', - data: { - "name" : val.value - }, - dataType: 'json', - success: function() { - if (--completecount == 0) { - GroongaAdmin.tablelist(); - GroongaAdmin.update_tablelist(); - alert('テーブルを削除しました。'); - } else if (completecount < 0){ - GroongaAdmin.hideloading(); - } - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - completecount = 0; - GroongaAdmin.errorloading(XMLHttpRequest); - } - }) - ); - }); - } - } - }); - } - }, - showloading: function(obj, hide_dialog) { - if (obj == null) { return; } - GroongaAdmin.semaphore[GroongaAdmin.semaphore.length] = obj; - if ( $("#loadingdialog").size() > 0 || hide_dialog) { return; } - $("<div />") - .attr("id", "loadingdialog") - .attr("style", "text-align: center;") - .append($("<img />").attr("src", "images/loading.gif")) - .append(" Loading...") - .dialog({ - title: "", - width: 200, - height: 110, - minHeight: 110, - modal: true, - resizable: false, - draggable: false, - position: ["right", "bottom"], - autoOpen: false, - buttons: { - '中止': function() { - if (obj) { obj.abort(); } - GroongaAdmin.hideloading(); - } - } - }); - $("#loadingdialog").parents(".ui-dialog").children(".ui-dialog-titlebar").remove(); - $("#loadingdialog").dialog("open"); - $(".ui-widget-overlay").css("opacity", "0.0"); - }, - hideloading: function() { - for ( i = 0; i < GroongaAdmin.semaphore.length; i++) { - if ( GroongaAdmin.semaphore[i].readyState == 4) { - GroongaAdmin.semaphore.splice(i, 1); - i--; - } - } - if ( GroongaAdmin.semaphore.length == 0) { - $("#loadingdialog").dialog("close"); - $("#loadingdialog").remove(); - } - }, - errorloading: function(ajax, hide_dialog) { - var json = null; - if (ajax) { - json = jQuery.parseJSON(ajax.responseText); - } - GroongaAdmin.hideloading(); - for ( i = 0; i < GroongaAdmin.semaphore.length; i++) { - GroongaAdmin.semaphore[i].abort(); - GroongaAdmin.semaphore.splice(i, 1); - i--; - } - if ( $("#loadingdialog").size() == 0 && !hide_dialog) { - var errtext; - if (json){ - errtext = "groongaでエラーが発生しました。<br>" + json[0][3] + "(" + json[0][0] + ")"; - } else if (ajax) { - errtext = "通信エラーが発生しました。<br>" + ajax.status + ajax.statusText; - } else { - errtext = "通信エラーが発生しました。"; - } - $("<div />") - .append(errtext) - .attr("id", "loadingdialog") - .dialog({ - title: "", - width: 340, - height: 160, - minHeight: 160, - modal: true, - resizable: false, - draggable: false, - open: function() { - $(this).parents(".ui-dialog").children(".ui-dialog-titlebar").remove(); - }, - buttons: { OK: function() { GroongaAdmin.hideloading(); } } - }); - } - }, - validateajax: function(d, hide_dialog) { - if (!d) { - GroongaAdmin.errorloading(null, hide_dialog); - return -1; - } - return 0; - } -}; $(function() { GroongaAdmin.initialize(); GroongaAdmin.tablelist(); Copied: data/html/admin/js/groonga-admin.js (+0 -259) 76% =================================================================== --- data/html/admin/index.html 2012-04-03 18:40:14 +0900 (e72ab0f) +++ data/html/admin/js/groonga-admin.js 2012-04-04 10:50:09 +0900 (ccf07ab) @@ -1,251 +1,3 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html lang="ja"> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<meta http-equiv="Content-Style-Type" content="text/css"> -<meta http-equiv="Content-Script-Type" content="text/javascript"> -<meta name="robots" content="noindex,nofollow,noarchive"> -<title>groonga admin</title> -<link rel="shortcut icon" href="favicon.ico"> -<link rel="icon" href="favicon.png"> -<link rel="stylesheet" type="text/css" href="css/admin.css"> -<link rel="stylesheet" type="text/css" href="css/ui-lightness/jquery-ui-1.8.1.custom.css"> -<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> -<script type="text/javascript" src="js/jquery-ui-1.8.1.custom.min.js"></script> -<script type="text/javascript" src="js/jquery.json-2.2.min.js"></script> -<script type="text/javascript" src="js/jquery.flot-0.7.min.js"></script> -</head> -<body> -<div id="header"> -</div> -<div id="body"> - <table> - <tr> - <td id="left-column"> - <div id="side-menu"> - テーブル一覧 - <ul id="side-menu-tablelist" /> - </div> - </td> - - <td id="right-column"> - <!-- database view --> - <div id="database-tabs"> - <ul> - <li><a href="#database-tab-summary">サマリー</a></li> - <li><a href="#database-tab-tablelist" id="tab-tablelist-link">テーブル一覧</a></li> - <li><a href="#database-tab-createtable">テーブル作成</a></li> - </ul> - <div id="database-tab-summary"> - <p> - groongaの管理ツールです。 - </p> - <ul> - <li>開始時間: <span id="status-starttime"></span></li> - <li>uptime: <span id="status-uptime"></span></li> - <li>クエリ数: <span id="status-n-queries"></span></li> - <li>キャッシュヒット率: <span id="status-cache-hit-rate"></span></li> - </ul> - <div id="throughput-chart" style="height: 300px; max-width: 500px;"> - </div> - </div> - <div id="database-tab-tablelist"> - <div id="tab-tablelist-table"> - </div> - <input type="button" id="tablelist-remove-table" value="選択テーブル削除"> - </div> - <div id="database-tab-createtable"> - <table> - <tr> - <td> - <label for="createtable-name">テーブル名</label> - </td> - <td> - <input type="text" id="createtable-name"> - </td> - </tr> - <tr> - <td> - 主キー - </td> - <td> - <label for="createtable-key-type">keyの型:</label> - <select id="createtable-key-type"> - <optgroup label="組み込み型" id="createtable-key-type-builtin"> - </optgroup> - <optgroup label="テーブル" id="createtable-key-type-table"> - </optgroup> - </select> - <label for="createtable-key-index">keyのインデックス種類:</label> - <select id="createtable-key-index"> - <option value="GRN_OBJ_TABLE_PAT_KEY">パトリシア木</option> - <option value="GRN_OBJ_TABLE_HASH_KEY">ハッシュテーブル</option> - <option value="GRN_OBJ_TABLE_NO_KEY">キーなし</option> - </select> - </td> - </tr> - <tr> - <td> - フラグ - </td> - <td id="createtable-flags"> - <input type="checkbox" value="GRN_OBJ_PERSISTENT" checked>永続化</input> - <input type="checkbox" value="GRN_OBJ_KEY_NORMALIZE">key文字列の正規化</input> - <input type="checkbox" value="GRN_OBJ_KEY_WITH_SIS">key文字列のsuffix登録</input> - </td> - </tr> - <tr> - <td> - valueの型 - </td> - <td> - <select id="createtable-value-type"> - <optgroup label="組み込み型" id="createtable-value-type-builtin"> - </optgroup> - <optgroup label="テーブル" id="createtable-value-type-table"> - </optgroup> - </select> - </td> - </tr> - <tr> - <td> - デフォルトトークナイザ - </td> - <td> - <select id="createtable-default-tokenizer"> - <optgroup label="組み込み" id="createtable-default-tokenizer-builtin"> - </optgroup> - </select> - </td> - </tr> - </table> - <input type="button" id="createtable-add-table" value="テーブル追加"> - </div> - </div> - - <!-- table view --> - <div id="table-tabs"> - <ul> - <li><a href="#table-tab-recordlist" id="tab-recordlist-link">レコード一覧</a></li> - <li><a href="#table-tab-columnlist" id="tab-columnlist-link">カラム一覧</a></li> - <li><a href="#table-tab-createrecord" id="tab-createrecord-link">レコード作成</a></li> - <li><a href="#table-tab-createcolumn">カラム作成</a></li> - </ul> - <div id="table-tab-recordlist"> - <input type="checkbox" id="table-tab-recordlist-full-checkbox" /><label for="table-tab-recordlist-full-checkbox">管理モード</label> - <div id="table-tab-recordlist-form-simple"> - <label for="tab-recordlist-simplequery">検索クエリ: </label><input type="text" id="tab-recordlist-simplequery"> - <select id="tab-recordlist-simplequerytype"> - <option value="query">query</option> - <option value="filter">filter</option> - </select> - <input type="checkbox" id="tab-recordlist-incremental" /><label for="tab-recordlist-incremental" id="tab-recordlist-incremental-label">インクリメンタル検索</label> - </div> - <div id="table-tab-recordlist-form-full"> - <table> - <tr><td>match_columns</td><td><input type="text" id="tab-recordlist-match_columns" /></td></tr> - <tr><td>query</td><td><input type="text" id="tab-recordlist-query" /></td></tr> - <tr><td>filter</td><td><input type="text" id="tab-recordlist-filter" /></td></tr> - <tr><td>scorer</td><td><input type="text" id="tab-recordlist-scorer" /></td></tr> - <tr><td>sortby</td><td><input type="text" id="tab-recordlist-sortby" /></td></tr> - <tr><td>output_columns</td><td><input type="text" id="tab-recordlist-output_columns" /></td></tr> - <tr><td>offset</td><td><input type="text" id="tab-recordlist-offset" /></td></tr> - <tr><td>limit</td><td><input type="text" id="tab-recordlist-limit" /></td></tr> - <tr><td>drilldown</td><td><input type="text" id="tab-recordlist-drilldown" /></td></tr> - <tr><td>drilldown_sortby</td><td><input type="text" id="tab-recordlist-drilldown_sortby" /></td></tr> - <tr><td>drilldown_output_columns</td><td><input type="text" id="tab-recordlist-drilldown_output_columns" /></td></tr> - <tr><td>drilldown_offset</td><td><input type="text" id="tab-recordlist-drilldown_offset" /></td></tr> - <tr><td>drilldown_limit</td><td><input type="text" id="tab-recordlist-drilldown_limit" /></td></tr> - </table> - </div> - <input type="button" id="tab-recordlist-submit" value="検索"/> - <div id="tab-recordlist-table"> - </div> - <input type="button" id="recordlist-remove-record" value="選択レコード削除"> - </div> - <div id="table-tab-columnlist"> - <div id="tab-columnlist-table"> - </div> - <input type="button" id="columnlist-remove-column" value="選択カラム削除"> - </div> - <div id="table-tab-createrecord"> - <table id="table-createrecord"> - </table> - <input type="button" id="createrecord-add-record" value="レコード追加"> - </div> - <div id="table-tab-createcolumn"> - <table> - <tr> - <td> - <label for="createcolumn-name">カラム名</label> - </td> - <td> - <input type="text" id="createcolumn-name"> - </td> - </tr> - <tr> - <td> - 設定 - </td> - <td> - <label for="createcolumn-type">型:</label> - <select id="createcolumn-type"> - <optgroup label="組み込み型" id="createcolumn-type-builtin"> - </optgroup> - <optgroup label="テーブル" id="createcolumn-type-table"> - </optgroup> - </select> - - <label for="createcolumn-source">テーブル型の場合カラム</label> - <select id="createcolumn-source" disabled> - </select> - - <label for="createcolumn-column-type">カラム種別:</label> - <select id="createcolumn-column-type"> - <option value="GRN_OBJ_COLUMN_SCALAR">スカラ</option> - <option value="GRN_OBJ_COLUMN_VECTOR">ベクタ</option> - <option value="GRN_OBJ_COLUMN_INDEX">転置インデックス</option> - </select> - - <label for="createcolumn-compress">圧縮:</label> - <select id="createcolumn-compress"> - <option value="GRN_OBJ_COMPRESS_NONE">圧縮なし</option> - <option value="GRN_OBJ_COMPRESS_ZLIB">zlib</option> - <option value="GRN_OBJ_COMPRESS_LZO">lzo</option> - </select> - </td> - </tr> - <tr> - <td> - フラグ - </td> - <td id="createcolumn-flags"> - <input type="checkbox" value="GRN_OBJ_PERSISTENT" checked>永続化</input> - </td> - </tr> - <tr> - <td> - 転置インデックス用フラグ - </td> - <td id="createcolumn-ii-flags"> - <input type="checkbox" value="GRN_OBJ_WITH_SECTION">段落情報を含める</input> - <input type="checkbox" value="GRN_OBJ_WITH_WEIGHT">重みを含める</input> - <input type="checkbox" value="GRN_OBJ_WITH_POSITION">位置情報を含める</input> - </td> - </tr> - </table> - <input type="button" id="createcolumn-add-column" value="カラム追加"> - </div> - </div> - </td> - </tr> - </table> -</div> -<div id="footer"> -Powered by <a href="http://jquery.com/">jQuery</a> and <a href="http://jqueryui.com/">jQuery UI</a>. -</div> -<script type="text/javascript"> function prim2html(prim, limit) { switch(typeof prim) { case 'undefined': @@ -1384,14 +1136,3 @@ GroongaAdmin = { return 0; } }; -$(function() { - GroongaAdmin.initialize(); - GroongaAdmin.tablelist(); - $.ajaxSetup({ - timeout: 10000, - cache: false - }); -}); -</script> -</body> -</html>