scaffolding_extensions 1.4.3 → 1.4.4
Sign up to get free protection for your applications and to get access to all the features.
- 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);
|