Sha256: c9a82ee67b373e130b73cdaf2c5271c12280645b8765a5163b7265a8ab7c31ad

Contents?: true

Size: 1.58 KB

Versions: 1

Compression:

Stored size: 1.58 KB

Contents

# frozen_string_literal: true

module Katalyst
  module Tables
    module Collection
      module Type
        class Enum < Value
          include Helpers::Multiple

          def initialize(multiple: true, **)
            super
          end

          def type
            :enum
          end

          def suggestions(scope, attribute)
            _, model, column = model_and_column_for(scope, attribute)

            raise ArgumentError, "Unknown enum #{column} for #{model}" unless model.defined_enums.has_key?(column)

            values = model.defined_enums[column].keys

            if attribute.value_before_type_cast.present?
              values = values.select { |key| key.include?(attribute.value_before_type_cast) }
            end

            values.map { |value| constant_suggestion(attribute:, model:, column:, value:) }
          end

          private

          def cast_value(value)
            value.to_s
          end

          def describe_key(model, attribute, key)
            label = model.human_attribute_name(attribute.name).downcase
            value = model.human_attribute_name("#{attribute.name}.#{key}").downcase

            description = "#{model.model_name.human} #{label} is #{value}"
            description += " (default)" if default?(attribute, key)
            description
          end

          def default?(attribute, value)
            if multiple?
              attribute.original_value&.intersection(cast(value))&.any?
            else
              attribute.default_value.eql?(cast(value))
            end
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
katalyst-tables-3.5.0 lib/katalyst/tables/collection/type/enum.rb