Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 16 additions & 5 deletions lib/data-table/table.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ class Table
attr_reader :collection, :grouped_data, :subtotals, :totals,
:subtotal_calculations, :total_calculations, :columns

attr_accessor :id, :title, :css_class, :empty_text,
attr_accessor :id, :css_class, :empty_text,
:title, :title_class, :subtitle, :subtitle_class, :title_separator_class,
:alternate_rows, :alternate_cols, :display_header, :hide_if_empty,
:repeat_headers_for_groups, :custom_headers

Expand All @@ -41,7 +42,10 @@ def initialize(collection)
def default_options!
@id = ''
@title = ''
@subtitle = ''
@title_class = nil
@subtitle = nil
@subtitle_class = nil
@title_separator_class = nil
@css_class = ''
@empty_text = 'No records found'
@hide_if_empty = false
Expand Down Expand Up @@ -76,7 +80,14 @@ def render

def render_data_table
html = "<table id='#{@id}' class='data_table #{@css_class}' cellspacing='0' cellpadding='0'>"
html << "<caption>#{@title}</caption>" if @title
html << '<caption>'
if @title || @subtitle
html << "<span class='#{@title_class}'>#{@title}</span>" if @title
html << "<span class='#{@title_separator_class}'></span>" if @title && @subtitle
html << "<span class='#{@subtitle_class}'>#{@subtitle}</span>" if @subtitle
end
html << '</caption>'
Comment thread
henrythach marked this conversation as resolved.

html << render_data_table_header if @display_header
if @collection.any?
html << render_data_table_body(@collection)
Expand Down Expand Up @@ -254,7 +265,7 @@ def render_totals
html = '<tfoot>'
@total_calculations.each_with_index do |totals_row, index|
next if totals_row.nil?

html << "<tr class='total index_#{index}'>"
@columns.each do |col|
value = totals_row[col.name] ||= nil
Expand Down Expand Up @@ -291,7 +302,7 @@ def render_subtotals(group_header, _group_data = nil, ancestors = nil)

@subtotal_calculations[path].each_with_index do |group, index|
next if group.empty?

html << "<tr class='subtotal index_#{index} #{'first' if is_first_subtotal}'>"
@columns.each do |col|
value = group[col.name] ? group[col.name].values[0] : nil
Expand Down
2 changes: 1 addition & 1 deletion lib/data-table/version.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module DataTable
VERSION = '2.0.3'.freeze
VERSION = '2.0.4'.freeze
end
2 changes: 1 addition & 1 deletion spec/data_table_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@
t.column :class, 'Class'
end

expect(html).to eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr><th class='name ' >Name</th><th class='class ' >Class</th></tr></thead><tbody><tr class='row_0 ' ><td class='name text' >Luke Skywalker</td><td class='class text' >Jedi Knight</td></tr><tr class='row_1 alt ' ><td class='name text' >Emporer Palpatine</td><td class='class text' >Sith Lord</td></tr><tr class='row_2 ' ><td class='name text' >Mithrander</td><td class='class text' >Wizard</td></tr><tr class='row_3 alt ' ><td class='name text' >Aragorn</td><td class='class text' >Ranger</td></tr></tbody></table>})
expect(html).to eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption><span class=''></span></caption><thead><tr><th class='name ' >Name</th><th class='class ' >Class</th></tr></thead><tbody><tr class='row_0 ' ><td class='name text' >Luke Skywalker</td><td class='class text' >Jedi Knight</td></tr><tr class='row_1 alt ' ><td class='name text' >Emporer Palpatine</td><td class='class text' >Sith Lord</td></tr><tr class='row_2 ' ><td class='name text' >Mithrander</td><td class='class text' >Wizard</td></tr><tr class='row_3 alt ' ><td class='name text' >Aragorn</td><td class='class text' >Ranger</td></tr></tbody></table>})
end
end
65 changes: 59 additions & 6 deletions spec/table_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
data_table.column(:name, 'Name')
data_table.column(:class, 'Class')
expect(data_table.render).to \
eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr><th class='name ' >Name</th><th class='class ' >Class</th></tr></thead><tbody><tr class='row_0 ' ><td class='name text' >Luke Skywalker</td><td class='class text' >Jedi Knight</td></tr><tr class='row_1 alt ' ><td class='name text' >Emporer Palpatine</td><td class='class text' >Sith Lord</td></tr><tr class='row_2 ' ><td class='name text' >Mithrander</td><td class='class text' >Wizard</td></tr><tr class='row_3 alt ' ><td class='name text' >Aragorn</td><td class='class text' >Ranger</td></tr></tbody></table>})
eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption><span class=''></span></caption><thead><tr><th class='name ' >Name</th><th class='class ' >Class</th></tr></thead><tbody><tr class='row_0 ' ><td class='name text' >Luke Skywalker</td><td class='class text' >Jedi Knight</td></tr><tr class='row_1 alt ' ><td class='name text' >Emporer Palpatine</td><td class='class text' >Sith Lord</td></tr><tr class='row_2 ' ><td class='name text' >Mithrander</td><td class='class text' >Wizard</td></tr><tr class='row_3 alt ' ><td class='name text' >Aragorn</td><td class='class text' >Ranger</td></tr></tbody></table>})
end

