2010年6月18日金曜日

activescaffold の subgroup をタブ化してみる(期待しないで)

あんましオススメできないかもしれないけど、一応、力入れて改造したのを、お披露目です。
activescaffold にて、全てのカラムが add_subgroup されている場合には、タブページのレイアウトにするというものです。jquery を使っているので、要注意です。 subgroup 名が 'main' の場合に限り、タブから脱出させて常に表示するよう配慮しました。

application.html.erb にて

<%= stylesheet_link_tag 'jquery-ui-1.8.1.custom', :media => 'all' %>
<%= javascript_include_tag "jquery-1.4.2.min.js" %>
<script type="text/javascript">
jQuery.noConflict();
var j$ = jQuery;
</script>
<%= javascript_include_tag "jquery-ui-1.8.1.custom.min.js" %>



lib/active_scaffold/helpers/id_helper.rb
追加

def tab_form_id(options = {})
options[:action] ||= params[:action]
options[:id] ||= params[:id]
options[:id] ||= params[:parent_id]
clean_id "#{controller_id}-#{options[:action]}-#{options[:id]}-tabform"
end

def tab_form_panel_id(column,options = {})
options[:action] ||= params[:action]
options[:id] ||= params[:id]
options[:id] ||= params[:parent_id]
clean_id "#{controller_id}-#{options[:action]}-#{options[:id]}-#{column.label}-tabform"
end



lib/active_scaffold/helpers/form_column_helper.rb

def override_tab_form_partial?(column)
path, partial_name = partial_pieces(override_tab_form_partial(column))
template_exists?(File.join(path, "_#{partial_name}"), true)
end

# the naming convention for overriding tab form with partials
def override_tab_form_partial(column)
"#{column.label}_tab_form"
end

def tab_form_partial_for_column(column)
if override_tab_form_partial?(column)
override_tab_form_partial(column)
else
"tab_form"
end
end



従来の_form.html.erb が _tab_form.html.erb になります。
frontends/default/views/_form.html.erb

<%
# 全ての column が、add_subgroup されているかどうかで、処理を切り替える
is_tabbed = true
columns.each :for => @record do |column|
if not is_subsection? column
is_tabbed = false;
break;
end
end
-%>
<% if is_tabbed -%>
<% columns.each :for => @record do |column| -%>
<% if column.label == 'main' %>
<div class="tab-form" id="<%= tab_form_panel_id(column) %>">
<% if !override_tab_form_partial?(column) -%>
<%= render :partial => 'tab_form', :locals => { :columns => column } %>
<% end -%>
</div>
<br clear="all" />
<% end -%>
<% end -%>
<script type="text/javascript">
j$(function(){
j$("#<%= tab_form_id %>").tabs();
});
</script>
<div id="<%= tab_form_id %>" class="form" <%= 'style="display: none;"' if columns.collapsed -%>>
<ul>
<% columns.each :for => @record do |column| -%>
<% if column.label != 'main' -%>
<li class="tab-form"><a href="#<%= tab_form_panel_id(column) %>"><%= t column.label %></a></li>
<% end -%>
<% end -%>
</ul>
<% columns.each :for => @record do |column| -%>
<% if column.label != 'main' -%>
<div class="tab-form" id="<%= tab_form_panel_id(column) %>">
<%= render :partial => tab_form_partial_for_column(column), :locals => { :columns => column } %>
</div>
<% end -%>
<% end -%>
</div>
<% else -%>
<%= render :partial => 'tab_form', :locals => { :columns => columns } %>
<% end -%>



frontends/default/views/_tab_form.html.erb

<ol class="form" <%= 'style="display: none;"' if columns.collapsed -%>>
<% columns.each :for => @record do |column| -%>
<% if is_subsection? column -%>
<li class="sub-section">
<h5><%= column.label %> (<%= link_to_visibility_toggle(:default_visible => !column.collapsed) -%>)</h5>
<%= render :partial => 'form', :locals => { :columns => column } %>
</li>
<% elsif is_subform? column and !override_form_field?(column) -%>
<li class="sub-form <%= active_scaffold_config_for(column.association.klass).subform.layout %>-sub-form <%= column.css_class unless column.css_class.nil? %>" id="<%= sub_form_id(:association => column.name) %>">
<%= render :partial => form_partial_for_column(column), :locals => { :column => column } -%>
</li>
<% else -%>
<li class="form-element <%= 'required' if column.required? %> <%= column.css_class unless column.css_class.nil? %>">
<%= render :partial => form_partial_for_column(column), :locals => { :column => column } -%>
</li>
<% end -%>
<% end -%>
</ol>


 ちょい実装してから、時間が経過しているので、ここにポストした改造箇所が足りてるかどうか不安…。あんまし期待しないで…。
 他にも、Java の absolute layout よろしく <table> レイアウトで、各 column のプロパティから、レイアウトを決定するような改造もしてみたのだけれども…。これもどうなのかな…?

0 件のコメント: