tramway-core 1.17.5 → 1.17.7.2
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/README.md +28 -2
- data/app/forms/tramway/core/application_form.rb +3 -10
- data/app/forms/tramway/core/application_forms/association_object_helpers.rb +1 -1
- data/app/forms/tramway/core/application_forms/object_helpers.rb +11 -0
- data/app/forms/tramway/core/extendable_forms_helpers/class_builder.rb +1 -1
- data/app/helpers/tramway/core/inputs/associations_helper.rb +28 -0
- data/app/helpers/tramway/core/inputs/polymorphic_associations_helper.rb +24 -0
- data/app/helpers/tramway/core/inputs_helper.rb +51 -54
- data/app/views/tramway/core/shared/_input.html.haml +3 -2
- data/app/views/tramway/core/shared/input_extended_types/_select.html.haml +1 -1
- data/lib/tramway/core/application.rb +2 -1
- data/lib/tramway/core/version.rb +1 -1
- data/lib/yaml/errors.yml +5 -2
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea351fe0ccc735e8df8c11efd9136b6f5d3287b0bd9d7d0e98fe94bd74c9b070
|
4
|
+
data.tar.gz: 11ea49c81f3ace9ffc97f4b3396ba52ce7d61135dbc50eb621e2ccbca342d05a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26bd97b39c3494f4d7356905397f5ec68d3fce0cecb839a4d731efdbe81a80da6e48f1bd8bb50528cd530cc500a580c1752df3991f992f807963aa51c77482c2
|
7
|
+
data.tar.gz: 435a9723200273b1c857c668c144b26d07183f422c97f2c1aead5134ab38ae660fe09042de475b77b937b76ac2f8498fe0cdf09f04b64a44c7765c5b96b52fb8
|
data/README.md
CHANGED
@@ -157,7 +157,7 @@ copy_to_clipboard "some_id" # some_id is HTML id of element. Content of this ele
|
|
157
157
|
#### 1. Generate model that you to use. We create Organization, for example
|
158
158
|
|
159
159
|
```shell
|
160
|
-
rails g model organization name:text public_name:text tagline:text address:text phone:text coordinates:point, state: text # remember! State field is required, if you use tramway-admin
|
160
|
+
rails g model organization name:text public_name:text tagline:text address:text phone:text coordinates:point, state: text, favicon:text # remember! State field is required, if you use tramway-admin
|
161
161
|
rails db:migrate
|
162
162
|
```
|
163
163
|
|
@@ -203,10 +203,36 @@ Tramway::Admin.set_singleton_models Organization, project: :organization # now y
|
|
203
203
|
* models - часто используемые в моделях слова
|
204
204
|
* state_machines - локализация состояний
|
205
205
|
|
206
|
-
##
|
206
|
+
## Contribution
|
207
|
+
|
208
|
+
### Contributors
|
207
209
|
|
208
210
|
* [Pavel Kalashnikov](https://github.com/kalashnikovisme)
|
209
211
|
* [moshinaan](https://github.com/moshinaan)
|
210
212
|
|
213
|
+
### Workflow
|
214
|
+
|
215
|
+
#### If you don't have access to push gem to rubygems then
|
216
|
+
|
217
|
+
Just create PR to develop branch
|
218
|
+
|
219
|
+
#### If you have access to push gem to rubygems then
|
220
|
+
|
221
|
+
* Create PR to develop branch
|
222
|
+
* After merging PR you should create new release via git-flow this way
|
223
|
+
|
224
|
+
```shell
|
225
|
+
git release start (version which you upgraded in lib/tramway-core/version.rb file)
|
226
|
+
git release finish (version which you upgraded in lib/tramway-core/version.rb file)
|
227
|
+
git push origin develop
|
228
|
+
git push origin master
|
229
|
+
```
|
230
|
+
|
231
|
+
* Then push new version of the gem
|
232
|
+
|
233
|
+
```shell
|
234
|
+
rm -rf *.gem && gem build $(basename "$PWD").gemspec && gem push *.gem
|
235
|
+
```
|
236
|
+
|
211
237
|
## License
|
212
238
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
@@ -4,6 +4,7 @@ class Tramway::Core::ApplicationForm < ::Reform::Form
|
|
4
4
|
include Tramway::Core::ApplicationForms::AssociationObjectHelpers
|
5
5
|
include Tramway::Core::ApplicationForms::ConstantObjectActions
|
6
6
|
include Tramway::Core::ApplicationForms::PropertiesObjectHelper
|
7
|
+
include Tramway::Core::ApplicationForms::ObjectHelpers
|
7
8
|
|
8
9
|
attr_accessor :submit_message
|
9
10
|
|
@@ -38,14 +39,6 @@ class Tramway::Core::ApplicationForm < ::Reform::Form
|
|
38
39
|
@@associations
|
39
40
|
end
|
40
41
|
|
41
|
-
def to_model
|
42
|
-
self
|
43
|
-
end
|
44
|
-
|
45
|
-
def persisted?
|
46
|
-
model.id.nil?
|
47
|
-
end
|
48
|
-
|
49
42
|
class << self
|
50
43
|
include Tramway::Core::ApplicationForms::ConstantClassActions
|
51
44
|
|
@@ -96,7 +89,7 @@ class Tramway::Core::ApplicationForm < ::Reform::Form
|
|
96
89
|
@@model_class = model_class_name.constantize
|
97
90
|
rescue StandardError
|
98
91
|
Tramway::Error.raise_error :tramway, :core, :application_form, :model_class, :there_is_not_model_class,
|
99
|
-
|
92
|
+
name: name, model_class_name: model_class_name
|
100
93
|
end
|
101
94
|
end
|
102
95
|
end
|
@@ -127,6 +120,6 @@ class Tramway::Core::ApplicationForm < ::Reform::Form
|
|
127
120
|
Tramway::Error.raise_error :tramway, :core, :application_form, :save, :argument_error, message: e.message
|
128
121
|
rescue StandardError => e
|
129
122
|
Tramway::Error.raise_error :tramway, :core, :application_form, :save, :looks_like_you_have_method,
|
130
|
-
|
123
|
+
method_name: e.name.to_s.gsub('=', ''), model_class: @@model_class, class_name: self.class
|
131
124
|
end
|
132
125
|
end
|
@@ -18,7 +18,7 @@ module Tramway::Core::ApplicationForms::AssociationObjectHelpers
|
|
18
18
|
association_class = association_class.constantize if association_class.is_a? String
|
19
19
|
if association_class.nil?
|
20
20
|
Tramway::Error.raise_error :tramway, :core, :application_form, :initialize, :polymorphic_class_is_nil,
|
21
|
-
|
21
|
+
association_name: association
|
22
22
|
else
|
23
23
|
super association_class.find value.split('_')[-1]
|
24
24
|
send "#{association}_type=", association_class.to_s
|
@@ -22,7 +22,7 @@ module Tramway::Core::ExtendableFormsHelpers::ClassBuilder
|
|
22
22
|
case property[1][:object].field_type
|
23
23
|
when 'file'
|
24
24
|
field = property[1][:object]
|
25
|
-
define_file_property_assignment_method property field
|
25
|
+
define_file_property_assignment_method property, field
|
26
26
|
else
|
27
27
|
next unless property[1][:validates].present?
|
28
28
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tramway::Core::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.active.send("#{current_user.role}_scope", current_user.id).map do |obj|
|
8
|
+
decorator_class(full_class_name_association).decorate obj
|
9
|
+
end.sort_by(&:name)
|
10
|
+
end
|
11
|
+
|
12
|
+
def build_value_for_association(form_object, property, value)
|
13
|
+
form_object.send(property) || form_object.model.send("#{property}_id") || value
|
14
|
+
end
|
15
|
+
|
16
|
+
def check_valid_association(full_class_name_association)
|
17
|
+
unless full_class_name_association
|
18
|
+
Tramway::Error.raise_error(
|
19
|
+
:tramway, :core, :inputs_helpers, :association_params, :defined_with_property_method, property: property
|
20
|
+
)
|
21
|
+
end
|
22
|
+
return unless full_class_name_association.is_a? Array
|
23
|
+
|
24
|
+
Tramway::Error.raise_error(
|
25
|
+
:tramway, :core, :inputs_helpers, :association_params, :used_polymorphic_association, property: property
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tramway::Core::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.active.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
|
+
else
|
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,58 +1,41 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Tramway::Core::InputsHelper
|
4
|
-
|
5
|
-
|
6
|
-
unless full_class_name_association
|
7
|
-
raise "It seems you've defined association attributes with `property` method. Please, use `association` method. `association :#{property}`"
|
8
|
-
end
|
9
|
-
if full_class_name_association.is_a? Array
|
10
|
-
raise "It seems you've used `association` input type in the Form. Please, use `polymorphic_association` type. `#{property}: :polymorphic_association`"
|
11
|
-
end
|
4
|
+
include Tramway::Core::Inputs::AssociationsHelper
|
5
|
+
include Tramway::Core::Inputs::PolymorphicAssociationsHelper
|
12
6
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
value: (form_object.send(property) || form_object.model.send("#{property}_id") || value)
|
19
|
-
},
|
20
|
-
selected: (form_object.model.send("#{property}_id") || value),
|
21
|
-
collection: full_class_name_association.active.send("#{current_user.role}_scope", current_user.id).map do |obj|
|
22
|
-
decorator_class(full_class_name_association).decorate obj
|
23
|
-
end.sort_by(&:name)
|
24
|
-
}.merge options
|
7
|
+
def association_params(form_object:, property:, value:, object:, options: {})
|
8
|
+
build_input_attributes(object: object, property: property, options: options,
|
9
|
+
value: build_value_for_association(form_object, property, value),
|
10
|
+
collection: build_collection_for_association(form_object, property),
|
11
|
+
selected: form_object.model.send("#{property}_id") || value)
|
25
12
|
end
|
26
13
|
|
27
14
|
def polymorphic_association_params(object:, form_object:, property:, value:, options: {})
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
15
|
+
build_input_attributes object: object, property: property,
|
16
|
+
selected: build_value_for_polymorphic_association(form_object, property, value),
|
17
|
+
value: build_value_for_polymorphic_association(form_object, property, value),
|
18
|
+
collection: build_collection_for_polymorphic_association(form_object, property),
|
19
|
+
options: options.merge(
|
20
|
+
as: :select,
|
21
|
+
label_method: ->(obj) { "#{obj.class.model_name.human} | #{obj.name}" },
|
22
|
+
value_method: lambda { |obj|
|
23
|
+
"#{obj.class.to_s.underscore.sub(/_decorator$/, '')}_#{obj.id}"
|
24
|
+
}
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def build_input_attributes(**options)
|
39
29
|
{
|
40
|
-
as: :select,
|
41
30
|
label: false,
|
42
31
|
input_html: {
|
43
|
-
name: "#{object}[#{property}]",
|
44
|
-
id: "#{object}_#{property}",
|
45
|
-
value:
|
32
|
+
name: "#{options[:object]}[#{options[:property]}]",
|
33
|
+
id: "#{options[:object]}_#{options[:property]}",
|
34
|
+
value: options[:value]
|
46
35
|
},
|
47
|
-
selected:
|
48
|
-
collection: collection
|
49
|
-
|
50
|
-
"#{obj.class.model_name.human} | #{obj.name}"
|
51
|
-
end,
|
52
|
-
value_method: lambda do |obj|
|
53
|
-
"#{obj.class.to_s.underscore.sub(/_decorator$/, '')}_#{obj.id}"
|
54
|
-
end
|
55
|
-
}.merge options
|
36
|
+
selected: options[:selected],
|
37
|
+
collection: options[:collection]
|
38
|
+
}.merge options[:options]
|
56
39
|
end
|
57
40
|
|
58
41
|
def value_from_params(model_class:, property:, type:)
|
@@ -79,15 +62,29 @@ module Tramway::Core::InputsHelper
|
|
79
62
|
}.merge options
|
80
63
|
end
|
81
64
|
|
82
|
-
def
|
83
|
-
{
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
65
|
+
def simple_params(**options)
|
66
|
+
builded_options = { as: options[:type], label: false,
|
67
|
+
input_html: {
|
68
|
+
name: "#{options[:object]}[#{options[:property]}]",
|
69
|
+
id: "#{options[:object]}_#{options[:property]}",
|
70
|
+
value: build_simple_value(
|
71
|
+
*options.values_at(:form_object, :property, :value),
|
72
|
+
options.dig(:options, :input_html, :value)
|
73
|
+
)
|
74
|
+
} }
|
75
|
+
merge_with_user_options builded_options, options
|
76
|
+
end
|
77
|
+
|
78
|
+
def build_simple_value(form_object, property, value, input_html_value)
|
79
|
+
value_to_add = input_html_value || value
|
80
|
+
value_to_add || form_object.send(property)
|
81
|
+
end
|
82
|
+
|
83
|
+
def merge_with_user_options(builded_options, options)
|
84
|
+
if options[:options].present?
|
85
|
+
options[:options].dig(:input_html)&.delete(:value)
|
86
|
+
builded_options.merge!(options) || {}
|
87
|
+
end
|
88
|
+
builded_options
|
92
89
|
end
|
93
90
|
end
|
@@ -6,7 +6,8 @@
|
|
6
6
|
- type = type[:type]
|
7
7
|
- if type.class.in?([ Symbol, String ]) || type&.dig(:input_options)
|
8
8
|
- type = type.to_sym
|
9
|
-
|
9
|
+
- unless type == :hidden
|
10
|
+
= form.label form_object.model.class.human_attribute_name property
|
10
11
|
- case type
|
11
12
|
- when :default
|
12
13
|
= form.input property, **default_params(**input_params)
|
@@ -15,7 +16,7 @@
|
|
15
16
|
- when :polymorphic_association
|
16
17
|
= form.input property, **polymorphic_association_params(**input_params.merge(value: value))
|
17
18
|
- else
|
18
|
-
= form.input property, **
|
19
|
+
= form.input property, **simple_params(**input_params.merge(type: type))
|
19
20
|
- else
|
20
21
|
- property_value = form_object.model.values.present? && form_object.model.values[property.to_s]
|
21
22
|
= render 'tramway/core/shared/input_extended', field: type[:extended_form_property], class_name: :record, value: property_value, f: form
|
@@ -1,4 +1,4 @@
|
|
1
|
-
- parsed_json = field.options
|
1
|
+
- parsed_json = field.options&.is_a?(Hash) ? field.options : (JSON.parse(field.options) if field.options.present?)
|
2
2
|
- if parsed_json&.dig('collection', 'name')
|
3
3
|
- if value.present?
|
4
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, required: field.required
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Tramway::Core::Application
|
4
|
-
attr_accessor :name, :url, :model_class, :title, :tagline, :found_date, :phone, :email, :main_image
|
4
|
+
attr_accessor :name, :url, :model_class, :title, :tagline, :found_date, :phone, :email, :main_image, :favicon,
|
5
|
+
:short_description
|
5
6
|
|
6
7
|
def public_name
|
7
8
|
name.to_s.gsub('_', ' ').camelize
|
data/lib/tramway/core/version.rb
CHANGED
data/lib/yaml/errors.yml
CHANGED
@@ -4,6 +4,10 @@ tramway:
|
|
4
4
|
collection_list_by:
|
5
5
|
there_no_such_collection: "There no such collection named %{name_camelize}. Please create class with self method `list` and extended of `Tramway::Collection`. You should reload your server after creating this collection."
|
6
6
|
core:
|
7
|
+
input_helper:
|
8
|
+
association_params:
|
9
|
+
defined_with_property_method: "It seems you've defined association attributes with `property` method. Please, use `association` method. `association :%{property}`"
|
10
|
+
use_polymorphic_association: "It seems you've used `association` input type in the Form. Please, use `polymorphic_association` type. `%{property}: :polymorphic_association`"
|
7
11
|
title_helper:
|
8
12
|
title:
|
9
13
|
you_should_set_tramway_core_application: "You should set Tramway::Core::Application class using `::Tramway::Core.initialize_application model_class: #{model_class_name}` in config/initializers/tramway.rb OR maybe you don't have any records of application model"
|
@@ -31,7 +35,6 @@ tramway:
|
|
31
35
|
attributes:
|
32
36
|
method_is_reserved_word: "Method `%{attribute_name}` is reserved word. Please, create or delegate method in %{class_name} with another name."
|
33
37
|
title:
|
34
|
-
please_implement_title: "Please, implement `title` method in a %{class_name} or %{object_class}"
|
38
|
+
please_implement_title: "Please, implement `title` method in a %{class_name} or delegate it from %{object_class}"
|
35
39
|
link:
|
36
40
|
method_link_uses_file_attribute: "Method `link` uses `file` attribute of the decorated object. If decorated object doesn't contain `file`, you shouldn't use `link` method."
|
37
|
-
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tramway-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.17.
|
4
|
+
version: 1.17.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Kalashnikov
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-04-
|
12
|
+
date: 2020-04-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: audited
|
@@ -365,6 +365,7 @@ files:
|
|
365
365
|
- app/forms/tramway/core/application_forms/association_object_helpers.rb
|
366
366
|
- app/forms/tramway/core/application_forms/constant_class_actions.rb
|
367
367
|
- app/forms/tramway/core/application_forms/constant_object_actions.rb
|
368
|
+
- app/forms/tramway/core/application_forms/object_helpers.rb
|
368
369
|
- app/forms/tramway/core/application_forms/properties_object_helper.rb
|
369
370
|
- app/forms/tramway/core/extendable_form.rb
|
370
371
|
- app/forms/tramway/core/extendable_forms_helpers/class_builder.rb
|
@@ -378,6 +379,8 @@ files:
|
|
378
379
|
- app/forms/tramway/core/form_creator.rb
|
379
380
|
- app/helpers/tramway/core/application_helper.rb
|
380
381
|
- app/helpers/tramway/core/copy_to_clipboard_helper.rb
|
382
|
+
- app/helpers/tramway/core/inputs/associations_helper.rb
|
383
|
+
- app/helpers/tramway/core/inputs/polymorphic_associations_helper.rb
|
381
384
|
- app/helpers/tramway/core/inputs_helper.rb
|
382
385
|
- app/helpers/tramway/core/title_helper.rb
|
383
386
|
- app/inputs/date_picker_input.rb
|