fluxbit_view_components 0.2.0 → 0.4.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 +10 -0
- data/app/assets/javascripts/fluxbit_view_components/assigner_controller.js +49 -0
- data/app/assets/javascripts/fluxbit_view_components/auto_submit_controller.js +39 -0
- data/app/assets/javascripts/fluxbit_view_components/drawer_controller.js +135 -0
- data/app/assets/javascripts/fluxbit_view_components/index.js +56 -0
- data/app/assets/javascripts/fluxbit_view_components/method_link_controller.js +143 -0
- data/app/assets/javascripts/fluxbit_view_components/modal_controller.js +118 -0
- data/app/assets/javascripts/fluxbit_view_components/password_controller.js +170 -0
- data/app/assets/javascripts/fluxbit_view_components/progress_controller.js +374 -0
- data/app/assets/javascripts/fluxbit_view_components/row_click_controller.js +32 -0
- data/app/assets/javascripts/fluxbit_view_components/select_all_controller.js +122 -0
- data/app/assets/javascripts/fluxbit_view_components/spinner_percent_controller.js +174 -0
- data/app/assets/javascripts/fluxbit_view_components/theme_button_controller.js +90 -0
- data/app/assets/javascripts/fluxbit_view_components.js +1175 -0
- data/app/components/fluxbit/accordion_component.rb +125 -0
- data/app/components/fluxbit/alert_component.rb +8 -8
- data/app/components/fluxbit/avatar_component.rb +11 -12
- data/app/components/fluxbit/avatar_group_component.rb +1 -1
- data/app/components/fluxbit/badge_component.rb +8 -7
- data/app/components/fluxbit/banner_component.rb +139 -0
- data/app/components/fluxbit/bottom_navigation_component.rb +437 -0
- data/app/components/fluxbit/breadcrumb_component.rb +66 -0
- data/app/components/fluxbit/button_component.rb +39 -11
- data/app/components/fluxbit/button_group_component.rb +1 -1
- data/app/components/fluxbit/card_component.rb +26 -23
- data/app/components/fluxbit/carousel_component.rb +154 -0
- data/app/components/fluxbit/component.rb +24 -3
- data/app/components/fluxbit/drawer_component.html.erb +30 -0
- data/app/components/fluxbit/drawer_component.rb +125 -0
- data/app/components/fluxbit/dropdown_component.rb +41 -0
- data/app/components/fluxbit/dropdown_item_component.rb +68 -0
- data/app/components/fluxbit/flex_component.rb +1 -1
- data/app/components/fluxbit/form/check_box_component.rb +56 -0
- data/app/components/fluxbit/form/component.rb +27 -26
- data/app/components/fluxbit/form/dropzone_component.html.erb +39 -0
- data/app/components/fluxbit/form/dropzone_component.rb +39 -0
- data/app/components/fluxbit/form/field_component.rb +28 -0
- data/app/components/fluxbit/form/form_builder_component.rb +1 -1
- data/app/components/fluxbit/form/{helper_text_component.rb → help_text_component.rb} +9 -4
- data/app/components/fluxbit/form/label_component.rb +40 -30
- data/app/components/fluxbit/form/password_component.rb +247 -0
- data/app/components/fluxbit/form/radio_group_button_component.rb +126 -0
- data/app/components/fluxbit/form/range_component.rb +52 -0
- data/app/components/fluxbit/form/select_component.rb +185 -0
- data/app/components/fluxbit/form/text_field_component.rb +185 -0
- data/app/components/fluxbit/form/toggle_component.html.erb +23 -0
- data/app/components/fluxbit/form/toggle_component.rb +81 -0
- data/app/components/fluxbit/form/upload_image_component.html.erb +50 -0
- data/app/components/fluxbit/form/upload_image_component.rb +61 -0
- data/app/components/fluxbit/gravatar_component.rb +7 -0
- data/app/components/fluxbit/icon_helpers.rb +167 -0
- data/app/components/fluxbit/link_component.rb +42 -0
- data/app/components/fluxbit/modal_component.rb +28 -31
- data/app/components/fluxbit/pagination_component.rb +206 -0
- data/app/components/fluxbit/popover_component.rb +14 -14
- data/app/components/fluxbit/progress_component.rb +196 -0
- data/app/components/fluxbit/skeleton_component.rb +237 -0
- data/app/components/fluxbit/speed_dial_action_component.html.erb +30 -0
- data/app/components/fluxbit/speed_dial_action_component.rb +59 -0
- data/app/components/fluxbit/speed_dial_component.html.erb +33 -0
- data/app/components/fluxbit/speed_dial_component.rb +73 -0
- data/app/components/fluxbit/spinner_component.rb +71 -0
- data/app/components/fluxbit/spinner_percent_component.rb +174 -0
- data/app/components/fluxbit/stepper_component.rb +223 -0
- data/app/components/fluxbit/tab_component.rb +44 -25
- data/app/components/fluxbit/table_component.rb +186 -0
- data/app/components/fluxbit/table_group_component.rb +28 -0
- data/app/components/fluxbit/theme_button_component.rb +64 -0
- data/app/components/fluxbit/timeline_component.rb +63 -0
- data/app/components/fluxbit/timeline_item_component.html.erb +64 -0
- data/app/components/fluxbit/timeline_item_component.rb +78 -0
- data/app/components/fluxbit/tooltip_component.rb +2 -2
- data/app/helpers/fluxbit/components_helper.rb +93 -51
- data/app/helpers/fluxbit/form_builder.rb +136 -0
- data/app/helpers/fluxbit/view_helper.rb +71 -0
- data/config/locales/en.yml +37 -4
- data/config/locales/pt-BR.yml +36 -0
- data/lib/fluxbit/config/accordion_component.rb +73 -0
- data/lib/fluxbit/config/avatar_component.rb +11 -11
- data/lib/fluxbit/config/badge_component.rb +14 -11
- data/lib/fluxbit/config/banner_component.rb +60 -0
- data/lib/fluxbit/config/bottom_navigation_component.rb +74 -0
- data/lib/fluxbit/config/breadcrumb_component.rb +24 -0
- data/lib/fluxbit/config/button_component.rb +6 -4
- data/lib/fluxbit/config/card_component.rb +23 -12
- data/lib/fluxbit/config/carousel_component.rb +33 -0
- data/lib/fluxbit/config/drawer_component.rb +48 -0
- data/lib/fluxbit/config/dropdown_component.rb +29 -0
- data/lib/fluxbit/config/form/check_box_component.rb +19 -0
- data/lib/fluxbit/config/form/dropzone_component.rb +20 -0
- data/lib/fluxbit/config/form/{helper_text_component.rb → help_text_component.rb} +2 -2
- data/lib/fluxbit/config/form/label_component.rb +31 -0
- data/lib/fluxbit/config/form/password_component.rb +19 -0
- data/lib/fluxbit/config/form/radio_group_button_component.rb +24 -0
- data/lib/fluxbit/config/form/range_component.rb +15 -0
- data/lib/fluxbit/config/form/text_field_component.rb +76 -0
- data/lib/fluxbit/config/form/toggle_component.rb +79 -0
- data/lib/fluxbit/config/link_component.rb +24 -0
- data/lib/fluxbit/config/modal_component.rb +1 -1
- data/lib/fluxbit/config/pagination_component.rb +31 -0
- data/lib/fluxbit/config/popover_component.rb +1 -1
- data/lib/fluxbit/config/progress_component.rb +63 -0
- data/lib/fluxbit/config/skeleton_component.rb +82 -0
- data/lib/fluxbit/config/speed_dial_component.rb +50 -0
- data/lib/fluxbit/config/spinner_component.rb +30 -0
- data/lib/fluxbit/config/spinner_percent_component.rb +61 -0
- data/lib/fluxbit/config/stepper_component.rb +299 -0
- data/lib/fluxbit/config/tab_component.rb +6 -0
- data/lib/fluxbit/config/table_component.rb +75 -0
- data/lib/fluxbit/config/theme_button_component.rb +19 -0
- data/lib/fluxbit/config/timeline_component.rb +77 -0
- data/lib/fluxbit/view_components/engine.rb +11 -3
- data/lib/fluxbit/view_components/version.rb +1 -1
- data/lib/fluxbit/view_components.rb +27 -1
- data/lib/generators/fluxbit/devise_views_generator.rb +116 -0
- data/lib/generators/fluxbit/pagy_generator.rb +39 -0
- data/lib/generators/fluxbit/scaffold_generator.rb +165 -0
- data/lib/generators/fluxbit/templates/_alert.html.erb.tt +1 -0
- data/lib/generators/fluxbit/templates/_flash.html.erb.tt +15 -0
- data/lib/generators/fluxbit/templates/_form.html.erb.tt +38 -0
- data/lib/generators/fluxbit/templates/_metadata.html.erb.tt +44 -0
- data/lib/generators/fluxbit/templates/controller.rb.tt +406 -0
- data/lib/generators/fluxbit/templates/create.turbo_stream.erb.tt +7 -0
- data/lib/generators/fluxbit/templates/destroy.turbo_stream.erb.tt +3 -0
- data/lib/generators/fluxbit/templates/destroy_all.turbo_stream.erb.tt +9 -0
- data/lib/generators/fluxbit/templates/devise_views/confirmations/new.html.erb +11 -0
- data/lib/generators/fluxbit/templates/devise_views/layouts/devise.html.erb +64 -0
- data/lib/generators/fluxbit/templates/devise_views/mailer/confirmation_instructions.html.erb +5 -0
- data/lib/generators/fluxbit/templates/devise_views/mailer/email_changed.html.erb +7 -0
- data/lib/generators/fluxbit/templates/devise_views/mailer/password_changed.html.erb +3 -0
- data/lib/generators/fluxbit/templates/devise_views/mailer/reset_password_instructions.html.erb +8 -0
- data/lib/generators/fluxbit/templates/devise_views/mailer/unlock_instructions.html.erb +7 -0
- data/lib/generators/fluxbit/templates/devise_views/passwords/edit.html.erb +29 -0
- data/lib/generators/fluxbit/templates/devise_views/passwords/new.html.erb +11 -0
- data/lib/generators/fluxbit/templates/devise_views/registrations/edit.html.erb +43 -0
- data/lib/generators/fluxbit/templates/devise_views/registrations/new.html.erb +34 -0
- data/lib/generators/fluxbit/templates/devise_views/sessions/new.html.erb +15 -0
- data/lib/generators/fluxbit/templates/devise_views/shared/_error_messages.html.erb +14 -0
- data/lib/generators/fluxbit/templates/devise_views/shared/_links.html.erb +25 -0
- data/lib/generators/fluxbit/templates/devise_views/unlocks/new.html.erb +11 -0
- data/lib/generators/fluxbit/templates/edit.html.erb.tt +47 -0
- data/lib/generators/fluxbit/templates/fluxbit_pagy.css +27 -0
- data/lib/generators/fluxbit/templates/i18n.en.yml.tt +121 -0
- data/lib/generators/fluxbit/templates/i18n.pt-BR.yml.tt +121 -0
- data/lib/generators/fluxbit/templates/index.html.erb.tt +254 -0
- data/lib/generators/fluxbit/templates/index.json.jbuilder.tt +33 -0
- data/lib/generators/fluxbit/templates/new.html.erb.tt +47 -0
- data/lib/generators/fluxbit/templates/partial.html.erb.tt +61 -0
- data/lib/generators/fluxbit/templates/policy.rb.tt +36 -0
- data/lib/generators/fluxbit/templates/send_alert_via_drawer.erb.tt +10 -0
- data/lib/generators/fluxbit/templates/show.html.erb.tt +44 -0
- data/lib/generators/fluxbit/templates/show.json.jbuilder.tt +6 -0
- data/lib/generators/fluxbit/templates/update.turbo_stream.erb.tt +10 -0
- data/lib/generators/fluxbit/templates/update_all.turbo_stream.erb.tt +20 -0
- data/lib/install/install.rb +61 -3
- metadata +127 -35
- data/LICENSE.txt +0 -20
- data/app/components/fluxbit/form/checkbox_input_component.rb +0 -61
- data/app/components/fluxbit/form/datepicker_component.rb +0 -7
- data/app/components/fluxbit/form/radio_input_component.rb +0 -21
- data/app/components/fluxbit/form/range_input_component.rb +0 -51
- data/app/components/fluxbit/form/select_free_input_component.rb +0 -77
- data/app/components/fluxbit/form/select_input_component.rb +0 -21
- data/app/components/fluxbit/form/spacer_input_component.rb +0 -12
- data/app/components/fluxbit/form/text_input_component.rb +0 -225
- data/app/components/fluxbit/form/textarea_input_component.rb +0 -57
- data/app/components/fluxbit/form/toggle_input_component.rb +0 -166
- data/app/components/fluxbit/form/upload_image_input_component.html.erb +0 -48
- data/app/components/fluxbit/form/upload_image_input_component.rb +0 -61
- data/app/components/fluxbit/form/upload_input_component.html.erb +0 -12
- data/app/components/fluxbit/form/upload_input_component.rb +0 -47
- data/app/helpers/fluxbit/classes_helper.rb +0 -9
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
class Fluxbit::Form::ToggleInputComponent < Fluxbit::Form::Component
|
|
4
|
-
# rubocop: disable Layout/LineLength, Metrics/BlockLength
|
|
5
|
-
cattr_accessor :styles do
|
|
6
|
-
{
|
|
7
|
-
root: {
|
|
8
|
-
base: "relative inline-flex items-center mr-2",
|
|
9
|
-
base2: "relative inline-flex items-center",
|
|
10
|
-
no_helper_text: "mb-5",
|
|
11
|
-
active: {
|
|
12
|
-
on: "cursor-pointer",
|
|
13
|
-
off: "cursor-not-allowed opacity-50"
|
|
14
|
-
},
|
|
15
|
-
label: "ml-3 text-sm font-medium text-slate-900 dark:text-slate-300",
|
|
16
|
-
input: "sr-only peer"
|
|
17
|
-
},
|
|
18
|
-
toggle: {
|
|
19
|
-
base: "toggle-bg rounded-full after:rounded-full peer peer-focus:ring-4 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:bg-white after:border after:transition-all",
|
|
20
|
-
checked: {
|
|
21
|
-
default: "peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 peer-checked:bg-blue-600",
|
|
22
|
-
success: "peer-focus:ring-green-300 dark:peer-focus:ring-green-800 peer-checked:bg-green-600",
|
|
23
|
-
failure: "peer-focus:ring-red-300 dark:peer-focus:ring-red-800 peer-checked:bg-red-600",
|
|
24
|
-
info: "peer-focus:ring-cyan-300 dark:peer-focus:ring-cyan-800 peer-checked:bg-cyan-600",
|
|
25
|
-
warning: "peer-focus:ring-yellow-300 dark:peer-focus:ring-yellow-800 peer-checked:bg-yellow-600",
|
|
26
|
-
dark: "peer-focus:ring-gray-300 dark:peer-focus:ring-gray-800 peer-checked:bg-gray-600",
|
|
27
|
-
light: "peer-focus:ring-gray-300 dark:peer-focus:ring-gray-100 peer-checked:bg-gray-100",
|
|
28
|
-
teal: "peer-focus:ring-teal-300 dark:peer-focus:ring-teal-800 peer-checked:bg-teal-600",
|
|
29
|
-
purple: "peer-focus:ring-purple-300 dark:peer-focus:ring-purple-800 peer-checked:bg-purple-600",
|
|
30
|
-
cyan: "peer-focus:ring-cyan-300 dark:peer-focus:ring-cyan-800 peer-checked:bg-cyan-600",
|
|
31
|
-
lime: "peer-focus:ring-lime-300 dark:peer-focus:ring-lime-800 peer-checked:bg-lime-600",
|
|
32
|
-
indigo: "peer-focus:ring-indigo-300 dark:peer-focus:ring-indigo-800 peer-checked:bg-indigo-600",
|
|
33
|
-
pink: "peer-focus:ring-pink-300 dark:peer-focus:ring-pink-800 peer-checked:bg-pink-600"
|
|
34
|
-
},
|
|
35
|
-
unchecked: {
|
|
36
|
-
default: "bg-slate-200 dark:bg-slate-700 dark:border-slate-600 after:border-slate-300",
|
|
37
|
-
blue: "bg-blue-600 dark:bg-blue-500 dark:border-blue-500 after:border-blue-600",
|
|
38
|
-
success: "bg-green-600 dark:bg-green-500 dark:border-green-500 after:border-green-600",
|
|
39
|
-
failure: "bg-red-600 dark:bg-red-500 dark:border-red-500 after:border-red-600",
|
|
40
|
-
info: "bg-cyan-600 dark:bg-cyan-500 dark:border-cyan-500 after:border-cyan-600",
|
|
41
|
-
warning: "bg-yellow-600 dark:bg-yellow-500 dark:border-yellow-500 after:border-yellow-600",
|
|
42
|
-
teal: "bg-teal-600 dark:bg-teal-500 dark:border-teal-500 after:border-teal-600",
|
|
43
|
-
purple: "bg-purple-600 dark:bg-purple-500 dark:border-purple-500 after:border-purple-600",
|
|
44
|
-
cyan: "bg-cyan-600 dark:bg-cyan-500 dark:border-cyan-500 after:border-cyan-600",
|
|
45
|
-
lime: "bg-lime-600 dark:bg-lime-500 dark:border-lime-500 after:border-lime-600",
|
|
46
|
-
indigo: "bg-indigo-600 dark:bg-indigo-500 dark:border-indigo-500 after:border-indigo-600",
|
|
47
|
-
pink: "bg-pink-600 dark:bg-pink-500 dark:border-pink-500 after:border-pink-600",
|
|
48
|
-
dark: "bg-gray-600 dark:bg-gray-800 dark:border-gray-600 after:border-gray-300",
|
|
49
|
-
light: "bg-gray-50 dark:bg-gray-300 dark:border-gray-200 after:border-gray-50",
|
|
50
|
-
light_success: "bg-green-200 dark:bg-green-700 dark:border-green-600 after:border-green-300",
|
|
51
|
-
light_failure: "bg-red-200 dark:bg-red-700 dark:border-red-600 after:border-red-300",
|
|
52
|
-
light_info: "bg-cyan-200 dark:bg-cyan-700 dark:border-cyan-600 after:border-cyan-300",
|
|
53
|
-
light_warning: "bg-yellow-200 dark:bg-yellow-700 dark:border-yellow-600 after:border-yellow-300",
|
|
54
|
-
light_teal: "bg-teal-200 dark:bg-teal-700 dark:border-teal-600 after:border-teal-300",
|
|
55
|
-
light_purple: "bg-purple-200 dark:bg-purple-700 dark:border-purple-600 after:border-purple-300",
|
|
56
|
-
light_cyan: "bg-cyan-200 dark:bg-cyan-700 dark:border-cyan-600 after:border-cyan-300",
|
|
57
|
-
light_lime: "bg-lime-200 dark:bg-lime-700 dark:border-lime-600 after:border-lime-300",
|
|
58
|
-
light_indigo: "bg-indigo-200 dark:bg-indigo-700 dark:border-indigo-600 after:border-indigo-300",
|
|
59
|
-
light_pink: "bg-pink-200 dark:bg-pink-700 dark:border-pink-600 after:border-pink-300"
|
|
60
|
-
},
|
|
61
|
-
sizes: {
|
|
62
|
-
sm: "w-9 h-5 after:top-[2px] after:left-[2px] after:h-4 after:w-4",
|
|
63
|
-
md: "w-11 h-6 after:top-[2px] after:left-[2px] after:h-5 after:w-5",
|
|
64
|
-
lg: "w-14 h-7 after:top-0.5 after:left-[4px] after:h-6 after:w-6"
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
right_sided: {
|
|
68
|
-
top: "flex items-center justify-between py-4",
|
|
69
|
-
inside: "flex flex-col"
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
end
|
|
73
|
-
# rubocop: enable Layout/LineLength, Metrics/BlockLength
|
|
74
|
-
|
|
75
|
-
renders_one :helper, "Fluxbit::Form::HelperTextComponent"
|
|
76
|
-
|
|
77
|
-
def initialize(form: nil, field: nil, color: nil, unchecked_color: :default, sizing: :md,
|
|
78
|
-
right_sided: false, label: nil, helper_text: nil, helper_popover: nil,
|
|
79
|
-
helper_popover_placement: "right", **props)
|
|
80
|
-
super
|
|
81
|
-
@form = form
|
|
82
|
-
@field = field
|
|
83
|
-
@object = form&.object
|
|
84
|
-
@right_sided = right_sided
|
|
85
|
-
@sizing = sizing.in?(styles[:toggle][:sizes].keys) ? sizing : :md
|
|
86
|
-
@color = valid_color(color)
|
|
87
|
-
@unchecked_color = unchecked_color.in?(styles[:toggle][:unchecked].keys) ? unchecked_color : :default
|
|
88
|
-
@props = props
|
|
89
|
-
@label = label_value(label, @object, field, id)
|
|
90
|
-
@helper_text = define_helper_text(helper_text, @object, field)
|
|
91
|
-
@helper_popover = define_helper_popover(helper_popover, @object, field)
|
|
92
|
-
@helper_popover_placement = helper_popover_placement
|
|
93
|
-
@label_class = "ml-2" unless right_sided
|
|
94
|
-
|
|
95
|
-
# Input
|
|
96
|
-
@props[:type] = "checkbox"
|
|
97
|
-
declare_classes
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
def valid_color(color)
|
|
101
|
-
return color if styles[:toggle][:checked].key?(color)
|
|
102
|
-
return :failure if errors.present?
|
|
103
|
-
|
|
104
|
-
:default
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def declare_classes
|
|
108
|
-
add(class: styles[:root][:input], to: @props)
|
|
109
|
-
|
|
110
|
-
# Root
|
|
111
|
-
@root_element = { class: "#{styles[:root][:base]} #{styles[:root][:active][(@props[:disabled] ? :off : :on)]}" }
|
|
112
|
-
|
|
113
|
-
# Toggle
|
|
114
|
-
@toggle_element = {
|
|
115
|
-
class:
|
|
116
|
-
[
|
|
117
|
-
styles[:toggle][:base],
|
|
118
|
-
styles[:toggle][:unchecked][@unchecked_color],
|
|
119
|
-
styles[:toggle][:checked][@color],
|
|
120
|
-
styles[:toggle][:sizes][@sizing]
|
|
121
|
-
].join(" ")
|
|
122
|
-
}
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
def input
|
|
126
|
-
if @form.nil?
|
|
127
|
-
content_tag :input, content, @props
|
|
128
|
-
else
|
|
129
|
-
@form.check_box(@field, **@props)
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
def toggle
|
|
134
|
-
content_tag :div, "", @toggle_element
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
def toggle_input
|
|
138
|
-
content_tag :div, safe_join(input, toggle), class: styles[:root][:base2]
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
def label_container
|
|
142
|
-
content_tag(:label, safe_join(toggle_input, label), @root_element)
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
def left_sided
|
|
146
|
-
safe_join label_container, (helper? ? helper : helper_text)
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
def right_sided
|
|
150
|
-
content_tag :label, class: styles[:right_sided][:top] do
|
|
151
|
-
safe_join(
|
|
152
|
-
content_tag(
|
|
153
|
-
:div,
|
|
154
|
-
safe_join(label, (helper? ? helper : helper_text)),
|
|
155
|
-
class: styles[:right_sided][:inside]
|
|
156
|
-
),
|
|
157
|
-
toggle_input
|
|
158
|
-
)
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
def call
|
|
163
|
-
add(class: styles[:root][:no_helper_text], to: @root_element) if @helper_text.nil? && !helper?
|
|
164
|
-
@right_sided ? right_sided : left_sided
|
|
165
|
-
end
|
|
166
|
-
end
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
<div id="<%= id %>" class="mt-6 grow lg:mt-0 lg:ml-6 lg:shrink-0 lg:grow-0">
|
|
2
|
-
<%= label %>
|
|
3
|
-
<div class="mt-1 lg:hidden">
|
|
4
|
-
<div class="flex items-center">
|
|
5
|
-
<div class="inline-block h-12 w-12 shrink-0 overflow-hidden rounded-full relative" aria-hidden="true">
|
|
6
|
-
<%= image_element %>
|
|
7
|
-
</div>
|
|
8
|
-
<div class="ml-5 rounded-md shadow-xs">
|
|
9
|
-
<div class="group relative flex items-center justify-center rounded-md border border-slate-300 py-2 px-3 focus-within:ring-2 focus-within:ring-sky-500 focus-within:ring-offset-2 hover:bg-slate-50">
|
|
10
|
-
<label for="mobile-<%= id %>" class="pointer-events-none relative text-sm font-medium leading-4 text-slate-700">
|
|
11
|
-
<span>Change</span>
|
|
12
|
-
<span class="sr-only"><%= @label %></span>
|
|
13
|
-
</label>
|
|
14
|
-
<%= input_element(input_id: "mobile-#{id}") %>
|
|
15
|
-
</div>
|
|
16
|
-
</div>
|
|
17
|
-
</div>
|
|
18
|
-
</div>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
<div class="relative hidden overflow-hidden rounded-full lg:block w-40">
|
|
22
|
-
|
|
23
|
-
<div class="inline-block h-40 w-40 shrink-0 overflow-hidden rounded-full relative" aria-hidden="true">
|
|
24
|
-
<%= image_element %>
|
|
25
|
-
</div>
|
|
26
|
-
|
|
27
|
-
<label for="desktop-<%= id %>" class="absolute inset-0 flex flex-col h-full w-full items-center justify-center bg-blue-800/75 text-sm font-medium text-white opacity-0 hover:opacity-100">
|
|
28
|
-
<svg xmlns="http://www.w3.org/2000/svg" class="h-12 w-12 text-white mb-2" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
29
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v6m0 0v6m0-6h6m-6 0H6"></path>
|
|
30
|
-
</svg>
|
|
31
|
-
<span>Change</span>
|
|
32
|
-
<span class="sr-only"><%= @label %></span>
|
|
33
|
-
<%= input_element(input_id: "desktop-#{id}") %>
|
|
34
|
-
</label>
|
|
35
|
-
</div>
|
|
36
|
-
<%= helper_text %>
|
|
37
|
-
</div>
|
|
38
|
-
|
|
39
|
-
<script>
|
|
40
|
-
var loadFile = function(event, id) {
|
|
41
|
-
const elements = document.getElementById('business_logo_image').querySelectorAll('.img_photo');
|
|
42
|
-
|
|
43
|
-
elements.forEach(element => {
|
|
44
|
-
element.src = URL.createObjectURL(event.target.files[0]);
|
|
45
|
-
element.onload = function() { URL.revokeObjectURL(element.src) }
|
|
46
|
-
});
|
|
47
|
-
};
|
|
48
|
-
</script>
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
class Fluxbit::Form::UploadImageInputComponent < Fluxbit::Form::Component
|
|
4
|
-
cattr_accessor :styles do
|
|
5
|
-
{
|
|
6
|
-
height: {
|
|
7
|
-
no: "",
|
|
8
|
-
sm: "h-32",
|
|
9
|
-
md: "h-64",
|
|
10
|
-
lg: "h-96"
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def initialize(form: nil, field: nil, id: nil, height: :md, label: nil, helper_text: nil, helper_popover: nil,
|
|
16
|
-
helper_popover_placement: "right", type: nil, image_path: nil, image_placeholder: nil,
|
|
17
|
-
title: true, subtitle: true, **props)
|
|
18
|
-
super
|
|
19
|
-
@form = form
|
|
20
|
-
@object = form&.object
|
|
21
|
-
@field = field
|
|
22
|
-
@id = id
|
|
23
|
-
@title = title
|
|
24
|
-
@subtitle = subtitle
|
|
25
|
-
@props = props
|
|
26
|
-
# @height = height.in?(styles[:height].keys) ? height : :md
|
|
27
|
-
@label = label_value(label, @object, field, id)
|
|
28
|
-
@helper_text = helper_text.present? ? define_helper_text(helper_text, @object, field) : ''
|
|
29
|
-
@helper_popover = define_helper_popover(helper_popover, @object, field)
|
|
30
|
-
@helper_popover_placement = helper_popover_placement
|
|
31
|
-
@image_path = image_path || (if @object&.send(@field)&.send("attached?")
|
|
32
|
-
@object&.send(@field)&.variant(resize_to_fit: [ 160, 160 ])
|
|
33
|
-
end) || image_placeholder || ""
|
|
34
|
-
@props["class"] = "absolute inset-0 h-full w-full cursor-pointer rounded-md border-gray-300 opacity-0"
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def input_element(input_id: nil)
|
|
38
|
-
@props["onchange"] = "loadFile(event, '#{id}')"
|
|
39
|
-
return content_tag :input, nil, @props.merge(id: input_id || id) if @form.nil?
|
|
40
|
-
|
|
41
|
-
@form.file_field(@field, **@props, id: input_id || id)
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def image_element
|
|
45
|
-
image_tag @image_path,
|
|
46
|
-
class: "img_photo absolute inset-0 w-full h-full object-cover rounded-full",
|
|
47
|
-
alt: @field&.to_s&.humanize
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def title
|
|
51
|
-
return safe_join(content_tag(:span, "Click to upload", class: "font-semibold"), " or drag and drop") if @title == true
|
|
52
|
-
|
|
53
|
-
@title
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def subtitle
|
|
57
|
-
return "SVG, PNG, JPG or GIF (MAX. 800x400px)" if @subtitle == true
|
|
58
|
-
|
|
59
|
-
@subtitle
|
|
60
|
-
end
|
|
61
|
-
end
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<div class="<%= self.styles[:bae] %>">
|
|
2
|
-
<label for="<%= id %>" class="<%= self.styles[:label] %> <%= self.styles[:height][@height] %>">
|
|
3
|
-
<div class="<%= self.styles[:inner_div] %>">
|
|
4
|
-
<svg class="w-8 h-8 mb-4 text-slate-500 dark:text-slate-400" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 16">
|
|
5
|
-
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 13h3a3 3 0 0 0 0-6h-.025A5.56 5.56 0 0 0 16 6.5 5.5 5.5 0 0 0 5.207 5.021C5.137 5.017 5.071 5 5 5a4 4 0 0 0 0 8h2.167M10 15V6m0 0L8 8m2-2 2 2"/>
|
|
6
|
-
</svg>
|
|
7
|
-
<p class="<%= self.styles[:title] %>"><%= title %></p>
|
|
8
|
-
<p class="<%= self.styles[:subtitle] %>"><%= subtitle %></p>
|
|
9
|
-
</div>
|
|
10
|
-
<input id="<%= id %>" name="<%= @name %>" type="file" class="hidden" />
|
|
11
|
-
</label>
|
|
12
|
-
</div>
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
class Fluxbit::Form::UploadInputComponent < Fluxbit::Form::Component
|
|
4
|
-
# rubocop: disable Layout/LineLength
|
|
5
|
-
cattr_accessor :styles do
|
|
6
|
-
{
|
|
7
|
-
base: "flex items-center justify-center w-full",
|
|
8
|
-
label: "flex flex-col items-center justify-center w-full border-2 border-slate-300 border-dashed rounded-lg cursor-pointer bg-slate-50 dark:hover:bg-bray-800 dark:bg-slate-700 hover:bg-slate-100 dark:border-slate-600 dark:hover:border-slate-500 dark:hover:bg-slate-600",
|
|
9
|
-
inner_div: "flex flex-col items-center justify-center pt-5 pb-6",
|
|
10
|
-
title: "mb-2 text-sm text-slate-500 dark:text-slate-400",
|
|
11
|
-
subtitle: "text-xs text-slate-500 dark:text-slate-400",
|
|
12
|
-
height: {
|
|
13
|
-
no: "",
|
|
14
|
-
sm: "h-32",
|
|
15
|
-
md: "h-64",
|
|
16
|
-
lg: "h-96"
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
end
|
|
20
|
-
# rubocop: enable Layout/LineLength
|
|
21
|
-
|
|
22
|
-
def initialize(form: nil, field: nil, id: nil, height: :md,
|
|
23
|
-
title: true, subtitle: true, **props)
|
|
24
|
-
super
|
|
25
|
-
@form = form
|
|
26
|
-
@object = form&.object
|
|
27
|
-
@field = field
|
|
28
|
-
@id = id
|
|
29
|
-
@title = title
|
|
30
|
-
@subtitle = subtitle
|
|
31
|
-
@props = props
|
|
32
|
-
@height = height.in?(styles[:height].keys) ? height : :md
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def title
|
|
36
|
-
return safe_join(content_tag(:span, "Click to upload", class: "font-semibold"),
|
|
37
|
-
" or drag and drop") if @title == true
|
|
38
|
-
|
|
39
|
-
@title
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def subtitle
|
|
43
|
-
return "SVG, PNG, JPG or GIF (MAX. 800x400px)" if @subtitle == true
|
|
44
|
-
|
|
45
|
-
@subtitle
|
|
46
|
-
end
|
|
47
|
-
end
|