ui_bibz 0.9.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 +7 -0
- data/.gitignore +44 -0
- data/.travis.yml +13 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +171 -0
- data/MIT-LICENSE +20 -0
- data/README.md +728 -0
- data/README.rdoc +0 -0
- data/Rakefile +34 -0
- data/config/locales/en.yml +14 -0
- data/config/locales/fr.yml +14 -0
- data/doc/images/alert.png +0 -0
- data/doc/images/breadcrumb.png +0 -0
- data/doc/images/button.png +0 -0
- data/doc/images/button_dropdown.png +0 -0
- data/doc/images/button_group.png +0 -0
- data/doc/images/button_link.png +0 -0
- data/doc/images/button_split_dropdown.png +0 -0
- data/doc/images/glyph.png +0 -0
- data/doc/images/list.png +0 -0
- data/doc/images/nav.png +0 -0
- data/doc/images/panel.png +0 -0
- data/doc/images/table.png +0 -0
- data/doc/images/table_pagination_per_page.png +0 -0
- data/doc/images/table_panel.png +0 -0
- data/doc/images/table_search_field.png +0 -0
- data/doc/images/ui-bibz-logo-without-border.gif +0 -0
- data/doc/images/ui-bibz-logo.gif +0 -0
- data/lib/tasks/ui_bibz_tasks.rake +4 -0
- data/lib/ui_bibz/concerns/models/searchable.rb +93 -0
- data/lib/ui_bibz/helpers/meta_helper.rb +27 -0
- data/lib/ui_bibz/helpers/ui_helper.rb +108 -0
- data/lib/ui_bibz/helpers/utils_helper.rb +9 -0
- data/lib/ui_bibz/rails/engine.rb +39 -0
- data/lib/ui_bibz/ui/alert.rb +67 -0
- data/lib/ui_bibz/ui/breadcrumb/breadcrumb.rb +54 -0
- data/lib/ui_bibz/ui/breadcrumb/components/breadcrumb_link.rb +62 -0
- data/lib/ui_bibz/ui/button/button.rb +65 -0
- data/lib/ui_bibz/ui/button/button_dropdown.rb +56 -0
- data/lib/ui_bibz/ui/button/button_group.rb +62 -0
- data/lib/ui_bibz/ui/button/button_link.rb +66 -0
- data/lib/ui_bibz/ui/button/button_split_dropdown.rb +80 -0
- data/lib/ui_bibz/ui/component.rb +137 -0
- data/lib/ui_bibz/ui/dropdown/components/dropdown_list.rb +73 -0
- data/lib/ui_bibz/ui/dropdown/dropdown.rb +101 -0
- data/lib/ui_bibz/ui/glyph.rb +92 -0
- data/lib/ui_bibz/ui/grid/components/col.rb +74 -0
- data/lib/ui_bibz/ui/grid/components/row.rb +32 -0
- data/lib/ui_bibz/ui/grid/grid.rb +108 -0
- data/lib/ui_bibz/ui/jumbotron.rb +58 -0
- data/lib/ui_bibz/ui/label.rb +58 -0
- data/lib/ui_bibz/ui/list/components/list.rb +105 -0
- data/lib/ui_bibz/ui/list/list_group.rb +78 -0
- data/lib/ui_bibz/ui/nav/components/nav_link.rb +68 -0
- data/lib/ui_bibz/ui/nav/nav.rb +65 -0
- data/lib/ui_bibz/ui/panel.rb +101 -0
- data/lib/ui_bibz/ui/table/components/actions.rb +44 -0
- data/lib/ui_bibz/ui/table/components/column.rb +34 -0
- data/lib/ui_bibz/ui/table/components/columns.rb +16 -0
- data/lib/ui_bibz/ui/table/components/store.rb +67 -0
- data/lib/ui_bibz/ui/table/components/table_action.rb +21 -0
- data/lib/ui_bibz/ui/table/table.rb +146 -0
- data/lib/ui_bibz/ui/table/table_pagination.rb +29 -0
- data/lib/ui_bibz/ui/table/table_pagination_per_page.rb +53 -0
- data/lib/ui_bibz/ui/table/table_panel.rb +66 -0
- data/lib/ui_bibz/ui/table/table_search_field.rb +62 -0
- data/lib/ui_bibz/ui/table/ux/actionable.rb +59 -0
- data/lib/ui_bibz/ui/table/ux/paginable.rb +35 -0
- data/lib/ui_bibz/ui/table/ux/searchable.rb +47 -0
- data/lib/ui_bibz/ui/table/ux/sortable.rb +93 -0
- data/lib/ui_bibz/ui/ui.rb +14 -0
- data/lib/ui_bibz/utils/internationalization.rb +30 -0
- data/lib/ui_bibz/version.rb +3 -0
- data/lib/ui_bibz.rb +60 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/mailers/.keep +0 -0
- data/test/dummy/app/models/.keep +0 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/models/user.rb +5 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +57 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/migrate/20150123191721_user.rb +4 -0
- data/test/dummy/db/migrate/20150123191805_create_users.rb +12 -0
- data/test/dummy/db/schema.rb +25 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/dummy/log/.keep +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/test/fixtures/users.yml +13 -0
- data/test/dummy/test/models/user_test.rb +7 -0
- data/test/factories/user.rb +8 -0
- data/test/store_test.rb +46 -0
- data/test/support/factory_girl.rb +6 -0
- data/test/test_helper.rb +23 -0
- data/test/ui/button_test.rb +56 -0
- data/test/ui/component_test.rb +21 -0
- data/test/ui/dropdown_test.rb +18 -0
- data/test/ui/glyph_test.rb +23 -0
- data/test/ui/grid_test.rb +46 -0
- data/test/ui/list_group_test.rb +28 -0
- data/test/ui/nav_test.rb +27 -0
- data/test/ui/panel_test.rb +52 -0
- data/test/ui/table_test.rb +178 -0
- data/test/ui_bibz_test.rb +13 -0
- data/test/ui_helper_test.rb +44 -0
- data/ui_bibz.gemspec +36 -0
- data/vendor/assets/javascripts/ui_bibz.js.coffee +24 -0
- data/vendor/assets/stylesheets/ui_bibz.sass +46 -0
- metadata +398 -0
@@ -0,0 +1,101 @@
|
|
1
|
+
module UiBibz::Ui
|
2
|
+
|
3
|
+
# Create a panel
|
4
|
+
#
|
5
|
+
# This element is an extend of UiBibz::Ui::Component.
|
6
|
+
# You can use tap method to add header, body or footer element.
|
7
|
+
#
|
8
|
+
# ==== Attributes
|
9
|
+
#
|
10
|
+
# * +content+ - Content of element
|
11
|
+
# * +options+ - Options of element
|
12
|
+
# * +html_options+ - Html Options of element
|
13
|
+
#
|
14
|
+
# ==== Options
|
15
|
+
#
|
16
|
+
# You can add HTML attributes using the +html_options+.
|
17
|
+
# You can pass arguments in options attribute:
|
18
|
+
# * +state+ - State of élement with symbol value:
|
19
|
+
# (+:default+, +:primary+, +:info+, +:warning+, +:danger+)
|
20
|
+
#
|
21
|
+
# ==== Signatures
|
22
|
+
#
|
23
|
+
# UiBibz::Ui::Panel.new(content, options = nil, html_options = nil)
|
24
|
+
#
|
25
|
+
# UiBibz::Ui::Panel.new(options = nil, html_options = nil) do
|
26
|
+
# content
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# UiBibz::Ui::Panel.new(options = nil, html_options = nil).tap do |p|
|
30
|
+
# p.header content = nil, options = nil, html_options = nil, &block
|
31
|
+
# p.body content = nil, options = nil, html_options = nil, &block
|
32
|
+
# p.footer content = nil, options = nil, html_options = nil, &block
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# ==== Examples
|
36
|
+
#
|
37
|
+
# UiBibz::Ui::Panel('test').render
|
38
|
+
#
|
39
|
+
# UiBibz::Ui::Panel(state: :primary) do |d|
|
40
|
+
# 'test'
|
41
|
+
# end.render
|
42
|
+
#
|
43
|
+
# UiBibz::Ui::Panel.new().tap do |p|
|
44
|
+
# p.header 'header', glyph: 'eye', class: 'header-test'
|
45
|
+
# p.body do
|
46
|
+
# 'body'
|
47
|
+
# end
|
48
|
+
# p.footer 'footer'
|
49
|
+
# end.render
|
50
|
+
#
|
51
|
+
class Panel < Component
|
52
|
+
|
53
|
+
def initialize content = nil, options = nil, html_options = nil, &block
|
54
|
+
super
|
55
|
+
end
|
56
|
+
|
57
|
+
# Header is a component element
|
58
|
+
def header content = nil, options = nil, html_options = nil, &block
|
59
|
+
@header = Component.new content, options, html_options, &block
|
60
|
+
end
|
61
|
+
|
62
|
+
# Body is a component element
|
63
|
+
def body content = nil, options = nil, html_options = nil, &block
|
64
|
+
@body = Component.new content, options, html_options, &block
|
65
|
+
end
|
66
|
+
|
67
|
+
# Footer is a component element
|
68
|
+
def footer content = nil, options = nil, html_options = nil, &block
|
69
|
+
@footer = Component.new content, options, html_options, &block
|
70
|
+
end
|
71
|
+
|
72
|
+
def render
|
73
|
+
content_tag :div, class_and_html_options("panel") do
|
74
|
+
concat(header_html) unless @header.nil?
|
75
|
+
concat(body_html) if !@body.nil? || !@content.nil?
|
76
|
+
concat(footer_html) unless @footer.nil?
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def state
|
81
|
+
sym = @options[:state] || :default
|
82
|
+
"panel-#{ states[sym] }"
|
83
|
+
end
|
84
|
+
|
85
|
+
protected
|
86
|
+
|
87
|
+
def header_html
|
88
|
+
content_tag :div, @header.render, @header.class_and_html_options("panel-heading")
|
89
|
+
end
|
90
|
+
|
91
|
+
def body_html
|
92
|
+
@body = Component.new @content unless @content.nil?
|
93
|
+
content_tag :div, @body.render, @body.class_and_html_options("panel-body")
|
94
|
+
end
|
95
|
+
|
96
|
+
def footer_html
|
97
|
+
content_tag :div, @footer.render, @footer.class_and_html_options("panel-footer")
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "ui_bibz/ui/table/components/table_action"
|
2
|
+
module UiBibz::Ui
|
3
|
+
class Actions
|
4
|
+
|
5
|
+
def initialize store
|
6
|
+
@store = store
|
7
|
+
@actions = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def action content = nil, options = nil, html_options = nil, &block
|
11
|
+
@actions << TableAction.new(content, options, html_options, &block).render
|
12
|
+
end
|
13
|
+
|
14
|
+
def list
|
15
|
+
@actions.empty? ? defaults_actions : @actions
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def defaults_actions
|
21
|
+
[
|
22
|
+
TableAction.new(show_name, url: { controller: @store.controller, action: 'show', id: :id }, glyph: 'eye').render,
|
23
|
+
TableAction.new(edit_name, url:{ controller: @store.controller, action: 'edit', id: :id }, glyph: 'pencil').render,
|
24
|
+
TableAction.new(delete_name, url: { controller: @store.controller, id: :id }, method: :delete, glyph: 'trash', data: { confirm: 'Are you sure?' }).render,
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
def show_name
|
29
|
+
defaults = ['ui_bibz.table.actions.defaults.show', 'Show']
|
30
|
+
UiBibz::Utils::Internationalization.new("ui_bibz.table.actions.#{ @store.model.to_s.underscore }.show", default: defaults).translate
|
31
|
+
end
|
32
|
+
|
33
|
+
def edit_name
|
34
|
+
defaults = ['ui_bibz.table.actions.defaults.edit', 'Edit']
|
35
|
+
UiBibz::Utils::Internationalization.new("ui_bibz.table.actions.#{ @store.model.to_s.underscore }.edit", default: defaults).translate
|
36
|
+
end
|
37
|
+
|
38
|
+
def delete_name
|
39
|
+
defaults = ['ui_bibz.table.actions.defaults.delete', 'Delete']
|
40
|
+
UiBibz::Utils::Internationalization.new("ui_bibz.table.actions.#{ @store.model.to_s.underscore }.delete", default: defaults).translate
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module UiBibz::Ui
|
2
|
+
class Column
|
3
|
+
|
4
|
+
attr_accessor :hidden, :link, :name, :data_index, :date_format, :sort, :format, :date_format, :count, :custom_sort, :parent
|
5
|
+
|
6
|
+
def initialize args
|
7
|
+
@args = args
|
8
|
+
@link = args[:link] # show or edit
|
9
|
+
@name = args[:name]
|
10
|
+
@order = args[:order]
|
11
|
+
@data_index = args[:data_index]
|
12
|
+
@date_format = args[:date_format]
|
13
|
+
@sort = args[:sort]
|
14
|
+
@custom_sort = args[:custom_sort]
|
15
|
+
@parent = args[:parent]
|
16
|
+
@count = args[:count]
|
17
|
+
@format = args[:format]
|
18
|
+
@hidden = args[:hidden]
|
19
|
+
end
|
20
|
+
|
21
|
+
def linkable?
|
22
|
+
!@link.nil?
|
23
|
+
end
|
24
|
+
|
25
|
+
def order
|
26
|
+
@order || 0
|
27
|
+
end
|
28
|
+
|
29
|
+
def hidden?
|
30
|
+
@hidden == true
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'ui_bibz/ui/table/components/columns'
|
2
|
+
require 'ui_bibz/ui/table/components/column'
|
3
|
+
module UiBibz::Ui
|
4
|
+
class Store
|
5
|
+
|
6
|
+
attr_accessor :records
|
7
|
+
|
8
|
+
def initialize store
|
9
|
+
@records = store.records
|
10
|
+
@store = store
|
11
|
+
@model = store.model
|
12
|
+
end
|
13
|
+
|
14
|
+
def total_pages
|
15
|
+
@records.total_pages
|
16
|
+
end
|
17
|
+
|
18
|
+
def per_page
|
19
|
+
@records.per_page
|
20
|
+
end
|
21
|
+
|
22
|
+
def total_entries
|
23
|
+
@records.total_entries
|
24
|
+
end
|
25
|
+
|
26
|
+
def sort
|
27
|
+
@store.sort
|
28
|
+
end
|
29
|
+
|
30
|
+
def direction
|
31
|
+
@store.direction
|
32
|
+
end
|
33
|
+
|
34
|
+
def searchable_attributes
|
35
|
+
@store.searchable_attributes
|
36
|
+
end
|
37
|
+
|
38
|
+
def current_page
|
39
|
+
@records.current_page
|
40
|
+
end
|
41
|
+
|
42
|
+
def limit_value
|
43
|
+
@records.limit_value
|
44
|
+
end
|
45
|
+
|
46
|
+
def columns
|
47
|
+
@columns ||= Columns.new model.new.attributes.keys.map{ |record| Column.new({ data_index: record, name: record.humanize }) }
|
48
|
+
end
|
49
|
+
|
50
|
+
def model
|
51
|
+
@model
|
52
|
+
end
|
53
|
+
|
54
|
+
def search
|
55
|
+
@store.search
|
56
|
+
end
|
57
|
+
|
58
|
+
def controller
|
59
|
+
@store.controller
|
60
|
+
end
|
61
|
+
|
62
|
+
def action
|
63
|
+
@store.action
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module UiBibz::Ui
|
2
|
+
class TableAction < Component
|
3
|
+
|
4
|
+
DIVIDER = '---'
|
5
|
+
|
6
|
+
def initialize content = nil, options = nil, html_options = nil, &block
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
def render
|
11
|
+
@content == DIVIDER ? DIVIDER : link_html
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def link_html
|
17
|
+
link_to glyph_and_content_html, @options[:url], class_and_html_options
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require "ui_bibz/ui/table/components/store"
|
2
|
+
require "ui_bibz/ui/table/components/columns"
|
3
|
+
require "ui_bibz/ui/table/components/column"
|
4
|
+
require "ui_bibz/ui/table/components/actions"
|
5
|
+
require "ui_bibz/ui/table/ux/paginable"
|
6
|
+
require "ui_bibz/ui/table/ux/paginable"
|
7
|
+
require "ui_bibz/ui/table/ux/searchable"
|
8
|
+
require "ui_bibz/ui/table/ux/sortable"
|
9
|
+
require "ui_bibz/ui/table/ux/actionable"
|
10
|
+
module UiBibz::Ui
|
11
|
+
|
12
|
+
# Create a Table
|
13
|
+
#
|
14
|
+
# This element is an extend of UiBibz::Ui::Component.
|
15
|
+
#
|
16
|
+
# ==== Attributes
|
17
|
+
#
|
18
|
+
# * +content+ - Content of element
|
19
|
+
# * +options+ - Options of element
|
20
|
+
# * +html_options+ - Html Options of element
|
21
|
+
#
|
22
|
+
# ==== Options
|
23
|
+
#
|
24
|
+
# You can add HTML attributes using the +html_options+.
|
25
|
+
# You can pass arguments in options attribute:
|
26
|
+
# * +store+ - Store generate by '+table_search_pagination+' method
|
27
|
+
# * +url+ - String
|
28
|
+
# * tap - Boolean
|
29
|
+
# * columns - Add column
|
30
|
+
# * actions - Add action by row
|
31
|
+
#
|
32
|
+
# ==== Signatures
|
33
|
+
#
|
34
|
+
# UiBibz::Ui::Table.new(store: @store)
|
35
|
+
#
|
36
|
+
# UiBibz::Ui::Table.new(store: @store, tap: true) do |t|
|
37
|
+
# t.columns do |c|
|
38
|
+
# c.column name: '#', data_index: '#'
|
39
|
+
# end
|
40
|
+
# t.action do |a|
|
41
|
+
# a.action '', url: url, glyph: ''
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# ==== Examples
|
46
|
+
#
|
47
|
+
# UiBibz::Ui::Table.new(store: @users).render
|
48
|
+
#
|
49
|
+
# UiBibz::Ui::Table.new(store: @users).tap do |t|
|
50
|
+
# t.columns do |c|
|
51
|
+
# c.column name: '#', data_index: 'id'
|
52
|
+
# c.column name: 'Name fr', data_index: 'name_fr', link: edit_user_path(:id), order: 2
|
53
|
+
# c.column name: 'Name en', data_index: 'name_en', order: 1
|
54
|
+
# c.column name: 'Name en', data_index: 'name_en', format: lambda{ |records, record| "name #{ record.id}"}
|
55
|
+
# end
|
56
|
+
# t.action do |a|
|
57
|
+
# a.action 'toto', url: users_path(:id), glyph: 'eye'
|
58
|
+
# a.action '---'
|
59
|
+
# a.action 'momo', url: users_path(:id), glyph: 'home'
|
60
|
+
# end
|
61
|
+
# end.render
|
62
|
+
#
|
63
|
+
class Table < Component
|
64
|
+
|
65
|
+
attr_accessor :columns
|
66
|
+
|
67
|
+
def initialize content = nil, options = nil, html_options = nil, &block
|
68
|
+
super
|
69
|
+
@columns = Columns.new
|
70
|
+
@actions = Actions.new store
|
71
|
+
end
|
72
|
+
|
73
|
+
def columns &block
|
74
|
+
@columns.tap(&block)
|
75
|
+
end
|
76
|
+
|
77
|
+
def actions &block
|
78
|
+
@actions.tap(&block)
|
79
|
+
end
|
80
|
+
|
81
|
+
def render
|
82
|
+
table_html
|
83
|
+
end
|
84
|
+
|
85
|
+
def store
|
86
|
+
@store ||= if @options[:store].nil?
|
87
|
+
raise 'Store is nil!'
|
88
|
+
elsif @options[:store].try(:records).nil?
|
89
|
+
raise 'Store can be created only with "table_search_pagination" method!'
|
90
|
+
else
|
91
|
+
Store.new @options.delete :store
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
protected
|
96
|
+
|
97
|
+
def sort
|
98
|
+
@sort ||= Sortable.new store, @options
|
99
|
+
end
|
100
|
+
|
101
|
+
def action
|
102
|
+
@action ||= Actionable.new store, @options, @actions
|
103
|
+
end
|
104
|
+
|
105
|
+
def cols
|
106
|
+
@columns.list.empty? ? store.columns.list : @columns.list
|
107
|
+
end
|
108
|
+
|
109
|
+
def type
|
110
|
+
"table-#{ @options[:type] }"
|
111
|
+
end
|
112
|
+
|
113
|
+
def table_html
|
114
|
+
content_tag(:table, class_and_html_options(["table", type])) do
|
115
|
+
|
116
|
+
ths = cols.collect do |col|
|
117
|
+
content_tag(:th, sort.header(col)) unless col.hidden?
|
118
|
+
end
|
119
|
+
|
120
|
+
ths = action.header ths
|
121
|
+
concat content_tag(:tr, ths.join.html_safe)
|
122
|
+
|
123
|
+
store.records.each do |record|
|
124
|
+
tds = cols.collect do |col|
|
125
|
+
content_tag(:td, td_content(record, col)) unless col.hidden?
|
126
|
+
end
|
127
|
+
|
128
|
+
tds = action.body record, tds
|
129
|
+
concat content_tag :tr, tds.join.html_safe
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# Maybe create a class for td_content
|
135
|
+
def td_content record, col
|
136
|
+
content = col.count ? record.send(col.data_index).count : record.send(col.data_index)
|
137
|
+
unless content.nil?
|
138
|
+
content = content.strftime(col.date_format) unless col.date_format.nil?
|
139
|
+
content = link_to content, action.inject_url(col.link, record) unless col.link.nil?
|
140
|
+
content = col.format.call(@store.records, record) unless col.format.nil?
|
141
|
+
content
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'will_paginate'
|
2
|
+
require "will_paginate-bootstrap"
|
3
|
+
require "ui_bibz/ui/table/components/store"
|
4
|
+
module UiBibz::Ui
|
5
|
+
class TablePagination < Ui
|
6
|
+
include WillPaginate::ActionView
|
7
|
+
|
8
|
+
def initialize options = nil, html_options = nil
|
9
|
+
@pagination = Component.new nil, options, html_options
|
10
|
+
end
|
11
|
+
|
12
|
+
def render
|
13
|
+
will_paginate(store.records, params: { controller: store.controller }, renderer: BootstrapPagination::Rails)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def store
|
19
|
+
@store ||= if @pagination.options[:store].nil?
|
20
|
+
raise 'Store is nil!'
|
21
|
+
elsif @pagination.options[:store].try(:records).nil?
|
22
|
+
raise 'Store can be created only with "table_search_pagination" method!'
|
23
|
+
else
|
24
|
+
Store.new @pagination.options.delete :store
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "ui_bibz/ui/table/components/store"
|
2
|
+
module UiBibz::Ui
|
3
|
+
class TablePaginationPerPage < Ui
|
4
|
+
include WillPaginate::ActionView
|
5
|
+
|
6
|
+
def initialize options = nil, html_options = nil
|
7
|
+
@per_page_field = Component.new nil, options, html_options
|
8
|
+
end
|
9
|
+
|
10
|
+
def render
|
11
|
+
if @per_page_field.options[:wrap_form] != false
|
12
|
+
form_tag(url_for(controller: store.controller, action: store.action), method: :get) do
|
13
|
+
per_page_html
|
14
|
+
end
|
15
|
+
else
|
16
|
+
per_page_html
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def store
|
23
|
+
@store ||= if @per_page_field.options[:store].nil?
|
24
|
+
raise 'Store is nil!'
|
25
|
+
elsif @per_page_field.options[:store].try(:records).nil?
|
26
|
+
raise 'Store can be created only with "table_search_pagination" method!'
|
27
|
+
else
|
28
|
+
Store.new @per_page_field.options.delete :store
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def per_page_html
|
33
|
+
content_tag :div, class: 'table-pagination-per-page' do
|
34
|
+
concat results_count_html
|
35
|
+
concat UiBibz::Utils::Internationalization.new("ui_bibz.table.pagination.per_page", default: "Per page: ").translate
|
36
|
+
concat select_tag('per_page', options_for_select([25, 50, 100], store.per_page), class: 'form-control')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def results_count_html
|
41
|
+
"#{ page_entries_info store.records } | ".html_safe
|
42
|
+
end
|
43
|
+
|
44
|
+
def from_current_results
|
45
|
+
store.limit_value * store.current_page - store.limit_value + 1
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_current_results
|
49
|
+
store.limit_value * store.current_page
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module UiBibz::Ui
|
2
|
+
class TablePanel < Panel
|
3
|
+
|
4
|
+
attr_accessor :columns
|
5
|
+
|
6
|
+
def initialize content = nil, options = nil, html_options = nil, &block
|
7
|
+
super
|
8
|
+
@store = @options.delete(:store) if @options[:store]
|
9
|
+
table_options = (@options[:table_options] || {}).merge({ store: @store })
|
10
|
+
@table = UiBibz::Ui::Table.new(table_options, @options[:table_html_options])
|
11
|
+
end
|
12
|
+
|
13
|
+
def render
|
14
|
+
initialize_header
|
15
|
+
initialize_footer
|
16
|
+
|
17
|
+
content_tag :div, class_and_html_options(panel_classes) do |f|
|
18
|
+
form_tag(url_for(controller: @store.controller, action: @store.action), method: :get) do
|
19
|
+
concat(header_html) unless @header.nil?
|
20
|
+
concat(body_html) unless @body.nil?
|
21
|
+
concat(table_html) unless @store.nil?
|
22
|
+
concat(footer_html) unless @footer.nil?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def columns &block
|
28
|
+
@table.columns &block
|
29
|
+
end
|
30
|
+
|
31
|
+
def actions &block
|
32
|
+
@table.actions &block
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def table_html
|
38
|
+
content_tag :div, @table.render, class: 'panel-table'
|
39
|
+
end
|
40
|
+
|
41
|
+
def panel_classes
|
42
|
+
%w(panel panel-default table-panel)
|
43
|
+
end
|
44
|
+
|
45
|
+
def search
|
46
|
+
@search ||= Searchable.new @store, @options
|
47
|
+
end
|
48
|
+
|
49
|
+
def pagination
|
50
|
+
@pagination ||= Paginable.new @store, @options
|
51
|
+
end
|
52
|
+
|
53
|
+
def initialize_footer
|
54
|
+
@footer = @table.pagination
|
55
|
+
end
|
56
|
+
|
57
|
+
def initialize_header
|
58
|
+
@header = Component.new search.render
|
59
|
+
end
|
60
|
+
|
61
|
+
def initialize_footer
|
62
|
+
@footer = Component.new(pagination.render) if pagination.paginable?
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require "ui_bibz/ui/table/components/store"
|
2
|
+
module UiBibz::Ui
|
3
|
+
class TableSearchField < Ui
|
4
|
+
|
5
|
+
def initialize options = nil, html_options = nil
|
6
|
+
@search_field = Component.new nil, options, html_options
|
7
|
+
end
|
8
|
+
|
9
|
+
def render
|
10
|
+
if @search_field.options[:wrap_form] != false
|
11
|
+
form_tag(url_for(controller: store.controller, action: store.action), method: :get) do
|
12
|
+
search_field_html
|
13
|
+
end
|
14
|
+
else
|
15
|
+
search_field_html
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def store
|
22
|
+
@store ||= if @search_field.options[:store].nil?
|
23
|
+
raise 'Store is nil!'
|
24
|
+
elsif @search_field.options[:store].try(:records).nil?
|
25
|
+
raise 'Store can be created only with "table_search_pagination" method!'
|
26
|
+
else
|
27
|
+
Store.new @search_field.options.delete :store
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def search_field_html
|
32
|
+
content_tag :div, @search_field.class_and_html_options(div_class) do
|
33
|
+
concat content_tag(:span, Glyph.new('search').render, class: 'input-group-addon')
|
34
|
+
concat tag(:input, type: 'search', value: store.search, name: 'search', class: 'form-control', placeholder: search_placeholder_field)
|
35
|
+
concat content_tag(:span, Glyph.new('times-circle').render, class: 'clear-search-btn input-group-addon')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def div_class
|
40
|
+
%w(input-group input-group-sm table-search-field)
|
41
|
+
end
|
42
|
+
|
43
|
+
def search_placeholder_field
|
44
|
+
UiBibz::Utils::Internationalization.new('ui_bibz.grid.searchable.field.placeholder', searchable_attributes: searchable_attributes_sentence).translate
|
45
|
+
end
|
46
|
+
|
47
|
+
def searchable_attributes_sentence
|
48
|
+
store.searchable_attributes.map do |i|
|
49
|
+
UiBibz::Utils::Internationalization.new("ui_bibz.grid.searchable.field.searchable_attributes.#{ model_name }.#{ i }", default: [translate_searchable_attributes_by_active_record(i), i.to_s]).translate
|
50
|
+
end.to_sentence(locale: I18n.locale)
|
51
|
+
end
|
52
|
+
|
53
|
+
def model_name
|
54
|
+
store.model.to_s.underscore
|
55
|
+
end
|
56
|
+
|
57
|
+
def translate_searchable_attributes_by_active_record attr
|
58
|
+
store.model.human_attribute_name(attr)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module UiBibz::Ui
|
2
|
+
class Actionable < Ui
|
3
|
+
|
4
|
+
def initialize store, options, actions = nil
|
5
|
+
@store = store
|
6
|
+
@options = options
|
7
|
+
@actions = actions
|
8
|
+
end
|
9
|
+
|
10
|
+
def actionable?
|
11
|
+
@options[:actionable].nil? ? true : @options[:actionable]
|
12
|
+
end
|
13
|
+
|
14
|
+
def header ths
|
15
|
+
ths << content_tag(:th, '', class: 'action') if actionable?
|
16
|
+
ths
|
17
|
+
end
|
18
|
+
|
19
|
+
def body record, tds
|
20
|
+
tds << td_action(record) if actionable?
|
21
|
+
tds
|
22
|
+
end
|
23
|
+
|
24
|
+
# Add "id" in url to match with current record
|
25
|
+
def inject_url url, record
|
26
|
+
url.gsub(/(\/id\/?)/, "/#{ record.id }/")
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def dropdown_action record
|
32
|
+
UiBibz::Ui::Dropdown.new(dropdown_action_name, { position: :right, glyph: actions_glyph }, class: 'btn-group-xs').tap do |d|
|
33
|
+
unless @actions.nil?
|
34
|
+
actions_links(record).each do |l|
|
35
|
+
d.list l.html_safe
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end.render
|
39
|
+
end
|
40
|
+
|
41
|
+
def actions_glyph
|
42
|
+
{ name: 'ellipsis-v', type: 'fw' }
|
43
|
+
end
|
44
|
+
|
45
|
+
def dropdown_action_name
|
46
|
+
defaults = ["ui_bibz.table.actions.defaults.title", 'Actions']
|
47
|
+
UiBibz::Utils::Internationalization.new("ui_bibz.table.actions.#{ @store.model.to_s.underscore }.title", default: defaults).translate
|
48
|
+
end
|
49
|
+
|
50
|
+
def actions_links record
|
51
|
+
@actions.list.compact.map{ |l| inject_url(l, record) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def td_action record
|
55
|
+
content_tag :td, dropdown_action(record)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|