iquest-simple_table 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1a3df3945062bc5892ec44bcd007001960221e03
4
+ data.tar.gz: c7bc81df5e5d0fb178355662189da297102a9f57
5
+ SHA512:
6
+ metadata.gz: 2e5ea99f0afc341737c72f4fd330b818f44401591bf098b51bdf23a20183e60ed434f18b2ae41719be57626f3acce6aa2f3ef593917f425a592e7ed1f083d360
7
+ data.tar.gz: 8338e40016be3fa5262cfaf4b709bc5c0a5a49ae5998b9944bcba130cd255de1227a33839c97b5e2271969092c4a23cd4432c0fafa7e54fc64c0dc6a7402ca11
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0-p353
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in iquest-simple_table.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Pavel Dusanek
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Iquest::SimpleTable
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'iquest-simple_table'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install iquest-simple_table
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'iquest/simple_table/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "iquest-simple_table"
8
+ spec.version = Iquest::SimpleTable::VERSION
9
+ spec.authors = ["Pavel Dusanek"]
10
+ spec.email = ["dusanek@iquest.cz"]
11
+ spec.description = %q{Simple table helper}
12
+ spec.summary = %q{Simple table helper, taht supports filtering through Ransack}
13
+ spec.homepage = "https://github.com/iquest/iquest-simple_table"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency 'ransack_simple_form', '>= 0.1.0'
22
+ spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "rake"
24
+ end
@@ -0,0 +1,12 @@
1
+ require "iquest/simple_table/version"
2
+ require "iquest/simple_table/table_builder"
3
+ require "iquest/simple_table/table_helper"
4
+
5
+ module Iquest
6
+ module SimpleTable
7
+ include TableHelper
8
+ end
9
+ end
10
+
11
+ ActionController::Base.helper Iquest::SimpleTable::TableHelper
12
+
@@ -0,0 +1,299 @@
1
+ require 'ransack_simple_form'
2
+
3
+ module Iquest
4
+ module SimpleTable
5
+ class TableBuilder
6
+ attr_reader :parent, :table_id, :columns, :collection, :search_form, :actions, :new_link
7
+ delegate :capture, :content_tag, :link_to, :paginate, :params, to: :parent
8
+ delegate :sort_link, :search_form_for, to: :parent
9
+ delegate :polymorphic_path, :polymorphic_url, :new_polymorphic_path, :new_polymorphic_url, to: :parent
10
+ delegate :l, :t, to: :parent
11
+
12
+ def initialize(parent, collection_or_search, options = {})
13
+ @parent = parent
14
+ if collection_or_search.is_a? Ransack::Search
15
+ @collection = collection_or_search.result
16
+ @search = collection_or_search
17
+ @klass = @search.klass
18
+ elsif collection_or_search.is_a? ActiveRecord::Relation
19
+ @collection = collection_or_search
20
+ @klass = @collection.klass
21
+ else
22
+ raise TypeError, 'ActiveRecord::Relation or Ransack::Search expected'
23
+ end
24
+ apply_pagination
25
+ #draper
26
+ @collection = @collection.decorate if @collection.respond_to?(:decorate)
27
+ @options = options
28
+ @table_id = "table_#{self.object_id}".parameterize
29
+ @columns = {}.with_indifferent_access
30
+ @actions = []
31
+ @search_input_default_options = {label: false, placeholder: false}.with_indifferent_access
32
+ end
33
+
34
+ def column(*args, &block)
35
+ attr = args.first
36
+ options = args.extract_options!
37
+ search = options.delete(:search)
38
+ @columns[attr] = options
39
+ if @search
40
+ @columns[attr][:label] ||= Ransack::Translate.attribute(attr.to_s.tr('.','_'), context: @search.context)
41
+ else
42
+ @columns[attr][:label] ||= @klass.human_attribute_name(attr)
43
+ end
44
+ #iniciaizce search options
45
+ if search.is_a?(Symbol) || search.is_a?(String)
46
+ @columns[attr][:search] = {search.to_sym => {}}
47
+ elsif search.is_a? Array
48
+ @columns[attr][:search] = search.inject({}) {|h, s| h[s.to_sym] = {}; h}
49
+ elsif search.is_a? Hash
50
+ @columns[attr][:search] = search
51
+ end
52
+ @columns[attr][:formatter] ||= block if block_given?
53
+ end
54
+
55
+ def action(*args, &block)
56
+ action = args.first
57
+ options = args.extract_options!
58
+ options[:proc] = block if block_given?
59
+ @actions << options
60
+ end
61
+
62
+ def new_link(*args, &block)
63
+ @new_link = block if block_given?
64
+ end
65
+
66
+
67
+ def search_link(*args, &block)
68
+ @search_button = block if block_given?
69
+ end
70
+
71
+ def reset_link(*args, &block)
72
+ @reset_button = block if block_given?
73
+ end
74
+
75
+ def to_s
76
+ if @search
77
+ render_table_with_search
78
+ else
79
+ render_table_without_search
80
+ end
81
+ end
82
+
83
+ private
84
+ def render_table_without_search
85
+ table = content_tag :table, class: @options[:html][:class] << %w(table table-hover table-striped) do
86
+ render_table_header + render_table_body + render_table_footer
87
+ end
88
+
89
+ if @options[:responsive]
90
+ content_tag :div, class: 'table-responsive' do
91
+ table
92
+ end
93
+ else
94
+ table
95
+ end
96
+ end
97
+
98
+ include RansackSimpleForm::FormHelper
99
+
100
+ def render_table_with_search
101
+ ransack_simple_form_for @search do |f|
102
+ @search_form = f
103
+ render_table_without_search
104
+ end
105
+ end
106
+
107
+ def render_table_header
108
+ content_tag :thead, class: 'header' do
109
+ render_column_labels + render_search_inputs
110
+ end
111
+ end
112
+
113
+ def render_column_labels
114
+ content_tag :tr, class:'labels' do
115
+ rendered_columns = columns.map do |col, opts|
116
+ render_column_label(col)
117
+ end.join.html_safe
118
+ render_new_link + rendered_columns
119
+ end
120
+ end
121
+
122
+ def render_new_link
123
+ content_tag :th, class:'new-link' do
124
+ @new_link || (link_to t('new'), new_polymorphic_url(@klass), class: "btn btn-primary")
125
+ end
126
+ end
127
+
128
+ def render_search_inputs
129
+ content_tag :tr, class:'filters' do
130
+ rendered_columns = columns.map do |col, opts|
131
+ render_column_search_inputs(col, opts)
132
+ end.join.html_safe
133
+ render_buttons + rendered_columns
134
+ end
135
+ end
136
+
137
+ def render_column_search_inputs(column, options)
138
+ content_tag :th, class: '' do
139
+ if options[:search]
140
+ options[:search].map do |search, options|
141
+ render_search_input(search, options)
142
+ end.join.html_safe
143
+ end
144
+ end
145
+ end
146
+
147
+ def render_search_input(search, options = {})
148
+ input_options = @search_input_default_options.merge(options)
149
+ search_form.input search.dup, input_options
150
+ end
151
+
152
+ def render_buttons
153
+ content_tag :th, class:'search-action' do
154
+ out = content_tag :div, class:'btn-group' do
155
+ link_to("<i class=\"fa fa-times\" title=\"#{t('search.reset')}\"></i>".html_safe, '?' , class: 'search-reset btn btn-default') +
156
+ search_form.button( :submit, t('search.search'), class: 'search-button btn btn-default')
157
+ end
158
+ # FIXME change link_to url
159
+ end
160
+ end
161
+
162
+ def render_table_body
163
+ content_tag :tbody do
164
+ collection.map do |item|
165
+ render_table_row(item)
166
+ end.join.html_safe
167
+ end
168
+ end
169
+
170
+ def render_table_row(item)
171
+ content_tag :tr do
172
+ rendered_columns = columns.map do |col|
173
+ render_value_cell(col, item)
174
+ end.join.html_safe
175
+ render_actions(item) + rendered_columns
176
+ end
177
+ end
178
+
179
+
180
+ def render_column_label(column)
181
+ options = @columns[:column]
182
+
183
+ content_tag :th do
184
+ render_label(column)
185
+ end
186
+ end
187
+
188
+ def render_label(column)
189
+ attr = column
190
+ options = @columns[attr]
191
+
192
+ label = options[:label] || attr.to_s
193
+ if @search
194
+ sort_link(@search, attr, label, method: search_action)
195
+ else
196
+ label
197
+ end
198
+ end
199
+
200
+ def render_value_cell(*args)
201
+ col = args.first
202
+ attr = col.first
203
+ options = col.second
204
+ obj = args.second
205
+ value = get_value(attr, obj)
206
+ formatter = options[:formatter]
207
+ content_tag :td do
208
+ render_value(value, &formatter)
209
+ end
210
+ end
211
+
212
+ def get_value(attr, obj)
213
+ if attr.is_a? Symbol
214
+ obj.try(attr)
215
+ elsif attr.is_a? String
216
+ attr.split('.').inject(obj, :try)
217
+ end
218
+ end
219
+
220
+ def render_value(*args, &block)
221
+ value = args.first
222
+ if block_given?
223
+ block.call(value)
224
+ else
225
+ format_value(value)
226
+ end
227
+
228
+ end
229
+
230
+ def format_value(value)
231
+ case value
232
+ when Time
233
+ l(value)
234
+ when Date
235
+ l(value)
236
+ else
237
+ value
238
+ end
239
+ end
240
+
241
+ def render_actions(item)
242
+ content_tag :td do
243
+ @actions.map do |action|
244
+ render_action(item, action)
245
+ end.join.html_safe
246
+ end
247
+ end
248
+
249
+ def render_action(*args)
250
+ obj = args.first
251
+ options = args.extract_options!
252
+ options[:proc].call(obj) if options[:proc].is_a? Proc
253
+ end
254
+
255
+ def render_table_footer
256
+ content_tag :tfoot, class: '' do
257
+ content_tag :tr, class: '' do
258
+ render_pagination + render_footer_actions
259
+ end
260
+ end
261
+ end
262
+
263
+ def render_pagination
264
+ content_tag :td, colspan: column_count do
265
+ paginate @collection if @collection.respond_to?(:current_page)
266
+ end
267
+
268
+ end
269
+
270
+ def render_footer_actions
271
+ content_tag(:td, '', class: '')
272
+ end
273
+
274
+ private
275
+ def column_class(col)
276
+
277
+ end
278
+
279
+ def column_value(col, obj)
280
+ col.to_s.split('.').inject(obj, :try)
281
+ end
282
+
283
+ def column_count
284
+ @columns.count
285
+ end
286
+
287
+ def apply_pagination
288
+ page = params[:page] || 1
289
+ per_page = params[:per_page]
290
+ @collection = @collection.page(page).per(per_page)
291
+ end
292
+
293
+ def search_action
294
+ :get
295
+ end
296
+
297
+ end
298
+ end
299
+ end
@@ -0,0 +1,20 @@
1
+ module Iquest
2
+ module SimpleTable
3
+ module TableHelper
4
+ def simple_table_for(*args, &block)
5
+ collection = args.first
6
+ opts = args.extract_options!
7
+
8
+ opts[:html] ||= {}
9
+ opts[:html][:class] ||= ['filter-table']
10
+ opts[:html][:class] << ' ' if opts[:html][:class].is_a? String
11
+ opts[:responsive] ||= true
12
+
13
+ builder = SimpleTable::TableBuilder.new self, collection, opts
14
+
15
+ yield builder
16
+ builder.to_s
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ module Iquest
2
+ module SimpleTable
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: iquest-simple_table
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Pavel Dusanek
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ransack_simple_form
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Simple table helper
56
+ email:
57
+ - dusanek@iquest.cz
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - .ruby-version
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - iquest-simple_table.gemspec
69
+ - lib/iquest/simple_table.rb
70
+ - lib/iquest/simple_table/table_builder.rb
71
+ - lib/iquest/simple_table/table_helper.rb
72
+ - lib/iquest/simple_table/version.rb
73
+ homepage: https://github.com/iquest/iquest-simple_table
74
+ licenses:
75
+ - MIT
76
+ metadata: {}
77
+ post_install_message:
78
+ rdoc_options: []
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ requirements: []
92
+ rubyforge_project:
93
+ rubygems_version: 2.0.14
94
+ signing_key:
95
+ specification_version: 4
96
+ summary: Simple table helper, taht supports filtering through Ransack
97
+ test_files: []