admin_data 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. data/History.txt +221 -0
  2. data/README.textile +21 -0
  3. data/Rakefile +46 -0
  4. data/app/controllers/admin_data/base_controller.rb +114 -0
  5. data/app/controllers/admin_data/diagnostic_controller.rb +28 -0
  6. data/app/controllers/admin_data/feed_controller.rb +17 -0
  7. data/app/controllers/admin_data/main_controller.rb +132 -0
  8. data/app/controllers/admin_data/migration_controller.rb +19 -0
  9. data/app/controllers/admin_data/search_controller.rb +125 -0
  10. data/app/controllers/admin_data/validate_model_controller.rb +106 -0
  11. data/app/views/admin_data/diagnostic/index.html.erb +17 -0
  12. data/app/views/admin_data/diagnostic/missing_index.html.erb +26 -0
  13. data/app/views/admin_data/feed/index.rss.builder +24 -0
  14. data/app/views/admin_data/main/all_models.html.erb +22 -0
  15. data/app/views/admin_data/main/association/_association_info.html.erb +10 -0
  16. data/app/views/admin_data/main/association/_belongs_to_info.html.erb +7 -0
  17. data/app/views/admin_data/main/association/_has_many_info.html.erb +7 -0
  18. data/app/views/admin_data/main/association/_has_one_info.html.erb +6 -0
  19. data/app/views/admin_data/main/edit.html.erb +38 -0
  20. data/app/views/admin_data/main/misc/_form.html.erb +25 -0
  21. data/app/views/admin_data/main/misc/_modify_record.html.erb +22 -0
  22. data/app/views/admin_data/main/new.html.erb +23 -0
  23. data/app/views/admin_data/main/show.html.erb +41 -0
  24. data/app/views/admin_data/main/table_structure.html.erb +55 -0
  25. data/app/views/admin_data/migration/index.html.erb +18 -0
  26. data/app/views/admin_data/migration/jstest.html.erb +51 -0
  27. data/app/views/admin_data/search/_search_base.html.erb +34 -0
  28. data/app/views/admin_data/search/advance_search.html.erb +3 -0
  29. data/app/views/admin_data/search/quick_search.html.erb +6 -0
  30. data/app/views/admin_data/search/search/_advance_search_form.html.erb +48 -0
  31. data/app/views/admin_data/search/search/_errors.html.erb +5 -0
  32. data/app/views/admin_data/search/search/_listing.html.erb +40 -0
  33. data/app/views/admin_data/search/search/_search_form.html.erb +28 -0
  34. data/app/views/admin_data/search/search/_sortby.html.erb +18 -0
  35. data/app/views/admin_data/search/search/_title.html.erb +34 -0
  36. data/app/views/admin_data/shared/_breadcrum.html.erb +10 -0
  37. data/app/views/admin_data/shared/_drop_down_klasses.html.erb +4 -0
  38. data/app/views/admin_data/shared/_flash_message.html.erb +13 -0
  39. data/app/views/admin_data/shared/_header.html.erb +23 -0
  40. data/app/views/admin_data/shared/_powered_by.html.erb +23 -0
  41. data/app/views/admin_data/shared/_secondary_navigation.html.erb +28 -0
  42. data/app/views/admin_data/validate_model/_bad.html.erb +1 -0
  43. data/app/views/admin_data/validate_model/tid.html.erb +2 -0
  44. data/app/views/admin_data/validate_model/validate.html.erb +67 -0
  45. data/app/views/layouts/admin_data.html.erb +60 -0
  46. data/config/routes.rb +34 -0
  47. data/init.rb +1 -0
  48. data/lib/admin_data.rb +34 -0
  49. data/lib/admin_data/chelper.rb +37 -0
  50. data/lib/admin_data/compatibility.rb +7 -0
  51. data/lib/admin_data/helpers.rb +222 -0
  52. data/lib/admin_data/railtie.rb +21 -0
  53. data/lib/admin_data/search.rb +186 -0
  54. data/lib/admin_data/settings.rb +72 -0
  55. data/lib/admin_data/util.rb +237 -0
  56. data/lib/admin_data/version.rb +3 -0
  57. data/lib/admin_data_date_validation.rb +79 -0
  58. data/lib/css/app.css +224 -0
  59. data/lib/css/base.css +1071 -0
  60. data/lib/css/header.css +65 -0
  61. data/lib/css/rounded.css +18 -0
  62. data/lib/css/themes/drastic-dark/style.css +374 -0
  63. data/lib/css/umbrella.css +34 -0
  64. data/lib/css/vendor/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png +0 -0
  65. data/lib/css/vendor/images/ui-bg_dots-small_65_a6a6a6_2x2.png +0 -0
  66. data/lib/css/vendor/images/ui-bg_flat_0_333333_40x100.png +0 -0
  67. data/lib/css/vendor/images/ui-bg_flat_65_ffffff_40x100.png +0 -0
  68. data/lib/css/vendor/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  69. data/lib/css/vendor/images/ui-bg_glass_55_fbf8ee_1x400.png +0 -0
  70. data/lib/css/vendor/images/ui-bg_highlight-hard_100_eeeeee_1x100.png +0 -0
  71. data/lib/css/vendor/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png +0 -0
  72. data/lib/css/vendor/images/ui-bg_highlight-soft_15_cc0000_1x100.png +0 -0
  73. data/lib/css/vendor/images/ui-icons_004276_256x240.png +0 -0
  74. data/lib/css/vendor/images/ui-icons_cc0000_256x240.png +0 -0
  75. data/lib/css/vendor/images/ui-icons_ffffff_256x240.png +0 -0
  76. data/lib/css/vendor/jquery-ui-1.7.2.custom.css +406 -0
  77. data/lib/css/vendor/qunit.css +119 -0
  78. data/lib/js/advance_search/act_on_result.js +47 -0
  79. data/lib/js/advance_search/adv_search.js +46 -0
  80. data/lib/js/advance_search/advance_search.js +60 -0
  81. data/lib/js/advance_search/advance_search_structure.js +79 -0
  82. data/lib/js/advance_search/ajaxify_advance_search.js +28 -0
  83. data/lib/js/advance_search/build_first_row.js +12 -0
  84. data/lib/js/advance_search/event_bindings.js +87 -0
  85. data/lib/js/advance_search/global_ajax_setting.js +10 -0
  86. data/lib/js/advance_search/trigger_submit_on_domready.js +6 -0
  87. data/lib/js/misc/drop_down_change.js +8 -0
  88. data/lib/js/misc/js_util.js +42 -0
  89. data/lib/js/misc/quick_search_input_focus.js +6 -0
  90. data/lib/js/test/act_on_result.js +120 -0
  91. data/lib/js/test/advance_search.js +80 -0
  92. data/lib/js/test/ajaxify_advance_search.js +29 -0
  93. data/lib/js/test/build_first_row.js +10 -0
  94. data/lib/js/test/event_bindings.js +100 -0
  95. data/lib/js/validate_model/ajaxify_form.js +66 -0
  96. data/lib/js/validate_model/select_all.js +15 -0
  97. data/lib/js/vendor/jack.js +903 -0
  98. data/lib/js/vendor/jquery-1.4.1.js +6078 -0
  99. data/lib/js/vendor/jquery-ui-1.7.2.custom.min.js +298 -0
  100. data/lib/js/vendor/jquery.ba-isjquery.js +21 -0
  101. data/lib/js/vendor/jquery.form.js +814 -0
  102. data/lib/js/vendor/jquery.lint.js +604 -0
  103. data/lib/js/vendor/log.js +9 -0
  104. data/lib/js/vendor/qunit.js +1043 -0
  105. data/lib/tasks/admin_data_tasks.rake +7 -0
  106. data/lib/tasks/validate_models_bg.rake +23 -0
  107. data/test/factories/article.rb +9 -0
  108. data/test/factories/car.rb +4 -0
  109. data/test/factories/city.rb +4 -0
  110. data/test/factories/comment.rb +6 -0
  111. data/test/factories/door.rb +4 -0
  112. data/test/factories/engine.rb +4 -0
  113. data/test/functional/base_controller_test.rb +5 -0
  114. data/test/functional/feed_controller_test.rb +34 -0
  115. data/test/functional/main_controller_test.rb +421 -0
  116. data/test/functional/migration_controller_test.rb +30 -0
  117. data/test/functional/routes_test.rb +61 -0
  118. data/test/functional/search_controller_test.rb +814 -0
  119. data/test/helper/view_helper_test.rb +177 -0
  120. data/test/misc_tests/date_validation_test.rb +32 -0
  121. data/test/misc_tests/settings_test.rb +29 -0
  122. data/test/misc_tests/util_test.rb +83 -0
  123. data/test/rails_root/Gemfile +22 -0
  124. data/test/rails_root/Gemfile.lock +101 -0
  125. data/test/rails_root/Rakefile +7 -0
  126. data/test/rails_root/app/controllers/application_controller.rb +3 -0
  127. data/test/rails_root/app/helpers/application_helper.rb +2 -0
  128. data/test/rails_root/app/models/article.rb +25 -0
  129. data/test/rails_root/app/models/city.rb +15 -0
  130. data/test/rails_root/app/models/comment.rb +13 -0
  131. data/test/rails_root/app/models/tech_magazine.rb +2 -0
  132. data/test/rails_root/app/models/vehicle/car.rb +4 -0
  133. data/test/rails_root/app/models/vehicle/door.rb +3 -0
  134. data/test/rails_root/app/models/vehicle/engine.rb +3 -0
  135. data/test/rails_root/app/views/layouts/application.html.erb +14 -0
  136. data/test/rails_root/config.ru +4 -0
  137. data/test/rails_root/config/application.rb +42 -0
  138. data/test/rails_root/config/boot.rb +13 -0
  139. data/test/rails_root/config/database.yml +22 -0
  140. data/test/rails_root/config/environment.rb +5 -0
  141. data/test/rails_root/config/environments/development.rb +22 -0
  142. data/test/rails_root/config/environments/production.rb +49 -0
  143. data/test/rails_root/config/environments/test.rb +35 -0
  144. data/test/rails_root/config/initializers/backtrace_silencers.rb +7 -0
  145. data/test/rails_root/config/initializers/inflections.rb +10 -0
  146. data/test/rails_root/config/initializers/mime_types.rb +5 -0
  147. data/test/rails_root/config/initializers/secret_token.rb +7 -0
  148. data/test/rails_root/config/initializers/session_store.rb +8 -0
  149. data/test/rails_root/config/locales/en.yml +5 -0
  150. data/test/rails_root/config/routes.rb +58 -0
  151. data/test/rails_root/db/migrate/20090809061114_create_tables.rb +70 -0
  152. data/test/rails_root/db/schema.rb +74 -0
  153. data/test/rails_root/db/seeds.rb +7 -0
  154. data/test/rails_root/script/rails +6 -0
  155. data/test/rails_root/test/performance/browsing_test.rb +0 -0
  156. data/test/rails_root/test/test_helper.rb +13 -0
  157. data/test/support/assertions.rb +20 -0
  158. data/test/test_helper.rb +74 -0
  159. metadata +321 -0
