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 CHANGED
@@ -21,19 +21,19 @@ to better suit your needs.
21
21
  Scaffolding Extensions currently supports:
22
22
 
23
23
  * Web Frameworks
24
- * Rails 2.3.8 (with or without RailsXss plugin)
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 2.3.8
32
- * Sequel 3.14.0
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.3
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 jq-autocomplete
3
- [1]. It also requires the Dimensions JQuery plugin [2]. To use this plugin,
4
- add the include the css file as a stylesheet and the js file as a script (in
5
- addition to JQuery and the Dimensions plugin).
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://plugins.jquery.com/project/jq-autocomplete
8
- [2] http://plugins.jquery.com/project/dimensions
7
+ [1] http://docs.jquery.com/Plugins/autocomplete
@@ -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&&currentValue==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 active_layout || render_options.include?(:layout)
53
- render({:file=>scaffold_path(action), :layout=>active_layout}.merge(render_options))
57
+ if render_options.include?(:layout) || _default_layout
58
+ render({:file=>scaffold_path(action)}.merge(render_options))
54
59
  else
55
- @content = render_to_string({:file=>scaffold_path(action)}.merge(render_options))
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
- mod = ScaffoldingExtensions::Helper.clone
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){eval(data);}); return false;\">\n#{scaffold_token_tag}\n"
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({ajax:'#{scaffold_url("scaffold_auto_complete_for_#{model_name}")}'#{", association:'#{association}'" if association}});")
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
- @items = klass.scaffold_auto_complete_find(scaffold_request_id.to_s, :association=>(association.to_sym if scaffold_request_param(:association)), :session=>scaffold_session)
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 %>
@@ -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 %>
@@ -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 %>
@@ -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') %>
@@ -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 %>
@@ -1,11 +1,11 @@
1
1
  <% @scaffold_title = "Search #{@scaffold_options[:plural_lc_human_name]}" %>
2
2
 
3
- <%= scaffold_model_form('results', @scaffold_class.scaffold_fields(:search)) do |form|
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: 1
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 4
9
- - 3
10
- version: 1.4.3
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-08-26 00:00:00 -07:00
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/jquery.ui.se_autocomplete.css
75
- - contrib/scaffold_jquery_autocomplete/jquery.ui.se_autocomplete.js
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);