rjack-solr 4.0.0.0-java → 4.1.0.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/History.rdoc +5 -0
  2. data/Manifest.txt +5 -4
  3. data/README.rdoc +1 -1
  4. data/init/rjack-solr +1 -1
  5. data/lib/rjack-solr/base.rb +1 -1
  6. data/lib/rjack-solr/solr-core-4.1.0.jar +0 -0
  7. data/lib/rjack-solr/solr-solrj-4.1.0.jar +0 -0
  8. data/pom.xml +2 -2
  9. data/webapp/META-INF/MANIFEST.MF +3 -3
  10. data/webapp/META-INF/NOTICE.txt +2 -2
  11. data/webapp/admin.html +1 -0
  12. data/webapp/css/styles/cloud.css +8 -1
  13. data/webapp/css/styles/common.css +21 -0
  14. data/webapp/css/styles/dashboard.css +2 -2
  15. data/webapp/css/styles/dataimport.css +183 -21
  16. data/webapp/css/styles/menu.css +2 -0
  17. data/webapp/css/styles/query.css +9 -3
  18. data/webapp/css/styles/schema-browser.css +12 -0
  19. data/webapp/img/ico/cross-button.png +0 -0
  20. data/webapp/img/ico/hammer.png +0 -0
  21. data/webapp/js/lib/console.js +11 -9
  22. data/webapp/js/lib/highlight.js +1 -1
  23. data/webapp/js/lib/jquery.autogrow.js +132 -0
  24. data/webapp/js/main.js +1 -0
  25. data/webapp/js/require.js +3 -1
  26. data/webapp/js/scripts/analysis.js +2 -2
  27. data/webapp/js/scripts/app.js +183 -78
  28. data/webapp/js/scripts/cloud.js +41 -20
  29. data/webapp/js/scripts/cores.js +5 -2
  30. data/webapp/js/scripts/dashboard.js +2 -1
  31. data/webapp/js/scripts/dataimport.js +415 -162
  32. data/webapp/js/scripts/file.js +1 -1
  33. data/webapp/js/scripts/index.js +3 -5
  34. data/webapp/js/scripts/logging.js +8 -0
  35. data/webapp/js/scripts/plugins.js +47 -7
  36. data/webapp/js/scripts/query.js +75 -49
  37. data/webapp/js/scripts/replication.js +4 -47
  38. data/webapp/js/scripts/schema-browser.js +46 -23
  39. data/webapp/tpl/cores.html +5 -0
  40. data/webapp/tpl/dashboard.html +4 -1
  41. data/webapp/tpl/dataimport.html +72 -12
  42. data/webapp/tpl/query.html +38 -3
  43. data/webapp/tpl/schema-browser.html +6 -0
  44. metadata +15 -12
  45. data/lib/rjack-solr/solr-core-4.0.0.jar +0 -0
  46. data/lib/rjack-solr/solr-solrj-4.0.0.jar +0 -0
@@ -15,6 +15,27 @@
15
15
  limitations under the License.
16
16
  */
17
17
 
18
+ var zk_error = function zk_error( xhr, text_status, error_thrown )
19
+ {
20
+ var zk = null;
21
+ try
22
+ {
23
+ eval( 'zk = ' + xhr.responseText + ';' );
24
+ }
25
+ catch( e ) {}
26
+
27
+ var message = '<p class="txt">Loading of "<code>' + xhr.url + '</code>" '
28
+ + 'failed (HTTP-Status <code>' + xhr.status + '</code>)</p>' + "\n";
29
+
30
+ if( zk.error )
31
+ {
32
+ message += '<p class="msg">"' + zk.error.esc() + '"</p>' + "\n";
33
+ }
34
+
35
+ this.closest( '#cloud' )
36
+ .html( '<div class="block" id="error">' + message + '</div>' );
37
+ };
38
+
18
39
  var init_debug = function( cloud_element )
