tramway 0.1.2 → 0.1.3

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 (177) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +12 -893
  4. data/Rakefile +8 -8
  5. data/app/components/tailwind_component.html.haml +0 -0
  6. data/app/components/tailwind_component.rb +6 -0
  7. data/app/components/tailwinds/navbar/button_component.html.haml +1 -0
  8. data/app/components/tailwinds/navbar/button_component.rb +14 -0
  9. data/config/routes.rb +0 -9
  10. data/lib/tasks/tramway_tasks.rake +5 -0
  11. data/lib/tramway/engine.rb +5 -10
  12. data/lib/tramway/version.rb +1 -1
  13. data/lib/tramway.rb +5 -140
  14. metadata +16 -545
  15. data/app/assets/config/tramway_core_manifest.js +0 -2
  16. data/app/assets/images/tramway/mona_lisa_from_prado.jpg +0 -0
  17. data/app/assets/images/tramway/mona_lisa_from_prado_square.jpg +0 -0
  18. data/app/assets/javascripts/bootstrap-datepicker-1.8.0.js +0 -2035
  19. data/app/assets/javascripts/bootstrap-datepicker-1.8.0.ru.min.js +0 -64
  20. data/app/assets/javascripts/ckeditor/config.js +0 -30
  21. data/app/assets/javascripts/ckeditor/plugins/image/dialogs/image.js +0 -1259
  22. data/app/assets/javascripts/ckeditor/plugins/image/icons/hidpi/image.png +0 -0
  23. data/app/assets/javascripts/ckeditor/plugins/image/icons/image.png +0 -0
  24. data/app/assets/javascripts/ckeditor/plugins/image/images/noimage.png +0 -0
  25. data/app/assets/javascripts/ckeditor/plugins/image/lang/en.js +0 -25
  26. data/app/assets/javascripts/ckeditor/plugins/image/lang/ru.js +0 -25
  27. data/app/assets/javascripts/ckeditor/plugins/image/plugin.js +0 -184
  28. data/app/assets/javascripts/ckeditor/plugins/youtube/images/icon-hdpi.png +0 -0
  29. data/app/assets/javascripts/ckeditor/plugins/youtube/images/icon.png +0 -0
  30. data/app/assets/javascripts/ckeditor/plugins/youtube/lang/en.js +0 -25
  31. data/app/assets/javascripts/ckeditor/plugins/youtube/lang/ru.js +0 -25
  32. data/app/assets/javascripts/ckeditor/plugins/youtube/plugin.js +0 -449
  33. data/app/assets/javascripts/tramway/application.js +0 -61
  34. data/app/assets/stylesheets/tramway/application.sass +0 -59
  35. data/app/controllers/tramway/application_controller.rb +0 -142
  36. data/app/controllers/tramway/concerns/auth_management.rb +0 -26
  37. data/app/controllers/tramway/concerns/filtering.rb +0 -43
  38. data/app/controllers/tramway/export/application_controller.rb +0 -5
  39. data/app/controllers/tramway/has_and_belongs_to_many_records_controller.rb +0 -26
  40. data/app/controllers/tramway/records_controller.rb +0 -86
  41. data/app/controllers/tramway/sessions_controller.rb +0 -49
  42. data/app/controllers/tramway/singletons_controller.rb +0 -48
  43. data/app/controllers/tramway/welcome_controller.rb +0 -17
  44. data/app/decorators/tramway/application_decorated_collection.rb +0 -15
  45. data/app/decorators/tramway/application_decorator.rb +0 -124
  46. data/app/decorators/tramway/associations/class_helper.rb +0 -45
  47. data/app/decorators/tramway/associations/object_helper.rb +0 -58
  48. data/app/decorators/tramway/attributes/view_helper.rb +0 -30
  49. data/app/decorators/tramway/concerns/attributes_decorator_helper.rb +0 -97
  50. data/app/decorators/tramway/concerns/table_builder.rb +0 -33
  51. data/app/decorators/tramway/default/values_helper.rb +0 -23
  52. data/app/decorators/tramway/delegating/class_helper.rb +0 -9
  53. data/app/decorators/tramway/user_decorator.rb +0 -49
  54. data/app/forms/admin/tramway/user_form.rb +0 -24
  55. data/app/forms/tramway/application_form.rb +0 -124
  56. data/app/forms/tramway/application_forms/association_class_helpers.rb +0 -7
  57. data/app/forms/tramway/application_forms/association_object_helpers.rb +0 -36
  58. data/app/forms/tramway/application_forms/constant_class_actions.rb +0 -7
  59. data/app/forms/tramway/application_forms/constant_object_actions.rb +0 -20
  60. data/app/forms/tramway/application_forms/frontend.rb +0 -12
  61. data/app/forms/tramway/application_forms/object_helpers.rb +0 -15
  62. data/app/forms/tramway/application_forms/properties_object_helper.rb +0 -16
  63. data/app/forms/tramway/application_forms/submit_helper.rb +0 -26
  64. data/app/forms/tramway/extendable_form.rb +0 -15
  65. data/app/forms/tramway/extendable_forms_helpers/class_builder.rb +0 -34
  66. data/app/forms/tramway/extendable_forms_helpers/ignored_properties_helper.rb +0 -11
  67. data/app/forms/tramway/extendable_forms_helpers/more_properties_helper.rb +0 -31
  68. data/app/forms/tramway/extendable_forms_helpers/properties_helper.rb +0 -16
  69. data/app/forms/tramway/extendable_forms_helpers/submit/class_helpers.rb +0 -18
  70. data/app/forms/tramway/extendable_forms_helpers/submit/object_helpers.rb +0 -21
  71. data/app/forms/tramway/extendable_forms_helpers/validators.rb +0 -40
  72. data/app/forms/tramway/extended_application_form.rb +0 -23
  73. data/app/forms/tramway/form_creator.rb +0 -7
  74. data/app/forms/tramway/session_form.rb +0 -26
  75. data/app/helpers/tramway/actions_helper.rb +0 -45
  76. data/app/helpers/tramway/additional_buttons_builder.rb +0 -12
  77. data/app/helpers/tramway/application_helper.rb +0 -27
  78. data/app/helpers/tramway/cases_helper.rb +0 -13
  79. data/app/helpers/tramway/copy_to_clipboard_helper.rb +0 -11
  80. data/app/helpers/tramway/focus_generator_helper.rb +0 -10
  81. data/app/helpers/tramway/frontend_helper.rb +0 -26
  82. data/app/helpers/tramway/inputs/associations_helper.rb +0 -30
  83. data/app/helpers/tramway/inputs/polymorphic_associations_helper.rb +0 -24
  84. data/app/helpers/tramway/inputs_helper.rb +0 -96
  85. data/app/helpers/tramway/model_helper.rb +0 -7
  86. data/app/helpers/tramway/navbar_helper.rb +0 -11
  87. data/app/helpers/tramway/records_helper.rb +0 -120
  88. data/app/helpers/tramway/russian_cases_helper.rb +0 -26
  89. data/app/helpers/tramway/singleton_helper.rb +0 -12
  90. data/app/helpers/tramway/state_machine_buttons_helper.rb +0 -61
  91. data/app/helpers/tramway/title_helper.rb +0 -25
  92. data/app/inputs/date_picker_input.rb +0 -4
  93. data/app/inputs/multiple_file_input.rb +0 -7
  94. data/app/models/tramway/application_record.rb +0 -62
  95. data/app/models/tramway/user.rb +0 -18
  96. data/app/uploaders/application_uploader.rb +0 -22
  97. data/app/uploaders/file_uploader.rb +0 -4
  98. data/app/uploaders/ico_uploader.rb +0 -7
  99. data/app/uploaders/image_defaults.rb +0 -14
  100. data/app/uploaders/photo_uploader.rb +0 -54
  101. data/app/views/layouts/tramway/application.html.haml +0 -32
  102. data/app/views/layouts/tramway/shared/_navbar.html.haml +0 -46
  103. data/app/views/tramway/404.haml +0 -1
  104. data/app/views/tramway/records/_form.html.haml +0 -22
  105. data/app/views/tramway/records/_list.html.haml +0 -38
  106. data/app/views/tramway/records/_search.html.haml +0 -34
  107. data/app/views/tramway/records/edit.html.haml +0 -1
  108. data/app/views/tramway/records/index.html.haml +0 -31
  109. data/app/views/tramway/records/new.html.haml +0 -1
  110. data/app/views/tramway/records/show.html.haml +0 -1
  111. data/app/views/tramway/sessions/new.html.haml +0 -9
  112. data/app/views/tramway/shared/_input.html.haml +0 -34
  113. data/app/views/tramway/shared/_input_extended.html.haml +0 -14
  114. data/app/views/tramway/shared/_messages.html.haml +0 -10
  115. data/app/views/tramway/shared/_show.html.haml +0 -35
  116. data/app/views/tramway/shared/errors/server_error.html.haml +0 -12
  117. data/app/views/tramway/shared/input_extended_types/_checkbox.html.haml +0 -1
  118. data/app/views/tramway/shared/input_extended_types/_select.html.haml +0 -16
  119. data/app/views/tramway/shared/input_extended_types/_simple.html.haml +0 -4
  120. data/app/views/tramway/shared/input_extended_types/_yes_no.html.haml +0 -4
  121. data/app/views/tramway/shared/show/_attribute_tr.html.haml +0 -9
  122. data/app/views/tramway/shared/show/associations/_habtm_row.html.haml +0 -14
  123. data/app/views/tramway/shared/show/associations/_list.html.haml +0 -21
  124. data/app/views/tramway/shared/show/associations/_row.html.haml +0 -19
  125. data/app/views/tramway/shared/show/associations/_table_row.html.haml +0 -21
  126. data/app/views/tramway/singletons/_form.html.haml +0 -15
  127. data/app/views/tramway/singletons/edit.html.haml +0 -1
  128. data/app/views/tramway/singletons/new.html.haml +0 -1
  129. data/app/views/tramway/singletons/show.html.haml +0 -1
  130. data/app/views/tramway/welcome/index.html.haml +0 -4
  131. data/config/initializers/assets.rb +0 -7
  132. data/config/initializers/ckeditor.rb +0 -9
  133. data/config/initializers/plurals.rb +0 -25
  134. data/config/locales/en/collections.yml +0 -4
  135. data/config/locales/en/date.yml +0 -16
  136. data/config/locales/en/dates.yml +0 -10
  137. data/config/locales/en/helpers.yml +0 -26
  138. data/config/locales/en/locale.yml +0 -11
  139. data/config/locales/en/messages.yml +0 -7
  140. data/config/locales/en/models.yml +0 -9
  141. data/config/locales/en/simple_form_extension.yml +0 -8
  142. data/config/locales/en/state_machines.yml +0 -8
  143. data/config/locales/ru/collections.yml +0 -4
  144. data/config/locales/ru/date.yml +0 -16
  145. data/config/locales/ru/dates.yml +0 -10
  146. data/config/locales/ru/helpers.yml +0 -30
  147. data/config/locales/ru/locale.yml +0 -6
  148. data/config/locales/ru/messages.yml +0 -7
  149. data/config/locales/ru/models.yml +0 -21
  150. data/config/locales/ru/simple_form_extension.yml +0 -8
  151. data/config/locales/ru/state_machines.yml +0 -8
  152. data/lib/string.rb +0 -18
  153. data/lib/tramway/application.rb +0 -10
  154. data/lib/tramway/class_name_helpers.rb +0 -15
  155. data/lib/tramway/collection.rb +0 -9
  156. data/lib/tramway/collections/helper.rb +0 -21
  157. data/lib/tramway/collections.rb +0 -4
  158. data/lib/tramway/error.rb +0 -32
  159. data/lib/tramway/forms.rb +0 -5
  160. data/lib/tramway/generators/install_generator.rb +0 -49
  161. data/lib/tramway/generators/model_generator.rb +0 -105
  162. data/lib/tramway/generators/templates/create_tramway_users.rb +0 -18
  163. data/lib/tramway/generators/templates/decorator.rb.erb +0 -56
  164. data/lib/tramway/generators/templates/form.rb.erb +0 -22
  165. data/lib/tramway/generators/templates/initializers/simple_form.rb +0 -23
  166. data/lib/tramway/generators/templates/initializers/simple_form_bootstrap.rb +0 -133
  167. data/lib/tramway/generators.rb +0 -6
  168. data/lib/tramway/navbar.rb +0 -44
  169. data/lib/tramway/notifications.rb +0 -12
  170. data/lib/tramway/record_routes_helper.rb +0 -23
  171. data/lib/tramway/records_models.rb +0 -60
  172. data/lib/tramway/singleton_models.rb +0 -32
  173. data/lib/tramway/spec/helpers/navbar_helper.rb +0 -7
  174. data/lib/tramway/spec/helpers/tramway_helpers.rb +0 -47
  175. data/lib/tramway/welcome_page_actions.rb +0 -5
  176. data/lib/tramway/yaml/errors.yml +0 -50
  177. data/lib/validators/presence_validator.rb +0 -9
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::ActionsHelper
4
- def create_is_available?(model_class)
5
- Tramway.action_is_available?(
6
- nil,
7
- project: (@application_engine || @application.name),
8
- model_name: model_class,
9
- role: current_user.role,
10
- action: :create
11
- )
12
- end
13
-
14
- def update_is_available?(object)
15
- Tramway.action_is_available?(
16
- object,
17
- project: (@application_engine || @application.name),
18
- model_name: object.model.class.name,
19
- role: current_user.role,
20
- action: :update
21
- )
22
- end
23
-
24
- def destroy_is_available?(object)
25
- Tramway.action_is_available?(
26
- object,
27
- project: (@application_engine || @application.name),
28
- model_name: object.model.class.name,
29
- role: current_user.role,
30
- action: :destroy
31
- )
32
- end
33
-
34
- # delete_button is in smart-buttons gem
35
-
36
- def edit_button(url:, button_options:, &block)
37
- link_to(url, **button_options, &block)
38
- end
39
-
40
- def habtm_destroy_is_available?(association_object, main_object)
41
- main_model_name = main_object.model.class.to_s.underscore.pluralize
42
-
43
- Tramway.forms&.include?("#{main_model_name}/remove_#{association_object.model.class.to_s.underscore}")
44
- end
45
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::AdditionalButtonsBuilder
4
- def build_button(button)
5
- options = button[:options] || {}
6
- style = 'margin-right: 8px'
7
- concat(link_to(button[:url], method: button[:method], class: "btn btn-#{button[:color]} btn-xs", style:,
8
- **options) do
9
- button[:inner]&.call
10
- end)
11
- end
12
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::ApplicationHelper
4
- include FontAwesome5::Rails::IconHelper
5
- include SmartButtons
6
- include Tramway::Concerns::AuthManagement
7
-
8
- helpers = Dir["#{Tramway.root}/app/helpers/tramway/*_helper.rb"]
9
- helpers.each do |helper|
10
- module_name = helper.split('/')[-2..].join('/')[0..-4].camelize.constantize
11
-
12
- include module_name unless Tramway::ApplicationHelper
13
- end
14
-
15
- def object_type(object)
16
- object_class_name = if object.class.ancestors.include? ::Tramway::ApplicationDecorator
17
- object.class.model_class.name
18
- else
19
- object.class.name
20
- end
21
- if Tramway.available_models_for(@application_engine || @application.name).map(&:to_s).include?(object_class_name)
22
- :record
23
- else
24
- :singleton
25
- end
26
- end
27
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::CasesHelper
4
- def plural(word)
5
- if I18n.locale == :ru
6
- russian_plural word
7
- elsif word.respond_to?(:model_name)
8
- word.model_name.human.pluralize(I18n.locale)
9
- else
10
- word.human.pluralize(I18n.locale)
11
- end
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::CopyToClipboardHelper
4
- def copy_to_clipboard(id)
5
- button_tag class: 'btn btn-info clipboard-btn',
6
- data: { clipboard_action: 'copy', clipboard_target: "##{id}" },
7
- style: 'margin-left: 15px' do
8
- fa_icon 'copy'
9
- end
10
- end
11
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ::Tramway
4
- module FocusGeneratorHelper
5
- # FIXME: create independent focus generator
6
- def focus_selector(index)
7
- "table:nth-child(2)>tbody>tr:nth-child(#{index - 1})"
8
- end
9
- end
10
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::FrontendHelper
4
- def react_params(form, action, method)
5
- form.properties.each_with_object({ action: react_params_url(form, action), method:,
6
- authenticity_token: form_authenticity_token }) do |property, hash|
7
- case property[1]
8
- when :association
9
- hash.merge!(
10
- property[0] => {
11
- collection: build_collection_for_association(form, property[0])
12
- }
13
- )
14
- end
15
- end.merge model: form.model.attributes
16
- end
17
-
18
- def react_params_url(form, action)
19
- case action
20
- when :create
21
- Tramway::Engine.routes.url_helpers.records_path(model: form.model.class)
22
- else
23
- Tramway::Engine.routes.url_helpers.record_path(form.model.id, model: form.model.class)
24
- end
25
- end
26
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::Inputs::AssociationsHelper
4
- def build_collection_for_association(form_object, property)
5
- full_class_name_association = form_object.class.full_class_name_association(property)
6
- check_valid_association full_class_name_association
7
- full_class_name_association.send("#{current_user.role}_scope", current_user.id).map do |obj|
8
- decorator_class(full_class_name_association).decorate obj
9
- end.sort_by do |association|
10
- association.name || "#{association.class.name} ##{association.id}"
11
- end
12
- end
13
-
14
- def build_value_for_association(form_object, property, value)
15
- form_object.send(property) || form_object.model.send("#{property}_id") || value
16
- end
17
-
18
- def check_valid_association(full_class_name_association)
19
- unless full_class_name_association
20
- Tramway::Error.raise_error(
21
- :tramway, :inputs_helpers, :association_params, :defined_with_property_method, property:
22
- )
23
- end
24
- return unless full_class_name_association.is_a? Array
25
-
26
- Tramway::Error.raise_error(
27
- :tramway, :inputs_helpers, :association_params, :used_polymorphic_association, property:
28
- )
29
- end
30
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::Inputs::PolymorphicAssociationsHelper
4
- def build_collection_for_polymorphic_association(form_object, property)
5
- object_names = full_class_names(form_object, property).map do |class_name|
6
- class_name.send("#{current_user.role}_scope", current_user.id).map do |obj|
7
- decorator_class(class_name).decorate obj
8
- end
9
- end.flatten
10
- object_names.sort_by { |obj| obj.name.to_s }
11
- end
12
-
13
- def build_value_for_polymorphic_association(form_object, property, value)
14
- if form_object.send(property).present?
15
- "#{form_object.send(property).class.to_s.underscore}_#{form_object.send(property).id}"
16
- elsif value[:type].present? && value[:id].present?
17
- "#{value[:type]&.underscore}_#{value[:id]}"
18
- end
19
- end
20
-
21
- def full_class_names(form_object, property)
22
- form_object.model.class.send("#{property}_type").values.map(&:constantize)
23
- end
24
- end
@@ -1,96 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::InputsHelper
4
- include Tramway::Inputs::AssociationsHelper
5
- include Tramway::Inputs::PolymorphicAssociationsHelper
6
-
7
- def association_params(form_object:, property:, value:, object:, options: {})
8
- full_class_name_association = form_object.class.full_class_name_association(property)
9
-
10
- value = current_user&.id if full_class_name_association.to_s == 'Tramway::User'
11
-
12
- build_input_attributes(object:, property:, options:,
13
- value: build_value_for_association(form_object, property, value),
14
- collection: build_collection_for_association(form_object, property),
15
- include_blank: true,
16
- selected: form_object.model.send("#{property}_id") || value)
17
- end
18
-
19
- def polymorphic_association_params(object:, form_object:, property:, value:, options: {})
20
- build_input_attributes object:, property:,
21
- selected: build_value_for_polymorphic_association(form_object, property, value),
22
- value: build_value_for_polymorphic_association(form_object, property, value),
23
- collection: build_collection_for_polymorphic_association(form_object, property),
24
- options: options.merge(
25
- as: :select,
26
- include_blank: true,
27
- label_method: ->(obj) { "#{obj.class.model_name.human} | #{obj.name}" },
28
- value_method: lambda { |obj|
29
- "#{obj.class.to_s.underscore.sub(/_decorator$/, '')}_#{obj.id}"
30
- }
31
- )
32
- end
33
-
34
- def build_input_attributes(**options)
35
- {
36
- label: false,
37
- input_html: {
38
- name: "#{options[:object]}[#{options[:property]}]",
39
- id: "#{options[:object]}_#{options[:property]}",
40
- value: options[:value]
41
- },
42
- selected: options[:selected],
43
- collection: options[:collection]
44
- }.merge options[:options]
45
- end
46
-
47
- def value_from_params(model_class:, property:, type:)
48
- case type
49
- when :polymorphic_association, 'polymorphic_association'
50
- {
51
- id: params.dig(model_class.to_s.underscore, property.to_s),
52
- type: params.dig(model_class.to_s.underscore, "#{property}_type")
53
- }
54
- else
55
- params.dig(model_class.to_s.underscore, property.to_s)
56
- end
57
- end
58
-
59
- def default_params(property:, object:, form_object:, value:, options: {})
60
- {
61
- label: false,
62
- input_html: {
63
- name: "#{object}[#{property}]",
64
- id: "#{object}_#{property}",
65
- value: (form_object.send(property) || form_object.model.send(property) || value)
66
- },
67
- selected: (form_object.model.send(property) || value)
68
- }.merge options
69
- end
70
-
71
- def simple_params(**options)
72
- builded_options = { as: options[:type], label: false,
73
- input_html: {
74
- name: "#{options[:object]}[#{options[:property]}]",
75
- id: "#{options[:object]}_#{options[:property]}",
76
- value: build_simple_value(
77
- *options.values_at(:form_object, :property, :value),
78
- options.dig(:options, :input_html, :value)
79
- )
80
- } }
81
- merge_with_user_options builded_options, options
82
- end
83
-
84
- def build_simple_value(form_object, property, value, input_html_value)
85
- value_to_add = input_html_value || value
86
- value_to_add || form_object.send(property)
87
- end
88
-
89
- def merge_with_user_options(builded_options, options)
90
- if options[:options].present?
91
- options[:options][:input_html]&.delete(:value)
92
- builded_options.merge!(options) || {}
93
- end
94
- builded_options
95
- end
96
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::ModelHelper
4
- def tramway_model?(model_class)
5
- model_class.ancestors.include? Tramway::ApplicationRecord
6
- end
7
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::NavbarHelper
4
- def customized_admin_navbar_given?
5
- customized_admin_navbar.present?
6
- end
7
-
8
- def customized_admin_navbar
9
- ::Tramway.customized_admin_navbar
10
- end
11
- end
@@ -1,120 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::RecordsHelper
4
- # FIXME: replace to module
5
- def current_model_record_path(*args, **options)
6
- record_path args, options.merge(model: params[:model])
7
- end
8
-
9
- def edit_current_model_record_path(*args, **options)
10
- edit_record_path args, options.merge(model: params[:model])
11
- end
12
-
13
- def new_current_model_record_path(*args, **options)
14
- new_record_path args, options.merge(model: params[:model])
15
- end
16
-
17
- def current_model_records_path(*args, **options)
18
- records_path args, options.merge(model: params[:model])
19
- end
20
-
21
- def public_path(record)
22
- record.public_path || try("#{record.class.name.underscore.gsub('/', '_')}_path", record)
23
- end
24
-
25
- def model_class
26
- params[:model].constantize
27
- end
28
-
29
- def decorator_class(model_name = nil)
30
- "#{model_name || model_class}Decorator".constantize
31
- end
32
-
33
- def to_path(constant)
34
- constant.name.underscore.gsub '/', '_'
35
- end
36
-
37
- def search_tab_title(count)
38
- "#{t('helpers.scope.found')} / #{count}"
39
- end
40
-
41
- def searchable_model?(model_class)
42
- model_class.methods.include? :full_text_search
43
- end
44
-
45
- def build_options_for_select(name, collection)
46
- selected_value = params[:list_filters].present? ? params[:list_filters][name] : nil
47
- options_for_select(collection, selected_value)
48
- end
49
-
50
- def index_path_of_model(model_class, tab, filter)
51
- if tab
52
- records_path model: model_class, filter:, scope: tab
53
- else
54
- records_path model: model_class, filter:
55
- end
56
- end
57
-
58
- def collection_human_name(model_name:, collection_name:)
59
- if t("default.collections.#{collection_name}").include?('<span')
60
- t("collections.#{model_name}.#{collection_name}").pluralize(:ru)
61
- else
62
- t("default.collections.#{collection_name}")
63
- end
64
- end
65
-
66
- def tab_title(model_class, tab, count, _state_method = :state)
67
- model = model_class.name.underscore
68
- name = collection_human_name model_name: model, collection_name: tab
69
- "#{name} / #{count}"
70
- end
71
-
72
- def active_tab(tab, index)
73
- return :active if params[:scope].nil? && index.zero?
74
- return :active if params[:search].nil? && params[:scope].to_s == tab.to_s
75
- end
76
-
77
- def new_associated_record_path(object:, association:, as:)
78
- unless association.options[:class_name].present?
79
- raise "You should set `class_name` for #{association.name} association"
80
- end
81
-
82
- new_record_path(**new_record_path_options(object, association, as))
83
- end
84
-
85
- def new_record_path_options(object, association, as)
86
- hash = {
87
- model: association.class_name,
88
- redirect: current_model_record_path(object.model)
89
- }
90
-
91
- if association.options[:as].present? # polymorphic? conditiion
92
- hash.merge! options_for_polymorphic_link object, association
93
- else
94
- hash.merge! options_for_isomorphic_link object, association, as
95
- end
96
-
97
- hash
98
- end
99
-
100
- def options_for_polymorphic_link(object, association)
101
- {
102
- association.options[:class_name].underscore => {
103
- association.options[:as] => object.id,
104
- association.type => object.class.model_name
105
- }
106
- }
107
- end
108
-
109
- def options_for_isomorphic_link(object, association, as)
110
- {
111
- association.options[:class_name].underscore => {
112
- as || object.model.class.name.underscore.gsub('/', '_') => object.id
113
- }
114
- }
115
- end
116
-
117
- def there_any_filters?(model_class)
118
- decorator_class(model_class).list_filters&.any?
119
- end
120
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::RussianCasesHelper
4
- def case_word(model_name, case_name)
5
- word_case = I18n.t("cases.#{model_name.name.underscore}.#{case_name}")
6
- return word_case if word_case.present?
7
-
8
- raise "There is not #{case_name} implementation for \"#{model_name}\""
9
- end
10
-
11
- def genitive(word)
12
- case_word word, :genitive
13
- end
14
-
15
- def instrumental(word)
16
- case_word word, :instrumental
17
- end
18
-
19
- def dative(word)
20
- case_word word, :dative
21
- end
22
-
23
- def russian_plural(word)
24
- case_word word, :plural
25
- end
26
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::SingletonHelper
4
- # FIXME: replace to module
5
- def current_model_singleton_path(*args, **options)
6
- singleton_path args, options.merge(model: params[:model])
7
- end
8
-
9
- def edit_current_model_singleton_path(*args, **options)
10
- edit_singleton_path args, options.merge(model: params[:model])
11
- end
12
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::StateMachineButtonsHelper
4
- def state_events_buttons(object, **options)
5
- options.each do |(key, value)|
6
- define_singleton_method(key) { value }
7
- end
8
- content_tag(:div, class: 'btn-group-vertical') do
9
- transitions(object, state_method, options[:without]).each do |event|
10
- button(
11
- object,
12
- event: event[:event],
13
- model_name: object.class.model_name.name.underscore,
14
- form_options: button_options,
15
- **options
16
- )
17
- end
18
- end
19
- end
20
-
21
- private
22
-
23
- def excepted_actions(without)
24
- return unless without
25
-
26
- without.is_a?(Array) ? without.map(&:to_sym) : [without.to_sym]
27
- end
28
-
29
- def transitions(object, state_method, without)
30
- object.model.aasm(state_method).permitted_transitions.reject do |t|
31
- excepted_actions(without).present? && excepted_actions(without).include?(t[:event])
32
- end
33
- end
34
-
35
- def button(object, **options)
36
- event = options[:event]
37
-
38
- concat(
39
- patch_button(**patch_button_options(object, event, options)) do
40
- model = object.model
41
- class_name = model.class.name.underscore
42
- actual_event = model.aasm(options[:state_method]).events.select { |ev| ev.name == event }.first.name
43
- I18n.t("state_machines.#{class_name}.#{options[:state_method]}.events.#{actual_event}")
44
- end
45
- )
46
- end
47
-
48
- def patch_button_options(object, event, options)
49
- attributes = { aasm_event: event }
50
- css_class = "btn btn-sm btn-xs btn-#{object.public_send("#{options[:state_method]}_button_color", event)}"
51
-
52
- {
53
- record: object.model,
54
- attributes:,
55
- model_name: options[:model_name],
56
- button_options: { class: css_class },
57
- form_options: options[:form_options],
58
- url: Tramway::Engine.routes.url_helpers.record_path(object.id, options[:parameters])
59
- }
60
- end
61
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Tramway::TitleHelper
4
- def title(page_title = default_title)
5
- @application ||= Tramway.application&.model_class&.first || Tramway.application
6
- if @application.present?
7
- title_text = "#{page_title} | #{@application.try(:title) || @application.public_name}"
8
- content_for(:title) { title_text }
9
- else
10
- Tramway::Error.raise_error(:tramway, :title_helper, :title, :you_should_set_tramway_core_application)
11
- end
12
- end
13
-
14
- def default_title
15
- t('.title')
16
- end
17
-
18
- def page_title(action, model_name)
19
- if I18n.locale == :ru
20
- "#{t("helpers.actions.#{action}")} #{genitive(model_name)}"
21
- else
22
- "#{t("helpers.actions.#{action}")} #{model_name.model_name.human.downcase}"
23
- end
24
- end
25
- end
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class DatePickerInput < SimpleForm::Inputs::StringInput
4
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class MultipleFileInput < SimpleForm::Inputs::FileInput
4
- def input(wrapper_options)
5
- super(wrapper_options.merge! multiple: true)
6
- end
7
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'carrierwave/orm/activerecord' if defined?(CarrierWave::Mount)
4
-
5
- class Tramway::ApplicationRecord < ActiveRecord::Base
6
- primary_abstract_class
7
-
8
- self.abstract_class = true
9
- has_paper_trail
10
- extend ::Enumerize
11
- include AASM
12
- acts_as_paranoid
13
-
14
- scope :created_by_user, lambda { |user_id|
15
- joins(:audits).where('audits.action = \'create\' AND audits.user_id = ?', user_id)
16
- }
17
- scope :admin_scope, ->(_arg) { all }
18
-
19
- include ::PgSearch::Model
20
-
21
- def creator
22
- creation_event = audits.where(action: :create).first
23
- creation_event.user if creation_event.user_id.present?
24
- end
25
-
26
- # FIXME: detect inhertited locales
27
- class << self
28
- def human_attribute_name(attribute_name, *_args)
29
- excepted_attributes = %w[created_at updated_at]
30
- if attribute_name.to_s.in? excepted_attributes
31
- I18n.t "activerecord.attributes.tramway/application_record.#{attribute_name}"
32
- else
33
- super attribute_name
34
- end
35
- end
36
-
37
- def search_by(*attributes, **associations)
38
- pg_search_scope :full_text_search,
39
- against: attributes,
40
- associated_against: associations,
41
- using: %i[tsearch trigram]
42
- end
43
-
44
- def uploader(attribute_name, uploader_name, **options)
45
- mount_uploader attribute_name, "#{uploader_name.to_s.camelize}Uploader".constantize
46
- @versions = options[:versions] if uploader_name == :photo
47
- @extensions = options[:extensions]
48
- end
49
-
50
- def photo_versions
51
- @versions
52
- end
53
-
54
- def file_extensions
55
- @extensions
56
- end
57
-
58
- def state_machines_names
59
- AASM::StateMachineStore.fetch(self).machine_names
60
- end
61
- end
62
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Tramway::User < Tramway::ApplicationRecord
4
- has_secure_password
5
-
6
- scope :admins, -> { where role: :admin }
7
- scope :simple_users, -> { where role: :user }
8
-
9
- enumerize :role, in: %i[user admin], default: :admin
10
-
11
- def admin?
12
- role.admin?
13
- end
14
-
15
- def full_name
16
- "#{first_name} #{last_name}"
17
- end
18
- end