Заставить ActiveAdmin использовать включающий фильтр даты? - PullRequest
3 голосов
/ 05 декабря 2011

Обычно при выборе диапазонов дат вы ожидаете, что даты будут включительно.то есть "11/07/2011" - "11/09/2011" вы ожидаете, что он вернет результаты с 7, 8 и 9 ноября.То, как сейчас работает фильтр ActiveAdmin, выглядит так, что диапазон дат будет возвращать результаты только восьмого, что нелогично.

Что мне нужно изменить, чтобы изменить это поведение на ожидаемое?

Ответы [ 2 ]

6 голосов
/ 05 ноября 2012

Хотя основная идея Раэльса верна, решение слишком хакерское. Вы не должны исправлять клиентскую сторону. Все, что нам нужно сделать, это добавить расширение времени к *_lte входам столбцов даты и времени, используя before_filter. Мы можем легко добиться этой обезьяны с помощью filter метода ActiveAdmin::ResourceDSL.

Вот универсальное решение, которое решает эту проблему: https://gist.github.com/4015836.

1 голос
/ 06 июня 2012

Код в AA использует gte и lte, поэтому он пытается быть инклюзивным.Я обнаружил, что проблема заключается в использовании даты вместо времени.Проблема заключается в том, что в коде указывается только часть даты, которая при расширении до даты и времени дает ту же дату в полночь (00: 00: 00.000000).Это происходит как для gte (где это безвредно), так и для lte (где это смертельно) частей.Часть, сравнивающая lte, должна вместо этого сравнивать с временной частью 23: 59: 59.999999.

Итак, вот что я сделал, похоже, работает.

Создайте файл coffeescript по относительному пути'app / assets / javascript / make_datetime_lte_work.js.coffee' со следующим содержимым:

    $(document).ready ->
      $('input.datepickerlte').datepicker 'option', {dateFormat: 'yy-mm-dd     23:59:59.99999'}

Далее мы обезьяны исправим код фильтра диапазона дат.Поместите следующее содержимое в файл ruby ​​по относительному пути 'config / initializers / make_datetime_lte_work.rb':

module ActiveAdmin
  module Inputs
    class FilterDateRangeInput

      def to_html
        input_wrapping do
          [ label_html,
            builder.text_field(gt_input_name, input_html_options(gt_input_name)),
            template.content_tag(:span, "-", :class => "seperator"),
            builder.text_field(lt_input_name, input_html_options(lt_input_name, ' datepickerlte')),
          ].join("\n").html_safe
        end
      end

      def input_html_options(input_name = gt_input_name, extra_class = '')
        current_value = @object.send(input_name)
        { :size => 12,
          :class => "datepicker" + extra_class,
          :max => 10,
          :value => current_value.respond_to?(:strftime) ? current_value.strftime("%Y-%m-%d") : "" }
      end
    end
  end
end

Теперь не забудьте отредактировать ваше приложение / assets / javascript / active_admin.js для ссылки на ваш новыйФайл JavaScript, добавив ссылку на него в комментарии.Вот как выглядит мой код:

//= require active_admin/base
//= require make_datetime_lte_work

Перезапустите приложение rails, чтобы инициализаторы были вызваны.

Теперь конечная часть диапазона дат в фильтре будет иметь 23:59:59.999999 добавляется к дате, которая будет включать (почти) весь день.

Надеюсь, что поможет!

...