Sha256: 600aeb252768553874ed0d2661ab4fdee4c8e856ff5d277d0201f1088dac4c1a

Contents?: true

Size: 1.71 KB

Versions: 39

Compression:

Stored size: 1.71 KB

Contents

# frozen_string_literal: true

module Primer
  module OpenProject
    # A layouting component used to arrange multiple components next / below each other
    class FlexLayout < Primer::Component
      status :open_project

      renders_many :rows, lambda { |**system_arguments, &block|
        child_component(system_arguments, &block)
      }
      renders_many :columns, lambda { |**system_arguments, &block|
        child_component(system_arguments, &block)
      }
      # boxes are used when direction is set to row or column based on responsive breakpoints
      renders_many :boxes, lambda { |**system_arguments, &block|
        child_component(system_arguments, &block)
      }

      # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
      def initialize(**system_arguments)
        super

        @system_arguments = deny_tag_argument(**system_arguments) || {}
        @system_arguments[:display] = :flex
      end

      private

      def render?
        # no slot provided
        return false if rows.empty? && columns.empty? && boxes.empty?

        if [rows, columns, boxes].count { |arr| !arr.empty? } == 1
          # only rows or columns or boxes are used
          true
        elsif [rows, columns, boxes].count { |arr| !arr.empty? } > 1
          # rows, columns and boxes are used together, which is not allowed
          raise ArgumentError, "You can't mix row, column and box slots"
        end
      end

      def child_component(system_arguments, &block)
        if system_arguments[:flex_layout] == true
          Primer::OpenProject::FlexLayout.new(**system_arguments.except(:flex_layout), &block)
        else
          Primer::Box.new(**system_arguments || {})
        end
      end
    end
  end
end

Version data entries

39 entries across 39 versions & 1 rubygems

Version Path
openproject-primer_view_components-0.52.4 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.52.3 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.52.2 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.52.1 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.52.0 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.51.0 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.50.1 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.50.0 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.49.2 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.49.1 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.49.0 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.48.2 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.48.1 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.48.0 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.47.1 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.47.0 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.46.1 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.46.0 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.45.0 app/components/primer/open_project/flex_layout.rb
openproject-primer_view_components-0.44.3 app/components/primer/open_project/flex_layout.rb