reports_kit 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rubocop.yml +83 -0
  4. data/Gemfile +3 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +468 -0
  7. data/Rakefile +2 -0
  8. data/app/assets/javascripts/reports_kit/application.js +14 -0
  9. data/app/assets/javascripts/reports_kit/lib/_init.js +8 -0
  10. data/app/assets/javascripts/reports_kit/lib/chart.js +39 -0
  11. data/app/assets/javascripts/reports_kit/lib/report.js +119 -0
  12. data/app/assets/javascripts/reports_kit/vendor/chart.js +12269 -0
  13. data/app/assets/javascripts/reports_kit/vendor/daterangepicker.js +1627 -0
  14. data/app/assets/javascripts/reports_kit/vendor/moment.js +4040 -0
  15. data/app/assets/javascripts/reports_kit/vendor/select2.full.js +6436 -0
  16. data/app/assets/stylesheets/reports_kit/application.css.scss +3 -0
  17. data/app/assets/stylesheets/reports_kit/reports.css.sass +7 -0
  18. data/app/assets/stylesheets/reports_kit/select2_overrides.css.sass +7 -0
  19. data/app/assets/stylesheets/reports_kit/vendor/daterangepicker.css +269 -0
  20. data/app/assets/stylesheets/reports_kit/vendor/select2-bootstrap.css +721 -0
  21. data/app/assets/stylesheets/reports_kit/vendor/select2.css +484 -0
  22. data/config/routes.rb +10 -0
  23. data/docs/images/chart_options.png +0 -0
  24. data/docs/images/dashed_line.png +0 -0
  25. data/docs/images/flights_by_carrier.png +0 -0
  26. data/docs/images/flights_by_carrier_and_flight_at.png +0 -0
  27. data/docs/images/flights_by_delay.png +0 -0
  28. data/docs/images/flights_by_flight_at.png +0 -0
  29. data/docs/images/flights_by_hours_delayed.png +0 -0
  30. data/docs/images/flights_with_check_box.png +0 -0
  31. data/docs/images/flights_with_configured_boolean.png +0 -0
  32. data/docs/images/flights_with_configured_datetime.png +0 -0
  33. data/docs/images/flights_with_configured_number.png +0 -0
  34. data/docs/images/flights_with_configured_string.png +0 -0
  35. data/docs/images/flights_with_date_range.png +0 -0
  36. data/docs/images/flights_with_filters.png +0 -0
  37. data/docs/images/flights_with_multi_autocomplete.png +0 -0
  38. data/docs/images/flights_with_string_filter.png +0 -0
  39. data/docs/images/horizontal_bar.png +0 -0
  40. data/docs/images/legend_right.png +0 -0
  41. data/docs/images/users_by_created_at.png +0 -0
  42. data/gists/doc.txt +58 -0
  43. data/lib/reports_kit.rb +17 -0
  44. data/lib/reports_kit/base_controller.rb +11 -0
  45. data/lib/reports_kit/configuration.rb +10 -0
  46. data/lib/reports_kit/engine.rb +21 -0
  47. data/lib/reports_kit/helper.rb +19 -0
  48. data/lib/reports_kit/model.rb +16 -0
  49. data/lib/reports_kit/model_configuration.rb +23 -0
  50. data/lib/reports_kit/rails.rb +5 -0
  51. data/lib/reports_kit/report_builder.rb +76 -0
  52. data/lib/reports_kit/reports/data/chart_options.rb +132 -0
  53. data/lib/reports_kit/reports/data/generate.rb +65 -0
  54. data/lib/reports_kit/reports/data/one_dimension.rb +71 -0
  55. data/lib/reports_kit/reports/data/two_dimensions.rb +129 -0
  56. data/lib/reports_kit/reports/data/utils.rb +79 -0
  57. data/lib/reports_kit/reports/dimension.rb +78 -0
  58. data/lib/reports_kit/reports/filter.rb +84 -0
  59. data/lib/reports_kit/reports/filter_types/base.rb +47 -0
  60. data/lib/reports_kit/reports/filter_types/boolean.rb +30 -0
  61. data/lib/reports_kit/reports/filter_types/datetime.rb +27 -0
  62. data/lib/reports_kit/reports/filter_types/number.rb +28 -0
  63. data/lib/reports_kit/reports/filter_types/records.rb +26 -0
  64. data/lib/reports_kit/reports/filter_types/string.rb +38 -0
  65. data/lib/reports_kit/reports/generate_autocomplete_results.rb +55 -0
  66. data/lib/reports_kit/reports/inferrable_configuration.rb +113 -0
  67. data/lib/reports_kit/reports/measure.rb +58 -0
  68. data/lib/reports_kit/reports_controller.rb +15 -0
  69. data/lib/reports_kit/resources_controller.rb +8 -0
  70. data/lib/reports_kit/version.rb +3 -0
  71. data/reports_kit.gemspec +23 -0
  72. data/spec/factories/issue_factory.rb +4 -0
  73. data/spec/factories/issues_label_factory.rb +4 -0
  74. data/spec/factories/label_factory.rb +4 -0
  75. data/spec/factories/repo_factory.rb +5 -0
  76. data/spec/factories/tag_factory.rb +4 -0
  77. data/spec/fixtures/generate_inputs.yml +35 -0
  78. data/spec/fixtures/generate_outputs.yml +208 -0
  79. data/spec/reports_kit/reports/data/generate_spec.rb +275 -0
  80. data/spec/reports_kit/reports/dimension_spec.rb +38 -0
  81. data/spec/reports_kit/reports/filter_spec.rb +38 -0
  82. data/spec/spec_helper.rb +58 -0
  83. data/spec/support/factory_girl.rb +5 -0
  84. data/spec/support/helpers.rb +13 -0
  85. data/spec/support/models/issue.rb +6 -0
  86. data/spec/support/models/issues_label.rb +4 -0
  87. data/spec/support/models/label.rb +5 -0
  88. data/spec/support/models/repo.rb +7 -0
  89. data/spec/support/models/tag.rb +4 -0
  90. data/spec/support/schema.rb +38 -0
  91. metadata +232 -0
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require_tree .
3
+ */
@@ -0,0 +1,7 @@
1
+ .reports_kit_report
2
+ width: 100%
3
+ padding: 1px
4
+ canvas
5
+ width: 100%
6
+ .date_range_picker
7
+ width: 180px
@@ -0,0 +1,7 @@
1
+ .reports_kit_report
2
+ .select2
3
+ width: 200px
4
+ .select2-container .select2-selection--multiple .select2-selection__rendered
5
+ padding-left: 0
6
+ .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field
7
+ height: 25px
@@ -0,0 +1,269 @@
1
+ .daterangepicker {
2
+ position: absolute;
3
+ color: inherit;
4
+ background-color: #fff;
5
+ border-radius: 4px;
6
+ width: 278px;
7
+ padding: 4px;
8
+ margin-top: 1px;
9
+ top: 100px;
10
+ left: 20px;
11
+ /* Calendars */ }
12
+ .daterangepicker:before, .daterangepicker:after {
13
+ position: absolute;
14
+ display: inline-block;
15
+ border-bottom-color: rgba(0, 0, 0, 0.2);
16
+ content: ''; }
17
+ .daterangepicker:before {
18
+ top: -7px;
19
+ border-right: 7px solid transparent;
20
+ border-left: 7px solid transparent;
21
+ border-bottom: 7px solid #ccc; }
22
+ .daterangepicker:after {
23
+ top: -6px;
24
+ border-right: 6px solid transparent;
25
+ border-bottom: 6px solid #fff;
26
+ border-left: 6px solid transparent; }
27
+ .daterangepicker.opensleft:before {
28
+ right: 9px; }
29
+ .daterangepicker.opensleft:after {
30
+ right: 10px; }
31
+ .daterangepicker.openscenter:before {
32
+ left: 0;
33
+ right: 0;
34
+ width: 0;
35
+ margin-left: auto;
36
+ margin-right: auto; }
37
+ .daterangepicker.openscenter:after {
38
+ left: 0;
39
+ right: 0;
40
+ width: 0;
41
+ margin-left: auto;
42
+ margin-right: auto; }
43
+ .daterangepicker.opensright:before {
44
+ left: 9px; }
45
+ .daterangepicker.opensright:after {
46
+ left: 10px; }
47
+ .daterangepicker.dropup {
48
+ margin-top: -5px; }
49
+ .daterangepicker.dropup:before {
50
+ top: initial;
51
+ bottom: -7px;
52
+ border-bottom: initial;
53
+ border-top: 7px solid #ccc; }
54
+ .daterangepicker.dropup:after {
55
+ top: initial;
56
+ bottom: -6px;
57
+ border-bottom: initial;
58
+ border-top: 6px solid #fff; }
59
+ .daterangepicker.dropdown-menu {
60
+ max-width: none;
61
+ z-index: 3001; }
62
+ .daterangepicker.single .ranges, .daterangepicker.single .calendar {
63
+ float: none; }
64
+ .daterangepicker.show-calendar .calendar {
65
+ display: block; }
66
+ .daterangepicker .calendar {
67
+ display: none;
68
+ max-width: 270px;
69
+ margin: 4px; }
70
+ .daterangepicker .calendar.single .calendar-table {
71
+ border: none; }
72
+ .daterangepicker .calendar th, .daterangepicker .calendar td {
73
+ white-space: nowrap;
74
+ text-align: center;
75
+ min-width: 32px; }
76
+ .daterangepicker .calendar-table {
77
+ border: 1px solid #fff;
78
+ padding: 4px;
79
+ border-radius: 4px;
80
+ background-color: #fff; }
81
+ .daterangepicker table {
82
+ width: 100%;
83
+ margin: 0; }
84
+ .daterangepicker td, .daterangepicker th {
85
+ text-align: center;
86
+ width: 20px;
87
+ height: 20px;
88
+ border-radius: 4px;
89
+ border: 1px solid transparent;
90
+ white-space: nowrap;
91
+ cursor: pointer; }
92
+ .daterangepicker td.available:hover, .daterangepicker th.available:hover {
93
+ background-color: #eee;
94
+ border-color: transparent;
95
+ color: inherit; }
96
+ .daterangepicker td.week, .daterangepicker th.week {
97
+ font-size: 80%;
98
+ color: #ccc; }
99
+ .daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date {
100
+ background-color: #fff;
101
+ border-color: transparent;
102
+ color: #999; }
103
+ .daterangepicker td.in-range {
104
+ background-color: #ebf4f8;
105
+ border-color: transparent;
106
+ color: #000;
107
+ border-radius: 0; }
108
+ .daterangepicker td.start-date {
109
+ border-radius: 4px 0 0 4px; }
110
+ .daterangepicker td.end-date {
111
+ border-radius: 0 4px 4px 0; }
112
+ .daterangepicker td.start-date.end-date {
113
+ border-radius: 4px; }
114
+ .daterangepicker td.active, .daterangepicker td.active:hover {
115
+ background-color: #357ebd;
116
+ border-color: transparent;
117
+ color: #fff; }
118
+ .daterangepicker th.month {
119
+ width: auto; }
120
+ .daterangepicker td.disabled, .daterangepicker option.disabled {
121
+ color: #999;
122
+ cursor: not-allowed;
123
+ text-decoration: line-through; }
124
+ .daterangepicker select.monthselect, .daterangepicker select.yearselect {
125
+ font-size: 12px;
126
+ padding: 1px;
127
+ height: auto;
128
+ margin: 0;
129
+ cursor: default; }
130
+ .daterangepicker select.monthselect {
131
+ margin-right: 2%;
132
+ width: 56%; }
133
+ .daterangepicker select.yearselect {
134
+ width: 40%; }
135
+ .daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect {
136
+ width: 50px;
137
+ margin-bottom: 0; }
138
+ .daterangepicker .input-mini {
139
+ border: 1px solid #ccc;
140
+ border-radius: 4px;
141
+ color: #555;
142
+ height: 30px;
143
+ line-height: 30px;
144
+ display: block;
145
+ vertical-align: middle;
146
+ margin: 0 0 5px 0;
147
+ padding: 0 6px 0 28px;
148
+ width: 100%; }
149
+ .daterangepicker .input-mini.active {
150
+ border: 1px solid #08c;
151
+ border-radius: 4px; }
152
+ .daterangepicker .daterangepicker_input {
153
+ position: relative; }
154
+ .daterangepicker .daterangepicker_input i {
155
+ position: absolute;
156
+ left: 8px;
157
+ top: 8px; }
158
+ .daterangepicker.rtl .input-mini {
159
+ padding-right: 28px;
160
+ padding-left: 6px; }
161
+ .daterangepicker.rtl .daterangepicker_input i {
162
+ left: auto;
163
+ right: 8px; }
164
+ .daterangepicker .calendar-time {
165
+ text-align: center;
166
+ margin: 5px auto;
167
+ line-height: 30px;
168
+ position: relative;
169
+ padding-left: 28px; }
170
+ .daterangepicker .calendar-time select.disabled {
171
+ color: #ccc;
172
+ cursor: not-allowed; }
173
+
174
+ .ranges {
175
+ font-size: 11px;
176
+ float: none;
177
+ margin: 4px;
178
+ text-align: left; }
179
+ .ranges ul {
180
+ list-style: none;
181
+ margin: 0 auto;
182
+ padding: 0;
183
+ width: 100%; }
184
+ .ranges li {
185
+ font-size: 13px;
186
+ background-color: #f5f5f5;
187
+ border: 1px solid #f5f5f5;
188
+ border-radius: 4px;
189
+ color: #08c;
190
+ padding: 3px 12px;
191
+ margin-bottom: 8px;
192
+ cursor: pointer; }
193
+ .ranges li:hover {
194
+ background-color: #08c;
195
+ border: 1px solid #08c;
196
+ color: #fff; }
197
+ .ranges li.active {
198
+ background-color: #08c;
199
+ border: 1px solid #08c;
200
+ color: #fff; }
201
+
202
+ /* Larger Screen Styling */
203
+ @media (min-width: 564px) {
204
+ .daterangepicker {
205
+ width: auto; }
206
+ .daterangepicker .ranges ul {
207
+ width: 160px; }
208
+ .daterangepicker.single .ranges ul {
209
+ width: 100%; }
210
+ .daterangepicker.single .calendar.left {
211
+ clear: none; }
212
+ .daterangepicker.single.ltr .ranges, .daterangepicker.single.ltr .calendar {
213
+ float: left; }
214
+ .daterangepicker.single.rtl .ranges, .daterangepicker.single.rtl .calendar {
215
+ float: right; }
216
+ .daterangepicker.ltr {
217
+ direction: ltr;
218
+ text-align: left; }
219
+ .daterangepicker.ltr .calendar.left {
220
+ clear: left;
221
+ margin-right: 0; }
222
+ .daterangepicker.ltr .calendar.left .calendar-table {
223
+ border-right: none;
224
+ border-top-right-radius: 0;
225
+ border-bottom-right-radius: 0; }
226
+ .daterangepicker.ltr .calendar.right {
227
+ margin-left: 0; }
228
+ .daterangepicker.ltr .calendar.right .calendar-table {
229
+ border-left: none;
230
+ border-top-left-radius: 0;
231
+ border-bottom-left-radius: 0; }
232
+ .daterangepicker.ltr .left .daterangepicker_input {
233
+ padding-right: 12px; }
234
+ .daterangepicker.ltr .calendar.left .calendar-table {
235
+ padding-right: 12px; }
236
+ .daterangepicker.ltr .ranges, .daterangepicker.ltr .calendar {
237
+ float: left; }
238
+ .daterangepicker.rtl {
239
+ direction: rtl;
240
+ text-align: right; }
241
+ .daterangepicker.rtl .calendar.left {
242
+ clear: right;
243
+ margin-left: 0; }
244
+ .daterangepicker.rtl .calendar.left .calendar-table {
245
+ border-left: none;
246
+ border-top-left-radius: 0;
247
+ border-bottom-left-radius: 0; }
248
+ .daterangepicker.rtl .calendar.right {
249
+ margin-right: 0; }
250
+ .daterangepicker.rtl .calendar.right .calendar-table {
251
+ border-right: none;
252
+ border-top-right-radius: 0;
253
+ border-bottom-right-radius: 0; }
254
+ .daterangepicker.rtl .left .daterangepicker_input {
255
+ padding-left: 12px; }
256
+ .daterangepicker.rtl .calendar.left .calendar-table {
257
+ padding-left: 12px; }
258
+ .daterangepicker.rtl .ranges, .daterangepicker.rtl .calendar {
259
+ text-align: right;
260
+ float: right; } }
261
+ @media (min-width: 730px) {
262
+ .daterangepicker .ranges {
263
+ width: auto; }
264
+ .daterangepicker.ltr .ranges {
265
+ float: left; }
266
+ .daterangepicker.rtl .ranges {
267
+ float: right; }
268
+ .daterangepicker .calendar.left {
269
+ clear: none !important; } }
@@ -0,0 +1,721 @@
1
+ /*!
2
+ * Select2 Bootstrap Theme v0.1.0-beta.10 (https://select2.github.io/select2-bootstrap-theme)
3
+ * Copyright 2015-2017 Florian Kissling and contributors (https://github.com/select2/select2-bootstrap-theme/graphs/contributors)
4
+ * Licensed under MIT (https://github.com/select2/select2-bootstrap-theme/blob/master/LICENSE)
5
+ */
6
+
7
+ .select2-container--bootstrap {
8
+ display: block;
9
+ /*------------------------------------* #COMMON STYLES
10
+ \*------------------------------------*/
11
+ /**
12
+ * Search field in the Select2 dropdown.
13
+ */
14
+ /**
15
+ * No outline for all search fields - in the dropdown
16
+ * and inline in multi Select2s.
17
+ */
18
+ /**
19
+ * Adjust Select2's choices hover and selected styles to match
20
+ * Bootstrap 3's default dropdown styles.
21
+ *
22
+ * @see http://getbootstrap.com/components/#dropdowns
23
+ */
24
+ /**
25
+ * Clear the selection.
26
+ */
27
+ /**
28
+ * Address disabled Select2 styles.
29
+ *
30
+ * @see https://select2.github.io/examples.html#disabled
31
+ * @see http://getbootstrap.com/css/#forms-control-disabled
32
+ */
33
+ /*------------------------------------* #DROPDOWN
34
+ \*------------------------------------*/
35
+ /**
36
+ * Dropdown border color and box-shadow.
37
+ */
38
+ /**
39
+ * Limit the dropdown height.
40
+ */
41
+ /*------------------------------------* #SINGLE SELECT2
42
+ \*------------------------------------*/
43
+ /*------------------------------------* #MULTIPLE SELECT2
44
+ \*------------------------------------*/
45
+ /**
46
+ * Address Bootstrap control sizing classes
47
+ *
48
+ * 1. Reset Bootstrap defaults.
49
+ * 2. Adjust the dropdown arrow button icon position.
50
+ *
51
+ * @see http://getbootstrap.com/css/#forms-control-sizes
52
+ */
53
+ /* 1 */
54
+ /*------------------------------------* #RTL SUPPORT
55
+ \*------------------------------------*/
56
+ }
57
+
58
+ .select2-container--bootstrap .select2-selection {
59
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
60
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
61
+ background-color: #fff;
62
+ border: 1px solid #ccc;
63
+ border-radius: 4px;
64
+ color: #555555;
65
+ font-size: 14px;
66
+ outline: 0;
67
+ }
68
+
69
+ .select2-container--bootstrap .select2-selection.form-control {
70
+ border-radius: 4px;
71
+ }
72
+
73
+ .select2-container--bootstrap .select2-search--dropdown .select2-search__field {
74
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
75
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
76
+ background-color: #fff;
77
+ border: 1px solid #ccc;
78
+ border-radius: 4px;
79
+ color: #555555;
80
+ font-size: 14px;
81
+ }
82
+
83
+ .select2-container--bootstrap .select2-search__field {
84
+ outline: 0;
85
+ /* Firefox 18- */
86
+ /**
87
+ * Firefox 19+
88
+ *
89
+ * @see http://stackoverflow.com/questions/24236240/color-for-styled-placeholder-text-is-muted-in-firefox
90
+ */
91
+ }
92
+
93
+ .select2-container--bootstrap .select2-search__field::-webkit-input-placeholder {
94
+ color: #999;
95
+ }
96
+
97
+ .select2-container--bootstrap .select2-search__field:-moz-placeholder {
98
+ color: #999;
99
+ }
100
+
101
+ .select2-container--bootstrap .select2-search__field::-moz-placeholder {
102
+ color: #999;
103
+ opacity: 1;
104
+ }
105
+
106
+ .select2-container--bootstrap .select2-search__field:-ms-input-placeholder {
107
+ color: #999;
108
+ }
109
+
110
+ .select2-container--bootstrap .select2-results__option {
111
+ padding: 6px 12px;
112
+ /**
113
+ * Disabled results.
114
+ *
115
+ * @see https://select2.github.io/examples.html#disabled-results
116
+ */
117
+ /**
118
+ * Hover state.
119
+ */
120
+ /**
121
+ * Selected state.
122
+ */
123
+ }
124
+
125
+ .select2-container--bootstrap .select2-results__option[role=group] {
126
+ padding: 0;
127
+ }
128
+
129
+ .select2-container--bootstrap .select2-results__option[aria-disabled=true] {
130
+ color: #777777;
131
+ cursor: not-allowed;
132
+ }
133
+
134
+ .select2-container--bootstrap .select2-results__option[aria-selected=true] {
135
+ background-color: #f5f5f5;
136
+ color: #262626;
137
+ }
138
+
139
+ .select2-container--bootstrap .select2-results__option--highlighted[aria-selected] {
140
+ background-color: #337ab7;
141
+ color: #fff;
142
+ }
143
+
144
+ .select2-container--bootstrap .select2-results__option .select2-results__option {
145
+ padding: 6px 12px;
146
+ }
147
+
148
+ .select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__group {
149
+ padding-left: 0;
150
+ }
151
+
152
+ .select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option {
153
+ margin-left: -12px;
154
+ padding-left: 24px;
155
+ }
156
+
157
+ .select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
158
+ margin-left: -24px;
159
+ padding-left: 36px;
160
+ }
161
+
162
+ .select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
163
+ margin-left: -36px;
164
+ padding-left: 48px;
165
+ }
166
+
167
+ .select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
168
+ margin-left: -48px;
169
+ padding-left: 60px;
170
+ }
171
+
172
+ .select2-container--bootstrap .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
173
+ margin-left: -60px;
174
+ padding-left: 72px;
175
+ }
176
+
177
+ .select2-container--bootstrap .select2-results__group {
178
+ color: #777777;
179
+ display: block;
180
+ padding: 6px 12px;
181
+ font-size: 12px;
182
+ line-height: 1.42857143;
183
+ white-space: nowrap;
184
+ }
185
+
186
+ .select2-container--bootstrap.select2-container--focus .select2-selection, .select2-container--bootstrap.select2-container--open .select2-selection {
187
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
188
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
189
+ -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
190
+ -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
191
+ -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
192
+ transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
193
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
194
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
195
+ border-color: #66afe9;
196
+ }
197
+
198
+ .select2-container--bootstrap.select2-container--open {
199
+ /**
200
+ * Make the dropdown arrow point up while the dropdown is visible.
201
+ */
202
+ /**
203
+ * Handle border radii of the container when the dropdown is showing.
204
+ */
205
+ }
206
+
207
+ .select2-container--bootstrap.select2-container--open .select2-selection .select2-selection__arrow b {
208
+ border-color: transparent transparent #999 transparent;
209
+ border-width: 0 4px 4px 4px;
210
+ }
211
+
212
+ .select2-container--bootstrap.select2-container--open.select2-container--below .select2-selection {
213
+ border-bottom-right-radius: 0;
214
+ border-bottom-left-radius: 0;
215
+ border-bottom-color: transparent;
216
+ }
217
+
218
+ .select2-container--bootstrap.select2-container--open.select2-container--above .select2-selection {
219
+ border-top-right-radius: 0;
220
+ border-top-left-radius: 0;
221
+ border-top-color: transparent;
222
+ }
223
+
224
+ .select2-container--bootstrap .select2-selection__clear {
225
+ color: #999;
226
+ cursor: pointer;
227
+ float: right;
228
+ font-weight: bold;
229
+ margin-right: 10px;
230
+ }
231
+
232
+ .select2-container--bootstrap .select2-selection__clear:hover {
233
+ color: #333;
234
+ }
235
+
236
+ .select2-container--bootstrap.select2-container--disabled .select2-selection {
237
+ border-color: #ccc;
238
+ -webkit-box-shadow: none;
239
+ box-shadow: none;
240
+ }
241
+
242
+ .select2-container--bootstrap.select2-container--disabled .select2-selection,
243
+ .select2-container--bootstrap.select2-container--disabled .select2-search__field {
244
+ cursor: not-allowed;
245
+ }
246
+
247
+ .select2-container--bootstrap.select2-container--disabled .select2-selection,
248
+ .select2-container--bootstrap.select2-container--disabled .select2-selection--multiple .select2-selection__choice {
249
+ background-color: #eeeeee;
250
+ }
251
+
252
+ .select2-container--bootstrap.select2-container--disabled .select2-selection__clear,
253
+ .select2-container--bootstrap.select2-container--disabled .select2-selection--multiple .select2-selection__choice__remove {
254
+ display: none;
255
+ }
256
+
257
+ .select2-container--bootstrap .select2-dropdown {
258
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
259
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
260
+ border-color: #66afe9;
261
+ overflow-x: hidden;
262
+ margin-top: -1px;
263
+ }
264
+
265
+ .select2-container--bootstrap .select2-dropdown--above {
266
+ -webkit-box-shadow: 0px -6px 12px rgba(0, 0, 0, 0.175);
267
+ box-shadow: 0px -6px 12px rgba(0, 0, 0, 0.175);
268
+ margin-top: 1px;
269
+ }
270
+
271
+ .select2-container--bootstrap .select2-results > .select2-results__options {
272
+ max-height: 200px;
273
+ overflow-y: auto;
274
+ }
275
+
276
+ .select2-container--bootstrap .select2-selection--single {
277
+ height: 34px;
278
+ line-height: 1.42857143;
279
+ padding: 6px 24px 6px 12px;
280
+ /**
281
+ * Adjust the single Select2's dropdown arrow button appearance.
282
+ */
283
+ }
284
+
285
+ .select2-container--bootstrap .select2-selection--single .select2-selection__arrow {
286
+ position: absolute;
287
+ bottom: 0;
288
+ right: 12px;
289
+ top: 0;
290
+ width: 4px;
291
+ }
292
+
293
+ .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b {
294
+ border-color: #999 transparent transparent transparent;
295
+ border-style: solid;
296
+ border-width: 4px 4px 0 4px;
297
+ height: 0;
298
+ left: 0;
299
+ margin-left: -4px;
300
+ margin-top: -2px;
301
+ position: absolute;
302
+ top: 50%;
303
+ width: 0;
304
+ }
305
+
306
+ .select2-container--bootstrap .select2-selection--single .select2-selection__rendered {
307
+ color: #555555;
308
+ padding: 0;
309
+ }
310
+
311
+ .select2-container--bootstrap .select2-selection--single .select2-selection__placeholder {
312
+ color: #999;
313
+ }
314
+
315
+ .select2-container--bootstrap .select2-selection--multiple {
316
+ min-height: 34px;
317
+ padding: 0;
318
+ height: auto;
319
+ /**
320
+ * Make Multi Select2's choices match Bootstrap 3's default button styles.
321
+ */
322
+ /**
323
+ * Minus 2px borders.
324
+ */
325
+ /**
326
+ * Clear the selection.
327
+ */
328
+ }
329
+
330
+ .select2-container--bootstrap .select2-selection--multiple .select2-selection__rendered {
331
+ -webkit-box-sizing: border-box;
332
+ -moz-box-sizing: border-box;
333
+ box-sizing: border-box;
334
+ display: block;
335
+ line-height: 1.42857143;
336
+ list-style: none;
337
+ margin: 0;
338
+ overflow: hidden;
339
+ padding: 0;
340
+ width: 100%;
341
+ text-overflow: ellipsis;
342
+ white-space: nowrap;
343
+ }
344
+
345
+ .select2-container--bootstrap .select2-selection--multiple .select2-selection__placeholder {
346
+ color: #999;
347
+ float: left;
348
+ margin-top: 5px;
349
+ }
350
+
351
+ .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice {
352
+ color: #555555;
353
+ background: #fff;
354
+ border: 1px solid #ccc;
355
+ border-radius: 4px;
356
+ cursor: default;
357
+ float: left;
358
+ margin: 5px 0 0 6px;
359
+ padding: 0 6px;
360
+ }
361
+
362
+ .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field {
363
+ background: transparent;
364
+ padding: 0 12px;
365
+ height: 32px;
366
+ line-height: 1.42857143;
367
+ margin-top: 0;
368
+ min-width: 5em;
369
+ }
370
+
371
+ .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice__remove {
372
+ color: #999;
373
+ cursor: pointer;
374
+ display: inline-block;
375
+ font-weight: bold;
376
+ margin-right: 3px;
377
+ }
378
+
379
+ .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice__remove:hover {
380
+ color: #333;
381
+ }
382
+
383
+ .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear {
384
+ margin-top: 6px;
385
+ }
386
+
387
+ .select2-container--bootstrap .select2-selection--single.input-sm,
388
+ .input-group-sm .select2-container--bootstrap .select2-selection--single,
389
+ .form-group-sm .select2-container--bootstrap .select2-selection--single {
390
+ border-radius: 3px;
391
+ font-size: 12px;
392
+ height: 30px;
393
+ line-height: 1.5;
394
+ padding: 5px 22px 5px 10px;
395
+ /* 2 */
396
+ }
397
+
398
+ .select2-container--bootstrap .select2-selection--single.input-sm .select2-selection__arrow b,
399
+ .input-group-sm .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,
400
+ .form-group-sm .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b {
401
+ margin-left: -5px;
402
+ }
403
+
404
+ .select2-container--bootstrap .select2-selection--multiple.input-sm,
405
+ .input-group-sm .select2-container--bootstrap .select2-selection--multiple,
406
+ .form-group-sm .select2-container--bootstrap .select2-selection--multiple {
407
+ min-height: 30px;
408
+ border-radius: 3px;
409
+ }
410
+
411
+ .select2-container--bootstrap .select2-selection--multiple.input-sm .select2-selection__choice,
412
+ .input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,
413
+ .form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice {
414
+ font-size: 12px;
415
+ line-height: 1.5;
416
+ margin: 4px 0 0 5px;
417
+ padding: 0 5px;
418
+ }
419
+
420
+ .select2-container--bootstrap .select2-selection--multiple.input-sm .select2-search--inline .select2-search__field,
421
+ .input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,
422
+ .form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field {
423
+ padding: 0 10px;
424
+ font-size: 12px;
425
+ height: 28px;
426
+ line-height: 1.5;
427
+ }
428
+
429
+ .select2-container--bootstrap .select2-selection--multiple.input-sm .select2-selection__clear,
430
+ .input-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,
431
+ .form-group-sm .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear {
432
+ margin-top: 5px;
433
+ }
434
+
435
+ .select2-container--bootstrap .select2-selection--single.input-lg,
436
+ .input-group-lg .select2-container--bootstrap .select2-selection--single,
437
+ .form-group-lg .select2-container--bootstrap .select2-selection--single {
438
+ border-radius: 6px;
439
+ font-size: 18px;
440
+ height: 46px;
441
+ line-height: 1.3333333;
442
+ padding: 10px 31px 10px 16px;
443
+ /* 1 */
444
+ }
445
+
446
+ .select2-container--bootstrap .select2-selection--single.input-lg .select2-selection__arrow,
447
+ .input-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow,
448
+ .form-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow {
449
+ width: 5px;
450
+ }
451
+
452
+ .select2-container--bootstrap .select2-selection--single.input-lg .select2-selection__arrow b,
453
+ .input-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b,
454
+ .form-group-lg .select2-container--bootstrap .select2-selection--single .select2-selection__arrow b {
455
+ border-width: 5px 5px 0 5px;
456
+ margin-left: -5px;
457
+ margin-left: -10px;
458
+ margin-top: -2.5px;
459
+ }
460
+
461
+ .select2-container--bootstrap .select2-selection--multiple.input-lg,
462
+ .input-group-lg .select2-container--bootstrap .select2-selection--multiple,
463
+ .form-group-lg .select2-container--bootstrap .select2-selection--multiple {
464
+ min-height: 46px;
465
+ border-radius: 6px;
466
+ }
467
+
468
+ .select2-container--bootstrap .select2-selection--multiple.input-lg .select2-selection__choice,
469
+ .input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice,
470
+ .form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__choice {
471
+ font-size: 18px;
472
+ line-height: 1.3333333;
473
+ border-radius: 4px;
474
+ margin: 9px 0 0 8px;
475
+ padding: 0 10px;
476
+ }
477
+
478
+ .select2-container--bootstrap .select2-selection--multiple.input-lg .select2-search--inline .select2-search__field,
479
+ .input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field,
480
+ .form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field {
481
+ padding: 0 16px;
482
+ font-size: 18px;
483
+ height: 44px;
484
+ line-height: 1.3333333;
485
+ }
486
+
487
+ .select2-container--bootstrap .select2-selection--multiple.input-lg .select2-selection__clear,
488
+ .input-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear,
489
+ .form-group-lg .select2-container--bootstrap .select2-selection--multiple .select2-selection__clear {
490
+ margin-top: 10px;
491
+ }
492
+
493
+ .select2-container--bootstrap .select2-selection.input-lg.select2-container--open .select2-selection--single {
494
+ /**
495
+ * Make the dropdown arrow point up while the dropdown is visible.
496
+ */
497
+ }
498
+
499
+ .select2-container--bootstrap .select2-selection.input-lg.select2-container--open .select2-selection--single .select2-selection__arrow b {
500
+ border-color: transparent transparent #999 transparent;
501
+ border-width: 0 5px 5px 5px;
502
+ }
503
+
504
+ .input-group-lg .select2-container--bootstrap .select2-selection.select2-container--open .select2-selection--single {
505
+ /**
506
+ * Make the dropdown arrow point up while the dropdown is visible.
507
+ */
508
+ }
509
+
510
+ .input-group-lg .select2-container--bootstrap .select2-selection.select2-container--open .select2-selection--single .select2-selection__arrow b {
511
+ border-color: transparent transparent #999 transparent;
512
+ border-width: 0 5px 5px 5px;
513
+ }
514
+
515
+ .select2-container--bootstrap[dir="rtl"] {
516
+ /**
517
+ * Single Select2
518
+ *
519
+ * 1. Makes sure that .select2-selection__placeholder is positioned
520
+ * correctly.
521
+ */
522
+ /**
523
+ * Multiple Select2
524
+ */
525
+ }
526
+
527
+ .select2-container--bootstrap[dir="rtl"] .select2-selection--single {
528
+ padding-left: 24px;
529
+ padding-right: 12px;
530
+ }
531
+
532
+ .select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__rendered {
533
+ padding-right: 0;
534
+ padding-left: 0;
535
+ text-align: right;
536
+ /* 1 */
537
+ }
538
+
539
+ .select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__clear {
540
+ float: left;
541
+ }
542
+
543
+ .select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__arrow {
544
+ left: 12px;
545
+ right: auto;
546
+ }
547
+
548
+ .select2-container--bootstrap[dir="rtl"] .select2-selection--single .select2-selection__arrow b {
549
+ margin-left: 0;
550
+ }
551
+
552
+ .select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__choice,
553
+ .select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,
554
+ .select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-search--inline {
555
+ float: right;
556
+ }
557
+
558
+ .select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
559
+ margin-left: 0;
560
+ margin-right: 6px;
561
+ }
562
+
563
+ .select2-container--bootstrap[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
564
+ margin-left: 2px;
565
+ margin-right: auto;
566
+ }
567
+
568
+ /*------------------------------------* #ADDITIONAL GOODIES
569
+ \*------------------------------------*/
570
+ /**
571
+ * Address Bootstrap's validation states
572
+ *
573
+ * If a Select2 widget parent has one of Bootstrap's validation state modifier
574
+ * classes, adjust Select2's border colors and focus states accordingly.
575
+ * You may apply said classes to the Select2 dropdown (body > .select2-container)
576
+ * via JavaScript match Bootstraps' to make its styles match.
577
+ *
578
+ * @see http://getbootstrap.com/css/#forms-control-validation
579
+ */
580
+ .has-warning .select2-dropdown,
581
+ .has-warning .select2-selection {
582
+ border-color: #8a6d3b;
583
+ }
584
+
585
+ .has-warning .select2-container--focus .select2-selection,
586
+ .has-warning .select2-container--open .select2-selection {
587
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
588
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
589
+ border-color: #66512c;
590
+ }
591
+
592
+ .has-warning.select2-drop-active {
593
+ border-color: #66512c;
594
+ }
595
+
596
+ .has-warning.select2-drop-active.select2-drop.select2-drop-above {
597
+ border-top-color: #66512c;
598
+ }
599
+
600
+ .has-error .select2-dropdown,
601
+ .has-error .select2-selection {
602
+ border-color: #a94442;
603
+ }
604
+
605
+ .has-error .select2-container--focus .select2-selection,
606
+ .has-error .select2-container--open .select2-selection {
607
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
608
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
609
+ border-color: #843534;
610
+ }
611
+
612
+ .has-error.select2-drop-active {
613
+ border-color: #843534;
614
+ }
615
+
616
+ .has-error.select2-drop-active.select2-drop.select2-drop-above {
617
+ border-top-color: #843534;
618
+ }
619
+
620
+ .has-success .select2-dropdown,
621
+ .has-success .select2-selection {
622
+ border-color: #3c763d;
623
+ }
624
+
625
+ .has-success .select2-container--focus .select2-selection,
626
+ .has-success .select2-container--open .select2-selection {
627
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
628
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
629
+ border-color: #2b542c;
630
+ }
631
+
632
+ .has-success.select2-drop-active {
633
+ border-color: #2b542c;
634
+ }
635
+
636
+ .has-success.select2-drop-active.select2-drop.select2-drop-above {
637
+ border-top-color: #2b542c;
638
+ }
639
+
640
+ /**
641
+ * Select2 widgets in Bootstrap Input Groups
642
+ *
643
+ * @see http://getbootstrap.com/components/#input-groups
644
+ * @see https://github.com/twbs/bootstrap/blob/master/less/input-groups.less
645
+ */
646
+ /**
647
+ * Reset rounded corners
648
+ */
649
+ .input-group > .select2-hidden-accessible:first-child + .select2-container--bootstrap > .selection > .select2-selection,
650
+ .input-group > .select2-hidden-accessible:first-child + .select2-container--bootstrap > .selection > .select2-selection.form-control {
651
+ border-bottom-right-radius: 0;
652
+ border-top-right-radius: 0;
653
+ }
654
+
655
+ .input-group > .select2-hidden-accessible:not(:first-child) + .select2-container--bootstrap:not(:last-child) > .selection > .select2-selection,
656
+ .input-group > .select2-hidden-accessible:not(:first-child) + .select2-container--bootstrap:not(:last-child) > .selection > .select2-selection.form-control {
657
+ border-radius: 0;
658
+ }
659
+
660
+ .input-group > .select2-hidden-accessible:not(:first-child):not(:last-child) + .select2-container--bootstrap:last-child > .selection > .select2-selection,
661
+ .input-group > .select2-hidden-accessible:not(:first-child):not(:last-child) + .select2-container--bootstrap:last-child > .selection > .select2-selection.form-control {
662
+ border-bottom-left-radius: 0;
663
+ border-top-left-radius: 0;
664
+ }
665
+
666
+ .input-group > .select2-container--bootstrap {
667
+ display: table;
668
+ table-layout: fixed;
669
+ position: relative;
670
+ z-index: 2;
671
+ width: 100%;
672
+ margin-bottom: 0;
673
+ /**
674
+ * Adjust z-index like Bootstrap does to show the focus-box-shadow
675
+ * above appended buttons in .input-group and .form-group.
676
+ */
677
+ /**
678
+ * Adjust alignment of Bootstrap buttons in Bootstrap Input Groups to address
679
+ * Multi Select2's height which - depending on how many elements have been selected -
680
+ * may grow taller than its initial size.
681
+ *
682
+ * @see http://getbootstrap.com/components/#input-groups
683
+ */
684
+ }
685
+
686
+ .input-group > .select2-container--bootstrap > .selection > .select2-selection.form-control {
687
+ float: none;
688
+ }
689
+
690
+ .input-group > .select2-container--bootstrap.select2-container--open, .input-group > .select2-container--bootstrap.select2-container--focus {
691
+ z-index: 3;
692
+ }
693
+
694
+ .input-group > .select2-container--bootstrap,
695
+ .input-group > .select2-container--bootstrap .input-group-btn,
696
+ .input-group > .select2-container--bootstrap .input-group-btn .btn {
697
+ vertical-align: top;
698
+ }
699
+
700
+ /**
701
+ * Temporary fix for https://github.com/select2/select2-bootstrap-theme/issues/9
702
+ *
703
+ * Provides `!important` for certain properties of the class applied to the
704
+ * original `<select>` element to hide it.
705
+ *
706
+ * @see https://github.com/select2/select2/pull/3301
707
+ * @see https://github.com/fk/select2/commit/31830c7b32cb3d8e1b12d5b434dee40a6e753ada
708
+ */
709
+ .form-control.select2-hidden-accessible {
710
+ position: absolute !important;
711
+ width: 1px !important;
712
+ }
713
+
714
+ /**
715
+ * Display override for inline forms
716
+ */
717
+ @media (min-width: 768px) {
718
+ .form-inline .select2-container--bootstrap {
719
+ display: inline-block;
720
+ }
721
+ }