releaf-core 0.2.1 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +19 -21
  3. data/app/assets/javascripts/releaf/application.js +1 -2
  4. data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +19 -21
  5. data/app/assets/javascripts/releaf/include/field.type_richtext.js +31 -9
  6. data/app/assets/javascripts/releaf/include/localization.js +3 -8
  7. data/app/assets/javascripts/releaf/include/nested_fields.js +1 -1
  8. data/app/assets/javascripts/releaf/include/remote_validator.js +7 -4
  9. data/app/assets/javascripts/releaf/include/sortable.js +1 -1
  10. data/app/assets/javascripts/releaf/include/{profile_settings.js → store_settings.js} +4 -10
  11. data/app/assets/javascripts/releaf/include/toolbox.js +7 -11
  12. data/app/assets/stylesheets/releaf/layout/fields.scss +1 -0
  13. data/app/assets/stylesheets/releaf/layout/header.scss +1 -0
  14. data/app/assets/stylesheets/releaf/layout/search.scss +15 -0
  15. data/app/builders/releaf/builders/base.rb +11 -9
  16. data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +2 -2
  17. data/app/builders/releaf/builders/confirm_dialog_builder.rb +3 -3
  18. data/app/builders/releaf/builders/edit_builder.rb +51 -6
  19. data/app/builders/releaf/builders/form_builder/associated_set_field.rb +37 -0
  20. data/app/builders/releaf/builders/form_builder/associations.rb +153 -0
  21. data/app/builders/releaf/builders/form_builder/boolean_fields.rb +12 -0
  22. data/app/builders/releaf/builders/form_builder/date_fields.rb +30 -0
  23. data/app/builders/releaf/builders/form_builder/fields.rb +10 -0
  24. data/app/builders/releaf/builders/form_builder/file_fields.rb +47 -0
  25. data/app/builders/releaf/builders/form_builder/i18n_fields.rb +75 -0
  26. data/app/builders/releaf/builders/form_builder/label.rb +34 -0
  27. data/app/builders/releaf/builders/form_builder/number_fields.rb +13 -0
  28. data/app/builders/releaf/builders/form_builder/richtext_fields.rb +28 -0
  29. data/app/builders/releaf/builders/form_builder/text_fields.rb +43 -0
  30. data/app/builders/releaf/builders/form_builder.rb +8 -489
  31. data/app/builders/releaf/builders/index_builder.rb +10 -3
  32. data/app/builders/releaf/builders/page/header_builder.rb +23 -59
  33. data/app/builders/releaf/builders/page/layout_builder.rb +125 -115
  34. data/app/builders/releaf/builders/page/menu_builder.rb +96 -106
  35. data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +7 -12
  36. data/app/builders/releaf/builders/resource_view.rb +4 -4
  37. data/app/builders/releaf/builders/table_builder.rb +20 -30
  38. data/app/builders/releaf/builders/toolbox_builder.rb +1 -1
  39. data/app/builders/releaf/builders/utilities/date_fields.rb +100 -0
  40. data/app/builders/releaf/builders/utilities/resolve_attribute_field_method_name.rb +80 -0
  41. data/app/builders/releaf/builders/view.rb +5 -2
  42. data/app/builders/releaf/settings/form_builder.rb +18 -0
  43. data/app/builders/releaf/settings/table_builder.rb +9 -0
  44. data/app/controllers/releaf/action_controller.rb +174 -0
  45. data/app/controllers/releaf/{core/errors_controller.rb → errors_controller.rb} +1 -1
  46. data/app/controllers/releaf/root_controller.rb +23 -0
  47. data/app/controllers/releaf/settings_controller.rb +22 -0
  48. data/app/helpers/releaf/application_helper.rb +1 -1
  49. data/app/lib/releaf/action_controller/ajax.rb +24 -0
  50. data/app/lib/releaf/action_controller/breadcrumbs.rb +26 -0
  51. data/app/lib/releaf/action_controller/builders.rb +34 -0
  52. data/app/lib/releaf/action_controller/features.rb +47 -0
  53. data/app/lib/releaf/action_controller/notifications.rb +28 -0
  54. data/app/lib/releaf/action_controller/resources.rb +59 -0
  55. data/app/{controllers/concerns/releaf → lib/releaf/action_controller}/richtext_attachments.rb +1 -1
  56. data/app/lib/releaf/action_controller/search.rb +22 -0
  57. data/app/lib/releaf/action_controller/urls.rb +49 -0
  58. data/app/lib/releaf/action_controller/views.rb +29 -0
  59. data/app/lib/releaf/assets_resolver.rb +51 -0
  60. data/app/lib/releaf/build_errors_hash.rb +81 -0
  61. data/app/lib/releaf/controller_definition.rb +22 -0
  62. data/app/lib/releaf/controller_group_definition.rb +12 -0
  63. data/app/lib/releaf/{core/default_searchable_fields.rb → default_searchable_fields.rb} +1 -1
  64. data/app/lib/releaf/{core/resource_base.rb → resource_base.rb} +14 -6
  65. data/app/lib/releaf/{core/resource_fields.rb → resource_fields.rb} +1 -1
  66. data/app/lib/releaf/{core/resource_params.rb → resource_params.rb} +3 -3
  67. data/app/lib/releaf/resource_table_fields.rb +10 -0
  68. data/app/lib/releaf/{core/resource_utilities.rb → resource_utilities.rb} +2 -2
  69. data/app/lib/releaf/{core/responders → responders}/access_denied_responder.rb +2 -2
  70. data/app/lib/releaf/{core/responders → responders}/after_save_responder.rb +3 -3
  71. data/app/lib/releaf/{core/responders → responders}/confirm_destroy_responder.rb +1 -1
  72. data/app/lib/releaf/{core/responders → responders}/destroy_responder.rb +1 -1
  73. data/app/lib/releaf/{core/responders → responders}/error_responder.rb +1 -1
  74. data/app/lib/releaf/{core/responders → responders}/feature_disabled_responder.rb +2 -2
  75. data/app/lib/releaf/{core/responders → responders}/page_not_found_responder.rb +2 -2
  76. data/app/lib/releaf/responders.rb +31 -0
  77. data/app/lib/releaf/{core/search.rb → search.rb} +1 -1
  78. data/app/lib/releaf/settings/normalize_value.rb +45 -0
  79. data/app/lib/releaf/settings/register.rb +45 -0
  80. data/app/models/releaf/settings.rb +25 -13
  81. data/app/services/array/reorder.rb +82 -0
  82. data/app/views/releaf/{base → action}/confirm_destroy.ruby +0 -0
  83. data/app/views/releaf/{base → action}/create_releaf_richtext_attachment.haml +0 -0
  84. data/app/views/releaf/{base → action}/edit.ruby +0 -0
  85. data/app/views/releaf/{base → action}/index.ruby +0 -0
  86. data/app/views/releaf/{base → action}/new.ruby +0 -0
  87. data/app/views/releaf/{base → action}/refused_destroy.ruby +0 -0
  88. data/app/views/releaf/{base → action}/show.ruby +0 -0
  89. data/app/views/releaf/{base → action}/toolbox.ruby +0 -0
  90. data/lib/generators/dummy/install_generator.rb +5 -0
  91. data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/books.js +23 -0
  92. data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/nodes.js +1 -0
  93. data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/other_site/other_nodes.js +1 -0
  94. data/lib/generators/dummy/templates/assets/stylesheets/controllers/admin/nodes.scss +1 -0
  95. data/lib/generators/dummy/templates/assets/stylesheets/controllers/admin/other_site/other_nodes.scss +1 -0
  96. data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +11 -1
  97. data/lib/generators/dummy/templates/config/routes.rb +31 -7
  98. data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +3 -6
  99. data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +1 -1
  100. data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +1 -1
  101. data/lib/generators/dummy/templates/controllers/admin/nodes_controller.rb +3 -0
  102. data/lib/generators/dummy/templates/controllers/admin/other_site/other_nodes_controller.rb +3 -0
  103. data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +1 -1
  104. data/lib/generators/dummy/templates/controllers/application_controller.rb +27 -5
  105. data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +13 -3
  106. data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -1
  107. data/lib/generators/dummy/templates/initializers/releaf.rb +31 -25
  108. data/lib/generators/dummy/templates/migrations/create_home_pages.rb +1 -0
  109. data/lib/generators/dummy/templates/migrations/create_other_nodes.rb +29 -0
  110. data/lib/generators/dummy/templates/models/author.rb +2 -2
  111. data/lib/generators/dummy/templates/models/book.rb +0 -2
  112. data/lib/generators/dummy/templates/models/chapter.rb +0 -2
  113. data/lib/generators/dummy/templates/models/home_page.rb +1 -0
  114. data/lib/generators/dummy/templates/models/other_site/other_node.rb +7 -0
  115. data/lib/generators/dummy/templates/models/publisher.rb +0 -5
  116. data/lib/generators/dummy/templates/models/text_page.rb +0 -1
  117. data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -1
  118. data/lib/generators/dummy/templates/views/layouts/application.html.haml +9 -1
  119. data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -1
  120. data/lib/generators/releaf/templates/initializers/releaf.rb +6 -17
  121. data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +13 -14
  122. data/lib/generators/releaf/templates/seeds/seeds.rb +28 -32
  123. data/lib/releaf/{core/application.rb → application.rb} +5 -4
  124. data/lib/releaf/{core/component.rb → component.rb} +6 -2
  125. data/lib/releaf/configuration.rb +95 -0
  126. data/lib/releaf/core_ext/array/reorder.rb +5 -0
  127. data/lib/releaf/engine.rb +12 -0
  128. data/lib/releaf/exceptions.rb +5 -0
  129. data/lib/releaf/instance_cache.rb +72 -0
  130. data/lib/releaf/{core → rails_ext}/validation_error_codes.rb +1 -1
  131. data/lib/releaf/root/configuration.rb +6 -0
  132. data/lib/releaf/root/default_controller_resolver.rb +37 -0
  133. data/lib/releaf/root/settings_manager.rb +12 -0
  134. data/lib/releaf/root.rb +17 -0
  135. data/lib/releaf/{core/route_mapper.rb → route_mapper.rb} +6 -6
  136. data/lib/releaf/service.rb +11 -0
  137. data/lib/releaf/settings_ui.rb +7 -0
  138. data/lib/releaf/version.rb +1 -1
  139. data/lib/releaf-core.rb +38 -9
  140. data/spec/builders/{builders → releaf/builders}/association_reflector_spec.rb +0 -0
  141. data/spec/builders/{builders → releaf/builders}/base_spec.rb +17 -21
  142. data/spec/builders/{builders → releaf/builders}/collection_spec.rb +0 -0
  143. data/spec/builders/{builders → releaf/builders}/confirm_destroy_dialog_builder_spec.rb +5 -5
  144. data/spec/builders/{builders → releaf/builders}/confirm_dialog_builder_spec.rb +9 -7
  145. data/spec/builders/{builders → releaf/builders}/edit_builder_spec.rb +127 -20
  146. data/spec/builders/releaf/builders/form_builder/associations_spec.rb +129 -0
  147. data/spec/builders/releaf/builders/form_builder/date_fields_spec.rb +86 -0
  148. data/spec/builders/releaf/builders/form_builder/i18n_fields_spec.rb +48 -0
  149. data/spec/builders/releaf/builders/form_builder/label_spec.rb +106 -0
  150. data/spec/builders/releaf/builders/form_builder/number_fields_spec.rb +37 -0
  151. data/spec/builders/releaf/builders/form_builder_spec.rb +228 -0
  152. data/spec/builders/{builders → releaf/builders}/index_builder_spec.rb +29 -10
  153. data/spec/builders/releaf/builders/page/header_builder_spec.rb +65 -0
  154. data/spec/builders/releaf/builders/page/layout_builder_spec.rb +170 -0
  155. data/spec/builders/releaf/builders/page/menu_builder_spec.rb +345 -0
  156. data/spec/builders/{builders → releaf/builders}/pagination_builder_spec.rb +0 -0
  157. data/spec/builders/{builders → releaf/builders}/resource_dialog_spec.rb +0 -0
  158. data/spec/builders/{builders → releaf/builders}/resource_view_spec.rb +8 -8
  159. data/spec/builders/{builders → releaf/builders}/show_builder_spec.rb +0 -0
  160. data/spec/builders/{builders → releaf/builders}/table_builder_spec.rb +31 -75
  161. data/spec/builders/{builders → releaf/builders}/template_spec.rb +0 -0
  162. data/spec/builders/{builders → releaf/builders}/toolbox_builder_spec.rb +4 -4
  163. data/spec/builders/{builders → releaf/builders}/toolbox_spec.rb +0 -0
  164. data/spec/builders/releaf/builders/utilities/date_fields_spec.rb +125 -0
  165. data/spec/builders/releaf/builders/utilities/resolve_attribute_field_method_name_spec.rb +318 -0
  166. data/spec/builders/{builders → releaf/builders}/view_spec.rb +1 -1
  167. data/spec/builders/{builders_spec.rb → releaf/builders_spec.rb} +0 -0
  168. data/spec/builders/releaf/settings/form_builder_spec.rb +48 -0
  169. data/spec/builders/{core → releaf}/settings/table_builder_spec.rb +6 -4
  170. data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +1 -1
  171. data/spec/controllers/releaf/{base_controller_spec.rb → action_controller_spec.rb} +132 -161
  172. data/spec/controllers/releaf/root_controller_spec.rb +40 -0
  173. data/spec/controllers/releaf/settings_controller_spec.rb +52 -0
  174. data/spec/error_hash_builder_spec.rb +83 -0
  175. data/spec/ext/array_reorder_spec.rb +12 -0
  176. data/spec/features/ajaxbox_spec.rb +6 -6
  177. data/spec/features/errors_spec.rb +2 -1
  178. data/spec/features/index_table_spec.rb +6 -3
  179. data/spec/features/richtext_attachments_spec.rb +2 -2
  180. data/spec/features/richtext_custom_config_spec.rb +28 -0
  181. data/spec/features/richtext_embed_spec.rb +1 -1
  182. data/spec/features/richtext_spec.rb +10 -1
  183. data/spec/features/search_spec.rb +1 -1
  184. data/spec/features/settings_spec.rb +10 -5
  185. data/spec/helpers/application_helper_spec.rb +4 -6
  186. data/spec/lib/releaf/action_controller/features_spec.rb +171 -0
  187. data/spec/lib/releaf/action_controller/search_spec.rb +84 -0
  188. data/spec/lib/releaf/{core/application_spec.rb → application_spec.rb} +7 -6
  189. data/spec/lib/releaf/assets_resolver_spec.rb +130 -0
  190. data/spec/lib/releaf/build_errors_hash_spec.rb +141 -0
  191. data/spec/lib/releaf/configuration_spec.rb +205 -0
  192. data/spec/lib/releaf/controller_definition_spec.rb +49 -0
  193. data/spec/lib/releaf/controller_group_definition_spec.rb +27 -0
  194. data/spec/lib/releaf/{core/default_searchable_fields_spec.rb → default_searchable_fields_spec.rb} +1 -1
  195. data/spec/lib/releaf/instance_cache_spec.rb +98 -0
  196. data/spec/lib/releaf/{core/resource_base_spec.rb → resource_base_spec.rb} +59 -21
  197. data/spec/lib/releaf/{core/resource_fields_spec.rb → resource_fields_spec.rb} +1 -1
  198. data/spec/lib/releaf/{core/resource_params_spec.rb → resource_params_spec.rb} +3 -5
  199. data/spec/lib/releaf/resource_table_fields_spec.rb +20 -0
  200. data/spec/lib/releaf/{core/resource_utilities_spec.rb → resource_utilities_spec.rb} +1 -1
  201. data/spec/lib/releaf/{core/responders → responders}/access_denied_responder_spec.rb +1 -1
  202. data/spec/lib/releaf/{core/responders → responders}/after_save_responder_spec.rb +9 -8
  203. data/spec/lib/releaf/{core/responders → responders}/confirm_destroy_responder_spec.rb +2 -2
  204. data/spec/lib/releaf/{core/responders → responders}/destroy_responder_spec.rb +2 -2
  205. data/spec/lib/releaf/{core/responders → responders}/error_responder_spec.rb +4 -4
  206. data/spec/lib/releaf/{core/responders → responders}/feature_disabled_responder_spec.rb +1 -1
  207. data/spec/lib/releaf/{core/responders → responders}/page_not_found_responder_spec.rb +1 -1
  208. data/spec/lib/releaf/{core/responders_spec.rb → responders_spec.rb} +14 -14
  209. data/spec/lib/releaf/root/configuration_spec.rb +9 -0
  210. data/spec/lib/releaf/root/default_controller_resolver_spec.rb +108 -0
  211. data/spec/lib/releaf/root_spec.rb +13 -0
  212. data/spec/lib/releaf/service_spec.rb +20 -0
  213. data/spec/lib/releaf/settings/normalize_value_spec.rb +103 -0
  214. data/spec/lib/releaf/settings/register_spec.rb +135 -0
  215. data/spec/lib/releaf/settings_manager_spec.rb +22 -0
  216. data/spec/lib/validation_error_codes_spec.rb +1 -1
  217. data/spec/misc/factories_spec.rb +0 -12
  218. data/spec/models/settings_spec.rb +74 -32
  219. data/spec/routing/route_mapper_spec.rb +5 -5
  220. data/spec/rspec_helpers/test_helpers_spec.rb +1 -1
  221. data/spec/rspec_helpers/test_spec.rb +14 -0
  222. data/spec/{lib/releaf/core/item_orderer_spec.rb → services/array/reorder_spec.rb} +32 -53
  223. metadata +299 -224
  224. data/app/builders/releaf/builders/orderer.rb +0 -5
  225. data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +0 -40
  226. data/app/builders/releaf/core/settings/form_builder.rb +0 -21
  227. data/app/builders/releaf/core/settings/table_builder.rb +0 -11
  228. data/app/controllers/concerns/releaf/breadcrumbs.rb +0 -42
  229. data/app/controllers/releaf/base_controller.rb +0 -458
  230. data/app/controllers/releaf/core/settings_controller.rb +0 -50
  231. data/app/helpers/releaf/javascript_helper.rb +0 -75
  232. data/app/lib/releaf/core/assets_resolver.rb +0 -58
  233. data/app/lib/releaf/core/error_formatter.rb +0 -103
  234. data/app/lib/releaf/core/item_orderer.rb +0 -102
  235. data/app/lib/releaf/core/resource_table_fields.rb +0 -10
  236. data/app/lib/releaf/core/responders.rb +0 -31
  237. data/app/lib/releaf/core/template_field_type_mapper.rb +0 -127
  238. data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
  239. data/lib/releaf/core/builders_autoload.rb +0 -27
  240. data/lib/releaf/core/configuration.rb +0 -101
  241. data/lib/releaf/core/engine.rb +0 -35
  242. data/lib/releaf/core/exceptions.rb +0 -38
  243. data/lib/releaf/core/settings_ui_component.rb +0 -7
  244. data/releaf-core.gemspec +0 -35
  245. data/spec/builders/builders/form_builder_spec.rb +0 -562
  246. data/spec/builders/builders/orderer_spec.rb +0 -22
  247. data/spec/builders/builders/page/header_builder_spec.rb +0 -143
  248. data/spec/builders/builders/page/layout_builder_spec.rb +0 -73
  249. data/spec/builders/builders/page/menu_builder_spec.rb +0 -160
  250. data/spec/builders/core/settings/form_builder_spec.rb +0 -69
  251. data/spec/controllers/releaf/core/settings_controller_spec.rb +0 -31
  252. data/spec/lib/releaf/core/assets_resolver_spec.rb +0 -113
  253. data/spec/lib/releaf/core/configuration_spec.rb +0 -230
  254. data/spec/lib/releaf/core/error_formatter_spec.rb +0 -242
  255. data/spec/lib/releaf/core/resource_table_fields_spec.rb +0 -18
  256. data/spec/lib/releaf/core/template_field_type_mapper_spec.rb +0 -311
