tramway-core 1.17.4.2 → 1.17.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: de93e7e3470ae4475e2562917ada23727724ed9f5d3a9e8629bb79abdc9abba3
4
- data.tar.gz: 6eb2a75350e87dfcc01c80da40090ac4c14a7ef4d6d713a1e1ec6ad6fba36e8f
3
+ metadata.gz: ace598a77cdbc2c4227978563ee8e51f86751e38114e19322e1a4dae06185d41
4
+ data.tar.gz: a5f1e7e9a031f55a34427ac989dd81d504c71c7835c6c729c3871e5b6d49e829
5
5
  SHA512:
6
- metadata.gz: 70846eaa98acc8df08009b4c5b0ee6e954c885e87342eaa17f0cbce2cb4fa25f78a51604b234170ee0502c33195e74095a5a27b14565cf04ae6612630896092a
7
- data.tar.gz: 020e281d3e91424d0af2ccf2e4f8554b2f1295b399433f7ce5238fe181d1d1fb4ec999773bd408a57af12e7386d5bd39211bc15d32e1562b3dc1d0de61e124cd
6
+ metadata.gz: 7bd0649874a75ba26c56c6babf43ac53599feeee708f07b16259cdfe4b69f51a2537669ec01749457d9df8ab77646c57c0da6902197bcc01899efead8cf89ca5
7
+ data.tar.gz: bd713b69cabb604ad37404bb73daf1f046cf13833ff4e2442fc0ba34c570695fc169da7074380bb972cc5026e52d7f21d7a0289b2df5bf1bfe4be6116807209e
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
- ## Contributors
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
- name: name, model_class_name: model_class_name
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
- method_name: e.name.to_s.gsub('=', ''), model_class: @@model_class, class_name: self.class
123
+ method_name: e.name.to_s.gsub('=', ''), model_class: @@model_class, class_name: self.class
131
124
  end
132
125
  end
@@ -6,6 +6,7 @@ module Tramway::Core::ApplicationForms::AssociationObjectHelpers
6
6
  define_polymorphic_association association, class_name
7
7
  else
8
8
  self.class.send(:define_method, "#{association}=") do |value|
9
+ model.send "#{association}_id=", value
9
10
  super class_name.find value
10
11
  end
11
12
  end
@@ -17,7 +18,7 @@ module Tramway::Core::ApplicationForms::AssociationObjectHelpers
17
18
  association_class = association_class.constantize if association_class.is_a? String
18
19
  if association_class.nil?
19
20
  Tramway::Error.raise_error :tramway, :core, :application_form, :initialize, :polymorphic_class_is_nil,
20
- association_name: association
21
+ association_name: association
21
22
  else
22
23
  super association_class.find value.split('_')[-1]
23
24
  send "#{association}_type=", association_class.to_s
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tramway::Core::ApplicationForms::ObjectHelpers
4
+ def to_model
5
+ self
6
+ end
7
+
8
+ def persisted?
9
+ model.id.nil?
10
+ end
11
+ end
@@ -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
- def association_params(form_object:, property:, value:, object:, options: {})
5
- full_class_name_association = form_object.class.full_class_name_association(property)
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
- label: false,
15
- input_html: {
16
- name: "#{object}[#{property}]",
17
- id: "#{object}_#{property}",
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.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
- full_class_names = form_object.model.class.send("#{property}_type").values.map &:constantize
29
- collection = full_class_names.map do |class_name|
30
- class_name.active.map do |obj|
31
- decorator_class(class_name).decorate obj
32
- end
33
- end.flatten.sort_by { |obj| obj.name.to_s }
34
- builded_value = if form_object.send(property).present?
35
- "#{form_object.send(property).class.to_s.underscore}_#{form_object.send(property).id}"
36
- else
37
- "#{value[:type]&.underscore}_#{value[:id]}"
38
- end
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: builded_value
32
+ name: "#{options[:object]}[#{options[:property]}]",
33
+ id: "#{options[:object]}_#{options[:property]}",
34
+ value: options[:value]
46
35
  },
47
- selected: builded_value,
48
- collection: collection,
49
- label_method: lambda do |obj|
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 else_params(property:, object:, type:, form_object:, value:, options: {})
83
- {
84
- as: type,
85
- label: false,
86
- input_html: {
87
- name: "#{object}[#{property}]",
88
- id: "#{object}_#{property}",
89
- value: (form_object.send(property) || form_object.model.send(property) || value)
90
- }
91
- }.merge options
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
- = form.label form_object.model.class.human_attribute_name property
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, **else_params(**input_params.merge(type: type))
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.is_a?(Hash) ? field.options : (JSON.parse(field.options) unless 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,7 @@
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
5
 
6
6
  def public_name
7
7
  name.to_s.gsub('_', ' ').camelize
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Tramway
4
4
  module Core
5
- VERSION = '1.17.4.2'
5
+ VERSION = '1.17.7.1'
6
6
  end
7
7
  end
@@ -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.4.2
4
+ version: 1.17.7.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-01 00:00:00.000000000 Z
12
+ date: 2020-04-10 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