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>