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
data/README.md CHANGED
@@ -1,35 +1,909 @@
1
- # Tramway
1
+ # ![tramway-ico](https://raw.githubusercontent.com/kalashnikovisme/kalashnikovisme/master/%D1%82%D1%80%D1%8D%D0%BC%D0%B2%D1%8D%D0%B9%D0%B1%D0%B5%D0%B7%D1%84%D0%BE%D0%BD%D0%B0-min.png) Tramway [![Tests](https://github.com/Purple-Magic/tramway/actions/workflows/tests.yml/badge.svg)](https://github.com/Purple-Magic/tramway/actions/workflows/tests.yml) [![Rubocop](https://github.com/Purple-Magic/tramway/actions/workflows/rubocop.yml/badge.svg)](https://github.com/Purple-Magic/tramway/actions/workflows/rubocop.yml) [![Gem Version](https://badge.fury.io/rb/tramway.svg)](https://badge.fury.io/rb/tramway)
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/tramway`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ # Installation
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ *Gemfile*
6
+ ```ruby
7
+ gem 'tramway'
8
+ gem 'audited'
9
+ gem 'clipboard-rails'
10
+ gem 'bcrypt'
11
+ gem 'haml-rails'
12
+ gem 'bootstrap'
13
+ gem 'jquery-rails'
14
+ gem 'copyright_mafa'
15
+ gem 'trap'
16
+ gem 'kaminari'
17
+ gem 'bootstrap-kaminari-views', github: 'kalashnikovisme/bootstrap-kaminari-views', branch: :master
18
+ gem 'state_machine_buttons'
19
+ gem 'ckeditor', '4.2.4'
20
+ gem 'ransack'
21
+ gem 'smart_buttons'
22
+ gem 'carrierwave'
23
+ gem 'validates'
24
+ ```
6
25
 
7
- ## Installation
26
+ *config/initializers/tramway.rb*
27
+ ```ruby
28
+ # Initialize application with name
29
+ Tramway.initialize_application name: :your_application_name
8
30
 
9
- Add this line to your application's Gemfile:
31
+ # Initialize application name with model_class. Model class must be a singlethon
32
+ Tramway.initialize_application model_class: MyApplication
33
+ ```
10
34
 
35
+ ```shell
36
+ rails g tramway:install
37
+ ```
38
+
39
+ *config/initializers/assets.rb*
11
40
  ```ruby