@@ -0,0 +1,10 @@
1
+ $(function() {
2
+
3
+ $.ajaxSetup({
4
+ 'beforeSend': function(xhr) {
5
+ xhr.setRequestHeader("Accept", "text/javascript");
6
+ }
7
+ });
8
+
9
+ });
10
+
@@ -0,0 +1,6 @@
1
+ $(function() {
2
+
3
+ $('#advance_search_form').trigger('submit');
4
+
5
+ });
6
+
@@ -0,0 +1,8 @@
1
+ $(function() {
2
+
3
+ $('.drop_down_value_klass').change(function() {
4
+ window.location = $(this).val();
5
+ });
6
+
7
+ });
8
+
@@ -0,0 +1,42 @@
1
+ var AdminData = AdminData || {};
2
+
3
+ AdminData.jsUtil = {
4
+
5
+ // TODO since advance search was not working with util confirm , window.confirm is used directly
6
+ // fix it later
7
+ confirm: function(arg) {
8
+ window.confirm(arg);
9
+ },
10
+
11
+ buildOptionsFromArray: function(array, element) {
12
+ element.append($('<option />'));
13
+ for (i in array) {
14
+ $('<option />').text(array[i][0]).attr('value', array[i][1]).appendTo(element);
15
+ }
16
+ element.attr('disabled', false);
17
+ },
18
+
19
+ colorizeRows: function() {
20
+ $('.colorize tr:odd').addClass('odd');
21
+ $('.colorize tr:even').addClass('even');
22
+ },
23
+
24
+ // returns date in string format. example: 07-September-2009
25
+ dateToString: function(date) {
26
+ var month = (date.getMonth() + 1).toString();
27
+ var day = date.getDate().toString();
28
+ //days between 1 and 9 should have 0 before them
29
+ if (day.length == 1) day = '0' + day;
30
+ var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
31
+ return day + "-" + months[month - 1] + "-" + date.getFullYear();
32
+ },
33
+
34
+ randomNumber: function() {
35
+ var maxVal = 100000000,
36
+ minVal = 1;
37
+ var randVal = minVal + (Math.random() * (maxVal - minVal));
38
+ return Math.round(randVal);
39
+ }
40
+
41
+ };
42
+
@@ -0,0 +1,6 @@
1
+ $(function() {
2
+
3
+ $('#quick_search_input').focus();
4
+
5
+ });
6
+
@@ -0,0 +1,120 @@
1
+ module('act_on_result', {
2
+ teardown: function() {
3
+ $('#advance_search_delete_all').remove();
4
+ $('#advance_search_destroy_all').remove();
5
+ $('#results').remove();
6
+ $('#advance_search_form').remove();
7
+ },
8
+ setup: function() {
9
+ $(document.body).append($('<a />', {
10
+ href: '#',
11
+ id: 'advance_search_delete_all'
12
+ }));
13
+
14
+ $(document.body).append($('<a />', {
15
+ href: '#',
16
+ id: 'advance_search_destroy_all'
17
+ }));
18
+
19
+ $(document.body).append($('<div />', {
20
+ id: 'results'
21
+ }));
22
+
23
+ $(document.body).append($('<div />', {
24
+ id: 'advance_search_form'
25
+ }));
26
+ }
27
+ });
28
+
29
+ test('invoking success callback', function() {
30
+ expect(1);
31
+ AdminData.actOnResult.successCallback({
32
+ success: 'hello world'
33
+ });
34
+ equals('hello world', $('#results').text(), '#results should have text hello world');
35
+ });
36
+
37
+ test('live clicking #advance_search_delete_all with cancel action', function() {
38
+ expect(0);
39
+ jack(function() {
40
+ jack.expect('AdminData.jsUtil.confirm').once().mock(function() {
41
+ return false;
42
+ });
43
+ //TODO ensure that the value passed to action is delete
44
+ jack.expect('AdminData.actOnResult.action').exactly('0 time');
45
+ $('#advance_search_delete_all').trigger('click');
46
+ });
47
+ });
48
+
49
+ test('live clicking #advance_search_delete_all', function() {
50
+ expect(0);
51
+ var args;
52
+
53
+ jack(function() {
54
+ jack.expect('AdminData.jsUtil.confirm').once().mock(function() {
55
+ return true;
56
+ });
57
+ jack.expect('AdminData.actOnResult.action').once().mock(function(action_type) {
58
+ args = action_type;
59
+ return {};
60
+ });
61
+ $('#advance_search_delete_all').trigger('click');
62
+ });
63
+ equals('delete', args, 'action_type should be delete');
64
+
65
+ });
66
+
67
+ test('live clicking #advance_search_destroy_all with cancel action', function() {
68
+ expect(0);
69
+ jack(function() {
70
+ jack.expect('AdminData.jsUtil.confirm').once().mock(function() {
71
+ return false;
72
+ });
73
+ jack.expect('AdminData.actOnResult.action').exactly('0 time');
74
+ $('#advance_search_destroy_all').trigger('click');
75
+ });
76
+ });
77
+
78
+ test('live clicking #advance_search_destroy_all', function() {
79
+ expect(0);
80
+ var args;
81
+
82
+ jack(function() {
83
+ jack.expect('AdminData.jsUtil.confirm').once().mock(function() {
84
+ return true;
85
+ });
86
+ jack.expect('AdminData.actOnResult.action').once().mock(function(action_type) {
87
+ args = action_type;
88
+ return {};
89
+ });
90
+ $('#advance_search_destroy_all').trigger('click');
91
+ });
92
+ equals('destroy', args, 'action_type should be destroy');
93
+ });
94
+
95
+ test('actOnResultAJAX', function() {
96
+ expect(5);
97
+ $('#advance_search_form').attr('action', 'http://localhost:3000');
98
+ $('#advance_search_form').data('admin_data_form_array', [{
99
+ name: 'foo',
100
+ value: 'i_am_foo'
101
+ }]);
102
+
103
+ var ajaxArgs;
104
+
105
+ jack(function() {
106
+ jack.expect('$.ajax').once().mock(function(args) {
107
+ ajaxArgs = args;
108
+ });
109
+ AdminData.actOnResult.action('delete');
110
+ });
111
+
112
+ equals('post', ajaxArgs.type, 'ajax arguments should have type as post');
113
+ equals('json', ajaxArgs.dataType, 'ajax arguments should have json as dataType');
114
+ equals('http://localhost:3000', ajaxArgs.url, 'ajax arguments should have valid url');
115
+ var data = ajaxArgs.data;
116
+ ok(data, 'ajax arguments should have value for key data');
117
+ equals('foo=i_am_foo&admin_data_advance_search_action_type=delete', data, 'data should have parameterized value');
118
+
119
+ });
120
+
@@ -0,0 +1,80 @@
1
+ module('advance_search');
2
+
3
+ test('buildFirstRow', function() {
4
+ expect(2);
5
+ $('#advance_search_table').html('');
6
+ AdminData.advanceSearch.buildFirstRow();
7
+ var $a = $('#advance_search_table').find('a');
8
+ ok($a.hasClass('add_row_link'), 'first row should have anchor element with class remove_row');
9
+ ok('+', $a.text(), 'first row should have anchor element with text +');
10
+ });
11
+
12
+
13
+ test("buildCol1", function() {
14
+ expect(3);
15
+
16
+ var $td = AdminData.advanceSearch.buildCol1();
17
+ ok($.isjQuery($td), "buildCol1 should return an instance of jQuery");
18
+
19
+ var className = $td.find('select').attr('className');
20
+ equals('col1', className, 'buildCol1 should have select with class col1');
21
+
22
+ var countOfOptions = $td.find('select option').length;
23
+ equals(12, countOfOptions, 'buildCol1 should have select with 12 options');
24
+ });
25
+
26
+ test("buildCol2", function() {
27
+ expect(3);
28
+
29
+ var $td = AdminData.advanceSearch.buildCol2();
30
+ ok($.isjQuery($td), "buildCol2 should return an instance of jQuery");
31
+
32
+ ok($td.find('select').hasClass('col2'), 'buildCol2 should have class col2');
33
+ ok($td.find('select').hasClass('disabled'), 'buildCol2 should have class disabled');
34
+ });
35
+
36
+ test("buildCol3", function() {
37
+ expect(3);
38
+
39
+ var $td = AdminData.advanceSearch.buildCol3();
40
+ ok($.isjQuery($td), "buildCol3 should return an instance of jQuery");
41
+
42
+ ok($td.find('input').hasClass('col3'), 'buildCol3 should have input element with class col3');
43
+ ok($td.find('input').attr('disabled'), 'buildCol3 should have input element with attribute disabled');
44
+ });
45
+
46
+ test("buildCol4", function() {
47
+ expect(3);
48
+
49
+ var $td = AdminData.advanceSearch.buildCol4();
50
+ ok($.isjQuery($td), "buildCol4 should return an instance of jQuery");
51
+
52
+ var a = $td.find('a');
53
+ ok(a.hasClass('remove_row'), 'buildCol4 should have anchor element with class remove_row');
54
+ equals('x', a.text(), 'buildCol4 should have anchor element with text x');
55
+ });
56
+
57
+ test("buildRow", function() {
58
+ expect(8);
59
+ jack(function() {
60
+ jack.expect("AdminData.jsUtil.randomNumber").exactly("1 time").mock(function() {
61
+ return 100;
62
+ });
63
+
64
+ var $tr = AdminData.advanceSearch.buildRow();
65
+ ok($.isjQuery($tr), "buildCol4 should return an instance of jQuery");
66
+
67
+ equals(4, $tr.find('td').length, 'buildRow should have 4 td elements');
68
+
69
+ ok($tr.find('select.col1').attr('name'), 'buildRow should have select.col1 with attribute name');
70
+ ok($tr.find('select.col2').attr('name'), 'buildRow should have select.col1 with attribute name');
71
+ ok($tr.find('input.col3').attr('name'), 'buildRow should have input.col1 with attribute name');
72
+
73
+ equals('adv_search[100_row][col1]', $tr.find('select.col1').attr('name'), 'select.col1 should have right name');
74
+ equals('adv_search[100_row][col2]', $tr.find('select.col2').attr('name'), 'select.col2 should have right name');
75
+ equals('adv_search[100_row][col3]', $tr.find('input.col3').attr('name'), 'input.col3 should have right name');
76
+
77
+ });
78
+
79
+ });
80
+
@@ -0,0 +1,29 @@
1
+ module('ajaxify advance search', {
2
+ teardown: function() {
3
+ $('#results').remove();
4
+ $('#advance_search_form').remove();
5
+ },
6
+ setup: function() {
7
+ $(document.body).append($('<div />', {
8
+ id: 'results'
9
+ }));
10
+ $(document.body).append($('<div />', {
11
+ id: 'advance_search_form'
12
+ }));
13
+ }
14
+ });
15
+
16
+ test('successCallback', function() {
17
+ expect(1);
18
+ AdminData.ajaxifyAdvanceSearch.successCallback('hello world');
19
+ equals('hello world', $('#results').text(), '#results should have text hello world');
20
+ });
21
+
22
+ test('beforeSubmitCallback', function() {
23
+ expect(1);
24
+ AdminData.ajaxifyAdvanceSearch.beforeSubmitCallback(['1', '2'], null);
25
+
26
+ var $results = $('#results');
27
+ equals('searching...', $('#results').text(), '#results should have text searching');
28
+ });
29
+
@@ -0,0 +1,10 @@
1
+ module('build_first_row');
2
+
3
+ test('table structure', function() {
4
+ expect(1);
5
+
6
+ var tableStructure = $('#advance_search_table').data('table_structure');
7
+ ok(tableStructure, 'tableStructure should not be blank');
8
+
9
+ });
10
+
@@ -0,0 +1,100 @@
1
+ module('event_bindings');
2
+
3
+ test('live click on a.add_row_link', function() {
4
+ expect(3);
5
+
6
+ $('#advance_search_table').html('');
7
+ equals(0, $('#advance_search_table tr').length, 'there should be no row in the table');
8
+
9
+ AdminData.advanceSearch.buildFirstRow();
10
+ equals(1, $('#advance_search_table tr').length, 'there should be only first row in the table');
11
+
12
+ $('#advance_search_table a.add_row_link').trigger('click');
13
+ equals(2, $('#advance_search_table tr').length, 'additional row should be added to the table');
14
+ });
15
+
16
+ test('live click on a.remove_row link', function() {
17
+ expect(5);
18
+
19
+ $('#advance_search_table').html('');
20
+ equals(0, $('#advance_search_table tr').length, 'there should be no row in the table');
21
+
22
+ AdminData.advanceSearch.buildFirstRow();
23
+ equals(1, $('#advance_search_table tr').length, 'there should be only first row in the table');
24
+
25
+ $('#advance_search_table').append(AdminData.advanceSearch.buildRow());
26
+ equals(2, $('#advance_search_table tr').length, 'there should be two rows in the table');
27
+
28
+ var $a = $('#advance_search_table a.remove_row');
29
+ equals(1, $a.length, 'there should be one anchor element with class remove_row');
30
+
31
+ $('#advance_search_table a.remove_row').trigger('click');
32
+ equals(1, $('#advance_search_table tr').length, 'there should be only one row in the table');
33
+ });
34
+
35
+ test('live select.col1 change', function() {
36
+ expect(10);
37
+
38
+ $('#advance_search_table').html('');
39
+ equals(0, $('#advance_search_table tr').length, 'there should be no row in the table');
40
+
41
+ AdminData.advanceSearch.buildFirstRow();
42
+ equals(1, $('#advance_search_table tr').length, 'there should be only first row in the table');
43
+
44
+ ok($('#advance_search_table select.col2').is(':disabled'), 'second column should be disabled');
45
+
46
+ $('#advance_search_table select.col1').val('first_name');
47
+ $('#advance_search_table select.col1').trigger('change');
48
+
49
+ ok(!$('#advance_search_table select.col2').is(':disabled'), 'second column should be enabled');
50
+
51
+ var s = $('#advance_search_table select.col2 option').eq(0).text();
52
+ equals('', s, 'empty value should be the first option');
53
+
54
+ s = $('#advance_search_table select.col2 option').eq(1).text();
55
+ equals('is null', s, 'is null should be the second option');
56
+
57
+ s = $('#advance_search_table select.col2 option').eq(2).text();
58
+ equals('is not null', s, 'is null should be the third option');
59
+
60
+ s = $('#advance_search_table select.col2 option').eq(3).text();
61
+ equals('contains', s, 'contains should be the fourth option');
62
+
63
+ s = $('#advance_search_table select.col2 option').eq(4).text();
64
+ equals('is exactly', s, 'contains should be the fifth option');
65
+
66
+ s = $('#advance_search_table select.col2 option').eq(5).text();
67
+ equals("doesn't contain", s, 'does not contain should be the sixth option');
68
+ });
69
+
70
+ test('live select.col2 change', function() {
71
+ expect(2);
72
+
73
+ $('#advance_search_table').html('');
74
+ AdminData.advanceSearch.buildFirstRow();
75
+ ok($('#advance_search_table input.col3').is(':disabled'), 'third column should be disabled');
76
+
77
+ $('#advance_search_table select.col1').val('first_name');
78
+ $('#advance_search_table select.col1').trigger('change');
79
+ $('#advance_search_table select.col2').val('contains');
80
+ $('#advance_search_table select.col2').trigger('change');
81
+
82
+ ok($('#advance_search_table input.col3').is(':enabled'), 'third column should be enabled');
83
+ });
84
+
85
+
86
+ test('live select.col2 change for is_null input', function() {
87
+ expect(2);
88
+
89
+ $('#advance_search_table').html('');
90
+ AdminData.advanceSearch.buildFirstRow();
91
+ ok($('#advance_search_table input.col3').is(':disabled'), 'third column should be disabled');
92
+
93
+ $('#advance_search_table select.col1').val('first_name');
94
+ $('#advance_search_table select.col1').trigger('change');
95
+ $('#advance_search_table select.col2').val('is_null');
96
+ $('#advance_search_table select.col2').trigger('change');
97
+
98
+ ok($('#advance_search_table input.col3').is(':disabled'), 'third column should be disabled');
99
+ });
100
+
@@ -0,0 +1,66 @@
1
+ jQuery(document).ready(function($) {
2
+ return function($) {
3
+ function handleSuccess(json, statusText) {
4
+ $('#spinner').hide();
5
+ var base_url;
6
+
7
+ if (! (json.error === undefined)) {
8
+ $('#submit').attr('value', 'Start validation');
9
+ $('#validation_result').html('').hide();
10
+ $('#error').html(json.error).show();
11
+ } else if (json.still_processing === 'yes') {
12
+ if (! (json.base_url === undefined)) {
13
+ base_url = json.base_url;
14
+ }
15
+ var keep_checking = function() {
16
+ var url = base_url + '/admin_data/diagnostic/validate_model?still_processing=yes';
17
+ url = url + '&tid=' + $('#tid').text();
18
+ var fn = function(json) {
19
+ if (json.still_processing === 'no') {
20
+ clearInterval(refreshID);
21
+ $('#submit').attr('value', 'Start validation');
22
+ $('#validation_result').html('').hide();
23
+ $('#validation_result').html('Validation result').show();
24
+ $('#validate_model_rhs_data').html(json.data);
25
+ } else {
26
+ var processed_info = json.currently_processing_klass;
27
+ var s = processed_info + ' ... ';
28
+ $('#validation_result').html(s);
29
+ $('#validate_model_rhs_data').html(json.data);
30
+ }
31
+ };
32
+
33
+ $.getJSON(url, fn);
34
+ };
35
+ var refreshID = setInterval(keep_checking, 4000);
36
+ } else {
37
+ $('#validation_result').html('Validation result').show();
38
+ $('#validate_model_rhs_data').html(json.data);
39
+ }
40
+ }
41
+
42
+ function preSubmit(formData, jqForm, options) {
43
+ $('html,body').animate({
44
+ scrollTop: 0
45
+ },
46
+ 0);
47
+ $('#validate_model_rhs_data').html('');
48
+ $('#validation_result').html('Processing .... This page will refersh itself periodically.').show();
49
+ $('#error').hide();
50
+ $('#spinner').show();
51
+ $('#submit').attr('value', 'processing ...');
52
+ return true;
53
+ }
54
+
55
+ var options = {
56
+ beforeSubmit: preSubmit,
57
+ success: handleSuccess,
58
+ dataType: 'json'
59
+ };
60
+
61
+ $('#validate_model_form').ajaxForm(options);
62
+
63
+ };
64
+ } (jQuery));
65
+
66
+