tramway-core 1.17.6 → 1.17.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +27 -1
- 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 +37 -50
- data/app/views/tramway/core/shared/input_extended_types/_select.html.haml +1 -1
- data/lib/tramway/core/version.rb +1 -1
- data/lib/yaml/errors.yml +4 -1
- 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: d406acc40d7905296b2257e659b8f5135d8b3caeb3accb877e092a3e1d4b43d6
|
4
|
+
data.tar.gz: 3b08362b8b0e3ab614df712ff887c59202e002ae7d894c6712d5007b4b10bbb2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c680f805536cb1b02f53d8919ef685b3d4d591d2bc68d2679021b72d96fba9c1ffdb9926dc9c108874d73ed5b1de0eb72161d6b7caf5f9972d83dc1a0bb5b5e6
|
7
|
+
data.tar.gz: 51b5f3715c11f83bed392d62f678ed60262cc848d0f4e34941c2693071ffe150821a293cf653195407565aeaf291b844d9086d27771b92a61c77d265e939b261
|
data/README.md
CHANGED
@@ -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 do |obj|
|
23
|
+
"#{obj.class.to_s.underscore.sub(/_decorator$/, '')}_#{obj.id}"
|
24
|
+
end
|
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,19 @@ module Tramway::Core::InputsHelper
|
|
79
62
|
}.merge options
|
80
63
|
end
|
81
64
|
|
82
|
-
def else_params(
|
65
|
+
def else_params(**options)
|
83
66
|
{
|
84
|
-
as: type,
|
67
|
+
as: options[:type],
|
85
68
|
label: false,
|
86
69
|
input_html: {
|
87
|
-
name: "#{object}[#{property}]",
|
88
|
-
id: "#{object}_#{property}",
|
89
|
-
value: (form_object
|
70
|
+
name: "#{options[:object]}[#{options[:property]}]",
|
71
|
+
id: "#{options[:object]}_#{options[:property]}",
|
72
|
+
value: build_else_value(options[:form_object], options[:property], options[:value])
|
90
73
|
}
|
91
|
-
}.merge options
|
74
|
+
}.merge options[:options] || {}
|
75
|
+
end
|
76
|
+
|
77
|
+
def build_else_value(form_object, property, value)
|
78
|
+
form_object.send(property) ? form_object.model.send(property) : value
|
92
79
|
end
|
93
80
|
end
|
@@ -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
|
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"
|
@@ -34,4 +38,3 @@ tramway:
|
|
34
38
|
please_implement_title: "Please, implement `title` method in a %{class_name} or %{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.6
|
4
|
+
version: 1.17.6.1
|
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-06 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
|