matestack-ui-bootstrap 1.4.0 → 1.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.
- checksums.yaml +4 -4
- data/README.md +65 -7
- data/app/concepts/matestack/ui/bootstrap/components/accordion.rb +17 -14
- data/app/concepts/matestack/ui/bootstrap/components/alert.rb +1 -1
- data/app/concepts/matestack/ui/bootstrap/components/badge.rb +4 -4
- data/app/concepts/matestack/ui/bootstrap/components/breadcrumb.rb +8 -6
- data/app/concepts/matestack/ui/bootstrap/components/button.rb +18 -3
- data/app/concepts/matestack/ui/bootstrap/components/carousel.rb +15 -14
- data/app/concepts/matestack/ui/bootstrap/components/close.rb +1 -1
- data/app/concepts/matestack/ui/bootstrap/components/collapse.rb +6 -6
- data/app/concepts/matestack/ui/bootstrap/components/dropdown.rb +3 -2
- data/app/concepts/matestack/ui/bootstrap/components/list_group.rb +87 -25
- data/app/concepts/matestack/ui/bootstrap/components/modal.rb +1 -1
- data/app/concepts/matestack/ui/bootstrap/components/navbar.rb +54 -20
- data/app/concepts/matestack/ui/bootstrap/components/pagination.rb +5 -5
- data/app/concepts/matestack/ui/bootstrap/components/popover.rb +1 -1
- data/app/concepts/matestack/ui/bootstrap/components/progress.rb +7 -7
- data/app/concepts/matestack/ui/bootstrap/components/scrollspy.rb +15 -0
- data/app/concepts/matestack/ui/bootstrap/components/spinner.rb +1 -1
- data/app/concepts/matestack/ui/bootstrap/components/tab_nav.rb +4 -2
- data/app/concepts/matestack/ui/bootstrap/components/toast.js +7 -1
- data/app/concepts/matestack/ui/bootstrap/components/tooltip.rb +8 -26
- data/app/concepts/matestack/ui/bootstrap/content/{collection → smart_collection}/collection.rb +18 -16
- data/app/concepts/matestack/ui/bootstrap/content/{collection → smart_collection}/collection.scss +0 -0
- data/app/concepts/matestack/ui/bootstrap/content/{collection → smart_collection}/content.rb +3 -3
- data/app/concepts/matestack/ui/bootstrap/content/{collection → smart_collection}/filter.rb +3 -3
- data/app/concepts/matestack/ui/bootstrap/content/{collection → smart_collection}/paginate.rb +3 -3
- data/app/concepts/matestack/ui/bootstrap/form/checkbox.rb +55 -46
- data/app/concepts/matestack/ui/bootstrap/form/input.rb +5 -16
- data/app/concepts/matestack/ui/bootstrap/form/radio.rb +22 -30
- data/app/concepts/matestack/ui/bootstrap/form/select.rb +12 -33
- data/app/concepts/matestack/ui/bootstrap/form/submit.rb +3 -2
- data/app/concepts/matestack/ui/bootstrap/form/switch.rb +80 -71
- data/app/concepts/matestack/ui/bootstrap/registry.rb +2 -4
- data/app/helpers/matestack/ui/bootstrap/application_helper.rb +9 -5
- data/app/javascript/matestack-ui-bootstrap/index.js +1 -3
- data/app/matestack/bootstrap/form/submit.rb +20 -0
- data/lib/matestack/ui/bootstrap/engine.rb +2 -2
- data/lib/matestack/ui/bootstrap/version.rb +1 -1
- data/lib/tasks/matestack/ui/bootstrap_tasks.rake +25 -25
- metadata +8 -12
- data/app/concepts/matestack/ui/bootstrap/components/chart.js +0 -232
- data/app/concepts/matestack/ui/bootstrap/components/chart.rb +0 -71
- data/app/concepts/matestack/ui/bootstrap/form/date.js +0 -38
- data/app/concepts/matestack/ui/bootstrap/form/date.rb +0 -98
- data/app/concepts/matestack/ui/bootstrap/form/select.haml +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08d09d04a3fd7038133603a6e950ee7aa83903545028028eb518a05a60abf737'
|
4
|
+
data.tar.gz: 5a0bb2d33f779374a167658c884790adc87de8f7e7b9b28282e325b4d2d70ab0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 725e1fda66e9ecc1fbc9aff03a235e009dbe2b81cdf0c5b0ef7f61a472bc573580b326ee8e63df784982a2f5265e7c92d12d3d083e3656c8a6341338b836dbe6
|
7
|
+
data.tar.gz: 24f136ee905fa88d41dcb48a92e311569ae5bbd212cd6b0a76bcae6df118e0b216c6551a6266dbd023bef11c79fd667191e984f3f5edb046537d252f2f6c9a28
|
data/README.md
CHANGED
@@ -1,26 +1,84 @@
|
|
1
1
|
# Matestack Ui Bootstrap
|
2
2
|
|
3
|
+
**Docs and specs in progress, please wait for official release announcement before using this gem**
|
3
4
|
|
4
|
-
##
|
5
|
+
## Development
|
6
|
+
|
7
|
+
### Dummy App
|
8
|
+
|
9
|
+
**initial setup**
|
10
|
+
|
11
|
+
```shell
|
12
|
+
docker-compose build dummy
|
13
|
+
docker-compose run --rm dummy bash
|
14
|
+
```
|
15
|
+
|
16
|
+
inside container:
|
5
17
|
|
6
18
|
```shell
|
7
19
|
bundle install
|
8
20
|
yarn install
|
9
|
-
|
10
|
-
|
11
|
-
|
21
|
+
cd spec/dummy
|
22
|
+
bundle install
|
23
|
+
npm install (npm and not yarn!)
|
24
|
+
rails app:db:setup
|
12
25
|
```
|
13
26
|
|
27
|
+
**dummy app start**
|
28
|
+
|
29
|
+
on your host:
|
14
30
|
```shell
|
15
|
-
|
31
|
+
docker-compose up dummy
|
16
32
|
```
|
17
33
|
|
34
|
+
and
|
35
|
+
|
18
36
|
```shell
|
19
|
-
./bin/webpack --watch
|
37
|
+
docker-compose run --rm dummy sh -c "cd spec/dummy && ./bin/webpack --watch"
|
20
38
|
```
|
21
39
|
|
40
|
+
simultaneously to be able to visit the demo app on [localhost:3000](localhost:3000).
|
41
|
+
|
22
42
|
## Testing
|
23
43
|
|
44
|
+
**initial setup**
|
45
|
+
|
46
|
+
```shell
|
47
|
+
docker-compose build dummy
|
48
|
+
docker-compose run --rm dummy bash
|
49
|
+
```
|
50
|
+
|
51
|
+
inside container:
|
52
|
+
|
53
|
+
```shell
|
54
|
+
bundle install
|
55
|
+
yarn install
|
56
|
+
cd spec/dummy
|
57
|
+
bundle install
|
58
|
+
npm install (npm and not yarn!)
|
59
|
+
rails app:db:setup
|
60
|
+
```
|
61
|
+
|
62
|
+
**test run**
|
63
|
+
|
64
|
+
```shell
|
65
|
+
docker-compose run --rm builder bash
|
66
|
+
|
67
|
+
```
|
68
|
+
|
69
|
+
inside container:
|
70
|
+
|
71
|
+
```shell
|
72
|
+
bundle exec rspec spec/test
|
73
|
+
```
|
74
|
+
|
75
|
+
## Release
|
76
|
+
|
24
77
|
```shell
|
25
|
-
|
78
|
+
docker-compose run --rm builder
|
79
|
+
gem bump ...
|
80
|
+
gem release
|
81
|
+
npm bump ...
|
82
|
+
npm release
|
83
|
+
git tag ...
|
26
84
|
```
|
@@ -2,17 +2,18 @@ class Matestack::Ui::Bootstrap::Components::Accordion < Matestack::Ui::Component
|
|
2
2
|
|
3
3
|
# [ {header: { class, id, text, size, btn_variant, btn_class }, body: { class, text, multi } } ]
|
4
4
|
optional :items # array with 2 Hashes: header and body
|
5
|
+
optional :open
|
6
|
+
optional :variant
|
5
7
|
optional attributes: { as: :bs_attrs }, class: { as: :bs_class }, id: { as: :bs_id }
|
6
8
|
|
7
9
|
def setup
|
8
10
|
@accordion_id = (bs_id.present? ? bs_id : "matestack-accordion-#{SecureRandom.hex(3)}")
|
9
11
|
end
|
12
|
+
|
10
13
|
def response
|
11
14
|
div accordion_attributes do
|
12
|
-
|
13
|
-
|
14
|
-
yield_components
|
15
|
-
end
|
15
|
+
accordion_content_partial if items.present?
|
16
|
+
yield_components
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
@@ -20,17 +21,17 @@ class Matestack::Ui::Bootstrap::Components::Accordion < Matestack::Ui::Component
|
|
20
21
|
|
21
22
|
def accordion_content_partial
|
22
23
|
items.each_with_index do | item, index |
|
23
|
-
div class: "
|
24
|
-
heading
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
div class: "accordion-item" do
|
25
|
+
heading class: "accordion-header #{item[:header][:class]}", id: (item[:header][:id] || "header-#{index}"), size: (item[:header][:size] || 2) do
|
26
|
+
button class: "accordion-button", text:item[:header][:text],
|
27
|
+
data: { "bs-toggle": "collapse", "bs-target": "#collapse-#{(item[:header][:id] || "header-#{index}") }" },
|
28
|
+
attributes: { "aria-expanded": "false", "aria-controls": "collapse-#{(item[:header][:id] || "header-#{index}")}", type: "button" }
|
28
29
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
bs_collapse class: "accordion-collapse #{ 'show' if open || item[:open] }", id: "collapse-#{(item[:header][:id] || "header-#{index}")}", labelledby: (item[:header][:id] || "header-#{index}"),
|
31
|
+
parent: @accordion_id, multi: (item[:body][:multi] || false) do
|
32
|
+
div class: "accordion-body #{item[:body][:class]}" do
|
33
|
+
plain item[:body][:text]
|
34
|
+
end
|
34
35
|
end
|
35
36
|
end
|
36
37
|
end
|
@@ -47,6 +48,8 @@ class Matestack::Ui::Bootstrap::Components::Accordion < Matestack::Ui::Component
|
|
47
48
|
def accordion_classes
|
48
49
|
[].tap do |classes|
|
49
50
|
classes << 'accordion'
|
51
|
+
classes << 'open' if open
|
52
|
+
classes << 'accordion-flush' if variant == :flush
|
50
53
|
classes << bs_class
|
51
54
|
end.join(' ').strip
|
52
55
|
end
|
@@ -7,7 +7,7 @@ class Matestack::Ui::Bootstrap::Components::Alert < Matestack::Ui::VueJsComponen
|
|
7
7
|
def response
|
8
8
|
div alert_attributes do
|
9
9
|
heading size: (title_size || 4), class: 'alert-heading', text: title if title
|
10
|
-
|
10
|
+
plain text if text
|
11
11
|
yield_components
|
12
12
|
bs_close dismiss: "alert" if dismissible
|
13
13
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
class Matestack::Ui::Bootstrap::Components::Badge < Matestack::Ui::Component
|
2
|
-
|
2
|
+
|
3
3
|
optional class: { as: :bs_class }
|
4
|
-
optional :text, :variant, :rounded, :
|
4
|
+
optional :text, :variant, :rounded, :visually_hidden
|
5
5
|
|
6
6
|
def response
|
7
7
|
span badge_attributes do
|
8
8
|
plain text if text
|
9
9
|
yield_components
|
10
10
|
end
|
11
|
-
span class: "
|
11
|
+
span class: "visually-hidden", text: visually_hidden if visually_hidden.present?
|
12
12
|
end
|
13
13
|
|
14
14
|
protected
|
@@ -27,4 +27,4 @@ class Matestack::Ui::Bootstrap::Components::Badge < Matestack::Ui::Component
|
|
27
27
|
classes << bs_class
|
28
28
|
end.join(' ').strip
|
29
29
|
end
|
30
|
-
end
|
30
|
+
end
|
@@ -4,20 +4,22 @@ class Matestack::Ui::Bootstrap::Components::Breadcrumb < Matestack::Ui::Componen
|
|
4
4
|
optional class: { as: :bs_class} # adding custom class to breadcrumb list
|
5
5
|
optional :nav_class
|
6
6
|
|
7
|
-
def response
|
7
|
+
def response
|
8
8
|
nav class: nav_class, attributes: { 'aria-label': "breadcrumb" } do
|
9
|
-
ol breadcrumb_attributes do
|
9
|
+
ol breadcrumb_attributes do
|
10
10
|
items&.each_with_index do |item, index|
|
11
11
|
li link_attrs((items.size - 1) == index) do
|
12
12
|
case item[:type]
|
13
13
|
when :link
|
14
|
-
link
|
14
|
+
link item
|
15
|
+
when :transition
|
16
|
+
transition item
|
15
17
|
else
|
16
|
-
|
18
|
+
plain item[:text]
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
20
|
-
yield_components
|
22
|
+
yield_components
|
21
23
|
end
|
22
24
|
end
|
23
25
|
end
|
@@ -43,4 +45,4 @@ class Matestack::Ui::Bootstrap::Components::Breadcrumb < Matestack::Ui::Componen
|
|
43
45
|
classes << bs_class
|
44
46
|
end.join(' ').strip
|
45
47
|
end
|
46
|
-
end
|
48
|
+
end
|
@@ -2,11 +2,26 @@ class Matestack::Ui::Bootstrap::Components::Button < Matestack::Ui::Component
|
|
2
2
|
|
3
3
|
optional :text, :type, :variant, :size, :outline
|
4
4
|
optional attributes: { as: :bs_attrs }, class: { as: :bs_class }
|
5
|
-
optional :
|
5
|
+
optional transition: { as: :bs_btn_transition }
|
6
|
+
optional action: { as: :bs_btn_action }
|
7
|
+
optional onclick: { as: :bs_btn_onclick }
|
8
|
+
optional link: { as: :bs_btn_link }
|
6
9
|
|
7
10
|
def response
|
8
|
-
if
|
9
|
-
transition button_attributes.merge({
|
11
|
+
if bs_btn_transition.present? && bs_btn_transition.is_a?(Hash)
|
12
|
+
transition button_attributes.merge(bs_btn_transition.merge({attributes: { role: "button"} })) do
|
13
|
+
inner_response
|
14
|
+
end
|
15
|
+
elsif bs_btn_action.present? && bs_btn_action.is_a?(Hash)
|
16
|
+
action button_attributes.merge(bs_btn_action.merge({attributes: { role: "button"} })) do
|
17
|
+
inner_response
|
18
|
+
end
|
19
|
+
elsif bs_btn_onclick.present? && bs_btn_onclick.is_a?(Hash)
|
20
|
+
onclick button_attributes.merge(bs_btn_onclick.merge({attributes: { role: "button"} })) do
|
21
|
+
inner_response
|
22
|
+
end
|
23
|
+
elsif bs_btn_link.present? && bs_btn_link.is_a?(Hash)
|
24
|
+
link button_attributes.merge(bs_btn_link.merge({attributes: { role: "button"} })) do
|
10
25
|
inner_response
|
11
26
|
end
|
12
27
|
else
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Matestack::Ui::Bootstrap::Components::Carousel < Matestack::Ui::VueJsComponent
|
2
|
-
vue_js_component_name "matestack-ui-bootstrap-carousel"
|
3
|
-
|
4
|
-
optional :start, :controls, :indicators, :fade, :interval
|
2
|
+
vue_js_component_name "matestack-ui-bootstrap-carousel"
|
3
|
+
|
4
|
+
optional :start, :controls, :indicators, :fade, :interval, :variant
|
5
5
|
optional :items, class: { as: :bs_class }
|
6
6
|
# possible keys for items: path, title, text, interval
|
7
7
|
# event trigger
|
@@ -10,7 +10,7 @@ class Matestack::Ui::Bootstrap::Components::Carousel < Matestack::Ui::VueJsCompo
|
|
10
10
|
def setup
|
11
11
|
@component_config["carousel-id"] = carousel_id
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def response
|
15
15
|
div carousel_attributes do
|
16
16
|
# carousel indicator
|
@@ -29,7 +29,7 @@ class Matestack::Ui::Bootstrap::Components::Carousel < Matestack::Ui::VueJsCompo
|
|
29
29
|
def indicator_partial
|
30
30
|
ol class: "carousel-indicators" do
|
31
31
|
items.size.times do |index|
|
32
|
-
li data: { target: carousel_id, 'slide-to': index },
|
32
|
+
li data: { "bs-target": "##{carousel_id}", 'bs-slide-to': index },
|
33
33
|
class: "#{'active' if index == (start || 0) }"
|
34
34
|
end
|
35
35
|
end
|
@@ -37,8 +37,8 @@ class Matestack::Ui::Bootstrap::Components::Carousel < Matestack::Ui::VueJsCompo
|
|
37
37
|
|
38
38
|
def carousel_partial
|
39
39
|
items.each_with_index do |item, index|
|
40
|
-
div class: "carousel-item #{'active' if index == (start || 0) } #{item[:class]}".strip,
|
41
|
-
data: { interval: item[:interval] } do
|
40
|
+
div class: "carousel-item #{'active' if index == (start || 0) } #{item[:class]}".strip,
|
41
|
+
data: { "bs-interval": item[:interval] } do
|
42
42
|
img class: "d-block w-100", path: item[:path]
|
43
43
|
if item[:title] || item[:text]
|
44
44
|
div class: "carousel-caption d-none d-md-block #{item[:title_class]}" do
|
@@ -51,13 +51,13 @@ class Matestack::Ui::Bootstrap::Components::Carousel < Matestack::Ui::VueJsCompo
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def controls_partial
|
54
|
-
link class: "carousel-control-prev",
|
54
|
+
link class: "carousel-control-prev", data: { "bs-target": "##{carousel_id}", "bs-slide": :prev }, attributes: { 'role': "button" } do
|
55
55
|
span class: "carousel-control-prev-icon", attributes: { 'aria-hidden': "true" }
|
56
|
-
span class: "
|
56
|
+
span class: "visually-hidden", text: "Previous"
|
57
57
|
end
|
58
|
-
link class: "carousel-control-next",
|
58
|
+
link class: "carousel-control-next", data: { "bs-target": "##{carousel_id}", "bs-slide": :next }, attributes: { 'role': "button" } do
|
59
59
|
span class: "carousel-control-next-icon", attributes: { 'aria-hidden': "true" }
|
60
|
-
span class: "
|
60
|
+
span class: "visually-hidden", text: "Next"
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
@@ -65,7 +65,7 @@ class Matestack::Ui::Bootstrap::Components::Carousel < Matestack::Ui::VueJsCompo
|
|
65
65
|
html_attributes.merge(
|
66
66
|
id: carousel_id,
|
67
67
|
class: carousel_classes,
|
68
|
-
data: { ride: 'carousel', interval: (interval || 5000) }
|
68
|
+
data: { "bs-ride": 'carousel', "bs-interval": (interval || 5000) }
|
69
69
|
)
|
70
70
|
end
|
71
71
|
|
@@ -73,7 +73,8 @@ class Matestack::Ui::Bootstrap::Components::Carousel < Matestack::Ui::VueJsCompo
|
|
73
73
|
[].tap do |classes|
|
74
74
|
classes << 'carousel slide'
|
75
75
|
classes << 'carousel-fade' if fade
|
76
|
-
|
76
|
+
classes << 'carousel-dark' if variant == :dark
|
77
|
+
#custom classes
|
77
78
|
classes << bs_class
|
78
79
|
end.join(' ').strip
|
79
80
|
end
|
@@ -82,4 +83,4 @@ class Matestack::Ui::Bootstrap::Components::Carousel < Matestack::Ui::VueJsCompo
|
|
82
83
|
@carousel_id ||= "matestack-carousel-#{SecureRandom.hex}"
|
83
84
|
end
|
84
85
|
|
85
|
-
end
|
86
|
+
end
|
@@ -14,7 +14,7 @@ class Matestack::Ui::Bootstrap::Components::Close < Matestack::Ui::Component
|
|
14
14
|
def close_attributes
|
15
15
|
html_attributes.merge(
|
16
16
|
class: close_classes,
|
17
|
-
data: { dismiss: "#{dismiss}" },
|
17
|
+
data: { "bs-dismiss": "#{dismiss}" },
|
18
18
|
type: 'button',
|
19
19
|
attributes: (attributes || {}).merge({ 'aria-label': 'Close' })
|
20
20
|
)
|
@@ -1,12 +1,12 @@
|
|
1
1
|
class Matestack::Ui::Bootstrap::Components::Collapse < Matestack::Ui::VueJsComponent
|
2
|
-
vue_js_component_name "matestack-ui-bootstrap-collapse"
|
3
|
-
|
2
|
+
vue_js_component_name "matestack-ui-bootstrap-collapse"
|
3
|
+
|
4
4
|
optional :multi, :labelledby, :parent, class: { as: :bs_class }
|
5
5
|
optional :card # possible keys: class, text
|
6
6
|
# event trigger
|
7
7
|
optional :toggle_on, :show_on, :hide_on, :dispose_on
|
8
8
|
|
9
|
-
def response
|
9
|
+
def response
|
10
10
|
div collapse_attributes do
|
11
11
|
card_partial if card
|
12
12
|
yield_components
|
@@ -25,7 +25,7 @@ class Matestack::Ui::Bootstrap::Components::Collapse < Matestack::Ui::VueJsCompo
|
|
25
25
|
def collapse_attributes
|
26
26
|
html_attributes.merge(
|
27
27
|
class: collapse_classes,
|
28
|
-
data: { parent: parent },
|
28
|
+
data: { "bs-parent": parent },
|
29
29
|
attributes: { 'aria-labelledby': "#{labelledby}" }
|
30
30
|
)
|
31
31
|
end
|
@@ -35,9 +35,9 @@ class Matestack::Ui::Bootstrap::Components::Collapse < Matestack::Ui::VueJsCompo
|
|
35
35
|
classes << 'collapse'
|
36
36
|
# mulit target
|
37
37
|
classes << 'multi-collapse' if multi
|
38
|
-
#custom classes
|
38
|
+
#custom classes
|
39
39
|
classes << bs_class
|
40
40
|
end.join(' ').strip
|
41
41
|
end
|
42
42
|
|
43
|
-
end
|
43
|
+
end
|
@@ -30,7 +30,7 @@ class Matestack::Ui::Bootstrap::Components::Dropdown < Matestack::Ui::VueJsCompo
|
|
30
30
|
def split_btn_partial
|
31
31
|
slot slots[:split_btn]
|
32
32
|
bs_btn btn_attributes do
|
33
|
-
span class:"
|
33
|
+
span class:"visually-hidden" do plain "Toggle Dropdown" end
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -47,6 +47,8 @@ class Matestack::Ui::Bootstrap::Components::Dropdown < Matestack::Ui::VueJsCompo
|
|
47
47
|
li do transition item.merge(class: "dropdown-item #{item[:class]}") end
|
48
48
|
when :action
|
49
49
|
li do action item.merge(class: "dropdown-item #{item[:class]}") do plain item[:text] end end
|
50
|
+
when :onclick
|
51
|
+
li do onclick item.merge(class: "dropdown-item #{item[:class]}", attributes: { style: "cursor: pointer;" }) do plain item[:text] end end
|
50
52
|
else
|
51
53
|
span class: "dropdown-item-text" do plain item[:text] end
|
52
54
|
end
|
@@ -99,7 +101,6 @@ class Matestack::Ui::Bootstrap::Components::Dropdown < Matestack::Ui::VueJsCompo
|
|
99
101
|
def menu_attributes
|
100
102
|
{
|
101
103
|
class: menu_classes,
|
102
|
-
data: { toggle: 'dropdown' },
|
103
104
|
attributes: { 'aria-labelledby': bs_id }
|
104
105
|
}
|
105
106
|
end
|
@@ -1,50 +1,87 @@
|
|
1
1
|
class Matestack::Ui::Bootstrap::Components::ListGroup < Matestack::Ui::Component
|
2
2
|
html_attributes :role
|
3
3
|
|
4
|
-
|
5
|
-
optional :items
|
4
|
+
optional :items
|
6
5
|
optional :horizontal, :horizontal_size, :checkbox
|
7
|
-
optional :
|
6
|
+
optional :variant, class: { as: :bs_class }
|
8
7
|
|
9
8
|
|
10
|
-
def response
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
def response
|
10
|
+
if actionable_items?
|
11
|
+
div list_group_attributes do
|
12
|
+
yield_components unless items
|
13
|
+
list_partial if items
|
14
|
+
end
|
15
|
+
else
|
16
|
+
ul list_group_attributes do
|
17
|
+
yield_components unless items
|
18
|
+
list_partial if items
|
19
|
+
end
|
14
20
|
end
|
15
21
|
end
|
16
22
|
|
17
23
|
protected
|
18
24
|
|
25
|
+
def actionable_items?
|
26
|
+
if items.present?
|
27
|
+
items.any? { |item| [:tab, :transition, :action, :link].include?(item[:type]) }
|
28
|
+
else
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def tab_nav?
|
34
|
+
if items.present?
|
35
|
+
items.any? { |item| item[:type] == :tab }
|
36
|
+
else
|
37
|
+
false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
19
41
|
def list_partial
|
20
42
|
items.each do |item|
|
21
|
-
case item[:type]
|
22
|
-
when :link
|
43
|
+
case item[:type]
|
44
|
+
when :link
|
23
45
|
link link_attrs(item) do
|
24
|
-
|
46
|
+
text_rendering(item)
|
47
|
+
end
|
48
|
+
when :tab
|
49
|
+
link tab_attrs(item) do
|
50
|
+
text_rendering(item)
|
25
51
|
end
|
26
|
-
when :transition
|
27
|
-
transition
|
28
|
-
|
52
|
+
when :transition
|
53
|
+
transition transition_attrs(item) do
|
54
|
+
text_rendering(item)
|
29
55
|
end
|
30
|
-
when :
|
56
|
+
when :action
|
57
|
+
action action_attrs(item) do
|
58
|
+
text_rendering(item)
|
59
|
+
end
|
60
|
+
when :label
|
31
61
|
label id: item[:id], class: "#{list_classes item, false}" do
|
32
62
|
input class: "form-check-input me-1", attributes: { 'type': "checkbox", 'value': "" } if checkbox
|
33
|
-
|
63
|
+
text_rendering(item)
|
34
64
|
end
|
35
65
|
else
|
36
|
-
li id: item[:id], class: "#{list_classes item, false}" do
|
37
|
-
|
38
|
-
|
66
|
+
li id: item[:id], class: "#{list_classes item, false}", attributes: { "aria-disabled": "#{true if item[:disabled]}" } do
|
67
|
+
# this implementation is useless, would need to be connected to a form through bs_form_checkbox
|
68
|
+
# input class: "form-check-input me-1", attributes: { 'type': "checkbox", 'value': "", 'aria-label': "#{item[:text]}" } if checkbox
|
69
|
+
text_rendering(item)
|
70
|
+
bs_badge variant: :primary, rounded: true, text: item[:badge] if item[:badge]
|
39
71
|
end
|
40
72
|
end
|
41
73
|
end
|
42
74
|
end
|
43
75
|
|
76
|
+
def text_rendering(item)
|
77
|
+
bs_icon name: item[:icon] if item[:icon]
|
78
|
+
plain item[:text]
|
79
|
+
end
|
80
|
+
|
44
81
|
def list_group_attributes
|
45
82
|
attributes = {}.tap do |hash|
|
46
83
|
hash[:class] = list_group_classes
|
47
|
-
hash[:attributes] = { role: "tablist" } if
|
84
|
+
hash[:attributes] = { role: "tablist" } if tab_nav?
|
48
85
|
end
|
49
86
|
html_attributes.merge(
|
50
87
|
attributes
|
@@ -55,29 +92,54 @@ class Matestack::Ui::Bootstrap::Components::ListGroup < Matestack::Ui::Component
|
|
55
92
|
[].tap do |classes|
|
56
93
|
classes << 'list-group'
|
57
94
|
classes << (horizontal_size.present? ? "list-group-horizontal-#{horizontal_size}": "list-group-horizontal") if horizontal
|
58
|
-
classes << 'list-group-flush' if flush
|
95
|
+
classes << 'list-group-flush' if variant == :flush
|
59
96
|
classes << bs_class
|
60
97
|
end.join(' ').strip
|
61
98
|
end
|
62
99
|
|
63
100
|
def link_attrs(item)
|
101
|
+
attrs = item
|
102
|
+
attrs[:class] = "#{list_classes item, true}"
|
103
|
+
attrs[:attributes] = { "aria-disabled": "#{true if item[:disabled]}" } if item[:disabled]
|
104
|
+
attrs
|
105
|
+
end
|
106
|
+
|
107
|
+
def tab_attrs(item)
|
64
108
|
{}.tap do |hash|
|
65
|
-
hash[:id] = item[:id]
|
109
|
+
hash[:id] = "tab-#{item[:id]}" if tab_nav?
|
66
110
|
hash[:class] = "#{list_classes item, true}"
|
67
|
-
hash[:data] = { toggle: "list" }
|
68
|
-
hash[:attributes] = {
|
69
|
-
hash[:
|
111
|
+
hash[:data] = { "bs-toggle": "list" }
|
112
|
+
hash[:attributes] = { "aria-disabled": "#{true if item[:disabled]}" } if item[:disabled]
|
113
|
+
hash[:attributes] = { 'aria-controls': "#tab-#{item[:id]}-content", role: "tab" }
|
114
|
+
hash[:path] = "#tab-#{item[:id]}-content"
|
115
|
+
hash[:target] = item[:target]
|
70
116
|
end
|
71
117
|
end
|
72
118
|
|
119
|
+
def transition_attrs(item)
|
120
|
+
attrs = item
|
121
|
+
attrs[:class] = "#{list_classes item, true}"
|
122
|
+
attrs[:attributes] = { "aria-disabled": "#{true if item[:disabled]}" } if item[:disabled]
|
123
|
+
attrs
|
124
|
+
end
|
125
|
+
|
126
|
+
def action_attrs(item)
|
127
|
+
attrs = item
|
128
|
+
attrs[:class] = "#{list_classes item, true}"
|
129
|
+
attrs[:attributes] = { "aria-disabled": "#{true if item[:disabled]}" } if item[:disabled]
|
130
|
+
attrs
|
131
|
+
end
|
132
|
+
|
73
133
|
def list_classes(item, action)
|
74
134
|
[].tap do |classes|
|
75
135
|
classes << 'list-group-item'
|
76
136
|
classes << 'list-group-item-action' if action
|
77
137
|
classes << "list-group-item-#{item[:variant]}" if item[:variant].present?
|
78
138
|
classes << 'active' if item[:active]
|
139
|
+
classes << 'disabled' if item[:disabled]
|
140
|
+
classes << 'd-flex justify-content-between align-items-center' if item[:badge].present?
|
79
141
|
classes << item[:class]
|
80
142
|
end.join(' ').strip
|
81
143
|
end
|
82
144
|
|
83
|
-
end
|
145
|
+
end
|