#encoding: utf-8 module TwitterBuilderHelper ALIGN_CLASSES = {left: 't-left', center: 't-center', right: 't-right'} class ColumnDefinition attr_accessor :title, :cols, :col_class, :value_extractor, :align def value(item, context = self) self.value_extractor.call(item) end end class ActionsColumnDefinition < ColumnDefinition def initialize self.title = 'Действия' @actions = [] end def cols @cols || @actions.size % 2 + @actions.size / 2 end def col_class "col-xs-#{cols}" end def cols=(value) @cols = value end def value(item, context = self) @actions.collect do |action| options = action.second if options[:if] context.instance_exec(item, &action.first) if options[:if].call(item) else context.instance_exec(item, &action.first) end end.compact.join(' ').html_safe end def action(method, options = {}) @actions << case method when :edit [->(item) { edit_link(send("edit_admin_#{item.class.name.underscore.sub('/', '_')}_path", item)) }, options] when :delete [->(item) { delete_link([:admin, item]) }, options] when Proc [method, options] else raise "unsupported method: #{method.inspect}" end end end class TableBuilder def initialize(parent, model_class) @parent, @model_class = parent, model_class @columns = [] @actions_column = ActionsColumnDefinition.new @action_column_on_left = false @table_helpers = TableHelpers.for(@model_class, @parent) end def content collection, &block @collection = collection block.call(self) if block_given? create_content end # Метод добавляет столбец к таблице def column(method, options = {}) helper = @table_helpers[method] cd = ColumnDefinition.new cd.title = options[:title] || I18n.t("activerecord.attributes.#{@model_class.model_name.singular}.#{method}") cd.cols = options[:cols] cd.col_class = options[:class] cd.value_extractor = ->(item) { helper.format_value(item, options[:format]) } cd.align = options[:align] || helper.respond_to?(:align) && "t-#{helper.align}" @columns << cd end # Метод позволяет передать блок, который должен вычислять класс для строки. В этот блок передается объект, # по которому данная строка рендерится. Таким образом, можно управлять, например, цветом строки в зависимости # от состояния объекта (статусы заказов и прочее). def row_class lmb @row_class = lmb end # Метод добавляет кнопку в столбец действий def action(value, options = {}) add_action(value, options) end # Метод добавляет кнопку редактирования сущности в столбец действий def edit(options = {}) add_action(:edit, options) end # Метод добавляет кнопку удаления сущности в столбец действий def delete(options = {}) add_action(:delete, options) end # Метод добавляет кнопки добавления и удаления сущностей в столбец действий def edit_and_delete(options = {}) self.edit(options) self.delete(options) end private def add_action(value, options) @action_column_on_left = true if @columns.empty? @actions_column.action(value, options) end def all_columns @action_column_on_left ? [@actions_column] + @columns : @columns + [@actions_column] end def create_content @parent.render(partial: '/admin/common/table_template', locals: {definitions: all_columns, items: @collection, row_class: @row_class}) end end def twitter_form_for(name, *args, &block) options = args.extract_options! form_for(name, *(args << options.deep_merge(builder: TwitterFormBuilder, html: {class: 'form-horizontal'})), &block) end def field_set title = nil, &block content = capture(self, &block) content = content_tag(:legend, title) + content if title content_tag :fieldset, content end def actions &block content = capture(self, &block) content_tag :div, content, class: 'well' end def standard_actions(form) fixed_actions { form.save + form.apply + form.cancel } end def fixed_actions &block panel_tag = actions(&block) content_tag :div, panel_tag, class: 'action-bar' end def flash_warning_messages r = if flash[:admin_warning] "
#{h(flash[:admin_warning])}
#{h(flash[:alert])}
#{h(flash[:admin_success])}