19
40
  {
20
41
  var debug_element = $( '#debug', cloud_element );
@@ -369,13 +390,13 @@ var prepare_graph = function( graph_element, callback )
369
390
  for( var c in state )
370
391
  {
371
392
  var shards = [];
372
- for( var s in state[c] )
393
+ for( var s in state[c].shards )
373
394
  {
374
395
  var nodes = [];
375
- for( var n in state[c][s].replicas )
396
+ for( var n in state[c].shards[s].replicas )
376
397
  {
377
398
  leaf_count++;
378
- var replica = state[c][s].replicas[n]
399
+ var replica = state[c].shards[s].replicas[n]
379
400
 
380
401
  var uri = replica.base_url;
381
402
  var parts = uri.match( /^(\w+:)\/\/(([\w\d\.-]+)(:(\d+))?)(.+)$/ );
@@ -415,7 +436,7 @@ var prepare_graph = function( graph_element, callback )
415
436
  var shard = {
416
437
  name: s,
417
438
  data: {
418
- type : 'shard',
439
+ type : 'shard'
419
440
  },
420
441
  children: nodes
421
442
  };
@@ -425,7 +446,7 @@ var prepare_graph = function( graph_element, callback )
425
446
  var collection = {
426
447
  name: c,
427
448
  data: {
428
- type : 'collection',
449
+ type : 'collection'
429
450
  },
430
451
  children: shards
431
452
  };
@@ -633,19 +654,7 @@ var init_tree = function( tree_element )
633
654
  }
634
655
  );
635
656
  },
636
- error : function( xhr, text_status, error_thrown )
637
- {
638
- var message = 'Loading of <code>' + app.config.zookeeper_path + '</code> failed with "' + text_status + '" '
639
- + '(<code>' + error_thrown.message + '</code>)';
640
-
641
- if( 200 !== xhr.status )
642
- {
643
- message = 'Loading of <code>' + app.config.zookeeper_path + '</code> failed with HTTP-Status ' + xhr.status + ' ';
644
- }
645
-
646
- this
647
- .html( '<div class="block" id="error">' + message + '</div>' );
648
- },
657
+ error : zk_error,
649
658
  complete : function( xhr, text_status )
650
659
  {
651
660
  }
@@ -710,8 +719,20 @@ sammy.get
710
719
  }
711
720
  );
712
721
 
713
- $( 'a[href="' + context.path + '"]', navigation_element )
714
- .trigger( 'activate' );
722
+ $.ajax
723
+ (
724
+ {
725
+ url : app.config.solr_path + '/zookeeper?wt=json',
726
+ dataType : 'json',
727
+ context : cloud_element,
728
+ success : function( response, text_status, xhr )
729
+ {
730
+ $( 'a[href="' + context.path + '"]', navigation_element )
731
+ .trigger( 'activate' );
732
+ },
733
+ error : zk_error
734
+ }
735
+ );
715
736
 
716
737
  }
717
738
  );
@@ -36,7 +36,7 @@ sammy.bind
36
36
  },
37
37
  success : function( response, text_status, xhr )
38
38
  {
39
- app.cores_data = response.status;
39
+ app.set_cores_data( response );
40
40
  params.callback( app.cores_data );
41
41
  },
42
42
  error : function( xhr, text_status, error_thrown)
@@ -189,7 +189,7 @@ sammy.get
189
189
  // index-data
190
190
 
191
191
  $( '.lastModified dd', index_data_element )
192
- .html( core_data.index.lastModified );
192
+ .html( core_data.index.lastModified || '-' );
193
193
 
194
194
  $( '.version dd', index_data_element )
195
195
  .html( core_data.index.version );
@@ -199,6 +199,9 @@ sammy.get
199
199
 
200
200
  $( '.maxDoc dd', index_data_element )
201
201
  .html( core_data.index.maxDoc );
202
+
203
+ $( '.deletedDocs dd', index_data_element )
204
+ .html( core_data.index.deletedDocs || '-' );
202
205
 
203
206
  $( '.optimized dd', index_data_element )
204
207
  .addClass( !core_data.index.hasDeletions ? 'ico-1' : 'ico-0' );
@@ -39,7 +39,7 @@ var set_healthcheck_status = function( status )
39
39
  // #/:core
40
40
  sammy.get
