anoubis 1.0.0

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 (188) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +38 -0
  5. data/app/controllers/anoubis/application_controller.rb +78 -0
  6. data/app/controllers/anoubis/core/application_controller.rb +343 -0
  7. data/app/controllers/anoubis/core/data/actions.rb +962 -0
  8. data/app/controllers/anoubis/core/data/callbacks.rb +68 -0
  9. data/app/controllers/anoubis/core/data/convert.rb +407 -0
  10. data/app/controllers/anoubis/core/data/defaults.rb +217 -0
  11. data/app/controllers/anoubis/core/data/get.rb +531 -0
  12. data/app/controllers/anoubis/core/data/load.rb +89 -0
  13. data/app/controllers/anoubis/core/data/set.rb +49 -0
  14. data/app/controllers/anoubis/core/data/setup.rb +104 -0
  15. data/app/controllers/anoubis/core/data_controller.rb +28 -0
  16. data/app/controllers/anoubis/core/index/actions.rb +53 -0
  17. data/app/controllers/anoubis/core/index/callbacks.rb +23 -0
  18. data/app/controllers/anoubis/core/index_controller.rb +36 -0
  19. data/app/controllers/anoubis/etc/base.rb +52 -0
  20. data/app/controllers/anoubis/etc/data.rb +89 -0
  21. data/app/controllers/anoubis/etc/field.rb +468 -0
  22. data/app/controllers/anoubis/etc/field_options.rb +83 -0
  23. data/app/controllers/anoubis/etc/field_order.rb +51 -0
  24. data/app/controllers/anoubis/etc/filter.rb +251 -0
  25. data/app/controllers/anoubis/etc/menu.rb +101 -0
  26. data/app/controllers/anoubis/etc/model.rb +67 -0
  27. data/app/controllers/anoubis/etc/tab_item.rb +91 -0
  28. data/app/controllers/anoubis/etc.rb +8 -0
  29. data/app/controllers/anoubis/export.rb +47 -0
  30. data/app/controllers/anoubis/output/autocomplete.rb +30 -0
  31. data/app/controllers/anoubis/output/basic.rb +86 -0
  32. data/app/controllers/anoubis/output/data.rb +101 -0
  33. data/app/controllers/anoubis/output/delete.rb +41 -0
  34. data/app/controllers/anoubis/output/edit.rb +55 -0
  35. data/app/controllers/anoubis/output/frame.rb +227 -0
  36. data/app/controllers/anoubis/output/login.rb +71 -0
  37. data/app/controllers/anoubis/output/menu.rb +220 -0
  38. data/app/controllers/anoubis/output/update.rb +43 -0
  39. data/app/controllers/anoubis/sso/client/application_controller.rb +139 -0
  40. data/app/controllers/anoubis/sso/client/data/actions.rb +5 -0
  41. data/app/controllers/anoubis/sso/client/data/callbacks.rb +5 -0
  42. data/app/controllers/anoubis/sso/client/data/convert.rb +5 -0
  43. data/app/controllers/anoubis/sso/client/data/defaults.rb +5 -0
  44. data/app/controllers/anoubis/sso/client/data/get.rb +5 -0
  45. data/app/controllers/anoubis/sso/client/data/load.rb +26 -0
  46. data/app/controllers/anoubis/sso/client/data/set.rb +5 -0
  47. data/app/controllers/anoubis/sso/client/data/setup.rb +5 -0
  48. data/app/controllers/anoubis/sso/client/data_controller.rb +21 -0
  49. data/app/controllers/anoubis/sso/client/index/actions.rb +79 -0
  50. data/app/controllers/anoubis/sso/client/index/callbacks.rb +13 -0
  51. data/app/controllers/anoubis/sso/client/index_controller.rb +18 -0
  52. data/app/controllers/anoubis/sso/server/application_controller.rb +49 -0
  53. data/app/controllers/anoubis/sso/server/login_controller.rb +342 -0
  54. data/app/controllers/anoubis/sso/server/user_controller.rb +142 -0
  55. data/app/controllers/anoubis/tenant/application_controller.rb +54 -0
  56. data/app/controllers/anoubis/tenant/data/actions.rb +11 -0
  57. data/app/controllers/anoubis/tenant/data/callbacks.rb +11 -0
  58. data/app/controllers/anoubis/tenant/data/convert.rb +11 -0
  59. data/app/controllers/anoubis/tenant/data/defaults.rb +11 -0
  60. data/app/controllers/anoubis/tenant/data/get.rb +11 -0
  61. data/app/controllers/anoubis/tenant/data/load.rb +52 -0
  62. data/app/controllers/anoubis/tenant/data/set.rb +11 -0
  63. data/app/controllers/anoubis/tenant/data/setup.rb +11 -0
  64. data/app/controllers/anoubis/tenant/data_controller.rb +28 -0
  65. data/app/controllers/anoubis/tenant/index/actions.rb +191 -0
  66. data/app/controllers/anoubis/tenant/index/callbacks.rb +11 -0
  67. data/app/controllers/anoubis/tenant/index_controller.rb +38 -0
  68. data/app/controllers/anoubis/tenants_controller.rb +7 -0
  69. data/app/controllers/anoubis/users_controller.rb +7 -0
  70. data/app/jobs/anoubis/application_job.rb +6 -0
  71. data/app/mailers/anoubis/application_mailer.rb +8 -0
  72. data/app/models/anoubis/application_record.rb +45 -0
  73. data/app/models/anoubis/core/application_record.rb +250 -0
  74. data/app/models/anoubis/core/locales.rb +27 -0
  75. data/app/models/anoubis/sso/client/application_record.rb +3 -0
  76. data/app/models/anoubis/sso/client/group.rb +19 -0
  77. data/app/models/anoubis/sso/client/group_menu.rb +109 -0
  78. data/app/models/anoubis/sso/client/menu.rb +145 -0
  79. data/app/models/anoubis/sso/client/user.rb +81 -0
  80. data/app/models/anoubis/sso/client/user_group.rb +32 -0
  81. data/app/models/anoubis/sso/server/system.rb +36 -0
  82. data/app/models/anoubis/sso/server/user.rb +79 -0
  83. data/app/models/anoubis/tenant/application_record.rb +41 -0
  84. data/app/models/anoubis/tenant/group.rb +95 -0
  85. data/app/models/anoubis/tenant/group_locale.rb +19 -0
  86. data/app/models/anoubis/tenant/group_menu.rb +84 -0
  87. data/app/models/anoubis/tenant/menu.rb +156 -0
  88. data/app/models/anoubis/tenant/menu_locale.rb +27 -0
  89. data/app/models/anoubis/tenant/system.rb +127 -0
  90. data/app/models/anoubis/tenant/system_locale.rb +19 -0
  91. data/app/models/anoubis/tenant/system_menu.rb +51 -0
  92. data/app/models/anoubis/tenant/tenant.rb +107 -0
  93. data/app/models/anoubis/tenant/tenant_system.rb +19 -0
  94. data/app/models/anoubis/tenant/user.rb +225 -0
  95. data/app/models/anoubis/tenant/user_group.rb +32 -0
  96. data/app/services/anoubis/core_service.rb +16 -0
  97. data/app/services/anoubis/session_service.rb +17 -0
  98. data/app/validators/presence_in_tenant_validator.rb +20 -0
  99. data/config/initializers/mime_type.rb +1 -0
  100. data/config/locales/en.yml +120 -0
  101. data/config/locales/ru.yml +245 -0
  102. data/config/routes.rb +74 -0
  103. data/db/migrate/20181018085843_create_tenants.rb +13 -0
  104. data/db/migrate/20181018111217_create_systems.rb +10 -0
  105. data/db/migrate/20181018111713_create_tenant_systems.rb +11 -0
  106. data/db/migrate/20181018111925_create_groups.rb +13 -0
  107. data/db/migrate/20181018112151_create_users.rb +25 -0
  108. data/db/migrate/20181018115737_add_title_to_users.rb +10 -0
  109. data/db/migrate/20181022060211_create_menus.rb +18 -0
  110. data/db/migrate/20181115055245_create_group_menus.rb +12 -0
  111. data/db/migrate/20181115060830_create_system_menus.rb +11 -0
  112. data/db/migrate/20181122062131_create_user_groups.rb +11 -0
  113. data/db/migrate/20181221060727_create_menu_locales.rb +14 -0
  114. data/db/migrate/20181225062303_create_system_locales.rb +11 -0
  115. data/db/migrate/20181225062339_create_group_locales.rb +11 -0
  116. data/db/seeds.rb +268 -0
  117. data/lib/anoubis/engine.rb +13 -0
  118. data/lib/anoubis/version.rb +5 -0
  119. data/lib/anoubis.rb +213 -0
  120. data/lib/tasks/anubis_tasks.rake +10 -0
  121. data/lib/tasks/sessions/clear_sessions.rake +10 -0
  122. data/spec/anubis_spec.rb +5 -0
  123. data/spec/controllers/anoubis/index_controller_spec.rb +77 -0
  124. data/spec/dummy/Rakefile +3 -0
  125. data/spec/dummy/app/assets/config/manifest.js +2 -0
  126. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  127. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  128. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  129. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  130. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  131. data/spec/dummy/app/jobs/application_job.rb +2 -0
  132. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  133. data/spec/dummy/app/models/application_record.rb +3 -0
  134. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  135. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  136. data/spec/dummy/bin/bundle +3 -0
  137. data/spec/dummy/bin/rails +4 -0
  138. data/spec/dummy/bin/rake +4 -0
  139. data/spec/dummy/bin/setup +33 -0
  140. data/spec/dummy/bin/update +28 -0
  141. data/spec/dummy/config/application.rb +14 -0
  142. data/spec/dummy/config/boot.rb +5 -0
  143. data/spec/dummy/config/cable.yml +10 -0
  144. data/spec/dummy/config/database.yml +54 -0
  145. data/spec/dummy/config/environment.rb +5 -0
  146. data/spec/dummy/config/environments/development.rb +54 -0
  147. data/spec/dummy/config/environments/production.rb +85 -0
  148. data/spec/dummy/config/environments/test.rb +46 -0
  149. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  150. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  151. data/spec/dummy/config/initializers/cors.rb +16 -0
  152. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  153. data/spec/dummy/config/initializers/inflections.rb +16 -0
  154. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  155. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  156. data/spec/dummy/config/locales/en.yml +33 -0
  157. data/spec/dummy/config/puma.rb +34 -0
  158. data/spec/dummy/config/routes.rb +3 -0
  159. data/spec/dummy/config/spring.rb +6 -0
  160. data/spec/dummy/config/storage.yml +34 -0
  161. data/spec/dummy/config.ru +5 -0
  162. data/spec/dummy/db/schema.rb +167 -0
  163. data/spec/dummy/db/seeds.rb +1 -0
  164. data/spec/factories/anubis_group_locales.rb +7 -0
  165. data/spec/factories/anubis_group_menus.rb +7 -0
  166. data/spec/factories/anubis_groups.rb +6 -0
  167. data/spec/factories/anubis_menu_locales.rb +9 -0
  168. data/spec/factories/anubis_menus.rb +6 -0
  169. data/spec/factories/anubis_system_locales.rb +7 -0
  170. data/spec/factories/anubis_system_menus.rb +6 -0
  171. data/spec/factories/anubis_systems.rb +5 -0
  172. data/spec/factories/anubis_tenants.rb +7 -0
  173. data/spec/factories/anubis_users.rb +10 -0
  174. data/spec/integration/navigation_test.rb +7 -0
  175. data/spec/models/anoubis/group_locale_spec.rb +25 -0
  176. data/spec/models/anoubis/group_menu_spec.rb +50 -0
  177. data/spec/models/anoubis/group_spec.rb +52 -0
  178. data/spec/models/anoubis/menu_locale_spec.rb +31 -0
  179. data/spec/models/anoubis/menu_spec.rb +48 -0
  180. data/spec/models/anoubis/system_locale_spec.rb +20 -0
  181. data/spec/models/anoubis/system_menu_spec.rb +49 -0
  182. data/spec/models/anoubis/system_spec.rb +53 -0
  183. data/spec/models/anoubis/tenant_spec.rb +67 -0
  184. data/spec/models/anoubis/user_spec.rb +57 -0
  185. data/spec/rails_helper.rb +32 -0
  186. data/spec/requests/anoubis/users_request_spec.rb +5 -0
  187. data/spec/spec_helper.rb +13 -0
  188. metadata +408 -0
