tramway-core 1.13.1.1 → 1.14
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.
- checksums.yaml +4 -4
- data/Rakefile +3 -1
- data/app/controllers/tramway/core/application_controller.rb +2 -0
- data/app/decorators/tramway/core/application_decorated_collection.rb +3 -3
- data/app/decorators/tramway/core/application_decorator.rb +15 -14
- data/app/decorators/tramway/core/concerns/attributes_decorator_helper.rb +2 -0
- data/app/forms/tramway/core/application_form.rb +10 -8
- data/app/forms/tramway/core/extendable_form.rb +28 -13
- data/app/forms/tramway/core/extended_application_form.rb +7 -5
- data/app/forms/tramway/core/form_creator.rb +2 -0
- data/app/helpers/tramway/core/title_helper.rb +4 -2
- data/app/inputs/date_picker_input.rb +2 -0
- data/app/models/tramway/core/application_record.rb +7 -7
- data/app/uploaders/application_uploader.rb +2 -0
- data/app/uploaders/file_uploader.rb +3 -1
- data/app/uploaders/image_defaults.rb +4 -2
- data/app/uploaders/photo_uploader.rb +11 -9
- data/app/views/tramway/core/shared/_input_extended.html.haml +8 -16
- data/app/views/tramway/core/shared/input_extended_types/_checkbox.html.haml +1 -0
- data/app/views/tramway/core/shared/input_extended_types/_select.html.haml +16 -0
- data/app/views/tramway/core/shared/input_extended_types/_simple.html.haml +4 -0
- data/app/views/tramway/core/shared/input_extended_types/_yes_no.html.haml +4 -0
- data/config/initializers/assets.rb +3 -1
- data/config/initializers/carrierwave.rb +2 -0
- data/config/initializers/plurals.rb +9 -7
- data/config/routes.rb +2 -0
- data/lib/string.rb +5 -3
- data/lib/tasks/tramway/core_tasks.rake +2 -0
- data/lib/tramway/collection.rb +2 -0
- data/lib/tramway/collections/helper.rb +3 -1
- data/lib/tramway/core.rb +5 -6
- data/lib/tramway/core/application.rb +2 -0
- data/lib/tramway/core/engine.rb +2 -0
- data/lib/tramway/core/generators/install_generator.rb +3 -1
- data/lib/tramway/core/generators/templates/initializers/simple_form.rb +1 -0
- data/lib/tramway/core/version.rb +3 -1
- data/lib/tramway/error.rb +3 -1
- data/lib/tramway/helpers/class_name_helpers.rb +2 -0
- data/lib/validators/presence_validator.rb +3 -2
- metadata +85 -81
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aff2dd709eb25da798153cd9a21f3bd9f2542eb7386c64897539e9ebb516f45f
|
4
|
+
data.tar.gz: e3fb920952051837900f15710c7b2538b30eb99f2edf9d01bda5d04e0b39c4c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 583b78f563f4ccc605adb76f283ed94f51d44574a4c3e0a67636a8a32f7edef123829463ddf3c8a2af5de630c08c0869c8b4b3181ae81787fcf8f8dff98a5f24
|
7
|
+
data.tar.gz: 5ec16b360a0def6d1ad04bfd5e520d28ca40b0915e352ad8bc23da04fbfcd045a303c167dea4562c23baa2e3b09de4ca0ba0a0f0d7771544e1179bb943411d69
|
data/Rakefile
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Tramway::Core::ApplicationDecoratedCollection < Array
|
2
4
|
def initialize(array, original_array)
|
3
5
|
@original_array = original_array
|
4
6
|
super(array)
|
5
7
|
end
|
6
8
|
|
7
|
-
|
8
|
-
@original_array
|
9
|
-
end
|
9
|
+
attr_reader :original_array
|
10
10
|
|
11
11
|
delegate :total_pages, to: :original_array
|
12
12
|
delegate :total_count, to: :original_array
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'tramway/error'
|
2
4
|
|
3
5
|
class Tramway::Core::ApplicationDecorator
|
@@ -14,7 +16,7 @@ class Tramway::Core::ApplicationDecorator
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def title
|
17
|
-
error = Tramway::Error.new(plugin: :core, method: :title, message:
|
19
|
+
error = Tramway::Error.new(plugin: :core, method: :title, message: "Please, implement `title` method in a #{self.class} or #{object.class}")
|
18
20
|
raise error.message
|
19
21
|
end
|
20
22
|
|
@@ -56,7 +58,7 @@ class Tramway::Core::ApplicationDecorator
|
|
56
58
|
object.send(association_name).class
|
57
59
|
else
|
58
60
|
unless association.options[:class_name]
|
59
|
-
error = Tramway::Error.new(plugin: :core, method: :decorate_association, message:
|
61
|
+
error = Tramway::Error.new(plugin: :core, method: :decorate_association, message: "Please, specify `#{association_name}` association class_name in #{object.class} model. For example: `has_many :#{association_name}, class_name: '#{association_name.to_s.singularize.camelize}'`")
|
60
62
|
raise error.message
|
61
63
|
end
|
62
64
|
association.options[:class_name]
|
@@ -74,7 +76,7 @@ class Tramway::Core::ApplicationDecorator
|
|
74
76
|
end
|
75
77
|
|
76
78
|
def model_class
|
77
|
-
|
79
|
+
to_s.sub(/Decorator$/, '').constantize
|
78
80
|
end
|
79
81
|
|
80
82
|
def model_name
|
@@ -92,7 +94,8 @@ class Tramway::Core::ApplicationDecorator
|
|
92
94
|
error = Tramway::Error.new(
|
93
95
|
plugin: :core,
|
94
96
|
method: :link,
|
95
|
-
message:
|
97
|
+
message: "Method `link` uses `file` attribute of the decorated object. If decorated object doesn't contain `file`, you shouldn't use `link` method."
|
98
|
+
)
|
96
99
|
raise error.message
|
97
100
|
end
|
98
101
|
end
|
@@ -111,7 +114,7 @@ class Tramway::Core::ApplicationDecorator
|
|
111
114
|
|
112
115
|
include Tramway::Core::Concerns::AttributesDecoratorHelper
|
113
116
|
|
114
|
-
RESERVED_WORDS = [
|
117
|
+
RESERVED_WORDS = ['fields'].freeze
|
115
118
|
|
116
119
|
def attributes
|
117
120
|
object.attributes.reduce({}) do |hash, attribute|
|
@@ -119,13 +122,14 @@ class Tramway::Core::ApplicationDecorator
|
|
119
122
|
error = Tramway::Error.new(
|
120
123
|
plugin: :core,
|
121
124
|
method: :attributes,
|
122
|
-
message:
|
125
|
+
message: "Method `#{attribute[0]}` is reserved word. Please, create or delegate method in #{self.class.name} with another name."
|
126
|
+
)
|
123
127
|
raise error.message
|
124
128
|
end
|
125
129
|
value = try(attribute[0]) ? send(attribute[0]) : object.send(attribute[0])
|
126
130
|
if attribute[0].to_s.in? object.class.state_machines.keys.map(&:to_s)
|
127
131
|
hash.merge! attribute[0] => state_machine_view(object, attribute[0])
|
128
|
-
elsif value.class.in? [
|
132
|
+
elsif value.class.in? [ActiveSupport::TimeWithZone, DateTime, Time]
|
129
133
|
hash.merge! attribute[0] => datetime_view(attribute[1])
|
130
134
|
elsif value.class.superclass == ApplicationUploader
|
131
135
|
hash.merge! attribute[0] => image_view(object.send(attribute[0]))
|
@@ -142,11 +146,8 @@ class Tramway::Core::ApplicationDecorator
|
|
142
146
|
end
|
143
147
|
|
144
148
|
protected
|
145
|
-
|
146
|
-
def object
|
147
|
-
@object
|
148
|
-
end
|
149
149
|
|
150
|
-
|
151
|
-
|
152
|
-
end
|
150
|
+
attr_reader :object
|
151
|
+
|
152
|
+
def association_class_name; end
|
153
|
+
end
|
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tramway::Core
|
2
4
|
class ApplicationForm < ::Reform::Form
|
3
5
|
def initialize(object = nil)
|
4
|
-
object
|
6
|
+
object ||= self.class.model_class.new
|
5
7
|
super(object).tap do
|
6
8
|
@@model_class = object.class
|
7
9
|
@@enumerized_attributes = object.class.try :enumerized_attributes
|
@@ -27,12 +29,12 @@ module Tramway::Core
|
|
27
29
|
delegating object
|
28
30
|
end
|
29
31
|
end
|
30
|
-
|
32
|
+
|
31
33
|
def submit(params)
|
32
34
|
if params
|
33
35
|
save if validate params
|
34
36
|
else
|
35
|
-
error = Tramway::Error.new(plugin: :core, method: :submit, message:
|
37
|
+
error = Tramway::Error.new(plugin: :core, method: :submit, message: 'ApplicationForm::Params should not be nil')
|
36
38
|
raise error.message
|
37
39
|
end
|
38
40
|
end
|
@@ -52,7 +54,7 @@ module Tramway::Core
|
|
52
54
|
def build_errors; end
|
53
55
|
|
54
56
|
def delegating(object)
|
55
|
-
methods = [
|
57
|
+
methods = %i[to_key errors]
|
56
58
|
methods.each do |method|
|
57
59
|
self.class.send(:define_method, method) do
|
58
60
|
object.send method
|
@@ -96,7 +98,7 @@ module Tramway::Core
|
|
96
98
|
def full_class_name_association(association_name)
|
97
99
|
full_class_name_associations[association_name]
|
98
100
|
end
|
99
|
-
|
101
|
+
|
100
102
|
def enumerized_attributes
|
101
103
|
@@enumerized_attributes
|
102
104
|
end
|
@@ -109,11 +111,11 @@ module Tramway::Core
|
|
109
111
|
if defined?(@@model_class) && @@model_class
|
110
112
|
@@model_class
|
111
113
|
else
|
112
|
-
model_class_name ||=
|
114
|
+
model_class_name ||= name.to_s.sub(/Form$/, '')
|
113
115
|
begin
|
114
116
|
@@model_class = model_class_name.constantize
|
115
|
-
rescue
|
116
|
-
error = Tramway::Error.new(plugin: :core, method: :model_class, message:
|
117
|
+
rescue StandardError
|
118
|
+
error = Tramway::Error.new(plugin: :core, method: :model_class, message: "There is not model class name for #{name}. Should be #{model_class_name} or you can use another class to initialize form object or just initialize form with object.")
|
117
119
|
raise error.message
|
118
120
|
end
|
119
121
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Tramway::Core::ExtendableForm
|
2
4
|
class << self
|
3
5
|
def new(name, simple_properties: {}, **more_properties)
|
@@ -9,12 +11,10 @@ class Tramway::Core::ExtendableForm
|
|
9
11
|
|
10
12
|
define_method 'submit' do |params|
|
11
13
|
model.values ||= {}
|
12
|
-
extended_params = params.except(*simple_properties.keys)
|
14
|
+
extended_params = params.except(*simple_properties.keys).except(*jsonb_ignored_properties(more_properties))
|
13
15
|
params.each do |key, value|
|
14
16
|
method_name = "#{key}="
|
15
|
-
if respond_to?(method_name)
|
16
|
-
send method_name, value
|
17
|
-
end
|
17
|
+
send method_name, value if respond_to?(method_name)
|
18
18
|
end
|
19
19
|
model.values = extended_params.permit!.to_h.reduce(model.values) do |hash, pair|
|
20
20
|
hash.merge! pair[0] => pair[1]
|
@@ -23,11 +23,8 @@ class Tramway::Core::ExtendableForm
|
|
23
23
|
end
|
24
24
|
|
25
25
|
define_method 'properties' do
|
26
|
-
hash = simple_properties.
|
27
|
-
unless model.class.state_machines.keys.include?(property[0])
|
28
|
-
h.merge! property[0] => property[1]
|
29
|
-
end
|
30
|
-
h
|
26
|
+
hash = simple_properties.each_with_object({}) do |property, h|
|
27
|
+
h.merge! property[0] => property[1] unless model.class.state_machines.keys.include?(property[0])
|
31
28
|
end
|
32
29
|
more_properties.reduce(hash) do |h, property|
|
33
30
|
h.merge! property[0] => {
|
@@ -37,22 +34,40 @@ class Tramway::Core::ExtendableForm
|
|
37
34
|
end
|
38
35
|
|
39
36
|
more_properties.each do |property|
|
40
|
-
define_method property[0] do
|
37
|
+
define_method property[0] do
|
41
38
|
model.values[property[0]] if model.values
|
42
39
|
end
|
43
40
|
|
44
|
-
|
41
|
+
case property[1][:object].field_type
|
42
|
+
when 'file'
|
43
|
+
field = property[1][:object]
|
44
|
+
define_method "#{property[0]}=" do |value|
|
45
|
+
file_instance = property[1][:association_model].find_or_create_by "#{model.class.name.underscore}_id" => model.id, "#{field.class.name.underscore}_id" => field.id
|
46
|
+
file_instance.file = value
|
47
|
+
file_instance.save!
|
48
|
+
end
|
49
|
+
else
|
50
|
+
next unless property[1][:validates].present?
|
51
|
+
|
45
52
|
define_method "#{property[0]}=" do |value|
|
46
53
|
property[1][:validates].each do |pair|
|
47
|
-
validator_object = "#{pair[0].camelize}Validator".constantize.new(
|
54
|
+
validator_object = "#{pair[0].camelize}Validator".constantize.new(attributes: :not_blank)
|
48
55
|
if pair[1] == 'true' && !validator_object.send(:valid?, value)
|
49
56
|
model.errors.add property[0],
|
50
|
-
I18n.t("activerecord.errors.models.#{model.class.name.underscore}.attributes.#{property[0]}.#{pair[0]}",
|
57
|
+
I18n.t("activerecord.errors.models.#{model.class.name.underscore}.attributes.#{property[0]}.#{pair[0]}", value: value)
|
51
58
|
end
|
52
59
|
end
|
53
60
|
end
|
54
61
|
end
|
55
62
|
end
|
63
|
+
|
64
|
+
define_method :jsonb_ignored_properties do |properties|
|
65
|
+
properties.map do |property|
|
66
|
+
if property[1][:object].field_type == 'file'
|
67
|
+
property[0].to_s
|
68
|
+
end
|
69
|
+
end.compact
|
70
|
+
end
|
56
71
|
end)
|
57
72
|
end
|
58
73
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Tramway::Core::ExtendedApplicationForm < Tramway::Core::ApplicationForm
|
2
4
|
class << self
|
3
5
|
def properties(*args)
|
@@ -9,11 +11,11 @@ class Tramway::Core::ExtendedApplicationForm < Tramway::Core::ApplicationForm
|
|
9
11
|
|
10
12
|
def initialize(model)
|
11
13
|
@@extendable_properties.each do |prop|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
next if model.respond_to? prop
|
15
|
+
|
16
|
+
model.class.define_method prop do
|
17
|
+
end
|
18
|
+
model.class.define_method "#{prop}=" do |value|
|
17
19
|
end
|
18
20
|
end
|
19
21
|
super
|
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tramway
|
2
4
|
module Core
|
3
5
|
module TitleHelper
|
4
6
|
def title(page_title = default_title)
|
5
7
|
if @application.present?
|
6
|
-
title_text = "#{page_title} | #{@application.try(:title) || @application.public_name}"
|
8
|
+
title_text = "#{page_title} | #{@application.try(:title) || @application.public_name}"
|
7
9
|
content_for(:title) { title_text }
|
8
10
|
else
|
9
|
-
error = Tramway::Error.new(plugin: :core, method: :title, message:
|
11
|
+
error = Tramway::Error.new(plugin: :core, method: :title, message: 'You should set Tramway::Core::Application class using `::Tramway::Core.initialize_application model_class: #{model_class_name}` in config/initializers/tramway.rb OR may be you don\'t have any records of application model')
|
10
12
|
raise error.message
|
11
13
|
end
|
12
14
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'carrierwave/orm/activerecord' if defined?(CarrierWave::Mount)
|
4
4
|
|
5
5
|
module Tramway
|
6
6
|
module Core
|
@@ -22,10 +22,10 @@ module Tramway
|
|
22
22
|
|
23
23
|
include ::PgSearch
|
24
24
|
|
25
|
-
# FIXME detect inhertited locales
|
25
|
+
# FIXME: detect inhertited locales
|
26
26
|
class << self
|
27
|
-
def human_attribute_name(attribute_name, *
|
28
|
-
excepted_attributes = %w
|
27
|
+
def human_attribute_name(attribute_name, *_args)
|
28
|
+
excepted_attributes = %w[created_at updated_at state]
|
29
29
|
if attribute_name.to_s.in? excepted_attributes
|
30
30
|
I18n.t "activerecord.attributes.tramway/core/application_record.#{attribute_name}"
|
31
31
|
else
|
@@ -38,7 +38,7 @@ module Tramway
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
# FIXME detect inhertited locales
|
41
|
+
# FIXME: detect inhertited locales
|
42
42
|
def human_state_name
|
43
43
|
I18n.t "activerecord.state_machines.tramway/core/application_record.state.states.#{state}"
|
44
44
|
end
|
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ImageDefaults
|
2
4
|
include CarrierWave::MiniMagick
|
3
5
|
|
4
6
|
def default_url
|
5
|
-
"/images/fallback/#{model.class.model_name.to_s.underscore}/" << [mounted_as, version_name].compact.join(
|
7
|
+
"/images/fallback/#{model.class.model_name.to_s.underscore}/" << [mounted_as, version_name].compact.join('_') << '.gif'
|
6
8
|
end
|
7
9
|
|
8
10
|
def extension_white_list
|
9
|
-
%w
|
11
|
+
%w[jpg jpeg gif png]
|
10
12
|
end
|
11
13
|
end
|
@@ -1,37 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class PhotoUploader < ApplicationUploader
|
2
4
|
include ImageDefaults
|
3
5
|
|
4
6
|
def default_url
|
5
|
-
ActionController::Base.helpers.asset_path(
|
7
|
+
ActionController::Base.helpers.asset_path('images/default_photo.png')
|
6
8
|
end
|
7
9
|
|
8
10
|
def url
|
9
11
|
if file.present? && File.exist?(file.file)
|
10
|
-
file.file.match(
|
12
|
+
file.file.match(%r{/system/uploads/.*}).to_s
|
11
13
|
else
|
12
|
-
|
14
|
+
'/assets/tramway/core/mona_lisa_from_prado_square.jpg'
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
16
18
|
version :medium do
|
17
|
-
process :
|
19
|
+
process resize_to_fill: [400, 400]
|
18
20
|
end
|
19
21
|
|
20
22
|
version :small do
|
21
|
-
process :
|
23
|
+
process resize_to_fill: [100, 100]
|
22
24
|
end
|
23
25
|
|
24
|
-
# FIXME move to tramway-landing uploader
|
26
|
+
# FIXME: move to tramway-landing uploader
|
25
27
|
version :card do
|
26
28
|
process resize_to_fill: [400, 400, 'North']
|
27
29
|
end
|
28
30
|
|
29
|
-
# FIXME move to tramway-landing uploader
|
31
|
+
# FIXME: move to tramway-landing uploader
|
30
32
|
version :horizontal do
|
31
33
|
process resize_to_fill: [800, 350, 'North']
|
32
34
|
end
|
33
35
|
|
34
|
-
# FIXME move to tramway-landing uploader
|
36
|
+
# FIXME: move to tramway-landing uploader
|
35
37
|
version :mini do
|
36
38
|
process resize_to_limit: [300, nil]
|
37
39
|
end
|
@@ -43,7 +45,7 @@ class PhotoUploader < ApplicationUploader
|
|
43
45
|
def capture_size(file)
|
44
46
|
if version_name.blank?
|
45
47
|
if file.path.nil?
|
46
|
-
img = ::MiniMagick::Image
|
48
|
+
img = ::MiniMagick::Image.read(file.file)
|
47
49
|
@width = img[:width]
|
48
50
|
@height = img[:height]
|
49
51
|
else
|
@@ -1,22 +1,14 @@
|
|
1
1
|
- value = defined?(value).present? ? value : ''
|
2
2
|
- case field.field_type
|
3
|
-
- when 'text', 'string', 'numeric', 'date_picker'
|
4
|
-
|
5
|
-
= f.input field.title.to_sym, as: field.field_type, input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]", value: value }
|
6
|
-
- else
|
7
|
-
= f.input field.title.to_sym, as: field.field_type, input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }
|
3
|
+
- when 'text', 'string', 'numeric', 'date_picker', 'file'
|
4
|
+
= render 'tramway/core/shared/input_extended_types/simple', value: value, field: field, class_name: class_name, f: f
|
8
5
|
- when 'select'
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- else
|
16
|
-
- if value.present?
|
17
|
-
= f.input field.title.to_sym, as: :select, input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }, selected: value
|
18
|
-
- else
|
19
|
-
= f.input field.title.to_sym, as: :select, input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }
|
6
|
+
= render 'tramway/core/shared/input_extended_types/select', value: value, field: field, class_name: class_name, f: f
|
7
|
+
- when 'yes_no'
|
8
|
+
= render 'tramway/core/shared/input_extended_types/yes_no', value: value, field: field, class_name: class_name, f: f
|
9
|
+
- when 'checkbox'
|
10
|
+
= render 'tramway/core/shared/input_extended_types/checkbox', value: value, field: field, class_name: class_name, f: f
|
11
|
+
|
20
12
|
- if params[:errors].present? && params[:errors][field.title]&.first
|
21
13
|
.alert.alert-danger
|
22
14
|
= params[:errors][field.title]&.first
|
@@ -0,0 +1 @@
|
|
1
|
+
= f.input field.title.to_sym, as: :boolean, input_html: { class: class_name, id: "#{class_name}_#{field.title.to_sym}", name: "#{class_name}[#{field.title}]" }, checked_value: value == field.title.to_sym
|
@@ -0,0 +1,16 @@
|
|
1
|
+
- parsed_json = field.options.is_a?(Hash) ? field.options : (JSON.parse(field.options) unless field.options == '')
|
2
|
+
- if parsed_json&.dig('collection', 'name')
|
3
|
+
- if value.present?
|
4
|
+
= f.input field.title.to_sym, as: :select, collection: collection_list_by(name: parsed_json['collection']['name']), input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }, selected: value
|
5
|
+
- else
|
6
|
+
= f.input field.title.to_sym, as: :select, collection: collection_list_by(name: parsed_json['collection']['name']), input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }
|
7
|
+
- elsif parsed_json&.dig('collection', 'array')
|
8
|
+
- if value.present?
|
9
|
+
= f.input field.title.to_sym, as: :select, collection: parsed_json.dig('collection', 'array'), input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }, selected: value
|
10
|
+
- else
|
11
|
+
= f.input field.title.to_sym, as: :select, collection: parsed_json.dig('collection', 'array'), input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }
|
12
|
+
- else
|
13
|
+
- if value.present?
|
14
|
+
= f.input field.title.to_sym, as: :select, input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }, selected: value
|
15
|
+
- else
|
16
|
+
= f.input field.title.to_sym, as: :select, input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }
|
@@ -0,0 +1,4 @@
|
|
1
|
+
- if value.present?
|
2
|
+
= f.input field.title.to_sym, as: field.field_type, input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]", value: value }
|
3
|
+
- else
|
4
|
+
= f.input field.title.to_sym, as: field.field_type, input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }
|
@@ -0,0 +1,4 @@
|
|
1
|
+
- if value.present?
|
2
|
+
= f.input field.title.to_sym, as: :select, input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }, selected: value
|
3
|
+
- else
|
4
|
+
= f.input field.title.to_sym, as: :select, input_html: { class: class_name, id: "#{class_name}_#{field.title}", name: "#{class_name}[#{field.title}]" }
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
{
|
2
|
-
ru: {
|
4
|
+
ru: {
|
3
5
|
i18n: {
|
4
6
|
plural: {
|
5
|
-
keys: [
|
6
|
-
rule: lambda do |n|
|
7
|
+
keys: %i[zero one few many],
|
8
|
+
rule: lambda do |n|
|
7
9
|
if n == 0
|
8
10
|
:zero
|
9
11
|
elsif n % 10 == 1 && n % 100 != 11
|
@@ -16,8 +18,8 @@
|
|
16
18
|
# 0, 5-20, 25-30, 35-40...
|
17
19
|
:many
|
18
20
|
end
|
19
|
-
end
|
20
|
-
}
|
21
|
-
}
|
22
|
-
}
|
21
|
+
end
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
23
25
|
}
|
data/config/routes.rb
CHANGED
data/lib/string.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/inflector/methods'
|
2
4
|
|
3
5
|
class String
|
4
6
|
def pluralize(count = nil, locale = :en)
|
5
7
|
if locale == :ru
|
6
8
|
case count
|
7
9
|
when :many
|
8
|
-
I18n.t(
|
9
|
-
end
|
10
|
+
I18n.t('cases.')
|
11
|
+
end
|
10
12
|
else
|
11
13
|
locale = count if count.is_a? Symbol
|
12
14
|
count == 1 ? dup : ActiveSupport::Inflector.pluralize(self, locale)
|
data/lib/tramway/collection.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tramway
|
2
4
|
module Collections
|
3
5
|
module Helper
|
4
6
|
def collection_list_by(name:)
|
5
7
|
require name # needed to load class name with collection
|
6
8
|
unless ::Tramway::Collection.descendants.map(&:to_s).include?(name.camelize)
|
7
|
-
raise "There no such collection named #{name.camelize}. Please create class with self method `list` and extended of `Tramway::Collection`"
|
9
|
+
raise "There no such collection named #{name.camelize}. Please create class with self method `list` and extended of `Tramway::Collection`"
|
8
10
|
end
|
9
11
|
|
10
12
|
name.camelize.constantize.list
|
data/lib/tramway/core.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'tramway/core/engine'
|
2
4
|
require 'tramway/collection'
|
3
5
|
require 'tramway/collections/helper'
|
@@ -17,18 +19,15 @@ module Tramway
|
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
|
-
|
21
|
-
@application
|
22
|
-
end
|
22
|
+
attr_reader :application
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
# HACK FIXME
|
27
|
+
# HACK: FIXME
|
28
28
|
|
29
29
|
module ActiveModel
|
30
30
|
class Errors
|
31
|
-
def merge!(*args)
|
32
|
-
end
|
31
|
+
def merge!(*args); end
|
33
32
|
end
|
34
33
|
end
|
data/lib/tramway/core/engine.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rails/generators'
|
2
4
|
|
3
5
|
module Tramway
|
4
6
|
module Core
|
5
7
|
module Generators
|
6
8
|
class InstallGenerator < ::Rails::Generators::Base
|
7
|
-
source_root File.expand_path('
|
9
|
+
source_root File.expand_path('templates', __dir__)
|
8
10
|
|
9
11
|
def run_other_generators
|
10
12
|
generate 'audited:install'
|
data/lib/tramway/core/version.rb
CHANGED
data/lib/tramway/error.rb
CHANGED
metadata
CHANGED
@@ -1,157 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tramway-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: '1.14'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Kalashnikov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-10-
|
11
|
+
date: 2019-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: audited
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 4.8.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 4.8.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bootstrap
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '2.1'
|
34
31
|
- - ">="
|
35
32
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
33
|
+
version: 4.1.2
|
37
34
|
type: :runtime
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
|
-
- - "~>"
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '2.1'
|
44
38
|
- - ">="
|
45
39
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
40
|
+
version: 4.1.2
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
42
|
+
name: carrierwave
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
50
44
|
requirements:
|
51
45
|
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
54
|
-
- - "~>"
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: '3.5'
|
47
|
+
version: '0'
|
57
48
|
type: :runtime
|
58
49
|
prerelease: false
|
59
50
|
version_requirements: !ruby/object:Gem::Requirement
|
60
51
|
requirements:
|
61
52
|
- - ">="
|
62
53
|
- !ruby/object:Gem::Version
|
63
|
-
version:
|
64
|
-
- - "~>"
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: '3.5'
|
54
|
+
version: '0'
|
67
55
|
- !ruby/object:Gem::Dependency
|
68
|
-
name:
|
56
|
+
name: enumerize
|
69
57
|
requirement: !ruby/object:Gem::Requirement
|
70
58
|
requirements:
|
71
59
|
- - "~>"
|
72
60
|
- !ruby/object:Gem::Version
|
73
|
-
version: '
|
61
|
+
version: '2.1'
|
74
62
|
- - ">="
|
75
63
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
64
|
+
version: 2.1.2
|
77
65
|
type: :runtime
|
78
66
|
prerelease: false
|
79
67
|
version_requirements: !ruby/object:Gem::Requirement
|
80
68
|
requirements:
|
81
69
|
- - "~>"
|
82
70
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
84
|
-
- - ">="
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: 5.0.7
|
87
|
-
- !ruby/object:Gem::Dependency
|
88
|
-
name: bootstrap
|
89
|
-
requirement: !ruby/object:Gem::Requirement
|
90
|
-
requirements:
|
91
|
-
- - ">="
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: 4.1.2
|
94
|
-
type: :runtime
|
95
|
-
prerelease: false
|
96
|
-
version_requirements: !ruby/object:Gem::Requirement
|
97
|
-
requirements:
|
71
|
+
version: '2.1'
|
98
72
|
- - ">="
|
99
73
|
- !ruby/object:Gem::Version
|
100
|
-
version:
|
74
|
+
version: 2.1.2
|
101
75
|
- !ruby/object:Gem::Dependency
|
102
|
-
name:
|
76
|
+
name: font_awesome5_rails
|
103
77
|
requirement: !ruby/object:Gem::Requirement
|
104
78
|
requirements:
|
105
79
|
- - ">="
|
106
80
|
- !ruby/object:Gem::Version
|
107
|
-
version:
|
81
|
+
version: '0'
|
108
82
|
type: :runtime
|
109
83
|
prerelease: false
|
110
84
|
version_requirements: !ruby/object:Gem::Requirement
|
111
85
|
requirements:
|
112
86
|
- - ">="
|
113
87
|
- !ruby/object:Gem::Version
|
114
|
-
version:
|
88
|
+
version: '0'
|
115
89
|
- !ruby/object:Gem::Dependency
|
116
|
-
name:
|
90
|
+
name: haml-rails
|
117
91
|
requirement: !ruby/object:Gem::Requirement
|
118
92
|
requirements:
|
119
93
|
- - ">="
|
120
94
|
- !ruby/object:Gem::Version
|
121
|
-
version:
|
95
|
+
version: 1.0.0
|
122
96
|
- - "~>"
|
123
97
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
98
|
+
version: '1.0'
|
125
99
|
type: :runtime
|
126
100
|
prerelease: false
|
127
101
|
version_requirements: !ruby/object:Gem::Requirement
|
128
102
|
requirements:
|
129
103
|
- - ">="
|
130
104
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
105
|
+
version: 1.0.0
|
132
106
|
- - "~>"
|
133
107
|
- !ruby/object:Gem::Version
|
134
|
-
version: '
|
108
|
+
version: '1.0'
|
135
109
|
- !ruby/object:Gem::Dependency
|
136
|
-
name:
|
110
|
+
name: kaminari
|
137
111
|
requirement: !ruby/object:Gem::Requirement
|
138
112
|
requirements:
|
139
113
|
- - ">="
|
140
114
|
- !ruby/object:Gem::Version
|
141
|
-
version:
|
142
|
-
- - "~>"
|
143
|
-
- !ruby/object:Gem::Version
|
144
|
-
version: '2.16'
|
115
|
+
version: '0'
|
145
116
|
type: :runtime
|
146
117
|
prerelease: false
|
147
118
|
version_requirements: !ruby/object:Gem::Requirement
|
148
119
|
requirements:
|
149
120
|
- - ">="
|
150
121
|
- !ruby/object:Gem::Version
|
151
|
-
version:
|
152
|
-
- - "~>"
|
153
|
-
- !ruby/object:Gem::Version
|
154
|
-
version: '2.16'
|
122
|
+
version: '0'
|
155
123
|
- !ruby/object:Gem::Dependency
|
156
124
|
name: loofah
|
157
125
|
requirement: !ruby/object:Gem::Requirement
|
@@ -173,27 +141,27 @@ dependencies:
|
|
173
141
|
- !ruby/object:Gem::Version
|
174
142
|
version: 2.2.1
|
175
143
|
- !ruby/object:Gem::Dependency
|
176
|
-
name:
|
144
|
+
name: mini_magick
|
177
145
|
requirement: !ruby/object:Gem::Requirement
|
178
146
|
requirements:
|
179
147
|
- - ">="
|
180
148
|
- !ruby/object:Gem::Version
|
181
|
-
version:
|
149
|
+
version: 4.8.0
|
182
150
|
- - "~>"
|
183
151
|
- !ruby/object:Gem::Version
|
184
|
-
version: '
|
152
|
+
version: '4.8'
|
185
153
|
type: :runtime
|
186
154
|
prerelease: false
|
187
155
|
version_requirements: !ruby/object:Gem::Requirement
|
188
156
|
requirements:
|
189
157
|
- - ">="
|
190
158
|
- !ruby/object:Gem::Version
|
191
|
-
version:
|
159
|
+
version: 4.8.0
|
192
160
|
- - "~>"
|
193
161
|
- !ruby/object:Gem::Version
|
194
|
-
version: '
|
162
|
+
version: '4.8'
|
195
163
|
- !ruby/object:Gem::Dependency
|
196
|
-
name:
|
164
|
+
name: pg_search
|
197
165
|
requirement: !ruby/object:Gem::Requirement
|
198
166
|
requirements:
|
199
167
|
- - ">="
|
@@ -207,7 +175,7 @@ dependencies:
|
|
207
175
|
- !ruby/object:Gem::Version
|
208
176
|
version: '0'
|
209
177
|
- !ruby/object:Gem::Dependency
|
210
|
-
name:
|
178
|
+
name: reform
|
211
179
|
requirement: !ruby/object:Gem::Requirement
|
212
180
|
requirements:
|
213
181
|
- - ">="
|
@@ -221,49 +189,81 @@ dependencies:
|
|
221
189
|
- !ruby/object:Gem::Version
|
222
190
|
version: '0'
|
223
191
|
- !ruby/object:Gem::Dependency
|
224
|
-
name:
|
192
|
+
name: reform-rails
|
193
|
+
requirement: !ruby/object:Gem::Requirement
|
194
|
+
requirements:
|
195
|
+
- - '='
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: 0.1.7
|
198
|
+
type: :runtime
|
199
|
+
prerelease: false
|
200
|
+
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
requirements:
|
202
|
+
- - '='
|
203
|
+
- !ruby/object:Gem::Version
|
204
|
+
version: 0.1.7
|
205
|
+
- !ruby/object:Gem::Dependency
|
206
|
+
name: rmagick
|
225
207
|
requirement: !ruby/object:Gem::Requirement
|
226
208
|
requirements:
|
227
209
|
- - ">="
|
228
210
|
- !ruby/object:Gem::Version
|
229
|
-
version:
|
211
|
+
version: 2.16.0
|
212
|
+
- - "~>"
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '2.16'
|
230
215
|
type: :runtime
|
231
216
|
prerelease: false
|
232
217
|
version_requirements: !ruby/object:Gem::Requirement
|
233
218
|
requirements:
|
234
219
|
- - ">="
|
235
220
|
- !ruby/object:Gem::Version
|
236
|
-
version:
|
221
|
+
version: 2.16.0
|
222
|
+
- - "~>"
|
223
|
+
- !ruby/object:Gem::Version
|
224
|
+
version: '2.16'
|
237
225
|
- !ruby/object:Gem::Dependency
|
238
|
-
name:
|
226
|
+
name: sass-rails
|
239
227
|
requirement: !ruby/object:Gem::Requirement
|
240
228
|
requirements:
|
229
|
+
- - "~>"
|
230
|
+
- !ruby/object:Gem::Version
|
231
|
+
version: '5.0'
|
241
232
|
- - ">="
|
242
233
|
- !ruby/object:Gem::Version
|
243
|
-
version:
|
234
|
+
version: 5.0.7
|
244
235
|
type: :runtime
|
245
236
|
prerelease: false
|
246
237
|
version_requirements: !ruby/object:Gem::Requirement
|
247
238
|
requirements:
|
239
|
+
- - "~>"
|
240
|
+
- !ruby/object:Gem::Version
|
241
|
+
version: '5.0'
|
248
242
|
- - ">="
|
249
243
|
- !ruby/object:Gem::Version
|
250
|
-
version:
|
244
|
+
version: 5.0.7
|
251
245
|
- !ruby/object:Gem::Dependency
|
252
|
-
name:
|
246
|
+
name: simple_form
|
253
247
|
requirement: !ruby/object:Gem::Requirement
|
254
248
|
requirements:
|
255
249
|
- - ">="
|
256
250
|
- !ruby/object:Gem::Version
|
257
|
-
version:
|
251
|
+
version: 3.5.0
|
252
|
+
- - "~>"
|
253
|
+
- !ruby/object:Gem::Version
|
254
|
+
version: '3.5'
|
258
255
|
type: :runtime
|
259
256
|
prerelease: false
|
260
257
|
version_requirements: !ruby/object:Gem::Requirement
|
261
258
|
requirements:
|
262
259
|
- - ">="
|
263
260
|
- !ruby/object:Gem::Version
|
264
|
-
version:
|
261
|
+
version: 3.5.0
|
262
|
+
- - "~>"
|
263
|
+
- !ruby/object:Gem::Version
|
264
|
+
version: '3.5'
|
265
265
|
- !ruby/object:Gem::Dependency
|
266
|
-
name:
|
266
|
+
name: factory_bot_rails
|
267
267
|
requirement: !ruby/object:Gem::Requirement
|
268
268
|
requirements:
|
269
269
|
- - ">="
|
@@ -277,7 +277,7 @@ dependencies:
|
|
277
277
|
- !ruby/object:Gem::Version
|
278
278
|
version: '0'
|
279
279
|
- !ruby/object:Gem::Dependency
|
280
|
-
name:
|
280
|
+
name: pg
|
281
281
|
requirement: !ruby/object:Gem::Requirement
|
282
282
|
requirements:
|
283
283
|
- - ">="
|
@@ -291,7 +291,7 @@ dependencies:
|
|
291
291
|
- !ruby/object:Gem::Version
|
292
292
|
version: '0'
|
293
293
|
- !ruby/object:Gem::Dependency
|
294
|
-
name:
|
294
|
+
name: pry
|
295
295
|
requirement: !ruby/object:Gem::Requirement
|
296
296
|
requirements:
|
297
297
|
- - ">="
|
@@ -305,7 +305,7 @@ dependencies:
|
|
305
305
|
- !ruby/object:Gem::Version
|
306
306
|
version: '0'
|
307
307
|
- !ruby/object:Gem::Dependency
|
308
|
-
name:
|
308
|
+
name: rspec-rails
|
309
309
|
requirement: !ruby/object:Gem::Requirement
|
310
310
|
requirements:
|
311
311
|
- - ">="
|
@@ -353,6 +353,10 @@ files:
|
|
353
353
|
- app/uploaders/photo_uploader.rb
|
354
354
|
- app/views/tramway/core/shared/_input_extended.html.haml
|
355
355
|
- app/views/tramway/core/shared/_messages.html.haml
|
356
|
+
- app/views/tramway/core/shared/input_extended_types/_checkbox.html.haml
|
357
|
+
- app/views/tramway/core/shared/input_extended_types/_select.html.haml
|
358
|
+
- app/views/tramway/core/shared/input_extended_types/_simple.html.haml
|
359
|
+
- app/views/tramway/core/shared/input_extended_types/_yes_no.html.haml
|
356
360
|
- config/initializers/assets.rb
|
357
361
|
- config/initializers/carrierwave.rb
|
358
362
|
- config/initializers/plurals.rb
|