12
- gem 'tramway'
41
+ Rails.application.config.assets.precompile += %w( *.jpg *.png *.js )
42
+ ```
43
+
44
+ #### Every Tramway application need initialized @application object (or if you create Tramway plugin, it should be @application_engine object).
45
+
46
+ You don't need to initialize this object yourself, just configurate application with Tramway. You have **2** options of this:
47
+
48
+ ## Option 1. If you want to change @application object just in the code base.
49
+
50
+ ```shell
51
+ rails g tramway:install
52
+ ```
53
+
54
+ *config/initializers/tramway.rb*
55
+
56
+ ```ruby
57
+ Tramway::Core.initialize_application name: :your_application_name
58
+ ```
59
+
60
+ ## Option 2. If you want to change @application object from admin panel. How to create model that will be an Application Model for the Tramway
61
+
62
+ #### 1. Generate model that you to use. We create Organization, for example
63
+
64
+ ```shell
65
+ rails g tramway:application
66
+ rails db:migrate
67
+ ```
68
+
69
+ #### 2. Add model_class to Initializer
70
+
71
+ ```ruby
72
+ Tramway::Core.initialize_application model_class: Organization
73
+ ```
74
+
75
+ #### 3. Create 1 instance of Organization model
76
+
77
+ ```ruby
78
+ rails c
79
+ Organization.create! public_name: 'Tramway', name: :organization, tagline: 'Tramway is not buggy, LOL!', main_image: 'https://raw.githubusercontent.com/ulmic/tramway-dev/develop/logo.png'
80
+ ```
81
+
82
+ #### 4. Add model to singleton to the `tramway-admin` admin panel to be able to change its data
83
+
84
+ ```ruby
85
+ Tramway::Admin.set_singleton_models Organization, project: :organization # now you should use organization.name here
86
+ ```
87
+
88
+ #### 5. Then continue configuration of your model in admin panel with tramway-admin gem [instruction, starting from point 8](https://github.com/ulmic/tramway-dev/tree/develop/tramway-admin#8-configurate-navbar)
89
+
90
+ #### 6. Now you are able to change your application main info in admin panel
91
+
92
+ ## How-to
93
+
94
+ ### add favicon to your application
95
+
96
+ *config/initializers/tramway.rb*
97
+ ```ruby
98
+ ::Tramway::Core.initialize_application attribute1: value, another_attribute: another_value, favicon: `/icon.ico` # icon should be in public folder
99
+ ```
100
+
101
+ # Usage
102
+
103
+ ## Tramway::Core::ApplicationRecord
104
+
105
+ ### uploader
106
+
107
+ Tramway use [carrierwave](https://github.com/carrierwaveuploader/carrierwave) for file uploading by default. To mount uploader you should use `uploader` method
108
+
109
+ Interface: `uploader(attribute_name, uploader_name, **options)`
110
+
111
+ * attribute_name - ActiveRecord attribute to mount uploader
112
+ * uploader_name - **short** uploader name. You need to connect uploaders which are compatible with Tramway. Available uploaders:
113
+ * :photo - you can see it [here](https://github.com/Purple-Magic/tramway/blob/develop/app/uploaders/photo_uploader.rb)
114
+ * :file - you can see it [here](https://github.com/Purple-Magic/tramway/blob/develop/app/uploaders/file_uploader.rb)
115
+ * :ico - you can see [here](https://github.com/Purple-Magic/tramway/blob/develop/app/uploaders/ico_uploader.rb)
116
+ * options - you are available to set options for uploaders exactly for this model. Available options:
117
+ * versions - **only for :photo**. Set needed versions for file to be cropped. If empty - 0 zero versions will be used. All versions you can see [here](https://github.com/Purple-Magic/tramway/blob/develop/app/uploaders/photo_uploader.rb)
118
+ * extensions - whitelist of file extensions. If empty will be used default whitelist from the uploaders (links above)
119
+
120
+ Example:
121
+
122
+ ```ruby
123
+ class User < Tramway::Core::ApplicationRecord
124
+ uploader :avatar, :photo, version: [ :small, :medium ], extensions: [ :jpg, :jpeg ]
125
+ end
126
+ ```
127
+
128
+ ## Tramway::Core::ApplicationDecorator
129
+ ### Associations
130
+
131
+ Your can decorate association models. Supporting all types of association
132
+
133
+ *app/decorators/your_model_decorator.rb*
134
+ ```ruby
135
+ class YourModelDecorator < Tramway::Core::ApplicationDecorator
136
+ decorate_association :some_model
137
+ decorate_association :another_model, decorator: SpecificDecoratorForThisCase
138
+ decorate_association :another_one_model, as: :repeat_here_as_parameter_from_model
139
+ decorate_association :something_else_model, state_machines: [ :here_array_of_state_machines_you_want_to_see_in_YourModel_show_page ] # support from tramway-admin gem
140
+ end
141
+ ```
142
+
143
+ You can decorate a lot of models in one line
144
+
145
+ *app/decorators/your_model_decorator.rb*
146
+ ```ruby
147
+ class YourModelDecorator < Tramway::Core::ApplicationDecorator
148
+ decorate_associations :some_model, :another_model, :another_one_model, :something_else_model
149
+ end
150
+ ```
151
+
152
+ Also, you can configurate what associations you want to see in YourModel page in admin panel *support only for [tramway-admin](https://rubygems.org/gems/tramway-admin) gem*
153
+
154
+ *app/decorators/your_model_decorator.rb*
155
+ ```ruby
156
+ class YourModelDecorator < Tramway::Core::ApplicationDecorator
157
+ class << self
158
+ def show_associations
159
+ [ :some_model, :another_model, :another_one_model ]
160
+ end
161
+ end
162
+ end
163
+ ```
164
+
165
+ ### Delegating attributes
166
+
167
+ *app/decorators/your_model_decorator.rb*
168
+ ```ruby
169
+ class YourModelDecorator < Tramway::Core::ApplicationDecorator
170
+ delegate_attributes :title, :something_else, :another_atttribute
171
+ end
172
+ ```
173
+
174
+ ### Helper methods
175
+
176
+ #### date_view
177
+ Returns a date in the format depending on localization
178
+
179
+ *app/decorators/\*_decorator.rb*
180
+ ```ruby
181
+ def created_at
182
+ date_view object.created_at
183
+ end
184
+ ```
185
+ #### datetime_view
186
+ Returns a date and time in the format depending on localization
187
+
188
+ *app/decorators/*_decorator.rb*
189
+ ```ruby
190
+ def created_at
191
+ datetime_view object.created_at
192
+ end
193
+ ```
194
+ #### state_machine_view
195
+ Returns the state of an object according to a state machine
196
+
197
+ *app/decorators/*_decorator.rb*
198
+ ```ruby
199
+ def state
200
+ state_machine_view object, :state
201
+ end
202
+ ```
203
+ #### image_view
204
+ Returns an image in a particular format depending on the parameters of the original image file
205
+
206
+ *app/decorators/\*_decorator.rb*
207
+ ```ruby
208
+ def avatar
209
+ image_view object.avatar
210
+ end
211
+ ```
212
+ #### enumerize_view
213
+ Returns object enumerations as text
214
+
215
+ *app/decorators/\*_decorator.rb*
216
+ ```ruby
217
+ def field_type
218
+ enumerize_view object.field_type
219
+ end
13
220
  ```
14
221
 
15
- And then execute:
222
+ ## Other helpers
16
223
 
17
- $ bundle
224
+ ### CopyToClipboardHelper
18
225
 
19
- Or install it yourself as:
226
+ [app/helpers/tramway/copy_to_clipboard_helper.rb] (https://github.com/ulmic/tramway-dev/blob/develop/tramway/app/helpers/tramway/copy_to_clipboard_helper.rb)
20
227
 
21
- $ gem install tramway
228
+ #### Install
229
+
230
+ ```ruby
231
+ include ::Tramway::Core::CopyToClipboardHelper
232
+ ```
233
+
234
+ #### How to use it
235
+
236
+ It will show you in the view in bootstrap styles with font-awesome `copy` icon.
237
+
238
+ Something like this:
239
+
240
+ ![copy_to_clipboard_button](https://raw.githubusercontent.com/ulmic/tramway-dev/develop/tramway/docs/copy_to_clipboard_button.png)
241
+
242
+ ```ruby
243
+ copy_to_clipboard "some_id" # some_id is HTML id of element. Content of this element will be copied to the clipboard after pressing the button
244
+ ```
245
+
246
+ ## In Russian
247
+
248
+ # Базовые классы
249
+
250
+ * ApplicationDecorator - Базовый класс декоратора. В него по умолчанию включены `ActionView::Helpers` и `ActionView::Context` и `FontAwesome5` (версия гема FontAwesome, которая поддерживает 5 версию шрифта). `FontAwesome` считается в `Tramway` основным шрифтом для иконок.
251
+ * ApplicationForm - наследованный от Reform::Form класс форм.
252
+ * ApplicationRecord - базовый класс для AR моделей
253
+ * ApplicationUploader - базовый класс для Carrierwave аплоадеров.
254
+ * FileUploader - базовый класс для загрузки файлов
255
+ * PhotoUploader - базовый класс для загрузки фотографий
256
+ * Вьюха `_messages` - предоставляет отображение ошибок в форме. Совместима с AR и Reform
257
+
258
+ # Локализация
259
+
260
+ * dates - правила локализации даты
261
+ * helpers - часто используемые в формах слова
262
+ * models - часто используемые в моделях слова
263
+ * state_machines - локализация состояний
264
+
265
+ ## Contribution
266
+
267
+ ### Contributors
268
+
269
+ * [Pavel Kalashnikov](https://github.com/kalashnikovisme)
270
+ * [moshinaan](https://github.com/moshinaan)
271
+
272
+ ### Run tests
273
+
274
+ ```shell
275
+ make test
276
+ ```
277
+
278
+ ### Deployment workflow
279
+
280
+ #### If you don't have access to push gem to rubygems then
281
+
282
+ Just create PR to develop branch
283
+
284
+ #### If you have access to push gem to rubygems then
285
+
286
+ * Create PR to develop branch
287
+ * After merging PR you should create new release via git-flow this way
288
+
289
+ ```shell
290
+ git release start (version which you upgraded in lib/tramway/version.rb file)
291
+ git release finish (version which you upgraded in lib/tramway/version.rb file)
292
+ git push origin develop
293
+ git push origin master
294
+ ```
295
+
296
+ * Then push new version of the gem
297
+
298
+ ```shell
299
+ rm -rf *.gem && gem build $(basename "$PWD").gemspec && gem push *.gem
300
+ ```
301
+
302
+ # ![tramway-ico](https://raw.githubusercontent.com/kalashnikovisme/kalashnikovisme/master/%D1%82%D1%80%D1%8D%D0%BC%D0%B2%D1%8D%D0%B9%D0%B1%D0%B5%D0%B7%D1%84%D0%BE%D0%BD%D0%B0-min.png) Tramway::Admin
303
+
304
+ Create admin panel for your application FAST!
22
305
 
23
306
  ## Usage
307
+ How to use my plugin.
308
+
309
+ #### 1. Add this gems to Gemfile
310
+
311
+ #### 2. You should remove gem `turbolinks` from your application and from app/assets/javascripts/application.js
312
+
313
+ #### 3. Update your routes
314
+
315
+ *config/routes.rb*
316
+
317
+ ```ruby
318
+ Rails.application.routes.draw do
319
+ mount Tramway::Auth::Engine, at: '/auth'
320
+ mount Tramway::Admin::Engine, at: '/admin'
321
+ end
322
+ ```
323
+
324
+ #### 4. Then make `tramway-core` installation. [How-to](https://github.com/Purple-Magic/tramway-core/blob/develop/README.md#installation)
325
+
326
+
327
+ #### 5. And then execute:
328
+
329
+ ```bash
330
+ $ rails g tramway:user:install
331
+ $ rails db:migrate
332
+ ```
333
+
334
+ #### 6. Create your first admin user
335
+
336
+ ```bash
337
+ $ rails c
338
+ $> Tramway::User::User.create! email: 'your@email.com', password: '123456789', role: :admin
339
+ ```
340
+
341
+ #### 7. Add models to your admin
342
+
343
+ *app/config/initializers/tramway.rb*
344
+
345
+ ```ruby
346
+ # set available models for your admin
347
+ ::Tramway::Admin.set_available_models YourModel, AnotherYourModel, project: #{project_name_which_you_used_in_application_name}
348
+ # set singleton models for your admin
349
+ ::Tramway::Admin.set_singleton_models YourSingletonModel, AnotherYourSingletonModel, project: #{project_name_which_you_used_in_application_name}
350
+ ::Tramway::Auth.root_path = '/admin' # you need it to redirect in the admin panel after admin signed_in
351
+ ```
352
+
353
+ #### 8. Configurate navbar
354
+
355
+ *config/initializers/tramway.rb*
356
+ ```ruby
357
+ Tramway::Admin.navbar_structure(
358
+ YourModel, # this line will create first-level link in your navbar, which will send you to the YourModel management
359
+ {
360
+ my_dropdown: [ # this line contains dropdown link name
361
+ AnotherYourModel # this line will create 2nd-level link in your navbar, which will send you to the YourModel management,
362
+ :divider # this line adds bootstrap divider to the dropdown list
363
+ ]
364
+ },
365
+ project: :your_application_name
366
+ )
367
+ ```
368
+ #### 9. Create decorators and forms for all available_models.
369
+ You can run generator that will create all necessary files
370
+ ```bash
371
+ $ rails g tramway:admin:install
372
+ ```
373
+ Or generate decorator and form for only one model
374
+ ```bash
375
+ $ rails g tramway:admin:model Coworking
376
+ ```
377
+ If you're using several user roles in your admin dashboard, then you can specify scope for the form(default scope is `admin`)
378
+ ```bash
379
+ $ rails g tramway:admin:install --user-role=partner
380
+ ```
381
+
382
+ Or you can create forms and decorators manually as it written below:
383
+
384
+ #### 9a. Create decorator for models [manual option]
385
+
386
+ *app/decorators/your_model_decorator.rb*
387
+ ```ruby
388
+ class YourModelDecorator < Tramway::Core::ApplicationDecorator
389
+ decorate_associations :messages, :posts
390
+
391
+ class << self
392
+ def collections
393
+ [ :all, :scope1, :scope2 ]
394
+ end
395
+
396
+ def list_attributes
397
+ [ :begin_date, :end_date ]
398
+ end
399
+
400
+ def show_attributes
401
+ [ :begin_date, :end_date ]
402
+ end
403
+
404
+ def show_associations
405
+ [ :messages ]
406
+ end
407
+
408
+ def list_filters
409
+ {
410
+ filter_name: {
411
+ type: :select,
412
+ select_collection: filter_collection,
413
+ query: lambda do |list, value|
414
+ list.where some_attribute: value
415
+ end
416
+ },
417
+ date_filter_name: {
418
+ type: :dates,
419
+ query: lambda do |list, begin_date, end_date|
420
+ list.where 'created_at > ? AND created_at < ?', begin_date, end_date
421
+ end
422
+ }
423
+ }
424
+ end
425
+ end
426
+
427
+ delegate_attributes :title
428
+ end
429
+ ```
430
+
431
+ **NOTES:**
432
+ * `collections` method must return array of scopes of `YourModel`. Every collection will be a tab in a list of your model in admin panel
433
+ * `list_filters` method returns hash of filters where:
434
+ * select_collection - collection which will be in the select of filter. It must be compatible with [options_for_select](https://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_for_select) method
435
+ * query - some Active Record query which be used as a filter of records
436
+ * `list_attributes` method returns array of attributes which will be shown in index page. If empty only `name` will be shown
437
+ * `show_attributes` method returns array of attributes which will be shown in show page. If empty all attributes of the model will be shown
438
+ * `show_associations` method returns array of decorated associations which will be show in show page. If empty no associations will be shown
439
+
440
+ Filters naming:
441
+
442
+ *Select filters*
443
+
444
+ ```yaml
445
+ en:
446
+ tramway:
447
+ admin:
448
+ filters:
449
+ model_name:
450
+ filter_name: Your Filter
451
+ ```
452
+
453
+ *Date filters*
454
+
455
+ ```yaml
456
+ en:
457
+ tramway:
458
+ admin:
459
+ filters:
460
+ model_name:
461
+ date_filter_name:
462
+ begin_date: Your Begin date filter
463
+ end_date Your end date filter
464
+ ```
465
+
466
+ #### 9b. Create `Admin::YourModelForm` [manual option]
467
+
468
+ *app/forms/admin/your_model_form.rb
469
+ ```ruby
470
+ class Admin::YourModelForm < Tramway::Core::ApplicationForm
471
+ properties :title, :description, :text, :date, :logo
472
+
473
+ association :associated
474
+ association :another_polymorphic_associated
475
+
476
+ def initialize(object)
477
+ super(object).tap do
478
+ form_properties title: :string,
479
+ logo: :file,
480
+ description: :ckeditor,
481
+ date: :date_picker,
482
+ text: :text,
483
+ associated: :association,
484
+ another_polymorphic_association: :polymorphic_association,
485
+ birth_date: {
486
+ type: :default,
487
+ input_options: {
488
+ hint: 'It should be more than 18'
489
+ }
490
+ }
491
+ end
492
+ end
493
+ end
494
+ ```
495
+
496
+ **NOTE**
497
+ If you want fill inputs of this form, just send query params
498
+
499
+ ```
500
+ params = {
501
+ your_model: {
502
+ logo: '/file/url',
503
+ description: 'some text',
504
+ text: 'some another text',
505
+ associated_id: 5,
506
+ another_polymorphic_associated: 56,
507
+ another_polymorphic_associated_type: 'AnotherModel'
508
+ }
509
+ }
510
+ ```
511
+
512
+ #### 10. Add inheritance to YourModel
513
+
514
+ *app/models/your_model.rb*
515
+ ```ruby
516
+ class YourModel < Tramway::Core::ApplicationRecord
517
+ end
518
+ ```
519
+
520
+ ### 11. You can add search to your index page
521
+
522
+ Tramway use gem [PgSearch](https://github.com/Casecommons/pg_search`) as search engine
523
+
524
+ Just add `search` method to `YourModel` like this
525
+
526
+ ```ruby
527
+ search_by *attributes, **associations # `attributes` and `associations` should be the same syntax as in PgSearch
528
+ ```
529
+
530
+ Example:
531
+
532
+ ```ruby
533
+ class YourModel < Tramway::Core::ApplicationRecord
534
+ search_by :my_attribute, :another_attribute, my_association: [ :my_association_attribute, :another_my_association_attribute ]
535
+ ```
536
+
537
+ #### 12. Run server `rails s`
538
+ #### 13. Launch `localhost:3000/admin`
539
+
540
+ ### CRUDs for models
541
+
542
+ By default users with role `admin` have access to all models used as arguments in method `::Tramway::Admin.set_available_models`. If you want specify models by roles, use them as keys
543
+
544
+ ```ruby
545
+ ::Tramway::Admin.set_available_models ::Tramway::Event::Event, ::Tramway::Event::ParticipantFormField,
546
+ ::Tramway::Event::Participant, ::Tramway::Landing::Block, ::Tramway::User::User,
547
+ ::Tramway::Profiles::SocialNetwork, project: #{project_name_which_you_used_in_application_name}, role: :admin
548
+
549
+ ::Tramway::Admin.set_available_models ::Tramway::Event::Event, ::Tramway::Event::ParticipantFormField,
550
+ ::Tramway::Event::Participant, project: #{project_name_which_you_used_in_application_name}, role: :another_role
551
+ ```
552
+
553
+ You can set functions which are available by default some CRUD functions for any role:
554
+
555
+ ```ruby
556
+ # this line gives access only index page to YourModel for partner role
557
+ ::Tramway::Admin.set_available_models YourModel => [ :index ], role: :partner
558
+ ```
559
+
560
+ You can set conditions for functions which are available for any role:
561
+
562
+ ```ruby
563
+ # this line gives access to destroy only record with name `Elon Musk`
564
+
565
+ ::Tramway::Admin.set_available_models YourModel => [
566
+ destroy => lambda do |record|
567
+ record.name == 'Elon Musk'
568
+ end
569
+ ], role: :partner
570
+ ```
571
+
572
+ Here docs about changing roles of `Tramway::User::User` model [Readme](https://github.com/ulmic/tramway-dev/tree/develop/tramway#if-you-want-to-edit-roles-to-the-tramwayuseruser-class)
573
+
574
+ ## Associations management
575
+
576
+ ### has_many
577
+
578
+ We have models Game and Packs.
579
+
580
+ *app/models/game.rb*
581
+ ```ruby
582
+ class Game < Tramway::Core::ApplicationRecord
583
+ has_many :packs
584
+ end
585
+ ```
586
+
587
+ *app/models/pack.rb*
588
+ ```ruby
589
+ class Pack < Tramway::Core::ApplicationRecord
590
+ belongs_to :game
591
+ end
592
+ ```
593
+
594
+ **You want to manage packs in the Game show admin page**
595
+
596
+ #### 1. Add association to PackDecorator
597
+
598
+ *app/decorators/pack_decorator.rb*
599
+ ```ruby
600
+ class GameDecorator < Tramway::Core::ApplicationDecorator
601
+ decorate_association :packs, as: :game # we recommend you to add association name in Pack model. You need it if association name of Game in Pack is not `game`
602
+ end
603
+ ```
604
+
605
+ ### has_and_belongs_to_many
606
+
607
+ We have models Game and Packs.
608
+
609
+ *app/models/game.rb*
610
+ ```ruby
611
+ class Game < Tramway::Core::ApplicationRecord
612
+ has_and_belongs_to_many :packs
613
+ end
614
+ ```
615
+
616
+ *app/models/pack.rb*
617
+ ```ruby
618
+ class Pack < Tramway::Core::ApplicationRecord
619
+ has_and_belongs_to_many :games
620
+ end
621
+ ```
622
+
623
+ **You want to manage games in the Pack show admin page**
624
+
625
+ #### 1. Add association to PackDecorator
626
+
627
+ *app/decorators/pack_decorator.rb*
628
+ ```ruby
629
+ class PackDecorator < Tramway::Core::ApplicationDecorator
630
+ decorate_association :games
631
+ end
632
+ ```
633
+
634
+ #### 2. Create `Admin::Packs::AddGameForm` and `Admin::Packs::RemoveGameForm`
635
+
636
+ *app/forms/admin/packs/add_game_form.rb*
637
+ ```ruby
638
+ class Admin::Packs::AddGameForm < Tramway::Core::ApplicationForm
639
+ properties :game_ids
640
+ association :games
641
+
642
+ def initialize(object)
643
+ super(object).tap do
644
+ form_properties games: :association
645
+ end
646
+ end
647
+
648
+ def submit(params)
649
+ params[:game_ids].each do |id|
650
+ model.games << Game.find(id) if id.present?
651
+ end
652
+ model.save!
653
+ end
654
+ end
655
+ ```
656
+
657
+ *app/forms/admin/packs/remove_game_form.rb*
658
+ ```ruby
659
+ class Admin::Packs::RemoveGameForm < Tramway::Core::ApplicationForm
660
+ properties :id
661
+
662
+ def submit(params)
663
+ model.games -= [Game.find(params)] if id.present?
664
+ model.save!
665
+ end
666
+ end
667
+
668
+ ```
669
+
670
+ #### 3. Add this forms to initializer
671
+
672
+ *config/initializers/tramway/admin/forms.rb*
673
+ ```ruby
674
+ Tramway::Admin.forms = 'packs/add_game', 'packs/remove_game'
675
+ ```
676
+
677
+ ## Date Picker locale
678
+
679
+ DatePicker provides `ru`, `en` locales. To set needed locale, just add
680
+
681
+ ```javascript
682
+ window.current_locale = window.i18n_locale('en');
683
+ ```
684
+ to the `app/assets/javascripts/admin/application.js` file
685
+
686
+ **OR**
687
+
688
+ ```coffeescript
689
+ window.current_locale = window.i18n_locale 'en'
690
+ ```
691
+ to the `app/assets/javascripts/admin/application.js.coffee` file
692
+
693
+ ### Decorator Helper methods
694
+
695
+ #### date_view
696
+ Returns a date in the format depending on localization
697
+
698
+ *app/decorators/\*_decorator.rb*
699
+ ```ruby
700
+ def created_at
701
+ date_view object.created_at
702
+ end
703
+ ```
704
+ #### datetime_view
705
+ Returns a date and time in the format depending on localization
706
+
707
+ *app/decorators/*_decorator.rb*
708
+ ```ruby
709
+ def created_at
710
+ datetime_view object.created_at
711
+ end
712
+ ```
713
+ #### state_machine_view
714
+ Returns the state of an object according to a state machine
715
+
716
+ *app/decorators/*_decorator.rb*
717
+ ```ruby
718
+ def state
719
+ state_machine_view object, :state
720
+ end
721
+ ```
722
+
723
+ It takes locales from `I18n.t("state_machines.#{model_name}.#{state_machine_name}.states.#{state_value}")`
724
+
725
+ #### image_view
726
+ Returns an image in a particular format depending on the parameters of the original image file
727
+
728
+ *app/decorators/\*_decorator.rb*
729
+ ```ruby
730
+ def avatar
731
+ image_view object.avatar
732
+ end
733
+ ```
734
+ #### enumerize_view
735
+ Returns object enumerations as text
736
+
737
+ *app/decorators/\*_decorator.rb*
738
+ ```ruby
739
+ def field_type
740
+ enumerize_view object.field_type
741
+ end
742
+ ```
743
+
744
+ #### file_view
745
+ Returns file name and button to download it
746
+
747
+ *app/decorators/\*_decorator.rb*
748
+ ```ruby
749
+ def file_download
750
+ file_view object.file
751
+ end
752
+ ```
753
+
754
+ ## Notifications
755
+
756
+ You can add notification to your admin panel to the navbar.
757
+
758
+ To add notification to application, you need just set queries in initializers.
759
+
760
+ *config/initializers/tramway.rb*
761
+ ```ruby
762
+ ::Tramway::Admin.set_notificable_queries :"#{your_title}" => -> { your_query }
763
+
764
+ # Example from tramway-event gem (you also can push context variables here)
765
+
766
+ ::Tramway::Admin.set_notificable_queries new_participants: -> (current_user) do
767
+ ::Tramway::Event::Participant.where(participation_state: :requested).send "#{current_user}_scope", current_user.id
768
+ end
769
+ ```
770
+
771
+ **NOTE:** Proc with `current_user` argument is expecting. If you don't need `current_user`, just name do something like that:
772
+
773
+ ```ruby
774
+ ::Tramway::Admin.set_notificable_queries new_participants: -> (_current_user) do
775
+ # some code which does not need current_user
776
+ end
777
+ ```
778
+
779
+ ## Admin Main Page management
780
+
781
+ Start page of admin panel contains only `application.name` by default. To manage it just set `Tramway::Admin.welcome_page_actions` with some lambda and set `@content` variable with HTML.
782
+
783
+ Example:
784
+
785
+ *config/initializers/tramway/admin.rb*
786
+ ```ruby
787
+ ::Tramway::Admin.welcome_page_actions = lambda do
788
+ @content = '<a href="http://it-way.pro">IT Way</a>'
789
+ end
790
+ ```
24
791
 
25
- TODO: Write usage instructions here
792
+ ## Navbar management
793
+
794
+ ### Navbar structure
795
+
796
+ You can manage your navbar easy
797
+
798
+ *config/initializers/tramway.rb*
799
+ ```ruby
800
+ Tramway::Admin.navbar_structure(
801
+ YourModel, # this line will create first-level link in your navbar, which will send you to the YourModel management
802
+ {
803
+ my_dropdown: [ # this line contains dropdown link name
804
+ AnotherYourModel # this line will create 2nd-level link in your navbar, which will send you to the YourModel management,
805
+ :divider # this line adds bootstrap divider to the dropdown list
806
+ ]
807
+ },
808
+ project: :your_application_name
809
+ )
810
+ ```
811
+
812
+ **NOTE:** navbar structure is the same for all roles, but users will see only available models for them
813
+
814
+ ### Dropdown localization
815
+
816
+ To set human-read name for dropdown link you can use i18n:
817
+
818
+ *config/locales/admin.yml*
819
+
820
+ ```yaml
821
+ en:
822
+ admin:
823
+ navbar:
824
+ links:
825
+ my_dropdown: Very important dropdown
826
+ ```
827
+
828
+ ## Additional buttons to the show view
829
+
830
+ You can additional buttons to the header of show view of your model. Just add its configuration to the decorator
831
+
832
+ *app/decorators/your_model_decorator.rb*
833
+ ```ruby
834
+ class YourModelDecorator < Tramway::Core::ApplicationDecorator
835
+ def additional_buttons
836
+ {
837
+ show: [ # means that this buttons will be shown on show view only
838
+ {
839
+ url: ::Tramway::Export::Engine.routes.url_helpers.export_path(object.id, model: object.class, collection: :tasks),
840
+ inner: lambda do # inner HTML you want to see in the button
841
+ fa_icon 'file-excel'
842
+ end,
843
+ color: :success, # bootstrap button color
844
+ method: :get # HTTP method. get method is a default. Available: :post, :patch: delete
845
+ }
846
+ ]
847
+ }
848
+ end
849
+ end
850
+ ```
851
+
852
+ ## Errors
853
+
854
+ * **Model or Form is not available** - `params[:model]` or `params[:form]` is empty **OR** current user does not have access to model or form in `params[:model]` or `params[:form]`
855
+
856
+ ## Change admin user base model
857
+
858
+ *config/initializers/tramway.rb*
859
+ ```ruby
860
+ ::Tramway::Admin.auth_config = { user_model: User, auth_attributes: %i[email username] }
861
+ ```
862
+
863
+ ## Good features
864
+
865
+ ### Get actions log in admin panel
866
+
867
+ Tramway uses [audited](https://github.com/collectiveidea/audited) to log actions of models. That's why all we need it's creating view for model `Audited::Audit`
868
+
869
+ #### 1. Add Audited::Audit model to available models
870
+
871
+ *config/initializers/tramway.rb*
872
+ ```ruby
873
+ Tramway::Admin.set_available_models(
874
+ Audited::Audit,
875
+ project: :your_project_name
876
+ )
877
+ ```
878
+
879
+ #### 2. Add this model to navbar
880
+
881
+ ```ruby
882
+ Tramway::Admin.set_navbar_structure(
883
+ Audited::Audit,
884
+ project: :your_project_name
885
+ )
886
+ ```
887
+
888
+ #### 3. Generate decorator for Audited::Audit
889
+
890
+ ```
891
+ rails g tramway:admin:model Audited::Audit
892
+ ```
26
893
 
27
894
  ## Development
28
895
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
896
+ ### Tests
30
897
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
898
+ ```
899
+ make test
900
+ ```
901
+
902
+ ### Rubocop
32
903
 
33
- ## Contributing
904
+ ```
905
+ make rubocop
906
+ ```
34
907
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/tramway.
908
+ ## License
909
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).