@@ -0,0 +1,45 @@
1
+ class Releaf::Settings::NormalizeValue
2
+ include Releaf::Service
3
+ attribute :value, Object
4
+ attribute :input_type, Symbol
5
+
6
+ def call
7
+ if self.class.respond_to? normalization_method
8
+ self.class.send(normalization_method, value)
9
+ else
10
+ value
11
+ end
12
+ end
13
+
14
+ def normalization_method
15
+ "normalize_#{input_type}"
16
+ end
17
+
18
+ def self.normalize_decimal(value)
19
+ value.to_s.sub(",", ".").to_d
20
+ end
21
+
22
+ def self.normalize_float(value)
23
+ value.to_s.sub(",", ".").to_f
24
+ end
25
+
26
+ def self.normalize_integer(value)
27
+ value.to_i
28
+ end
29
+
30
+ def self.normalize_time(value)
31
+ Time.parse(value) if value.present?
32
+ end
33
+
34
+ def self.normalize_datetime(value)
35
+ DateTime.parse(value) if value.present?
36
+ end
37
+
38
+ def self.normalize_date(value)
39
+ Date.parse(value) if value.present?
40
+ end
41
+
42
+ def self.normalize_boolean(value)
43
+ value.to_s == '1'
44
+ end
45
+ end
@@ -0,0 +1,45 @@
1
+ class Releaf::Settings::Register
2
+ include Releaf::Service
3
+ attribute :settings, Array
4
+
5
+ def call
6
+ settings.each do|item|
7
+ register(normalize(item))
8
+ end
9
+ end
10
+
11
+ def normalize(item)
12
+ item[:type] = (item[:type] || :text).to_sym
13
+ dissallowed_keys = item.keys - allowed_keys
14
+
15
+ raise Releaf::Error, "Unsupported settings type: #{item[:type]}" unless settings_class.supported_types.include?(item[:type])
16
+ raise Releaf::Error, "Dissallowed settings keys: #{dissallowed_keys}" if dissallowed_keys.present?
17
+
18
+ item
19
+ end
20
+
21
+ def allowed_keys
22
+ [:key, :default, :type, :description]
23
+ end
24
+
25
+ def register(item)
26
+ settings_class.registry.update(item[:key] => item)
27
+ settings_class[item[:key]] = item[:default] if write_default?(item)
28
+ end
29
+
30
+ def write_default?(item)
31
+ table_exists? && !settings_class.find_by(var: item[:key]).present?
32
+ end
33
+
34
+ def table_exists?
35
+ begin
36
+ settings_class.table_exists?
37
+ rescue ActiveRecord::NoDatabaseError
38
+ false
39
+ end
40
+ end
41
+
42
+ def settings_class
43
+ Releaf::Settings
44
+ end
45
+ end
@@ -1,27 +1,39 @@
1
- class Releaf::Settings < RailsSettings::CachedSettings
1
+ class Releaf::Settings < RailsSettings::Base
2
+
3
+ scope :registered, -> { where(var: registered_keys).order(:var) }
2
4
 
