formily 0.0.5.5.7

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 (162) hide show
  1. checksums.yaml +7 -0
  2. data/CODE_OF_CONDUCT.md +13 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +156 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +84 -0
  7. data/Rakefile +1 -0
  8. data/app/assets/fonts/formily-icon.eot +0 -0
  9. data/app/assets/fonts/formily-icon.svg +26 -0
  10. data/app/assets/fonts/formily-icon.ttf +0 -0
  11. data/app/assets/fonts/formily-icon.woff +0 -0
  12. data/app/assets/fonts/formily-icon.woff2 +0 -0
  13. data/app/assets/images/blank_file.png +0 -0
  14. data/app/assets/images/formily_spin.gif +0 -0
  15. data/app/assets/javascripts/formily.js +5 -0
  16. data/app/assets/javascripts/formily/base/ajax_reloader.js +24 -0
  17. data/app/assets/javascripts/formily/base/buttons.js +160 -0
  18. data/app/assets/javascripts/formily/base/form_response.js +28 -0
  19. data/app/assets/javascripts/formily/base/local_time.js +9 -0
  20. data/app/assets/javascripts/formily/editor.js +46 -0
  21. data/app/assets/javascripts/formily/editor/editor_buttons.js +186 -0
  22. data/app/assets/javascripts/formily/editor/form_preview.js +53 -0
  23. data/app/assets/javascripts/formily/editor/input_model.js +76 -0
  24. data/app/assets/javascripts/formily/editor/input_on_change.js +83 -0
  25. data/app/assets/javascripts/formily/editor/related_fields.js +76 -0
  26. data/app/assets/javascripts/formily/form.js +22 -0
  27. data/app/assets/javascripts/formily/formily_editor.js +329 -0
  28. data/app/assets/javascripts/formily/formily_modal.js +104 -0
  29. data/app/assets/javascripts/formily/formily_url.js.erb +26 -0
  30. data/app/assets/javascripts/formily/inputs/conditioned.js +4 -0
  31. data/app/assets/javascripts/formily/inputs/conditioned/checkbox.js +73 -0
  32. data/app/assets/javascripts/formily/inputs/conditioned/option.js +82 -0
  33. data/app/assets/javascripts/formily/inputs/conditioned/radio.js +160 -0
  34. data/app/assets/javascripts/formily/inputs/date_time.js +25 -0
  35. data/app/assets/javascripts/formily/inputs/input_tab.js +18 -0
  36. data/app/assets/javascripts/formily/inputs/location.js +39 -0
  37. data/app/assets/javascripts/formily/inputs/multi_file.js +228 -0
  38. data/app/assets/javascripts/formily/lib/jquery.datetimepicker.full.min.js +2 -0
  39. data/app/assets/javascripts/formily/lib/modernizr.js +8 -0
  40. data/app/assets/javascripts/formily/lib/strftime.min.js +12 -0
  41. data/app/assets/javascripts/formily/lib/tag-it.min.js +17 -0
  42. data/app/assets/javascripts/formily/mobile.js +10 -0
  43. data/app/assets/javascripts/formily_app.js +15 -0
  44. data/app/assets/javascripts/formily_iframe.js +11 -0
  45. data/app/assets/stylesheets/formily.scss +14 -0
  46. data/app/assets/stylesheets/formily/base/fonts.scss +65 -0
  47. data/app/assets/stylesheets/formily/base/layout.scss +66 -0
  48. data/app/assets/stylesheets/formily/base/links.css +7 -0
  49. data/app/assets/stylesheets/formily/base/ui-dialog.scss +129 -0
  50. data/app/assets/stylesheets/formily/editor.scss +25 -0
  51. data/app/assets/stylesheets/formily/editor/inputs_group_list.css +14 -0
  52. data/app/assets/stylesheets/formily/editor/inputs_list.css +97 -0
  53. data/app/assets/stylesheets/formily/editor/related_modal.scss +49 -0
  54. data/app/assets/stylesheets/formily/formily_editor.scss +53 -0
  55. data/app/assets/stylesheets/formily/formily_modal.scss +2 -0
  56. data/app/assets/stylesheets/formily/foundation_fix.scss +140 -0
  57. data/app/assets/stylesheets/formily/inputs/date_time.scss +8 -0
  58. data/app/assets/stylesheets/formily/inputs/multi_file.scss +111 -0
  59. data/app/assets/stylesheets/formily/jquery.datetimepicker.min.css +1 -0
  60. data/app/assets/stylesheets/formily/lib/jquery.tagit.css +69 -0
  61. data/app/assets/stylesheets/formily/modal/content.scss +36 -0
  62. data/app/assets/stylesheets/formily/modal/iframe.scss +29 -0
  63. data/app/assets/stylesheets/formily_iframe.scss +64 -0
  64. data/app/assets/stylesheets/foundation_formily.scss +20 -0
  65. data/app/controllers/formily/file_controller.rb +17 -0
  66. data/app/controllers/formily/form_types_controller.rb +46 -0
  67. data/app/controllers/formily/formilyable_controller.rb +98 -0
  68. data/app/controllers/formily/forms_controller.rb +133 -0
  69. data/app/controllers/formily/iframe/forms_controller.rb +28 -0
  70. data/app/controllers/formily/inputs_controller.rb +113 -0
  71. data/app/controllers/formily/submit_data_controller.rb +151 -0
  72. data/app/controllers/formily_controller.rb +22 -0
  73. data/app/helpers/formily_helper.rb +17 -0
  74. data/app/models/formily/checkbox_input.rb +8 -0
  75. data/app/models/formily/checkbox_input_group.rb +14 -0
  76. data/app/models/formily/date_time_input.rb +19 -0
  77. data/app/models/formily/file.rb +14 -0
  78. data/app/models/formily/form.rb +41 -0
  79. data/app/models/formily/form_type.rb +10 -0
  80. data/app/models/formily/formilyable_form.rb +18 -0
  81. data/app/models/formily/input.rb +124 -0
  82. data/app/models/formily/input_value.rb +23 -0
  83. data/app/models/formily/multiple_file_input.rb +18 -0
  84. data/app/models/formily/option_input.rb +8 -0
  85. data/app/models/formily/options_input_group.rb +14 -0
  86. data/app/models/formily/radio_input.rb +12 -0
  87. data/app/models/formily/radio_input_group.rb +14 -0
  88. data/app/models/formily/static_text.rb +8 -0
  89. data/app/models/formily/submit.rb +47 -0
  90. data/app/models/formily/text_input.rb +8 -0
  91. data/app/models/formily/textarea_input.rb +8 -0
  92. data/app/views/formily/data/_forms_table.html.haml +19 -0
  93. data/app/views/formily/data/_many_tables.html.erb +3 -0
  94. data/app/views/formily/data/_table.html.erb +33 -0
  95. data/app/views/formily/data/submit_data_table.html.haml +32 -0
  96. data/app/views/formily/editor/_default_value.haml +18 -0
  97. data/app/views/formily/editor/_editor.haml +18 -0
  98. data/app/views/formily/editor/_modal.haml +197 -0
  99. data/app/views/formily/editor/partial/_group.haml +41 -0
  100. data/app/views/formily/editor/partial/_group_input.haml +36 -0
  101. data/app/views/formily/editor/partial/_input.haml +35 -0
  102. data/app/views/formily/editor/partial/_input_fieldset.haml +12 -0
  103. data/app/views/formily/form_types/_form.haml +9 -0
  104. data/app/views/formily/form_types/edit.haml +6 -0
  105. data/app/views/formily/form_types/index.haml +24 -0
  106. data/app/views/formily/form_types/new.haml +6 -0
  107. data/app/views/formily/formilyable/index.haml +67 -0
  108. data/app/views/formily/formilyable/new.haml +37 -0
  109. data/app/views/formily/forms/_form.haml +34 -0
  110. data/app/views/formily/forms/_preview.haml +16 -0
  111. data/app/views/formily/forms/edit.haml +5 -0
  112. data/app/views/formily/forms/index.haml +40 -0
  113. data/app/views/formily/forms/new.haml +5 -0
  114. data/app/views/formily/forms/reload_formily_table.haml +4 -0
  115. data/app/views/formily/forms/show.haml +1 -0
  116. data/app/views/formily/helpers/_iframe_formily_modal.html.haml +3 -0
  117. data/app/views/formily/helpers/_related_forms.html.haml +12 -0
  118. data/app/views/formily/helpers/_related_forms_tr.html.haml +28 -0
  119. data/app/views/formily/iframe/forms/show.haml +1 -0
  120. data/app/views/formily/inputs/_group.haml +40 -0
  121. data/app/views/formily/inputs/_group_input.haml +36 -0
  122. data/app/views/formily/inputs/_input.haml +35 -0
  123. data/app/views/formily/inputs/_input_fieldset.haml +12 -0
  124. data/app/views/formily/inputs/render_input_html.haml +7 -0
  125. data/app/views/formily/partial/_form.haml +37 -0
  126. data/app/views/formily/partial/inputs/_checkbox_input.haml +18 -0
  127. data/app/views/formily/partial/inputs/_checkbox_input_group.haml +36 -0
  128. data/app/views/formily/partial/inputs/_conditioned_fields.haml +36 -0
  129. data/app/views/formily/partial/inputs/_date_time_input.haml +15 -0
  130. data/app/views/formily/partial/inputs/_file_input.haml +20 -0
  131. data/app/views/formily/partial/inputs/_file_preview.haml +14 -0
  132. data/app/views/formily/partial/inputs/_input.haml +1 -0
  133. data/app/views/formily/partial/inputs/_multiple_file_input.haml +25 -0
  134. data/app/views/formily/partial/inputs/_options_input_group.haml +77 -0
  135. data/app/views/formily/partial/inputs/_radio_input_group.haml +41 -0
  136. data/app/views/formily/partial/inputs/_static_text.haml +11 -0
  137. data/app/views/formily/partial/inputs/_text_input.haml +19 -0
  138. data/app/views/formily/partial/inputs/_textarea_input.haml +19 -0
  139. data/app/views/formily/submit_data/submit.html.erb +5 -0
  140. data/app/views/formily/submit_data/submit.json.jbuilder +5 -0
  141. data/app/views/layouts/formily_iframe.haml +16 -0
  142. data/config/routes.rb +41 -0
  143. data/formily.gemspec +41 -0
  144. data/lib/formily.rb +37 -0
  145. data/lib/formily/config.rb +72 -0
  146. data/lib/formily/engine.rb +12 -0
  147. data/lib/formily/helpers/view_helper.rb +114 -0
  148. data/lib/formily/relation.rb +26 -0
  149. data/lib/formily/relation/formily_methods.rb +30 -0
  150. data/lib/formily/relation/has_many_methods.rb +16 -0
  151. data/lib/formily/submitted_data_table.rb +74 -0
  152. data/lib/formily/version.rb +4 -0
  153. data/lib/generators/formily/install/install_generator.rb +43 -0
  154. data/lib/generators/formily/install/templates/create_formily_data.rb +28 -0
  155. data/lib/generators/formily/install/templates/create_formily_files.rb +13 -0
  156. data/lib/generators/formily/install/templates/create_formily_form_types.rb +12 -0
  157. data/lib/generators/formily/install/templates/create_formily_forms.rb +16 -0
  158. data/lib/generators/formily/install/templates/create_formily_inputs.rb +24 -0
  159. data/lib/generators/formily/install/templates/create_formilyable_forms.rb +17 -0
  160. data/lib/generators/formily/install/templates/formily.rb +21 -0
  161. data/lib/generators/formily/views/views_generator.rb +11 -0
  162. metadata +350 -0