it "should group the records" do
Expand All @@ -35,7 +35,7 @@
expect(data_table.grouped_data).to be true
data_table.prepare_data
expect(data_table.collection).to eq(collection.group_by {|g| g[grouping_column]})
expect(data_table.render).to eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr><th class='name ' >Name</th><th class='class ' >Class</th></tr></thead><tbody class='star_wars'><tr class='group_header level_0'><th colspan='2'>Star Wars</th></tr><tr class='row_0 ' ><td class='name text' >Luke Skywalker</td><td class='class text' >Jedi Knight</td></tr><tr class='row_1 alt ' ><td class='name text' >Emporer Palpatine</td><td class='class text' >Sith Lord</td></tr></tbody><tbody class='middle_earth'><tr class='group_header level_0'><th colspan='2'>Middle Earth</th></tr><tr class='row_0 ' ><td class='name text' >Mithrander</td><td class='class text' >Wizard</td></tr><tr class='row_1 alt ' ><td class='name text' >Aragorn</td><td class='class text' >Ranger</td></tr></tbody></table>})
expect(data_table.render).to eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption><span class=''></span></caption><thead><tr><th class='name ' >Name</th><th class='class ' >Class</th></tr></thead><tbody class='star_wars'><tr class='group_header level_0'><th colspan='2'>Star Wars</th></tr><tr class='row_0 ' ><td class='name text' >Luke Skywalker</td><td class='class text' >Jedi Knight</td></tr><tr class='row_1 alt ' ><td class='name text' >Emporer Palpatine</td><td class='class text' >Sith Lord</td></tr></tbody><tbody class='middle_earth'><tr class='group_header level_0'><th colspan='2'>Middle Earth</th></tr><tr class='row_0 ' ><td class='name text' >Mithrander</td><td class='class text' >Wizard</td></tr><tr class='row_1 alt ' ><td class='name text' >Aragorn</td><td class='class text' >Ranger</td></tr></tbody></table>})
end

it "should do totaling" do
Expand Down Expand Up @@ -111,7 +111,7 @@