3
5
  cattr_accessor :registry
4
6
  @@registry = {}.with_indifferent_access
5
7
 
6
- def to_text
8
+ def releaf_title
7
9
  var
8
10
  end
9
11
 
12
+ def input_type
13
+ metadata[:type] || :text
14
+ end
15
+
16
+ def description
17
+ metadata[:description]
18
+ end
19
+
20
+ def metadata
21
+ self.class.registry.fetch(var, {})
22
+ end
23
+
24
+ def self.register_scoped
25
+ where(var: registered_keys)
26
+ end
27
+
10
28
  def self.registered_keys
11
29
  @@registry.keys
12
30
  end
13
31
 
14
- def self.register(args)
15
- if args.is_a? Hash
16
- list = [args]
17
- else
18
- list = args
19
- end
32
+ def self.register(*args)
33
+ Releaf::Settings::Register.call(settings: args)
34
+ end
20
35
 
21
- list.each do|item|
22
- @@registry[item[:key]] = item
23
- @@defaults[item[:key]] = item[:default]
24
- self[item[:key]] = item[:default] if table_exists? && !where(var: item[:key], thing_type: nil).exists?
25
- end
36
+ def self.supported_types
37
+ [:boolean, :date, :time, :datetime, :integer, :float, :decimal, :email, :text]
26
38
  end
