tramway 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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