@@ -0,0 +1,151 @@
1
+ # coding: utf-8
2
+
3
+ require 'formily/submitted_data_table'
4
+
5
+ class Formily::SubmitDataController < FormilyController
6
+
7
+ before_action :set_layout, only: [:submitted_data, :data_table]
8
+
9
+ # On formily form submit
10
+ def submit
11
+ submit = Formily::Submit.find_by(id: params[:submit_id])
12
+ inputs_ids = []
13
+ @form_id = params[:form_id]
14
+ @resource_id = params[:resource_id]
15
+ @resource_type = params[:resource_type]
16
+
17
+ @save_and_close = params[:save_and_close].present?
18
+
19
+ if params[:formily_inputs].present?
20
+
21
+ params[:formily_inputs].each do |key, value|
22
+ if value.is_a?(Hash)
23
+ value.each do |k, v|
24
+ inputs_ids << k
25
+ iv = submit.input_values.find_or_create_by(input_id: k)
26
+
27
+ if v.is_a?(Array)
28
+ v.each do |av|
29
+ f = iv.attach.build(input_value_id: iv.id)
30
+ f.file = av
31
+ f.save
32
+ iv.input_value = f.file.original_filename
33
+ end
34
+ elsif v.respond_to?('original_filename')# Detect file
35
+ f = iv.attach.build(input_value_id: iv.id)
36
+ f.file = v
37
+ f.save
38
+ iv.input_value = f.file.original_filename
39
+ else
40
+ iv.input_value = v
41
+ end
42
+
43
+ if @save_and_close
44
+ iv.save
45
+ else
46
+ if iv.input_value.blank?
47
+ iv.destroy
48
+ else
49
+ iv.save
50
+ end
51
+ end
52
+ end
53
+ else
54
+ inputs_ids << key
55
+ iv = submit.input_values.find_or_create_by(input_id: key)
56
+
57
+ if value.is_a?(Array)
58
+ value.each do |av|
59
+ f = iv.attach.build(input_value_id: iv.id)
60
+ f.file = av
61
+ f.save
62
+ iv.input_value = f.file.original_filename
63
+ end
64
+ elsif value.respond_to?('original_filename')# Detect file
65
+ f = iv.attach.build(input_value_id: iv.id)
66
+ f.file = value
67
+ f.save
68
+ iv.input_value = f.file.original_filename
69
+ else
70
+ iv.input_value = value
71
+ end
72
+
73
+ if @save_and_close
74
+ iv.save
75
+ else
76
+ if iv.input_value.blank?
77
+ iv.destroy
78
+ else
79
+ iv.save
80
+ end
81
+ end
82
+
83
+ end
84
+ end
85
+
86
+ end
87
+
88
+ submit.input_values.where.not(input_id: inputs_ids).each do |iv|
89
+ iv.destroy if iv.attach.count == 0 # don't remove files
90
+ end
91
+
92
+ if @save_and_close
93
+ submit.update_column(:state, 1)
94
+ else
95
+ submit.update_column(:state, 2)
96
+ end
97
+
98
+ end
99
+
100
+ def upload_file
101
+ submit = Formily::Submit.find(params[:submit_id])
102
+ iv = submit.input_values.find_or_create_by(input_id: params[:input_id], input_value: 'file')
103
+ f = iv.attach.build(input_value_id: iv.id)
104
+ f.file = params[:file]
105
+ f.save
106
+
107
+ render json: {file_id: f.id}, status: :ok
108
+ end
109
+
110
+ def submitted_data
111
+ model = params[:model_name].safe_constantize
112
+ model = model.find(params[:model_id])
113
+ ids = model.formily_forms.pluck(:form_id)
114
+
115
+ @forms = Formily::Form.where(id: ids)
116
+ @model_name = params[:model_name]
117
+ @model_id = params[:model_id]
118
+
119
+ render partial: formily_partial_path('data/forms_table')
120
+ end
121
+
122
+ def data_table
123
+ if params[:model_name] && params[:model_id]
124
+ model = params[:model_name].safe_constantize
125
+ model = model.find(params[:model_id])
126
+ @res = model
127
+ end
128
+
129
+ @form = Formily::Form.find(params[:form_id])
130
+ @not_manage = true
131
+ @page_name = @form.title
132
+ @data_table = Formily::SubmittedDataTable.new(@form, @res)
133
+
134
+ respond_to do |format|
135
+ format.html { render formily_partial_path('data/submit_data_table') }
136
+ format.csv { send_data @data_table.to_csv, filename: "#{@form.id}_#{@form.title.parameterize.underscore}.csv" }
137
+ end
138
+ end
139
+
140
+ private
141
+ def set_layout
142
+ if params[:iframe]
143
+ @iframe = true
144
+ Formily::SubmitDataController.layout("#{Formily.config.editor.css_style}_formily")
145
+ else
146
+ @iframe = false
147
+ Formily::SubmitDataController.layout(ApplicationController.new.send(:_layout).virtual_path.split('/').last)
148
+ end
149
+ end
150
+
151
+ end
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ class FormilyController < ActionController::Base
3
+
4
+ # Prevent CSRF attacks by raising an exception.
5
+ # For APIs, you may want to use :null_session instead.
6
+ protect_from_forgery with: :exception
7
+ before_filter :set_paper_trail_whodunnit
8
+
9
+ layout :formily_layout
10
+
11
+ protected
12
+ def authenticate
13
+ authenticate_or_request_with_http_basic do |username, password|
14
+ username == 'admin' && password == '123456'
15
+ end
16
+ end
17
+
18
+ def formily_layout
19
+ ApplicationController.new.send(:_layout).virtual_path.split('/').last
20
+ end
21
+
22
+ end
@@ -0,0 +1,17 @@
1
+ module FormilyHelper
2
+
3
+
4
+ def submit_title(form_title, submit)
5
+ title = form_title
6
+
7
+ if submit && submit.input_values.count > 0
8
+ title += ' ' + submit.created_at.utc.to_i.to_s
9
+ user_name = User.find_by(id: submit.versions.last.whodunnit.to_i).to_s
10
+ user_name = 'User' if user_name.blank?
11
+ title += ' by ' + user_name
12
+ end
13
+
14
+ title
15
+ end
16
+
17
+ end
@@ -0,0 +1,8 @@
1
+ # coding: utf-8
2
+ class Formily::CheckboxInput < Formily::Input
3
+
4
+ def editor_type
5
+ 'checkbox'
6
+ end
7
+
8
+ end
@@ -0,0 +1,14 @@
1
+ # coding: utf-8
2
+ class Formily::CheckboxInputGroup < Formily::Input
3
+
4
+ has_many :inputs, foreign_key: :group_input_id, class_name: 'Formily::CheckboxInput'
5
+
6
+ def editor_type
7
+ 'checkbox group'
8
+ end
9
+
10
+ def input_type
11
+ 'Formily::CheckboxInput'
12
+ end
13
+
14
+ end
@@ -0,0 +1,19 @@
1
+ # coding: utf-8
2
+ class Formily::DateTimeInput < Formily::Input
3
+
4
+ def editor_type
5
+ 'datetime'
6
+ end
7
+
8
+ def get_value_from_submit(submit)
9
+ val = submit.input_values.where(input_id: self.id).pluck(:input_value).first || '' rescue ''
10
+
11
+ if val.blank?
12
+ self.default_value || ''
13
+ else
14
+ val
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,14 @@
1
+ # coding: utf-8
2
+ class Formily::File < ActiveRecord::Base
3
+
4
+ self.table_name = 'formily_files'
5
+
6
+ has_paper_trail
7
+
8
+ has_attached_file :file,
9
+ path: Formily.config.paperclip.path,
10
+ url: Formily.config.paperclip.url,
11
+ use_timestamp: Formily.config.paperclip.use_timestamp
12
+ validates_attachment_content_type :file, content_type: /\A.*\z/
13
+
14
+ end
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+ class Formily::Form < ActiveRecord::Base
3
+
4
+ after_destroy :delete_data
5
+ before_create :set_default
6
+
7
+ self.table_name = 'formily_forms'
8
+
9
+ has_paper_trail
10
+
11
+ belongs_to :form_type, foreign_key: :form_type_id, class_name: 'Formily::FormType'
12
+ has_many :inputs, foreign_key: :form_id, class_name: 'Formily::Input'
13
+ has_many :submits, foreign_key: :form_id, class_name: 'Formily::Submit'
14
+
15
+ def form_inputs
16
+ self.inputs.where('group_input_id IS NULL')
17
+ end
18
+
19
+ def get_submits(obj, user_id)
20
+ Formily::Submit.where(form_id: self.id, resource_id: obj.id,
21
+ user_id: user_id, resource_type: obj.class.name).order(created_at: :desc)
22
+ end
23
+
24
+ def response_url(*args)
25
+ '#response'
26
+ end
27
+
28
+ private
29
+
30
+ def delete_data
31
+ self.inputs.destroy_all
32
+ self.submits.destroy_all
33
+ Formily::FormilyableForm.where(form_id: self.id).destroy_all
34
+ end
35
+
36
+ def set_default
37
+ self.is_deleted = false if self.is_deleted.nil?
38
+ true # Fix
39
+ end
40
+
41
+ end
@@ -0,0 +1,10 @@
1
+ # coding: utf-8
2
+ class Formily::FormType < ActiveRecord::Base
3
+
4
+ self.table_name = 'formily_form_types'
5
+
6
+ has_paper_trail
7
+
8
+ has_many :forms, foreign_key: :form_type_id, class_name: 'Formily::Form'
9
+
10
+ end
@@ -0,0 +1,18 @@
1
+ # coding: utf-8
2
+ class Formily::FormilyableForm < ActiveRecord::Base
3
+
4
+ self.table_name = 'formilyable_forms'
5
+
6
+ has_paper_trail
7
+
8
+ belongs_to :formilyable, polymorphic: true
9
+ belongs_to :form, foreign_key: :form_id, class_name: 'Formily::Form'
10
+
11
+ validates_uniqueness_of :form_id, :scope => [:formilyable_id, :formilyable_type]
12
+ validates :form_id, :formilyable_id, :formilyable_type, presence: true
13
+
14
+ def formily_title
15
+ self.formilyable_type.safe_constantize.find(self.formilyable_id).formily_title rescue ''
16
+ end
17
+
18
+ end
@@ -0,0 +1,124 @@
1
+ # coding: utf-8
2
+ class Formily::Input < ActiveRecord::Base
3
+
4
+ after_destroy :delete_data
5
+ before_create :set_default
6
+
7
+ self.table_name = 'formily_inputs'
8
+
9
+ has_paper_trail
10
+
11
+ has_many :data, foreign_key: :input_id, class_name: 'Formily::InputValue'
12
+ belongs_to :form, foreign_key: :form_id, class_name: 'Formily::Form'
13
+ # Query fix relation
14
+ has_many :inputs, foreign_key: :group_input_id, class_name: 'Formily::Input'
15
+ belongs_to :group_input, foreign_key: :group_input_id, class_name: 'Formily::Input'
16
+
17
+ default_scope ->{ order(:field_order) }
18
+
19
+ def render_attributes
20
+ tag_attr = JSON.parse(self.tag_attributes) rescue {}
21
+
22
+ if tag_attr['formily_conditioned'].present?
23
+ tag_attr.delete('formily_conditioned')
24
+ end
25
+
26
+ tag_attr.map{|k, v| "#{k}=\"#{v}\""}.join(' ').html_safe
27
+ end
28
+
29
+ def render_attributes_hash
30
+ JSON.parse(self.tag_attributes).except('formily_conditioned') rescue {}
31
+ end
32
+
33
+ def conditioned_tag
34
+ tag_attr = JSON.parse(self.tag_attributes) rescue {}
35
+
36
+ if tag_attr['formily_conditioned'].present?
37
+ tag_attr['formily_conditioned']
38
+ else
39
+ ''
40
+ end
41
+ end
42
+
43
+ def partial_path
44
+ 'formily/partial/inputs/' + self.class.name.demodulize.underscore
45
+ end
46
+
47
+ def to_html
48
+ "<label>#{self.label}<input type=\"text\" name=\"formily_inputs[#{self.name}]\"/></label>"
49
+ end
50
+
51
+ def editor_type
52
+ 'input'
53
+ end
54
+
55
+ def get_value_from_submit(submit, controller = nil)
56
+ val = if submit.present?
57
+ submit.input_values.where(input_id: self.id).pluck(:input_value).first || nil rescue nil
58
+ else
59
+ nil
60
+ end
61
+
62
+
63
+ get_default_value(val, controller)
64
+ end
65
+
66
+ def get_default_value(val, controller)
67
+
68
+ if val.blank?
69
+ if self.default_value.present?
70
+
71
+ case self.default_value
72
+
73
+ when 'Date'
74
+ DateTime.now.strftime('%Y/%m/%d')
75
+ when 'DateTime'
76
+ DateTime.now.strftime('%Y/%m/%d %H:%M')
77
+ when 'current_user_name'
78
+ controller.current_user.name rescue ''
79
+ when 'device_location'
80
+ 'device_location'
81
+ when 'related_value'
82
+ tag_attr = JSON.parse(self.tag_attributes) rescue {}
83
+ val_arr = tag_attr['data-related'].split('.')
84
+
85
+ @obj_rel = if val_arr.first =~ /->/
86
+ m = val_arr.first.sub(/.*?->/, '').safe_constantize
87
+ user_id = controller.instance_variable_get('@user_id')
88
+ if user_id
89
+ m.find(user_id)
90
+ else
91
+ m.order('RANDOM()').first rescue nil
92
+ end
93
+ else
94
+ m = controller.instance_variable_get('@obj_rel')
95
+ m || val_arr.first.safe_constantize
96
+ end
97
+
98
+ val_arr[1..-1].inject(@obj_rel){|obj, t| obj.send(t) } rescue ''
99
+
100
+ else
101
+ self.default_value
102
+ end
103
+
104
+ else
105
+ self.tag_attributes =~ /"readonly":"readonly"/ ? self.label : val
106
+ end
107
+ else
108
+ val
109
+ end
110
+ end
111
+
112
+ private
113
+
114
+ def delete_data
115
+ self.inputs.destroy_all
116
+ self.data.destroy_all
117
+ end
118
+
119
+ def set_default
120
+ self.is_deleted = false if self.is_deleted.nil?
121
+ true # Fix
122
+ end
123
+
124
+ end