Skip to content

Commit 93c57a3

Browse files
authored
Merge pull request #333 from platanus/datetime-picker-filter
Datetime picker filter
2 parents c85497e + e1f9107 commit 93c57a3

File tree

10 files changed

+127
-4
lines changed

10 files changed

+127
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
55
### Unreleased
66

77
##### Added
8+
* Added date time picker filter [#333](https://github.com/platanus/activeadmin_addons/pull/333)
89
* Added filters option in nested selects [#301](https://github.com/platanus/activeadmin_addons/pull/301)
910
* Date range filters and date picker inputs now has `autocomplete: 'off'` by default [#320](https://github.com/platanus/activeadmin_addons/pull/320)
1011
* Added `tags` option to default select2 inputs [#322](https://github.com/platanus/activeadmin_addons/pull/322)

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ GEM
174174
mini_portile2 (2.4.0)
175175
minitest (5.14.0)
176176
nenv (0.3.0)
177-
nio4r (2.5.2)
177+
nio4r (2.5.5)
178178
nokogiri (1.10.8)
179179
mini_portile2 (~> 2.4.0)
180180
notiffany (0.1.3)

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ ActiveAdmin Addons will extend your ActiveAdmin and enable a set of addons you c
2929
#### Filters
3030

3131
- [Numeric Range Filter](#numeric-range-filter): filter your results using a numeric range (i.e. age between 18-30).
32+
- [Date Time Picker Filter](#date-time-picker-filter): filter your results using a datetime range.
3233
- [Search Select Filter](#search-select-filter): filter your results using the ajax select input.
3334

3435
#### Themes
@@ -211,6 +212,16 @@ filter :number, as: :numeric_range_filter
211212

212213
<img src="./docs/images/filter-range.png" height="150" />
213214

215+
#### Date Time Picker Filter
216+
217+
To filter based on a range of datetimes you can use `date_time_picker_filter` like this:
218+
219+
```ruby
220+
filter :created_at, as: :date_time_picker_filter
221+
```
222+
223+
<img src="./docs/images/data-time-picker-range.png" height="150" />
224+
214225
#### Search Select Filter
215226

216227
You can use the ajax select input to filter values on index view like this:

app/assets/stylesheets/activeadmin_addons/all.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
@import 'vendor/palette-color-picker';
44

55
@import 'inputs/numeric-range-filter';
6+
@import 'inputs/date-time-picker-filter';
67
@import 'inputs/color-picker';
78
@import 'inputs/date-time-picker';
89
@import 'inputs/select2';
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
.filter_date_time_picker_filter {
2+
li {
3+
list-style: none;
4+
5+
label {
6+
display: none;
7+
}
8+
9+
margin-bottom: 5px;
10+
}
11+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class DateTimePickerFilterInput < ActiveAdminAddons::InputBase
2+
include ActiveAdminAddons::FilterInput
3+
4+
def load_control_attributes
5+
load_attr(:picker_options, default: {})
6+
end
7+
8+
def render_custom_input
9+
concat(label_html)
10+
concat_date_time_picker_field(gteq_input_name)
11+
concat_date_time_picker_field(lteq_input_name)
12+
end
13+
14+
def concat_date_time_picker_field(control_name)
15+
concat(builder.input(control_name, date_time_picker_options(control_name)))
16+
end
17+
18+
def date_time_picker_options(input_name = gteq_input_name)
19+
is_gt = (input_name == gteq_input_name)
20+
21+
input_html_options.merge(
22+
as: :date_time_picker,
23+
placeholder: is_gt ? "min" : "max"
24+
)
25+
end
26+
end
13.5 KB
Loading

spec/dummy/app/admin/invoices.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
fields: [:name],
1010
minimum_input_length: 0
1111

12+
filter :created_at, as: :date_time_picker_filter
13+
1214
index do
1315
selectable_column
1416
id_column
@@ -18,6 +20,7 @@
1820
attachment_column :attachment
1921
number_column :amount, as: :currency, unit: "$", separator: ","
2022
toggle_bool_column :active
23+
column :created_at
2124
actions
2225
end
2326

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
require 'rails_helper'
2+
3+
describe "Date Time Picker Filter Input", type: :feature do
4+
let(:now) { DateTime.new(1984, 6, 4, 9, 0, 0).in_time_zone }
5+
6+
before do
7+
register_page(Invoice) do
8+
config.sort_order = 'created_at_asc'
9+
10+
filter :created_at, as: :date_time_picker_filter
11+
12+
index do
13+
column :created_at
14+
end
15+
end
16+
17+
5.times { |i| Invoice.create(id: i + 1, created_at: now + i.hours) }
18+
visit admin_invoices_path
19+
end
20+
21+
it "shows date time pickers", js: true do
22+
expect(page).to have_css(".date-time-picker-input", count: 2)
23+
expect(page).to have_css("#q_created_at_gteq", count: 1)
24+
expect(page).to have_css("#q_created_at_lteq", count: 1)
25+
end
26+
27+
context "setting min and max values" do
28+
before do
29+
find("#q_created_at_gteq").set("1984-06-04 10:00")
30+
find("#q_created_at_lteq").set("1984-06-04 12:00")
31+
click_filter_btn
32+
end
33+
34+
it "shows filtered rows", js: true do
35+
expect(page).to_not have_css("#invoice_5")
36+
expect(page).to have_css("#invoice_4", count: 1)
37+
expect(page).to have_css("#invoice_3", count: 1)
38+
expect(page).to have_css("#invoice_2", count: 1)
39+
expect(page).to_not have_css("#invoice_1")
40+
end
41+
end
42+
43+
context "setting min value only" do
44+
before do
45+
find("#q_created_at_gteq").set("1984-06-04 12:00")
46+
click_filter_btn
47+
end
48+
49+
it "shows filtered rows", js: true do
50+
expect(page).to have_css("#invoice_5", count: 1)
51+
expect(page).to have_css("#invoice_4", count: 1)
52+
expect(page).not_to have_css("#invoice_3")
53+
expect(page).not_to have_css("#invoice_2")
54+
expect(page).not_to have_css("#invoice_1")
55+
end
56+
end
57+
58+
context "setting max value only" do
59+
before do
60+
find("#q_created_at_lteq").set("1984-06-04 12:00")
61+
click_filter_btn
62+
end
63+
64+
it "shows filtered rows", js: true do
65+
expect(page).to_not have_css("#invoice_5")
66+
expect(page).to have_css("#invoice_4", count: 1)
67+
expect(page).to have_css("#invoice_3", count: 1)
68+
expect(page).to have_css("#invoice_2", count: 1)
69+
expect(page).to have_css("#invoice_1", count: 1)
70+
end
71+
end
72+
end

spec/support/capybara_helpers.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ def on_input_ctx(input_id, &block)
66
end
77

88
def click_filter_btn
9-
within("#filters_sidebar_section") do
10-
click_button("Filter")
11-
end
9+
page.execute_script("document.getElementsByClassName('filter_form')[0].submit()")
1210
end
1311

1412
def expect_text(text)

0 commit comments

Comments
 (0)