1
0

Move quantity header generation to helper

This commit is contained in:
cryptogopher 2021-05-08 15:29:24 +02:00
parent 7b2b855d56
commit 847975b36d
3 changed files with 49 additions and 63 deletions

View File

@ -58,7 +58,7 @@ module BodyTrackersHelper
end
end
def quantities_table_header(quantities)
def quantities_table_header(quantities, *fields)
# spec: table of rows (tr), where each row is a hash of cells (td) (hash keeps items
# ordered the way they were added). Hash values determine cell property:
# * int > 0 - quantity name-labelled cell with 'int' size colspan
@ -91,6 +91,47 @@ module BodyTrackersHelper
single_columns.each { |q| row.delete(q) }
end
spec
total_width = fields.length + quantities.length + 1
table_rows = []
spec.zip(spec[1..-1]).collect do |row, next_row|
table_headers = []
table_headers << fields.collect do |field|
tag.th(rowspan: spec.length, style: "width: #{100/total_width}%") { l(field) }
end if row == spec.first
row.each do |q, span|
row_attrs = {class: []}
row_attrs[:class] << 'interim' if (row != spec.last) && (span >= 0)
row_attrs[:class] << (span == 0 ? 'empty' : 'closable ellipsible')
row_attrs[:colspan] = span if span > 0
row_attrs[:rowspan] = -span if span < 0
row_attrs[:style] = "width: #{[span, 1].max * 100/total_width}%"
row_attrs[:title] = q.description
table_headers << tag.th(row_attrs) do
unless span == 0
button_class = ['icon']
if (row == spec.last) || next_row.has_key?(q) || (span < -1)
button_class << 'icon-close'
else
button_class << 'icon-bullet-closed'
end
button = tag.div(style: "float:right;position:relative;") do
link_to '', yield(q.id), {class: button_class, method: :post, remote: true}
end
button.html_safe + q.name
end
end
end
table_headers << tag.th(rowspan: spec.length, style: "width: #{100/total_width}%") do
l(:field_action)
end if row == spec.first
table_rows << tag.tr(class: 'header') { table_headers.join.html_safe }
end
tag.thead { table_rows.join.html_safe }
end
end

View File

@ -9,23 +9,9 @@
<%= error_messages_for *formulas %>
<table id="readouts" class="list odd-even">
<thead>
<tr>
<% total_width = 3 + @quantities.length %>
<th style="width:<%= 2 * 100/total_width%>%"><%= l(:field_taken_at_date) %></th>
<% @quantities.each do |q| %>
<th style="width:<%= 100/total_width %>%" class="closable ellipsible">
<div style="float:right;position:relative;">
<%= link_to '',
measurement_routine_toggle_exposure_path(@routine, quantity_id: q.id),
{class: "icon icon-close", method: :post, remote: true} %>
</div>
<%= q.name %>
</th>
<% end %>
<th style="width:<%= 100/total_width %>%"><%= l(:field_action) %></th>
</tr>
</thead>
<%= quantities_table_header @quantities, :field_taken_at_date do |quantity_id|
measurement_routine_toggle_exposure_path(@routine, quantity_id: quantity_id)
end %>
<tbody>
<% extra_quantities = @measurements.values.first.keys - @quantities %>

View File

@ -5,50 +5,9 @@
<%= error_messages_for *formulas %>
<table id="targets" class="list odd-even">
<thead>
<% total_width = 2 + @quantities.length %>
<% header = quantities_table_header(@quantities) %>
<% header.each_with_index do |row, i| %>
<tr class="header">
<% if i == 0 %>
<th rowspan="<%= header.length %>" style="width:<%= 100/total_width %>%">
<%= l(:field_effective_from) %>
</th>
<% end %>
<% row.each do |q, span| %>
<% row_classes = [] %>
<% row_classes << 'interim' if (i < header.length-1) && (span >= 0) %>
<% row_classes << (span == 0 ? 'empty' : 'closable ellipsible') %>
<th <%= raw "class=\"#{row_classes.join(' ')}\"" unless row_classes.empty? %>
<%= "colspan=#{span}" if span > 0 %>
<%= "rowspan=#{-span}" if span < 0 %>
style="width: <%= [span, 1].max * 100/total_width %>%;"
title="<%= q.description %>">
<% unless span == 0 %>
<div style="float:right;position:relative;">
<% button_classes = 'icon' %>
<% if (i == header.length-1) || header[i+1].has_key?(q) || (span < -1) %>
<% button_classes += ' icon-close' %>
<% else %>
<% button_classes += ' icon-bullet-closed' %>
<% end %>
<%= link_to '', goal_toggle_exposure_path(@goal, quantity_id: q.id),
{class: button_classes, method: :post, remote: true} %>
</div>
<%= q.name %>
<% end %>
</th>
<% end %>
<% if i == 0 %>
<th rowspan="<%= header.length %>" style="width:<%= 100/total_width %>%;">
<%= l(:field_action) %>
</th>
<% end %>
</tr>
<% end %>
</thead>
<%= quantities_table_header @quantities, :field_effective_from do |quantity_id|
goal_toggle_exposure_path(@goal, quantity_id: quantity_id)
end %>
<tbody>
<% @targets_by_date.each do |date, targets| %>