Modified: branches/discovery/app/controllers/application.rb (2471 => 2472)
--- branches/discovery/app/controllers/application.rb 2010-07-13 14:08:52 UTC (rev 2471)
+++ branches/discovery/app/controllers/application.rb 2010-07-14 15:32:51 UTC (rev 2472)
@@ -570,6 +570,67 @@
end
end
+ def calculate_filter(params, filter, user, filter_params, order_params, filter_query_params, ids)
+
+ # apply all the joins and conditions except for the current filter
+
+ joins = []
+ conditions = []
+
+ pivot_options[:filters].each do |other_filter|
+ if filter_list = params[other_filter[:query_option]]
+ conditions << comparison(other_filter[:id_column], filter_list) unless other_filter == filter
+ joins += other_filter[:joins] if other_filter[:joins]
+ end
+ end
+
+ joins += filter[:joins] if filter[:joins]
+ conditions << filter[:condition] if filter[:condition]
+
+ if params[:filter_query]
+ conditions << "(#{filter[:label_column]} LIKE '%#{escape_sql(params[:filter_query])}%')"
+
+ end
+
+ current = params[filter[:key]] ? params[filter[:key]].split(',') : []
+
+ objects = Authorization.authorised_index(Contribution,
+ :all,
+ :include_permissions => true,
+ :select => filter[:select],
+ :joins => joins.length.zero? ? nil : joins.uniq.map do |j| pivot_options[:joins][j] end.join(" "),
+ :conditions => conditions.length.zero? ? nil : conditions.join(" AND "),
+ :group => filter[:group],
+ :limit => 10,
+ :order => filter[:order],
+ :authorised_user => user).map do |object|
+
+ x = object
+ value = eval(filter[:value]).to_s
+ selected = current.include?(value)
+
+ if selected
+ new_selection = (current - [value]).uniq.join(',')
+ else
+ new_selection = (current + [value]).uniq.join(',')
+ end
+
+ new_selection = nil if new_selection.empty?
+
+ target_uri = content_path(filter_params.merge(order_params).merge(filter_query_params).merge(filter[:key] => new_selection, "page" => nil))
+
+ {
+ :object => object,
+ :value => value,
+ :label => "<div class='count'>" + eval("x.count") + "</div><div class='label'><span class='truncate'>" + eval(filter[:label]) + "</span></div>",
+ :uri => target_uri,
+ :selected => selected
+ }
+ end
+
+ [current, objects]
+ end
+
# determine joins, conditions and order for the main results
joins = []
@@ -629,63 +690,26 @@
end
filters.each do |filter|
+ filter[:current], filter[:objects] = calculate_filter(params, filter, user, filter_params, order_params, filter_query_params, nil)
+ puts "current = #{filter[:current].inspect}"
+ puts "objects = #{filter[:objects].inspect}"
+ end
- # apply all the joins and conditions except for the current filter
+ # produce the summary
- joins = []
- conditions = []
+ summary = ""
- pivot_options[:filters].each do |other_filter|
- if filter_list = params[other_filter[:query_option]]
- conditions << comparison(other_filter[:id_column], filter_list) unless other_filter == filter
- joins += other_filter[:joins] if other_filter[:joins]
- end
+ filters.select do |filter|
+ if params[filter[:query_option]]
+ summary << '<span class="filter-in-use"><a href="" +
+ url_for(filter_params.merge(filter_query_params).merge(order_params).merge( { filter[:query_option] => nil } )) +
+ '">' + filter[:title].capitalize + ": " + params[filter[:query_option]] +
+ " <img src='' /></a></span> "
end
+ end
- joins += filter[:joins] if filter[:joins]
- conditions << filter[:condition] if filter[:condition]
-
- if params[:filter_query]
- conditions << "(#{filter[:label_column]} LIKE '%#{escape_sql(params[:filter_query])}%')"
-
- cancel_filter_query_url = request.query_parameters.merge( { "filter_query" => nil } )
- end
-
- filter[:current] = params[filter[:key]] ? params[filter[:key]].split(',') : []
-
- filter[:objects] = Authorization.authorised_index(Contribution,
- :all,
- :include_permissions => true,
- :select => filter[:select],
- :joins => joins.length.zero? ? nil : joins.uniq.map do |j| pivot_options[:joins][j] end.join(" "),
- :conditions => conditions.length.zero? ? nil : conditions.join(" AND "),
- :group => filter[:group],
- :limit => 10,
- :order => filter[:order],
- :authorised_user => user).map do |object|
-
- x = object
- value = eval(filter[:value]).to_s
- selected = filter[:current].include?(value)
-
- if selected
- new_selection = (filter[:current] - [value]).uniq.join(',')
- else
- new_selection = (filter[:current] + [value]).uniq.join(',')
- end
-
- new_selection = nil if new_selection.empty?
-
- target_uri = content_path(filter_params.merge(order_params).merge(filter_query_params).merge(filter[:key] => new_selection, "page" => nil))
-
- {
- :object => object,
- :value => value,
- :label => "<div class='pivot-count'>" + eval("x.count") + "</div><div class='pivot-label'><span class='truncate'>" + eval(filter[:label]) + "</span></div>",
- :uri => target_uri,
- :selected => selected
- }
- end
+ if params[:filter_query]
+ cancel_filter_query_url = request.query_parameters.merge( { "filter_query" => nil } )
end
# remove filters that do not help in narrowing down the result set
@@ -699,20 +723,6 @@
true
end
end
-
- # produce the summary
-
- summary = ""
-
- filters.select do |filter|
- if params[filter[:query_option]]
- summary << '<span class="filter-in-use"><a href="" +
- url_for(filter_params.merge(filter_query_params).merge(order_params).merge( { filter[:query_option] => nil } )) +
- '">' + filter[:title].capitalize + ": " + params[filter[:query_option]] +
- " <img src='' /></a></span> "
- end
- end
-
{
:results => results,
:filters => filters,
Modified: branches/discovery/app/views/content/_index.rhtml (2471 => 2472)
--- branches/discovery/app/views/content/_index.rhtml 2010-07-13 14:08:52 UTC (rev 2471)
+++ branches/discovery/app/views/content/_index.rhtml 2010-07-14 15:32:51 UTC (rev 2472)
@@ -1,57 +1,68 @@
-<%= render :partial => "layouts/paginate", :locals => { :collection => @pivot[:results], :sort_by => @pivot_options[:order] } %>
-
-<% if @pivot[:reset_filters_url] %>
- <div style="float: left; padding: 1em"><%= link_to("Reset filters", @pivot[:reset_filters_url]) -%></div>
-<% end %>
-
-<div style="clear: both"></div>
-
-<div>
-
- <form action="" url_for(request.query_parameters) -%>" method="GET">
- <input name="filter_query" value="<%= params[:filter_query] -%>" style="width: 100px" />
- <% @pivot[:filter_query_url].each do |key, value| %>
- <input name="<%= key -%>" type="hidden" value="<%= value.sub('"', '\\"') -%>" />
+<div class="pivot">
+ <div class="left">
+ <% if @pivot[:reset_filters_url] %>
+ <div class="reset_filters"><%= link_to("Reset filters", @pivot[:reset_filters_url]) -%></div>
<% end %>
-
- </form>
+ <div class="search_filters">
+ <form action="" url_for(request.query_parameters) -%>" method="GET">
+ <input name="filter_query" value="<%= params[:filter_query] -%>" style="width: 100px" />
+ <% @pivot[:filter_query_url].each do |key, value| %>
+ <input name="<%= key -%>" type="hidden" value="<%= value.sub('"', '\\"') -%>" />
+ <% end %>
+ </form>
- <div>
- <% if @pivot[:cancel_filter_query_url] %>
- <%= link_to("Cancel filter query", @pivot[:cancel_filter_query_url]) -%>
- <% end %>
+ <div>
+ <% if @pivot[:cancel_filter_query_url] %>
+ <%= link_to("Cancel filter query", @pivot[:cancel_filter_query_url]) -%>
+ <% end %>
+ </div>
+ </div>
+ <div class="filters">
+ <% @pivot[:filters].each do |filter| %>
+ <div class="category">Filter by <%= filter[:title] -%></div>
+ <div class="filter">
+ <div class="options">
+ <% filter[:objects].each do |object| %>
+ <div<%= object[:selected] ? ' class="selected"' : '' -%>>
+ <%= link_to(object[:label], object[:uri]) -%>
+ </div>
+ <% end %>
+ </div>
+ </div>
+ <% end %>
+ </div>
</div>
-
- <div class="pivot">
- <% @pivot[:filters].each do |filter| %>
- <div class="category">Filter by <%= filter[:title] -%></div>
-
- <div class="filter">
-
- <div class="options">
- <% filter[:objects].each do |object| %>
- <div<%= object[:selected] ? ' class="selected"' : '' -%>>
- <%= link_to(object[:label], object[:uri]) -%>
- </div>
- <% end %>
- </div>
+ <div class="main">
+ <div class="sort">
+ Sort by:
+ <select = this.options[this.selectedIndex].value;">
+ <% @pivot_options[:order].each do |args| %>
+ <option value="<%= url_for(request.query_parameters.merge("order" => args[:option])) -%>"
+ <% if params[:order] == args[:option] -%> selected="selected"<% end -%>><%= args[:label] -%></option>
+ <% end %>
+ </select>
+ </div>
+ <div>
+ <%= render :partial => "layouts/paginate", :locals => { :collection => @pivot[:results] } %>
+ </div>
+ <div class="summary">
+ <div class="result-count">
+ Showing <%= pluralize(@pivot[:results].size, 'result') -%>.
+ <% if @pivot[:reset_filters_url] %>
+ The following filters are in effect:
+ <% end %>
</div>
- <% end %>
+ <div class="crumbs"><%= @pivot[:summary] -%></div>
+ </div>
+ <div class="results">
+ <%= render :partial => "contributions/list", :locals => { :collection => @pivot[:results], :table => true } %>
+ </div>
+ <div>
+ <%= render :partial => "layouts/paginate", :locals => { :collection => @pivot[:results], :sort_by => @pivot_options[:order], :num_options => @pivot_options[:num_options] } %>
+ </div>
</div>
-
- <div class="pivot-summary">
- <div>Showing <%= @pivot[:results].size -%> results</div>
- <div class="pivot-filters-in-use"><%= @pivot[:summary] -%></div>
- </div>
-
- <%= render :partial => "contributions/list", :locals => { :collection => @pivot[:results], :table => true } %>
-
</div>
-<div style="clear: left"></div>
-
<%= _javascript__include_tag "ellipsis.js" %>
<script>truncate_spans()</script>
-<%= render :partial => "layouts/paginate", :locals => { :collection => @pivot[:results], :sort_by => @pivot_options[:order], :num_options => @pivot_options[:num_options] } %>
-
Modified: branches/discovery/app/views/workflows/_table.rhtml (2471 => 2472)
--- branches/discovery/app/views/workflows/_table.rhtml 2010-07-13 14:08:52 UTC (rev 2471)
+++ branches/discovery/app/views/workflows/_table.rhtml 2010-07-14 15:32:51 UTC (rev 2472)
@@ -72,7 +72,6 @@
<% desc_style = "font-size: 85%;" %>
-<% workflow.image = nil %>
<% unless workflow.image.nil? -%>
<p style="margin: 0; border: 0; width: 101px; float: left">
<%= link_to image_tag(url_for_file_column(workflow, "image", "thumb"), :class => 'framed_nospace'), workflow_path(workflow) %>
Modified: branches/discovery/public/stylesheets/styles.css (2471 => 2472)
--- branches/discovery/public/stylesheets/styles.css 2010-07-13 14:08:52 UTC (rev 2471)
+++ branches/discovery/public/stylesheets/styles.css 2010-07-14 15:32:51 UTC (rev 2472)
@@ -2033,15 +2033,43 @@
padding-top: 1em;
}
-/* pivot panel */
+/* pivot */
-DIV.pivot {
+.pivot {
+ width: 737px;
+ margin: 0;
+}
+
+.pivot .left {
+ width: 150px;
float: left;
- width: 150px;
- margin-right: 10px;
+ padding-right: 10px;
}
-DIV.pivot DIV.filter {
+.pivot .left > DIV {
+ margin-bottom: 0.5em;
+}
+
+.pivot .main {
+ margin-left: 160px;
+}
+
+.pivot .main > DIV {
+ margin-bottom: 0.5em;
+}
+
+.pivot .summary {
+ clear: right;
+ background: #f0f0f0;
+ border: 1px solid #d8d8d8;
+ padding: 4px;
+}
+
+.pivot .sort {
+ float: right;
+}
+
+.pivot .filter {
margin-bottom: 1em;
padding: 2px;
background: #f0f0f0;
@@ -2049,94 +2077,81 @@
-moz-border-radius: 6px;
}
-DIV.pivot DIV.category {
+.pivot .category {
padding: 0.2em;
font-size: 110%;
margin-bottom: 0.2em;
}
-DIV.pivot DIV.options > DIV {
+.pivot .options > DIV {
border: 1px solid transparent;
padding: 0.2em;
font-size: 90%;
padding-left: 0.2em;
}
-DIV.pivot DIV.options > DIV:first-child {
- border-top-left-radius: 6px;
- border-top-right-radius: 6px;
- -moz-border-radius-topleft: 6px;
- -moz-border-radius-topright: 6px;
-}
-
-DIV.pivot DIV.options > DIV:last-child {
- border-bottom-left-radius: 6px;
- border-bottom-right-radius: 6px;
- -moz-border-radius-bottomleft: 6px;
- -moz-border-radius-bottomright: 6px;
-}
-
-DIV.pivot DIV.options > DIV:hover {
+.pivot .options > DIV:hover {
background: #d0d0f0;
}
-DIV.pivot DIV.options > DIV.selected {
+.pivot .options > DIV.selected {
background: #ffe0c0;
}
-DIV.pivot DIV.options > DIV.selected:hover {
+.pivot .options > DIV.selected:hover {
background: #dfc0a0;
}
-DIV.pivot-summary {
- margin-left: 160px;
- background: #f0f0f0;
- border: 1px solid #d8d8d8;
- margin-bottom: 0.5em;
- padding: 0.2em;
+.pivot .options > DIV:first-child {
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ -moz-border-radius-topleft: 6px;
+ -moz-border-radius-topright: 6px;
}
-.pivot-title {
- font-size: 120%;
- text-align: center;
- margin-bottom: 1.0em;
+.pivot .options > DIV:last-child {
+ border-bottom-left-radius: 6px;
+ border-bottom-right-radius: 6px;
+ -moz-border-radius-bottomleft: 6px;
+ -moz-border-radius-bottomright: 6px;
}
-.pivot-label {
+.pivot .label {
width: 110px;
overflow: hidden;
}
-.pivot-count {
+.pivot .count {
float: right;
}
-DIV.pivot-filters-in-use {
- margin-top: 0.5em;
- width: 577px;
-}
-
-SPAN.filter-in-use {
+.pivot .filter-in-use {
background: #e0e0e0;
border: 1px solid #d0d0d0;
padding: 2px;
line-height: 180%;
}
-SPAN.filter-in-use A {
+.pivot .filter-in-use A {
text-decoration: none; /* no underline */
}
-SPAN.filter-in-use A IMG {
+.pivot .filter-in-use A IMG {
vertical-align: middle;
}
-SPAN.filter-in-use:hover {
+.pivot .filter-in-use:hover {
border: 1px solid #d0a0a0;
padding: 2px;
background: #f0d0d0;
}
+.pivot .pagination {
+ padding: 0px;
+ margin: 0px;
+ text-align: left;
+}
+
.truncate {
white-space: nowrap;
}