27
39
  end
@@ -0,0 +1,82 @@
1
+ class Array::Reorder
2
+ # Utility class for array items reordering.
3
+ #
4
+ # There are 4 possible reordering options: <code>:first, :last, :before and :after</code>.
5
+ #
6
+ # All reorder methods are chainable, so:
7
+ # Array::Reorder.call(array: [:a, :b, :c, :d, :e, :f], values: [:a, :b], options: {after: :d})
8
+ # will return
9
+ # [:c, :d, :a, :b, :e, :f]
10
+ #
11
+ # For single value reorder pass is without array wrap
12
+ # Example:
13
+ # Array::Reorder.call(array: [:a, :b, :c, :d, :e, :f], values: :d, options: :first)
14
+ #
15
+ # For reordering with <code>`first`</code> and <code>`last`</code> options you must give this option as symbols.
16
+ # Example:
17
+ # Array::Reorder.call(array: [:a, :b, :c, :d, :e, :f], values: [:e, :f], options: :first)
18
+ #
19
+ # For reorderind with <code>`before`</code> and <code>`after`</code> options you must give option together with
20
+ # target value as hash.
21
+ # Example:
22
+ # Array::Reorder.call(array: [:a, :b, :c, :d, :e, :f], values: [:e, :f], options: {after: :b})
23
+
24
+ include Releaf::Service
25
+
26
+ attribute :array, Array
27
+ attribute :values, Array
28
+ attribute :options, Object
29
+
30
+ def values=(val)
31
+ val = [val] unless val.is_a? Array
32
+ super
33
+ end
34
+
35
+ def call
36
+ deleted_values = delete(values)
37
+ index = reorder_index(options)
38
+
39
+ values.reverse_each do|value|
40
+ array.insert(index, deleted_values[value])
41
+ end
42
+
43
+ array
44
+ end
45
+
46
+ def reorder_index(options)
47
+ if options == :first
48
+ 0
49
+ elsif options == :last
50
+ array.length
51
+ elsif options[:after]
52
+ index(options[:after]) + 1
53
+ elsif options[:before]
54
+ index(options[:before])
55
+ else
56
+ raise ArgumentError, "unknown reorder option"
57
+ end
58
+ end
59
+
60
+ def delete(values)
61
+ deleted = {}
62
+
63
+ values.each do|value|
64
+ index = index(value)
65
+ deleted[value] = array[index]
66
+ array.delete_at(index)
67
+ end
68
+
69
+ deleted
70
+ end
71
+
72
+ def index(value)
73
+ value = value.to_s
74
+ array.index do |existing_value|
75
+ if existing_value.is_a? Hash
76
+ existing_value.keys.first.to_s == value
77
+ else
78
+ existing_value.to_s == value
79
+ end
80
+ end
81
+ end
82
+ end
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -7,6 +7,11 @@ module Dummy
7
7
 
