diff --git a/app/assets/images/pictograms/alert-outline.svg b/app/assets/images/pictograms/alert-outline.svg index 673af4c..41041d8 100644 --- a/app/assets/images/pictograms/alert-outline.svg +++ b/app/assets/images/pictograms/alert-outline.svg @@ -1 +1 @@ - + diff --git a/app/assets/images/pictograms/check-circle-outline.svg b/app/assets/images/pictograms/check-circle-outline.svg index 17f5737..385f9e2 100644 --- a/app/assets/images/pictograms/check-circle-outline.svg +++ b/app/assets/images/pictograms/check-circle-outline.svg @@ -1 +1 @@ - + diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 71d4d4c..ce658e3 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -12,6 +12,12 @@ module ApplicationHelper labeled_field_for(method, options) { super } end + def submit(value = nil, options = {}) + value, options = nil, value if value.is_a?(Hash) + options[:class] = @template.class_names('button', options[:class]) + super + end + private def labeled_field_for(method, options) @@ -72,13 +78,8 @@ module ApplicationHelper end def labeled_form_for(record, options = {}, &block) - extra_options = {builder: LabeledFormBuilder, - data: {turbo: false}, - html: {class: 'labeled-form'}} - options = options.deep_merge(extra_options) do |key, left, right| - key == :class ? class_names(left, right) : right - end - form_for(record, **options, &block) + extra_options = {builder: LabeledFormBuilder, html: {class: 'labeled-form'}} + form_for(record, **merge_attributes(options, extra_options), &block) end class TabularFormBuilder < ActionView::Helpers::FormBuilder @@ -113,8 +114,12 @@ module ApplicationHelper end def button(value = nil, options = {}, &block) - # button does not use #objectify_options - options.merge!(@options.slice(:form)) + # #button does not use #objectify_options/@default_options + value, options = nil, value if value.is_a?(Hash) + options = options.merge( + @default_options.slice(:form), + class: @template.class_names('button', options[:class]) + ) super end @@ -135,20 +140,21 @@ module ApplicationHelper # [autofocus]. Otherwise IDs are not unique when multiple forms are open # and the first input gets focus. record_object, options = nil, record_object if record_object.is_a?(Hash) - options.merge!(builder: TabularFormBuilder, skip_default_ids: true) + extra_options = {builder: TabularFormBuilder, skip_default_ids: true} + options = merge_attributes(options, extra_options) # TODO: set error message with setCustomValidity instead of rendering to flash? render_errors(record_object || record_name) fields_for(record_name, record_object, **options, &block) end def tabular_form_with(**options, &block) - options = options.deep_merge(builder: TabularFormBuilder, - html: {autocomplete: 'off'}) - form_with(**options, &block) + extra_options = {builder: TabularFormBuilder, html: {autocomplete: 'off'}} + form_with(**merge_attributes(options, extra_options), &block) end def svg_tag(source, label = nil, options = {}) - svg_tag = tag.svg(options) do + label, options = nil, label if label.is_a? Hash + svg_tag = tag.svg(**options) do tag.use(href: "#{image_path(source + ".svg")}#icon") end label.blank? ? svg_tag : svg_tag + tag.span(label) @@ -159,6 +165,7 @@ module ApplicationHelper ['measurements', 'scale-bathroom', :restricted], ['quantities', 'axis-arrow', :restricted, 'right'], ['units', 'weight-gram', :restricted], + # TODO: display users tab only if >1 user present; sole_user?/sole_admin? ['users', 'account-multiple-outline', :admin], ] @@ -206,6 +213,7 @@ module ApplicationHelper def render_errors(records) # Conversion of flash to Array only required because of Devise + # TODO: override Devise message setting to Array()? flash[:alert] = Array(flash[:alert]) Array(records).each { |record| flash[:alert] += record.errors.full_messages } end @@ -215,8 +223,8 @@ module ApplicationHelper # Conversion of flash to Array only required because of Devise Array(messages).map do |message| tag.div class: "flash #{entry}" do - tag.div(sanitize(message)) + tag.button(sanitize("×"), tabindex: -1, - onclick: "this.parentElement.remove();") + tag.span(sanitize(message)) + + svg_tag('pictograms/close-outline', {onclick: "this.parentElement.remove()"}) end end end.join.html_safe @@ -252,4 +260,11 @@ module ApplicationHelper [name, html_options] end + + # Like Hash#deep_merge, but aware of HTML attributes. + def merge_attributes(left, right) + left.deep_merge(right) do |key, lvalue, rvalue| + key == :class ? class_names(lvalue, rvalue) : rvalue + end + end end