admin_data 1.1.6 → 1.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|