41
41
  (
42
- /^#\/([\w\d-]+)$/,
42
+ new RegExp( app.core_regex_base + '$' ),
43
43
  function( context )
44
44
  {
45
45
  var core_basepath = this.active_core.attr( 'data-basepath' );
@@ -114,6 +114,7 @@ sammy.get
114
114
  var data = {
115
115
  'index_num-docs' : response['index']['numDocs'],
116
116
  'index_max-doc' : response['index']['maxDoc'],
117
+ 'index_deleted-docs' : response['index']['deletedDocs'],
117
118
  'index_version' : response['index']['version'],
118
119
  'index_segmentCount' : response['index']['segmentCount'],
119
120
  'index_last-modified' : response['index']['lastModified']
@@ -15,48 +15,8 @@
15
15
  limitations under the License.
16
16
  */
17
17
 
18
- var convert_duration_to_seconds = function( str )
19
- {
20
- var ret = 0;
21
- var parts = new String( str ).split( '.' ).shift().split( ':' ).reverse();
22
- var parts_count = parts.length;
23
-
24
- for( var i = 0; i < parts_count; i++ )
25
- {
26
- ret += parseInt( parts[i], 10 ) * Math.pow( 60, i );
27
- }
28
-
29
- return ret;
30
- }
31
-
32
- var convert_seconds_to_readable_time = function( value )
33
- {
34
- var text = [];
35
- value = parseInt( value );
36
-
37
- var minutes = Math.floor( value / 60 );
38
- var hours = Math.floor( minutes / 60 );
39
-
40
- if( 0 !== hours )
41
- {
42
- text.push( hours + 'h' );
43
- value -= hours * 60 * 60;
44
- minutes -= hours * 60;
45
- }
46
-
47
- if( 0 !== minutes )
48
- {
49
- text.push( minutes + 'm' );
50
- value -= minutes * 60;
51
- }
52
-
53
- if( 0 !== value )
54
- {
55
- text.push( value + 's' );
56
- }
57
-
58
- return text.join( ' ' );
59
- }
18
+ var dataimport_timeout = 2000;
19
+ var cookie_dataimport_autorefresh = 'dataimport_autorefresh';
60
20
 
61
21
  sammy.bind
62
22
  (
@@ -101,7 +61,7 @@ sammy.bind
101
61
  // #/:core/dataimport
102
62
  sammy.get
103
63
  (
104
- /^#\/([\w\d-]+)\/(dataimport)$/,
64
+ new RegExp( app.core_regex_base + '\\/(dataimport)$' ),
105
65
  function( context )
106
66
  {
107
67
  sammy.trigger
@@ -129,7 +89,7 @@ sammy.get
129
89
  // #/:core/dataimport
130
90
  sammy.get
131
91
  (
132
- /^#\/([\w\d-]+)\/(dataimport)\//,
92
+ new RegExp( app.core_regex_base + '\\/(dataimport)\\/' ),
133
93
  function( context )
134
94
  {
135
95
  var core_basepath = this.active_core.attr( 'data-basepath' );
@@ -152,7 +112,11 @@ sammy.get
152
112
  var dataimport_element = $( '#dataimport', content_element );
153
113
  var form_element = $( '#form', dataimport_element );
154
114
  var config_element = $( '#config', dataimport_element );
155
- var config_error_element = $( '#config-error', dataimport_element );
115
+ var error_element = $( '#error', dataimport_element );
116
+ var debug_response_element = $( '#debug_response', dataimport_element );
117
+
118
+ var autorefresh_status = false;
119
+ var debug_mode = false;
156
120
 
157
121
  // handler
158
122
 
@@ -195,24 +159,23 @@ sammy.get
195
159
  $.ajax
196
160
  (
197
161
  {
198
- url : handler_url + '?command=show-config',
162
+ url : handler_url + '?command=show-config&indent=true',
199
163
  dataType : 'xml',
200
164
  context : $( '#dataimport_config', config_element ),
201
165
  beforeSend : function( xhr, settings )
202
166
  {
167
+ error_element
168
+ .empty()
169
+ .hide();
203
170
  },
204
171
  success : function( config, text_status, xhr )
205
172
  {
206
173
  dataimport_element
207
174
  .removeClass( 'error' );
208
-
209
- config_error_element
210
- .hide();
211
175
 
212
176
  config_element
213
177
  .addClass( 'hidden' );
214
178
 
215
-
216
179
  var entities = [ '<option value=""></option>' ];
217
180
 
218
181
  $( 'document > entity', config )
@@ -226,6 +189,9 @@ sammy.get
226
189
 
227
190
  $( '#entity', form_element )
228
191
  .html( entities.join( "\n" ) );
192
+
193
+ $( '.editable textarea', this )
194
+ .val( xhr.responseText.replace( /\n+$/, '' ) );
229
195
  },
230
196
  error : function( xhr, text_status, error_thrown )
231
197
  {
@@ -234,7 +200,8 @@ sammy.get
234
200
  dataimport_element
235
201
  .addClass( 'error' );
236
202
 
237
- config_error_element
203
+ error_element
204
+ .text( 'Dataimport XML-Configuration is not valid' )
238
205
  .show();
239
206
 
240
207
  config_element
@@ -248,7 +215,7 @@ sammy.get
248
215
  xhr.responseText.esc() +
249
216
  '</code></pre>'
250
217
  );
251
- this.html( code );
218
+ $( '.formatted', this ).html( code );
252
219
 
253
220
  if( 'success' === text_status )
254
221
  {
@@ -260,7 +227,7 @@ sammy.get
260
227
  }
261
228
  dataimport_fetch_config();
262
229
 
263
- $( '.toggle', config_element )
230
+ $( '.block .toggle', dataimport_element )
264
231
  .die( 'click' )
265
232
  .live
266
233
  (
@@ -325,159 +292,353 @@ sammy.get
325
292
  );
326
293
  return false;
327
294
  }
328
- )
295
+ );
296
+
297
+ var debug_mode_element = $( '.debug_mode', config_element );
298
+ debug_mode_element
299
+ .die( 'click' )
300
+ .live
301
+ (
302
+ 'click',
303
+ function( event )
304
+ {
305
+ var self = $( this );
306
+ var block = self.closest( '.block' )
307
+
308
+ var debug_checkbox = $( 'input[name="debug"]', form_element );
309
+ var submit_span = $( 'button[type="submit"] span', form_element );
310
+
311
+ debug_mode = !debug_mode;
312
+
313
+ block.toggleClass( 'debug_mode', debug_mode );
314
+
315
+ if( debug_mode )
316
+ {
317
+ block.removeClass( 'hidden' );
318
+
319
+ debug_checkbox
320
+ .attr( 'checked', 'checked' )
321
+ .trigger( 'change' );
322
+
323
+ submit_span
324
+ .data( 'original', submit_span.text() )
325
+ .text( submit_span.data( 'debugmode' ) );
326
+
327
+ $( 'textarea', block )
328
+ .autogrow()
329
+ }
330
+ else
331
+ {
332
+ submit_span
333
+ .text( submit_span.data( 'original' ) )
334
+ .removeData( 'original' );
335
+ }
336
+ }
337
+ );
338
+
339
+ // abort
340
+
341
+ var abort_import_element = $( '.abort-import', dataimport_element );
342
+ abort_import_element
343
+ .off( 'click' )
344
+ .on
345
+ (
346
+ 'click',
347
+ function( event )
348
+ {
349
+ var span_element = $( 'span', this );
350
+
351
+ $.ajax
352
+ (
353
+ {
354
+ url : handler_url + '?command=abort&wt=json',
355
+ dataType : 'json',
356
+ type: 'POST',
357
+ context: $( this ),
358
+ beforeSend : function( xhr, settings )
359
+ {
360
+ span_element
361
+ .addClass( 'loader' );
362
+ },
363
+ success : function( response, text_status, xhr )
364
+ {
365
+ span_element
366
+ .data( 'original', span_element.text() )
367
+ .text( span_element.data( 'aborting' ) );
368
+
369
+ this
370
+ .removeClass( 'warn' )
371
+ .addClass( 'success' );
372
+
373
+ window.setTimeout
374
+ (
375
+ function()
376
+ {
377
+ $( 'span', abort_import_element )
378
+ .removeClass( 'loader' )
379
+ .text( span_element.data( 'original' ) )
380
+ .removeData( 'original' );
381
+
382
+ abort_import_element
383
+ .removeClass( 'success' )
384
+ .addClass( 'warn' );
385
+ },
386
+ dataimport_timeout * 2
387
+ );
388
+
389
+ dataimport_fetch_status();
390
+ }
391
+ }
392
+ );
393
+ return false;
394
+ }
395
+ );
329
396
 
330
397
  // state
398
+
399
+ var status_button = $( 'form button.refresh-status', form_element );
400
+
401
+ status_button
402
+ .off( 'click' )
403
+ .on
404
+ (
405
+ 'click',
406
+ function( event )
407
+ {
408
+ dataimport_fetch_status();
409
+ return false;
410
+ }
411
+ )
412
+ .trigger( 'click' );
331
413
 
332
- function dataimport_fetch_status()
414
+ function dataimport_fetch_status( clear_timeout )
333
415
  {
416
+ if( clear_timeout )
417
+ {
418
+ app.clear_timeout();
419
+ }
420
+
334
421
  $.ajax
335
422
  (
336
423
  {
337
- url : handler_url + '?command=status',
338
- dataType : 'xml',
424
+ url : handler_url + '?command=status&indent=true&wt=json',
425
+ dataType : 'json',
339
426
  beforeSend : function( xhr, settings )
340
427
  {
428
+ $( 'span', status_button )
429
+ .addClass( 'loader' );
341
430
  },
342
431
  success : function( response, text_status, xhr )
343
432
  {
344
433
  var state_element = $( '#current_state', content_element );
345
434
 
346
- var status = $( 'str[name="status"]', response ).text();
347
- var rollback_element = $( 'str[name="Rolledback"]', response );
348
- var messages_count = $( 'lst[name="statusMessages"] str', response ).size();
435
+ var status = response.status;
436
+ var rollback_time = response.statusMessages.Rolledback || null;
437
+ var abort_time = response.statusMessages.Aborted || null;
438
+
439
+ var messages = response.statusMessages;
440
+ var messages_count = 0;
441
+ for( var key in messages ) { messages_count++; }
349
442
 
350
- var started_at = $( 'str[name="Full Dump Started"]', response ).text();
351
- if( !started_at )
443
+ var format_number = function format_number( number )
352
444
  {
353
- started_at = (new Date()).toGMTString();
354
- }
445
+ return ( number || 0 ).toString().replace( /\B(?=(\d{3})+(?!\d))/g, '\'' );
446
+ };
355
447
 
356
- function dataimport_compute_details( response, details_element )
448
+ function dataimport_compute_details( response, details_element, elapsed_seconds )
357
449
  {
358
- var details = [];
359
-
360
- var requests = parseInt( $( 'str[name="Total Requests made to DataSource"]', response ).text(), 10 );
361
- if( requests )
362
- {
363
- details.push
364
- (
365
- '<abbr title="Total Requests made to DataSource">Requests</abbr>: ' +
366
- requests
367
- );
368
- }
450
+ details_element
451
+ .show();
452
+
453
+ // --
369
454
 
370
- var fetched = parseInt( $( 'str[name="Total Rows Fetched"]', response ).text(), 10 );
371
- if( fetched )
455
+ var document_config = {
456
+ 'Requests' : 'Total Requests made to DataSource',
457
+ 'Fetched' : 'Total Rows Fetched',
458
+ 'Skipped' : 'Total Documents Skipped',
459
+ 'Processed' : 'Total Documents Processed'
460
+ };
461
+
462
+ var document_details = [];
463
+ for( var key in document_config )
372
464
  {
373
- details.push
374
- (
375
- '<abbr title="Total Rows Fetched">Fetched</abbr>: ' +
376
- fetched
377
- );
378
- }
465
+ var value = parseInt( response.statusMessages[document_config[key]], 10 );
466
+
467
+ var detail = '<abbr title="' + document_config[key].esc() + '">' + key.esc() + '</abbr>: ' + format_number( value ).esc();
468
+ if( elapsed_seconds && 'skipped' !== key.toLowerCase() )
469
+ {
470
+ detail += ' <span>(' + format_number( Math.round( value / elapsed_seconds ) ).esc() + '/s)</span>'
471
+ }
472
+
473
+ document_details.push( detail );
474
+ };
475
+
476
+ $( '.docs', details_element )
477
+ .html( document_details.join( ', ' ) );
478
+
479
+ // --
379
480
 
380
- var skipped = parseInt( $( 'str[name="Total Documents Skipped"]', response ).text(), 10 );
381
- if( requests )
481
+ var dates_config = {
482
+ 'Started' : 'Full Dump Started',
483
+ 'Aborted' : 'Aborted',
484
+ 'Rolledback' : 'Rolledback'
485
+ };
486
+
487
+ var dates_details = [];
488
+ for( var key in dates_config )
382
489
  {
383
- details.push
384
- (
385
- '<abbr title="Total Documents Skipped">Skipped</abbr>: ' +
386
- skipped
387
- );
388
- }
490
+ var value = response.statusMessages[dates_config[key]];
491
+
492
+ if( value )
493
+ {
494
+ var detail = '<abbr title="' + dates_config[key].esc() + '">' + key.esc() + '</abbr>: '
495
+ + '<abbr class="time">' + value.esc() + '</abbr>';
496
+ dates_details.push( detail );
497
+ }
498
+ };
389
499
 
390
- var processed = parseInt( $( 'str[name="Total Documents Processed"]', response ).text(), 10 );
391
- if( processed )
500
+ var dates_element = $( '.dates', details_element );
501
+
502
+ dates_element
503
+ .html( dates_details.join( ', ' ) );
504
+
505
+ $( '.time', dates_element )
506
+ .removeData( 'timeago' )
507
+ .timeago();
508
+ };
509
+
510
+ var get_time_taken = function get_default_time_taken()
511
+ {
512
+ var time_taken_text = response.statusMessages['Time taken'];
513
+ return app.convert_duration_to_seconds( time_taken_text );
514
+ };
515
+
516
+ var get_default_info_text = function default_info_text()
517
+ {
518
+ var info_text = response.statusMessages[''] || '';
519
+
520
+ // format numbers included in status nicely
521
+ info_text = info_text.replace
522
+ (
523
+ /\d{4,}/g,
524
+ function( match, position, string )
525
+ {
526
+ return format_number( parseInt( match, 10 ) );
527
+ }
528
+ );
529
+
530
+ var time_taken_text = app.convert_seconds_to_readable_time( get_time_taken() );
531
+ if( time_taken_text )
392
532
  {
393
- details.push
394
- (
395
- '<abbr title="Total Documents Processed">Processed</abbr>: ' +
396
- processed
397
- );
533
+ info_text += ' (Duration: ' + time_taken_text.esc() + ')';
398
534
  }
399
535
 
400
- details_element
401
- .html( details.join( ', ' ) )
402
- .show();
403
- }
536
+ return info_text;
537
+ };
538
+
539
+ var show_info = function show_info( info_text, elapsed_seconds )
540
+ {
541
+ $( '.info strong', state_element )
542
+ .text( info_text || get_default_info_text() );
543
+
544
+ $( '.info .details', state_element )
545
+ .hide();
546
+ };
547
+
548
+ var show_full_info = function show_full_info( info_text, elapsed_seconds )
549
+ {
550
+ show_info( info_text, elapsed_seconds );
551
+
552
+ dataimport_compute_details
553
+ (
554
+ response,
555
+ $( '.info .details', state_element ),
556
+ elapsed_seconds || get_time_taken()
557
+ );
558
+ };
404
559
 
405
560
  state_element
406
- .removeClass( 'indexing' )
407
- .removeClass( 'success' )
408
- .removeClass( 'failure' );
409
-
561
+ .removeAttr( 'class' );
562
+
563
+ var current_time = new Date();
564
+ $( '.last_update abbr', state_element )
565
+ .text( current_time.toTimeString().split( ' ' ).shift() )
566
+ .attr( 'title', current_time.toUTCString() );
567
+
410
568
  $( '.info', state_element )
411
569
  .removeClass( 'loader' );
412
570
 
413
- if( 0 !== rollback_element.size() )
571
+ if( 'busy' === status )
414
572
  {
415
573
  state_element
416
- .addClass( 'failure' )
417
- .show();
574
+ .addClass( 'indexing' );
418
575
 
419
- $( '.time', state_element )
420
- .text( rollback_element.text() )
421
- .timeago()
422
- .show();
576
+ if( autorefresh_status )
577
+ {
578
+ $( '.info', state_element )
579
+ .addClass( 'loader' );
580
+ }
423
581
 
424
- $( '.info strong', state_element )
425
- .text( $( 'str[name=""]', response ).text() );
582
+ var time_elapsed_text = response.statusMessages['Time Elapsed'];
583
+ var elapsed_seconds = app.convert_duration_to_seconds( time_elapsed_text );
584
+ time_elapsed_text = app.convert_seconds_to_readable_time( elapsed_seconds );
426
585
 
427
- $( '.info .details', state_element )
428
- .hide();
429
-
430
- console.debug( 'rollback @ ', rollback_element.text() );
586
+ var info_text = time_elapsed_text
587
+ ? 'Indexing since ' + time_elapsed_text
588
+ : 'Indexing ...';
589
+
590
+ show_full_info( info_text, elapsed_seconds );
431
591
  }
432
- else if( 'idle' === status && 0 !== messages_count )
592
+ else if( rollback_time )
433
593
  {
434
594
  state_element
435
- .addClass( 'success' )
436
- .show();
595
+ .addClass( 'failure' );
437
596
 
438
- $( '.time', state_element )
439
- .text( started_at )
440
- .timeago()
441
- .show();
442
-
443
- $( '.info strong', state_element )
444
- .text( $( 'str[name=""]', response ).text() );
597
+ show_full_info();
598
+ }
599
+ else if( abort_time )
600
+ {
601
+ state_element
602
+ .addClass( 'aborted' );
445
603
 
446
- dataimport_compute_details( response, $( '.info .details', state_element ) );
604
+ show_full_info( 'Aborting current Import ...' );
447
605
  }
448
- else if( 'busy' === status )
606
+ else if( 'idle' === status && 0 !== messages_count )
449
607
  {
450
608
  state_element
451
- .addClass( 'indexing' )
452
- .show();
609
+ .addClass( 'success' );
453
610
 
454
- $( '.time', state_element )
455
- .text( started_at )
456
- .timeago()
457
- .show();
611
+ show_full_info();
612
+ }
613
+ else
614
+ {
615
+ state_element
616
+ .addClass( 'idle' );
458
617
 
459
- $( '.info', state_element )
460
- .addClass( 'loader' );
618
+ show_info( 'No information available (idle)' );
619
+ }
461
620
 
462
- var indexing_text = 'Indexing ...';
621
+ // show raw status
463
622
 
464
- var time_elapsed_text = $( 'str[name="Time Elapsed"]', response ).text();
465
- time_elapsed_text = convert_seconds_to_readable_time( convert_duration_to_seconds( time_elapsed_text ) );
466
- if( time_elapsed_text.length )
467
- {
468
- indexing_text = 'Indexing since ' + time_elapsed_text
469
- }
623
+ var code = $(
624
+ '<pre class="syntax language-json"><code>' +
625
+ app.format_json( xhr.responseText ).esc() +
626
+ '</code></pre>'
627
+ );
470
628
 
471
- $( '.info strong', state_element )
472
- .text( indexing_text );
473
-
474
- dataimport_compute_details( response, $( '.info .details', state_element ) );
629
+ $( '#raw_output_container', content_element ).html( code );
630
+ hljs.highlightBlock( code.get(0) );
475
631
 
476
- window.setTimeout( dataimport_fetch_status, 2000 );
477
- }
478
- else
632
+ if( !app.timeout && autorefresh_status )
479
633
  {
480
- state_element.hide();
634
+ app.timeout = window.setTimeout
635
+ (
636
+ function()
637
+ {
638
+ dataimport_fetch_status( true )
639
+ },
640
+ dataimport_timeout
641
+ );
481
642
  }
482
643
  },
483
644
  error : function( xhr, text_status, error_thrown )
@@ -489,24 +650,47 @@ sammy.get
489
650
  },
490
651
  complete : function( xhr, text_status )
491
652
  {
653
+ $( 'span', status_button )
654
+ .removeClass( 'loader' )
655
+ .addClass( 'success' );
656
+
657
+ window.setTimeout
658
+ (
659
+ function()
660
+ {
661
+ $( 'span', status_button )
662
+ .removeClass( 'success' );
663
+ },
664
+ dataimport_timeout / 2
665
+ );
492
666
  }
493
667
  }
494
668
  );
495
669
  }
496
- dataimport_fetch_status();
497
670
 
498
671
  // form
499
672
 
500
- $( 'form', form_element )
673
+ var form = $( 'form', form_element );
674
+
675
+ form
501
676
  .ajaxForm
502
677
  (
503
678
  {
504
679
  url : handler_url,
505
- dataType : 'xml',
680
+ data : {
681
+ wt : 'json',
682
+ indent : 'true'
683
+ },
684
+ dataType : 'json',
685
+ type: 'POST',
506
686
  beforeSend : function( xhr, settings )
507
687
  {
508
- $( 'form button', form_element )
688
+ $( 'button[type="submit"] span', form_element )
509
689
  .addClass( 'loader' );
690
+
691
+ error_element
692
+ .empty()
693
+ .hide();
510
694
  },
511
695
  beforeSubmit : function( array, form, options )
512
696
  {
@@ -545,22 +729,91 @@ sammy.get
545
729
  array.push( { name : tmp[0], value: tmp[1] } );
546
730
  }
547
731
  }
732
+
733
+ if( debug_mode )
734
+ {
735
+ array.push( { name: 'dataConfig', value: $( '#dataimport_config .editable textarea' ).val() } );
736
+ }
548
737
  },
549
738
  success : function( response, text_status, xhr )
550
739
  {
551
- dataimport_fetch_status();
552
740
  },
553
741
  error : function( xhr, text_status, error_thrown )
554
742
  {
555
- console.debug( arguments );
743
+ var response = null;
744
+ try
745
+ {
746
+ eval( 'response = ' + xhr.responseText + ';' );
747
+ }
748
+ catch( e ){}
749
+
750
+ error_element
751
+ .text( response.error.msg || 'Unknown Error (Exception w/o Message)' )
752
+ .show();
556
753
  },
557
754
  complete : function( xhr, text_status )
558
755
  {
559
- $( 'form button', form_element )
756
+ $( 'button[type="submit"] span', form_element )
560
757
  .removeClass( 'loader' );
758
+
759
+ var debug = $( 'input[name="debug"]:checked', form );
760
+ if( 0 !== debug.size() )
761
+ {
762
+ var code = $(
763
+ '<pre class="syntax language-json"><code>' +
764
+ app.format_json( xhr.responseText ).esc() +
765
+ '</code></pre>'
766
+ );
767
+
768
+ $( '.content', debug_response_element ).html( code );
769
+ hljs.highlightBlock( code.get(0) );
770
+ }
771
+
772
+ dataimport_fetch_status();
561
773
  }
562
774
  }