8
8
  source_root File.expand_path('../templates', __FILE__)
9
9
 
10
+ def install_assets
11
+ copy_files 'assets', 'app/assets'
12
+ append_file 'config/initializers/assets.rb', "Rails.application.config.assets.precompile += %w( controllers/*.css controllers/*.js )\n"
13
+ end
14
+
10
15
  private
11
16
 
12
17
  def get_current_dir
@@ -0,0 +1,23 @@
1
+ window.ckeditor_configuration["default"] = {
2
+ language: 'en',
3
+ entities_latin: false,
4
+ forcePasteAsPlainText: true,
5
+ height: '400px',
6
+ allowedContent: true,
7
+ format_tags: 'p;h2;h3',
8
+ toolbar: [
9
+ ['Bold', 'Italic']
10
+ ]
11
+ };
12
+
13
+ window.ckeditor_configuration["summary"] = {
14
+ language: 'en',
15
+ entities_latin: false,
16
+ forcePasteAsPlainText: true,
17
+ height: '400px',
18
+ allowedContent: true,
19
+ format_tags: 'p;h2;h3',
20
+ toolbar: [
21
+ ['Bold', 'Italic', 'Image']
22
+ ]
23
+ };
@@ -0,0 +1 @@
1
+ //= require controllers/releaf/content/nodes
@@ -0,0 +1 @@
1
+ //= require controllers/releaf/content/nodes
@@ -0,0 +1 @@
1
+ @import 'controllers/releaf/content/nodes';
@@ -0,0 +1 @@
1
+ @import 'controllers/releaf/content/nodes';
@@ -7,7 +7,17 @@ module Admin::Books
7
7
  def book_sequels_sequel_id_options