# note how the rows are index_1, and there is no index_0 row
expect(data_table.render).to \
eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr><th class='power_level ' ></th></tr></thead><tbody class='star_wars'><tr class='group_header level_0'><th colspan='1'>Star Wars</th></tr><tr class='row_0 ' ><td class='power_level numeric' >50</td></tr><tr class='row_1 alt ' ><td class='power_level numeric' >95</td></tr><tr class='subtotal index_1 first'><td class='power_level numeric' >Star Wars</td></tr></tbody><tbody class='middle_earth'><tr class='group_header level_0'><th colspan='1'>Middle Earth</th></tr><tr class='row_0 ' ><td class='power_level numeric' >9001</td></tr><tr class='row_1 alt ' ><td class='power_level numeric' >80</td></tr><tr class='subtotal index_1 first'><td class='power_level numeric' >Middle Earth</td></tr></tbody></table>})
eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption><span class=''></span></caption><thead><tr><th class='power_level ' ></th></tr></thead><tbody class='star_wars'><tr class='group_header level_0'><th colspan='1'>Star Wars</th></tr><tr class='row_0 ' ><td class='power_level numeric' >50</td></tr><tr class='row_1 alt ' ><td class='power_level numeric' >95</td></tr><tr class='subtotal index_1 first'><td class='power_level numeric' >Star Wars</td></tr></tbody><tbody class='middle_earth'><tr class='group_header level_0'><th colspan='1'>Middle Earth</th></tr><tr class='row_0 ' ><td class='power_level numeric' >9001</td></tr><tr class='row_1 alt ' ><td class='power_level numeric' >80</td></tr><tr class='subtotal index_1 first'><td class='power_level numeric' >Middle Earth</td></tr></tbody></table>})
end

it "should render a custom header" do
Expand All @@ -129,14 +129,14 @@

it "should render a table with the 'no records' message" do
expect(data_table.render).to \
eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr></tr></thead><tr><td class='empty_data_table' colspan='0'>No records found</td></tr></table>})
eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption><span class=''></span></caption><thead><tr></tr></thead><tr><td class='empty_data_table' colspan='0'>No records found</td></tr></table>})
end

