Class: Plutonium::UI::Display::Components::Badge

Inherits:
Phlexi::Display::Components::Base
  • Object
show all
Includes:
Phlexi::Display::Components::Concerns::DisplaysValue
Defined in:
lib/plutonium/ui/display/components/badge.rb

Overview

Renders a scalar value (typically an enum / status) as a colored pill.

display :status, as: :badge
display :status, as: :badge, colors: {archived: :neutral, vip: :accent}

Constant Summary collapse

VARIANTS =
%i[neutral primary secondary success danger warning info accent].freeze
DECORATIVE =

Decorative variants used for values with no semantic meaning, chosen deterministically so a given value always gets the same color.

%i[primary secondary info accent].freeze
SEMANTIC_VARIANTS =
{
  "active" => :success, "approved" => :success, "completed" => :success,
  "complete" => :success, "success" => :success, "succeeded" => :success,
  "paid" => :success, "published" => :success, "enabled" => :success,
  "confirmed" => :success, "verified" => :success, "live" => :success,
  "available" => :success, "fulfilled" => :success, "done" => :success,
  "pending" => :warning, "processing" => :warning, "in_progress" => :warning,
  "draft" => :warning, "review" => :warning, "waiting" => :warning,
  "scheduled" => :warning, "trial" => :warning, "paused" => :warning,
  "on_hold" => :warning, "partial" => :warning,
  "failed" => :danger, "rejected" => :danger, "cancelled" => :danger,
  "canceled" => :danger, "error" => :danger, "inactive" => :danger,
  "disabled" => :danger, "expired" => :danger, "banned" => :danger,
  "blocked" => :danger, "closed" => :danger, "unpaid" => :danger,
  "overdue" => :danger, "refunded" => :danger, "declined" => :danger,
  "new" => :info, "queued" => :info, "open" => :info, "info" => :info
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.decorative_variant_for(key) ⇒ Object

Stable across processes (String#hash is seeded, so we digest instead).



53
54
55
56
# File 'lib/plutonium/ui/display/components/badge.rb', line 53

def self.decorative_variant_for(key)
  index = Digest::SHA256.hexdigest(key)[0, 8].to_i(16) % DECORATIVE.size
  DECORATIVE[index]
end

.humanize(value) ⇒ Object



58
59
60
# File 'lib/plutonium/ui/display/components/badge.rb', line 58

def self.humanize(value)
  value.to_s.humanize
end

.variant_for(value, colors: nil) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/plutonium/ui/display/components/badge.rb', line 40

def self.variant_for(value, colors: nil)
  return :neutral if value.nil?

  if colors
    override = colors[value] || colors[value.to_s.to_sym] || colors[value.to_s]
    return override if override && VARIANTS.include?(override.to_sym)
  end

  key = value.to_s.downcase
  SEMANTIC_VARIANTS[key] || decorative_variant_for(key)
end

Instance Method Details

#render_value(value) ⇒ Object



62
63
64
65
66
67
# File 'lib/plutonium/ui/display/components/badge.rb', line 62

def render_value(value)
  variant = self.class.variant_for(value, colors: @colors)
  span(**attributes, class: tokens("pu-badge", "pu-badge-#{variant}")) do
    plain self.class.humanize(value)
  end
end