storefront 0.3.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. data/Rakefile +4 -4
  2. data/lib/storefront.rb +22 -35
  3. data/lib/storefront/components/base.rb +99 -0
  4. data/lib/storefront/components/breadcrumb.rb +7 -0
  5. data/lib/storefront/components/button.rb +37 -0
  6. data/lib/storefront/components/definition_list.rb +34 -0
  7. data/lib/storefront/components/definition_list_item.rb +63 -0
  8. data/lib/storefront/components/flash.rb +12 -0
  9. data/lib/storefront/components/footer.rb +19 -0
  10. data/lib/storefront/components/form.rb +82 -0
  11. data/lib/storefront/{form → components/form}/base.rb +3 -3
  12. data/lib/storefront/{form → components/form}/builder.rb +3 -3
  13. data/lib/storefront/{form → components/form}/errors.rb +1 -3
  14. data/lib/storefront/{form → components/form}/field.rb +1 -1
  15. data/lib/storefront/{form → components/form}/fieldset.rb +0 -0
  16. data/lib/storefront/{form → components/form}/hint.rb +0 -0
  17. data/lib/storefront/{form → components/form}/input.rb +7 -5
  18. data/lib/storefront/components/form/inputs.rb +7 -0
  19. data/lib/storefront/{form → components/form}/inputs/checkbox.rb +0 -0
  20. data/lib/storefront/{form → components/form}/inputs/date.rb +0 -0
  21. data/lib/storefront/{form → components/form}/inputs/file.rb +0 -0
  22. data/lib/storefront/{form → components/form}/inputs/hidden.rb +0 -0
  23. data/lib/storefront/{form → components/form}/inputs/radio.rb +0 -0
  24. data/lib/storefront/{form → components/form}/inputs/range.rb +0 -0
  25. data/lib/storefront/{form → components/form}/inputs/select.rb +6 -6
  26. data/lib/storefront/{form → components/form}/inputs/string.rb +0 -0
  27. data/lib/storefront/{form → components/form}/inputs/submit.rb +0 -0
  28. data/lib/storefront/{form → components/form}/inputs/textarea.rb +0 -0
  29. data/lib/storefront/{form → components/form}/inputs/value.rb +0 -0
  30. data/lib/storefront/{form → components/form}/label.rb +1 -1
  31. data/lib/storefront/components/header.rb +73 -0
  32. data/lib/storefront/components/image.rb +12 -0
  33. data/lib/storefront/components/javascript_template.rb +21 -0
  34. data/lib/storefront/components/list.rb +27 -0
  35. data/lib/storefront/components/menu.rb +41 -0
  36. data/lib/storefront/components/nav.rb +78 -0
  37. data/lib/storefront/components/sidebar.rb +23 -0
  38. data/lib/storefront/components/table.rb +232 -0
  39. data/lib/storefront/components/text.rb +29 -0
  40. data/lib/storefront/configuration.rb +53 -5
  41. data/lib/storefront/helpers/cache_helper.rb +37 -19
  42. data/lib/storefront/helpers/component_helper.rb +80 -41
  43. data/lib/storefront/helpers/content_helper.rb +211 -0
  44. data/lib/storefront/helpers/dom_helper.rb +136 -0
  45. data/lib/storefront/helpers/head_helper.rb +277 -205
  46. data/lib/storefront/helpers/model_helper.rb +21 -0
  47. data/lib/storefront/helpers/request_helper.rb +301 -53
  48. data/lib/storefront/helpers/tag_helper.rb +29 -0
  49. data/lib/storefront/{proxies/attribute_proxy.rb → models/attribute.rb} +1 -1
  50. data/lib/storefront/{proxies/model_proxy.rb → models/model.rb} +4 -6
  51. data/lib/storefront/railtie.rb +3 -16
  52. metadata +48 -64
  53. data/lib/storefront/dashboard.rb +0 -185
  54. data/lib/storefront/form.rb +0 -82
  55. data/lib/storefront/helpers/attribute_helper.rb +0 -81
  56. data/lib/storefront/helpers/body_helper.rb +0 -18
  57. data/lib/storefront/helpers/browser_helper.rb +0 -54
  58. data/lib/storefront/helpers/collection_helper.rb +0 -14
  59. data/lib/storefront/helpers/dashboard_helper.rb +0 -29
  60. data/lib/storefront/helpers/debug_helper.rb +0 -11
  61. data/lib/storefront/helpers/definition_list_helper.rb +0 -110
  62. data/lib/storefront/helpers/error_helper.rb +0 -11
  63. data/lib/storefront/helpers/flash_helper.rb +0 -14
  64. data/lib/storefront/helpers/form_helper.rb +0 -13
  65. data/lib/storefront/helpers/format_helper.rb +0 -59
  66. data/lib/storefront/helpers/image_helper.rb +0 -30
  67. data/lib/storefront/helpers/list_helper.rb +0 -135
  68. data/lib/storefront/helpers/locale_helper.rb +0 -245
  69. data/lib/storefront/helpers/open_graph_helper.rb +0 -5
  70. data/lib/storefront/helpers/page_helper.rb +0 -91
  71. data/lib/storefront/helpers/presenter_helper.rb +0 -5
  72. data/lib/storefront/helpers/semantic/location_helper.rb +0 -18
  73. data/lib/storefront/helpers/semantic/time_helper.rb +0 -14
  74. data/lib/storefront/helpers/sidebar_helper.rb +0 -27
  75. data/lib/storefront/helpers/system_helper.rb +0 -18
  76. data/lib/storefront/helpers/table_helper.rb +0 -38
  77. data/lib/storefront/helpers/template_helper.rb +0 -11
  78. data/lib/storefront/helpers/time_helper.rb +0 -21
  79. data/lib/storefront/helpers/url_helper.rb +0 -32
  80. data/lib/storefront/helpers/user_helper.rb +0 -15
  81. data/lib/storefront/helpers/widget_helper.rb +0 -142
  82. data/lib/storefront/helpers/workflow_helper.rb +0 -50
  83. data/lib/storefront/model_helper.rb +0 -17
  84. data/lib/storefront/table.rb +0 -198
  85. data/rails/init.rb +0 -1
  86. data/test/form_helper_test.rb +0 -5
  87. data/test/support/mock_controller.rb +0 -15
  88. data/test/support/mock_response.rb +0 -14
  89. data/test/support/models.rb +0 -0
  90. data/test/test_helper.rb +0 -34
