tramway 0.1.0 → 0.1.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 (180) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +889 -15
  4. data/Rakefile +8 -8
  5. data/app/assets/config/tramway_core_manifest.js +2 -0
  6. data/app/assets/images/tramway/mona_lisa_from_prado.jpg +0 -0
  7. data/app/assets/images/tramway/mona_lisa_from_prado_square.jpg +0 -0
  8. data/app/assets/javascripts/bootstrap-datepicker-1.8.0.js +2035 -0
  9. data/app/assets/javascripts/bootstrap-datepicker-1.8.0.ru.min.js +64 -0
  10. data/app/assets/javascripts/ckeditor/config.js +30 -0
  11. data/app/assets/javascripts/ckeditor/plugins/image/dialogs/image.js +1259 -0
  12. data/app/assets/javascripts/ckeditor/plugins/image/icons/hidpi/image.png +0 -0
  13. data/app/assets/javascripts/ckeditor/plugins/image/icons/image.png +0 -0
  14. data/app/assets/javascripts/ckeditor/plugins/image/images/noimage.png +0 -0
  15. data/app/assets/javascripts/ckeditor/plugins/image/lang/en.js +25 -0
  16. data/app/assets/javascripts/ckeditor/plugins/image/lang/ru.js +25 -0
  17. data/app/assets/javascripts/ckeditor/plugins/image/plugin.js +184 -0
  18. data/app/assets/javascripts/ckeditor/plugins/youtube/images/icon-hdpi.png +0 -0
  19. data/app/assets/javascripts/ckeditor/plugins/youtube/images/icon.png +0 -0
  20. data/app/assets/javascripts/ckeditor/plugins/youtube/lang/en.js +25 -0
  21. data/app/assets/javascripts/ckeditor/plugins/youtube/lang/ru.js +25 -0
  22. data/app/assets/javascripts/ckeditor/plugins/youtube/plugin.js +449 -0
  23. data/app/assets/javascripts/tramway/application.js +60 -0
  24. data/app/assets/stylesheets/tramway/application.sass +60 -0
  25. data/app/assets/stylesheets/tramway/bootstrap-datepicker-1.8.0.css +477 -0
  26. data/app/controllers/concerns/auth_management.rb +26 -0
  27. data/app/controllers/concerns/filtering.rb +43 -0
  28. data/app/controllers/tramway/application_controller.rb +142 -0
  29. data/app/controllers/tramway/export/application_controller.rb +5 -0
  30. data/app/controllers/tramway/has_and_belongs_to_many_records_controller.rb +26 -0
  31. data/app/controllers/tramway/records_controller.rb +86 -0
  32. data/app/controllers/tramway/sessions_controller.rb +49 -0
  33. data/app/controllers/tramway/singletons_controller.rb +48 -0
  34. data/app/controllers/tramway/welcome_controller.rb +17 -0
  35. data/app/decorators/tramway/application_decorated_collection.rb +15 -0
  36. data/app/decorators/tramway/application_decorator.rb +124 -0
  37. data/app/decorators/tramway/associations/class_helper.rb +45 -0
  38. data/app/decorators/tramway/associations/object_helper.rb +58 -0
  39. data/app/decorators/tramway/attributes/view_helper.rb +30 -0
  40. data/app/decorators/tramway/concerns/attributes_decorator_helper.rb +97 -0
  41. data/app/decorators/tramway/concerns/table_builder.rb +33 -0
  42. data/app/decorators/tramway/default/values_helper.rb +23 -0
  43. data/app/decorators/tramway/delegating/class_helper.rb +9 -0
  44. data/app/decorators/tramway/user_decorator.rb +49 -0
  45. data/app/forms/admin/tramway/user_form.rb +24 -0
  46. data/app/forms/tramway/application_form.rb +124 -0
  47. data/app/forms/tramway/application_forms/association_class_helpers.rb +7 -0
  48. data/app/forms/tramway/application_forms/association_object_helpers.rb +36 -0
  49. data/app/forms/tramway/application_forms/constant_class_actions.rb +7 -0
  50. data/app/forms/tramway/application_forms/constant_object_actions.rb +20 -0
  51. data/app/forms/tramway/application_forms/frontend.rb +12 -0
  52. data/app/forms/tramway/application_forms/object_helpers.rb +15 -0
  53. data/app/forms/tramway/application_forms/properties_object_helper.rb +16 -0
  54. data/app/forms/tramway/application_forms/submit_helper.rb +26 -0
  55. data/app/forms/tramway/extendable_form.rb +15 -0
  56. data/app/forms/tramway/extendable_forms_helpers/class_builder.rb +34 -0
  57. data/app/forms/tramway/extendable_forms_helpers/ignored_properties_helper.rb +11 -0
  58. data/app/forms/tramway/extendable_forms_helpers/more_properties_helper.rb +31 -0
  59. data/app/forms/tramway/extendable_forms_helpers/properties_helper.rb +16 -0
  60. data/app/forms/tramway/extendable_forms_helpers/submit/class_helpers.rb +18 -0
  61. data/app/forms/tramway/extendable_forms_helpers/submit/object_helpers.rb +21 -0
  62. data/app/forms/tramway/extendable_forms_helpers/validators.rb +40 -0
  63. data/app/forms/tramway/extended_application_form.rb +23 -0
  64. data/app/forms/tramway/form_creator.rb +7 -0
  65. data/app/forms/tramway/session_form.rb +26 -0
  66. data/app/helpers/tramway/actions_helper.rb +45 -0
  67. data/app/helpers/tramway/additional_buttons_builder.rb +12 -0
  68. data/app/helpers/tramway/application_helper.rb +27 -0
  69. data/app/helpers/tramway/cases_helper.rb +13 -0
  70. data/app/helpers/tramway/copy_to_clipboard_helper.rb +11 -0
  71. data/app/helpers/tramway/focus_generator_helper.rb +10 -0
  72. data/app/helpers/tramway/frontend_helper.rb +26 -0
  73. data/app/helpers/tramway/inputs/associations_helper.rb +30 -0
  74. data/app/helpers/tramway/inputs/polymorphic_associations_helper.rb +24 -0
  75. data/app/helpers/tramway/inputs_helper.rb +96 -0
  76. data/app/helpers/tramway/model_helper.rb +7 -0
  77. data/app/helpers/tramway/navbar_helper.rb +11 -0
  78. data/app/helpers/tramway/records_helper.rb +120 -0
  79. data/app/helpers/tramway/russian_cases_helper.rb +26 -0
  80. data/app/helpers/tramway/singleton_helper.rb +12 -0
  81. data/app/helpers/tramway/state_machine_buttons_helper.rb +61 -0
  82. data/app/helpers/tramway/title_helper.rb +25 -0
  83. data/app/inputs/date_picker_input.rb +4 -0
  84. data/app/inputs/multiple_file_input.rb +7 -0
  85. data/app/models/tramway/application_record.rb +60 -0
  86. data/app/models/tramway/user.rb +23 -0
  87. data/app/uploaders/application_uploader.rb +22 -0
  88. data/app/uploaders/file_uploader.rb +4 -0
  89. data/app/uploaders/ico_uploader.rb +7 -0
  90. data/app/uploaders/image_defaults.rb +14 -0
  91. data/app/uploaders/photo_uploader.rb +54 -0
  92. data/app/views/layouts/tramway/application.html.haml +32 -0
  93. data/app/views/layouts/tramway/shared/_navbar.html.haml +46 -0
  94. data/app/views/tramway/404.haml +1 -0
  95. data/app/views/tramway/records/_form.html.haml +22 -0
  96. data/app/views/tramway/records/_list.html.haml +38 -0
  97. data/app/views/tramway/records/_search.html.haml +34 -0
  98. data/app/views/tramway/records/edit.html.haml +1 -0
  99. data/app/views/tramway/records/index.html.haml +31 -0
  100. data/app/views/tramway/records/new.html.haml +1 -0
  101. data/app/views/tramway/records/show.html.haml +1 -0
  102. data/app/views/tramway/sessions/new.html.haml +9 -0
  103. data/app/views/tramway/shared/_input.html.haml +34 -0
  104. data/app/views/tramway/shared/_input_extended.html.haml +14 -0
  105. data/app/views/tramway/shared/_messages.html.haml +10 -0
  106. data/app/views/tramway/shared/_show.html.haml +35 -0
  107. data/app/views/tramway/shared/errors/server_error.html.haml +12 -0
  108. data/app/views/tramway/shared/input_extended_types/_checkbox.html.haml +1 -0
  109. data/app/views/tramway/shared/input_extended_types/_select.html.haml +16 -0
  110. data/app/views/tramway/shared/input_extended_types/_simple.html.haml +4 -0
  111. data/app/views/tramway/shared/input_extended_types/_yes_no.html.haml +4 -0
  112. data/app/views/tramway/shared/show/_attribute_tr.html.haml +9 -0
  113. data/app/views/tramway/shared/show/associations/_habtm_row.html.haml +14 -0
  114. data/app/views/tramway/shared/show/associations/_list.html.haml +21 -0
  115. data/app/views/tramway/shared/show/associations/_row.html.haml +19 -0
  116. data/app/views/tramway/shared/show/associations/_table_row.html.haml +21 -0
  117. data/app/views/tramway/singletons/_form.html.haml +15 -0
  118. data/app/views/tramway/singletons/edit.html.haml +1 -0
  119. data/app/views/tramway/singletons/new.html.haml +1 -0
  120. data/app/views/tramway/singletons/show.html.haml +1 -0
  121. data/app/views/tramway/welcome/index.html.haml +4 -0
  122. data/config/initializers/assets.rb +7 -0
  123. data/config/initializers/carrierwave.rb +5 -0
  124. data/config/initializers/ckeditor.rb +9 -0
  125. data/config/initializers/plurals.rb +25 -0
  126. data/config/locales/en/collections.yml +4 -0
  127. data/config/locales/en/date.yml +16 -0
  128. data/config/locales/en/dates.yml +10 -0
  129. data/config/locales/en/helpers.yml +26 -0
  130. data/config/locales/en/locale.yml +11 -0
  131. data/config/locales/en/messages.yml +7 -0
  132. data/config/locales/en/models.yml +9 -0
  133. data/config/locales/en/simple_form_extension.yml +8 -0
  134. data/config/locales/en/state_machines.yml +8 -0
  135. data/config/locales/ru/collections.yml +4 -0
  136. data/config/locales/ru/date.yml +16 -0
  137. data/config/locales/ru/dates.yml +10 -0
  138. data/config/locales/ru/helpers.yml +30 -0
  139. data/config/locales/ru/locale.yml +6 -0
  140. data/config/locales/ru/messages.yml +7 -0
  141. data/config/locales/ru/models.yml +21 -0
  142. data/config/locales/ru/simple_form_extension.yml +8 -0
  143. data/config/locales/ru/state_machines.yml +8 -0
  144. data/config/routes.rb +13 -0
  145. data/lib/string.rb +18 -0
  146. data/lib/tramway/application.rb +10 -0
  147. data/lib/tramway/class_name_helpers.rb +15 -0
  148. data/lib/tramway/collection.rb +9 -0
  149. data/lib/tramway/collections/helper.rb +21 -0
  150. data/lib/tramway/collections.rb +4 -0
  151. data/lib/tramway/engine.rb +14 -0
  152. data/lib/tramway/error.rb +32 -0
  153. data/lib/tramway/forms.rb +5 -0
  154. data/lib/tramway/generators/install_generator.rb +49 -0
  155. data/lib/tramway/generators/model_generator.rb +105 -0
  156. data/lib/tramway/generators/templates/create_tramway_users.rb +18 -0
  157. data/lib/tramway/generators/templates/decorator.rb.erb +56 -0
  158. data/lib/tramway/generators/templates/form.rb.erb +22 -0
  159. data/lib/tramway/generators/templates/initializers/simple_form.rb +23 -0
  160. data/lib/tramway/generators/templates/initializers/simple_form_bootstrap.rb +133 -0
  161. data/lib/tramway/generators.rb +4 -0
  162. data/lib/tramway/navbar.rb +44 -0
  163. data/lib/tramway/notifications.rb +12 -0
  164. data/lib/tramway/record_routes_helper.rb +23 -0
  165. data/lib/tramway/records_models.rb +52 -0
  166. data/lib/tramway/singleton_models.rb +32 -0
  167. data/lib/tramway/spec/helpers/navbar_helper.rb +7 -0
  168. data/lib/tramway/spec/helpers/tramway_helpers.rb +47 -0
  169. data/lib/tramway/version.rb +3 -1
  170. data/lib/tramway/welcome_page_actions.rb +5 -0
  171. data/lib/tramway/yaml/errors.yml +49 -0
  172. data/lib/tramway.rb +143 -2
  173. data/lib/validators/presence_validator.rb +9 -0
  174. metadata +582 -25
  175. data/.gitignore +0 -9
  176. data/.travis.yml +0 -5
  177. data/Gemfile +0 -6
  178. data/bin/console +0 -14
  179. data/bin/setup +0 -8
  180. data/tramway.gemspec +0 -26
