admin_data 1.1.6 → 1.1.7
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/admin_data.rb +1 -1
- data/lib/admin_data/version.rb +1 -1
- data/lib/public/images/add.png +0 -0
- data/lib/public/images/no.png +0 -0
- data/lib/public/images/site.png +0 -0
- data/lib/public/javascripts/advance_search/act_on_result.js +45 -0
- data/lib/public/javascripts/advance_search/advance_search.js +83 -0
- data/lib/public/javascripts/advance_search/advance_search_structure.js +79 -0
- data/lib/public/javascripts/advance_search/ajaxify_advance_search.js +28 -0
- data/lib/public/javascripts/advance_search/build_first_row.js +8 -0
- data/lib/public/javascripts/advance_search/event_bindings.js +76 -0
- data/lib/public/javascripts/advance_search/global_ajax_setting.js +10 -0
- data/lib/public/javascripts/advance_search/trigger_submit_on_domready.js +6 -0
- data/lib/public/javascripts/misc/drop_down_change.js +8 -0
- data/lib/public/javascripts/misc/js_util.js +58 -0
- data/lib/public/javascripts/misc/quick_search_input_focus.js +6 -0
- data/lib/public/javascripts/test/act_on_result.js +120 -0
- data/lib/public/javascripts/test/advance_search.js +80 -0
- data/lib/public/javascripts/test/ajaxify_advance_search.js +29 -0
- data/lib/public/javascripts/test/build_first_row.js +10 -0
- data/lib/public/javascripts/test/event_bindings.js +100 -0
- data/lib/public/javascripts/vendor/jack.js +903 -0
- data/lib/public/javascripts/vendor/jquery-1.4.2.js +6240 -0
- data/lib/public/javascripts/vendor/jquery-ui-1.7.2.custom.min.js +298 -0
- data/lib/public/javascripts/vendor/jquery.ba-isjquery.js +21 -0
- data/lib/public/javascripts/vendor/jquery_form.js +814 -0
- data/lib/public/javascripts/vendor/log.js +9 -0
- data/lib/public/javascripts/vendor/qunit.js +1043 -0
- data/lib/public/javascripts/vendor/rails.js +132 -0
- data/lib/public/stylesheets/base.css +1109 -0
- data/lib/public/stylesheets/vendor/jquery-ui-1.7.2.custom.css +406 -0
- metadata +32 -3
data/lib/admin_data.rb
CHANGED
data/lib/admin_data/version.rb
CHANGED
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,45 @@
|
|
1
|
+
var AdminData = AdminData || {};
|
2
|
+
|
3
|
+
AdminData.actOnResult = {
|
4
|
+
|
5
|
+
action: function(action_type) {
|
6
|
+
var formData = $('#advance_search_form').data('admin_data_form_array'),
|
7
|
+
parameterizedData;
|
8
|
+
|
9
|
+
formData.push({
|
10
|
+
'name': 'admin_data_advance_search_action_type',
|
11
|
+
'value': action_type
|
12
|
+
});
|
13
|
+
|
14
|
+
parameterizedData = $.param(formData);
|
15
|
+
|
16
|
+
$.ajax({
|
17
|
+
url: $('#advance_search_form').attr('action'),
|
18
|
+
type: 'post',
|
19
|
+
dataType: 'json',
|
20
|
+
data: parameterizedData,
|
21
|
+
success: function(json) {
|
22
|
+
AdminData.actOnResult.successCallback(json);
|
23
|
+
}
|
24
|
+
});
|
25
|
+
},
|
26
|
+
|
27
|
+
successCallback: function(json) {
|
28
|
+
$('#results').text(json.success);
|
29
|
+
}
|
30
|
+
|
31
|
+
};
|
32
|
+
|
33
|
+
$('#advance_search_delete_all').live('click', function() {
|
34
|
+
if (window.confirm('Are you sure?')) {
|
35
|
+
AdminData.actOnResult.action('delete');
|
36
|
+
}
|
37
|
+
return false;
|
38
|
+
});
|
39
|
+
|
40
|
+
$('#advance_search_destroy_all').live('click', function() {
|
41
|
+
if (window.confirm('Are you sure?')) {
|
42
|
+
AdminData.actOnResult.action('destroy');
|
43
|
+
}
|
44
|
+
return false;
|
45
|
+
});
|
@@ -0,0 +1,83 @@
|
|
1
|
+
var AdminData = AdminData || {};
|
2
|
+
|
3
|
+
AdminData.advanceSearch = {
|
4
|
+
|
5
|
+
buildFirstRow: function() {
|
6
|
+
|
7
|
+
var img = $('<img />', {
|
8
|
+
src: '/admin_data/public/images/add.png'
|
9
|
+
});
|
10
|
+
|
11
|
+
$('#advance_search_table').append(this.buildRow())
|
12
|
+
.find('tr td:last a')
|
13
|
+
.attr('id','add_row_link_1')
|
14
|
+
.removeClass('remove_row')
|
15
|
+
.addClass('add_row_link')
|
16
|
+
.html('')
|
17
|
+
.append(img);
|
18
|
+
},
|
19
|
+
|
20
|
+
buildCol1: function() {
|
21
|
+
var i, col = $('<select />', { className: 'col1' }).append($('<option />')),
|
22
|
+
tableStructure = $('#advance_search_table').data('table_structure');
|
23
|
+
|
24
|
+
for (i in tableStructure) {
|
25
|
+
$('<option />', {
|
26
|
+
text: i,
|
27
|
+
value: i
|
28
|
+
}).appendTo(col);
|
29
|
+
}
|
30
|
+
return $('<td />').append(col);
|
31
|
+
},
|
32
|
+
|
33
|
+
buildCol2: function() {
|
34
|
+
var select = $('<select />', { className: 'col2', disabled: 'disabled' });
|
35
|
+
return $('<td />').append(select);
|
36
|
+
},
|
37
|
+
|
38
|
+
buildCol3: function() {
|
39
|
+
var select = $('<input />', { className: 'col3' });
|
40
|
+
return $('<td />').append($('<input />', { className: 'col3', disabled: 'disabled' }));
|
41
|
+
},
|
42
|
+
|
43
|
+
buildCol4: function() {
|
44
|
+
var img = $('<img />', {
|
45
|
+
src: '/admin_data/public/images/no.png'
|
46
|
+
});
|
47
|
+
|
48
|
+
return $('<td />').append($('<a />', {
|
49
|
+
text: '',
|
50
|
+
href: '#',
|
51
|
+
className: 'remove_row'
|
52
|
+
}).append(img));
|
53
|
+
},
|
54
|
+
|
55
|
+
buildRow: function() {
|
56
|
+
|
57
|
+
var $tr = $('<tr />'),
|
58
|
+
currentRowNumber = $(document).data('currentRowNumber'),
|
59
|
+
that = this,
|
60
|
+
build_array = ['buildCol1', 'buildCol2', 'buildCol3', 'buildCol4'];
|
61
|
+
|
62
|
+
if (currentRowNumber === undefined) {
|
63
|
+
currentRowNumber = 1;
|
64
|
+
$(document).data('currentRowNumber', currentRowNumber);
|
65
|
+
} else {
|
66
|
+
currentRowNumber = parseInt(currentRowNumber, 10) + 1;
|
67
|
+
$(document).data('currentRowNumber', currentRowNumber);
|
68
|
+
}
|
69
|
+
|
70
|
+
$.each(build_array, function(index, value) {
|
71
|
+
$tr.append(that[value]());
|
72
|
+
});
|
73
|
+
|
74
|
+
$tr.find('select.col1').attr({ name: 'adv_search[' + currentRowNumber + '_row][col1]' });
|
75
|
+
$tr.find('select.col2').attr({ name: 'adv_search[' + currentRowNumber + '_row][col2]' });
|
76
|
+
$tr.find('input.col3').attr({ name: 'adv_search[' + currentRowNumber + '_row][col3]' });
|
77
|
+
|
78
|
+
$tr.find('.remove_row').attr('id', 'remove_row_'+currentRowNumber);
|
79
|
+
|
80
|
+
return $tr;
|
81
|
+
}
|
82
|
+
|
83
|
+
};
|
@@ -0,0 +1,79 @@
|
|
1
|
+
AdminData = AdminData || {};
|
2
|
+
|
3
|
+
AdminData.mappings = {
|
4
|
+
|
5
|
+
//JSLint complains if a hash has key named boolean. So I am changing the key to booleant
|
6
|
+
booleant: {
|
7
|
+
options: [
|
8
|
+
["is null", "is_null"],
|
9
|
+
["is not null", "is_not_null"],
|
10
|
+
["is true", "is_true"],
|
11
|
+
["is false", "is_false"]
|
12
|
+
]
|
13
|
+
},
|
14
|
+
|
15
|
+
string: {
|
16
|
+
options: [
|
17
|
+
["is null", "is_null"],
|
18
|
+
["is not null", "is_not_null"],
|
19
|
+
["contains", "contains"],
|
20
|
+
["is exactly", "is_exactly"],
|
21
|
+
["doesn't contain", "does_not_contain"]
|
22
|
+
]
|
23
|
+
},
|
24
|
+
|
25
|
+
text: {
|
26
|
+
options: [
|
27
|
+
["is null", "is_null"],
|
28
|
+
["is not null", "is_not_null"],
|
29
|
+
["Contains", "contains"],
|
30
|
+
["Doesn't Contain", "does_not_contain"]
|
31
|
+
]
|
32
|
+
},
|
33
|
+
|
34
|
+
datetime: {
|
35
|
+
options: [
|
36
|
+
["is null", "is_null"],
|
37
|
+
["is not null", "is_not_null"],
|
38
|
+
['on', "is_on"],
|
39
|
+
['on or before', "is_on_or_before_date"],
|
40
|
+
['on or after', "is_on_or_after_date"]
|
41
|
+
]
|
42
|
+
},
|
43
|
+
|
44
|
+
date: {
|
45
|
+
options: [
|
46
|
+
["is null", "is_null"],
|
47
|
+
["is not null", "is_not_null"],
|
48
|
+
['on', "is_on"],
|
49
|
+
['on or before', "is_on_or_before_date"],
|
50
|
+
['on or after', "is_on_or_after_date"]
|
51
|
+
]
|
52
|
+
},
|
53
|
+
|
54
|
+
time: {
|
55
|
+
options: [
|
56
|
+
["is null", "is_null"],
|
57
|
+
["is not null", "is_not_null"],
|
58
|
+
["is exactly", "is_exactly"]
|
59
|
+
]
|
60
|
+
},
|
61
|
+
|
62
|
+
decimal: {
|
63
|
+
options: [
|
64
|
+
['is equal to', "is_equal_to"],
|
65
|
+
['is less than', "less_than"],
|
66
|
+
['is greater than', "greater_than"]
|
67
|
+
]
|
68
|
+
},
|
69
|
+
|
70
|
+
integer: {
|
71
|
+
options: [
|
72
|
+
['is equal to', "is_equal_to"],
|
73
|
+
['is less than', "less_than"],
|
74
|
+
['is greater than', "greater_than"]
|
75
|
+
]
|
76
|
+
}
|
77
|
+
};
|
78
|
+
|
79
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
var AdminData = AdminData || {};
|
2
|
+
|
3
|
+
AdminData.ajaxifyAdvanceSearch = {
|
4
|
+
successCallback: function(responseText) {
|
5
|
+
$('#results').html(responseText);
|
6
|
+
},
|
7
|
+
|
8
|
+
beforeSubmitCallback: function(formArray, jqForm) {
|
9
|
+
$('#results').html('<span class="searching_message">searching...</span>');
|
10
|
+
$('#advance_search_form').data('admin_data_form_array', formArray);
|
11
|
+
}
|
12
|
+
};
|
13
|
+
|
14
|
+
$(function() {
|
15
|
+
|
16
|
+
var options = {
|
17
|
+
success: function(responseText) {
|
18
|
+
AdminData.ajaxifyAdvanceSearch.successCallback(responseText);
|
19
|
+
},
|
20
|
+
beforeSubmit: function(formArray, jqForm) {
|
21
|
+
AdminData.ajaxifyAdvanceSearch.beforeSubmitCallback(formArray, jqForm);
|
22
|
+
}
|
23
|
+
};
|
24
|
+
|
25
|
+
$('#advance_search_form').ajaxForm(options);
|
26
|
+
|
27
|
+
});
|
28
|
+
|
@@ -0,0 +1,76 @@
|
|
1
|
+
var AdminData = AdminData || {};
|
2
|
+
|
3
|
+
AdminData.bindings = {
|
4
|
+
|
5
|
+
col2_change: function(e) {
|
6
|
+
var arrayList = ['is_false', 'is_true', 'is_null', 'is_not_null'],
|
7
|
+
$col2 = $(e.target).closest('select'),
|
8
|
+
value = $col2.val(),
|
9
|
+
tableStructure = $('#advance_search_table').data('table_structure'),
|
10
|
+
$col3 = $col2.parents('tr').find('td input.col3'),
|
11
|
+
$col1 = $col2.parents('tr').find('td select.col1'),
|
12
|
+
col1ColumnType = tableStructure[$col1.val()];
|
13
|
+
|
14
|
+
|
15
|
+
if (value.length === 0 || ($.inArray(value, arrayList) > - 1)) {
|
16
|
+
$col3.val('').attr('disabled','disabled');
|
17
|
+
|
18
|
+
} else {
|
19
|
+
$col3.removeAttr('disabled');
|
20
|
+
if (col1ColumnType === 'datetime' || col1ColumnType === 'date') {
|
21
|
+
$col3.val(AdminData.jsUtil.dateToString(new Date())).addClass('datepicker');
|
22
|
+
|
23
|
+
$('.datepicker').datepicker({ dateFormat: 'dd-MM-yy', changeYear: true, changeMonth: true });
|
24
|
+
|
25
|
+
} else {
|
26
|
+
$('.datepicker').datepicker('destroy');
|
27
|
+
$col3.removeClass('datepicker').focus(); // do not create focus for date pickers
|
28
|
+
}
|
29
|
+
}
|
30
|
+
},
|
31
|
+
|
32
|
+
pagination_click: function(e) {
|
33
|
+
var href = $(e.target).closest('a').attr('href');
|
34
|
+
|
35
|
+
$.ajax({ url: href, dataType: "text", success: function(responseText){
|
36
|
+
$('#results').html(responseText);
|
37
|
+
}});
|
38
|
+
|
39
|
+
AdminData.jsUtil.colorizeRows();
|
40
|
+
},
|
41
|
+
|
42
|
+
col1_change: function(e) {
|
43
|
+
var col1 = $(e.target).closest('select'),
|
44
|
+
tableStructure = $('#advance_search_table').data('table_structure'),
|
45
|
+
columnType = tableStructure[col1.val()],
|
46
|
+
options = AdminData.mappings[columnType]['options'],
|
47
|
+
col2 = col1.parents('tr').find('td select.col2');
|
48
|
+
|
49
|
+
col2.html('');
|
50
|
+
AdminData.jsUtil.buildOptionsFromArray(options, col2);
|
51
|
+
col2.trigger('change').removeAttr('disabled');
|
52
|
+
}
|
53
|
+
};
|
54
|
+
|
55
|
+
$('.pagination a').live('click', function(e) {
|
56
|
+
AdminData.bindings.pagination_click(e);
|
57
|
+
return false;
|
58
|
+
});
|
59
|
+
|
60
|
+
$('#advance_search_table a.add_row_link').live('click', function() {
|
61
|
+
$('#advance_search_table').append(AdminData.advanceSearch.buildRow());
|
62
|
+
return false;
|
63
|
+
});
|
64
|
+
|
65
|
+
$('#advance_search_table a.remove_row').live('click', function(e) {
|
66
|
+
$(e.target).closest('tr').remove();
|
67
|
+
return false;
|
68
|
+
});
|
69
|
+
|
70
|
+
$('#advance_search_table select.col1').live('change', function(e) {
|
71
|
+
AdminData.bindings.col1_change(e);
|
72
|
+
});
|
73
|
+
|
74
|
+
$('#advance_search_table select.col2').live('change', function(e) {
|
75
|
+
AdminData.bindings.col2_change(e);
|
76
|
+
});
|
@@ -0,0 +1,58 @@
|
|
1
|
+
var AdminData = AdminData || {};
|
2
|
+
|
3
|
+
/**
|
4
|
+
* A general Utility
|
5
|
+
* @namespace AdminData
|
6
|
+
* @class jsUtil
|
7
|
+
*/
|
8
|
+
AdminData.jsUtil = {
|
9
|
+
|
10
|
+
// TODO since advance search was not working with util confirm , window.confirm is used directly
|
11
|
+
// fix it later
|
12
|
+
confirm: function(arg) {
|
13
|
+
window.confirm(arg);
|
14
|
+
},
|
15
|
+
|
16
|
+
buildOptionsFromArray: function(array, element) {
|
17
|
+
element.append($('<option />'));
|
18
|
+
for (i in array) {
|
19
|
+
$('<option />').text(array[i][0]).attr('value', array[i][1]).appendTo(element);
|
20
|
+
}
|
21
|
+
element.attr('disabled', false);
|
22
|
+
},
|
23
|
+
|
24
|
+
colorizeRows: function() {
|
25
|
+
$('.colorize tr:odd').addClass('odd');
|
26
|
+
$('.colorize tr:even').addClass('even');
|
27
|
+
},
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Returns the input date in string format.
|
31
|
+
*
|
32
|
+
* @param {date} input date
|
33
|
+
* @return {string} The string value of input date
|
34
|
+
*/
|
35
|
+
dateToString: function(date) {
|
36
|
+
var month = (date.getMonth() + 1).toString();
|
37
|
+
var day = date.getDate().toString();
|
38
|
+
//days between 1 and 9 should have 0 before them
|
39
|
+
if (day.length == 1) day = '0' + day;
|
40
|
+
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
41
|
+
return day + "-" + months[month - 1] + "-" + date.getFullYear();
|
42
|
+
},
|
43
|
+
|
44
|
+
/**
|
45
|
+
* Generate a random number between 1 and 10000000
|
46
|
+
*
|
47
|
+
* @return {Integer} a random Integer
|
48
|
+
*
|
49
|
+
*/
|
50
|
+
randomNumber: function() {
|
51
|
+
var maxVal = 100000000,
|
52
|
+
minVal = 1;
|
53
|
+
var randVal = minVal + (Math.random() * (maxVal - minVal));
|
54
|
+
return Math.round(randVal);
|
55
|
+
}
|
56
|
+
|
57
|
+
};
|
58
|
+
|
@@ -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
|
+
|