8
8
  original_book = options[:parent_builder].object
9
9
  books = Book.where(Book.arel_table[:id].not_eq(original_book.id))
10
- options_from_collection_for_select(books, :id, :to_text, object.sequel_id)
10
+ options_from_collection_for_select(books, :id, :title, object.sequel_id)
11
+ end
12
+
13
+ def richtext_input_attributes(name)
14
+ attributes = super(name)
15
+
16
+ if name == "summary_html"
17
+ attributes[:data][:type] = "summary"
18
+ end
19
+
20
+ attributes
11
21
  end
12
22
  end
13
23
  end
@@ -1,19 +1,43 @@
1
1
  Dummy::Application.routes.draw do
2
+
2
3
  mount_releaf_at '/admin' do
3
4
  releaf_resources :books, :authors, :chapters, :publishers
4
5
  end
5
6
 
6
- releaf_routes_for(HomePage) do
7
- get 'show'
8
- end
7
+ # SINGLE NODE CLASS CASE:
8
+
9
+ # node_routes_for(HomePage) do
10
+ # get 'show', as: "home_page"
11
+ # end
12
+
13
+
14
+ # MULTIPLE NODE CLASSES CASE:
15
+
16
+ # automatic hostname constraints for all defined nodes/sites:
17
+ node_routing( Releaf::Content.routing ) do
18
+
19
+ node_routes_for(HomePage) do
20
+ get 'show', as: "home_page"
21
+ end
22
+
23
+ node_routes_for(TextPage) do
24
+ get 'show'
25
+ end
9
26
 
10
- releaf_routes_for(TextPage) do
11
- get 'show'
12
27
  end
13
28
 
14
- releaf_routes_for(ContactsController) do
15
- get 'show'
29
+ # manual hostname constraint blocks for nodes specific to a single site:
30
+ constraints Releaf::Content.routing['Node'][:constraints] do
31
+
32
+ # contacts page route will be only on main site
33
+ node_routes_for(ContactsController, node_class: 'Node') do
34
+ get 'show', as: "contacts_page"
35
+ end
36
+
16
37
  end
17
38
 
18
39
  root to: 'application#redirect_to_locale_root'
40
+
41
+ match "*not_found_path", to: "application#render_404", via: [:get, :post], format: false
42
+
19
43
  end
@@ -1,12 +1,9 @@
1
- class Admin::AuthorsController < Releaf::BaseController
1
+ class Admin::AuthorsController < Releaf::ActionController
2
2
  def searchable_fields
3
3
  [:name, :surname, books: [:title, chapters: [:title]]]
4
4
  end
5
5
 
