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.
Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -0
  3. data/app/assets/javascripts/fluxbit_view_components/assigner_controller.js +49 -0
  4. data/app/assets/javascripts/fluxbit_view_components/auto_submit_controller.js +39 -0
  5. data/app/assets/javascripts/fluxbit_view_components/drawer_controller.js +135 -0
  6. data/app/assets/javascripts/fluxbit_view_components/index.js +56 -0
  7. data/app/assets/javascripts/fluxbit_view_components/method_link_controller.js +143 -0
  8. data/app/assets/javascripts/fluxbit_view_components/modal_controller.js +118 -0
  9. data/app/assets/javascripts/fluxbit_view_components/password_controller.js +170 -0
  10. data/app/assets/javascripts/fluxbit_view_components/progress_controller.js +374 -0
  11. data/app/assets/javascripts/fluxbit_view_components/row_click_controller.js +32 -0
  12. data/app/assets/javascripts/fluxbit_view_components/select_all_controller.js +122 -0
  13. data/app/assets/javascripts/fluxbit_view_components/spinner_percent_controller.js +174 -0
  14. data/app/assets/javascripts/fluxbit_view_components/theme_button_controller.js +90 -0
  15. data/app/assets/javascripts/fluxbit_view_components.js +1175 -0
  16. data/app/components/fluxbit/accordion_component.rb +125 -0
  17. data/app/components/fluxbit/alert_component.rb +8 -8
  18. data/app/components/fluxbit/avatar_component.rb +11 -12
  19. data/app/components/fluxbit/avatar_group_component.rb +1 -1
  20. data/app/components/fluxbit/badge_component.rb +8 -7
  21. data/app/components/fluxbit/banner_component.rb +139 -0
  22. data/app/components/fluxbit/bottom_navigation_component.rb +437 -0
  23. data/app/components/fluxbit/breadcrumb_component.rb +66 -0
  24. data/app/components/fluxbit/button_component.rb +39 -11
  25. data/app/components/fluxbit/button_group_component.rb +1 -1
  26. data/app/components/fluxbit/card_component.rb +26 -23
  27. data/app/components/fluxbit/carousel_component.rb +154 -0
  28. data/app/components/fluxbit/component.rb +24 -3
  29. data/app/components/fluxbit/drawer_component.html.erb +30 -0
  30. data/app/components/fluxbit/drawer_component.rb +125 -0
  31. data/app/components/fluxbit/dropdown_component.rb +41 -0
  32. data/app/components/fluxbit/dropdown_item_component.rb +68 -0
  33. data/app/components/fluxbit/flex_component.rb +1 -1
  34. data/app/components/fluxbit/form/check_box_component.rb +56 -0
  35. data/app/components/fluxbit/form/component.rb +27 -26
  36. data/app/components/fluxbit/form/dropzone_component.html.erb +39 -0
  37. data/app/components/fluxbit/form/dropzone_component.rb +39 -0
  38. data/app/components/fluxbit/form/field_component.rb +28 -0
  39. data/app/components/fluxbit/form/form_builder_component.rb +1 -1
  40. data/app/components/fluxbit/form/{helper_text_component.rb → help_text_component.rb} +9 -4
  41. data/app/components/fluxbit/form/label_component.rb +40 -30
  42. data/app/components/fluxbit/form/password_component.rb +247 -0
  43. data/app/components/fluxbit/form/radio_group_button_component.rb +126 -0
  44. data/app/components/fluxbit/form/range_component.rb +52 -0
  45. data/app/components/fluxbit/form/select_component.rb +185 -0
  46. data/app/components/fluxbit/form/text_field_component.rb +185 -0
  47. data/app/components/fluxbit/form/toggle_component.html.erb +23 -0
  48. data/app/components/fluxbit/form/toggle_component.rb +81 -0
  49. data/app/components/fluxbit/form/upload_image_component.html.erb +50 -0
  50. data/app/components/fluxbit/form/upload_image_component.rb +61 -0
  51. data/app/components/fluxbit/gravatar_component.rb +7 -0
  52. data/app/components/fluxbit/icon_helpers.rb +167 -0
  53. data/app/components/fluxbit/link_component.rb +42 -0
  54. data/app/components/fluxbit/modal_component.rb +28 -31
  55. data/app/components/fluxbit/pagination_component.rb +206 -0
  56. data/app/components/fluxbit/popover_component.rb +14 -14
  57. data/app/components/fluxbit/progress_component.rb +196 -0
  58. data/app/components/fluxbit/skeleton_component.rb +237 -0
  59. data/app/components/fluxbit/speed_dial_action_component.html.erb +30 -0
  60. data/app/components/fluxbit/speed_dial_action_component.rb +59 -0
  61. data/app/components/fluxbit/speed_dial_component.html.erb +33 -0
  62. data/app/components/fluxbit/speed_dial_component.rb +73 -0
  63. data/app/components/fluxbit/spinner_component.rb +71 -0
  64. data/app/components/fluxbit/spinner_percent_component.rb +174 -0
  65. data/app/components/fluxbit/stepper_component.rb +223 -0
  66. data/app/components/fluxbit/tab_component.rb +44 -25
  67. data/app/components/fluxbit/table_component.rb +186 -0
  68. data/app/components/fluxbit/table_group_component.rb +28 -0
  69. data/app/components/fluxbit/theme_button_component.rb +64 -0
  70. data/app/components/fluxbit/timeline_component.rb +63 -0
  71. data/app/components/fluxbit/timeline_item_component.html.erb +64 -0
  72. data/app/components/fluxbit/timeline_item_component.rb +78 -0
  73. data/app/components/fluxbit/tooltip_component.rb +2 -2
  74. data/app/helpers/fluxbit/components_helper.rb +93 -51
  75. data/app/helpers/fluxbit/form_builder.rb +136 -0
  76. data/app/helpers/fluxbit/view_helper.rb +71 -0
  77. data/config/locales/en.yml +37 -4
  78. data/config/locales/pt-BR.yml +36 -0
  79. data/lib/fluxbit/config/accordion_component.rb +73 -0
  80. data/lib/fluxbit/config/avatar_component.rb +11 -11
  81. data/lib/fluxbit/config/badge_component.rb +14 -11
  82. data/lib/fluxbit/config/banner_component.rb +60 -0
  83. data/lib/fluxbit/config/bottom_navigation_component.rb +74 -0
  84. data/lib/fluxbit/config/breadcrumb_component.rb +24 -0
  85. data/lib/fluxbit/config/button_component.rb +6 -4
  86. data/lib/fluxbit/config/card_component.rb +23 -12
  87. data/lib/fluxbit/config/carousel_component.rb +33 -0
  88. data/lib/fluxbit/config/drawer_component.rb +48 -0
  89. data/lib/fluxbit/config/dropdown_component.rb +29 -0
  90. data/lib/fluxbit/config/form/check_box_component.rb +19 -0
  91. data/lib/fluxbit/config/form/dropzone_component.rb +20 -0
  92. data/lib/fluxbit/config/form/{helper_text_component.rb → help_text_component.rb} +2 -2
  93. data/lib/fluxbit/config/form/label_component.rb +31 -0
  94. data/lib/fluxbit/config/form/password_component.rb +19 -0
  95. data/lib/fluxbit/config/form/radio_group_button_component.rb +24 -0
  96. data/lib/fluxbit/config/form/range_component.rb +15 -0
  97. data/lib/fluxbit/config/form/text_field_component.rb +76 -0
  98. data/lib/fluxbit/config/form/toggle_component.rb +79 -0
  99. data/lib/fluxbit/config/link_component.rb +24 -0
  100. data/lib/fluxbit/config/modal_component.rb +1 -1
  101. data/lib/fluxbit/config/pagination_component.rb +31 -0
  102. data/lib/fluxbit/config/popover_component.rb +1 -1
  103. data/lib/fluxbit/config/progress_component.rb +63 -0
  104. data/lib/fluxbit/config/skeleton_component.rb +82 -0
  105. data/lib/fluxbit/config/speed_dial_component.rb +50 -0
  106. data/lib/fluxbit/config/spinner_component.rb +30 -0
  107. data/lib/fluxbit/config/spinner_percent_component.rb +61 -0
  108. data/lib/fluxbit/config/stepper_component.rb +299 -0
  109. data/lib/fluxbit/config/tab_component.rb +6 -0
  110. data/lib/fluxbit/config/table_component.rb +75 -0
  111. data/lib/fluxbit/config/theme_button_component.rb +19 -0
  112. data/lib/fluxbit/config/timeline_component.rb +77 -0
  113. data/lib/fluxbit/view_components/engine.rb +11 -3
  114. data/lib/fluxbit/view_components/version.rb +1 -1
  115. data/lib/fluxbit/view_components.rb +27 -1
  116. data/lib/generators/fluxbit/devise_views_generator.rb +116 -0
  117. data/lib/generators/fluxbit/pagy_generator.rb +39 -0
  118. data/lib/generators/fluxbit/scaffold_generator.rb +165 -0
  119. data/lib/generators/fluxbit/templates/_alert.html.erb.tt +1 -0
  120. data/lib/generators/fluxbit/templates/_flash.html.erb.tt +15 -0
  121. data/lib/generators/fluxbit/templates/_form.html.erb.tt +38 -0
  122. data/lib/generators/fluxbit/templates/_metadata.html.erb.tt +44 -0
  123. data/lib/generators/fluxbit/templates/controller.rb.tt +406 -0
  124. data/lib/generators/fluxbit/templates/create.turbo_stream.erb.tt +7 -0
  125. data/lib/generators/fluxbit/templates/destroy.turbo_stream.erb.tt +3 -0
  126. data/lib/generators/fluxbit/templates/destroy_all.turbo_stream.erb.tt +9 -0
  127. data/lib/generators/fluxbit/templates/devise_views/confirmations/new.html.erb +11 -0
  128. data/lib/generators/fluxbit/templates/devise_views/layouts/devise.html.erb +64 -0
  129. data/lib/generators/fluxbit/templates/devise_views/mailer/confirmation_instructions.html.erb +5 -0
  130. data/lib/generators/fluxbit/templates/devise_views/mailer/email_changed.html.erb +7 -0
  131. data/lib/generators/fluxbit/templates/devise_views/mailer/password_changed.html.erb +3 -0
  132. data/lib/generators/fluxbit/templates/devise_views/mailer/reset_password_instructions.html.erb +8 -0
  133. data/lib/generators/fluxbit/templates/devise_views/mailer/unlock_instructions.html.erb +7 -0
  134. data/lib/generators/fluxbit/templates/devise_views/passwords/edit.html.erb +29 -0
  135. data/lib/generators/fluxbit/templates/devise_views/passwords/new.html.erb +11 -0
  136. data/lib/generators/fluxbit/templates/devise_views/registrations/edit.html.erb +43 -0
  137. data/lib/generators/fluxbit/templates/devise_views/registrations/new.html.erb +34 -0
  138. data/lib/generators/fluxbit/templates/devise_views/sessions/new.html.erb +15 -0
  139. data/lib/generators/fluxbit/templates/devise_views/shared/_error_messages.html.erb +14 -0
  140. data/lib/generators/fluxbit/templates/devise_views/shared/_links.html.erb +25 -0
  141. data/lib/generators/fluxbit/templates/devise_views/unlocks/new.html.erb +11 -0
  142. data/lib/generators/fluxbit/templates/edit.html.erb.tt +47 -0
  143. data/lib/generators/fluxbit/templates/fluxbit_pagy.css +27 -0
  144. data/lib/generators/fluxbit/templates/i18n.en.yml.tt +121 -0
  145. data/lib/generators/fluxbit/templates/i18n.pt-BR.yml.tt +121 -0
  146. data/lib/generators/fluxbit/templates/index.html.erb.tt +254 -0
  147. data/lib/generators/fluxbit/templates/index.json.jbuilder.tt +33 -0
  148. data/lib/generators/fluxbit/templates/new.html.erb.tt +47 -0
  149. data/lib/generators/fluxbit/templates/partial.html.erb.tt +61 -0
  150. data/lib/generators/fluxbit/templates/policy.rb.tt +36 -0
  151. data/lib/generators/fluxbit/templates/send_alert_via_drawer.erb.tt +10 -0
  152. data/lib/generators/fluxbit/templates/show.html.erb.tt +44 -0
  153. data/lib/generators/fluxbit/templates/show.json.jbuilder.tt +6 -0
  154. data/lib/generators/fluxbit/templates/update.turbo_stream.erb.tt +10 -0
  155. data/lib/generators/fluxbit/templates/update_all.turbo_stream.erb.tt +20 -0
  156. data/lib/install/install.rb +61 -3
  157. metadata +127 -35
  158. data/LICENSE.txt +0 -20
  159. data/app/components/fluxbit/form/checkbox_input_component.rb +0 -61
  160. data/app/components/fluxbit/form/datepicker_component.rb +0 -7
  161. data/app/components/fluxbit/form/radio_input_component.rb +0 -21
  162. data/app/components/fluxbit/form/range_input_component.rb +0 -51
  163. data/app/components/fluxbit/form/select_free_input_component.rb +0 -77
  164. data/app/components/fluxbit/form/select_input_component.rb +0 -21
  165. data/app/components/fluxbit/form/spacer_input_component.rb +0 -12
  166. data/app/components/fluxbit/form/text_input_component.rb +0 -225
  167. data/app/components/fluxbit/form/textarea_input_component.rb +0 -57
  168. data/app/components/fluxbit/form/toggle_input_component.rb +0 -166
  169. data/app/components/fluxbit/form/upload_image_input_component.html.erb +0 -48
  170. data/app/components/fluxbit/form/upload_image_input_component.rb +0 -61
  171. data/app/components/fluxbit/form/upload_input_component.html.erb +0 -12
  172. data/app/components/fluxbit/form/upload_input_component.rb +0 -47
  173. 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
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Fluxbit
4
- module ClassesHelper
5
- def fx_body_class
6
- "h-full bg-slate-100 dark:bg-slate-900 dark:text-white"
7
- end
8
- end
9
- end