@@ -0,0 +1,477 @@
1
+ /*!
2
+ * Datepicker for Bootstrap v1.8.0 (https://github.com/uxsolutions/bootstrap-datepicker)
3
+ *
4
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
5
+ */
6
+
7
+ .datepicker {
8
+ padding: 4px;
9
+ -webkit-border-radius: 4px;
10
+ -moz-border-radius: 4px;
11
+ border-radius: 4px;
12
+ direction: ltr;
13
+ }
14
+ .datepicker-inline {
15
+ width: 220px;
16
+ }
17
+ .datepicker-rtl {
18
+ direction: rtl;
19
+ }
20
+ .datepicker-rtl.dropdown-menu {
21
+ left: auto;
22
+ }
23
+ .datepicker-rtl table tr td span {
24
+ float: right;
25
+ }
26
+ .datepicker-dropdown {
27
+ top: 0;
28
+ left: 0;
29
+ }
30
+ .datepicker-dropdown:before {
31
+ content: '';
32
+ display: inline-block;
33
+ border-left: 7px solid transparent;
34
+ border-right: 7px solid transparent;
35
+ border-bottom: 7px solid #999;
36
+ border-top: 0;
37
+ border-bottom-color: rgba(0, 0, 0, 0.2);
38
+ position: absolute;
39
+ }
40
+ .datepicker-dropdown:after {
41
+ content: '';
42
+ display: inline-block;
43
+ border-left: 6px solid transparent;
44
+ border-right: 6px solid transparent;
45
+ border-bottom: 6px solid #fff;
46
+ border-top: 0;
47
+ position: absolute;
48
+ }
49
+ .datepicker-dropdown.datepicker-orient-left:before {
50
+ left: 6px;
51
+ }
52
+ .datepicker-dropdown.datepicker-orient-left:after {
53
+ left: 7px;
54
+ }
55
+ .datepicker-dropdown.datepicker-orient-right:before {
56
+ right: 6px;
57
+ }
58
+ .datepicker-dropdown.datepicker-orient-right:after {
59
+ right: 7px;
60
+ }
61
+ .datepicker-dropdown.datepicker-orient-bottom:before {
62
+ top: -7px;
63
+ }
64
+ .datepicker-dropdown.datepicker-orient-bottom:after {
65
+ top: -6px;
66
+ }
67
+ .datepicker-dropdown.datepicker-orient-top:before {
68
+ bottom: -7px;
69
+ border-bottom: 0;
70
+ border-top: 7px solid #999;
71
+ }
72
+ .datepicker-dropdown.datepicker-orient-top:after {
73
+ bottom: -6px;
74
+ border-bottom: 0;
75
+ border-top: 6px solid #fff;
76
+ }
77
+ .datepicker table {
78
+ margin: 0;
79
+ -webkit-touch-callout: none;
80
+ -webkit-user-select: none;
81
+ -khtml-user-select: none;
82
+ -moz-user-select: none;
83
+ -ms-user-select: none;
84
+ user-select: none;
85
+ }
86
+ .datepicker td,
87
+ .datepicker th {
88
+ text-align: center;
89
+ width: 20px;
90
+ height: 20px;
91
+ -webkit-border-radius: 4px;
92
+ -moz-border-radius: 4px;
93
+ border-radius: 4px;
94
+ border: none;
95
+ }
96
+ .table-striped .datepicker table tr td,
97
+ .table-striped .datepicker table tr th {
98
+ background-color: transparent;
99
+ }
100
+ .datepicker table tr td.day:hover,
101
+ .datepicker table tr td.day.focused {
102
+ background: #eee;
103
+ cursor: pointer;
104
+ }
105
+ .datepicker table tr td.old,
106
+ .datepicker table tr td.new {
107
+ color: #999;
108
+ }
109
+ .datepicker table tr td.disabled,
110
+ .datepicker table tr td.disabled:hover {
111
+ background: none;
112
+ color: #999;
113
+ cursor: default;
114
+ }
115
+ .datepicker table tr td.highlighted {
116
+ background: #d9edf7;
117
+ border-radius: 0;
118
+ }
119
+ .datepicker table tr td.today,
120
+ .datepicker table tr td.today:hover,
121
+ .datepicker table tr td.today.disabled,
122
+ .datepicker table tr td.today.disabled:hover {
123
+ background-color: #fde19a;
124
+ background-image: -moz-linear-gradient(to bottom, #fdd49a, #fdf59a);
125
+ background-image: -ms-linear-gradient(to bottom, #fdd49a, #fdf59a);
126
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
127
+ background-image: -webkit-linear-gradient(to bottom, #fdd49a, #fdf59a);
128
+ background-image: -o-linear-gradient(to bottom, #fdd49a, #fdf59a);
129
+ background-image: linear-gradient(to bottom, #fdd49a, #fdf59a);
130
+ background-repeat: repeat-x;
131
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
132
+ border-color: #fdf59a #fdf59a #fbed50;
133
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
134
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
135
+ color: #000;
136
+ }
137
+ .datepicker table tr td.today:hover,
138
+ .datepicker table tr td.today:hover:hover,
139
+ .datepicker table tr td.today.disabled:hover,
140
+ .datepicker table tr td.today.disabled:hover:hover,
141
+ .datepicker table tr td.today:active,
142
+ .datepicker table tr td.today:hover:active,
143
+ .datepicker table tr td.today.disabled:active,
144
+ .datepicker table tr td.today.disabled:hover:active,
145
+ .datepicker table tr td.today.active,
146
+ .datepicker table tr td.today:hover.active,
147
+ .datepicker table tr td.today.disabled.active,
148
+ .datepicker table tr td.today.disabled:hover.active,
149
+ .datepicker table tr td.today.disabled,
150
+ .datepicker table tr td.today:hover.disabled,
151
+ .datepicker table tr td.today.disabled.disabled,
152
+ .datepicker table tr td.today.disabled:hover.disabled,
153
+ .datepicker table tr td.today[disabled],
154
+ .datepicker table tr td.today:hover[disabled],
155
+ .datepicker table tr td.today.disabled[disabled],
156
+ .datepicker table tr td.today.disabled:hover[disabled] {
157
+ background-color: #fdf59a;
158
+ }
159
+ .datepicker table tr td.today:active,
160
+ .datepicker table tr td.today:hover:active,
161
+ .datepicker table tr td.today.disabled:active,
162
+ .datepicker table tr td.today.disabled:hover:active,
163
+ .datepicker table tr td.today.active,
164
+ .datepicker table tr td.today:hover.active,
165
+ .datepicker table tr td.today.disabled.active,
166
+ .datepicker table tr td.today.disabled:hover.active {
167
+ background-color: #fbf069 \9;
168
+ }
169
+ .datepicker table tr td.today:hover:hover {
170
+ color: #000;
171
+ }
172
+ .datepicker table tr td.today.active:hover {
173
+ color: #fff;
174
+ }
175
+ .datepicker table tr td.range,
176
+ .datepicker table tr td.range:hover,
177
+ .datepicker table tr td.range.disabled,
178
+ .datepicker table tr td.range.disabled:hover {
179
+ background: #eee;
180
+ -webkit-border-radius: 0;
181
+ -moz-border-radius: 0;
182
+ border-radius: 0;
183
+ }
184
+ .datepicker table tr td.range.today,
185
+ .datepicker table tr td.range.today:hover,
186
+ .datepicker table tr td.range.today.disabled,
187
+ .datepicker table tr td.range.today.disabled:hover {
188
+ background-color: #f3d17a;
189
+ background-image: -moz-linear-gradient(to bottom, #f3c17a, #f3e97a);
190
+ background-image: -ms-linear-gradient(to bottom, #f3c17a, #f3e97a);
191
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));
192
+ background-image: -webkit-linear-gradient(to bottom, #f3c17a, #f3e97a);
193
+ background-image: -o-linear-gradient(to bottom, #f3c17a, #f3e97a);
194
+ background-image: linear-gradient(to bottom, #f3c17a, #f3e97a);
195
+ background-repeat: repeat-x;
196
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);
197
+ border-color: #f3e97a #f3e97a #edde34;
198
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
199
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
200
+ -webkit-border-radius: 0;
201
+ -moz-border-radius: 0;
202
+ border-radius: 0;
203
+ }
204
+ .datepicker table tr td.range.today:hover,
205
+ .datepicker table tr td.range.today:hover:hover,
206
+ .datepicker table tr td.range.today.disabled:hover,
207
+ .datepicker table tr td.range.today.disabled:hover:hover,
208
+ .datepicker table tr td.range.today:active,
209
+ .datepicker table tr td.range.today:hover:active,
210
+ .datepicker table tr td.range.today.disabled:active,
211
+ .datepicker table tr td.range.today.disabled:hover:active,
212
+ .datepicker table tr td.range.today.active,
213
+ .datepicker table tr td.range.today:hover.active,
214
+ .datepicker table tr td.range.today.disabled.active,
215
+ .datepicker table tr td.range.today.disabled:hover.active,
216
+ .datepicker table tr td.range.today.disabled,
217
+ .datepicker table tr td.range.today:hover.disabled,
218
+ .datepicker table tr td.range.today.disabled.disabled,
219
+ .datepicker table tr td.range.today.disabled:hover.disabled,
220
+ .datepicker table tr td.range.today[disabled],
221
+ .datepicker table tr td.range.today:hover[disabled],
222
+ .datepicker table tr td.range.today.disabled[disabled],
223
+ .datepicker table tr td.range.today.disabled:hover[disabled] {
224
+ background-color: #f3e97a;
225
+ }
226
+ .datepicker table tr td.range.today:active,
227
+ .datepicker table tr td.range.today:hover:active,
228
+ .datepicker table tr td.range.today.disabled:active,
229
+ .datepicker table tr td.range.today.disabled:hover:active,
230
+ .datepicker table tr td.range.today.active,
231
+ .datepicker table tr td.range.today:hover.active,
232
+ .datepicker table tr td.range.today.disabled.active,
233
+ .datepicker table tr td.range.today.disabled:hover.active {
234
+ background-color: #efe24b \9;
235
+ }
236
+ .datepicker table tr td.selected,
237
+ .datepicker table tr td.selected:hover,
238
+ .datepicker table tr td.selected.disabled,
239
+ .datepicker table tr td.selected.disabled:hover {
240
+ background-color: #9e9e9e;
241
+ background-image: -moz-linear-gradient(to bottom, #b3b3b3, #808080);
242
+ background-image: -ms-linear-gradient(to bottom, #b3b3b3, #808080);
243
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));
244
+ background-image: -webkit-linear-gradient(to bottom, #b3b3b3, #808080);
245
+ background-image: -o-linear-gradient(to bottom, #b3b3b3, #808080);
246
+ background-image: linear-gradient(to bottom, #b3b3b3, #808080);
247
+ background-repeat: repeat-x;
248
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);
249
+ border-color: #808080 #808080 #595959;
250
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
251
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
252
+ color: #fff;
253
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
254
+ }
255
+ .datepicker table tr td.selected:hover,
256
+ .datepicker table tr td.selected:hover:hover,
257
+ .datepicker table tr td.selected.disabled:hover,
258
+ .datepicker table tr td.selected.disabled:hover:hover,
259
+ .datepicker table tr td.selected:active,
260
+ .datepicker table tr td.selected:hover:active,
261
+ .datepicker table tr td.selected.disabled:active,
262
+ .datepicker table tr td.selected.disabled:hover:active,
263
+ .datepicker table tr td.selected.active,
264
+ .datepicker table tr td.selected:hover.active,
265
+ .datepicker table tr td.selected.disabled.active,
266
+ .datepicker table tr td.selected.disabled:hover.active,
267
+ .datepicker table tr td.selected.disabled,
268
+ .datepicker table tr td.selected:hover.disabled,
269
+ .datepicker table tr td.selected.disabled.disabled,
270
+ .datepicker table tr td.selected.disabled:hover.disabled,
271
+ .datepicker table tr td.selected[disabled],
272
+ .datepicker table tr td.selected:hover[disabled],
273
+ .datepicker table tr td.selected.disabled[disabled],
274
+ .datepicker table tr td.selected.disabled:hover[disabled] {
275
+ background-color: #808080;
276
+ }
277
+ .datepicker table tr td.selected:active,
278
+ .datepicker table tr td.selected:hover:active,
279
+ .datepicker table tr td.selected.disabled:active,
280
+ .datepicker table tr td.selected.disabled:hover:active,
281
+ .datepicker table tr td.selected.active,
282
+ .datepicker table tr td.selected:hover.active,
283
+ .datepicker table tr td.selected.disabled.active,
284
+ .datepicker table tr td.selected.disabled:hover.active {
285
+ background-color: #666666 \9;
286
+ }
287
+ .datepicker table tr td.active,
288
+ .datepicker table tr td.active:hover,
289
+ .datepicker table tr td.active.disabled,
290
+ .datepicker table tr td.active.disabled:hover {
291
+ background-color: #006dcc;
292
+ background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);
293
+ background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);
294
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));
295
+ background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);
296
+ background-image: -o-linear-gradient(to bottom, #08c, #0044cc);
297
+ background-image: linear-gradient(to bottom, #08c, #0044cc);
298
+ background-repeat: repeat-x;
299
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);
300
+ border-color: #0044cc #0044cc #002a80;
301
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
302
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
303
+ color: #fff;
304
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
305
+ }
306
+ .datepicker table tr td.active:hover,
307
+ .datepicker table tr td.active:hover:hover,
308
+ .datepicker table tr td.active.disabled:hover,
309
+ .datepicker table tr td.active.disabled:hover:hover,
310
+ .datepicker table tr td.active:active,
311
+ .datepicker table tr td.active:hover:active,
312
+ .datepicker table tr td.active.disabled:active,
313
+ .datepicker table tr td.active.disabled:hover:active,
314
+ .datepicker table tr td.active.active,
315
+ .datepicker table tr td.active:hover.active,
316
+ .datepicker table tr td.active.disabled.active,
317
+ .datepicker table tr td.active.disabled:hover.active,
318
+ .datepicker table tr td.active.disabled,
319
+ .datepicker table tr td.active:hover.disabled,
320
+ .datepicker table tr td.active.disabled.disabled,
321
+ .datepicker table tr td.active.disabled:hover.disabled,
322
+ .datepicker table tr td.active[disabled],
323
+ .datepicker table tr td.active:hover[disabled],
324
+ .datepicker table tr td.active.disabled[disabled],
325
+ .datepicker table tr td.active.disabled:hover[disabled] {
326
+ background-color: #0044cc;
327
+ }
328
+ .datepicker table tr td.active:active,
329
+ .datepicker table tr td.active:hover:active,
330
+ .datepicker table tr td.active.disabled:active,
331
+ .datepicker table tr td.active.disabled:hover:active,
332
+ .datepicker table tr td.active.active,
333
+ .datepicker table tr td.active:hover.active,
334
+ .datepicker table tr td.active.disabled.active,
335
+ .datepicker table tr td.active.disabled:hover.active {
336
+ background-color: #003399 \9;
337
+ }
338
+ .datepicker table tr td span {
339
+ display: block;
340
+ width: 23%;
341
+ height: 54px;
342
+ line-height: 54px;
343
+ float: left;
344
+ margin: 1%;
345
+ cursor: pointer;
346
+ -webkit-border-radius: 4px;
347
+ -moz-border-radius: 4px;
348
+ border-radius: 4px;
349
+ }
350
+ .datepicker table tr td span:hover,
351
+ .datepicker table tr td span.focused {
352
+ background: #eee;
353
+ }
354
+ .datepicker table tr td span.disabled,
355
+ .datepicker table tr td span.disabled:hover {
356
+ background: none;
357
+ color: #999;
358
+ cursor: default;
359
+ }
360
+ .datepicker table tr td span.active,
361
+ .datepicker table tr td span.active:hover,
362
+ .datepicker table tr td span.active.disabled,
363
+ .datepicker table tr td span.active.disabled:hover {
364
+ background-color: #006dcc;
365
+ background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);
366
+ background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);
367
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));
368
+ background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);
369
+ background-image: -o-linear-gradient(to bottom, #08c, #0044cc);
370
+ background-image: linear-gradient(to bottom, #08c, #0044cc);
371
+ background-repeat: repeat-x;
372
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);
373
+ border-color: #0044cc #0044cc #002a80;
374
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
375
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
376
+ color: #fff;
377
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
378
+ }
379
+ .datepicker table tr td span.active:hover,
380
+ .datepicker table tr td span.active:hover:hover,
381
+ .datepicker table tr td span.active.disabled:hover,
382
+ .datepicker table tr td span.active.disabled:hover:hover,
383
+ .datepicker table tr td span.active:active,
384
+ .datepicker table tr td span.active:hover:active,
385
+ .datepicker table tr td span.active.disabled:active,
386
+ .datepicker table tr td span.active.disabled:hover:active,
387
+ .datepicker table tr td span.active.active,
388
+ .datepicker table tr td span.active:hover.active,
389
+ .datepicker table tr td span.active.disabled.active,
390
+ .datepicker table tr td span.active.disabled:hover.active,
391
+ .datepicker table tr td span.active.disabled,
392
+ .datepicker table tr td span.active:hover.disabled,
393
+ .datepicker table tr td span.active.disabled.disabled,
394
+ .datepicker table tr td span.active.disabled:hover.disabled,
395
+ .datepicker table tr td span.active[disabled],
396
+ .datepicker table tr td span.active:hover[disabled],
397
+ .datepicker table tr td span.active.disabled[disabled],
398
+ .datepicker table tr td span.active.disabled:hover[disabled] {
399
+ background-color: #0044cc;
400
+ }
401
+ .datepicker table tr td span.active:active,
402
+ .datepicker table tr td span.active:hover:active,
403
+ .datepicker table tr td span.active.disabled:active,
404
+ .datepicker table tr td span.active.disabled:hover:active,
405
+ .datepicker table tr td span.active.active,
406
+ .datepicker table tr td span.active:hover.active,
407
+ .datepicker table tr td span.active.disabled.active,
408
+ .datepicker table tr td span.active.disabled:hover.active {
409
+ background-color: #003399 \9;
410
+ }
411
+ .datepicker table tr td span.old,
412
+ .datepicker table tr td span.new {
413
+ color: #999;
414
+ }
415
+ .datepicker .datepicker-switch {
416
+ width: 145px;
417
+ }
418
+ .datepicker .datepicker-switch,
419
+ .datepicker .prev,
420
+ .datepicker .next,
421
+ .datepicker tfoot tr th {
422
+ cursor: pointer;
423
+ }
424
+ .datepicker .datepicker-switch:hover,
425
+ .datepicker .prev:hover,
426
+ .datepicker .next:hover,
427
+ .datepicker tfoot tr th:hover {
428
+ background: #eee;
429
+ }
430
+ .datepicker .prev.disabled,
431
+ .datepicker .next.disabled {
432
+ visibility: hidden;
433
+ }
434
+ .datepicker .cw {
435
+ font-size: 10px;
436
+ width: 12px;
437
+ padding: 0 2px 0 5px;
438
+ vertical-align: middle;
439
+ }
440
+ .input-append.date .add-on,
441
+ .input-prepend.date .add-on {
442
+ cursor: pointer;
443
+ }
444
+ .input-append.date .add-on i,
445
+ .input-prepend.date .add-on i {
446
+ margin-top: 3px;
447
+ }
448
+ .input-daterange input {
449
+ text-align: center;
450
+ }
451
+ .input-daterange input:first-child {
452
+ -webkit-border-radius: 3px 0 0 3px;
453
+ -moz-border-radius: 3px 0 0 3px;
454
+ border-radius: 3px 0 0 3px;
455
+ }
456
+ .input-daterange input:last-child {
457
+ -webkit-border-radius: 0 3px 3px 0;
458
+ -moz-border-radius: 0 3px 3px 0;
459
+ border-radius: 0 3px 3px 0;
460
+ }
461
+ .input-daterange .add-on {
462
+ display: inline-block;
463
+ width: auto;
464
+ min-width: 16px;
465
+ height: 18px;
466
+ padding: 4px 5px;
467
+ font-weight: normal;
468
+ line-height: 18px;
469
+ text-align: center;
470
+ text-shadow: 0 1px 0 #fff;
471
+ vertical-align: middle;
472
+ background-color: #eee;
473
+ border: 1px solid #ccc;
474
+ margin-left: -5px;
475
+ margin-right: -5px;
476
+ }
477
+ /*# sourceMappingURL=bootstrap-datepicker.css.map */
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tramway::AuthManagement
4
+ def sign_in(user)
5
+ session[:tramway_user_id] = user.id
6
+ end
7
+
8
+ def sign_out
9
+ session[:tramway_user_id] = nil
10
+ end
11
+
12
+ def signed_in?
13
+ current_user
14
+ end
15
+
16
+ def authenticate_user!
17
+ redirect_to Tramway::Engine.routes.url_helpers.new_session_path if !session_path? && !signed_in?
18
+ end
19
+
20
+ def current_user
21
+ user = Tramway::User.find_by id: session[:tramway_user_id]
22
+ return false unless user
23
+
24
+ Tramway::UserDecorator.decorate user
25
+ end
26
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tramway::Filtering
4
+ def list_filtering(records)
5
+ params[:list_filters]&.each do |filter, _value|
6
+ case decorator_class.list_filters[filter.to_sym][:type]
7
+ when :select
8
+ records = list_filtering_select records, filter
9
+ when :dates
10
+ records = list_filtering_dates records, filter
11
+ end
12
+ end
13
+
14
+ records
15
+ end
16
+
17
+ def list_filtering_select(records, filter)
18
+ value.present? ? decorator_class.list_filters[filter.to_sym][:query].call(records, value) : records
19
+ end
20
+
21
+ def list_filtering_dates(records, filter)
22
+ begin_date = date_filter :begin, filter
23
+ end_date = date_filter :end, filter
24
+ if begin_date.present? && end_date.present? && value.present?
25
+ decorator_class.list_filters[filter.to_sym][:query].call(records, begin_date, end_date)
26
+ else
27
+ records
28
+ end
29
+ end
30
+
31
+ def date_filter(type, filter)
32
+ params[:list_filters][filter.to_sym]["#{type}_date".to_sym]
33
+ end
34
+
35
+ def filtering(records)
36
+ if params[:filter].present?
37
+ params[:filter] = JSON.parse params[:filter] if params[:filter].is_a? String
38
+ records.ransack(params[:filter]).result(distinct: true)
39
+ else
40
+ records
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ # FIXME: use default `require` method
4
+ load "#{Tramway.root}/lib/tramway/class_name_helpers.rb"
5
+ load "#{Tramway.root}/lib/tramway/record_routes_helper.rb"
6
+
7
+ # FIXME: configurate load_path
8
+ load "#{Tramway.root}/app/controllers/concerns/auth_management.rb"
9
+ load "#{Tramway.root}/app/controllers/concerns/filtering.rb"
10
+
11
+ class Tramway::ApplicationController < ActionController::Base
12
+ include Tramway::ClassNameHelpers
13
+ include Tramway::AuthManagement
14
+ include Tramway::Filtering
15
+ include Tramway::RecordRoutesHelper
16
+
17
+ before_action :application
18
+ before_action :load_extensions
19
+ before_action :notifications
20
+ before_action :notifications_count
21
+ before_action :collections_counts, if: :model_given?
22
+ before_action :authenticate_user!
23
+ before_action :check_available!
24
+ before_action :check_available_scope!, if: :model_given?, only: :index
25
+
26
+ protect_from_forgery with: :exception
27
+
28
+ protected
29
+
30
+ def check_available!
31
+ return if session_path?
32
+
33
+ return unless !model_given? && !form_given?
34
+
35
+ Tramway::Error.raise_error :tramway, :application_controller, :model_or_form_not_available
36
+ end
37
+
38
+ def check_available_scope!
39
+ raise 'Scope is not available' if params[:scope].present? && !available_scope_given?
40
+ end
41
+
42
+ def collections_counts
43
+ @counts = decorator_class.collections.reduce({}) do |hash, collection|
44
+ records = model_class.public_send(collection)
45
+ records = filtering records
46
+ records = list_filtering records
47
+
48
+ hash.merge! collection => records.public_send(current_user_role_scope, current_user.id).count
49
+ end
50
+ end
51
+
52
+ def notifications
53
+ if current_user
54
+ @notifications ||= Tramway.notificable_queries&.reduce({}) do |hash, notification|
55
+ hash.merge! notification[0] => notification[1].call(current_user)
56
+ end
57
+ end
58
+ @notifications
59
+ end
60
+
61
+ def notifications_count
62
+ @notifications_count = notifications&.reduce(0) do |count, notification|
63
+ count += notification[1].count # rubocop:disable Lint/UselessAssignment
64
+ end
65
+ end
66
+
67
+ include Tramway::ClassNameHelpers
68
+
69
+ def model_class
70
+ model_class_name(params[:model] || params[:form])
71
+ end
72
+
73
+ def decorator_class
74
+ decorator_class_name
75
+ end
76
+
77
+ def admin_form_class
78
+ class_name = "::#{current_user.role.camelize}::#{model_class}Form"
79
+
80
+ unless defined? class_name
81
+ Tramway::Error.raise_error(
82
+ :tramway,
83
+ :application,
84
+ :create_form_for_role,
85
+ role: current_user.role,
86
+ model_class: model_class,
87
+ class_name: class_name
88
+ )
89
+ end
90
+
91
+ class_name.constantize
92
+ end
93
+
94
+ def model_given?
95
+ current_user.present? && (available_models_given? || singleton_models_given?)
96
+ end
97
+
98
+ def form_given?
99
+ Tramway.forms.include? params[:form].underscore.sub(%r{^admin/}, '').sub(/_form$/, '') if params[:form].present?
100
+ end
101
+
102
+ def available_scope_given?
103
+ params[:scope].present? && params[:scope].in?(decorator_class.collections.map(&:to_s))
104
+ end
105
+
106
+ def available_models_given?
107
+ check_models_given? :available
108
+ end
109
+
110
+ def singleton_models_given?
111
+ check_models_given? :singleton
112
+ end
113
+
114
+ private
115
+
116
+ def check_models_given?(model_type)
117
+ models = Tramway.send("#{model_type}_models", role: current_user.role)
118
+ models.any? && params[:model].in?(models.map(&:to_s))
119
+ end
120
+
121
+ def session_path?
122
+ request.path.in?(['/admin/session/new', '/admin/session', '/admin/sign_out'])
123
+ end
124
+
125
+ def application
126
+ return unless Tramway.application
127
+
128
+ @application ||= Tramway.application&.model_class&.first || Tramway.application
129
+ end
130
+
131
+ def load_extensions
132
+ Tramway::Extensions.load if defined? Tramway::Extensions
133
+ end
134
+
135
+ def authenticated_user
136
+ (defined?(current_user) && current_user.try(:model)) || (defined?(current_user) && current_user.model)
137
+ end
138
+
139
+ def current_user_role_scope
140
+ "#{current_user.role}_scope"
141
+ end
142
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Tramway::Export::ApplicationController < Tramway::ApplicationController
4
+ before_action :authenticate_admin!
5
+ end