organism-ui 0.2.1
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/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +35 -0
- data/app/assets/config/ui_manifest.js +1 -0
- data/app/assets/stylesheets/ui/application.css +15 -0
- data/app/controllers/ui/application_controller.rb +7 -0
- data/app/controllers/ui/style_guide_controller.rb +8 -0
- data/app/helpers/ui/application_helper.rb +4 -0
- data/app/javascript/ui/application.js +1 -0
- data/app/jobs/ui/application_job.rb +4 -0
- data/app/mailers/ui/application_mailer.rb +6 -0
- data/app/models/ui/application_record.rb +5 -0
- data/app/views/ui/style_guide/show.html.erb +1035 -0
- data/config/routes.rb +3 -0
- data/lib/tasks/ui_tasks.rake +4 -0
- data/lib/ui.rb +64 -0
- data/lib/ui/actionable.rb +19 -0
- data/lib/ui/breadcrumbs.rb +31 -0
- data/lib/ui/breadcrumbs/breadcrumb.rb +36 -0
- data/lib/ui/breadcrumbs/crumb.rb +15 -0
- data/lib/ui/buttons/base.rb +146 -0
- data/lib/ui/buttons/primary.rb +11 -0
- data/lib/ui/buttons/secondary.rb +11 -0
- data/lib/ui/buttons/tertiary.rb +11 -0
- data/lib/ui/card.rb +36 -0
- data/lib/ui/card/show.erb +16 -0
- data/lib/ui/collapse.rb +24 -0
- data/lib/ui/collapse/panel.rb +37 -0
- data/lib/ui/collapse/panel/show.erb +16 -0
- data/lib/ui/component.rb +23 -0
- data/lib/ui/descriptive_list.rb +50 -0
- data/lib/ui/descriptive_list/item.rb +24 -0
- data/lib/ui/descriptive_list/show.erb +7 -0
- data/lib/ui/dropdown.rb +22 -0
- data/lib/ui/dropdown/show.erb +13 -0
- data/lib/ui/empty.rb +36 -0
- data/lib/ui/empty/show.erb +11 -0
- data/lib/ui/engine.rb +13 -0
- data/lib/ui/list.rb +77 -0
- data/lib/ui/list/item.rb +9 -0
- data/lib/ui/list/show.erb +5 -0
- data/lib/ui/menu.rb +29 -0
- data/lib/ui/menu/callable.rb +11 -0
- data/lib/ui/menu/item.rb +39 -0
- data/lib/ui/menu/show.erb +4 -0
- data/lib/ui/menu/submenu.rb +55 -0
- data/lib/ui/notification.rb +37 -0
- data/lib/ui/notification/show.erb +19 -0
- data/lib/ui/page_header.rb +29 -0
- data/lib/ui/page_header/show.erb +18 -0
- data/lib/ui/pagination.rb +105 -0
- data/lib/ui/pagination/page_link.rb +24 -0
- data/lib/ui/pagination/show.erb +11 -0
- data/lib/ui/pagination/window.rb +85 -0
- data/lib/ui/step.rb +57 -0
- data/lib/ui/step/show.erb +13 -0
- data/lib/ui/steps.rb +67 -0
- data/lib/ui/steps/show.erb +5 -0
- data/lib/ui/stylable.rb +21 -0
- data/lib/ui/table.rb +162 -0
- data/lib/ui/table/header.rb +20 -0
- data/lib/ui/table/row.rb +25 -0
- data/lib/ui/table/select.rb +16 -0
- data/lib/ui/table/select/many.rb +38 -0
- data/lib/ui/table/select/one.rb +38 -0
- data/lib/ui/table/select_all.rb +36 -0
- data/lib/ui/table/show.erb +5 -0
- data/lib/ui/table/sort.rb +19 -0
- data/lib/ui/tooltip.rb +35 -0
- data/lib/ui/tooltip/show.erb +14 -0
- data/lib/ui/types.rb +7 -0
- data/lib/ui/value.rb +4 -0
- data/lib/ui/version.rb +3 -0
- data/lib/ui/wizard.rb +87 -0
- data/lib/ui/wizard/content.rb +20 -0
- data/lib/ui/wizard/show.erb +10 -0
- metadata +265 -0
data/config/routes.rb
ADDED
data/lib/ui.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require "ui/engine"
|
2
|
+
require "cells"
|
3
|
+
require "cells-erb"
|
4
|
+
require "cells-rails"
|
5
|
+
require 'dry-struct'
|
6
|
+
|
7
|
+
require "ui/types"
|
8
|
+
require "ui/value"
|
9
|
+
|
10
|
+
require "ui/actionable"
|
11
|
+
require "ui/stylable"
|
12
|
+
require "ui/component"
|
13
|
+
|
14
|
+
require "ui/buttons/base"
|
15
|
+
require "ui/buttons/primary"
|
16
|
+
require "ui/buttons/secondary"
|
17
|
+
require "ui/buttons/tertiary"
|
18
|
+
|
19
|
+
require "ui/breadcrumbs"
|
20
|
+
require "ui/breadcrumbs/crumb"
|
21
|
+
require 'ui/breadcrumbs/breadcrumb'
|
22
|
+
|
23
|
+
require "ui/page_header"
|
24
|
+
|
25
|
+
require "ui/menu"
|
26
|
+
require "ui/menu/item"
|
27
|
+
require "ui/menu/callable"
|
28
|
+
require "ui/menu/submenu"
|
29
|
+
|
30
|
+
require "ui/dropdown"
|
31
|
+
|
32
|
+
require "ui/pagination"
|
33
|
+
require "ui/pagination/page_link"
|
34
|
+
require "ui/pagination/window"
|
35
|
+
|
36
|
+
require "ui/steps"
|
37
|
+
require "ui/step"
|
38
|
+
|
39
|
+
require "ui/wizard"
|
40
|
+
require "ui/wizard/content"
|
41
|
+
|
42
|
+
require "ui/card"
|
43
|
+
|
44
|
+
require "ui/descriptive_list"
|
45
|
+
require "ui/descriptive_list/item"
|
46
|
+
|
47
|
+
require "ui/empty"
|
48
|
+
|
49
|
+
require "ui/list"
|
50
|
+
require "ui/list/item"
|
51
|
+
|
52
|
+
require "ui/table"
|
53
|
+
require "ui/table/select_all"
|
54
|
+
require "ui/table/select"
|
55
|
+
require "ui/table/sort"
|
56
|
+
|
57
|
+
require "ui/collapse"
|
58
|
+
|
59
|
+
require "ui/tooltip"
|
60
|
+
|
61
|
+
require "ui/notification"
|
62
|
+
|
63
|
+
module Ui
|
64
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Ui
|
2
|
+
module Actionable
|
3
|
+
def actions
|
4
|
+
render_group(
|
5
|
+
options.fetch(:actions, Array.new).map do |action|
|
6
|
+
action.call(model)
|
7
|
+
end
|
8
|
+
)
|
9
|
+
end
|
10
|
+
|
11
|
+
def actions_length
|
12
|
+
options.fetch(:actions, Array.new).size
|
13
|
+
end
|
14
|
+
|
15
|
+
def has_actions?
|
16
|
+
options.fetch(:actions, []).any?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Ui
|
2
|
+
class Breadcrumbs < Component
|
3
|
+
def show
|
4
|
+
content_tag(:nav, class: 'ui-breadcrumbs') do
|
5
|
+
breadcrumb_links
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def breadcrumbs
|
12
|
+
Types::Array.of(Crumb)[model]
|
13
|
+
end
|
14
|
+
|
15
|
+
def breadcrumb_links
|
16
|
+
breadcrumbs.map.with_index do |crumb, index|
|
17
|
+
[item_renderer.call(crumb)].tap do |renderable|
|
18
|
+
renderable.unshift(delimiter) unless index == 0
|
19
|
+
end
|
20
|
+
end.flatten.join(' ').html_safe
|
21
|
+
end
|
22
|
+
|
23
|
+
def delimiter
|
24
|
+
options[:delimiter] || content_tag(:span, '>', class: 'breadcrumb-delimiter')
|
25
|
+
end
|
26
|
+
|
27
|
+
def item_renderer
|
28
|
+
options[:item_renderer] || Ui::Breadcrumbs::Breadcrumb
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Ui
|
2
|
+
class Breadcrumbs < Component
|
3
|
+
class Breadcrumb < Component
|
4
|
+
property :name
|
5
|
+
property :path
|
6
|
+
property :current?
|
7
|
+
property :icon
|
8
|
+
|
9
|
+
def show
|
10
|
+
content_tag(
|
11
|
+
:span,
|
12
|
+
link_to(path) do
|
13
|
+
title.html_safe
|
14
|
+
end,
|
15
|
+
class: style
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def title
|
22
|
+
[name].tap do |array|
|
23
|
+
array.unshift(content_tag(:i, nil, class: icon)) if model.try(:icon)
|
24
|
+
end.join(' ')
|
25
|
+
end
|
26
|
+
|
27
|
+
def style
|
28
|
+
[
|
29
|
+
'breadcrumb'
|
30
|
+
].tap do |array|
|
31
|
+
array << 'breadcrumb--current' if current?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Ui
|
2
|
+
class Breadcrumbs
|
3
|
+
class Crumb < Dry::Struct
|
4
|
+
attribute :name, Types::Strict::String
|
5
|
+
attribute :path, Types::Strict::String.default('#'.freeze)
|
6
|
+
attribute :current, Types::Strict::Bool.default(false.freeze)
|
7
|
+
attribute :icon, Types::Strict::String.default(''.freeze)
|
8
|
+
|
9
|
+
def current?
|
10
|
+
current
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,146 @@
|
|
1
|
+
module Ui
|
2
|
+
module Buttons
|
3
|
+
class Base < Component
|
4
|
+
def show
|
5
|
+
display(
|
6
|
+
text_with_icon(icon),
|
7
|
+
path,
|
8
|
+
button_options,
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
display(
|
14
|
+
text_with_icon(new_icon),
|
15
|
+
path,
|
16
|
+
button_options
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
def edit
|
21
|
+
display(
|
22
|
+
text_with_icon(edit_icon),
|
23
|
+
path,
|
24
|
+
button_options
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def destroy
|
29
|
+
display(
|
30
|
+
text_with_icon(destroy_icon),
|
31
|
+
path,
|
32
|
+
button_options.merge({
|
33
|
+
method: :delete,
|
34
|
+
data: {
|
35
|
+
confirm: 'Are you sure?'
|
36
|
+
}
|
37
|
+
}),
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def display(*args)
|
44
|
+
if disabled?
|
45
|
+
content_tag(
|
46
|
+
:button,
|
47
|
+
args.first,
|
48
|
+
disabled: true,
|
49
|
+
class: button_classes
|
50
|
+
)
|
51
|
+
else
|
52
|
+
if path == '#'
|
53
|
+
content_tag(:button, args.first, **args.last)
|
54
|
+
else
|
55
|
+
link_to(*args)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def new_icon
|
61
|
+
'fas fa-plus'
|
62
|
+
end
|
63
|
+
|
64
|
+
def edit_icon
|
65
|
+
'fas fa-edit'
|
66
|
+
end
|
67
|
+
|
68
|
+
def destroy_icon
|
69
|
+
'fas fa-trash'
|
70
|
+
end
|
71
|
+
|
72
|
+
def button_classes
|
73
|
+
[
|
74
|
+
"button",
|
75
|
+
style,
|
76
|
+
size,
|
77
|
+
options.fetch(:style, '')
|
78
|
+
].compact.join(' ')
|
79
|
+
end
|
80
|
+
|
81
|
+
def size
|
82
|
+
case options[:size]
|
83
|
+
when :small
|
84
|
+
'button--small'
|
85
|
+
else
|
86
|
+
''
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def text
|
91
|
+
content_tag(:span, model) unless model.nil?
|
92
|
+
end
|
93
|
+
|
94
|
+
def text_with_icon(icon)
|
95
|
+
if icon
|
96
|
+
content_tag(
|
97
|
+
:span,
|
98
|
+
render_group([
|
99
|
+
content_tag(:i, nil, class: icon),
|
100
|
+
text
|
101
|
+
].compact)
|
102
|
+
)
|
103
|
+
else
|
104
|
+
text
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def style
|
109
|
+
''
|
110
|
+
end
|
111
|
+
|
112
|
+
def icon
|
113
|
+
options[:icon]
|
114
|
+
end
|
115
|
+
|
116
|
+
def path
|
117
|
+
options[:path] || '#'
|
118
|
+
end
|
119
|
+
|
120
|
+
def data
|
121
|
+
options[:data] || {}
|
122
|
+
end
|
123
|
+
|
124
|
+
def target
|
125
|
+
options[:target]
|
126
|
+
end
|
127
|
+
|
128
|
+
def method
|
129
|
+
options[:method] || :get
|
130
|
+
end
|
131
|
+
|
132
|
+
def disabled?
|
133
|
+
options[:disabled]
|
134
|
+
end
|
135
|
+
|
136
|
+
def button_options
|
137
|
+
{
|
138
|
+
class: button_classes,
|
139
|
+
disabled: disabled?,
|
140
|
+
data: data,
|
141
|
+
method: method
|
142
|
+
}
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
data/lib/ui/card.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module Ui
|
2
|
+
class Card < Component
|
3
|
+
include Actionable
|
4
|
+
include Stylable
|
5
|
+
|
6
|
+
def show(&block)
|
7
|
+
render(&block)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def cover
|
13
|
+
content_tag(:figure, class: 'ui-card__cover') do
|
14
|
+
image_tag(options[:cover])
|
15
|
+
end if options[:cover]
|
16
|
+
end
|
17
|
+
|
18
|
+
def card_actions
|
19
|
+
content_tag(:nav, class: "ui-card__controls") do
|
20
|
+
actions
|
21
|
+
end if has_actions?
|
22
|
+
end
|
23
|
+
|
24
|
+
def title
|
25
|
+
model
|
26
|
+
end
|
27
|
+
|
28
|
+
def extra
|
29
|
+
options[:extra]
|
30
|
+
end
|
31
|
+
|
32
|
+
def component_style
|
33
|
+
"ui-card"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<article class="<%= style %>">
|
2
|
+
<%= cover %>
|
3
|
+
|
4
|
+
<% if title || extra %>
|
5
|
+
<header class="ui-card__header">
|
6
|
+
<%= title %>
|
7
|
+
<%= extra %>
|
8
|
+
</header>
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
<section class="ui-card__content">
|
12
|
+
<%= yield %>
|
13
|
+
</section>
|
14
|
+
|
15
|
+
<%= card_actions %>
|
16
|
+
</article>
|
data/lib/ui/collapse.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "ui/collapse/panel"
|
2
|
+
|
3
|
+
module Ui
|
4
|
+
class Collapse < Component
|
5
|
+
include Stylable
|
6
|
+
|
7
|
+
def show
|
8
|
+
content_tag(:ul, panels, class: style)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def panels
|
14
|
+
cell(
|
15
|
+
Ui::Collapse::Panel,
|
16
|
+
collection: model
|
17
|
+
).()
|
18
|
+
end
|
19
|
+
|
20
|
+
def component_style
|
21
|
+
"ui-collapse"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|