organism-ui 0.2.1 → 0.2.16
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 +4 -4
- data/README.md +29 -5
- data/app/views/ui/style_guide/show.html.erb +31 -5
- data/lib/ui.rb +2 -0
- data/lib/ui/actionable.rb +22 -7
- data/lib/ui/breadcrumbs.rb +20 -7
- data/lib/ui/breadcrumbs/breadcrumb.rb +14 -12
- data/lib/ui/buttons/base.rb +54 -22
- data/lib/ui/buttons/primary.rb +5 -2
- data/lib/ui/buttons/secondary.rb +5 -2
- data/lib/ui/buttons/tertiary.rb +5 -2
- data/lib/ui/card.rb +1 -3
- data/lib/ui/collapse.rb +2 -1
- data/lib/ui/collapse/panel.rb +4 -2
- data/lib/ui/collapse/panel/show.erb +5 -4
- data/lib/ui/component.rb +7 -2
- data/lib/ui/descriptive_list.rb +5 -5
- data/lib/ui/descriptive_list/item.rb +19 -5
- data/lib/ui/dropdown.rb +6 -0
- data/lib/ui/dropdown/show.erb +1 -1
- data/lib/ui/empty/show.erb +1 -3
- data/lib/ui/engine.rb +2 -0
- data/lib/ui/errors/base.rb +6 -0
- data/lib/ui/errors/invalid_actions.rb +6 -0
- data/lib/ui/errors/invalid_list_items.rb +6 -0
- data/lib/ui/list.rb +23 -7
- data/lib/ui/menu/item.rb +1 -1
- data/lib/ui/pagination/window.rb +12 -10
- data/lib/ui/table.rb +69 -18
- data/lib/ui/table/header.rb +14 -4
- data/lib/ui/table/row.rb +7 -1
- data/lib/ui/table/vertical.rb +45 -0
- data/lib/ui/table/vertical/header.rb +26 -0
- data/lib/ui/table/vertical/row.rb +34 -0
- data/lib/ui/types.rb +2 -0
- data/lib/ui/version.rb +1 -1
- metadata +25 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45abc828f8e47547304444edd15b9ffb4ec4377feb286c5559fe4c60d6e23dfd
|
4
|
+
data.tar.gz: 411a58b849148a4f9c1635a8a318784bc25421a4b146a4911ce0bc4c1cec4dfb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db0d57b58f82cd7cf96aa9afad5f6862f7ce8b11652e383ca1ac13b5b38c4c1d360b4c6ad9bdbb66d28926f8c9cc66f657efc16ccab365ed5df8bbd3b6ce6649
|
7
|
+
data.tar.gz: d75702678ac862483be221af7bd4a3a19fc60e502767214a14688ca2710814b893a33c1a7907857d9b6631596f13dd24425e051148249bf569656a0c57f9fb1b
|
data/README.md
CHANGED
@@ -1,14 +1,27 @@
|
|
1
|
-
# Ui
|
2
|
-
|
1
|
+
# Organism Ui
|
2
|
+
Ui components made with cells (https://github.com/trailblazer/cells). This library is in ALPHA and subject to change anytime and dramatically before 1.0.
|
3
3
|
|
4
4
|
## Usage
|
5
|
-
|
5
|
+
|
6
|
+
### Components
|
7
|
+
Components are just configurable cells (https://github.com/trailblazer/cells) for basic ui components. Inspired by ant.design.
|
8
|
+
|
9
|
+
You render components in your views or controllers:
|
10
|
+
```ruby
|
11
|
+
<%= cell(
|
12
|
+
Ui::Buttons::Primary,
|
13
|
+
'Primary Button',
|
14
|
+
path: '/'
|
15
|
+
) %>
|
16
|
+
```
|
17
|
+
|
18
|
+
You can see full examples of components in the style guide: https://github.com/nolantait/organism-ui/blob/master/app/views/ui/style_guide/show.html.erb
|
6
19
|
|
7
20
|
## Installation
|
8
21
|
Add this line to your application's Gemfile:
|
9
22
|
|
10
23
|
```ruby
|
11
|
-
gem 'ui'
|
24
|
+
gem 'organism-ui'
|
12
25
|
```
|
13
26
|
|
14
27
|
And then execute:
|
@@ -18,9 +31,20 @@ $ bundle
|
|
18
31
|
|
19
32
|
Or install it yourself as:
|
20
33
|
```bash
|
21
|
-
$ gem install ui
|
34
|
+
$ gem install organism-ui
|
22
35
|
```
|
23
36
|
|
37
|
+
## Style guide
|
38
|
+
To quickly style your components you can mount the engine and navigate to an example style guide.
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
Rails.application.routes.draw do
|
42
|
+
mount Ui::Engine => "/ui"
|
43
|
+
end
|
44
|
+
```
|
45
|
+
|
46
|
+
You can then navigate to localhost:3000/ui/style_guide to see your components.
|
47
|
+
|
24
48
|
## Contributing
|
25
49
|
Contribution directions go here.
|
26
50
|
|
@@ -674,11 +674,10 @@
|
|
674
674
|
).()
|
675
675
|
}
|
676
676
|
],
|
677
|
-
|
677
|
+
item_renderer: ->(item) {
|
678
678
|
content_tag(
|
679
679
|
:div,
|
680
|
-
|
681
|
-
content_tag(:p, item),
|
680
|
+
content_tag(:p, item) +
|
682
681
|
content_tag(
|
683
682
|
:nav,
|
684
683
|
cell(
|
@@ -687,8 +686,7 @@
|
|
687
686
|
path: '#',
|
688
687
|
size: :small
|
689
688
|
).call(:edit)
|
690
|
-
)
|
691
|
-
].join(' ').html_safe,
|
689
|
+
),
|
692
690
|
class: 'flex flex-row justify-between items-center p-4'
|
693
691
|
)
|
694
692
|
}
|
@@ -727,6 +725,32 @@
|
|
727
725
|
</div>
|
728
726
|
</section>
|
729
727
|
|
728
|
+
<section class="style-guide__example" id="type">
|
729
|
+
<header>
|
730
|
+
<h2>Vertical</h2>
|
731
|
+
</header>
|
732
|
+
|
733
|
+
<div class="space-y-4">
|
734
|
+
<%= cell(
|
735
|
+
Ui::Table,
|
736
|
+
[
|
737
|
+
"Data 1",
|
738
|
+
"Data 2",
|
739
|
+
"Data 3",
|
740
|
+
],
|
741
|
+
columns: [
|
742
|
+
["", ->(data) { data } ],
|
743
|
+
["Column 2", ->(data) { "Column 2 data" } ],
|
744
|
+
["Column 3", ->(data) { "Column 3 data" } ],
|
745
|
+
["Actions", ->(data) { cell(Ui::Buttons::Tertiary, 'More')} ],
|
746
|
+
],
|
747
|
+
header: 'My title',
|
748
|
+
orientation: 'vertical',
|
749
|
+
style: 'my-style'
|
750
|
+
).() %>
|
751
|
+
</div>
|
752
|
+
</section>
|
753
|
+
|
730
754
|
<section class="style-guide__example" id="type">
|
731
755
|
<header>
|
732
756
|
<h2>Selectable</h2>
|
@@ -748,6 +772,8 @@
|
|
748
772
|
],
|
749
773
|
header: 'Multi select',
|
750
774
|
style: 'my-style',
|
775
|
+
row_renderer: ->(row, columns) {
|
776
|
+
},
|
751
777
|
features: {
|
752
778
|
selectable: {
|
753
779
|
multiple: true
|
data/lib/ui.rb
CHANGED
data/lib/ui/actionable.rb
CHANGED
@@ -1,11 +1,26 @@
|
|
1
1
|
module Ui
|
2
2
|
module Actionable
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
Actions = Types::Array.default([].freeze).of(Types::Callable)
|
4
|
+
|
5
|
+
def actions(object = model)
|
6
|
+
content_tag(:nav, class: 'ui-actions', role: 'navigation') do
|
7
|
+
render_group(
|
8
|
+
actions_list.map do |action|
|
9
|
+
action.call(object)
|
10
|
+
end
|
11
|
+
)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def actions_list
|
16
|
+
begin
|
17
|
+
Actions[options.fetch(:actions, Array.new)]
|
18
|
+
rescue Dry::Types::ConstraintError
|
19
|
+
raise Ui::Errors::InvalidActions.new(
|
20
|
+
"Actions for #{self.class.to_s} are invalid. Ensure you are passing " \
|
21
|
+
"an array of callable objects that will be passed a model"
|
22
|
+
)
|
23
|
+
end
|
9
24
|
end
|
10
25
|
|
11
26
|
def actions_length
|
@@ -13,7 +28,7 @@ module Ui
|
|
13
28
|
end
|
14
29
|
|
15
30
|
def has_actions?
|
16
|
-
|
31
|
+
actions_list.any?
|
17
32
|
end
|
18
33
|
end
|
19
34
|
end
|
data/lib/ui/breadcrumbs.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module Ui
|
2
2
|
class Breadcrumbs < Component
|
3
|
+
include Stylable
|
4
|
+
|
3
5
|
def show
|
4
|
-
content_tag(:nav, class:
|
5
|
-
breadcrumb_links
|
6
|
-
end
|
6
|
+
content_tag(:nav, render_group(breadcrumb_links.flatten), class: style)
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
@@ -14,10 +14,10 @@ module Ui
|
|
14
14
|
|
15
15
|
def breadcrumb_links
|
16
16
|
breadcrumbs.map.with_index do |crumb, index|
|
17
|
-
[item_renderer.call(crumb)].tap do |
|
18
|
-
|
17
|
+
[item_renderer.call(crumb)].tap do |array|
|
18
|
+
array.unshift(delimiter) unless index == 0
|
19
19
|
end
|
20
|
-
end
|
20
|
+
end
|
21
21
|
end
|
22
22
|
|
23
23
|
def delimiter
|
@@ -25,7 +25,20 @@ module Ui
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def item_renderer
|
28
|
-
options[:item_renderer] ||
|
28
|
+
options[:item_renderer] || default_item_renderer
|
29
|
+
end
|
30
|
+
|
31
|
+
def default_item_renderer
|
32
|
+
->(item) {
|
33
|
+
cell(
|
34
|
+
Ui::Breadcrumbs::Breadcrumb,
|
35
|
+
item
|
36
|
+
).()
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
def component_style
|
41
|
+
'ui-breadcrumbs'
|
29
42
|
end
|
30
43
|
end
|
31
44
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Ui
|
2
2
|
class Breadcrumbs < Component
|
3
3
|
class Breadcrumb < Component
|
4
|
+
include Stylable
|
5
|
+
|
4
6
|
property :name
|
5
7
|
property :path
|
6
8
|
property :current?
|
@@ -9,9 +11,7 @@ module Ui
|
|
9
11
|
def show
|
10
12
|
content_tag(
|
11
13
|
:span,
|
12
|
-
link_to(path)
|
13
|
-
title.html_safe
|
14
|
-
end,
|
14
|
+
link_to(render_group(title), path),
|
15
15
|
class: style
|
16
16
|
)
|
17
17
|
end
|
@@ -19,17 +19,19 @@ module Ui
|
|
19
19
|
private
|
20
20
|
|
21
21
|
def title
|
22
|
-
[name].tap do |array|
|
23
|
-
array.unshift(content_tag(:i, nil, class: icon)) if
|
24
|
-
end
|
22
|
+
[content_tag(:span, name)].tap do |array|
|
23
|
+
array.unshift(content_tag(:i, nil, class: icon)) if has_icon?
|
24
|
+
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
def has_icon?
|
28
|
+
model.try(:icon)
|
29
|
+
end
|
30
|
+
|
31
|
+
def component_style
|
32
|
+
['ui-breadcrumb'].tap do |array|
|
33
|
+
array << 'ui-breadcrumb--current' if current?
|
34
|
+
end.join(' ')
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
data/lib/ui/buttons/base.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Ui
|
2
2
|
module Buttons
|
3
3
|
class Base < Component
|
4
|
+
include Stylable
|
5
|
+
|
4
6
|
def show
|
5
7
|
display(
|
6
8
|
text_with_icon(icon),
|
@@ -38,6 +40,22 @@ module Ui
|
|
38
40
|
)
|
39
41
|
end
|
40
42
|
|
43
|
+
def phone
|
44
|
+
display(
|
45
|
+
text_with_icon(phone_icon),
|
46
|
+
"tel:#{path}",
|
47
|
+
button_options
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
def email
|
52
|
+
mail_to(
|
53
|
+
path,
|
54
|
+
text_with_icon(email_icon),
|
55
|
+
button_options
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
41
59
|
private
|
42
60
|
|
43
61
|
def display(*args)
|
@@ -46,7 +64,7 @@ module Ui
|
|
46
64
|
:button,
|
47
65
|
args.first,
|
48
66
|
disabled: true,
|
49
|
-
class:
|
67
|
+
class: style
|
50
68
|
)
|
51
69
|
else
|
52
70
|
if path == '#'
|
@@ -69,13 +87,12 @@ module Ui
|
|
69
87
|
'fas fa-trash'
|
70
88
|
end
|
71
89
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
].compact.join(' ')
|
90
|
+
def phone_icon
|
91
|
+
'fas fa-phone'
|
92
|
+
end
|
93
|
+
|
94
|
+
def email_icon
|
95
|
+
'fas fa-envelope'
|
79
96
|
end
|
80
97
|
|
81
98
|
def size
|
@@ -92,25 +109,40 @@ module Ui
|
|
92
109
|
end
|
93
110
|
|
94
111
|
def text_with_icon(icon)
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
)
|
103
|
-
else
|
104
|
-
text
|
112
|
+
order = [text].tap do |array|
|
113
|
+
case icon_position
|
114
|
+
when 'end'
|
115
|
+
array.push(display_icon(icon))
|
116
|
+
else
|
117
|
+
array.unshift(display_icon(icon))
|
118
|
+
end
|
105
119
|
end
|
120
|
+
|
121
|
+
render_group(order)
|
122
|
+
end
|
123
|
+
|
124
|
+
def display_icon(icon)
|
125
|
+
content_tag(:i, nil, class: icon) unless icon.blank?
|
106
126
|
end
|
107
127
|
|
108
|
-
def
|
109
|
-
|
128
|
+
def component_style
|
129
|
+
[
|
130
|
+
'button',
|
131
|
+
size,
|
132
|
+
].join(' ')
|
110
133
|
end
|
111
134
|
|
112
135
|
def icon
|
113
|
-
|
136
|
+
icon_options.fetch(:style, '')
|
137
|
+
end
|
138
|
+
|
139
|
+
def icon_position
|
140
|
+
icon_options.fetch(:position, 'start')
|
141
|
+
end
|
142
|
+
|
143
|
+
def icon_options
|
144
|
+
opts = options.fetch(:icon, {})
|
145
|
+
opts.is_a?(Hash) ? opts : { style: opts }
|
114
146
|
end
|
115
147
|
|
116
148
|
def path
|
@@ -135,7 +167,7 @@ module Ui
|
|
135
167
|
|
136
168
|
def button_options
|
137
169
|
{
|
138
|
-
class:
|
170
|
+
class: style,
|
139
171
|
disabled: disabled?,
|
140
172
|
data: data,
|
141
173
|
method: method
|
data/lib/ui/buttons/primary.rb
CHANGED
data/lib/ui/buttons/secondary.rb
CHANGED
data/lib/ui/buttons/tertiary.rb
CHANGED
data/lib/ui/card.rb
CHANGED
data/lib/ui/collapse.rb
CHANGED
data/lib/ui/collapse/panel.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Ui
|
2
2
|
class Collapse < Component
|
3
3
|
class Panel < Component
|
4
|
+
include Actionable
|
5
|
+
|
4
6
|
def show
|
5
7
|
render
|
6
8
|
end
|
@@ -18,11 +20,11 @@ module Ui
|
|
18
20
|
end
|
19
21
|
|
20
22
|
def header
|
21
|
-
|
23
|
+
display(model[0])
|
22
24
|
end
|
23
25
|
|
24
26
|
def content
|
25
|
-
|
27
|
+
display(model[1])
|
26
28
|
end
|
27
29
|
|
28
30
|
def display(item)
|
@@ -1,16 +1,17 @@
|
|
1
1
|
<article
|
2
2
|
class="ui-collapse-panel"
|
3
3
|
data-controller="collapsable"
|
4
|
-
data-collapsable-collapsed-value="
|
4
|
+
data-collapsable-collapsed-value="true"
|
5
5
|
data-collapsable-hidden-class="hidden"
|
6
6
|
data-collapsable-collapsed-class="ui-collapsed">
|
7
7
|
|
8
|
-
<header data-action="click->collapsable#toggle">
|
8
|
+
<header data-action="click->collapsable#toggle" class="ui-collapse-panel__header">
|
9
9
|
<%= collapse_icon %>
|
10
10
|
<%= header %>
|
11
|
+
<%= actions %>
|
11
12
|
</header>
|
12
13
|
|
13
|
-
<
|
14
|
+
<section data-collapsable-target="content" class="ui-collapse-panel__content">
|
14
15
|
<%= content %>
|
15
|
-
</
|
16
|
+
</section>
|
16
17
|
</article>
|
data/lib/ui/component.rb
CHANGED
@@ -6,10 +6,15 @@ module Ui
|
|
6
6
|
include ActionView::Context
|
7
7
|
|
8
8
|
VIEWPATH = Pathname.new(__FILE__).join("../..")
|
9
|
-
self.view_paths
|
9
|
+
self.view_paths << VIEWPATH
|
10
10
|
|
11
11
|
def capture(*args)
|
12
|
-
yield(*args)
|
12
|
+
content = yield(*args)
|
13
|
+
if content.is_a?(String)
|
14
|
+
content.html_safe
|
15
|
+
else
|
16
|
+
content
|
17
|
+
end
|
13
18
|
end
|
14
19
|
|
15
20
|
def render_group(items)
|
data/lib/ui/descriptive_list.rb
CHANGED
@@ -25,14 +25,14 @@ module Ui
|
|
25
25
|
content_tag(
|
26
26
|
:header,
|
27
27
|
render_group([
|
28
|
-
|
29
|
-
|
28
|
+
options[:header],
|
29
|
+
actions
|
30
30
|
])
|
31
|
-
) if
|
31
|
+
) if display_header?
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
35
|
-
options[:
|
34
|
+
def display_header?
|
35
|
+
options[:header] || has_actions?
|
36
36
|
end
|
37
37
|
|
38
38
|
def items
|
@@ -5,19 +5,33 @@ module Ui
|
|
5
5
|
content_tag(
|
6
6
|
:div,
|
7
7
|
render_group([
|
8
|
-
content_tag(:dt,
|
9
|
-
content_tag(:dd, value
|
8
|
+
content_tag(:dt, item_title),
|
9
|
+
content_tag(:dd, value)
|
10
10
|
]),
|
11
11
|
class: 'ui-descriptive-list__item'
|
12
12
|
)
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
15
|
+
def value
|
16
|
+
render_group([
|
17
|
+
display(item_value)
|
18
|
+
])
|
19
|
+
end
|
20
|
+
|
21
|
+
def display(value)
|
22
|
+
if value.is_a?(Proc)
|
23
|
+
value.call
|
24
|
+
else
|
25
|
+
value
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def item_title
|
16
30
|
model[0]
|
17
31
|
end
|
18
32
|
|
19
|
-
def
|
20
|
-
model[1]
|
33
|
+
def item_value
|
34
|
+
model[1]
|
21
35
|
end
|
22
36
|
end
|
23
37
|
end
|
data/lib/ui/dropdown.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module Ui
|
2
2
|
class Dropdown < Component
|
3
|
+
include Stylable
|
4
|
+
|
3
5
|
Modes = Types::String.enum(
|
4
6
|
'click',
|
5
7
|
'hover'
|
@@ -18,5 +20,9 @@ module Ui
|
|
18
20
|
def mode
|
19
21
|
Modes[options.fetch(:mode, 'click')]
|
20
22
|
end
|
23
|
+
|
24
|
+
def component_style
|
25
|
+
"ui-dropdown"
|
26
|
+
end
|
21
27
|
end
|
22
28
|
end
|
data/lib/ui/dropdown/show.erb
CHANGED
data/lib/ui/empty/show.erb
CHANGED
data/lib/ui/engine.rb
CHANGED
data/lib/ui/list.rb
CHANGED
@@ -4,6 +4,7 @@ module Ui
|
|
4
4
|
include Actionable
|
5
5
|
|
6
6
|
Renderable = Types.Interface(:call)
|
7
|
+
ListItems = Types.Interface(:each, :map, :any?)
|
7
8
|
|
8
9
|
def show
|
9
10
|
render
|
@@ -11,21 +12,32 @@ module Ui
|
|
11
12
|
|
12
13
|
private
|
13
14
|
|
15
|
+
def list_data
|
16
|
+
begin
|
17
|
+
ListItems[model]
|
18
|
+
rescue Dry::Types::ConstraintError
|
19
|
+
raise Ui::Errors::InvalidListItems.new(
|
20
|
+
"List items for #{self.class.to_s} are invalid. Ensure you are passing " \
|
21
|
+
"an empty array or array of items that will be passed to the item renderer"
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
14
26
|
def list
|
15
27
|
content_tag(:ul, list_items)
|
16
28
|
end
|
17
29
|
|
18
30
|
def list_items
|
19
|
-
if
|
20
|
-
render_group(
|
31
|
+
if rendered_items.any?
|
32
|
+
render_group(rendered_items)
|
21
33
|
else
|
22
34
|
render_empty
|
23
35
|
end
|
24
36
|
end
|
25
37
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
38
|
+
def rendered_items
|
39
|
+
list_data.map do |item|
|
40
|
+
item_renderer.call(item)
|
29
41
|
end
|
30
42
|
end
|
31
43
|
|
@@ -46,8 +58,8 @@ module Ui
|
|
46
58
|
) if options[:footer]
|
47
59
|
end
|
48
60
|
|
49
|
-
def
|
50
|
-
Renderable[options.fetch(:
|
61
|
+
def item_renderer
|
62
|
+
Renderable[options.fetch(:item_renderer, default_renderable)]
|
51
63
|
end
|
52
64
|
|
53
65
|
def default_renderable
|
@@ -68,6 +80,10 @@ module Ui
|
|
68
80
|
end
|
69
81
|
|
70
82
|
def empty
|
83
|
+
options.fetch(:empty, default_empty)
|
84
|
+
end
|
85
|
+
|
86
|
+
def default_empty
|
71
87
|
cell(
|
72
88
|
Ui::Empty,
|
73
89
|
nil
|
data/lib/ui/menu/item.rb
CHANGED
data/lib/ui/pagination/window.rb
CHANGED
@@ -9,7 +9,7 @@ module Ui
|
|
9
9
|
:ul,
|
10
10
|
render_group([
|
11
11
|
previous_window,
|
12
|
-
page_links
|
12
|
+
page_links,
|
13
13
|
next_window
|
14
14
|
]),
|
15
15
|
class: 'ui-pagination__window',
|
@@ -58,15 +58,17 @@ module Ui
|
|
58
58
|
|
59
59
|
|
60
60
|
def page_links
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
61
|
+
render_group(
|
62
|
+
pages.map do |page|
|
63
|
+
content_tag(
|
64
|
+
:li,
|
65
|
+
cell(
|
66
|
+
Ui::Pagination::PageLink,
|
67
|
+
page
|
68
|
+
).()
|
69
|
+
)
|
70
|
+
end
|
71
|
+
)
|
70
72
|
end
|
71
73
|
|
72
74
|
def last_window?
|
data/lib/ui/table.rb
CHANGED
@@ -1,10 +1,21 @@
|
|
1
1
|
require "ui/table/header"
|
2
2
|
require "ui/table/row"
|
3
|
+
require "ui/table/vertical"
|
3
4
|
|
4
5
|
module Ui
|
5
6
|
class Table < Component
|
6
7
|
include Actionable
|
7
8
|
include Stylable
|
9
|
+
include ::Cell::Builder
|
10
|
+
|
11
|
+
builds do |model, options|
|
12
|
+
case options.fetch(:orientation, 'horizontal')
|
13
|
+
when 'vertical'
|
14
|
+
Ui::Table::Vertical
|
15
|
+
else
|
16
|
+
self
|
17
|
+
end
|
18
|
+
end
|
8
19
|
|
9
20
|
def show
|
10
21
|
render
|
@@ -22,6 +33,20 @@ module Ui
|
|
22
33
|
end
|
23
34
|
|
24
35
|
def table_headers
|
36
|
+
custom_header_renderer.is_a?(Proc) ?
|
37
|
+
custom_table_headers :
|
38
|
+
default_table_headers
|
39
|
+
end
|
40
|
+
|
41
|
+
def custom_table_headers
|
42
|
+
render_group(
|
43
|
+
columns.map do |column|
|
44
|
+
custom_header_renderer.call(column)
|
45
|
+
end
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
def default_table_headers
|
25
50
|
content_tag(:tr) do
|
26
51
|
cell(
|
27
52
|
Ui::Table::Header,
|
@@ -31,31 +56,53 @@ module Ui
|
|
31
56
|
end
|
32
57
|
|
33
58
|
def table_rows
|
34
|
-
if
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
columns: columns
|
39
|
-
)
|
59
|
+
if model.any?
|
60
|
+
custom_row_renderer.is_a?(Proc) ?
|
61
|
+
custom_table_rows :
|
62
|
+
default_table_rows
|
40
63
|
else
|
41
64
|
render_empty
|
42
65
|
end
|
43
66
|
end
|
44
67
|
|
68
|
+
def custom_table_rows
|
69
|
+
render_group(
|
70
|
+
model.map do |row|
|
71
|
+
custom_row_renderer.call(row, columns)
|
72
|
+
end
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
def default_table_rows
|
77
|
+
cell(
|
78
|
+
Ui::Table::Row,
|
79
|
+
collection: model,
|
80
|
+
columns: columns
|
81
|
+
).()
|
82
|
+
end
|
83
|
+
|
45
84
|
def table_data_attributes
|
46
85
|
{
|
47
86
|
controller: table_controllers,
|
48
|
-
|
49
|
-
|
50
|
-
|
87
|
+
}.tap do |hash|
|
88
|
+
if selectable?
|
89
|
+
hash["selectable-selected-value"] = "[]"
|
90
|
+
hash["selectable-type-value"] = multi_select? ? 'many' : 'one'
|
91
|
+
end
|
92
|
+
end
|
51
93
|
end
|
52
94
|
|
53
95
|
def table_body_data_attributes
|
54
96
|
{
|
55
97
|
controller: table_body_controllers,
|
56
|
-
|
57
|
-
|
58
|
-
|
98
|
+
}.tap do |hash|
|
99
|
+
if sortable?
|
100
|
+
hash["sortable-update-url-value"] =
|
101
|
+
sortable_options.fetch(:update_url, '#')
|
102
|
+
hash["sortable-input-name-value"] =
|
103
|
+
sortable_options.fetch(:input_name, "object[position]")
|
104
|
+
end
|
105
|
+
end
|
59
106
|
end
|
60
107
|
|
61
108
|
def table_controllers
|
@@ -87,10 +134,6 @@ module Ui
|
|
87
134
|
) if options[:footer]
|
88
135
|
end
|
89
136
|
|
90
|
-
def component_style
|
91
|
-
"ui-table"
|
92
|
-
end
|
93
|
-
|
94
137
|
def columns
|
95
138
|
@columns ||= options.fetch(:columns, Array.new).tap do |columns|
|
96
139
|
columns.unshift(selectable_column) if selectable?
|
@@ -140,8 +183,12 @@ module Ui
|
|
140
183
|
options.fetch(:features, Hash.new)
|
141
184
|
end
|
142
185
|
|
143
|
-
def
|
144
|
-
|
186
|
+
def custom_row_renderer
|
187
|
+
options.fetch(:row_renderer, nil)
|
188
|
+
end
|
189
|
+
|
190
|
+
def custom_header_renderer
|
191
|
+
options.fetch(:header_renderer, nil)
|
145
192
|
end
|
146
193
|
|
147
194
|
def render_empty
|
@@ -158,5 +205,9 @@ module Ui
|
|
158
205
|
colspan: columns.size
|
159
206
|
)
|
160
207
|
end
|
208
|
+
|
209
|
+
def component_style
|
210
|
+
"ui-table ui-table--horizontal"
|
211
|
+
end
|
161
212
|
end
|
162
213
|
end
|
data/lib/ui/table/header.rb
CHANGED
@@ -1,20 +1,30 @@
|
|
1
1
|
module Ui
|
2
2
|
class Table < Component
|
3
3
|
class Header < Component
|
4
|
+
include Stylable
|
5
|
+
|
4
6
|
def show
|
5
|
-
content_tag(:th, title)
|
7
|
+
content_tag(:th, title, class: style)
|
6
8
|
end
|
7
9
|
|
8
10
|
private
|
9
11
|
|
12
|
+
def component_style
|
13
|
+
'ui-table__header'
|
14
|
+
end
|
15
|
+
|
10
16
|
def title
|
11
17
|
case
|
12
|
-
when
|
13
|
-
|
18
|
+
when column_title.is_a?(Proc)
|
19
|
+
column_title.call
|
14
20
|
else
|
15
|
-
|
21
|
+
column_title
|
16
22
|
end
|
17
23
|
end
|
24
|
+
|
25
|
+
def column_title
|
26
|
+
model[0]
|
27
|
+
end
|
18
28
|
end
|
19
29
|
end
|
20
30
|
end
|
data/lib/ui/table/row.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
1
|
module Ui
|
2
2
|
class Table < Component
|
3
3
|
class Row < Component
|
4
|
+
include Stylable
|
5
|
+
|
4
6
|
def show
|
5
|
-
content_tag(:tr, render_group(table_data))
|
7
|
+
content_tag(:tr, render_group(table_data), class: style)
|
6
8
|
end
|
7
9
|
|
8
10
|
private
|
9
11
|
|
12
|
+
def component_style
|
13
|
+
'ui-table__row'
|
14
|
+
end
|
15
|
+
|
10
16
|
def table_data
|
11
17
|
columns.map do |column|
|
12
18
|
content_tag(:td, apply(column))
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Ui
|
2
|
+
class Table < Component
|
3
|
+
class Vertical < Table
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def table_rows
|
8
|
+
if model.any?
|
9
|
+
cell(
|
10
|
+
row_renderer,
|
11
|
+
collection: columns[1..-1],
|
12
|
+
data: model
|
13
|
+
)
|
14
|
+
else
|
15
|
+
render_empty
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def table_headers
|
20
|
+
content_tag(:tr) do
|
21
|
+
render_group([
|
22
|
+
content_tag(:th, columns[0].try(:first)),
|
23
|
+
cell(
|
24
|
+
header_renderer,
|
25
|
+
collection: model,
|
26
|
+
column: columns[0],
|
27
|
+
)
|
28
|
+
])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def row_renderer
|
33
|
+
Ui::Table::Vertical::Row
|
34
|
+
end
|
35
|
+
|
36
|
+
def header_renderer
|
37
|
+
Ui::Table::Vertical::Header
|
38
|
+
end
|
39
|
+
|
40
|
+
def component_style
|
41
|
+
"ui-table ui-table--vertical"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Ui
|
2
|
+
class Table < Component
|
3
|
+
class Vertical < Table
|
4
|
+
class Header < Ui::Table::Header
|
5
|
+
def show
|
6
|
+
content_tag(:th, title)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def title
|
12
|
+
case
|
13
|
+
when column[1].is_a?(Proc)
|
14
|
+
column[1].call(model)
|
15
|
+
else
|
16
|
+
model.to_s
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def column
|
21
|
+
options[:column]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Ui
|
2
|
+
class Table < Component
|
3
|
+
class Vertical < Table
|
4
|
+
class Row < Ui::Table::Row
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def table_data
|
9
|
+
data.map do |item|
|
10
|
+
content_tag(:td, apply(item))
|
11
|
+
end.tap do |array|
|
12
|
+
array.unshift(content_tag(:th, column_title))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def apply(item)
|
17
|
+
column[1].call(item)
|
18
|
+
end
|
19
|
+
|
20
|
+
def column
|
21
|
+
model
|
22
|
+
end
|
23
|
+
|
24
|
+
def column_title
|
25
|
+
column[0]
|
26
|
+
end
|
27
|
+
|
28
|
+
def data
|
29
|
+
options.fetch(:data, Array.new)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/ui/types.rb
CHANGED
data/lib/ui/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: organism-ui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nolan Tait
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -156,6 +156,20 @@ dependencies:
|
|
156
156
|
- - "~>"
|
157
157
|
- !ruby/object:Gem::Version
|
158
158
|
version: 11.1.3
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: sqlite3
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - "~>"
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 1.4.2
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - "~>"
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: 1.4.2
|
159
173
|
description: A collection of ui components implemented in cells.
|
160
174
|
email:
|
161
175
|
- nolanjtait@gmail.com
|
@@ -201,6 +215,9 @@ files:
|
|
201
215
|
- lib/ui/empty.rb
|
202
216
|
- lib/ui/empty/show.erb
|
203
217
|
- lib/ui/engine.rb
|
218
|
+
- lib/ui/errors/base.rb
|
219
|
+
- lib/ui/errors/invalid_actions.rb
|
220
|
+
- lib/ui/errors/invalid_list_items.rb
|
204
221
|
- lib/ui/list.rb
|
205
222
|
- lib/ui/list/item.rb
|
206
223
|
- lib/ui/list/show.erb
|
@@ -231,6 +248,9 @@ files:
|
|
231
248
|
- lib/ui/table/select_all.rb
|
232
249
|
- lib/ui/table/show.erb
|
233
250
|
- lib/ui/table/sort.rb
|
251
|
+
- lib/ui/table/vertical.rb
|
252
|
+
- lib/ui/table/vertical/header.rb
|
253
|
+
- lib/ui/table/vertical/row.rb
|
234
254
|
- lib/ui/tooltip.rb
|
235
255
|
- lib/ui/tooltip/show.erb
|
236
256
|
- lib/ui/types.rb
|
@@ -243,7 +263,7 @@ homepage: https://github.com/nolantait/organism-ui
|
|
243
263
|
licenses:
|
244
264
|
- MIT
|
245
265
|
metadata: {}
|
246
|
-
post_install_message:
|
266
|
+
post_install_message:
|
247
267
|
rdoc_options: []
|
248
268
|
require_paths:
|
249
269
|
- lib
|
@@ -259,7 +279,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
259
279
|
version: '0'
|
260
280
|
requirements: []
|
261
281
|
rubygems_version: 3.1.4
|
262
|
-
signing_key:
|
282
|
+
signing_key:
|
263
283
|
specification_version: 4
|
264
284
|
summary: A collection of ui components implemented in cells.
|
265
285
|
test_files: []
|