6
- protected
7
-
8
- def setup
9
- super
10
- @resources_per_page = params.has_key?(:show_all) ? nil : 20
6
+ def resources_per_page
7
+ params.has_key?(:show_all) ? nil : 20
11
8
  end
12
9
  end
@@ -1,4 +1,4 @@
1
- class Admin::BooksController < Releaf::BaseController
1
+ class Admin::BooksController < Releaf::ActionController
2
2
 
3
3
  def searchable_fields
4
4
  [:title, :genre, author: [:name] ]
@@ -1,3 +1,3 @@
1
- class Admin::ChaptersController < Releaf::BaseController
1
+ class Admin::ChaptersController < Releaf::ActionController
2
2
  end
3
3
 
@@ -0,0 +1,3 @@
1
+ class Admin::NodesController < Releaf::Content::NodesController
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class Admin::OtherSite::OtherNodesController < Releaf::Content::NodesController
2
+
3
+ end
@@ -1,3 +1,3 @@
1
- class Admin::PublishersController < Releaf::BaseController
1
+ class Admin::PublishersController < Releaf::ActionController
2
2
  end
3
3
 
@@ -4,9 +4,9 @@ class ApplicationController < ActionController::Base
4
4
  rescue_from ActiveRecord::RecordNotFound, with: :render_404
5
5
 
6
6
  protect_from_forgery with: :exception
7
- before_filter :set_locale
7
+ before_action :set_locale
8
8
  layout "application"
9
- helper_method :translation_scope
9
+ helper_method :translation_scope, :node_class, :site
10
10
 
11
11
  def render_404
12
12
  render file: Rails.root.join('public', '404.html'), status: 404, layout: nil
@@ -21,7 +21,7 @@ class ApplicationController < ActionController::Base
21
21
  # use first root
22
22
  target_root = available_roots.first
23
23
  if target_root
24
- redirect_to target_root.url
24
+ redirect_to target_root.path
25
25
  else
26
26
  render text: "Welcome to Releaf", layout: true
27
27
  end
@@ -31,9 +31,31 @@ class ApplicationController < ActionController::Base
31
31
  "public." + self.class.name.gsub("Controller", "").underscore
32
32
  end
33
33
 
34
- private
34
+ def node_class
35
+ if @node_class.blank?
36
+ # this method detects whether the dummy application is running in a single or multiple node context
37
+ routing = Releaf::Content.routing
38
+
39
+ if routing.length == 1
40
+ # for single node class site
41
+ # the node class is the first and only defined class
42
+ node_class = routing.keys.first.constantize
43
+ else
44
+ # for multinode sites
45
+ # for non-node routes the node class can be detected from hostname via routing config
46
+ node_class = Releaf::Content.routing.find { |node_class_name, options| request.host =~ options[:constraints][:host] }.first.constantize
47
+ end
48
+ @node_class = node_class
49
+ end
50
+ @node_class
51
+ end
52
+
53
+ def site
54
+ # for non-node routes site is detectable from node class via routing config
55
+ @site = Releaf::Content.routing[node_class.name][:site]
56
+ end
35
57
 
36
58
  def available_roots
37
- @roots ||= Node.roots.where(locale: I18n.available_locales, active: true)
59
+ @roots ||= node_class.roots.where(locale: I18n.available_locales, active: true)
38
60
  end
39
61
  end
@@ -2,7 +2,7 @@ module NodeController
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  included do
5
- before_filter :load_node
5
+ before_action :load_node
6
6
  # node finding helpers
7
7
  helper_method :root_node, :menu, :node_active?
8
8
  end
@@ -18,6 +18,16 @@ module NodeController
18
18
  @menu ||= root_node.children.where(active: true)
19
19
  end
20
20
 
21
+ def node_class
22
+ # for node routes the node class can be detected from params
23
+ @node_class ||= params[:node_class].constantize
24
+ end
25
+
26
+ def site
27
+ # for node routes site can be detected from params
28
+ @site ||= params[:site]
29
+ end
30
+
21
31
  def node_active? node
22
32
  @active_nodes.include? node
23
33
  end
@@ -25,12 +35,12 @@ module NodeController
25
35
  private
26
36
 
27
37
  def load_node
28
- @node = Node.find(params[:node_id])
38
+ @node = node_class.find(params[:node_id])
29
39
  @content = @node.content unless @node.nil?
30
40
 
31
41
  @active_nodes = []
32
42
  if @node.present?
33
- @active_nodes += @node.ancestors.reorder(Node.arel_table[:depth])
43
+ @active_nodes += @node.ancestors.reorder(node_class.arel_table[:depth])
34
44
  @active_nodes << @node
35
45
  end
36
46
  end
@@ -1,3 +1,5 @@
1
- class ContactsController < ActionController::Base
1
+ class ContactsController < ApplicationController
2
2
  acts_as_node
3
+ include NodeController
4
+
3
5
  end
@@ -3,33 +3,39 @@ Releaf.application.configure do
3
3
 
4
4
  ### setup menu items and therefore available controllers
