class Avo::HTML::Builder class << self def parse_block(record: nil, resource: nil, &block) Docile.dsl_eval(Avo::HTML::Builder.new(record: record, resource: resource), &block).build end end attr_accessor :wrapper_stack attr_accessor :data_stack attr_accessor :style_stack attr_accessor :classes_stack attr_accessor :show_stack attr_accessor :edit_stack attr_accessor :index_stack attr_accessor :input_stack attr_accessor :label_stack attr_accessor :content_stack attr_accessor :record attr_accessor :resource delegate :app, to: Avo::Current delegate :root_path, to: :app delegate :params, to: Avo::Current def current_user Avo::Current.user end def initialize(record: nil, resource: nil) @wrapper_stack = {} @data_stack = {} @style_stack = "" @classes_stack = "" @show_stack = {} @edit_stack = {} @index_stack = {} @input_stack = {} @label_stack = {} @content_stack = {} @record = record @resource = resource end def get_stack(name = nil) # We don't have an edit component for new so we should use edit name = :edit if name == :new send :"#{name}_stack" end def dig_stack(*names) value = get_stack names.shift if value.is_a? self.class value.dig_stack(*names) else value end end # payload or block def data(payload = nil, &block) assign_property :data, payload, &block end # payload or block def style(payload = nil, &block) assign_property :style, payload, &block end # payload or block def classes(payload = nil, &block) assign_property :classes, payload, &block end # Takes a block def wrapper(&block) capture_block :wrapper, &block end # Takes a block def input(&block) capture_block :input, &block end # Takes a block def label(&block) capture_block :label, &block end # Takes a block def content(&block) capture_block :content, &block end # Takes a block def show(&block) capture_block :show, &block end # Takes a block def edit(&block) capture_block :edit, &block end # Takes a block def index(&block) capture_block :index, &block end # Fetch the menu def build self end private # Capture and parse the blocks for the nested structure def capture_block(property = nil, &block) send(:"#{property}_stack=", self.class.parse_block(record: record, resource: resource, &block).build) end # Parse the properties and assign them to the blocks def assign_property(property = :data, payload = nil, &block) value = Avo::ExecutionContext.new(target: block || payload, record: record).handle send(:"#{property}_stack=", value) end end