563
775
  );
776
+
777
+ $( 'input[name="debug"]', form )
778
+ .off( 'change' )
779
+ .on
780
+ (
781
+ 'change',
782
+ function( event )
783
+ {
784
+ debug_response_element.toggle( this.checked );
785
+ }
786
+ );
787
+
788
+ $( '#auto-refresh-status a', form_element )
789
+ .off( 'click' )
790
+ .on
791
+ (
792
+ 'click',
793
+ function( event )
794
+ {
795
+ $.cookie( cookie_dataimport_autorefresh, $.cookie( cookie_dataimport_autorefresh ) ? null : true );
796
+ $( this ).trigger( 'state' );
797
+
798
+ dataimport_fetch_status();
799
+
800
+ return false;
801
+ }
802
+ )
803
+ .off( 'state' )
804
+ .on
805
+ (
806
+ 'state',
807
+ function( event )
808
+ {
809
+ autorefresh_status = !!$.cookie( cookie_dataimport_autorefresh );
810
+
811
+ $.cookie( cookie_dataimport_autorefresh )
812
+ ? $( this ).addClass( 'on' )
813
+ : $( this ).removeClass( 'on' );
814
+ }
815
+ )
816
+ .trigger( 'state' );
564
817
  }
565
818
  );
566
819
  }