combo_auto_box 0.0.5 → 0.0.6
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.
@@ -9,11 +9,24 @@ var ComboAutoBox = {
|
|
9
9
|
now++;
|
10
10
|
}
|
11
11
|
|
12
|
-
return "
|
12
|
+
return prefix + "-" + now;
|
13
13
|
};
|
14
14
|
|
15
15
|
// binds autocomplete to text field
|
16
16
|
var bindAutoComplete = function (inputId) {
|
17
|
+
var previuosValue = '';
|
18
|
+
$('#' + inputId).keydown(function(e) {
|
19
|
+
if ((e.keyCode == 8) && (options.type == 'multiple') && ($('#' + inputId).val() == '')) {
|
20
|
+
$('#' + container + ' > div.multiple > div.item:last').remove();
|
21
|
+
}
|
22
|
+
|
23
|
+
if ((e.keyCode == 8) && (options.type == 'searchable') && ($('#' + inputId).val() == '')) {
|
24
|
+
$('#' + container + ' > div.searchable > div.item:last').remove();
|
25
|
+
selectData('');
|
26
|
+
}
|
27
|
+
|
28
|
+
});
|
29
|
+
|
17
30
|
$('#' + inputId).keypress(function(e) {
|
18
31
|
if (e.which === 13) {
|
19
32
|
if (options.type == 'full') {
|
@@ -24,8 +37,8 @@ var ComboAutoBox = {
|
|
24
37
|
addItem(inputId, $('#' + inputId).val(), $('#' + inputId).val());
|
25
38
|
selectData($('#' + inputId).val());
|
26
39
|
$('#' + inputId).val('');
|
27
|
-
}
|
28
|
-
return false;
|
40
|
+
}
|
41
|
+
return false;
|
29
42
|
}
|
30
43
|
});
|
31
44
|
|
@@ -38,17 +51,47 @@ var ComboAutoBox = {
|
|
38
51
|
return selectData($('#' + inputId).val());
|
39
52
|
} else if (options.type == 'multiple') {
|
40
53
|
$('#' + inputId).val('');
|
41
|
-
addItem(inputId, ui.item.
|
54
|
+
addItem(inputId, ui.item.id, ui.item.label);
|
55
|
+
selectData(ui.item.id);
|
56
|
+
return false;
|
57
|
+
} else if (options.type == 'searchable') {
|
58
|
+
$('#' + inputId).val('');
|
59
|
+
addSearchableItemForRansack(inputId, ui.item.id, ui.item.label);
|
42
60
|
selectData(ui.item.id);
|
43
61
|
return false;
|
44
62
|
}
|
45
|
-
}
|
63
|
+
},
|
64
|
+
search: function(event, ui) {
|
65
|
+
if (options.type == 'searchable') {
|
66
|
+
$('#' + inputId).autocomplete("option", { source: setAutoCompleteSource(inputId) });
|
67
|
+
}
|
68
|
+
},
|
69
|
+
change: function (event, ui) {
|
70
|
+
if (!ui.item) {
|
71
|
+
$(this).val('');
|
72
|
+
}
|
73
|
+
},
|
74
|
+
focus: function (event, ui) {
|
75
|
+
event.preventDefault();
|
76
|
+
},
|
46
77
|
});
|
47
78
|
};
|
48
79
|
|
49
80
|
// set autocomplete source
|
50
81
|
var setAutoCompleteSource = function (inputId) {
|
51
|
-
if (
|
82
|
+
if (options.type == 'searchable') {
|
83
|
+
var new_source = new Array();
|
84
|
+
var operators = i18nMath(options.lang);
|
85
|
+
$.each(options.source, function(i){
|
86
|
+
validIndexes = validSource(options.source[i]);
|
87
|
+
$.each(operators, function(j){
|
88
|
+
if (validIndexes.indexOf(j) >= 0) {
|
89
|
+
new_source.push( { id: options.source[i]['id'] + '_' + operators[j]['id'], label: options.source[i]['label'] + ' ' + operators[j]['label'] + ' ' + $('#' + inputId).val()} );
|
90
|
+
}
|
91
|
+
});
|
92
|
+
});
|
93
|
+
return new_source;
|
94
|
+
} else if (typeof options.source == 'string') {
|
52
95
|
return function(request, response) {
|
53
96
|
var term = 'term=' + $('#' + inputId).val();
|
54
97
|
var params = (options.data == null) ? term : options.data + '&' + term;
|
@@ -59,12 +102,37 @@ var ComboAutoBox = {
|
|
59
102
|
}
|
60
103
|
};
|
61
104
|
|
105
|
+
// get i18n math comparisons
|
106
|
+
var i18nMath = function (language) {
|
107
|
+
var operators = new Array();
|
108
|
+
switch(language) {
|
109
|
+
case 'en':
|
110
|
+
operators = [ { id: 'cont', label: 'contains' }, { id: 'eq', label: 'equal' }, { id: 'gteq', label: 'greater or equal' }, { id: 'lteq', label: 'less or equal' } ];
|
111
|
+
break;
|
112
|
+
case 'pt-br':
|
113
|
+
operators = [ { id: 'cont', label: 'contém' }, { id: 'eq', label: 'igual' }, { id: 'gteq', label: 'maior que' }, { id: 'lteq', label: 'menor que' } ];
|
114
|
+
break;
|
115
|
+
case 'pt':
|
116
|
+
operators = [ { id: 'cont', label: 'contém' }, { id: 'eq', label: 'igual' }, { id: 'gteq', label: 'maior que' }, { id: 'lteq', label: 'menor que' } ];
|
117
|
+
break;
|
118
|
+
case 'fr':
|
119
|
+
operators = [ { id: 'cont', label: 'contient' }, { id: 'eq', label: 'égal' }, { id: 'gteq', label: 'supérieur ou égal' }, { id: 'lteq', label: 'inférieur ou égal' } ];
|
120
|
+
break;
|
121
|
+
case 'es':
|
122
|
+
operators = [ { id: 'cont', label: 'contiene' }, { id: 'eq', label: 'igual' }, { id: 'gteq', label: 'mayor o igual' }, { id: 'lteq', label: 'menos o igual' } ];
|
123
|
+
break;
|
124
|
+
default:
|
125
|
+
operators = [ { id: 'cont', label: '~=' }, { id: 'eq', label: '=' }, { id: 'gteq', label: '>=' }, { id: 'lteq', label: '<=' } ];
|
126
|
+
}
|
127
|
+
return operators;
|
128
|
+
};
|
129
|
+
|
62
130
|
// generates text field with html options
|
63
131
|
var generateInputTag = function () {
|
64
132
|
var html = 'input type="text"';
|
65
133
|
if (options.html != null) {
|
66
134
|
$.each(options.html, function(key, value) {
|
67
|
-
if ((key == 'name') && (options.type == 'multiple')) {
|
135
|
+
if ((key == 'name') && ((options.type == 'multiple') || (options.type == 'searchable'))) {
|
68
136
|
return true;
|
69
137
|
}
|
70
138
|
html = html + ' '+ key +'="' + value + '"';
|
@@ -79,10 +147,31 @@ var ComboAutoBox = {
|
|
79
147
|
};
|
80
148
|
|
81
149
|
// On click opens modal image tag inside "i" tag through css
|
82
|
-
var
|
83
|
-
|
150
|
+
var generateExpander = function () {
|
151
|
+
if (options.type == 'simple') {
|
152
|
+
return '<span class="simple"><i></i></span>';
|
153
|
+
} else if (options.type == 'multiple') {
|
154
|
+
return '<span class="multiple">' + options.label + ':</span>';
|
155
|
+
}
|
84
156
|
};
|
85
157
|
|
158
|
+
var adjustExpanderImage = function() {
|
159
|
+
if (options.type != 'simple') {
|
160
|
+
return false;
|
161
|
+
}
|
162
|
+
|
163
|
+
spanTag = $('#' + container + ' > div.container-combo-auto-box > span.simple');
|
164
|
+
var paddingRight = 1;
|
165
|
+
try {
|
166
|
+
paddingRight = parseInt(textField.css('padding-right').replace(/px/, ''));
|
167
|
+
} catch (error) {
|
168
|
+
paddingRight = 1;
|
169
|
+
}
|
170
|
+
spanTag.css('margin', '2px 0px 0px ' + (paddingRight + textField.width() + 9).toString() + 'px');
|
171
|
+
|
172
|
+
return true;
|
173
|
+
}
|
174
|
+
|
86
175
|
// Global div for combo auto box
|
87
176
|
var generateDivTag = function () {
|
88
177
|
var derivation = ''
|
@@ -115,7 +204,7 @@ var ComboAutoBox = {
|
|
115
204
|
|
116
205
|
$("#" + modalDialogId).siblings('div.ui-dialog-titlebar').remove();
|
117
206
|
|
118
|
-
$('#' + container + ' > div.container-combo-auto-box > span.
|
207
|
+
$('#' + container + ' > div.container-combo-auto-box > span.' + options.type).click(function() {
|
119
208
|
openModalDialog(modalDialogId)
|
120
209
|
});
|
121
210
|
};
|
@@ -151,9 +240,19 @@ var ComboAutoBox = {
|
|
151
240
|
$('#' + modalDialogId + ' > div.list').css('height', ($('#' + modalDialogId).dialog("option", "height") - 60) + 'px');
|
152
241
|
$('#' + modalDialogId + ' > div.list > ul').html(items.join(''));
|
153
242
|
$('#' + modalDialogId + ' > div.list > ul > li').click(function() {
|
243
|
+
var thisId = $(this).children('span.combo-auto-box-item-id').text();
|
244
|
+
var thisLabel = $(this).children('span.combo-auto-box-item-label').text();
|
245
|
+
|
154
246
|
$('#' + modalDialogId).dialog('close');
|
155
|
-
|
156
|
-
|
247
|
+
|
248
|
+
if (options.type == 'simple') {
|
249
|
+
$('#' + container + ' > div.container-combo-auto-box > input').val(thisLabel);
|
250
|
+
selectData(thisId);
|
251
|
+
} else if (options.type == 'multiple') {
|
252
|
+
$('#' + container + ' > div.container-combo-auto-box > input').val('');
|
253
|
+
addItem($('#' + container + ' > div.container-combo-auto-box > input').attr('id'), thisLabel, thisLabel);
|
254
|
+
selectData(thisId);
|
255
|
+
}
|
157
256
|
});
|
158
257
|
};
|
159
258
|
|
@@ -164,22 +263,15 @@ var ComboAutoBox = {
|
|
164
263
|
|
165
264
|
// starting generate modial dialog
|
166
265
|
var generateModalDialog = function (textField) {
|
167
|
-
$(
|
266
|
+
$(generateExpander()).prependTo('#' + container + ' > div.container-combo-auto-box');
|
168
267
|
|
169
|
-
|
170
|
-
var paddingRight = 1;
|
171
|
-
try {
|
172
|
-
paddingRight = parseInt(textField.css('padding-right').replace(/px/, ''));
|
173
|
-
} catch (error) {
|
174
|
-
paddingRight = 1;
|
175
|
-
}
|
176
|
-
spanTag.css('margin', '2px 0px 0px ' + (paddingRight + textField.width() + 9).toString() + 'px');
|
268
|
+
adjustExpanderImage();
|
177
269
|
|
178
270
|
generateDivDialogModal(generateAnId('model-dialog'));
|
179
271
|
};
|
180
272
|
|
181
273
|
// add item
|
182
|
-
var addItem = function (inputId,
|
274
|
+
var addItem = function (inputId, selectedId, selectedData) {
|
183
275
|
if (selectedData != '') {
|
184
276
|
var id = generateAnId('item');
|
185
277
|
$('#' + inputId).before('<div class="item" title="Remove Item" id="' + id + '">'+ selectedData +'<span>x</span><input type="hidden" name="'+ options.html.name +'[]" value="'+ selectedId +'"></div>');
|
@@ -190,12 +282,72 @@ var ComboAutoBox = {
|
|
190
282
|
|
191
283
|
}
|
192
284
|
};
|
285
|
+
|
286
|
+
// add searchable item for ransack
|
287
|
+
var addSearchableItemForRansack = function (inputId, selectedId, selectedData) {
|
288
|
+
if (selectedData != '') {
|
289
|
+
var ransackId = generateAnId('ransack');
|
290
|
+
attribute = getSearchableAttribute(selectedId);
|
291
|
+
fieldAttribute = '<input type="hidden" name="q[g]['+ attribute +'][c]['+ ransackId +'][a][0][name]" value="'+ attribute +'">';
|
292
|
+
fieldCondition = '<input type="hidden" name="q[g]['+ attribute +'][c]['+ ransackId +'][p]" value="'+ getSearchableCondition(selectedId) +'">';
|
293
|
+
fieldValue = '<input type="hidden" name="q[g]['+ attribute +'][c]['+ ransackId +'][v][0][value]" value="'+ getSearchableValue(selectedData) +'">';
|
294
|
+
var id = generateAnId('item');
|
295
|
+
$('#' + inputId).before('<div class="item" title="Remove Item" id="' + id + '">'+ selectedData +'<span>x</span>'+ fieldAttribute + fieldCondition + fieldValue +'</div>');
|
296
|
+
|
297
|
+
$('#' + id + ' > span').click(function() {
|
298
|
+
$(this).parent().remove();
|
299
|
+
selectData('');
|
300
|
+
});
|
301
|
+
}
|
302
|
+
};
|
193
303
|
|
194
|
-
//
|
304
|
+
// add searchable item
|
305
|
+
var addSearchableItem = function (inputId, selectedId, selectedData) {
|
306
|
+
if (selectedData != '') {
|
307
|
+
var id = generateAnId('item');
|
308
|
+
$('#' + inputId).before('<div class="item" title="Remove Item" id="' + id + '">'+ selectedData +'<span>x</span><input type="hidden" name="'+ options.html.name +'['+ selectedId +'][]" value="'+ getSearchableValue(selectedData) +'"></div>');
|
309
|
+
|
310
|
+
$('#' + id + ' > span').click(function() {
|
311
|
+
$(this).parent().remove();
|
312
|
+
selectData('');
|
313
|
+
});
|
314
|
+
|
315
|
+
}
|
316
|
+
};
|
317
|
+
|
318
|
+
// get only the attribute from selected Data
|
319
|
+
var getSearchableAttribute = function (selectedId) {
|
320
|
+
var fields = $.map(options.source, function(val, i) { return val['id']}).join('|');
|
321
|
+
var maths = $.map(i18nMath(options.lang), function(val, i) { return val['id']}).join('|');
|
322
|
+
var pattern = new RegExp('(' + fields + ')_(' + maths + ')');
|
323
|
+
return selectedId.match(pattern)[1];
|
324
|
+
}
|
325
|
+
|
326
|
+
// get only the condition from selected Data
|
327
|
+
var getSearchableCondition = function (selectedId) {
|
328
|
+
var fields = $.map(options.source, function(val, i) { return val['id']}).join('|');
|
329
|
+
var maths = $.map(i18nMath(options.lang), function(val, i) { return val['id']}).join('|');
|
330
|
+
var pattern = new RegExp('(' + fields + ')_(' + maths + ')');
|
331
|
+
return selectedId.match(pattern)[2];
|
332
|
+
}
|
333
|
+
|
334
|
+
// get only the value from selected Data
|
335
|
+
var getSearchableValue = function (selectedData) {
|
336
|
+
var fields = $.map(options.source, function(val, i) { return val['label']}).join('|');
|
337
|
+
var maths = $.map(i18nMath(options.lang), function(val, i) { return val['label']}).join('|');
|
338
|
+
var pattern = new RegExp('(' + fields + ') (' + maths + ') (.*)');
|
339
|
+
return selectedData.match(pattern)[3];
|
340
|
+
}
|
341
|
+
|
342
|
+
// Bind click on div for multiple or searchble
|
195
343
|
var bindContainerClick = function(inputId) {
|
196
344
|
$('#' + container + ' > div.multiple').click(function() {
|
197
345
|
$('#' + inputId).focus();
|
198
346
|
});
|
347
|
+
|
348
|
+
$('#' + container + ' > div.searchable').click(function() {
|
349
|
+
$('#' + inputId).focus();
|
350
|
+
});
|
199
351
|
};
|
200
352
|
|
201
353
|
// on select data
|
@@ -205,23 +357,76 @@ var ComboAutoBox = {
|
|
205
357
|
}
|
206
358
|
};
|
207
359
|
|
360
|
+
// valid language or set 'en' as default
|
361
|
+
var validLanguage = function () {
|
362
|
+
var langs = ['math', 'en', 'pt-br', 'pt', 'es', 'fr'];
|
363
|
+
for(var i=0; i<langs.length;i++) {
|
364
|
+
if (options.lang == langs[i]) {
|
365
|
+
return true;
|
366
|
+
}
|
367
|
+
}
|
368
|
+
|
369
|
+
options.lang = 'en';
|
370
|
+
return true;
|
371
|
+
};
|
372
|
+
|
373
|
+
// valid language or set 'en' as default
|
374
|
+
var validType = function () {
|
375
|
+
var types = ['simple', 'full', 'multiple', 'searchable'];
|
376
|
+
for(var i=0; i<types.length;i++) {
|
377
|
+
if (options.type == types[i]) {
|
378
|
+
return true;
|
379
|
+
}
|
380
|
+
}
|
381
|
+
|
382
|
+
options.type = 'simple';
|
383
|
+
return true;
|
384
|
+
};
|
385
|
+
|
386
|
+
// valid sources for only and except
|
387
|
+
var validSource = function (source) {
|
388
|
+
operators = i18nMath('math');
|
389
|
+
validIndexes = new Array();
|
390
|
+
|
391
|
+
if (((source['only'] != null) && (source['except'] != null)) || ((source['only'] == null) && (source['except'] == null))) {
|
392
|
+
for(var i=0; i<operators.length;i++) {
|
393
|
+
validIndexes.push(i);
|
394
|
+
}
|
395
|
+
} else if (source['only'] != null) {
|
396
|
+
for(var i=0; i<operators.length;i++) {
|
397
|
+
if ((source['only'].indexOf(operators[i]['id']) + source['only'].indexOf(operators[i]['label'])) >= -1) {
|
398
|
+
validIndexes.push(i);
|
399
|
+
}
|
400
|
+
}
|
401
|
+
} else if (source['except'] != null) {
|
402
|
+
for(var i=0; i<operators.length;i++) {
|
403
|
+
if ((source['except'].indexOf(operators[i]['id']) + source['except'].indexOf(operators[i]['label'])) == -2) {
|
404
|
+
validIndexes.push(i);
|
405
|
+
}
|
406
|
+
}
|
407
|
+
}
|
408
|
+
|
409
|
+
return validIndexes;
|
410
|
+
}
|
411
|
+
|
208
412
|
// main
|
209
413
|
if (options == null) {
|
210
414
|
options = {};
|
211
415
|
}
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
}
|
416
|
+
|
417
|
+
validLanguage();
|
418
|
+
validType();
|
216
419
|
|
217
420
|
$('#' + container).html(generateDivTag());
|
218
421
|
|
219
422
|
textField = $('#' + container + ' > div.container-combo-auto-box > input');
|
220
423
|
bindAutoComplete(textField.attr('id'));
|
221
424
|
|
222
|
-
if (options.type == 'simple') {
|
425
|
+
if ((options.type == 'simple') || (options.type == 'multiple')) {
|
223
426
|
generateModalDialog(textField);
|
224
|
-
}
|
427
|
+
}
|
428
|
+
|
429
|
+
if ((options.type == 'multiple') || (options.type == 'searchable')) {
|
225
430
|
bindContainerClick(textField.attr('id'));
|
226
431
|
}
|
227
432
|
}
|
@@ -1,16 +1,22 @@
|
|
1
1
|
span.combo-auto-box-item-id { display:none; }
|
2
|
-
div.container-combo-auto-box span.
|
3
|
-
|
4
|
-
div.container-combo-auto-box span.expand i{background-image:url(/assets/combo_auto_box_expand.png);width:19px;height:19px;display:block;font-size:0;}
|
2
|
+
div.container-combo-auto-box span.simple { position:absolute;cursor:pointer;display:block;margin:0px 0px 0px 0px; width:20px; }
|
3
|
+
div.container-combo-auto-box span.simple i{ background-image:url(/assets/combo_auto_box_expand.png);width:19px;height:19px;display:block;font-size:0; }
|
5
4
|
|
6
5
|
div.multiple { border: 1px solid #CDCDCD; display:table; }
|
6
|
+
div.multiple span.multiple { font-family: arial,sans-serif; float:left; font-size: 13px; color:#9A9A9A; margin: 2px 2px 2px 2px; padding:2px 10px 2px 10px; }
|
7
7
|
div.multiple input { border: 0px; float:left; height:22px; }
|
8
|
-
|
9
|
-
div.multiple div.item { font-family: arial,sans-serif; float:left; background-color:#EDEDED; margin: 2px 10px 2px 2px; padding:2px 10px 2px 10px; -moz-border-radius:4px;-webkit-border-radius:4px; border:1px solid #CECECE; font-size: 13px; }
|
8
|
+
div.multiple div.item { font-family: arial,sans-serif; float:left; font-size: 13px; color:#000000; background-color:#EDEDED; margin: 2px 10px 2px 2px; padding:2px 10px 2px 10px; -moz-border-radius:4px;-webkit-border-radius:4px; border:1px solid #CECECE; }
|
10
9
|
div.multiple div.item span { margin-left:10px; color:#CCCCCC; }
|
11
10
|
div.multiple div.item span:hover { color:#9A9A9A; cursor:pointer;}
|
12
11
|
div.multiple input:focus {outline:none; }
|
13
12
|
|
13
|
+
div.searchable { border: 1px solid #CDCDCD; display:table; }
|
14
|
+
div.searchable input { border: 0px; float:left; height:22px; }
|
15
|
+
div.searchable div.item { font-family: arial,sans-serif; float:left; font-size: 13px; color:#FFFFFF; background-color:#008000; margin: 2px 10px 2px 2px; padding:2px 10px 2px 10px; -moz-border-radius:4px;-webkit-border-radius:4px; border:1px solid #ECECEC; }
|
16
|
+
div.searchable div.item span { margin-left:10px; color:#CCCCCC; }
|
17
|
+
div.searchable div.item span:hover { color:#FFFFFF; cursor:pointer;}
|
18
|
+
div.searchable input:focus {outline:none; }
|
19
|
+
|
14
20
|
div.dialog-modal div.head { display:block; width:99%; position:absolute; z-index:2002; top:0px; left:0px; border: 1px solid #000; background-color:#CECECE; height:30px; -moz-border-radius:4px;-webkit-border-radius:4px;}
|
15
21
|
div.dialog-modal div.head span.label { float:left; margin: 5px 0 0 10px; padding: 0 0 0 0; text-weight: bold; font-size:16px; font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif";}
|
16
22
|
div.dialog-modal div.head span.close { float:right; margin: 5px 10px 0 0; padding: 0 0 0 0; font-size:16px; font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; text-indent: 0;}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: combo_auto_box
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-07-
|
12
|
+
date: 2013-07-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|