@@ -0,0 +1,468 @@
1
+ module Anubis
2
+ module Etc
3
+ ##
4
+ # Definitions of field options for table column or new (edit) form field.
5
+ class Field
6
+ # @!attribute [rw]
7
+ # Defines field title.
8
+ # @return [String] field's title
9
+ class_attribute :title, default: nil
10
+
11
+ # @!attribute [rw]
12
+ # Defines field type
13
+ #
14
+ # Possible values of field's type are 'string', 'integer', 'float', 'listbox', 'checkbox', 'longlistbox'
15
+ # and 'datetime'
16
+ # @return [String] field's type.
17
+ class_attribute :type, default: ''
18
+
19
+ # Defines date format for field type 'datetime'
20
+ # Possible values of field's format are 'date', 'full', 'datetime', 'month', 'year'.
21
+ # @return [String] field's type.
22
+ class_attribute :format, default: ''
23
+
24
+ # Defines precision for field type 'number'
25
+ # Possible values of this field is integer numbers between 0 and 6. If precision is 0 then number is integer.
26
+ # @return [String] field's type.
27
+ class_attribute :precision, default: 0
28
+
29
+ # @!attribute [rw]
30
+ # Defines field order options.
31
+ # @return [FieldOrder] field's order options
32
+ class_attribute :order, default: nil
33
+
34
+ # @!attribute [rw]
35
+ # Defines field's visibility for table representation data
36
+ # @return [Boolean] field's visibility
37
+ class_attribute :visible, default: true
38
+
39
+ # @!attribute [rw]
40
+ # Field's identifier
41
+ # @return [String] field's identifier
42
+ class_attribute :key, default: nil
43
+
44
+ # @!attribute [rw] field
45
+ # Field's name is used for access field value in model
46
+ # @return [String] field's name
47
+ class_attribute :field, default: nil
48
+
49
+ # @!attribute [rw] table_field
50
+ # Field's name is used for operation with table data (like 'where', 'order' and etc.)
51
+ # @return [String] field's name in the table
52
+ class_attribute :table_field, default: nil
53
+
54
+ # @!attribute [rw] error_text
55
+ # Text is shown when system can't access to data with presented {#field} name
56
+ # @return [String] field's error_text
57
+ class_attribute :error_text, default: ''
58
+
59
+ # @!attribute [rw]
60
+ # Describes additional field's options for type 'checkbox', 'listbox'.
61
+ # @return [FieldOptions] field's options.
62
+ class_attribute :options, default: nil
63
+
64
+ # @!attribute [rw]
65
+ # Describes if this field could return data for {Anubis::Data::Actions#autocomplete autocomplete} action.
66
+ # @return [Boolean] possibility for return data on autocomplete action.
67
+ #
68
+ # <b>Options:</b>
69
+ # - <b>:limit</b> (Integer) -- maximum number of elements <i>(defaults to: 10)</i>
70
+ # - <b>:count</b> (Integer) -- Minimum symbols count for output <i>(defaults to: 3)</i>
71
+ # @return [Hash] autocomplete definitions for field
72
+ class_attribute :autocomplete, default: false
73
+
74
+ # @!attribute [rw]
75
+ # Defines model's description for complex field
76
+ #
77
+ # <b>Options:</b>
78
+ # - <b>:model</b> (ActiveRecord) -- model class
79
+ # - <b>:title</b> (Symbol) -- field name is used for receive options titles <i>(defaults to: :title)</i>
80
+ # - <b>:order</b> (Symbol) -- field name is used for order options <i>(defaults to: :title option)</i>
81
+ # - <b>:where</b> (Hash) -- where parameters for select data from model <i>(defaults to: {})</i>
82
+ # @return [Model] model's description for complex field
83
+ class_attribute :model, default: nil
84
+
85
+ # @!attribute [rw] editable
86
+ # Defines if key of this field can be edited
87
+ # @return [String] returns path for edit field options
88
+ class_attribute :editable, default: nil
89
+
90
+ ##
91
+ # Sets default parameters for field
92
+ # @param key [Symbol] field's identifier
93
+ # @param model [ActiveRecord] field's model
94
+ # @param options [Hash] field's initial options
95
+ def initialize(key, model, options = {})
96
+ #puts key
97
+ #puts options
98
+ self.field = nil
99
+ self.key = key.to_s
100
+ self.format = ''
101
+ self.precision = 0
102
+ self.title = options[:title] if options.key? :title
103
+ self.type = if options.key? :type then options[:type] else 'string' end
104
+ self.visible = if options.key? :visible then options[:visible] else true end
105
+ self.options = if options.key? :options then FieldOptions.new(options[:options]) else nil end
106
+ if options.key? :order
107
+ if options[:order].class == Hash
108
+ options[:order][:field] = Kernel.format('%s.%s', model.table_name, self.key.to_s) if !options[:order].key? :field
109
+ end
110
+ self.order = if options.key? :order then FieldOrder.new(options[:order]) else nil end
111
+ end
112
+ self.model = if options.key? :model then Model.new(options[:model]) else nil end
113
+ self.editable = if options.key? :editable then options[:editable] else nil end
114
+ self.autocomplete = if options.key? :autocomplete then options[:autocomplete] else nil end
115
+ self.error_text = if options.key? :error_text then options[:error_text] else I18n.t('errors.field_error') end
116
+
117
+ self.send Kernel.format('initialize_%s', self.type), options
118
+
119
+ if !options.key? :table_field
120
+ if !options.key? :field
121
+ if self.order
122
+ options[:table_field] = self.order.field if self.order.field
123
+ end
124
+ end
125
+ end
126
+
127
+ if !self.field
128
+ self.field = if options.key? :field then options[:field] else self.key end
129
+ end
130
+
131
+ self.table_field = if options.key?(:table_field) then options[:table_field] else Kernel.format('%s.%s', model.table_name, self.field) end
132
+
133
+ if self.autocomplete
134
+ self.autocomplete[:limit] = 10 if !autocomplete.key? :limit
135
+ self.autocomplete[:count] = 3 if !autocomplete.key? :count
136
+ self.autocomplete[:where] = []
137
+ end
138
+ #puts self.to_h
139
+ end
140
+
141
+ ##
142
+ # Initialize additional parameters for {Anubis::Etc::Field#type 'string' field type} for controller actions.
143
+ # @param options [Hash] field's initial options
144
+ def initialize_string (options)
145
+
146
+ end
147
+
148
+ ##
149
+ # Initialize additional parameters for {Anubis::Etc::Field#type 'boolean' field type} for controller actions.
150
+ # @param options [Hash] field's initial options
151
+ def initialize_boolean (options)
152
+
153
+ end
154
+
155
+ ##
156
+ # Initialize additional parameters for {Anubis::Etc::Field#type 'number' field type} for controller actions.
157
+ # @param options [Hash] field's initial options
158
+ def initialize_number (options)
159
+ if options.key? :error_text
160
+ self.error_text = options[:error_text]
161
+ else
162
+ self.error_text = ''
163
+ end
164
+ self.precision = options[:precision].to_s.to_i if options.key? :precision
165
+ self.precision = 0 if self.precision < 0
166
+ self.precision = 16 if self.precision > 16
167
+ end
168
+
169
+ ##
170
+ # Initialize additional parameters for {Anubis::Etc::Field#type 'text' field type} for controller actions.
171
+ # @param options [Hash] field's initial options
172
+ def initialize_text (options)
173
+
174
+ end
175
+
176
+ ##
177
+ # Initialize additional parameters for {Anubis::Etc::Field#type 'html' field type} for controller actions.
178
+ # @param options [Hash] field's initial options
179
+ def initialize_html (options)
180
+
181
+ end
182
+
183
+ ##
184
+ # Initialize additional parameters for {Anubis::Etc::Field#type 'datetime' field type} for controller actions.
185
+ # @param options [Hash] field's initial options
186
+ def initialize_datetime (options)
187
+ options[:format] = 'datetime' if !options.key? :format
188
+ options[:format] = 'datetime' if !%w[date datetime full year month].include? options[:format]
189
+ self.format = options[:format]
190
+ end
191
+
192
+ ##
193
+ # Setups additional parameters for {Anubis::Etc::Field#type 'listbox' field type} for controller actions.
194
+ # @param options [Hash] field's initial options
195
+ def initialize_listbox (options)
196
+ self.options = FieldOptions.new if !self.options
197
+ if !self.options.list
198
+ if self.model
199
+ if !(%w[update create].include?(options[:action]))
200
+ self.options.show = 'update'
201
+ if self.options.line
202
+ self.options.list = self.options.line
203
+ else
204
+ self.options.list = {}
205
+ end
206
+ self.model.model.select(self.model.select).where(self.model.where).order(self.model.order).each do |dat|
207
+ self.options.list[dat.id.to_s.to_sym] = dat.send(self.model.title)
208
+ if dat.respond_to? :updated_at
209
+ if self.model.updated_at < dat.updated_at.to_time.utc.to_i
210
+ self.model.updated_at = dat.updated_at.to_time.utc.to_i
211
+ end
212
+ end
213
+ end
214
+ end
215
+ end
216
+ end
217
+ options[:format] = 'single' unless options.key? :format
218
+ options[:format] = 'single' unless %w[single multiple].include? options[:format]
219
+ self.format = options[:format]
220
+ end
221
+
222
+ ##
223
+ # Initialize additional parameters for {Anubis::Etc::Field#type 'key' field type} for controller actions.
224
+ # @param options [Hash] field's initial options
225
+ def initialize_key (options)
226
+ if self.model
227
+ self.error_text = '' if options[:action] == 'new'
228
+ self.field = Kernel.format('%s.%s', self.key, self.model.title) if !options.key? :field
229
+ self.table_field = Kernel.format('%s.%s', self.model.model.table_name, self.model.title) if !self.table_field
230
+ self.autocomplete = {} if !options.key? :autocomplete
231
+ end
232
+ end
233
+
234
+ ##
235
+ # Return field properties for frontend application
236
+ # @param model [ActiveRecord] field's model
237
+ # @param action [Srting] current field action
238
+ # @return [Hash] field's properties for defined action
239
+ def properties (model, action)
240
+ if %w[new edit].include? action
241
+ return self.properties_forms model, action
242
+ end
243
+ self.properties_index model, action
244
+ end
245
+
246
+ ##
247
+ # Return field properties for frontend application for action 'index'
248
+ # @param model [ActiveRecord] field's model
249
+ # @param action [Srting] current field action
250
+ # @return [Hash] field's properties for defined action
251
+ def properties_index (model, action)
252
+ result = {
253
+ id: self.key,
254
+ type: self.type,
255
+ sortable: self.order != nil
256
+ }
257
+
258
+ if self.title
259
+ result[:title] = self.title
260
+ else
261
+ result[:title] = model.human_attribute_name(self.key)
262
+ end
263
+
264
+ result[:editable] = self.editable if self.editable != nil
265
+ result[:editable] = false if self.type == 'key'
266
+ result[:format] = self.format if self.type == 'datetime'
267
+ result[:precision] = self.precision if self.type == 'number'
268
+ result[:options] = self.hash_to_json(self.options.list) if self.options
269
+ result
270
+ end
271
+
272
+ ##
273
+ # Return field properties for frontend application for actions 'edit', 'new'
274
+ # @param model [ActiveRecord] field's model
275
+ # @param action [Srting] current field action
276
+ # @return [Hash] field's properties for defined action
277
+ def properties_forms (model, action)
278
+ mod = model.new
279
+ result = {
280
+ id: self.key,
281
+ title: model.human_attribute_name(self.key),
282
+ type: self.type
283
+ }
284
+ result.merge!(self.send(Kernel.format('properties_forms_%s', self.type), model, action, mod))
285
+ result
286
+ end
287
+
288
+ ##
289
+ # Return field properties for frontend application for actions 'edit', 'new' and type 'string'
290
+ # @param model [ActiveRecord] field's model
291
+ # @param action [Srting] current field action
292
+ # @param mod [ActiveRecord] initialized new model element
293
+ # @return [Hash] field's properties for defined action
294
+ def properties_forms_string (model, action, mod)
295
+ result = {}
296
+ errors = {}
297
+ res = model.validators_on(self.key.to_sym).detect { |v| v.is_a?(ActiveModel::Validations::LengthValidator) }
298
+ if res
299
+ if res.options.key? :minimum
300
+ result[:min] = res.options[:minimum]
301
+ errors[:min] = model.human_attribute_name(self.key) + ' ' + mod.errors.generate_message(self.key.to_sym, :too_short, { count: result[:min] })
302
+ end
303
+ if res.options.key? :maximum
304
+ result[:max] = res.options[:maximum]
305
+ errors[:max] = model.human_attribute_name(self.key) + ' ' + mod.errors.generate_message(self.key.to_sym, :too_long, { count: result[:max] })
306
+ end
307
+ end
308
+ res = model.validators_on(self.key.to_sym).detect { |v| v.is_a?(ActiveModel::Validations::PresenceValidator) }
309
+ if res
310
+ result[:required] = true
311
+ errors[:required] = model.human_attribute_name(self.key) + ' ' + mod.errors.generate_message(self.key.to_sym, :blank)
312
+ end
313
+ result[:errors] = errors if errors.length > 0
314
+ result
315
+ end
316
+
317
+ ##
318
+ # Return field properties for frontend application for actions 'edit', 'new' and type 'number'
319
+ # @param model [ActiveRecord] field's model
320
+ # @param action [Srting] current field action
321
+ # @param mod [ActiveRecord] initialized new model element
322
+ # @return [Hash] field's properties for defined action
323
+ def properties_forms_number (model, action, mod)
324
+ result = {}
325
+ errors = {}
326
+ res = model.validators_on(self.key.to_sym).detect { |v| v.is_a?(ActiveModel::Validations::NumericalityValidator) }
327
+ if res
328
+ if res.options.key? :greater_than_or_equal_to
329
+ result[:min] = res.options[:greater_than_or_equal_to]
330
+ errors[:min] = model.human_attribute_name(self.key) + ' ' + mod.errors.generate_message(self.key.to_sym, :greater_than_or_equal_to, { count: result[:min] })
331
+ end
332
+ if res.options.key? :maximum
333
+ result[:max] = res.options[:maximum]
334
+ errors[:max] = model.human_attribute_name(self.key) + ' ' + mod.errors.generate_message(self.key.to_sym, :too_long, { count: result[:max] })
335
+ end
336
+ end
337
+ res = model.validators_on(self.key.to_sym).detect { |v| v.is_a?(ActiveModel::Validations::PresenceValidator) }
338
+ if res
339
+ result[:required] = true
340
+ errors[:required] = model.human_attribute_name(self.key) + ' ' + mod.errors.generate_message(self.key.to_sym, :blank)
341
+ end
342
+ result[:errors] = errors if errors.length > 0
343
+ result
344
+ end
345
+
346
+ ##
347
+ # Return field properties for frontend application for actions 'edit', 'new' and type 'text'.
348
+ # @param model [ActiveRecord] field's model
349
+ # @param action [Srting] current field action
350
+ # @param mod [ActiveRecord] initialized new model element
351
+ # @return [Hash] field's properties for defined action
352
+ def properties_forms_text (model, action, mod)
353
+ self.properties_forms_string model, action, mod
354
+ end
355
+
356
+ ##
357
+ # Return field properties for frontend application for actions 'edit', 'new' and type 'html'.
358
+ # @param model [ActiveRecord] field's model
359
+ # @param action [Srting] current field action
360
+ # @param mod [ActiveRecord] initialized new model element
361
+ # @return [Hash] field's properties for defined action
362
+ def properties_forms_html (model, action, mod)
363
+ self.properties_forms_text model, action, mod
364
+ end
365
+
366
+ ##
367
+ # Return field properties for frontend application for actions 'edit', 'new' and type 'listbox'
368
+ # @param model [ActiveRecord] field's model
369
+ # @param action [Srting] current field action
370
+ # @param mod [ActiveRecord] initialized new model element
371
+ # @return [Hash] field's properties for defined action
372
+ def properties_forms_listbox (model, action, mod)
373
+ result = {}
374
+ result[:format] = self.format if self.format == 'multiple'
375
+ result[:options] = self.hash_to_json(self.options.list) if self.options
376
+ result
377
+ end
378
+
379
+ ##
380
+ # Return field properties for frontend application for actions 'edit', 'new' and type 'key'
381
+ # @param model [ActiveRecord] field's model
382
+ # @param action [Srting] current field action
383
+ # @param mod [ActiveRecord] initialized new model element
384
+ # @return [Hash] field's properties for defined action
385
+ def properties_forms_key (model, action, mod)
386
+ result = {
387
+ type: 'string',
388
+ autocomplete: true,
389
+ editable: self.editable
390
+ }
391
+ errors = {}
392
+ result[:field] = self.model.title if self.editable
393
+ res = model.validators_on(self.key.to_sym).detect { |v| v.is_a?(ActiveModel::Validations::PresenceValidator) }
394
+ if res
395
+ result[:required] = true
396
+ errors[:required] = model.human_attribute_name(self.key) + ' ' + mod.errors.generate_message(self.key.to_sym, :blank)
397
+ end
398
+ result[:errors] = errors if errors.length > 0
399
+ result
400
+ end
401
+
402
+ ##
403
+ # Return field properties for frontend application for actions 'edit', 'new' and type 'datetime'
404
+ # @param model [ActiveRecord] field's model
405
+ # @param action [Srting] current field action
406
+ # @param mod [ActiveRecord] initialized new model element
407
+ # @return [Hash] field's properties for defined action
408
+ def properties_forms_datetime (model, action, mod)
409
+ result = {}
410
+ errors = {}
411
+ res = model.validators_on(self.key.to_sym).detect { |v| v.is_a?(ActiveModel::Validations::PresenceValidator) }
412
+ if res
413
+ result[:required] = true
414
+ errors[:required] = model.human_attribute_name(self.key) + ' ' + mod.errors.generate_message(self.key.to_sym, :blank)
415
+ end
416
+ result[:format] = self.format
417
+ result[:errors] = errors if errors.length > 0
418
+ result
419
+ end
420
+
421
+ ##
422
+ # Generates hash representation of all class parameters,
423
+ # @return [Hash] hash representation of all data
424
+ def to_h
425
+ result = {
426
+ key: self.key,
427
+ type: self.type,
428
+ visible: self.visible,
429
+ field: self.field,
430
+ table_field: self.table_field,
431
+ error_text: self.error_text,
432
+ autocomplete: self.autocomplete
433
+ }
434
+ result[:format] = self.format if self.type == 'datetime'
435
+ if self.editable
436
+ result[:editable] = self.editable
437
+ result[:field] = self.model.title if self.model
438
+ else
439
+ result[:editable] = self.editable if self.editable != nil
440
+ end
441
+ if self.model
442
+ result[:model] = self.model.to_h
443
+ end
444
+ if self.options
445
+ result[:options] = self.options.to_h
446
+ end
447
+ if self.order
448
+ result[:order] = self.order.to_h
449
+ end
450
+ result
451
+ end
452
+
453
+ ##
454
+ # Convert hash to array json output
455
+ # @param hash [Hash] hash representation
456
+ # @return [Array] array representation
457
+ def hash_to_json(hash)
458
+ result = []
459
+ hash.each_key do |key|
460
+ result.push({ key: key.to_s, value: hash[key] })
461
+ end
462
+ result
463
+ end
464
+
465
+ public :format
466
+ end
467
+ end
468
+ end
@@ -0,0 +1,83 @@
1
+ module Anubis
2
+ module Etc
3
+ ##
4
+ # Definitions of fields options list for 'checkbox' and 'listbox' type.
5
+ class FieldOptions
6
+ # @!attribute [rw]
7
+ # Describes when options shown in output for 'edit' and 'new' actions. Possible values of fields are:
8
+ # - 'init' -- Options shown only when time set to 0 in action
9
+ # - 'never' -- Options newer shown
10
+ # - 'always' -- Options always shown
11
+ # - 'update' -- Options shown when time less then updated_at time of options model
12
+ # @return [String] options' show type.
13
+ class_attribute :show, default: 'init'
14
+
15
+ # @!attribute [rw]
16
+ # Options list.
17
+ # @return [Hash<Symbol, Sring>] options list
18
+ class_attribute :list, default: nil
19
+
20
+ # @!attribute [rw]
21
+ # Enum list from ActiveRecord. Is defined for correct filtering.
22
+ # @return [Hash<Symbol, Sring>] enum options list
23
+ class_attribute :enum, default: nil
24
+
25
+ # @!attribute [rw]
26
+ # Defines selected line. Default nil
27
+ # @return [Hash] presence of select line
28
+ class_attribute :line, default: nil
29
+
30
+ # @!attribute [rw]
31
+ # Defines model's description for complex field
32
+ #
33
+ # <b>Options:</b>
34
+ # - <b>:model</b> (ActiveRecord) -- model class
35
+ # - <b>:title</b> (Symbol) -- field name is used for receive options titles <i>(defaults to: :title)</i>
36
+ # - <b>:order</b> (Symbol) -- field name is used for order options <i>(defaults to: :title option)</i>
37
+ # - <b>:select</b> (Symbol) -- special select statement <i>(defaults to: nil)</i>
38
+ # - <b>:where</b> (Hash) -- where parameters for select data from model <i>(defaults to: {})</i>
39
+ # @return [Model] model's description for complex field
40
+ class_attribute :model, default: nil
41
+
42
+ ##
43
+ # Sets default parameters for field options
44
+ # @param [Hash] options initial model options
45
+ # @option options [String] :show describes options shoe type
46
+ # @option options [Hash<Symbol, String>] :list options list
47
+ def initialize(options = {})
48
+ if options.key? :show
49
+ self.show = options[:show] if %w[init never always update].include? options[:show]
50
+ end
51
+ self.show = 'init' if !self.show || self.show == 'init'
52
+ self.line = if options.key? :line then options[:line] else nil end
53
+ self.list = if options.key? :list then options[:list] else nil end
54
+ self.enum = if options.key? :enum then options[:enum] else nil end
55
+ self.model = if options.key? :model then Model.new(options[:model]) else nil end
56
+ self.generate_list if !self.list && self.model
57
+ end
58
+
59
+ ##
60
+ # Generate options list based on model
61
+ def generate_list
62
+ self.list = {}
63
+ self.model.model.where(self.model.where).order(self.model.order).each do |data|
64
+ proc = format('%s', self.model.title)
65
+ self.list[data.id.to_s.to_sym] = data.send proc
66
+ end
67
+ end
68
+
69
+ ##
70
+ # Generates hash representation of all class parameters,
71
+ # @return [Hash] hash representation of all data
72
+ def to_h
73
+ {
74
+ show: self.show,
75
+ enum: self.enum,
76
+ list: self.list
77
+ }
78
+ end
79
+
80
+ public :select
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,51 @@
1
+ module Anubis
2
+ module Etc
3
+ ##
4
+ # Definitions of fields order.
5
+ class FieldOrder
6
+ # @!attribute [rw]
7
+ # Returns order field (or array of fields)
8
+ # @return [String, Array, Symbol] field or field list.
9
+ class_attribute :field, default: nil
10
+
11
+ # @!attribute [rw]
12
+ # Field default order.
13
+ # @return [Symbol] default order
14
+ class_attribute :order, default: :asc
15
+
16
+ # @!attribute [rw]
17
+ # Defines if this field order by default.
18
+ # @return [Boolean] Defines if this field order by default
19
+ class_attribute :default, default: false
20
+
21
+ ##
22
+ # Sets default parameters for field order
23
+ # @param [Hash] options initial model options
24
+ # @option options [String, Array, Symbol] :field describes field or fields name for order
25
+ # @option options [Symbol] :order default order type (:asc or :desc)
26
+ # @option options [Boolean] :default if this field default in order list
27
+ def initialize(options = {})
28
+ self.default = false
29
+ if options.key? :default
30
+ self.default = true if options[:default].class == TrueClass
31
+ end
32
+ self.order = :asc
33
+ if options.key? :order
34
+ self.order = :desc if options[:order] == :desc || options[:order].to_s.downcase == 'desc'
35
+ end
36
+ self.field = if options.key? :field then options[:field] else nil end
37
+ end
38
+
39
+ ##
40
+ # Generates hash representation of all class parameters,
41
+ # @return [Hash] hash representation of all data
42
+ def to_h
43
+ {
44
+ field: self.field,
45
+ order: self.order,
46
+ default: self.default
47
+ }
48
+ end
49
+ end
50
+ end
51
+ end