it "should render a custom empty text notice" do
text = "Nothing to see here"
data_table.empty_text = text
expect(data_table.render).to \
eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr></tr></thead><tr><td class='empty_data_table' colspan='0'>#{text}</td></tr></table>})
eq(%{<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption><span class=''></span></caption><thead><tr></tr></thead><tr><td class='empty_data_table' colspan='0'>#{text}</td></tr></table>})
end

it "avoids dividing by zero" do
Expand Down Expand Up @@ -274,8 +274,61 @@
t.column :_empty_space, ''
end

expected_html = %(<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption></caption><thead><tr><th class='__subtotal_header__ ' style='width: 30px'>&nbsp;</th><th class='points data-type-4' style='width: 3.45'>Points</th><th class='_empty_space ' ></th></tr></thead><tbody class='basketball'><tr class='group_header level_0'><th colspan='3'>Basketball</th></tr><tr class='group_header level_1'><th colspan='3'>9</th></tr><tr class='row_0 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >50</td><td class='_empty_space nilclass' ></td></tr><tr class='row_1 alt ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >51</td><td class='_empty_space nilclass' ></td></tr><tr class='subtotal index_1 first'><td class='__subtotal_header__ nilclass' >9: AVG</td><td class='points numeric data-type-4' >50.5</td><td class='_empty_space nilclass' ></td></tr><tr class='group_header level_1'><th colspan='3'>10</th></tr><tr class='row_0 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >52</td><td class='_empty_space nilclass' ></td></tr><tr class='row_1 alt ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >53</td><td class='_empty_space nilclass' ></td></tr><tr class='row_2 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >54</td><td class='_empty_space nilclass' ></td></tr><tr class='subtotal index_1 first'><td class='__subtotal_header__ nilclass' >10: AVG</td><td class='points numeric data-type-4' >53.0</td><td class='_empty_space nilclass' ></td></tr><tr class='group_header level_1'><th colspan='3'>12</th></tr><tr class='row_0 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >55</td><td class='_empty_space nilclass' ></td></tr><tr class='subtotal index_1 first'><td class='__subtotal_header__ nilclass' >12: AVG</td><td class='points numeric data-type-4' >55.0</td><td class='_empty_space nilclass' ></td></tr><tr class='parent_subtotal index_1 basketball'><td class='__subtotal_header__ nilclass' >Basketball: AVG</td><td class='points numeric data-type-4' >52.5</td><td class='_empty_space nilclass' ></td></tr></tbody></table>)
expected_html = %(<table id='' class='data_table ' cellspacing='0' cellpadding='0'><caption><span class=''></span></caption><thead><tr><th class='__subtotal_header__ ' style='width: 30px'>&nbsp;</th><th class='points data-type-4' style='width: 3.45'>Points</th><th class='_empty_space ' ></th></tr></thead><tbody class='basketball'><tr class='group_header level_0'><th colspan='3'>Basketball</th></tr><tr class='group_header level_1'><th colspan='3'>9</th></tr><tr class='row_0 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >50</td><td class='_empty_space nilclass' ></td></tr><tr class='row_1 alt ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >51</td><td class='_empty_space nilclass' ></td></tr><tr class='subtotal index_1 first'><td class='__subtotal_header__ nilclass' >9: AVG</td><td class='points numeric data-type-4' >50.5</td><td class='_empty_space nilclass' ></td></tr><tr class='group_header level_1'><th colspan='3'>10</th></tr><tr class='row_0 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >52</td><td class='_empty_space nilclass' ></td></tr><tr class='row_1 alt ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >53</td><td class='_empty_space nilclass' ></td></tr><tr class='row_2 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >54</td><td class='_empty_space nilclass' ></td></tr><tr class='subtotal index_1 first'><td class='__subtotal_header__ nilclass' >10: AVG</td><td class='points numeric data-type-4' >53.0</td><td class='_empty_space nilclass' ></td></tr><tr class='group_header level_1'><th colspan='3'>12</th></tr><tr class='row_0 ' ><td class='__subtotal_header__ nilclass' >&nbsp;</td><td class='points numeric data-type-4' >55</td><td class='_empty_space nilclass' ></td></tr><tr class='subtotal index_1 first'><td class='__subtotal_header__ nilclass' >12: AVG</td><td class='points numeric data-type-4' >55.0</td><td class='_empty_space nilclass' ></td></tr><tr class='parent_subtotal index_1 basketball'><td class='__subtotal_header__ nilclass' >Basketball: AVG</td><td class='points numeric data-type-4' >52.5</td><td class='_empty_space nilclass' ></td></tr></tbody></table>)
expect(html).to eq(expected_html)
end
end

describe 'title rendering' do
let(:table) { DataTable::Table.new([]) }
let(:html) { table.render }
before(:each) do
table.title = 'My Table Title'
end
before(:each, include_subtitle: true) do
table.subtitle = 'My Subtitle'
end

context 'with a title and no subtitle' do
it 'renders the title' do
expect(html).to include("<span class=''>My Table Title</span>")
end

it 'includes the css class for the title' do
table.title_class = 'custom_title_class'
expect(html).to include("<span class='custom_title_class'>My Table Title</span>")
end
end

context 'with a subtitle', :include_subtitle do
before(:each) do
table.subtitle = 'My Subtitle'
end

it 'renders the subtitle' do
expect(html).to include("<span class=''></span>")
expect(html).to include("<span class=''></span>")
expect(html).to include("<span class=''>My Subtitle</span>")
end

it 'includes the css class for the subtitle' do
table.subtitle_class = 'custom_subtitle_class'
expect(html).to include("<span class='custom_subtitle_class'>My Subtitle</span>")
end
end

context 'with css classes', :include_subtitle do
before(:each) do
table.title_class = 'custom_title_class'
table.title_separator_class = 'custom_separator_class'
table.subtitle_class = 'custom_subtitle_class'
end

it 'renders the subtitle' do
expect(html).to include("<span class='custom_title_class'>My Table Title</span>")
expect(html).to include("<span class='custom_separator_class'></span>")
expect(html).to include("<span class='custom_subtitle_class'>My Subtitle</span>")
end
end
end
end
Loading