5
5
  config.menu = [
6
- {
7
- :controller => 'releaf/content/nodes',
8
- :icon => 'sitemap',
9
- },
10
- {
11
- :name => "inventory",
12
- :items => %w[admin/books admin/authors admin/publishers],
13
- :icon => 'briefcase',
14
- },
15
- {
16
- :name => "permissions",
17
- :items => %w[releaf/permissions/users releaf/permissions/roles],
18
- :icon => 'user',
19
- },
20
- {
21
- :controller => "releaf/core/settings",
22
- :icon => 'cog',
23
- },
24
- {
25
- :controller => 'releaf/i18n_database/translations',
26
- :icon => 'group',
27
- },
6
+ "admin/nodes",
7
+ {name: "inventory", items: %w[admin/books admin/authors admin/publishers]},
8
+ {name: "permissions", items: %w[releaf/permissions/users releaf/permissions/roles]},
9
+ "releaf/settings",
10
+ "releaf/i18n_database/translations"
28
11
  ]
29
12
 
30
- config.additional_controllers = %w[admin/chapters releaf/permissions/profile]
31
- config.components = [Releaf::I18nDatabase, Releaf::Permissions, Releaf::Content, Releaf::Core::SettingsUIComponent]
13
+ config.additional_controllers = %w[admin/chapters]
14
+ config.components = [Releaf::Core, Releaf::I18nDatabase, Releaf::Permissions, Releaf::Content]
32
15
  config.available_locales = ["en", "lv"]
33
16
  # conf.layout_builder_class_name = "CustomLayoutBuilder"
34
- # conf.devise_for 'releaf/admin'
17
+ # conf.permissions.devise_for 'releaf/admin'
18
+
19
+ config.content.resources = { 'Node' => { controller: 'Admin::NodesController' } }
20
+
21
+ # MULTIPLE NODES CASE:
22
+ # config.content.resources = {
23
+ # 'Node' => {
24
+ # controller: 'Releaf::Content::NodesController',
25
+ # routing: {
26
+ # site: "main_site",
27
+ # constraints: { host: /^(www\.)?releaf\.local$/ }
28
+ # }
29
+ # },
30
+ # 'OtherSite::OtherNode' => {
31
+ # controller: 'Admin::OtherSite::OtherNodesController',
32
+ # routing: {
33
+ # site: "other_site",
34
+ # constraints: { host: /^(www\.)?other\.releaf\.local$/ }
35
+ # }
36
+ # }
37
+ # }
38
+
39
+ # DEFAULT SINGLE NODE CASE:
40
+ # config.content.resources = { 'Node' => { controller: 'Releaf::Content::NodesController' } }
35
41
  end
@@ -2,6 +2,7 @@ class CreateHomePages < ActiveRecord::Migration
2
2
  def change
3
3
  create_table :home_pages do |t|
4
4
  t.text :intro_text_html
5
+ t.string :banner_uid
5
6
 
6
7
  t.timestamps(null: false)
7
8
  end
@@ -0,0 +1,29 @@
1
+ class CreateOtherNodes < ActiveRecord::Migration
2
+ def change
3
+ create_table "other_nodes", :force => true do |t|
4
+ t.string "name"
5
+ t.string "slug"
6
+ t.integer "parent_id"
7
+ t.integer "lft"
8
+ t.integer "rgt"
9
+ t.integer "depth"
10
+ t.string "locale", :limit => 6
11
+ t.string "content_type"
12
+ t.integer "content_id"
13
+ t.datetime "created_at", :null => false
14
+ t.datetime "updated_at", :null => false
15
+ t.integer "item_position"
16
+ t.boolean 'active', :null => false, :default => true
17
+ t.text 'description'
18
+ end
19
+ add_index :other_nodes, :parent_id
20
+ add_index :other_nodes, [:content_type, :content_id]
21
+ add_index :other_nodes, :lft
22
+ add_index :other_nodes, :rgt
23
+ add_index :other_nodes, :depth
24
+ add_index :other_nodes, :slug
25
+ add_index :other_nodes, :name
26
+ add_index :other_nodes, :active
27
+ add_index :other_nodes, :locale
28
+ end
29
+ end
@@ -4,7 +4,7 @@ class Author < ActiveRecord::Base
4
4
 
5
5
  has_many :books, dependent: :restrict_with_exception
6
6
 
7
- def to_text
8
- return "#{name} #{surname}"
7
+ def releaf_title
8
+ "#{name} #{surname}"
9
9
  end
10
10
  end
@@ -14,6 +14,4 @@ class Book < ActiveRecord::Base
14
14
  accepts_nested_attributes_for :book_sequels, allow_destroy: true
15
15
 
16
16
  dragonfly_accessor :cover_image
17
-
18
- alias_attribute :to_text, :title
19
17
  end
@@ -1,7 +1,5 @@
1
- # TODO convert to arel
2
1
  class Chapter < ActiveRecord::Base
3
2
  validates_presence_of :title, :text, :book, :sample_html
4
3
  belongs_to :book
5
- alias_attribute :to_text, :title
6
4
  default_scope { order('chapters.item_position ASC') }
7
5
  end
@@ -2,4 +2,5 @@ class HomePage < ActiveRecord::Base
2
2
  acts_as_node
3
3
  has_many :banners, dependent: :destroy
4
4
  accepts_nested_attributes_for :banners, allow_destroy: true
5
+ dragonfly_accessor :banner
5
6
  end
@@ -0,0 +1,7 @@
1
+ class OtherSite::OtherNode < ActiveRecord::Base
2
+ include Releaf::Content::Node
3
+
4
+ def locale_selection_enabled?
5
+ root?
6
+ end
7
+ end