releaf-core 0.2.1 → 1.0.3

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 (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