@@ -1,5 +0,0 @@
1
- module Storefront
2
- module PresenterHelper
3
-
4
- end
5
- end
@@ -1,18 +0,0 @@
1
- module Storefront
2
- module Semantic
3
- module LocationHelper
4
- def semantic_geo_tag(lat, lng, options = {})
5
- capture_haml do
6
- haml_tag :span, :itemprop => "geo", :itemtype => "http://data-vocabulary.org/Geo" do
7
- haml_tag :span, :itemprop => "latitude" do
8
- haml_tag :span, lat, :class => "value-title"
9
- end
10
- haml_tag :span, :itemprop => "longitude" do
11
- haml_tag :span, lng, :class => "value-title"
12
- end
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,14 +0,0 @@
1
- module Storefront
2
- module Semantic
3
- module TimeHelper
4
- def semantic_time_tag(value, time, options = {})
5
- capture_haml do
6
- haml_tag :time, :class => "dtstart", :itemprop => "startDate", :title => time.xmlschema, :datetime => time.xmlschema do
7
- haml_tag :span, :class => "value-title", :title => time.xmlschema
8
- haml_concat value
9
- end
10
- end
11
- end
12
- end
13
- end
14
- end
@@ -1,27 +0,0 @@
1
- module Storefront
2
- module SidebarHelper
3
- def sidebar_for(record, options = {}, &block)
4
- @sidebar_record = record
5
- concat(capture(&block))
6
- @sidebar_record = nil
7
- end
8
-
9
- def sidebar(*args)
10
- locals = args.extract_options!
11
- path = args.shift
12
- if path.blank?
13
- path = resource.class.name.underscore.pluralize.to_sym rescue nil
14
- end
15
- if path.is_a?(Symbol)
16
- path = [path_namespace, path.to_s, "sidebar"].compact.join("/")
17
- end
18
- content_for :sidebar do
19
- render :partial => path, :locals => locals
20
- end
21
- end
22
-
23
- def sidebar_record
24
- @sidebar_record
25
- end
26
- end
27
- end
@@ -1,18 +0,0 @@
1
- module Storefront
2
- module SystemHelper
3
- def windows?
4
- # Can't match for just 'win' cause it will match darwin as well.
5
- (/win32|mswin|mingw/).match(RUBY_PLATFORM) ? true : false
6
- end
7
-
8
- # Works on Debian and Ubuntu, don't have anything else to test on.
9
- def linux?
10
- (/linux/).match(RUBY_PLATFORM) ? true : false
11
- end
12
-
13
- # Works on my MacBook Pro, don't have anything else to test on,
14
- def mac?
15
- (/darwin/).match(RUBY_PLATFORM) ? true : false
16
- end
17
- end
18
- end
@@ -1,38 +0,0 @@
1
- module Storefront
2
- module TableHelper
3
- def table_for(*args, &block)
4
- Storefront::Table.new(self, *args, &block).content
5
- end
6
-
7
- def table_query_row_class
8
- ["search-row", query_params.except("page", "sort").blank? ? nil : "search-results"].compact.join(" ")
9
- end
10
-
11
- def link_to_sort(title, attribute, options = {})
12
- sort_param = sort_value(attribute, opposite_sort_direction(attribute))
13
- link_to title, with_params(request.path, :sort => sort_param), options
14
- end
15
-
16
- def next_page_path(collection)
17
- with_params(request.path, :page => collection.next_page)
18
- end
19
-
20
- def prev_page_path(collection)
21
- with_params(request.path, :page => collection.prev_page)
22
- end
23
-
24
- def first_page_path(collection)
25
- with_params(request.path, :page => 1)
26
- end
27
-
28
- def last_page_path(collection)
29
- with_params(request.path, :page => collection.last_page)
30
- end
31
-
32
- def current_page_num
33
- page = params[:page] ? params[:page].to_i : 1
34
- page = 1 if page < 1
35
- page
36
- end
37
- end
38
- end
@@ -1,11 +0,0 @@
1
- module Storefront
2
- module TemplateHelper
3
- def javascript_template(name, options = {}, &block)
4
- options[:id] ||= name.to_s.strip.gsub(/[\s|_]+/, storefront_config.separator).squeeze(storefront_config.separator)
5
- options[:type] ||= "text/html"
6
- capture_haml do
7
- haml_tag :script, options, &block
8
- end
9
- end
10
- end
11
- end
@@ -1,21 +0,0 @@
1
- module Storefront
2
- module TimeHelper
3
- # (new Date()).getTimezoneOffset() in JavaScript returns (UTC - localtime) in
4
- # minutes, while ActiveSupport::TimeZone expects (localtime - UTC) in seconds.
5
- def set_time_zone
6
- offset = (cookies[:timezone] || 0).to_i * -60
7
- # User.time_zone = ActiveSupport::TimeZone[-min.minutes]
8
- ::User.time_zone = ActiveSupport::TimeZone.us_zones.find { |z| z.utc_offset == offset.to_i }
9
- true
10
- end
11
-
12
- def record_post_time
13
- cookies[:last_post_at] = Time.zone.now.to_i
14
- end
15
-
16
- def html5_time(date_or_time)
17
- return nil if date_or_time.blank?
18
- date_or_time.acts_like?(:time) ? date_or_time.xmlschema : date_or_time.rfc3339
19
- end
20
- end
21
- end
@@ -1,32 +0,0 @@
1
- module Storefront
2
- module UrlHelper
3
- def current_subdomain
4
- subdomain = request.subdomain.to_s.split(".").first
5
- subdomain = nil if subdomain == App.name
6
- (subdomain.blank? || subdomain == "www") ? nil : subdomain
7
- end
8
-
9
- def path_namespace?(*args)
10
- args.present? ? args.any? { |is| path_namespace == is.to_s } : path_namespace.present?
11
- end
12
-
13
- def path_namespace
14
- if @path_namespace.nil?
15
- if current_subdomain.present?
16
- @path_namespace = current_subdomain
17
- elsif params[:path_namespace]
18
- @path_namespace = params[:path_namespace]
19
- else
20
- parts = params[:controller].split("/")
21
- @path_namespace = parts.length > 1 ? parts.first : ""
22
- end
23
- end
24
-
25
- @path_namespace
26
- end
27
-
28
- def with_current_params(path_method, *args)
29
- send path_method, *(args << Rack::Utils.parse_query(request.query_string).merge(args.extract_options!))
30
- end
31
- end
32
- end
@@ -1,15 +0,0 @@
1
- module Storefront
2
- module UserHelper
3
- def globalize_current_user
4
- current_user.request = request if current_user
5
- User.current = current_user
6
- Rails.logger.info "Current User: [#{ip_address}] #{current_user.present? ? current_user.email : 'Unknown'} (#{user_agent})"
7
- true
8
- end
9
-
10
- def deglobalize_current_user
11
- User.current = nil
12
- true
13
- end
14
- end
15
- end
@@ -1,142 +0,0 @@
1
- module Storefront
2
- module WidgetHelper
3
- def widget(*args, &block)
4
- options = args.extract_options!
5
- path = args.shift
6
- name = path.to_s.gsub("/", "_")
7
-
8
- if self.respond_to?("#{name}_widget")
9
- send("#{name}_widget", name, options, &block)
10
- else
11
- raise "Please define a helper method 'def #{name}_widget(*args)'"
12
- end
13
- end
14
-
15
- def text_widget(*args, &block)
16
- options = text_widget_options(*args)
17
-
18
- capture_haml do
19
- haml_tag :article, options[:outer_html] do
20
- header = header_widget(options)
21
- haml_concat header if header.present?
22
- content = options[:content]
23
- content ||= capture(&block) if block_given?
24
- haml_tag options[:tag], content, options[:content_html]
25
- end
26
- end
27
- end
28
-
29
- def text_widget_options(*args)
30
- options = widget_options(*args)
31
-
32
- options[:content_html] ||= {}
33
-
34
- merge_class! options, storefront_config.content_class
35
-
36
- options[:tag] ||= :p
37
-
38
- options
39
- end
40
-
41
- def buttons_widget(*args, &block)
42
- options = args.extract_options!
43
- options = widget_options("buttons-widget", options.reverse_merge(:title => false))
44
-
45
- capture_haml do
46
- haml_tag :nav, options[:outer_html], &block
47
- end
48
- end
49
-
50
- def footer_widget(*args, &block)
51
- options = args.extract_options!
52
- options = widget_options("footer-widget", options.reverse_merge(:title => false))
53
-
54
- capture_haml do
55
- haml_tag :footer, options[:outer_html], &block
56
- end
57
- end
58
-
59
- def header_widget(options = {}, &block)
60
- options = header_widget_options(options) unless options[:skip_format]
61
-
62
- return nil if options.blank?
63
-
64
- capture_haml do
65
- if block_given?
66
- haml_tag :header, options[:header_html], &block
67
- else
68
- level = options[:level] || 3
69
- title = options[:title_html].delete(:value)
70
- subtitle = options[:subtitle_html].delete(:value)
71
-
72
- haml_tag :header, options[:header_html] do
73
- if subtitle.present?
74
- haml_tag :hgroup do
75
- haml_tag :"h#{level}", title, options[:title_html]
76
- haml_tag :"h#{level + 1}", subtitle, options[:subtitle_html]
77
- end
78
- else
79
- haml_tag :"h#{level}", title, options[:title_html]
80
- end
81
- end
82
- end
83
- end
84
- end
85
-
86
- def header_widget_options(options = {})
87
- return {} if options[:title] == false
88
-
89
- header_html = options[:header_html] || {}
90
- header_html.reverse_merge!(:class => storefront_config.header_class)
91
-
92
- title_html = options[:title_html] || {}
93
- title_html.reverse_merge!(:class => storefront_config.title_class)
94
- title_html[:value] = options.delete(:title)
95
-
96
- title_html[:value] = t?(title_html[:value], :scope => :"widgets.headers") if title_html[:value].is_a?(::Symbol)
97
-
98
- subtitle_html = options[:subtitle_html] || {}
99
- if subtitle_html.present? || options[:subtitle].present?
100
- subtitle_html.reverse_merge!(:class => storefront_config.subtitle_class)
101
- subtitle_html[:value] = options.delete(:subtitle)
102
- subtitle_html[:value] = t?(subtitle_html[:value], :scope => :"widgets.headers") if subtitle_html[:value].is_a?(::Symbol)
103
- end
104
-
105
- options.merge! :header_html => header_html, :title_html => title_html, :subtitle_html => subtitle_html
106
-
107
- options
108
- end
109
-
110
- protected
111
- def render_widget_partial(name, *args)
112
- path = name.is_a?(::Symbol) ? ::File.join(storefront_config.widgets_path, name.to_s) : name.to_s
113
- locals = args.extract_options!.merge(:yielded_content => block_given? ? capture(&block) : nil)
114
- render :partial => path, :locals => locals
115
- end
116
-
117
- def widget_options(type, *args)
118
- options = args.extract_options!
119
- key = args.shift
120
-
121
- options[:title] ||= false
122
- options[:key] ||= key
123
- options[:outer_html] ||= {}
124
-
125
- options[:body_html] ||= {}
126
- options[:footer_html] ||= {}
127
-
128
- unless options[:widget_class] == false
129
- merge_class! options[:outer_html], *widget_classes(type)
130
- end
131
-
132
- options
133
- end
134
-
135
- def widget_classes(type)
136
- [
137
- storefront_config.widget_class,
138
- type.to_s.strip.gsub(/[\s|_]+/, storefront_config.separator).squeeze(storefront_config.separator)
139
- ]
140
- end
141
- end
142
- end
@@ -1,50 +0,0 @@
1
- module Storefront
2
- module WorkflowHelper
3
- def current_workflow
4
- params[:flow]
5
- end
6
-
7
- def flow?(*args)
8
- args.present? ? args.any? { |flow| current_workflow == flow.to_s } : current_workflow.present?
9
- end
10
-
11
- def workflow_steps(current, *labels)
12
- steps = labels.flatten.map do |label|
13
- if label.is_a?(Hash)
14
- label.symbolize_keys
15
- else
16
- {:title => label, :description => ""}
17
- end
18
- end
19
- steps.each_with_index do |step, index|
20
- step[:active] = index == (current - 1)
21
- end
22
- steps
23
- end
24
-
25
- def workflow_step(label, current, desired)
26
- image_name = "step_#{desired}"
27
- image_name << "_active" if current == desired
28
- image_name << ".png"
29
- td_class = current == desired ? "step_active" : "step"
30
- result = capture_haml do
31
- haml_tag :td, :class => :number do
32
- haml_tag :img, :class => :step_number, :src => "/images/#{image_name}"
33
- end
34
- haml_tag :td, :class => td_class do
35
- haml_concat label
36
- end
37
- end
38
- result
39
- end
40
-
41
- def next_step_tag(resource = self.resource)
42
- result = capture_haml do
43
- haml_concat hidden_field_tag(:event, current_step)
44
- if resource && resource.id
45
- haml_concat hidden_field_tag(:id, resource.id)
46
- end
47
- end
48
- end
49
- end
50
- end
@@ -1,17 +0,0 @@
1
- module Storefront
2
- module ModelHelper
3
- def self.included(base)
4
- base.class_eval do
5
- def self.to_title
6
- name
7
- end unless self.respond_to?(:to_title)
8
-
9
- def to_title
10
- return title if respond_to?(:title)
11
- return name if respond_to?(:name)
12
- to_s
13
- end unless self.instance_methods.include?(:to_title)
14
- end
15
- end
16
- end
17
- end
@@ -1,198 +0,0 @@
1
- module Storefront
2
- class Table
3
- include Storefront::AttributeHelper
4
- include Storefront::LocaleHelper
5
- include Storefront::TimeHelper
6
-
7
- attr_reader :content, :template, :key
8
-
9
- def initialize(template, *args, &block)
10
- @template = template
11
- options = args.extract_options!
12
- record_or_key = args.shift
13
- @key = record_key(record_or_key)
14
- @row_index = 0
15
- @cell_index = 0
16
- @scope = :table
17
- @headers = []
18
- options[:summary] ||= "Table for #{key.titleize}"
19
- options[:class] = ["data-table", options[:class]].compact.uniq.join(" ")
20
- options[:role] = :grid
21
- data = options.delete(:data) || {}
22
- data[:url] = options[:url] || @template.controller.request.path
23
- data[:for] = options[:for] || options[:model] || @key
24
- data[:total] = options[:total] if options[:total]
25
- data[:page] = options[:page] if options[:page]
26
- data[:count] = options[:count] if options[:count]
27
- aria = options.delete(:aria) || {}
28
- aria[:"aria-multiselectable"] = false unless aria.has_key?(:"aria-multiselectable") || options[:multiselect] == true
29
- options[:data] = data
30
- options[:id] ||= "#{record_or_key.to_s}-table"
31
-
32
- @content = template.capture_haml do
33
- template.haml_tag :table, options do
34
- yield(self)
35
- end
36
- end
37
- end
38
-
39
- def caption
40
-
41
- end
42
-
43
- # scope='col'
44
- def head(attributes = {}, &block)
45
- @hide_header = attributes.delete(:visible) == false
46
- template.capture_haml do
47
- @row_index = 0
48
- @scope = :head
49
- template.haml_tag :thead, attributes, &block
50
- @row_index = 0
51
- @scope = :table
52
- end
53
- end
54
-
55
- # scope='row'
56
- # <td headers='x'/>
57
- def body(attributes = {}, &block)
58
- template.capture_haml do
59
- @row_index = 0
60
- @scope = :body
61
- template.haml_tag :tbody, attributes, &block
62
- @row_index = 0
63
- @scope = :table
64
- end
65
- end
66
-
67
- def foot(attributes = {}, &block)
68
- template.capture_haml do
69
- @row_index = 0
70
- @scope = :foot
71
- template.haml_tag :tfoot, attributes, &block
72
- @row_index = 0
73
- @scope = :table
74
- end
75
- end
76
-
77
- def row(*args, &block)
78
- attributes = args.extract_options!
79
- if @scope == :body
80
- attributes[:class] = [template.cycle("odd", "even"), attributes[:class]].compact.uniq.join(" ")
81
- end
82
- attributes[:role] = :row
83
- attributes[:scope] = :row
84
- template.capture_haml do
85
- @row_index += 1
86
- @cell_index = 0
87
- template.haml_tag :tr, attributes, &block
88
- @cell_index = 0
89
- end
90
- end
91
-
92
- def column(*args, &block)
93
- attributes = args.extract_options!
94
- value = args.shift
95
- attributes[:id] ||= id_for(:header, key, value, @row_index, @cell_index)
96
- [:width, :height].each do |size|
97
- attributes[size] = pixelate(attributes[size]) unless attributes[size].nil?
98
- end
99
- @headers.push(attributes[:id])
100
-
101
- template.capture_haml do
102
- template.haml_tag :col, attributes
103
- @cell_index += 1
104
- end
105
- end
106
-
107
- # direction => "ascending"
108
- # valid directions: ascending, descending, none, other
109
- # abbr is what the header controls (for sorting)
110
- def header(*args, &block)
111
- attributes = args.extract_options!
112
- value = args.shift
113
- if value.is_a?(::Symbol)
114
- attributes[:abbr] ||= value.to_s
115
- end
116
- # aria-selected if sorted
117
- attributes[:role] = :columnheader
118
- attributes[:id] ||= id_for(:header, key, value, @row_index, @cell_index)
119
- attributes[:scope] = :col
120
- attributes[:abbr] ||= attributes.delete(:for) if attributes.has_key?(:for)
121
- [:width, :height].each do |size|
122
- attributes[size] = pixelate(attributes[size]) unless attributes[size].nil?
123
- end
124
- sort = attributes.delete(:sort) == true
125
- label = attributes.delete(:label) || (value.is_a?(::String) ? value.strip : value.to_s.titleize)
126
-
127
- if sort
128
- attributes[:class] = [attributes[:class], attributes.delete(:sort_class) || "sortable"].compact.uniq.join(" ")
129
- attributes[:direction] ||= template.sort_class(value)
130
- end
131
-
132
- direction = attributes.delete(:direction)
133
- if direction.present?
134
- attributes[:"aria-sort"] = direction
135
- attributes[:class] = [attributes[:class], direction].join(" ")
136
- attributes[:"aria-selected"] = true
137
- else
138
- attributes[:"aria-sort"] = "none"
139
- attributes[:"aria-selected"] = false
140
- end
141
-
142
- @headers.push(attributes[:id])
143
- template.capture_haml do
144
- if block_given?
145
- template.haml_tag :th, attributes, &block
146
- else
147
- if sort
148
- template.haml_tag :th, attributes do
149
- template.haml_concat template.link_to_sort(label, value)
150
- end
151
- else
152
- template.haml_tag :th, label, attributes
153
- end
154
- end
155
- @cell_index += 1
156
- end
157
- end
158
-
159
- def cell(*args, &block)
160
- attributes = args.extract_options!
161
- value = args.shift
162
- attributes[:role] = :gridcell
163
- attributes[:id] ||= id_for(:cell, key, value, @row_index, @cell_index)
164
- #attributes[:"aria-describedby"] = @headers[@cell_index]
165
- attributes[:headers] = @headers[@cell_index]
166
- [:width, :height].each do |size|
167
- attributes[size] = pixelate(attributes[size]) unless attributes[size].nil?
168
- end
169
- template.capture_haml do
170
- if block_given?
171
- template.haml_tag :td, attributes, &block
172
- else
173
- template.haml_tag :td, value.to_s.strip, attributes
174
- end
175
- @cell_index += 1
176
- end
177
- end
178
-
179
- def record_key(record_or_key)
180
- if record_or_key.is_a?(String) || record_or_key.is_a?(Symbol)
181
- record_or_key.to_s
182
- else
183
- record_or_key.class.name
184
- end
185
- end
186
-
187
- def id_for(type, key, value, row_index = @row_index, column_index = @column_index)
188
- [key, type, row_index, column_index].compact.map do |node|
189
- node.to_s.gsub(/[\s_]/, "-")
190
- end.join("-")
191
- end
192
-
193
- private
194
- def pixelate(value)
195
- value.is_a?(::String) ? value : "#{value}px"
196
- end
197
- end
198
- end