scaffolding_extensions 1.4.3 → 1.4.4
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/README +4 -4
- data/contrib/scaffold_jquery_autocomplete/README +5 -6
- data/contrib/scaffold_jquery_autocomplete/indicator.gif +0 -0
- data/contrib/scaffold_jquery_autocomplete/jquery.autocomplete.css +48 -0
- data/contrib/scaffold_jquery_autocomplete/jquery.autocomplete.js +13 -0
- data/lib/scaffolding_extensions/controller/action_controller.rb +14 -18
- data/lib/scaffolding_extensions/helper.rb +5 -11
- data/lib/scaffolding_extensions/jquery_helper.rb +8 -2
- data/lib/scaffolding_extensions/meta_controller.rb +5 -4
- data/lib/scaffolding_extensions/prototype_helper.rb +9 -0
- data/scaffolds/edit.rhtml +5 -5
- data/scaffolds/habtm.rhtml +5 -5
- data/scaffolds/list.rhtml +4 -4
- data/scaffolds/listtable.rhtml +9 -9
- data/scaffolds/manage.rhtml +2 -2
- data/scaffolds/merge.rhtml +6 -6
- data/scaffolds/new.rhtml +2 -2
- data/scaffolds/search.rhtml +3 -3
- data/scaffolds/show.rhtml +3 -3
- metadata +7 -6
- data/contrib/scaffold_jquery_autocomplete/jquery.ui.se_autocomplete.css +0 -22
- data/contrib/scaffold_jquery_autocomplete/jquery.ui.se_autocomplete.js +0 -121
data/README
CHANGED
@@ -21,19 +21,19 @@ to better suit your needs.
|
|
21
21
|
Scaffolding Extensions currently supports:
|
22
22
|
|
23
23
|
* Web Frameworks
|
24
|
-
* Rails
|
24
|
+
* Rails 3.0.0
|
25
25
|
* Ramaze 2010.06.18
|
26
26
|
* Camping 2.1
|
27
27
|
* Sinatra 1.0
|
28
28
|
* Merb 1.0.4
|
29
29
|
* Rack 1.1.0
|
30
30
|
* Object Relational Mappers
|
31
|
-
* ActiveRecord
|
32
|
-
* Sequel 3.
|
31
|
+
* ActiveRecord 3.0.0
|
32
|
+
* Sequel 3.16.0
|
33
33
|
* DataMapper 1.0 (see doc/datamapper.txt for details)
|
34
34
|
* Javascript Libaries (used for Ajax/Autocompleting)
|
35
35
|
* Prototype 1.6.0.3
|
36
|
-
* JQuery 1.2.
|
36
|
+
* JQuery 1.4.2 (with JQuery-Autocomplete 1.1)
|
37
37
|
|
38
38
|
There are differing levels of support for the web frameworks, mostly related
|
39
39
|
to whether or not you can use custom views and layouts. Custom views mean
|
@@ -1,8 +1,7 @@
|
|
1
1
|
If you are using JQuery javascript library with the plugin, you need to use this
|
2
|
-
plugin for autocomplete functionality. It's a modification of
|
3
|
-
[1].
|
4
|
-
|
5
|
-
|
2
|
+
plugin for autocomplete functionality. It's a modification of jquery-Autocomplete
|
3
|
+
[1]. To use this plugin, include the css file as a stylesheet, the gif in the
|
4
|
+
same directory as the stylesheet, and the js file as a script (in addition to
|
5
|
+
JQuery itself).
|
6
6
|
|
7
|
-
[1] http://
|
8
|
-
[2] http://plugins.jquery.com/project/dimensions
|
7
|
+
[1] http://docs.jquery.com/Plugins/autocomplete
|
Binary file
|
@@ -0,0 +1,48 @@
|
|
1
|
+
.ac_results {
|
2
|
+
padding: 0px;
|
3
|
+
border: 1px solid black;
|
4
|
+
background-color: white;
|
5
|
+
overflow: hidden;
|
6
|
+
z-index: 99999;
|
7
|
+
}
|
8
|
+
|
9
|
+
.ac_results ul {
|
10
|
+
width: 100%;
|
11
|
+
list-style-position: outside;
|
12
|
+
list-style: none;
|
13
|
+
padding: 0;
|
14
|
+
margin: 0;
|
15
|
+
}
|
16
|
+
|
17
|
+
.ac_results li {
|
18
|
+
margin: 0px;
|
19
|
+
padding: 2px 5px;
|
20
|
+
cursor: default;
|
21
|
+
display: block;
|
22
|
+
/*
|
23
|
+
if width will be 100% horizontal scrollbar will apear
|
24
|
+
when scroll mode will be used
|
25
|
+
*/
|
26
|
+
/*width: 100%;*/
|
27
|
+
font: menu;
|
28
|
+
font-size: 12px;
|
29
|
+
/*
|
30
|
+
it is very important, if line-height not setted or setted
|
31
|
+
in relative units scroll will be broken in firefox
|
32
|
+
*/
|
33
|
+
line-height: 16px;
|
34
|
+
overflow: hidden;
|
35
|
+
}
|
36
|
+
|
37
|
+
.ac_loading {
|
38
|
+
background: white url('indicator.gif') right center no-repeat;
|
39
|
+
}
|
40
|
+
|
41
|
+
.ac_odd {
|
42
|
+
background-color: #eee;
|
43
|
+
}
|
44
|
+
|
45
|
+
.ac_over {
|
46
|
+
background-color: #0A246A;
|
47
|
+
color: white;
|
48
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery Autocomplete plugin 1.1
|
3
|
+
*
|
4
|
+
* Copyright (c) 2009 Jörn Zaefferer
|
5
|
+
*
|
6
|
+
* Dual licensed under the MIT and GPL licenses:
|
7
|
+
* http://www.opensource.org/licenses/mit-license.php
|
8
|
+
* http://www.gnu.org/licenses/gpl.html
|
9
|
+
*
|
10
|
+
* Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
|
11
|
+
*/;(function($){$.fn.extend({autocomplete:function(urlOrData,options){var isUrl=typeof urlOrData=="string";options=$.extend({},$.Autocompleter.defaults,{url:isUrl?urlOrData:null,data:isUrl?null:urlOrData,delay:isUrl?$.Autocompleter.defaults.delay:10,max:options&&!options.scroll?10:150},options);options.highlight=options.highlight||function(value){return value;};options.formatMatch=options.formatMatch||options.formatItem;return this.each(function(){new $.Autocompleter(this,options);});},result:function(handler){return this.bind("result",handler);},search:function(handler){return this.trigger("search",[handler]);},flushCache:function(){return this.trigger("flushCache");},setOptions:function(options){return this.trigger("setOptions",[options]);},unautocomplete:function(){return this.trigger("unautocomplete");}});$.Autocompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var cache=$.Autocompleter.Cache(options);var hasFocus=0;var lastKeyPressCode;var config={mouseDownOnSelect:false};var select=$.Autocompleter.Select(options,input,selectCurrent,config);var blockSubmit;$.browser.opera&&$(input.form).bind("submit.autocomplete",function(){if(blockSubmit){blockSubmit=false;return false;}});$input.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(event){hasFocus=1;lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:event.preventDefault();if(select.visible()){select.prev();}else{onChange(0,true);}break;case KEY.DOWN:event.preventDefault();if(select.visible()){select.next();}else{onChange(0,true);}break;case KEY.PAGEUP:event.preventDefault();if(select.visible()){select.pageUp();}else{onChange(0,true);}break;case KEY.PAGEDOWN:event.preventDefault();if(select.visible()){select.pageDown();}else{onChange(0,true);}break;case options.multiple&&$.trim(options.multipleSeparator)==","&&KEY.COMMA:case KEY.TAB:case KEY.RETURN:if(selectCurrent()){event.preventDefault();blockSubmit=true;return false;}break;case KEY.ESC:select.hide();break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break;}}).focus(function(){hasFocus++;}).blur(function(){hasFocus=0;if(!config.mouseDownOnSelect){hideResults();}}).click(function(){if(hasFocus++>1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i<data.length;i++){if(data[i].result.toLowerCase()==q.toLowerCase()){result=data[i];break;}}}if(typeof fn=="function")fn(result);else $input.trigger("result",result&&[result.data,result.value]);}$.each(trimWords($input.val()),function(i,value){request(value,findValueCallback,findValueCallback);});}).bind("flushCache",function(){cache.flush();}).bind("setOptions",function(){$.extend(options,arguments[1]);if("data"in arguments[1])cache.populate();}).bind("unautocomplete",function(){select.unbind();$input.unbind();$(input.form).unbind(".autocomplete");});function selectCurrent(){var selected=select.selected();if(!selected)return false;var v=selected.result;previousValue=v;if(options.multiple){var words=trimWords($input.val());if(words.length>1){var seperator=options.multipleSeparator.length;var cursorAt=$(input).selection().start;var wordAt,progress=0;$.each(words,function(i,word){progress+=word.length;if(cursorAt<=progress){wordAt=i;return false;}progress+=seperator;});words[wordAt]=v;v=words.join(options.multipleSeparator);}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&¤tValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value)return[""];if(!options.multiple)return[$.trim(value)];return $.map(value.split(options.multipleSeparator),function(word){return $.trim(value).length?$.trim(word):null;});}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);if(words.length==1)return words[0];var cursorAt=$(input).selection().start;if(cursorAt==value.length){words=trimWords(value)}else{words=trimWords(value.replace(value.substring(cursorAt),""));}return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$(input).selection(previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else{$input.val("");$input.trigger("result",null);}}});}};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i<rows.length;i++){var row=$.trim(rows[i]);if(row){row=row.split("|");parsed[parsed.length]={data:row,value:row[0],result:options.formatResult&&options.formatResult(row,row[0])||row[0]};}}return parsed;};function stopLoading(){$input.removeClass(options.loadingClass);};};$.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(row){return row[0];},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(value,term){return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(options.matchContains=="word"){i=s.toLowerCase().search("\\b"+sub.toLowerCase());}if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i<ol;i++){var rawValue=options.data[i];rawValue=(typeof rawValue=="string")?[rawValue]:rawValue;var value=options.formatMatch(rawValue,i+1,options.data.length);if(value===false)continue;var firstChar=value.charAt(0).toLowerCase();if(!stMatchSets[firstChar])stMatchSets[firstChar]=[];var row={value:value,data:rawValue,result:options.formatResult&&options.formatResult(rawValue)||value};stMatchSets[firstChar].push(row);if(nullData++<options.max){stMatchSets[""].push(row);}};$.each(stMatchSets,function(i,value){options.cacheLength++;add(i,value);});}setTimeout(populate,25);function flush(){data={};length=0;}return{flush:flush,add:add,populate:populate,load:function(q){if(!options.cacheLength||!length)return null;if(!options.url&&options.matchContains){var csub=[];for(var k in data){if(k.length>0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else
|
12
|
+
if(data[q]){return data[q];}else
|
13
|
+
if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("<div/>").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("<ul/>").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset<list.scrollTop()){list.scrollTop(offset);}}};function movePosition(step){active+=step;if(active<0){active=listItems.size()-1;}else if(active>=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max<available?options.max:available;}function fillList(){list.empty();var max=limitNumberOfItems(data.length);for(var i=0;i<max;i++){if(!data[i])continue;var formatted=options.formatItem(data[i].data,i+1,max,data[i].value,term);if(formatted===false)continue;var li=$("<li/>").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.fn.selection=function(start,end){if(start!==undefined){return this.each(function(){if(this.createTextRange){var selRange=this.createTextRange();if(end===undefined||start==end){selRange.move("character",start);selRange.select();}else{selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}}else if(this.setSelectionRange){this.setSelectionRange(start,end);}else if(this.selectionStart){this.selectionStart=start;this.selectionEnd=end;}});}var field=this[0];if(field.createTextRange){var range=document.selection.createRange(),orig=field.value,teststring="<->",textLength=range.text.length;range.text=teststring;var caretAt=field.value.indexOf(teststring);field.value=orig;this.selection(caretAt,caretAt+textLength);return{start:caretAt,end:caretAt+textLength}}else if(field.selectionStart!==undefined){return{start:field.selectionStart,end:field.selectionEnd}}};})(jQuery);
|
@@ -15,6 +15,11 @@ module ScaffoldingExtensions
|
|
15
15
|
def scaffold_token_tag
|
16
16
|
token_tag
|
17
17
|
end
|
18
|
+
|
19
|
+
# Mark the output as safe for raw display
|
20
|
+
def scaffold_raw(s)
|
21
|
+
raw(s)
|
22
|
+
end
|
18
23
|
end
|
19
24
|
|
20
25
|
# Instance methods for ActionController::Base necessary for Scaffolding Extensions
|
@@ -49,10 +54,15 @@ module ScaffoldingExtensions
|
|
49
54
|
begin
|
50
55
|
render({:action=>suffix_action}.merge(render_options))
|
51
56
|
rescue ActionView::MissingTemplate
|
52
|
-
if
|
53
|
-
render({:file=>scaffold_path(action)
|
57
|
+
if render_options.include?(:layout) || _default_layout
|
58
|
+
render({:file=>scaffold_path(action)}.merge(render_options))
|
54
59
|
else
|
55
|
-
|
60
|
+
options = _normalize_args({:file=>scaffold_path(action)}.merge(render_options))
|
61
|
+
_normalize_options(options)
|
62
|
+
_process_options(options)
|
63
|
+
vc = view_context
|
64
|
+
@content = vc.render(options)
|
65
|
+
vc.instance_variables.each{|iv| instance_variable_set(iv, vc.instance_variable_get(iv))}
|
56
66
|
render({:file=>scaffold_path("layout")})
|
57
67
|
end
|
58
68
|
end
|
@@ -92,21 +102,7 @@ module ScaffoldingExtensions
|
|
92
102
|
private
|
93
103
|
# Adds a before filter for checking nonidempotent requests use method POST
|
94
104
|
def scaffold_setup_helper
|
95
|
-
|
96
|
-
helper mod
|
97
|
-
if mod.respond_to?(:safe_helper, true)
|
98
|
-
mod.send(:safe_helper, :scaffold_association_links, :scaffold_auto_complete_result,
|
99
|
-
:scaffold_button_to, :scaffold_button_to_remote, :scaffold_field_tag,
|
100
|
-
:scaffold_form, :scaffold_habtm_ajax_associations,
|
101
|
-
:scaffold_habtm_association_line_item, :scaffold_javascript_tag,
|
102
|
-
:scaffold_label, :scaffold_link, :scaffold_manage_link,
|
103
|
-
:scaffold_model_error_messages, :scaffold_model_field_tags,
|
104
|
-
:scaffold_model_form, :scaffold_select_tag,
|
105
|
-
:scaffold_add_habtm_element, :scaffold_remove_existing_habtm_element,
|
106
|
-
:scaffold_text_field_tag_with_auto_complete,
|
107
|
-
:scaffold_form_remote_tag, :scaffold_javascript_autocompleter,
|
108
|
-
:scaffold_load_associations_with_ajax_link)
|
109
|
-
end
|
105
|
+
helper ScaffoldingExtensions::Helper
|
110
106
|
helper ScaffoldingExtensions::ActionControllerHelper
|
111
107
|
include ScaffoldingExtensions::Controller
|
112
108
|
include ScaffoldingExtensions::ActionController
|
@@ -47,17 +47,6 @@ module ScaffoldingExtensions
|
|
47
47
|
content << "</ul>\n"
|
48
48
|
end
|
49
49
|
|
50
|
-
# Formats the records returned by scaffold autocompleting to be displayed,
|
51
|
-
# should be an unordered list. By default uses the scaffold_name and id of
|
52
|
-
# the entries as the value.
|
53
|
-
def scaffold_auto_complete_result(entries)
|
54
|
-
return unless entries
|
55
|
-
content = '<ul>'
|
56
|
-
entries.collect{|entry| content << "<li>#{h(entry.scaffold_name_with_id)}</li>"}
|
57
|
-
content << '</ul>'
|
58
|
-
content
|
59
|
-
end
|
60
|
-
|
61
50
|
# Simple button with label text that submits a form to the given url, options are
|
62
51
|
# passed to scaffold_form.
|
63
52
|
def scaffold_button_to(text, url, options={})
|
@@ -294,6 +283,11 @@ module ScaffoldingExtensions
|
|
294
283
|
def scaffold_param_list_suffix
|
295
284
|
'[]'
|
296
285
|
end
|
286
|
+
|
287
|
+
# Empty method, used in certain frameworks for marking strings as raw
|
288
|
+
def scaffold_raw(s)
|
289
|
+
s
|
290
|
+
end
|
297
291
|
|
298
292
|
# A select tag with the provided name for the given collection of items. The options
|
299
293
|
# will have the value of scaffold_id and the content of scaffold_name. If multiple is
|
@@ -18,11 +18,17 @@ module ScaffoldingExtensions
|
|
18
18
|
end
|
19
19
|
content
|
20
20
|
end
|
21
|
+
|
22
|
+
# JQuery-Autocomplete expects the autocomplete result to be plain text
|
23
|
+
# with a single line per row.
|
24
|
+
def scaffold_auto_complete_result(entries)
|
25
|
+
scaffold_raw(entries.map{|e| h(e.scaffold_name_with_id)}.join("\n")) if entries
|
26
|
+
end
|
21
27
|
|
22
28
|
# A form tag with an onsubmit attribute that submits the form to the given url via Ajax
|
23
29
|
def scaffold_form_remote_tag(url, options)
|
24
30
|
u = scaffold_url(url, options)
|
25
|
-
"<form method='post' action='#{u}' onsubmit=\"$.post('#{u}', $(this).serialize(), function(data, textStatus){
|
31
|
+
"<form method='post' action='#{u}' onsubmit=\"$.post('#{u}', $(this).serialize(), function(data, textStatus){}); return false;\">\n#{scaffold_token_tag}\n"
|
26
32
|
end
|
27
33
|
|
28
34
|
# Javascript that takes the given id as the text box to autocomplete for,
|
@@ -30,7 +36,7 @@ module ScaffoldingExtensions
|
|
30
36
|
# (with the association if one is given), using the get method, and displaying values
|
31
37
|
# in #{id}_scaffold_auto_complete.
|
32
38
|
def scaffold_javascript_autocompleter(id, model_name, association)
|
33
|
-
scaffold_javascript_tag("$('##{id}').autocomplete(
|
39
|
+
scaffold_javascript_tag("$('##{id}').autocomplete('#{scaffold_url("scaffold_auto_complete_for_#{model_name}")}'#{", {extraParams: {association: '#{association}'}}" if association});")
|
34
40
|
end
|
35
41
|
|
36
42
|
# Filters some html entities and replaces them with their javascript equivalents
|
@@ -124,7 +124,7 @@ module ScaffoldingExtensions
|
|
124
124
|
if klass.scaffold_load_associations_with_ajax
|
125
125
|
scaffold_define_method("associations#{suffix}") do
|
126
126
|
@scaffold_object ||= klass.scaffold_find_object(:edit, scaffold_request_id, :session=>scaffold_session)
|
127
|
-
scaffold_render_template(:associations, scaffold_options, :inline=>"<%= scaffold_habtm_ajax_associations %>\n<%= scaffold_association_links %>\n")
|
127
|
+
scaffold_render_template(:associations, scaffold_options, :inline=>"<%=scaffold_raw scaffold_habtm_ajax_associations %>\n<%=scaffold_raw scaffold_association_links %>\n")
|
128
128
|
end
|
129
129
|
end
|
130
130
|
end
|
@@ -224,7 +224,8 @@ module ScaffoldingExtensions
|
|
224
224
|
if scaffold_request_param(:association) && !allowed_associations.include?(association)
|
225
225
|
scaffold_method_not_allowed
|
226
226
|
else
|
227
|
-
|
227
|
+
# Prototype uses the request id, JQuery-Autocomplete uses the q parameter
|
228
|
+
@items = klass.scaffold_auto_complete_find((scaffold_request_id || scaffold_request_param(:q)).to_s, :association=>(association.to_sym if scaffold_request_param(:association)), :session=>scaffold_session)
|
228
229
|
scaffold_render_template(meth, {}, :inline => "<%= scaffold_auto_complete_result(@items) %>")
|
229
230
|
end
|
230
231
|
end
|
@@ -272,7 +273,7 @@ module ScaffoldingExtensions
|
|
272
273
|
@auto_complete = auto_complete
|
273
274
|
@element_id = element_id
|
274
275
|
@scaffold_javascript = true
|
275
|
-
scaffold_render_template(add_meth, {}, :inline=>'<%= scaffold_add_habtm_element %>')
|
276
|
+
scaffold_render_template(add_meth, {}, :inline=>'<%=scaffold_raw scaffold_add_habtm_element %>')
|
276
277
|
else
|
277
278
|
scaffold_redirect_to(scaffold_url("edit#{suffix}", :id=>@record.scaffold_id))
|
278
279
|
end
|
@@ -289,7 +290,7 @@ module ScaffoldingExtensions
|
|
289
290
|
@select_value = @associated_record.scaffold_id
|
290
291
|
@select_text = @associated_record.scaffold_name
|
291
292
|
@scaffold_javascript = true
|
292
|
-
scaffold_render_template(remove_meth, {}, :inline=>'<%= scaffold_remove_existing_habtm_element %>')
|
293
|
+
scaffold_render_template(remove_meth, {}, :inline=>'<%=scaffold_raw scaffold_remove_existing_habtm_element %>')
|
293
294
|
else
|
294
295
|
scaffold_redirect_to(scaffold_url("edit#{suffix}", :id=>@record.scaffold_id))
|
295
296
|
end
|
@@ -19,6 +19,15 @@ module ScaffoldingExtensions
|
|
19
19
|
content
|
20
20
|
end
|
21
21
|
|
22
|
+
# Prototype wants the auto_complete result as an unordered list.
|
23
|
+
def scaffold_auto_complete_result(entries)
|
24
|
+
return unless entries
|
25
|
+
content = '<ul>'
|
26
|
+
entries.collect{|entry| content << "<li>#{h(entry.scaffold_name_with_id)}</li>"}
|
27
|
+
content << '</ul>'
|
28
|
+
scaffold_raw content
|
29
|
+
end
|
30
|
+
|
22
31
|
# A form tag with an onsubmit attribute that submits the form to the given url via Ajax
|
23
32
|
def scaffold_form_remote_tag(url, options)
|
24
33
|
u = scaffold_url(url, options)
|
data/scaffolds/edit.rhtml
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
<% @scaffold_title = "Editing #{@scaffold_options[:singular_lc_human_name]}" %>
|
2
2
|
|
3
|
-
<%= scaffold_model_form('update', @scaffold_class.scaffold_fields(:edit)) %>
|
3
|
+
<%=scaffold_raw scaffold_model_form('update', @scaffold_class.scaffold_fields(:edit)) %>
|
4
4
|
|
5
5
|
<% if @scaffold_class.scaffold_load_associations_with_ajax && !@scaffold_show_associations %>
|
6
|
-
<%= scaffold_load_associations_with_ajax_link %>
|
6
|
+
<%=scaffold_raw scaffold_load_associations_with_ajax_link %>
|
7
7
|
<% else %>
|
8
|
-
<%= scaffold_habtm_ajax_associations %>
|
9
|
-
<%= scaffold_association_links %>
|
8
|
+
<%=scaffold_raw scaffold_habtm_ajax_associations %>
|
9
|
+
<%=scaffold_raw scaffold_association_links %>
|
10
10
|
<% end %>
|
11
11
|
|
12
|
-
<%= scaffold_manage_link %>
|
12
|
+
<%=scaffold_raw scaffold_manage_link %>
|
data/scaffolds/habtm.rhtml
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
<% @scaffold_title = "Update #{sn = h(@scaffold_object.scaffold_name)}'s #{mpn = (so = @scaffold_options )[:aplch_name]}" %>
|
2
2
|
|
3
|
-
<%= scaffold_form(scaffold_url("update#{@scaffold_suffix}", :id=>(soid=@scaffold_object.scaffold_id))) %>
|
3
|
+
<%=scaffold_raw scaffold_form(scaffold_url("update#{@scaffold_suffix}", :id=>(soid=@scaffold_object.scaffold_id))) %>
|
4
4
|
|
5
5
|
<% if @scaffold_class.scaffold_association_use_auto_complete(assoc = so[:association]) %>
|
6
6
|
<h4>Add this <%= so[:aslhc_name] %></h4>
|
7
|
-
<%= scaffold_text_field_tag_with_auto_complete('add', so[:singular_name], assoc) %>
|
7
|
+
<%=scaffold_raw scaffold_text_field_tag_with_auto_complete('add', so[:singular_name], assoc) %>
|
8
8
|
<% elsif @items_to_add.length > 0 %>
|
9
9
|
<h4>Add these <%= mpn %></h4>
|
10
|
-
<%= scaffold_select_tag('add', @items_to_add, true) %>
|
10
|
+
<%=scaffold_raw scaffold_select_tag('add', @items_to_add, true) %>
|
11
11
|
<% end %>
|
12
12
|
|
13
13
|
<% if @items_to_remove.length > 0 %>
|
14
14
|
<h4>Remove these <%= mpn %></h4>
|
15
|
-
<%= scaffold_select_tag('remove', @items_to_remove, true) %>
|
15
|
+
<%=scaffold_raw scaffold_select_tag('remove', @items_to_remove, true) %>
|
16
16
|
<% end %>
|
17
17
|
|
18
18
|
<br /><br />
|
@@ -20,5 +20,5 @@
|
|
20
20
|
</form>
|
21
21
|
|
22
22
|
<% if '' != (edit_link = scaffold_check_link("Edit #{sn}", true, "edit_#{@scaffold_options[:singular_name]}", :id=>soid)) %>
|
23
|
-
<h2><%= edit_link %></h2>
|
23
|
+
<h2><%=scaffold_raw edit_link %></h2>
|
24
24
|
<% end %>
|
data/scaffolds/list.rhtml
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
<% @scaffold_title = "Choose #{hn = @scaffold_options[:singular_lc_human_name]} to #{(haction = (action = @scaffold_action).to_s.humanize).downcase}" %>
|
2
2
|
|
3
|
-
<%= scaffold_form(scaffold_url("#{action}#{@scaffold_suffix}"), :method=>scaffold_idempotent_action?(action) ? :get : :post) %>
|
3
|
+
<%=scaffold_raw scaffold_form(scaffold_url("#{action}#{@scaffold_suffix}"), :method=>scaffold_idempotent_action?(action) ? :get : :post) %>
|
4
4
|
<% if @scaffold_class.scaffold_use_auto_complete %>
|
5
|
-
<%= scaffold_text_field_tag_with_auto_complete('id', @scaffold_options[:singular_name]) %>
|
5
|
+
<%=scaffold_raw scaffold_text_field_tag_with_auto_complete('id', @scaffold_options[:singular_name]) %>
|
6
6
|
<% else %>
|
7
|
-
<%= scaffold_select_tag('id', @scaffold_objects) %>
|
7
|
+
<%=scaffold_raw scaffold_select_tag('id', @scaffold_objects) %>
|
8
8
|
<% end %>
|
9
9
|
<br /><br />
|
10
10
|
<input type="submit" value="<%= haction %> <%= hn %>" />
|
11
11
|
</form>
|
12
12
|
|
13
|
-
<%= scaffold_manage_link %>
|
13
|
+
<%=scaffold_raw scaffold_manage_link %>
|
data/scaffolds/listtable.rhtml
CHANGED
@@ -21,13 +21,13 @@
|
|
21
21
|
<td><%=h entry.scaffold_value(column).to_s %></td>
|
22
22
|
<% end %>
|
23
23
|
<% if show %>
|
24
|
-
<td><%= scaffold_button_to(s, scaffold_url(ss, :id=>eid), :method=>:get) %></td>
|
24
|
+
<td><%=scaffold_raw scaffold_button_to(s, scaffold_url(ss, :id=>eid), :method=>:get) %></td>
|
25
25
|
<% end %>
|
26
26
|
<% if edit %>
|
27
|
-
<td><%= scaffold_button_to(e, scaffold_url(es, :id=>eid), :method=>:get) %></td>
|
27
|
+
<td><%=scaffold_raw scaffold_button_to(e, scaffold_url(es, :id=>eid), :method=>:get) %></td>
|
28
28
|
<% end %>
|
29
29
|
<% if delete %>
|
30
|
-
<td><%= scaffold_button_to(d, scaffold_url(ds, :id=>eid)) %></td>
|
30
|
+
<td><%=scaffold_raw scaffold_button_to(d, scaffold_url(ds, :id=>eid)) %></td>
|
31
31
|
<% end %>
|
32
32
|
</tr>
|
33
33
|
<% end %>
|
@@ -43,16 +43,16 @@
|
|
43
43
|
<% end %>
|
44
44
|
|
45
45
|
<% if @scaffold_listtable_type == :search && @scaffold_search_results_form_params && (@scaffold_search_results_form_params[:page] > 1 || @scaffold_search_results_form_params[:next_page]) %>
|
46
|
-
<%= scaffold_form(scaffold_url("results#{@scaffold_suffix}")) %>
|
47
|
-
<%= scaffold_field_tag(:hidden, :value=>@scaffold_search_results_form_params[:page], :id=>'page') %>
|
46
|
+
<%=scaffold_raw scaffold_form(scaffold_url("results#{@scaffold_suffix}")) %>
|
47
|
+
<%=scaffold_raw scaffold_field_tag(:hidden, :value=>@scaffold_search_results_form_params[:page], :id=>'page') %>
|
48
48
|
<% @scaffold_search_results_form_params[:model].each do |key, value| %>
|
49
|
-
<%= scaffold_field_tag(:hidden, :value=>value, :id=>"#{@scaffold_options[:singular_name]}_#{key}", :name=>"#{@scaffold_options[:singular_name]}[#{key}]") %>
|
49
|
+
<%=scaffold_raw scaffold_field_tag(:hidden, :value=>value, :id=>"#{@scaffold_options[:singular_name]}_#{key}", :name=>"#{@scaffold_options[:singular_name]}[#{key}]") %>
|
50
50
|
<% end %>
|
51
51
|
<% @scaffold_search_results_form_params[:notnull].each do |field| %>
|
52
|
-
<%= scaffold_field_tag(:hidden, :value=>field, :name=>"notnull#{scaffold_param_list_suffix}") %>
|
52
|
+
<%=scaffold_raw scaffold_field_tag(:hidden, :value=>field, :name=>"notnull#{scaffold_param_list_suffix}") %>
|
53
53
|
<% end %>
|
54
54
|
<% @scaffold_search_results_form_params[:null].each do |field| %>
|
55
|
-
<%= scaffold_field_tag(:hidden, :value=>field, :name=>"null#{scaffold_param_list_suffix}") %>
|
55
|
+
<%=scaffold_raw scaffold_field_tag(:hidden, :value=>field, :name=>"null#{scaffold_param_list_suffix}") %>
|
56
56
|
<% end %>
|
57
57
|
<% if @scaffold_search_results_form_params[:page] > 1 %>
|
58
58
|
<input type="submit" name="page_previous" value="Previous Page" />
|
@@ -63,4 +63,4 @@
|
|
63
63
|
</form>
|
64
64
|
<% end %>
|
65
65
|
|
66
|
-
<%= scaffold_manage_link %>
|
66
|
+
<%=scaffold_raw scaffold_manage_link %>
|
data/scaffolds/manage.rhtml
CHANGED
@@ -9,9 +9,9 @@
|
|
9
9
|
["Show #{singular_name}", :show]].each do |text, action| %>
|
10
10
|
<% link = scaffold_check_link(text, true, "#{action}#{@scaffold_suffix}")
|
11
11
|
unless link == '' %>
|
12
|
-
<li><%= link %></li>
|
12
|
+
<li><%=scaffold_raw link %></li>
|
13
13
|
<% end %>
|
14
14
|
<% end %>
|
15
15
|
</ul>
|
16
16
|
|
17
|
-
<%= scaffold_check_link('Manage Models', true, 'index') %>
|
17
|
+
<%=scaffold_raw scaffold_check_link('Manage Models', true, 'index') %>
|
data/scaffolds/merge.rhtml
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
<% @scaffold_title = "Merge two #{@scaffold_options[:plural_lc_human_name]}" %>
|
2
2
|
|
3
|
-
<%= scaffold_form(scaffold_url("merge_update#{@scaffold_suffix}")) %>
|
3
|
+
<%=scaffold_raw scaffold_form(scaffold_url("merge_update#{@scaffold_suffix}")) %>
|
4
4
|
<p>Merge:
|
5
5
|
<% if @scaffold_class.scaffold_use_auto_complete %>
|
6
|
-
<%= scaffold_text_field_tag_with_auto_complete('from', @scaffold_options[:singular_name]) %>
|
6
|
+
<%=scaffold_raw scaffold_text_field_tag_with_auto_complete('from', @scaffold_options[:singular_name]) %>
|
7
7
|
<% else %>
|
8
|
-
<%= scaffold_select_tag('from', @scaffold_objects) %>
|
8
|
+
<%=scaffold_raw scaffold_select_tag('from', @scaffold_objects) %>
|
9
9
|
<% end %>
|
10
10
|
</p>
|
11
11
|
|
12
12
|
<p>into:
|
13
13
|
<% if @scaffold_class.scaffold_use_auto_complete %>
|
14
|
-
<%= scaffold_text_field_tag_with_auto_complete('to', @scaffold_options[:singular_name]) %>
|
14
|
+
<%=scaffold_raw scaffold_text_field_tag_with_auto_complete('to', @scaffold_options[:singular_name]) %>
|
15
15
|
<% else %>
|
16
|
-
<%= scaffold_select_tag('to', @scaffold_objects) %>
|
16
|
+
<%=scaffold_raw scaffold_select_tag('to', @scaffold_objects) %>
|
17
17
|
<% end %>
|
18
18
|
</p>
|
19
19
|
|
20
20
|
<input type="submit" value="Merge <%= @scaffold_options[:plural_lc_human_name] %>" />
|
21
21
|
</form>
|
22
22
|
|
23
|
-
<%= scaffold_manage_link %>
|
23
|
+
<%=scaffold_raw scaffold_manage_link %>
|
data/scaffolds/new.rhtml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<% @scaffold_title = "Create new #{@scaffold_options[:singular_lc_human_name]}" %>
|
2
2
|
|
3
|
-
<%= scaffold_model_form('create', @scaffold_class.scaffold_fields(:new)) %>
|
3
|
+
<%=scaffold_raw scaffold_model_form('create', @scaffold_class.scaffold_fields(:new)) %>
|
4
4
|
|
5
|
-
<%= scaffold_manage_link %>
|
5
|
+
<%=scaffold_raw scaffold_manage_link %>
|
data/scaffolds/search.rhtml
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
<% @scaffold_title = "Search #{@scaffold_options[:plural_lc_human_name]}" %>
|
2
2
|
|
3
|
-
<%=
|
3
|
+
<%=scaffold_raw(scaffold_model_form('results', @scaffold_class.scaffold_fields(:search)) do |form|
|
4
4
|
form << "<table class='#{@scaffold_class.scaffold_table_class(:form)}'><tbody>"
|
5
5
|
form << "<tr><td><label for='null'>Null Fields</label>:</td><td><select name='null#{scaffold_param_list_suffix}' id='null' multiple='multiple'>#{@scaffold_class.scaffold_search_null_options.collect{|name, i| "<option value='#{i}'>#{name}</option>"}.join("\n")}</select></td></tr>\n"
|
6
6
|
form << "<tr><td><label for='notnull'>Not Null Fields</label>:</td><td><select name='notnull#{scaffold_param_list_suffix}' id='notnull' multiple='multiple'>#{@scaffold_class.scaffold_search_null_options.collect{|name, i| "<option value='#{i}'>#{name}</option>"}.join("\n")}</select></td></tr>\n"
|
7
7
|
form << '</tbody></table>'
|
8
8
|
@scaffold_submit_value = @scaffold_title
|
9
|
-
end
|
9
|
+
end)%>
|
10
10
|
|
11
|
-
<%= scaffold_manage_link %>
|
11
|
+
<%=scaffold_raw scaffold_manage_link %>
|
data/scaffolds/show.rhtml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
<% @scaffold_title = "Showing #{@scaffold_options[:singular_lc_human_name]}" %>
|
2
2
|
<% if '' != (edit_link = scaffold_check_link('Edit', true, "edit_#{@scaffold_options[:singular_name]}", :id=>@scaffold_object.scaffold_id)) %>
|
3
|
-
<h2><%= edit_link %></h2>
|
3
|
+
<h2><%=scaffold_raw edit_link %></h2>
|
4
4
|
<% end %>
|
5
5
|
|
6
6
|
<table id="scaffolded" class="<%= @scaffold_class.scaffold_table_class(:show) %>">
|
@@ -14,6 +14,6 @@
|
|
14
14
|
<% end %>
|
15
15
|
</tbody></table>
|
16
16
|
|
17
|
-
<%= scaffold_association_links %>
|
17
|
+
<%=scaffold_raw scaffold_association_links %>
|
18
18
|
|
19
|
-
<%= scaffold_manage_link %>
|
19
|
+
<%=scaffold_raw scaffold_manage_link %>
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scaffolding_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 1.4.
|
9
|
+
- 4
|
10
|
+
version: 1.4.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jeremy Evans
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-10-13 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -71,8 +71,9 @@ files:
|
|
71
71
|
- contrib/scaffold_form_focus/README
|
72
72
|
- contrib/scaffold_form_focus/scaffold_form_focus.js
|
73
73
|
- contrib/scaffold_jquery_autocomplete/README
|
74
|
-
- contrib/scaffold_jquery_autocomplete/
|
75
|
-
- contrib/scaffold_jquery_autocomplete/jquery.
|
74
|
+
- contrib/scaffold_jquery_autocomplete/indicator.gif
|
75
|
+
- contrib/scaffold_jquery_autocomplete/jquery.autocomplete.css
|
76
|
+
- contrib/scaffold_jquery_autocomplete/jquery.autocomplete.js
|
76
77
|
- scaffolds/show.rhtml
|
77
78
|
- scaffolds/habtm.rhtml
|
78
79
|
- scaffolds/index.rhtml
|
@@ -1,22 +0,0 @@
|
|
1
|
-
ul.se_autocomplete {
|
2
|
-
position: absolute;
|
3
|
-
overflow: hidden;
|
4
|
-
background-color: #fff;
|
5
|
-
border: 1px solid #aaa;
|
6
|
-
margin: 0px;
|
7
|
-
padding: 0;
|
8
|
-
list-style: none;
|
9
|
-
font: normal .75em/.75em Verdana, Arial, sans-serif;
|
10
|
-
color: #333;
|
11
|
-
}
|
12
|
-
ul.se_autocomplete li {
|
13
|
-
display: block;
|
14
|
-
padding: .3em .5em .3em .3em;
|
15
|
-
overflow: hidden;
|
16
|
-
width: 100%;
|
17
|
-
}
|
18
|
-
|
19
|
-
ul.se_autocomplete li.active {
|
20
|
-
background-color: #3875d7;
|
21
|
-
color: #fff;
|
22
|
-
}
|
@@ -1,121 +0,0 @@
|
|
1
|
-
/* Copyright 2007 Yehuda Katz, Rein Henrichs
|
2
|
-
* Copyright 2008 Jeremy Evans
|
3
|
-
*/
|
4
|
-
|
5
|
-
(function($) {
|
6
|
-
|
7
|
-
$.ui = $.ui || {}; $.ui.autocomplete = $.ui.autocomplete || {}; var active;
|
8
|
-
|
9
|
-
$.fn.autocompleteMode = function(container, input, size, opt) {
|
10
|
-
var original = input.val(); var selected = -1; var self = this;
|
11
|
-
|
12
|
-
$.data(document.body, "autocompleteMode", true);
|
13
|
-
|
14
|
-
$("body").one("cancel.autocomplete", function() {
|
15
|
-
input.trigger("cancel.autocomplete"); $("body").trigger("off.autocomplete"); input.val(original);
|
16
|
-
});
|
17
|
-
|
18
|
-
$("body").one("activate.autocomplete", function() {
|
19
|
-
input.trigger("activate.autocomplete", [$(active[0]).html()]); $("body").trigger("off.autocomplete");
|
20
|
-
});
|
21
|
-
|
22
|
-
$("body").one("off.autocomplete", function(e, reset) {
|
23
|
-
container.remove();
|
24
|
-
$.data(document.body, "autocompleteMode", false);
|
25
|
-
input.unbind("keydown.autocomplete");
|
26
|
-
$("body").add(window).unbind("click.autocomplete").unbind("cancel.autocomplete").unbind("activate.autocomplete");
|
27
|
-
});
|
28
|
-
|
29
|
-
// If a click bubbles all the way up to the window, close the autocomplete
|
30
|
-
$(window).bind("click.autocomplete", function() { $("body").trigger("cancel.autocomplete"); });
|
31
|
-
|
32
|
-
var select = function() {
|
33
|
-
active = $("> *", container).removeClass("active").slice(selected, selected + 1).addClass("active");
|
34
|
-
input.trigger("itemSelected.autocomplete", [$(active[0]).html()]);
|
35
|
-
input.val($(active[0]).html());
|
36
|
-
};
|
37
|
-
|
38
|
-
container.mouseover(function(e) {
|
39
|
-
// If you hover over the container, but not its children, return
|
40
|
-
if(e.target == container[0]) return;
|
41
|
-
// Set the selected item to the item hovered over and make it active
|
42
|
-
selected = $("> *", container).index($(e.target).is('li') ? $(e.target)[0] : $(e.target).parents('li')[0]); select();
|
43
|
-
}).bind("click.autocomplete", function(e) {
|
44
|
-
$("body").trigger("activate.autocomplete"); $.data(document.body, "suppressKey", false);
|
45
|
-
});
|
46
|
-
|
47
|
-
input
|
48
|
-
.bind("keydown.autocomplete", function(e) {
|
49
|
-
if(e.which == 27) { $("body").trigger("cancel.autocomplete"); }
|
50
|
-
else if(e.which == 13) { $("body").trigger("activate.autocomplete"); }
|
51
|
-
else if(e.which == 40 || e.which == 9 || e.which == 38) {
|
52
|
-
switch(e.which) {
|
53
|
-
case 40:
|
54
|
-
case 9:
|
55
|
-
selected = selected >= size - 1 ? 0 : selected + 1; break;
|
56
|
-
case 38:
|
57
|
-
selected = selected <= 0 ? size - 1 : selected - 1; break;
|
58
|
-
default: break;
|
59
|
-
}
|
60
|
-
select();
|
61
|
-
} else { return true; }
|
62
|
-
$.data(document.body, "suppressKey", true);
|
63
|
-
});
|
64
|
-
};
|
65
|
-
|
66
|
-
$.fn.autocomplete = function(opt) {
|
67
|
-
var ajax = opt.ajax;
|
68
|
-
var association = opt.association
|
69
|
-
opt = $.extend({}, {
|
70
|
-
timeout: 1000,
|
71
|
-
getList: function(input) {
|
72
|
-
params = "id=" + input.val()
|
73
|
-
if(association) {
|
74
|
-
params += '&association=' + association
|
75
|
-
}
|
76
|
-
$.get(ajax, params, function(html) { input.trigger("updateList", [html]); });
|
77
|
-
}
|
78
|
-
}, opt);
|
79
|
-
|
80
|
-
return this.each(function() {
|
81
|
-
|
82
|
-
$(this)
|
83
|
-
.keypress(function(e) {
|
84
|
-
var typingTimeout = $.data(this, "typingTimeout");
|
85
|
-
if(typingTimeout) window.clearInterval(typingTimeout);
|
86
|
-
|
87
|
-
if($.data(document.body, "suppressKey"))
|
88
|
-
return $.data(document.body, "suppressKey", false);
|
89
|
-
else if($.data(document.body, "autocompleteMode") && e.charCode < 32 && e.keyCode != 8 && e.keyCode != 46) return false;
|
90
|
-
else {
|
91
|
-
$.data(this, "typingTimeout", window.setTimeout(function() {
|
92
|
-
$(e.target).trigger("autocomplete");
|
93
|
-
}, opt.timeout));
|
94
|
-
}
|
95
|
-
})
|
96
|
-
.bind("autocomplete", function() {
|
97
|
-
var self = $(this);
|
98
|
-
|
99
|
-
self.one("updateList", function(e, list) {
|
100
|
-
$("body").trigger("off.autocomplete");
|
101
|
-
|
102
|
-
list = $(list);
|
103
|
-
var length = list.children().length;
|
104
|
-
if(!length) return false;
|
105
|
-
|
106
|
-
list.addClass('se_autocomplete');
|
107
|
-
|
108
|
-
var offset = self.offset();
|
109
|
-
|
110
|
-
list.css({top: offset.top + self.outerHeight(), left: offset.left, width: self.width()}).appendTo("body");
|
111
|
-
|
112
|
-
$("body").autocompleteMode(list, self, length, opt);
|
113
|
-
});
|
114
|
-
|
115
|
-
opt.getList(self);
|
116
|
-
});
|
117
|
-
|
118
|
-
});
|
119
|
-
};
|
120
|
-
|
121
|
-
})(jQuery);
|