reports_kit 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/.rubocop.yml +83 -0
- data/Gemfile +3 -0
- data/MIT-LICENSE +20 -0
- data/README.md +468 -0
- data/Rakefile +2 -0
- data/app/assets/javascripts/reports_kit/application.js +14 -0
- data/app/assets/javascripts/reports_kit/lib/_init.js +8 -0
- data/app/assets/javascripts/reports_kit/lib/chart.js +39 -0
- data/app/assets/javascripts/reports_kit/lib/report.js +119 -0
- data/app/assets/javascripts/reports_kit/vendor/chart.js +12269 -0
- data/app/assets/javascripts/reports_kit/vendor/daterangepicker.js +1627 -0
- data/app/assets/javascripts/reports_kit/vendor/moment.js +4040 -0
- data/app/assets/javascripts/reports_kit/vendor/select2.full.js +6436 -0
- data/app/assets/stylesheets/reports_kit/application.css.scss +3 -0
- data/app/assets/stylesheets/reports_kit/reports.css.sass +7 -0
- data/app/assets/stylesheets/reports_kit/select2_overrides.css.sass +7 -0
- data/app/assets/stylesheets/reports_kit/vendor/daterangepicker.css +269 -0
- data/app/assets/stylesheets/reports_kit/vendor/select2-bootstrap.css +721 -0
- data/app/assets/stylesheets/reports_kit/vendor/select2.css +484 -0
- data/config/routes.rb +10 -0
- data/docs/images/chart_options.png +0 -0
- data/docs/images/dashed_line.png +0 -0
- data/docs/images/flights_by_carrier.png +0 -0
- data/docs/images/flights_by_carrier_and_flight_at.png +0 -0
- data/docs/images/flights_by_delay.png +0 -0
- data/docs/images/flights_by_flight_at.png +0 -0
- data/docs/images/flights_by_hours_delayed.png +0 -0
- data/docs/images/flights_with_check_box.png +0 -0
- data/docs/images/flights_with_configured_boolean.png +0 -0
- data/docs/images/flights_with_configured_datetime.png +0 -0
- data/docs/images/flights_with_configured_number.png +0 -0
- data/docs/images/flights_with_configured_string.png +0 -0
- data/docs/images/flights_with_date_range.png +0 -0
- data/docs/images/flights_with_filters.png +0 -0
- data/docs/images/flights_with_multi_autocomplete.png +0 -0
- data/docs/images/flights_with_string_filter.png +0 -0
- data/docs/images/horizontal_bar.png +0 -0
- data/docs/images/legend_right.png +0 -0
- data/docs/images/users_by_created_at.png +0 -0
- data/gists/doc.txt +58 -0
- data/lib/reports_kit.rb +17 -0
- data/lib/reports_kit/base_controller.rb +11 -0
- data/lib/reports_kit/configuration.rb +10 -0
- data/lib/reports_kit/engine.rb +21 -0
- data/lib/reports_kit/helper.rb +19 -0
- data/lib/reports_kit/model.rb +16 -0
- data/lib/reports_kit/model_configuration.rb +23 -0
- data/lib/reports_kit/rails.rb +5 -0
- data/lib/reports_kit/report_builder.rb +76 -0
- data/lib/reports_kit/reports/data/chart_options.rb +132 -0
- data/lib/reports_kit/reports/data/generate.rb +65 -0
- data/lib/reports_kit/reports/data/one_dimension.rb +71 -0
- data/lib/reports_kit/reports/data/two_dimensions.rb +129 -0
- data/lib/reports_kit/reports/data/utils.rb +79 -0
- data/lib/reports_kit/reports/dimension.rb +78 -0
- data/lib/reports_kit/reports/filter.rb +84 -0
- data/lib/reports_kit/reports/filter_types/base.rb +47 -0
- data/lib/reports_kit/reports/filter_types/boolean.rb +30 -0
- data/lib/reports_kit/reports/filter_types/datetime.rb +27 -0
- data/lib/reports_kit/reports/filter_types/number.rb +28 -0
- data/lib/reports_kit/reports/filter_types/records.rb +26 -0
- data/lib/reports_kit/reports/filter_types/string.rb +38 -0
- data/lib/reports_kit/reports/generate_autocomplete_results.rb +55 -0
- data/lib/reports_kit/reports/inferrable_configuration.rb +113 -0
- data/lib/reports_kit/reports/measure.rb +58 -0
- data/lib/reports_kit/reports_controller.rb +15 -0
- data/lib/reports_kit/resources_controller.rb +8 -0
- data/lib/reports_kit/version.rb +3 -0
- data/reports_kit.gemspec +23 -0
- data/spec/factories/issue_factory.rb +4 -0
- data/spec/factories/issues_label_factory.rb +4 -0
- data/spec/factories/label_factory.rb +4 -0
- data/spec/factories/repo_factory.rb +5 -0
- data/spec/factories/tag_factory.rb +4 -0
- data/spec/fixtures/generate_inputs.yml +35 -0
- data/spec/fixtures/generate_outputs.yml +208 -0
- data/spec/reports_kit/reports/data/generate_spec.rb +275 -0
- data/spec/reports_kit/reports/dimension_spec.rb +38 -0
- data/spec/reports_kit/reports/filter_spec.rb +38 -0
- data/spec/spec_helper.rb +58 -0
- data/spec/support/factory_girl.rb +5 -0
- data/spec/support/helpers.rb +13 -0
- data/spec/support/models/issue.rb +6 -0
- data/spec/support/models/issues_label.rb +4 -0
- data/spec/support/models/label.rb +5 -0
- data/spec/support/models/repo.rb +7 -0
- data/spec/support/models/tag.rb +4 -0
- data/spec/support/schema.rb +38 -0
- metadata +232 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e3abddaccea88828c06d6e0ff3131c56fba4dc20
|
4
|
+
data.tar.gz: 990fa98bba536c8334020fde32d5c202dea92f9b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c92b9aca0da9517597d63a21f461e7f29229a29b33f6598f24858e08401c11431846904de22bc305b246f095b5ed5e27fe51ba86b676e3db35844e7bffa6bac8
|
7
|
+
data.tar.gz: fe4f821935c7301266574d7ee973882a9cf3c7162e67f3c400b774b4867a8c7e82e0269ea6af11d102a2d79c1d9d110ea7bd6cca9ebfa1b927ab2ef905e0f1ad
|
data/.gitignore
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
# inherits from https://github.com/bbatsov/rubocop/blob/master/config/default.yml
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
Exclude:
|
5
|
+
- spec/support/schema.rb
|
6
|
+
- bin/**/*
|
7
|
+
- tmp/**/*
|
8
|
+
- vendor/**/*
|
9
|
+
- .bundle/**/*
|
10
|
+
Rails:
|
11
|
+
Enabled: true
|
12
|
+
DisplayCopNames: true
|
13
|
+
DisplayStyleGuide: true
|
14
|
+
|
15
|
+
Documentation:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
Metrics/AbcSize:
|
19
|
+
Enabled: true
|
20
|
+
Max: 40
|
21
|
+
Metrics/BlockLength:
|
22
|
+
Exclude:
|
23
|
+
- spec/**/*
|
24
|
+
Metrics/CyclomaticComplexity:
|
25
|
+
Enabled: true
|
26
|
+
Max: 12
|
27
|
+
Metrics/LineLength:
|
28
|
+
Enabled: true
|
29
|
+
Max: 140
|
30
|
+
Metrics/PerceivedComplexity:
|
31
|
+
Enabled: true
|
32
|
+
Max: 12
|
33
|
+
Metrics/ClassLength:
|
34
|
+
Enabled: true
|
35
|
+
CountComments: false
|
36
|
+
Max: 200
|
37
|
+
Metrics/ModuleLength:
|
38
|
+
CountComments: false
|
39
|
+
Max: 200
|
40
|
+
Enabled: true
|
41
|
+
Metrics/MethodLength:
|
42
|
+
StyleGuide: https://github.com/bbatsov/ruby-style-guide#short-methods
|
43
|
+
Enabled: true
|
44
|
+
CountComments: false
|
45
|
+
Max: 50
|
46
|
+
Metrics/ParameterLists:
|
47
|
+
StyleGuide: https://github.com/bbatsov/ruby-style-guide#too-many-params
|
48
|
+
Enabled: true
|
49
|
+
Max: 5
|
50
|
+
CountKeywordArgs: true
|
51
|
+
|
52
|
+
Lint/AssignmentInCondition:
|
53
|
+
StyleGuide: https://github.com/bbatsov/ruby-style-guide#safe-assignment-in-condition
|
54
|
+
Enabled: true
|
55
|
+
AllowSafeAssignment: true
|
56
|
+
Lint/UnusedBlockArgument:
|
57
|
+
Enabled: false
|
58
|
+
|
59
|
+
Style/AccessorMethodName:
|
60
|
+
Enabled: true
|
61
|
+
Style/AlignHash:
|
62
|
+
EnforcedColonStyle: key
|
63
|
+
EnforcedHashRocketStyle: key
|
64
|
+
Style/AlignParameters:
|
65
|
+
EnforcedStyle: with_fixed_indentation
|
66
|
+
Style/Alias:
|
67
|
+
StyleGuide: https://github.com/bbatsov/ruby-style-guide#alias-method
|
68
|
+
EnforcedStyle: prefer_alias_method
|
69
|
+
Style/BracesAroundHashParameters:
|
70
|
+
Exclude:
|
71
|
+
- spec/**/*
|
72
|
+
Style/CaseIndentation:
|
73
|
+
EnforcedStyle: case
|
74
|
+
SupportedStyles:
|
75
|
+
- case
|
76
|
+
- end
|
77
|
+
IndentOneStep: false
|
78
|
+
Style/RaiseArgs:
|
79
|
+
Enabled: false
|
80
|
+
Style/SignalException:
|
81
|
+
Enabled: false
|
82
|
+
Style/SpecialGlobalVars:
|
83
|
+
Enabled: false
|
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2017 Tom Benner
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,468 @@
|
|
1
|
+
ReportsKit
|
2
|
+
=====
|
3
|
+
Beautiful, interactive charts for Ruby on Rails
|
4
|
+
|
5
|
+
Table of Contents
|
6
|
+
-----------------
|
7
|
+
|
8
|
+
* [Overview](#overview)
|
9
|
+
* [Installation](#installation)
|
10
|
+
* [Usage](#usage)
|
11
|
+
* [Your First Chart](#your-first-chart)
|
12
|
+
* [Measures](#measures)
|
13
|
+
* [Dimensions](#dimensions)
|
14
|
+
* [Filters](#filters)
|
15
|
+
* [Display Options](#display-options)
|
16
|
+
* [License](#license)
|
17
|
+
|
18
|
+
Overview
|
19
|
+
--------
|
20
|
+
ReportsKit lets you easily create beautiful charts with customizable, interactive filters.
|
21
|
+
|
22
|
+
For interactive examples, see [reportskit.co](https://www.reportskit.co).
|
23
|
+
|
24
|
+
[<img src="docs/images/flights_with_filters.png?raw=true" width="500" />](docs/images/flights_with_filters.png?raw=true)
|
25
|
+
|
26
|
+
ReportsKit integrates with ActiveRecord, abstracting away complex aggregation logic to make it easy to create powerful charts and filters.
|
27
|
+
|
28
|
+
Installation
|
29
|
+
------------
|
30
|
+
|
31
|
+
In `Gemfile`:
|
32
|
+
```ruby
|
33
|
+
gem 'reports_kit'
|
34
|
+
```
|
35
|
+
|
36
|
+
In `app/assets/stylesheets/application.css.scss`:
|
37
|
+
```scss
|
38
|
+
*= require reports_kit/application
|
39
|
+
```
|
40
|
+
|
41
|
+
In `app/assets/javascripts/application.js`:
|
42
|
+
```js
|
43
|
+
//= require reports_kit/application
|
44
|
+
```
|
45
|
+
|
46
|
+
In `config/routes.rb`:
|
47
|
+
```ruby
|
48
|
+
Rails.application.routes.draw do
|
49
|
+
mount ReportsKit::Engine, at: '/'
|
50
|
+
# ...
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
Usage
|
55
|
+
-----
|
56
|
+
### Your First Chart
|
57
|
+
|
58
|
+
In any view, render a chart that shows the number of records of a model (e.g. `user`) created over time:
|
59
|
+
|
60
|
+
`app/views/users/index.html.haml`
|
61
|
+
```haml
|
62
|
+
= render_report measure: 'user', dimensions: ['created_at']
|
63
|
+
```
|
64
|
+
|
65
|
+
[<img src="docs/images/users_by_created_at.png?raw=true" width="500" />](docs/images/users_by_created_at.png?raw=true)
|
66
|
+
|
67
|
+
You can also configure your charts using YAML and then pass the filename to `render_report`:
|
68
|
+
|
69
|
+
`config/reports_kit/reports/my_users.yml`
|
70
|
+
```yaml
|
71
|
+
measure: user
|
72
|
+
dimensions:
|
73
|
+
- created_at
|
74
|
+
```
|
75
|
+
|
76
|
+
`app/views/users/index.html.haml`
|
77
|
+
```haml
|
78
|
+
= render_report 'my_users'
|
79
|
+
```
|
80
|
+
|
81
|
+
### Measures
|
82
|
+
|
83
|
+
The measure is what is being counted (or aggregated). You can use any model for the measure.
|
84
|
+
|
85
|
+
For example, say we have a `Flight` model with a `flight_at` datetime column. We can chart the number of flights over time:
|
86
|
+
|
87
|
+
```yaml
|
88
|
+
measure: flight
|
89
|
+
dimensions:
|
90
|
+
- flight_at
|
91
|
+
```
|
92
|
+
[<img src="docs/images/flights_by_flight_at.png?raw=true" width="500" />](docs/images/flights_by_flight_at.png?raw=true)
|
93
|
+
|
94
|
+
### Dimensions
|
95
|
+
|
96
|
+
#### Overview
|
97
|
+
|
98
|
+
The dimension is what the measure is being grouped by. You can use datetime columns, integer columns, string columns, associations, or even define custom dimensions.
|
99
|
+
|
100
|
+
For example, the chart below groups by a `carrier` association on `Flight`
|
101
|
+
|
102
|
+
```yaml
|
103
|
+
measure: flight
|
104
|
+
dimensions:
|
105
|
+
- carrier
|
106
|
+
```
|
107
|
+
[<img src="docs/images/flights_by_carrier.png?raw=true" width="500" />](docs/images/flights_by_carrier.png?raw=true)
|
108
|
+
|
109
|
+
You can also use two dimensions:
|
110
|
+
|
111
|
+
```yaml
|
112
|
+
measure: flight
|
113
|
+
dimensions:
|
114
|
+
- carrier
|
115
|
+
- flight_at
|
116
|
+
```
|
117
|
+
[<img src="docs/images/flights_by_carrier_and_flight_at.png?raw=true" width="500" />](docs/images/flights_by_carrier_and_flight_at.png?raw=true)
|
118
|
+
|
119
|
+
Dimensions can be configured using a string:
|
120
|
+
|
121
|
+
```yaml
|
122
|
+
measure: flight
|
123
|
+
dimensions:
|
124
|
+
- carrier
|
125
|
+
```
|
126
|
+
|
127
|
+
Or, if you need to use options, you can configure them using a hash:
|
128
|
+
|
129
|
+
```yaml
|
130
|
+
measure: flight
|
131
|
+
dimensions:
|
132
|
+
- key: carrier
|
133
|
+
limit: 5
|
134
|
+
```
|
135
|
+
#### Types
|
136
|
+
|
137
|
+
##### Association
|
138
|
+
|
139
|
+
```yaml
|
140
|
+
measure: flight
|
141
|
+
dimensions:
|
142
|
+
- carrier
|
143
|
+
```
|
144
|
+
[<img src="docs/images/flights_by_carrier.png?raw=true" width="500" />](docs/images/flights_by_carrier.png?raw=true)
|
145
|
+
|
146
|
+
##### Datetime Column
|
147
|
+
|
148
|
+
```yaml
|
149
|
+
measure: flight
|
150
|
+
dimensions:
|
151
|
+
- flight_at
|
152
|
+
```
|
153
|
+
[<img src="docs/images/flights_by_flight_at.png?raw=true" width="500" />](docs/images/flights_by_flight_at.png?raw=true)
|
154
|
+
|
155
|
+
##### Integer Column
|
156
|
+
|
157
|
+
```yaml
|
158
|
+
measure: flight
|
159
|
+
dimensions:
|
160
|
+
- delay
|
161
|
+
```
|
162
|
+
[<img src="docs/images/flights_by_delay.png?raw=true" width="500" />](docs/images/flights_by_delay.png?raw=true)
|
163
|
+
|
164
|
+
##### Custom
|
165
|
+
|
166
|
+
You can define custom dimensions in your model. For example, if `Flight` has a column named `delay` (in minutes), we can define a `hours_delayed` dimension:
|
167
|
+
|
168
|
+
```ruby
|
169
|
+
class Flight < ApplicationRecord
|
170
|
+
include ReportsKit::Model
|
171
|
+
|
172
|
+
reports_kit do
|
173
|
+
dimension :hours_delayed, group: 'GREATEST(ROUND(flights.delay::float/60), 0)'
|
174
|
+
end
|
175
|
+
end
|
176
|
+
```
|
177
|
+
|
178
|
+
We can then use the `hours_delayed` dimension:
|
179
|
+
|
180
|
+
```yaml
|
181
|
+
measure: flight
|
182
|
+
dimensions:
|
183
|
+
- hours_delayed
|
184
|
+
```
|
185
|
+
[<img src="docs/images/flights_by_hours_delayed.png?raw=true" width="500" />](docs/images/flights_by_hours_delayed.png?raw=true)
|
186
|
+
|
187
|
+
#### Options
|
188
|
+
|
189
|
+
##### `key` *String*
|
190
|
+
|
191
|
+
The dimension's identifier. You can use association names (e.g. `author`), column names (e.g. `created_at`), or the keys of custom dimensions (e.g. `my_dimension`).
|
192
|
+
|
193
|
+
##### `limit` *Integer*
|
194
|
+
|
195
|
+
The maximum number of dimension instances to include.
|
196
|
+
|
197
|
+
### Filters
|
198
|
+
|
199
|
+
#### Overview
|
200
|
+
|
201
|
+
A filter is like a `where`: it filters the results to only include results that match a condition. You can use datetime columns, integer columns, string columns, associations, or even define custom filters.
|
202
|
+
|
203
|
+
For example, if the `Flight` model has a `delay` column that's an integer, the chart below will show only flights that have a delay of greater than 15 minutes:
|
204
|
+
|
205
|
+
```yaml
|
206
|
+
measure:
|
207
|
+
key: flight
|
208
|
+
filters:
|
209
|
+
- key: delay
|
210
|
+
criteria:
|
211
|
+
operator: '>'
|
212
|
+
value: 15
|
213
|
+
dimensions:
|
214
|
+
- carrier
|
215
|
+
```
|
216
|
+
[<img src="docs/images/flights_with_configured_number.png?raw=true" width="500" />](docs/images/flights_with_configured_number.png?raw=true)
|
217
|
+
|
218
|
+
You can also create form controls that the user can use to filter the chart:
|
219
|
+
|
220
|
+
```yaml
|
221
|
+
measure:
|
222
|
+
key: flight
|
223
|
+
filters:
|
224
|
+
- carrier
|
225
|
+
- carrier_name
|
226
|
+
- is_on_time
|
227
|
+
- flight_at
|
228
|
+
dimensions:
|
229
|
+
- flight_at
|
230
|
+
- carrier
|
231
|
+
```
|
232
|
+
|
233
|
+
In `app/views/my_view.html.haml`:
|
234
|
+
```haml
|
235
|
+
= render_report 'filters' do
|
236
|
+
.pull-right
|
237
|
+
= f.date_range :flight_at
|
238
|
+
= f.multi_autocomplete :carrier, scope: 'top', placeholder: 'Carrier...'
|
239
|
+
= f.string_filter :carrier_name, placeholder: 'Carrier name (e.g. Airlines)...', style: 'width: 175px;'
|
240
|
+
.checkbox
|
241
|
+
= label_tag :is_on_time do
|
242
|
+
= f.check_box :is_on_time
|
243
|
+
On time
|
244
|
+
```
|
245
|
+
[<img src="docs/images/flights_with_filters.png?raw=true" width="500" />](docs/images/flights_with_filters.png?raw=true)
|
246
|
+
|
247
|
+
#### Types
|
248
|
+
|
249
|
+
##### Boolean
|
250
|
+
|
251
|
+
```yaml
|
252
|
+
measure:
|
253
|
+
key: flight
|
254
|
+
filters:
|
255
|
+
- key: is_on_time
|
256
|
+
criteria:
|
257
|
+
operator: true
|
258
|
+
value: 15
|
259
|
+
dimensions:
|
260
|
+
- carrier
|
261
|
+
```
|
262
|
+
[<img src="docs/images/flights_with_configured_boolean.png?raw=true" width="500" />](docs/images/flights_with_configured_boolean.png?raw=true)
|
263
|
+
|
264
|
+
##### Datetime
|
265
|
+
|
266
|
+
```yaml
|
267
|
+
measure:
|
268
|
+
key: flight
|
269
|
+
filters:
|
270
|
+
- key: flight_at
|
271
|
+
criteria:
|
272
|
+
operator: between
|
273
|
+
value: Oct 1, 2016 - Jan 1, 2017
|
274
|
+
dimensions:
|
275
|
+
- carrier
|
276
|
+
```
|
277
|
+
[<img src="docs/images/flights_with_configured_datetime.png?raw=true" width="500" />](docs/images/flights_with_configured_datetime.png?raw=true)
|
278
|
+
|
279
|
+
##### Number
|
280
|
+
|
281
|
+
```yaml
|
282
|
+
measure:
|
283
|
+
key: flight
|
284
|
+
filters:
|
285
|
+
- key: delay
|
286
|
+
criteria:
|
287
|
+
operator: '>'
|
288
|
+
value: 15
|
289
|
+
dimensions:
|
290
|
+
- carrier
|
291
|
+
```
|
292
|
+
[<img src="docs/images/flights_with_configured_number.png?raw=true" width="500" />](docs/images/flights_with_configured_number.png?raw=true)
|
293
|
+
|
294
|
+
##### String
|
295
|
+
|
296
|
+
```yaml
|
297
|
+
measure:
|
298
|
+
key: flight
|
299
|
+
filters:
|
300
|
+
- key: carrier_name
|
301
|
+
criteria:
|
302
|
+
operator: contains
|
303
|
+
value: airlines
|
304
|
+
dimensions:
|
305
|
+
- carrier
|
306
|
+
```
|
307
|
+
[<img src="docs/images/flights_with_configured_string.png?raw=true" width="500" />](docs/images/flights_with_configured_string.png?raw=true)
|
308
|
+
|
309
|
+
|
310
|
+
#### Form Controls
|
311
|
+
|
312
|
+
##### Check Box
|
313
|
+
|
314
|
+
```yaml
|
315
|
+
measure:
|
316
|
+
key: flight
|
317
|
+
filters:
|
318
|
+
- is_on_time
|
319
|
+
dimensions:
|
320
|
+
- flight_at
|
321
|
+
- carrier
|
322
|
+
```
|
323
|
+
```haml
|
324
|
+
= render_report 'filter_check_box' do
|
325
|
+
.checkbox
|
326
|
+
= label_tag :is_on_time do
|
327
|
+
= f.check_box :is_on_time
|
328
|
+
On time
|
329
|
+
```
|
330
|
+
[<img src="docs/images/flights_with_check_box.png?raw=true" width="500" />](docs/images/flights_with_check_box.png?raw=true)
|
331
|
+
|
332
|
+
##### Date Range
|
333
|
+
|
334
|
+
```yaml
|
335
|
+
measure:
|
336
|
+
key: flight
|
337
|
+
filters:
|
338
|
+
- flight_at
|
339
|
+
dimensions:
|
340
|
+
- flight_at
|
341
|
+
- carrier
|
342
|
+
```
|
343
|
+
```haml
|
344
|
+
= render_report 'filter_date_range' do
|
345
|
+
= f.date_range :flight_at
|
346
|
+
```
|
347
|
+
[<img src="docs/images/flights_with_date_range.png?raw=true" width="500" />](docs/images/flights_with_date_range.png?raw=true)
|
348
|
+
|
349
|
+
##### Multi-Autocomplete
|
350
|
+
|
351
|
+
```yaml
|
352
|
+
measure:
|
353
|
+
key: flight
|
354
|
+
filters:
|
355
|
+
- carrier
|
356
|
+
dimensions:
|
357
|
+
- flight_at
|
358
|
+
- carrier
|
359
|
+
```
|
360
|
+
```haml
|
361
|
+
= render_report 'filter_multi_autocomplete' do
|
362
|
+
= f.multi_autocomplete :carrier, scope: 'top', placeholder: 'Carrier...'
|
363
|
+
```
|
364
|
+
[<img src="docs/images/flights_with_multi_autocomplete.png?raw=true" width="500" />](docs/images/flights_with_multi_autocomplete.png?raw=true)
|
365
|
+
|
366
|
+
##### String Filter
|
367
|
+
|
368
|
+
```yaml
|
369
|
+
measure:
|
370
|
+
key: flight
|
371
|
+
filters:
|
372
|
+
- carrier_name
|
373
|
+
dimensions:
|
374
|
+
- flight_at
|
375
|
+
- carrier
|
376
|
+
```
|
377
|
+
```haml
|
378
|
+
= render_report 'filter_string' do
|
379
|
+
= f.string_filter :carrier_name, placeholder: 'Carrier name (e.g. Airlines)...', style: 'width: 175px;'
|
380
|
+
```
|
381
|
+
[<img src="docs/images/flights_with_string_filter.png?raw=true" width="500" />](docs/images/flights_with_string_filter.png?raw=true)
|
382
|
+
|
383
|
+
### Display Options
|
384
|
+
|
385
|
+
#### Overview
|
386
|
+
|
387
|
+
Charts are rendered using [Chart.js](http://www.chartjs.org/). You can configure your ReportsKit chart using any [Chart.js options](http://www.chartjs.org/docs/).
|
388
|
+
|
389
|
+
##### `type`
|
390
|
+
|
391
|
+
You can use any `type` value supported by Chart.js, including `bar`, `line`, `horizontalBar`, `radar`, and more.
|
392
|
+
|
393
|
+
Here's an example of a horizontal bar chart:
|
394
|
+
|
395
|
+
```yaml
|
396
|
+
measure: flight
|
397
|
+
dimensions:
|
398
|
+
- carrier
|
399
|
+
chart:
|
400
|
+
type: horizontalBar
|
401
|
+
options:
|
402
|
+
scales:
|
403
|
+
xAxes:
|
404
|
+
- scaleLabel:
|
405
|
+
display: true
|
406
|
+
labelString: Flights
|
407
|
+
yAxes:
|
408
|
+
- scaleLabel:
|
409
|
+
display: true
|
410
|
+
labelString: Carrier
|
411
|
+
```
|
412
|
+
[<img src="docs/images/horizontal_bar.png?raw=true" width="500" />](docs/images/horizontal_bar.png?raw=true)
|
413
|
+
|
414
|
+
##### `options`
|
415
|
+
|
416
|
+
You can use any `options` that are supported by Chart.js.
|
417
|
+
|
418
|
+
Here's an example of a chart with Chart.js options:
|
419
|
+
|
420
|
+
```yaml
|
421
|
+
measure: flight
|
422
|
+
dimensions:
|
423
|
+
- origin_market
|
424
|
+
- carrier
|
425
|
+
chart:
|
426
|
+
type: horizontalBar
|
427
|
+
options:
|
428
|
+
scales:
|
429
|
+
xAxes:
|
430
|
+
- stacked: true
|
431
|
+
scaleLabel:
|
432
|
+
display: true
|
433
|
+
labelString: Flights
|
434
|
+
yAxes:
|
435
|
+
- stacked: true
|
436
|
+
scaleLabel:
|
437
|
+
display: true
|
438
|
+
labelString: Market
|
439
|
+
```
|
440
|
+
[<img src="docs/images/chart_options.png?raw=true" width="500" />](docs/images/chart_options.png?raw=true)
|
441
|
+
|
442
|
+
##### `datasets`
|
443
|
+
|
444
|
+
You can use any `datasets` options that are supported by Chart.js.
|
445
|
+
|
446
|
+
Here's an example of a chart with `datasets` options:
|
447
|
+
|
448
|
+
```yaml
|
449
|
+
measure: flight
|
450
|
+
dimensions:
|
451
|
+
- flight_at
|
452
|
+
- key: carrier
|
453
|
+
limit: 3
|
454
|
+
chart:
|
455
|
+
type: line
|
456
|
+
datasets:
|
457
|
+
fill: false
|
458
|
+
borderDash:
|
459
|
+
- 5
|
460
|
+
- 5
|
461
|
+
```
|
462
|
+
[<img src="docs/images/dashed_line.png?raw=true" width="500" />](docs/images/dashed_line.png?raw=true)
|
463
|
+
|
464
|
+
|
465
|
+
License
|
466
|
+
-------
|
467
|
+
|
468
|
+
ReportsKit is released under the MIT License. Please see the MIT-LICENSE file for details.
|