mirror of
https://github.com/we-promise/sure.git
synced 2026-04-09 15:24:48 +00:00
* feat: add new UI component to display dropdown select with filter * feat: use new dropdown componet for category selection in transactions * feat: improve dropdown controller * feat: Add checkbox indicator to highlight selected element in list * feat: add possibility to define dropdown without search * feat: initial implementation of variants * feat: Add default color for dropdown menu * feat: add "icon" variant for dropdown * refactor: component + controller refactoring * refactor: view + component * fix: adjust min width in selection for mobile * feat: refactor collection_select method to use new filter dropdown component * fix: compute fixed position for dropdown * feat: controller improvements * lint issues * feat: add dot color if no icon is available * refactor: controller refactor + update naming for variant from icon to logo * fix: set width to 100% for select dropdown * feat: add variant to collection_select in new transaction form * fix: typo in placeholder value * fix: add back include_blank property * refactor: rename component from FilterDropdown to Select * fix: translate placeholder and keep value_method and text_method * fix: remove duplicate variable assignment * fix: translate placeholder * fix: verify color format * fix: use right autocomplete value * fix: selection issue + controller adjustments * fix: move calls to startAutoUpdate and stopAutoUpdate * Update app/javascript/controllers/select_controller.js Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: Alessio Cappa <104093777+alessiocappa@users.noreply.github.com> * fix: add aria-labels * fix: pass html_options to DS::Select * fix: unnecessary closing tag * fix: use offsetvalue for position checks * fix: use right classes for dropdown transitions * include options[:prompt] in placeholder init * fix: remove unused locale key * fix: Emit a native change event after updating the input value. * fix: Guard against negative maxHeight in constrained layouts. * fix: Update test * fix: lint issues * Update test/system/transfers_test.rb Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: Alessio Cappa <104093777+alessiocappa@users.noreply.github.com> * Update test/system/transfers_test.rb Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: Alessio Cappa <104093777+alessiocappa@users.noreply.github.com> * refactor: move CSS class for button select form in maybe-design-system.css --------- Signed-off-by: Alessio Cappa <104093777+alessiocappa@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
84 lines
2.3 KiB
Ruby
84 lines
2.3 KiB
Ruby
module DS
|
|
class Select < ViewComponent::Base
|
|
attr_reader :form, :method, :items, :selected_value, :placeholder, :variant, :searchable, :options
|
|
|
|
VARIANTS = %i[simple logo badge].freeze
|
|
HEX_COLOR_REGEX = /\A#[0-9a-fA-F]{3}(?:[0-9a-fA-F]{3})?\z/
|
|
RGB_COLOR_REGEX = /\Argb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\)\z/
|
|
DEFAULT_COLOR = "#737373"
|
|
|
|
def initialize(form:, method:, items:, selected: nil, placeholder: I18n.t("helpers.select.default_label"), variant: :simple, include_blank: nil, searchable: false, **options)
|
|
@form = form
|
|
@method = method
|
|
@placeholder = placeholder
|
|
@variant = variant
|
|
@searchable = searchable
|
|
@options = options
|
|
|
|
normalized_items = normalize_items(items)
|
|
|
|
if include_blank
|
|
normalized_items.unshift({
|
|
value: nil,
|
|
label: include_blank,
|
|
object: nil
|
|
})
|
|
end
|
|
|
|
@items = normalized_items
|
|
@selected_value = selected
|
|
end
|
|
|
|
def selected_item
|
|
items.find { |item| item[:value] == selected_value }
|
|
end
|
|
|
|
# Returns the color for a given item (used in :badge variant)
|
|
def color_for(item)
|
|
obj = item[:object]
|
|
color = obj&.respond_to?(:color) ? obj.color : DEFAULT_COLOR
|
|
|
|
return DEFAULT_COLOR unless color.is_a?(String)
|
|
|
|
if color.match?(HEX_COLOR_REGEX) || color.match?(RGB_COLOR_REGEX)
|
|
color
|
|
else
|
|
DEFAULT_COLOR
|
|
end
|
|
end
|
|
|
|
# Returns the lucide_icon name for a given item (used in :badge variant)
|
|
def icon_for(item)
|
|
obj = item[:object]
|
|
obj&.respond_to?(:lucide_icon) ? obj.lucide_icon : nil
|
|
end
|
|
|
|
# Returns true if the item has a logo (used in :logo variant)
|
|
def logo_for(item)
|
|
obj = item[:object]
|
|
obj&.respond_to?(:logo_url) && obj.logo_url.present? ? Setting.transform_brand_fetch_url(obj.logo_url) : nil
|
|
end
|
|
|
|
private
|
|
|
|
def normalize_items(collection)
|
|
collection.map do |item|
|
|
case item
|
|
when Hash
|
|
{
|
|
value: item[:value],
|
|
label: item[:label],
|
|
object: item[:object]
|
|
}
|
|
else
|
|
{
|
|
value: item.id,
|
|
label: item.name,
|
|
object: item
|
|
}
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|