better_ui 0.3.0 → 0.5.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.
Potentially problematic release.
This version of better_ui might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +140 -230
- data/app/assets/stylesheets/better_ui/_base.scss +9 -0
- data/app/assets/stylesheets/better_ui/_components.scss +2 -0
- data/app/assets/stylesheets/better_ui/_utilities.scss +14 -0
- data/app/assets/stylesheets/better_ui/application.css +32 -0
- data/app/assets/stylesheets/better_ui/components/_avatar.scss +200 -0
- data/app/assets/stylesheets/better_ui/components/_badge.scss +154 -0
- data/app/assets/stylesheets/better_ui/components/_breadcrumb.scss +106 -0
- data/app/assets/stylesheets/better_ui/components/_button.scss +105 -0
- data/app/assets/stylesheets/better_ui/components/_card.scss +60 -0
- data/app/assets/stylesheets/better_ui/components/_heading.scss +81 -0
- data/app/assets/stylesheets/better_ui/components/_icon.scss +134 -0
- data/app/assets/stylesheets/better_ui/components/_index.scss +17 -0
- data/app/assets/stylesheets/better_ui/components/_link.scss +100 -0
- data/app/assets/stylesheets/better_ui/components/_panel.scss +104 -0
- data/app/assets/stylesheets/better_ui/components/_spinner.scss +129 -0
- data/app/assets/stylesheets/better_ui/components/_table.scss +156 -0
- data/app/assets/stylesheets/better_ui/components/_variables.scss +1 -0
- data/app/assets/stylesheets/better_ui.scss +4 -0
- data/app/components/better_ui/application/alert_component.html.erb +27 -0
- data/app/components/better_ui/application/alert_component.rb +202 -0
- data/app/components/better_ui/application/card_component.html.erb +24 -0
- data/app/components/better_ui/application/card_component.rb +53 -0
- data/app/components/better_ui/application/card_container_component.html.erb +8 -0
- data/app/components/better_ui/application/card_container_component.rb +14 -0
- data/app/components/better_ui/application/header_component.html.erb +88 -0
- data/app/components/better_ui/application/header_component.rb +188 -0
- data/app/components/better_ui/application/navbar_component.html.erb +294 -0
- data/app/components/better_ui/application/navbar_component.rb +249 -0
- data/app/components/better_ui/application/sidebar_component.html.erb +207 -0
- data/app/components/better_ui/application/sidebar_component.rb +318 -0
- data/app/components/better_ui/application/toast_component.html.erb +35 -0
- data/app/components/better_ui/application/toast_component.rb +223 -0
- data/app/components/better_ui/general/avatar_component.html.erb +19 -0
- data/app/components/better_ui/general/avatar_component.rb +171 -0
- data/app/components/better_ui/general/{badge/component.html.erb → badge_component.html.erb} +2 -6
- data/app/components/better_ui/general/badge_component.rb +135 -0
- data/app/components/better_ui/general/{breadcrumb/component.html.erb → breadcrumb_component.html.erb} +4 -4
- data/app/components/better_ui/general/breadcrumb_component.rb +130 -0
- data/app/components/better_ui/general/{button/component.html.erb → button_component.html.erb} +7 -7
- data/app/components/better_ui/general/button_component.rb +160 -0
- data/app/components/better_ui/general/heading_component.html.erb +1 -0
- data/app/components/better_ui/general/heading_component.rb +49 -0
- data/app/components/better_ui/general/icon_component.html.erb +2 -0
- data/app/components/better_ui/general/icon_component.rb +77 -0
- data/app/components/better_ui/general/link_component.html.erb +17 -0
- data/app/components/better_ui/general/link_component.rb +132 -0
- data/app/components/better_ui/general/panel_component.html.erb +27 -0
- data/app/components/better_ui/general/panel_component.rb +92 -0
- data/app/components/better_ui/general/spinner_component.html.erb +15 -0
- data/app/components/better_ui/general/spinner_component.rb +79 -0
- data/app/components/better_ui/general/table_component.html.erb +73 -0
- data/app/components/better_ui/general/table_component.rb +143 -0
- data/app/controllers/better_ui/application_controller.rb +1 -0
- data/app/helpers/better_ui/general/components/avatar_helper.rb +17 -0
- data/app/helpers/better_ui/general/components/badge_helper.rb +17 -0
- data/app/helpers/better_ui/general/components/breadcrumb_helper.rb +17 -0
- data/app/helpers/better_ui/general/components/button_helper.rb +17 -0
- data/app/helpers/better_ui/general/components/heading_helper.rb +17 -0
- data/app/helpers/better_ui/general/components/icon_helper.rb +17 -0
- data/app/helpers/better_ui/general/components/link_helper.rb +17 -0
- data/app/helpers/better_ui/general/components/panel_helper.rb +16 -0
- data/app/helpers/better_ui/general/components/spinner_helper.rb +17 -0
- data/app/helpers/better_ui/general/components/table_helper.rb +17 -0
- data/app/helpers/better_ui/general_helper.rb +15 -0
- data/app/helpers/better_ui_helper.rb +12 -0
- data/app/views/components/better_ui/general/table/_custom_body_row.html.erb +17 -0
- data/app/views/components/better_ui/general/table/_custom_footer_rows.html.erb +17 -0
- data/app/views/components/better_ui/general/table/_custom_header_rows.html.erb +12 -0
- data/app/views/layouts/component_preview.html.erb +32 -0
- data/config/initializers/lookbook.rb +12 -12
- data/config/routes.rb +2 -0
- data/lib/better_ui/engine.rb +92 -5
- data/lib/better_ui/version.rb +1 -1
- data/lib/better_ui.rb +32 -4
- data/lib/generators/better_ui/install_generator.rb +103 -0
- data/lib/generators/better_ui/stylesheet_generator.rb +159 -0
- data/lib/generators/better_ui/templates/README +125 -0
- data/lib/generators/better_ui/templates/components/_avatar.scss +200 -0
- data/lib/generators/better_ui/templates/components/_badge.scss +154 -0
- data/lib/generators/better_ui/templates/components/_breadcrumb.scss +106 -0
- data/lib/generators/better_ui/templates/components/_button.scss +109 -0
- data/lib/generators/better_ui/templates/components/_card.scss +60 -0
- data/lib/generators/better_ui/templates/components/_heading.scss +81 -0
- data/lib/generators/better_ui/templates/components/_icon.scss +134 -0
- data/lib/generators/better_ui/templates/components/_index.scss +17 -0
- data/lib/generators/better_ui/templates/components/_link.scss +100 -0
- data/lib/generators/better_ui/templates/components/_panel.scss +104 -0
- data/lib/generators/better_ui/templates/components/_spinner.scss +129 -0
- data/lib/generators/better_ui/templates/components/_table.scss +156 -0
- data/lib/generators/better_ui/templates/components/_variables.scss +0 -0
- data/lib/generators/better_ui/templates/components_stylesheet.scss +35 -0
- data/lib/generators/better_ui/templates/index.scss +18 -0
- data/lib/generators/better_ui/templates/initializer.rb +41 -0
- metadata +178 -147
- data/app/components/better_ui/application/card/component.html.erb +0 -20
- data/app/components/better_ui/application/card/component.rb +0 -214
- data/app/components/better_ui/application/main/component.html.erb +0 -9
- data/app/components/better_ui/application/main/component.rb +0 -123
- data/app/components/better_ui/application/navbar/component.html.erb +0 -92
- data/app/components/better_ui/application/navbar/component.rb +0 -136
- data/app/components/better_ui/application/sidebar/component.html.erb +0 -227
- data/app/components/better_ui/application/sidebar/component.rb +0 -130
- data/app/components/better_ui/general/accordion/component.html.erb +0 -5
- data/app/components/better_ui/general/accordion/component.rb +0 -92
- data/app/components/better_ui/general/accordion/item_component.html.erb +0 -12
- data/app/components/better_ui/general/accordion/item_component.rb +0 -176
- data/app/components/better_ui/general/alert/component.html.erb +0 -32
- data/app/components/better_ui/general/alert/component.rb +0 -242
- data/app/components/better_ui/general/avatar/component.html.erb +0 -20
- data/app/components/better_ui/general/avatar/component.rb +0 -301
- data/app/components/better_ui/general/badge/component.rb +0 -248
- data/app/components/better_ui/general/breadcrumb/component.rb +0 -187
- data/app/components/better_ui/general/button/component.rb +0 -214
- data/app/components/better_ui/general/divider/component.html.erb +0 -10
- data/app/components/better_ui/general/divider/component.rb +0 -226
- data/app/components/better_ui/general/dropdown/component.html.erb +0 -25
- data/app/components/better_ui/general/dropdown/component.rb +0 -170
- data/app/components/better_ui/general/dropdown/divider_component.html.erb +0 -1
- data/app/components/better_ui/general/dropdown/divider_component.rb +0 -41
- data/app/components/better_ui/general/dropdown/item_component.html.erb +0 -6
- data/app/components/better_ui/general/dropdown/item_component.rb +0 -119
- data/app/components/better_ui/general/field/component.html.erb +0 -27
- data/app/components/better_ui/general/field/component.rb +0 -37
- data/app/components/better_ui/general/heading/component.html.erb +0 -22
- data/app/components/better_ui/general/heading/component.rb +0 -257
- data/app/components/better_ui/general/icon/component.html.erb +0 -7
- data/app/components/better_ui/general/icon/component.rb +0 -239
- data/app/components/better_ui/general/input/checkbox/component.html.erb +0 -5
- data/app/components/better_ui/general/input/checkbox/component.rb +0 -238
- data/app/components/better_ui/general/input/datetime/component.html.erb +0 -5
- data/app/components/better_ui/general/input/datetime/component.rb +0 -223
- data/app/components/better_ui/general/input/radio/component.html.erb +0 -5
- data/app/components/better_ui/general/input/radio/component.rb +0 -230
- data/app/components/better_ui/general/input/select/component.html.erb +0 -16
- data/app/components/better_ui/general/input/select/component.rb +0 -184
- data/app/components/better_ui/general/input/select/select_component.html.erb +0 -5
- data/app/components/better_ui/general/input/select/select_component.rb +0 -37
- data/app/components/better_ui/general/input/text/component.html.erb +0 -5
- data/app/components/better_ui/general/input/text/component.rb +0 -171
- data/app/components/better_ui/general/input/textarea/component.html.erb +0 -5
- data/app/components/better_ui/general/input/textarea/component.rb +0 -166
- data/app/components/better_ui/general/link/component.html.erb +0 -18
- data/app/components/better_ui/general/link/component.rb +0 -258
- data/app/components/better_ui/general/modal/component.html.erb +0 -5
- data/app/components/better_ui/general/modal/component.rb +0 -47
- data/app/components/better_ui/general/modal/modal_component.html.erb +0 -52
- data/app/components/better_ui/general/modal/modal_component.rb +0 -160
- data/app/components/better_ui/general/pagination/component.html.erb +0 -85
- data/app/components/better_ui/general/pagination/component.rb +0 -216
- data/app/components/better_ui/general/panel/component.html.erb +0 -28
- data/app/components/better_ui/general/panel/component.rb +0 -249
- data/app/components/better_ui/general/progress/component.html.erb +0 -11
- data/app/components/better_ui/general/progress/component.rb +0 -160
- data/app/components/better_ui/general/spinner/component.html.erb +0 -35
- data/app/components/better_ui/general/spinner/component.rb +0 -93
- data/app/components/better_ui/general/table/component.html.erb +0 -5
- data/app/components/better_ui/general/table/component.rb +0 -217
- data/app/components/better_ui/general/table/tbody_component.html.erb +0 -3
- data/app/components/better_ui/general/table/tbody_component.rb +0 -30
- data/app/components/better_ui/general/table/td_component.html.erb +0 -3
- data/app/components/better_ui/general/table/td_component.rb +0 -44
- data/app/components/better_ui/general/table/tfoot_component.html.erb +0 -3
- data/app/components/better_ui/general/table/tfoot_component.rb +0 -28
- data/app/components/better_ui/general/table/th_component.html.erb +0 -6
- data/app/components/better_ui/general/table/th_component.rb +0 -51
- data/app/components/better_ui/general/table/thead_component.html.erb +0 -3
- data/app/components/better_ui/general/table/thead_component.rb +0 -28
- data/app/components/better_ui/general/table/tr_component.html.erb +0 -3
- data/app/components/better_ui/general/table/tr_component.rb +0 -30
- data/app/components/better_ui/general/tabs/component.html.erb +0 -11
- data/app/components/better_ui/general/tabs/component.rb +0 -120
- data/app/components/better_ui/general/tabs/panel_component.html.erb +0 -3
- data/app/components/better_ui/general/tabs/panel_component.rb +0 -37
- data/app/components/better_ui/general/tabs/tab_component.html.erb +0 -13
- data/app/components/better_ui/general/tabs/tab_component.rb +0 -111
- data/app/components/better_ui/general/tag/component.html.erb +0 -3
- data/app/components/better_ui/general/tag/component.rb +0 -104
- data/app/components/better_ui/general/tooltip/component.html.erb +0 -7
- data/app/components/better_ui/general/tooltip/component.rb +0 -239
- data/app/helpers/better_ui/application/components/card/card_helper.rb +0 -96
- data/app/helpers/better_ui/application/components/card.rb +0 -11
- data/app/helpers/better_ui/application/components/main/main_helper.rb +0 -64
- data/app/helpers/better_ui/application/components/navbar/navbar_helper.rb +0 -77
- data/app/helpers/better_ui/application/components/sidebar/sidebar_helper.rb +0 -51
- data/app/helpers/better_ui/application_helper.rb +0 -55
- data/app/helpers/better_ui/general/components/accordion/accordion_helper.rb +0 -73
- data/app/helpers/better_ui/general/components/accordion.rb +0 -11
- data/app/helpers/better_ui/general/components/alert/alert_helper.rb +0 -57
- data/app/helpers/better_ui/general/components/avatar/avatar_helper.rb +0 -29
- data/app/helpers/better_ui/general/components/badge/badge_helper.rb +0 -53
- data/app/helpers/better_ui/general/components/breadcrumb/breadcrumb_helper.rb +0 -37
- data/app/helpers/better_ui/general/components/button/button_helper.rb +0 -65
- data/app/helpers/better_ui/general/components/container/container_helper.rb +0 -60
- data/app/helpers/better_ui/general/components/divider/divider_helper.rb +0 -63
- data/app/helpers/better_ui/general/components/dropdown/divider_helper.rb +0 -32
- data/app/helpers/better_ui/general/components/dropdown/dropdown_helper.rb +0 -79
- data/app/helpers/better_ui/general/components/dropdown/item_helper.rb +0 -62
- data/app/helpers/better_ui/general/components/field/field_helper.rb +0 -26
- data/app/helpers/better_ui/general/components/heading/heading_helper.rb +0 -72
- data/app/helpers/better_ui/general/components/icon/icon_helper.rb +0 -16
- data/app/helpers/better_ui/general/components/input/checkbox/checkbox_helper.rb +0 -81
- data/app/helpers/better_ui/general/components/input/datetime/datetime_helper.rb +0 -91
- data/app/helpers/better_ui/general/components/input/radio/radio_helper.rb +0 -79
- data/app/helpers/better_ui/general/components/input/radio_group/radio_group_helper.rb +0 -124
- data/app/helpers/better_ui/general/components/input/select/select_helper.rb +0 -70
- data/app/helpers/better_ui/general/components/input/text/text_helper.rb +0 -138
- data/app/helpers/better_ui/general/components/input/textarea/textarea_helper.rb +0 -73
- data/app/helpers/better_ui/general/components/link/link_helper.rb +0 -89
- data/app/helpers/better_ui/general/components/modal/modal_helper.rb +0 -85
- data/app/helpers/better_ui/general/components/modal.rb +0 -11
- data/app/helpers/better_ui/general/components/pagination/pagination_helper.rb +0 -82
- data/app/helpers/better_ui/general/components/panel/panel_helper.rb +0 -83
- data/app/helpers/better_ui/general/components/progress/progress_helper.rb +0 -53
- data/app/helpers/better_ui/general/components/spinner/spinner_helper.rb +0 -19
- data/app/helpers/better_ui/general/components/table/table_helper.rb +0 -53
- data/app/helpers/better_ui/general/components/table/tbody_helper.rb +0 -13
- data/app/helpers/better_ui/general/components/table/td_helper.rb +0 -19
- data/app/helpers/better_ui/general/components/table/tfoot_helper.rb +0 -13
- data/app/helpers/better_ui/general/components/table/th_helper.rb +0 -19
- data/app/helpers/better_ui/general/components/table/thead_helper.rb +0 -13
- data/app/helpers/better_ui/general/components/table/tr_helper.rb +0 -13
- data/app/helpers/better_ui/general/components/tabs/panel_helper.rb +0 -62
- data/app/helpers/better_ui/general/components/tabs/tab_helper.rb +0 -55
- data/app/helpers/better_ui/general/components/tabs/tabs_helper.rb +0 -95
- data/app/helpers/better_ui/general/components/tag/tag_helper.rb +0 -26
- data/app/helpers/better_ui/general/components/tooltip/tooltip_helper.rb +0 -60
- data/app/views/layouts/better_ui/application.html.erb +0 -17
- data/lib/better_ui/railtie.rb +0 -20
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
class SpinnerComponent < ViewComponent::Base
|
|
4
|
+
attr_reader :size, :theme, :fullscreen, :label, :classes, :id
|
|
5
|
+
|
|
6
|
+
# Temi di colore disponibili
|
|
7
|
+
SPINNER_THEME = {
|
|
8
|
+
default: "bui-spinner--default",
|
|
9
|
+
white: "bui-spinner--white",
|
|
10
|
+
red: "bui-spinner--red",
|
|
11
|
+
rose: "bui-spinner--rose",
|
|
12
|
+
orange: "bui-spinner--orange",
|
|
13
|
+
green: "bui-spinner--green",
|
|
14
|
+
blue: "bui-spinner--blue",
|
|
15
|
+
yellow: "bui-spinner--yellow",
|
|
16
|
+
violet: "bui-spinner--violet"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
# Dimensioni disponibili
|
|
20
|
+
SPINNER_SIZES = {
|
|
21
|
+
small: "bui-spinner--small",
|
|
22
|
+
medium: "bui-spinner--medium",
|
|
23
|
+
large: "bui-spinner--large"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
# Stati e comportamenti dello spinner
|
|
27
|
+
SPINNER_STATES = {
|
|
28
|
+
fullscreen: "bui-spinner--fullscreen"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# Inizializzazione del componente
|
|
32
|
+
def initialize(
|
|
33
|
+
size: :medium,
|
|
34
|
+
theme: :default,
|
|
35
|
+
fullscreen: false,
|
|
36
|
+
label: nil,
|
|
37
|
+
classes: nil,
|
|
38
|
+
id: nil
|
|
39
|
+
)
|
|
40
|
+
@size = size.to_sym
|
|
41
|
+
@theme = theme.to_sym
|
|
42
|
+
@fullscreen = fullscreen
|
|
43
|
+
@label = label
|
|
44
|
+
@classes = classes
|
|
45
|
+
@id = id
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Combina tutte le classi
|
|
49
|
+
def combined_classes
|
|
50
|
+
[
|
|
51
|
+
"bui-spinner", # Classe base per tutti gli spinner
|
|
52
|
+
get_spinner_theme_class,
|
|
53
|
+
get_spinner_size_class,
|
|
54
|
+
@fullscreen ? SPINNER_STATES[:fullscreen] : "",
|
|
55
|
+
@classes
|
|
56
|
+
].compact.join(" ")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def get_spinner_theme_class
|
|
60
|
+
SPINNER_THEME[@theme] || SPINNER_THEME[:default]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def get_spinner_size_class
|
|
64
|
+
SPINNER_SIZES[@size] || SPINNER_SIZES[:medium]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Restituisce gli attributi per lo spinner
|
|
68
|
+
def spinner_attributes
|
|
69
|
+
attrs = {
|
|
70
|
+
class: combined_classes,
|
|
71
|
+
id: @id,
|
|
72
|
+
role: "status"
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
attrs
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<div class="<%= table_container_classes %>">
|
|
2
|
+
<table class="<%= table_classes %>">
|
|
3
|
+
<% if caption.present? %>
|
|
4
|
+
<caption class="<%= caption_classes %>">
|
|
5
|
+
<%= caption %>
|
|
6
|
+
</caption>
|
|
7
|
+
<% end %>
|
|
8
|
+
|
|
9
|
+
<thead class="<%= thead_classes %>">
|
|
10
|
+
<% if header_rows_partial.present? %>
|
|
11
|
+
<%= render partial: header_rows_partial, locals: {
|
|
12
|
+
component: self,
|
|
13
|
+
headers: headers_for_display
|
|
14
|
+
} %>
|
|
15
|
+
<% else %>
|
|
16
|
+
<tr>
|
|
17
|
+
<% headers_for_display.each do |header| %>
|
|
18
|
+
<th scope="col" class="<%= th_classes %>">
|
|
19
|
+
<%= header.to_s.humanize %>
|
|
20
|
+
</th>
|
|
21
|
+
<% end %>
|
|
22
|
+
</tr>
|
|
23
|
+
<% end %>
|
|
24
|
+
</thead>
|
|
25
|
+
|
|
26
|
+
<tbody class="<%= tbody_classes %>">
|
|
27
|
+
<% data.each_with_index do |row, index| %>
|
|
28
|
+
<% if body_row_partial.present? %>
|
|
29
|
+
<%= render partial: body_row_partial, locals: {
|
|
30
|
+
component: self,
|
|
31
|
+
row: row,
|
|
32
|
+
index: index,
|
|
33
|
+
headers: headers_for_display
|
|
34
|
+
} %>
|
|
35
|
+
<% else %>
|
|
36
|
+
<tr class="<%= tr_classes(index) %>">
|
|
37
|
+
<% headers_for_display.each do |header| %>
|
|
38
|
+
<td class="<%= td_classes %>">
|
|
39
|
+
<% if row.is_a?(Hash) %>
|
|
40
|
+
<%= row[header.to_s] || row[header.to_sym] %>
|
|
41
|
+
<% elsif row.respond_to?(header.to_sym) %>
|
|
42
|
+
<%= row.send(header.to_sym) %>
|
|
43
|
+
<% else %>
|
|
44
|
+
—
|
|
45
|
+
<% end %>
|
|
46
|
+
</td>
|
|
47
|
+
<% end %>
|
|
48
|
+
</tr>
|
|
49
|
+
<% end %>
|
|
50
|
+
<% end %>
|
|
51
|
+
</tbody>
|
|
52
|
+
|
|
53
|
+
<% if footer.present? %>
|
|
54
|
+
<tfoot class="<%= tfoot_classes %>">
|
|
55
|
+
<% if footer_rows_partial.present? %>
|
|
56
|
+
<%= render partial: footer_rows_partial, locals: {
|
|
57
|
+
component: self,
|
|
58
|
+
footer: footer,
|
|
59
|
+
headers: headers_for_display
|
|
60
|
+
} %>
|
|
61
|
+
<% else %>
|
|
62
|
+
<tr>
|
|
63
|
+
<% footer.each_with_index do |value, index| %>
|
|
64
|
+
<td class="<%= tf_classes %>">
|
|
65
|
+
<%= value || "—" %>
|
|
66
|
+
</td>
|
|
67
|
+
<% end %>
|
|
68
|
+
</tr>
|
|
69
|
+
<% end %>
|
|
70
|
+
</tfoot>
|
|
71
|
+
<% end %>
|
|
72
|
+
</table>
|
|
73
|
+
</div>
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
class TableComponent < ViewComponent::Base
|
|
4
|
+
attr_reader :data, :headers, :caption, :striped, :hoverable, :bordered, :compact, :classes, :variant, :rounded, :footer,
|
|
5
|
+
:header_rows_partial, :body_row_partial, :footer_rows_partial
|
|
6
|
+
|
|
7
|
+
# Costanti per configurazione stili
|
|
8
|
+
TABLE_THEMES = {
|
|
9
|
+
default: "bui-table--default",
|
|
10
|
+
white: "bui-table--white",
|
|
11
|
+
red: "bui-table--red",
|
|
12
|
+
rose: "bui-table--rose",
|
|
13
|
+
orange: "bui-table--orange",
|
|
14
|
+
green: "bui-table--green",
|
|
15
|
+
blue: "bui-table--blue",
|
|
16
|
+
yellow: "bui-table--yellow",
|
|
17
|
+
violet: "bui-table--violet"
|
|
18
|
+
}.freeze
|
|
19
|
+
|
|
20
|
+
# Opzioni di bordi arrotondati standardizzati
|
|
21
|
+
TABLE_RADIUS = {
|
|
22
|
+
none: "bui-table--radius-none",
|
|
23
|
+
small: "bui-table--radius-small",
|
|
24
|
+
medium: "bui-table--radius-medium",
|
|
25
|
+
large: "bui-table--radius-large",
|
|
26
|
+
full: "bui-table--radius-full"
|
|
27
|
+
}.freeze
|
|
28
|
+
|
|
29
|
+
def initialize(data:, headers: nil, caption: nil, striped: false, hoverable: false, bordered: true, compact: false, classes: nil, variant: :default, rounded: :small, footer: nil, header_rows_partial: nil, body_row_partial: nil, footer_rows_partial: nil)
|
|
30
|
+
@data = data || []
|
|
31
|
+
@headers = headers
|
|
32
|
+
@caption = caption
|
|
33
|
+
@striped = !!striped
|
|
34
|
+
@hoverable = !!hoverable
|
|
35
|
+
@bordered = !!bordered
|
|
36
|
+
@compact = !!compact
|
|
37
|
+
@classes = classes
|
|
38
|
+
@variant = (TABLE_THEMES.key?(variant.to_sym) ? variant.to_sym : :default)
|
|
39
|
+
@rounded = (TABLE_RADIUS.key?(rounded.to_sym) ? rounded.to_sym : :small)
|
|
40
|
+
@footer = footer.is_a?(Array) ? footer : nil # Valida che sia un array
|
|
41
|
+
@header_rows_partial = header_rows_partial
|
|
42
|
+
@body_row_partial = body_row_partial
|
|
43
|
+
@footer_rows_partial = footer_rows_partial
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def table_classes
|
|
47
|
+
[
|
|
48
|
+
"bui-table",
|
|
49
|
+
get_theme_class,
|
|
50
|
+
@bordered ? "bui-table--bordered" : nil,
|
|
51
|
+
@striped ? "bui-table--striped" : nil,
|
|
52
|
+
@hoverable ? "bui-table--hoverable" : nil,
|
|
53
|
+
@compact ? "bui-table--compact" : nil,
|
|
54
|
+
@classes
|
|
55
|
+
].compact.join(" ")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def table_container_classes
|
|
59
|
+
[
|
|
60
|
+
"bui-table__container",
|
|
61
|
+
get_border_radius_class
|
|
62
|
+
].compact.join(" ")
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def get_border_radius_class
|
|
66
|
+
TABLE_RADIUS[@rounded] || TABLE_RADIUS[:small]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def get_theme_class
|
|
70
|
+
TABLE_THEMES[@variant] || TABLE_THEMES[:default]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def caption_classes
|
|
74
|
+
"bui-table__caption"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def thead_classes
|
|
78
|
+
"bui-table__header"
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def tbody_classes
|
|
82
|
+
"bui-table__body"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def tfoot_classes
|
|
86
|
+
"bui-table__footer"
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def tr_classes(index)
|
|
90
|
+
"bui-table__row"
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def th_classes
|
|
94
|
+
[
|
|
95
|
+
"bui-table__cell",
|
|
96
|
+
"bui-table__cell--header"
|
|
97
|
+
].compact.join(" ")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def td_classes
|
|
101
|
+
"bui-table__cell"
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def tf_classes
|
|
105
|
+
[
|
|
106
|
+
"bui-table__cell",
|
|
107
|
+
"bui-table__cell--footer"
|
|
108
|
+
].compact.join(" ")
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def headers_for_display
|
|
112
|
+
return @headers if @headers.present?
|
|
113
|
+
return [] if @data.empty?
|
|
114
|
+
|
|
115
|
+
case first_item = @data.first
|
|
116
|
+
when Hash
|
|
117
|
+
first_item.keys
|
|
118
|
+
when -> (item) { item.respond_to?(:attributes) }
|
|
119
|
+
first_item.attributes.keys - %w[id created_at updated_at]
|
|
120
|
+
else
|
|
121
|
+
[]
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Ottiene il valore di una cella in modo consistente
|
|
126
|
+
def get_cell_value(row, header)
|
|
127
|
+
if row.is_a?(Hash)
|
|
128
|
+
row[header.to_s] || row[header.to_sym] || "—"
|
|
129
|
+
elsif row.respond_to?(header.to_sym)
|
|
130
|
+
row.send(header.to_sym)
|
|
131
|
+
elsif row.is_a?(Array) && headers_for_display.index(header)
|
|
132
|
+
row[headers_for_display.index(header)] || "—"
|
|
133
|
+
else
|
|
134
|
+
"—"
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def render?
|
|
139
|
+
@data.present?
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
module Components
|
|
4
|
+
module AvatarHelper
|
|
5
|
+
def bui_avatar(image = nil, **options)
|
|
6
|
+
render BetterUi::General::AvatarComponent.new(
|
|
7
|
+
image: image,
|
|
8
|
+
**options
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Supporto per la sintassi originale per compatibilità
|
|
13
|
+
alias_method :better_ui_general_avatar, :bui_avatar
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
module Components
|
|
4
|
+
module BadgeHelper
|
|
5
|
+
def bui_badge(label = nil, **options)
|
|
6
|
+
render BetterUi::General::BadgeComponent.new(
|
|
7
|
+
label: label,
|
|
8
|
+
**options
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Supporto per la sintassi originale per compatibilità
|
|
13
|
+
alias_method :better_ui_general_badge, :bui_badge
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
module Components
|
|
4
|
+
module BreadcrumbHelper
|
|
5
|
+
def bui_breadcrumb(items = nil, **options)
|
|
6
|
+
render BetterUi::General::BreadcrumbComponent.new(
|
|
7
|
+
items: items,
|
|
8
|
+
**options
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Supporto per la sintassi originale per compatibilità
|
|
13
|
+
alias_method :better_ui_general_breadcrumb, :bui_breadcrumb
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
module Components
|
|
4
|
+
module ButtonHelper
|
|
5
|
+
def bui_button(label = nil, **options)
|
|
6
|
+
render BetterUi::General::ButtonComponent.new(
|
|
7
|
+
label: label,
|
|
8
|
+
**options
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Supporto per la sintassi originale per compatibilità
|
|
13
|
+
alias_method :better_ui_general_button, :bui_button
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
module Components
|
|
4
|
+
module HeadingHelper
|
|
5
|
+
def bui_heading(title = nil, **options)
|
|
6
|
+
render BetterUi::General::HeadingComponent.new(
|
|
7
|
+
title: title,
|
|
8
|
+
**options
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Supporto per la sintassi originale per compatibilità
|
|
13
|
+
alias_method :better_ui_general_heading, :bui_heading
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
module Components
|
|
4
|
+
module IconHelper
|
|
5
|
+
def bui_icon(name = nil, **options)
|
|
6
|
+
render BetterUi::General::IconComponent.new(
|
|
7
|
+
name: name,
|
|
8
|
+
**options
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Supporto per la sintassi originale per compatibilità
|
|
13
|
+
alias_method :better_ui_general_icon, :bui_icon
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
module Components
|
|
4
|
+
module LinkHelper
|
|
5
|
+
def bui_link(label = nil, **options)
|
|
6
|
+
render BetterUi::General::LinkComponent.new(
|
|
7
|
+
label: label,
|
|
8
|
+
**options
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Supporto per la sintassi originale per compatibilità
|
|
13
|
+
alias_method :better_ui_general_link, :bui_link
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
module Components
|
|
4
|
+
module PanelHelper
|
|
5
|
+
def bui_panel(**options, &block)
|
|
6
|
+
render BetterUi::General::PanelComponent.new(
|
|
7
|
+
**options
|
|
8
|
+
), &block
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Supporto per la sintassi originale per compatibilità
|
|
12
|
+
alias_method :better_ui_general_panel, :bui_panel
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
module Components
|
|
4
|
+
module SpinnerHelper
|
|
5
|
+
def bui_spinner(label = nil, **options)
|
|
6
|
+
render BetterUi::General::SpinnerComponent.new(
|
|
7
|
+
label: label,
|
|
8
|
+
**options
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Supporto per la sintassi originale per compatibilità
|
|
13
|
+
alias_method :better_ui_general_spinner, :bui_spinner
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module General
|
|
3
|
+
module Components
|
|
4
|
+
module TableHelper
|
|
5
|
+
def bui_table(data = nil, **options, &block)
|
|
6
|
+
render BetterUi::General::TableComponent.new(
|
|
7
|
+
data: data,
|
|
8
|
+
**options
|
|
9
|
+
), &block
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Supporto per la sintassi originale per compatibilità
|
|
13
|
+
alias_method :better_ui_general_table, :bui_table
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
module GeneralHelper
|
|
3
|
+
# Inclusione di tutti i componenti general
|
|
4
|
+
include BetterUi::General::Components::ButtonHelper
|
|
5
|
+
include BetterUi::General::Components::IconHelper
|
|
6
|
+
include BetterUi::General::Components::LinkHelper
|
|
7
|
+
include BetterUi::General::Components::BadgeHelper
|
|
8
|
+
include BetterUi::General::Components::AvatarHelper
|
|
9
|
+
include BetterUi::General::Components::TableHelper
|
|
10
|
+
include BetterUi::General::Components::SpinnerHelper
|
|
11
|
+
include BetterUi::General::Components::HeadingHelper
|
|
12
|
+
include BetterUi::General::Components::PanelHelper
|
|
13
|
+
include BetterUi::General::Components::BreadcrumbHelper
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module BetterUi
|
|
2
|
+
# Includi esplicitamente il GeneralHelper
|
|
3
|
+
require_relative 'better_ui/general_helper'
|
|
4
|
+
|
|
5
|
+
module Helper
|
|
6
|
+
# Estendi il modulo con ActiveSupport::Concern per funzionalità helper
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
# Includi gli helper disponibili
|
|
10
|
+
include BetterUi::GeneralHelper
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<tr class="<%= component.tr_classes(index) %>">
|
|
2
|
+
<% headers.each_with_index do |header, cell_index| %>
|
|
3
|
+
<td class="<%= component.td_classes %>">
|
|
4
|
+
<% cell_value = component.get_cell_value(row, header) %>
|
|
5
|
+
<% if cell_index == 0 %>
|
|
6
|
+
<div class="flex items-center">
|
|
7
|
+
<div class="w-8 h-8 rounded-full bg-blue-100 mr-2 flex items-center justify-center text-blue-700">
|
|
8
|
+
<%= cell_value.to_s.first&.upcase || 'N/A' %>
|
|
9
|
+
</div>
|
|
10
|
+
<%= cell_value %>
|
|
11
|
+
</div>
|
|
12
|
+
<% else %>
|
|
13
|
+
<%= cell_value %>
|
|
14
|
+
<% end %>
|
|
15
|
+
</td>
|
|
16
|
+
<% end %>
|
|
17
|
+
</tr>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<tr>
|
|
2
|
+
<% footer.each_with_index do |value, index| %>
|
|
3
|
+
<td class="<%= component.tf_classes %>">
|
|
4
|
+
<% if index == 0 %>
|
|
5
|
+
<div class="flex items-center">
|
|
6
|
+
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
7
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2
|
|
8
|
+
0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path>
|
|
9
|
+
</svg>
|
|
10
|
+
<strong><%= value %></strong>
|
|
11
|
+
</div>
|
|
12
|
+
<% else %>
|
|
13
|
+
<%= value %>
|
|
14
|
+
<% end %>
|
|
15
|
+
</td>
|
|
16
|
+
<% end %>
|
|
17
|
+
</tr>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<tr>
|
|
2
|
+
<% headers.each do |header| %>
|
|
3
|
+
<th class="<%= component.th_classes %>">
|
|
4
|
+
<div class="flex items-center justify-between">
|
|
5
|
+
<%= header.to_s.humanize %>
|
|
6
|
+
<svg class="w-4 h-4 ml-1" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
7
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
|
|
8
|
+
</svg>
|
|
9
|
+
</div>
|
|
10
|
+
</th>
|
|
11
|
+
<% end %>
|
|
12
|
+
</tr>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html style="background-color: <%= params.dig(:lookbook, :display, :bg_color) || "white" %>">
|
|
3
|
+
<head>
|
|
4
|
+
<title><%= content_for(:title) || "BetterUI" %></title>
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
7
|
+
<meta name="mobile-web-app-capable" content="yes">
|
|
8
|
+
<%= csrf_meta_tags %>
|
|
9
|
+
<%= csp_meta_tag %>
|
|
10
|
+
|
|
11
|
+
<%= yield :head %>
|
|
12
|
+
|
|
13
|
+
<link rel="icon" href="/icon.png" type="image/png">
|
|
14
|
+
<link rel="icon" href="/icon.svg" type="image/svg+xml">
|
|
15
|
+
<link rel="apple-touch-icon" href="/icon.png">
|
|
16
|
+
|
|
17
|
+
<%# Includes all stylesheet files in app/assets/stylesheets %>
|
|
18
|
+
<%= stylesheet_link_tag "tailwind", "inter-font", "data-turbo-track": "reload" %>
|
|
19
|
+
<%= stylesheet_link_tag "better_ui/application" %>
|
|
20
|
+
</head>
|
|
21
|
+
|
|
22
|
+
<body class="bg-white text-gray-800">
|
|
23
|
+
<main class="min-h-screen p-8 bg-yellow-500">
|
|
24
|
+
<div style="
|
|
25
|
+
margin-left: auto;
|
|
26
|
+
margin-right: auto;
|
|
27
|
+
max-width: <%= params.dig(:lookbook, :display, :max_width) || "100%" %>
|
|
28
|
+
">
|
|
29
|
+
<%= yield %> <!-- rendered preview will be injected here -->
|
|
30
|
+
</main>
|
|
31
|
+
</body>
|
|
32
|
+
</html>
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
if defined?(Lookbook)
|
|
2
2
|
Lookbook.configure do |config|
|
|
3
3
|
# Configura la directory delle preview dei componenti
|
|
4
|
-
config.preview_paths << BetterUi::Engine.root.join(
|
|
5
|
-
|
|
4
|
+
config.preview_paths << BetterUi::Engine.root.join('test/components/previews')
|
|
5
|
+
|
|
6
6
|
# Configura il titolo della pagina Lookbook
|
|
7
|
-
config.page_title =
|
|
8
|
-
|
|
7
|
+
config.page_title = 'BetterUI - Catalogo Componenti'
|
|
8
|
+
|
|
9
9
|
# Configura i tag principali
|
|
10
10
|
config.preview_display_names = {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
'BetterUi::General' => 'Componenti Generali',
|
|
12
|
+
'BetterUi::Application' => 'Componenti Applicazione',
|
|
13
|
+
'BetterUi::Website' => 'Componenti Sito Web'
|
|
14
14
|
}
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
# Per supportare i componenti ViewComponent
|
|
17
17
|
config.listen_for_changes = {
|
|
18
|
-
component:
|
|
19
|
-
preview:
|
|
20
|
-
template:
|
|
18
|
+
component: 'app/components/**/*.rb',
|
|
19
|
+
preview: 'test/components/previews/**/*_preview.rb',
|
|
20
|
+
template: 'app/components/**/*.erb'
|
|
21
21
|
}
|
|
22
22
|
end
|
|
23
|
-
end
|
|
23
|
+
end
|
data/config/routes.rb
CHANGED