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
@@ -1,9 +1,4 @@
1
1
  class Publisher < ActiveRecord::Base
2
2
  validates_presence_of :title
3
-
4
3
  has_many :authors, dependent: :restrict_with_exception
5
-
6
- def to_text
7
- title
8
- end
9
4
  end
@@ -1,5 +1,4 @@
1
1
  class TextPage < ActiveRecord::Base
2
2
  acts_as_node
3
3
  validates_presence_of :text_html
4
- alias_attribute :to_text, :id
5
4
  end
@@ -1 +1 @@
1
- = link_to "Releaf gihub repository", 'https://github.com/cubesystems/releaf'
1
+ = link_to "Releaf github repository", 'https://github.com/cubesystems/releaf'
@@ -13,7 +13,15 @@
13
13
  #body_wrap
14
14
  #content_wrap
15
15
  #header
16
- Header
16
+ %p
17
+ Site:
18
+ = site
19
+ %p
20
+ Node class:
21
+ = node_class
22
+ %p
23
+ Node name:
24
+ = @node.name if @node.present?
17
25
  #content= yield
18
26
  #footer
19
27
  Footer
@@ -1 +1 @@
1
- =@text.text_html.html_safe
1
+ =@content.text_html.html_safe
@@ -3,28 +3,17 @@ 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 => "permissions",
12
- :items => %w[releaf/permissions/users releaf/permissions/roles],
13
- :icon => 'user',
14
- },
15
- {
16
- :controller => 'releaf/i18n_database/translations',
17
- :icon => 'group',
18
- },
6
+ "releaf/content/nodes",
7
+ {name: "permissions", items: %w[releaf/permissions/users releaf/permissions/roles]},
8
+ "releaf/i18n_database/translations"
19
9
  ]
20
10
 
21
11
  # controllers that must be accessible by user, but are not visible in menu
22
12
  # should be added to this list
23
- config.additional_controllers = ['releaf/permissions/profile']
24
-
25
- config.components = [Releaf::I18nDatabase, Releaf::Permissions, Releaf::Content]
13
+ # config.additional_controllers = %w[admin/chapters]
14
+ config.components = [Releaf::Core, Releaf::I18nDatabase, Releaf::Permissions, Releaf::Content]
26
15
 
27
16
  config.available_locales = ["en"]
28
17
  # config.layout_builder_class_name = 'CustomLayoutBuilder'
29
- # config.devise_for 'releaf/admin'
18
+ # conf.permissions.devise_for 'releaf/admin'
30
19
  end
@@ -1,21 +1,20 @@
1
1
  class CreateReleafTranslations < ActiveRecord::Migration
2
2
  def change
3
- create_table :releaf_translations do |t|
4
- t.string :key, :null => false
5
-
6
- t.timestamps(null: false)
3
+ create_table :releaf_i18n_entries do |t|
4
+ t.string :key, null: false
5
+ t.timestamps null: false
7
6
  end
8
- add_index :releaf_translations, :key, :unique => true
9
-
10
- create_table :releaf_translation_data do |t|
11
- t.integer :translation_id, :null => false
12
- t.string :lang, :null => false, :limit => 5
13
- t.text :localization
7
+ add_index :releaf_i18n_entries, :key
14
8
 
15
- t.timestamps(null: false)
9
+ create_table :releaf_i18n_entry_translations do |t|
10
+ t.integer :i18n_entry_id, null: false
11
+ t.string :locale, null: false, limit: 5
12
+ t.text :text
13
+ t.timestamps null: false
16
14
  end
17
- add_index :releaf_translation_data, :lang
18
- add_index :releaf_translation_data, :translation_id
19
- add_index :releaf_translation_data, [:lang, :translation_id], :unique => true
15
+ add_index :releaf_i18n_entry_translations, :locale
16
+ add_index :releaf_i18n_entry_translations, :i18n_entry_id
17
+ add_index :releaf_i18n_entry_translations, [:locale, :i18n_entry_id], unique: true,
18
+ name: :index_releaf_i18n_entry_translations_on_locale_i18n_entry_id
20
19
  end
21
20
  end
@@ -1,7 +1,12 @@
1
+ # This file should contain all the record creation needed to seed the database with its default values.
2
+ # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
3
+ #
1
4
  [
2
5
  Releaf::Permissions::User,
3
6
  Releaf::Permissions::Role,
4
- Releaf::Permissions::Permission
7
+ Releaf::Permissions::Permission,
8
+ Releaf::I18nDatabase::I18nEntry,
9
+ Releaf::I18nDatabase::I18nEntryTranslation
5
10
  ].each do |descendant|
6
11
  descendant.unscoped.delete_all
7
12
  end
@@ -9,46 +14,37 @@ end
9
14
  # Role {{{
10
15
 
11
16
  puts "Creating roles"
12
- super_admin = Releaf::Permissions::Role.new(name: "super admin", default_controller: "releaf/permissions/users")
17
+ role = Releaf::Permissions::Role.new(name: "super admin", default_controller: "releaf/permissions/users")
13
18
  Releaf.application.config.available_controllers.each do|controller|
14
- super_admin.permissions.build(permission: "controller.#{controller}")
19
+ role.permissions.build(permission: "controller.#{controller}")
15
20
  end
16
- super_admin.save!
17
21
 
18
- content_manager = Releaf::Permissions::Role.new(name: "content mager", default_controller: "releaf/content/nodes")
19
- content_manager.permissions.build(permission: "controller.releaf/content/nodes")
20
- content_manager.save!
22
+ role.save!
21
23
 
22
24
  # }}}
23
25
  # User {{{
24
26
 
25
27
  puts "Creating users"
26
- users = {
27
- user: {
28
- name: 'Admin',
29
- surname: 'User',
30
- password: 'password',
31
- password_confirmation: 'password',
32
- locale: "en",
33
- email: 'admin@example.com',
34
- role: super_admin,
35
- },
36
- simple_user: {
37
- name: 'Simple',
38
- surname: 'User',
39
- password: 'password',
40
- password_confirmation: 'password',
41
- locale: "en",
42
- email: 'user@example.com',
43
- role: content_manager,
44
- }
45
- }
46
-
47
- users.each_value do |attributes|
48
- Releaf::Permissions::User.create!(attributes)
49
- end
28
+ Releaf::Permissions::User.create!(
29
+ name: 'Admin',
30
+ surname: 'User',
31
+ password: 'password',
32
+ password_confirmation: 'password',
33
+ locale: "en",
34
+ email: 'admin@example.com',
35
+ role: role,
36
+ )
37
+
38
+
50
39
 
51
40
  # }}}
41
+ # Translations {{{
52
42
 
53
- # vim: set fdm=marker:
43
+ puts "Importing translations"
44
+ import_file_path = File.join(Gem.loaded_specs["releaf"].full_gem_path, "releaf-i18n_database", "misc", "translations.xlsx")
45
+ translations = Releaf::I18nDatabase::ParseSpreadsheetTranslations.call(file_path: import_file_path, extension: "xlsx")
46
+ translations.each{|translation| translation.save! }
54
47
 
48
+ # }}}
49
+
50
+ # vim: set fdm=marker:
@@ -1,14 +1,15 @@
1
- module Releaf::Core
1
+ module Releaf
2
2
  class Application
3
3
  attr_accessor :config
4
4
 
5
5
  def configure(&block)
6
- self.config = Releaf::Core::Configuration.new
6
+ self.config = Releaf::Configuration.new
7
7
  instance_eval(&block)
8
- config.configure
8
+ config.initialize_locales
9
+ config.initialize_components
9
10
  end
10
11
 
11
- def render_layout(template, &block)
12
+ def render_layout(template)
12
13
  builder_class = config.layout_builder_class_name.constantize
13
14
  builder_class.new(template).output{ yield }.html_safe
14
15
  end
@@ -1,7 +1,11 @@
1
- module Releaf::Core::Component
1
+ module Releaf::Component
2
2
  def resource_route(router, namespace, resource)
3
3
  router.namespace :releaf, path: nil do
4
- router.namespace namespace, path: nil do
4
+ if namespace
5
+ router.namespace namespace, path: nil do
6
+ router.releaf_resources(resource)
7
+ end
8
+ else
5
9
  router.releaf_resources(resource)
6
10
  end
7
11
  end
@@ -0,0 +1,95 @@
1
+ module Releaf
2
+ class Configuration
3
+ include Virtus.model(strict: true)
4
+ attribute :components, Array, default: []
5
+ attribute :available_locales, Array, default: []
6
+ attribute :available_admin_locales, Array, default: []
7
+ attribute :layout_builder_class_name, String, default: 'Releaf::Builders::Page::LayoutBuilder'
8
+ attribute :settings_manager, Class
9
+ attribute :menu, Array, default: []
10
+ attribute :mount_location, String, default: ""
11
+ attribute :additional_controllers, Array, default: []
12
+
13
+ def components=(value)
14
+ super(flatten_components(value))
15
+ components.each do|component_class|
16
+ component_class.configure_component if component_class.respond_to? :configure_component
17
+ end
18
+ end
19
+
20
+ def initialize_components
21
+ components.each do|component_class|
22
+ component_class.initialize_component if component_class.respond_to? :initialize_component
23
+ end
24
+ end
25
+
26
+ def add_configuration(configuration)
27
+ configuration_name = configuration.class.name.gsub(/Configuration$/, "").split("::").last.underscore
28
+
29
+ self.class.send(:attr_accessor, configuration_name)
30
+ send("#{configuration_name}=", configuration)
31
+ end
32
+
33
+ def initialize_defaults
34
+ self.class.default_values.each_pair do|key, value|
35
+ send("#{key}=", value)
36
+ end
37
+ end
38
+
39
+ def initialize_locales
40
+ ::I18n.available_locales = available_locales
41
+ self.available_admin_locales = available_locales if available_admin_locales.empty?
42
+ end
43
+
44
+ def all_locales
45
+ @all_locales ||= (available_locales + available_admin_locales).map(&:to_s).uniq
46
+ end
47
+
48
+ def flatten_components(raw_components)
49
+ raw_components.each.inject([]) do |list, component_class|
50
+ list += flatten_components(component_class.components) if component_class.respond_to? :components
51
+ list << component_class # add component itself latter as there can be dependancy to be loadable first
52
+ end
53
+ end
54
+
55
+ def available_controllers
56
+ @available_controllers ||= controllers.keys
57
+ end
58
+
59
+ def controllers
60
+ @controllers ||= extract_controllers(menu + additional_controllers)
61
+ end
62
+
63
+ def menu=(value)
64
+ super(self.class.normalize_controllers(value))
65
+ end
66
+
67
+ def additional_controllers=(value)
68
+ super(self.class.normalize_controllers(value))
69
+ end
70
+
71
+ def extract_controllers(list)
72
+ list.each.inject({}) do |controller_list, item|
73
+ if item.respond_to? :controllers
74
+ controller_list.merge!(extract_controllers(item.controllers))
75
+ else
76
+ controller_list[item.controller_name] = item
77
+ end
78
+
79
+ controller_list
80
+ end
81
+ end
82
+
83
+ def self.normalize_controllers(list)
84
+ list.map do |item|
85
+ if item.is_a?(Hash) && item.has_key?(:items)
86
+ ControllerGroupDefinition.new(item)
87
+ elsif item.is_a?(Hash) || item.is_a?(String)
88
+ ControllerDefinition.new(item)
89
+ else
90
+ item
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,5 @@
1
+ class Array
2
+ def reorder(values, options)
3
+ Array::Reorder.call(array: self, values: values, options: options)
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ module Releaf
2
+ class Engine < ::Rails::Engine
3
+ initializer 'releaf.assets_precompile', group: :all do |app|
4
+ app.config.assets.precompile += %w(ckeditor/*)
5
+ app.config.assets.precompile += %w(releaf/application.css releaf/controllers/*.css releaf/*.js releaf/*.png releaf/*.gif releaf/*.ico)
6
+ end
7
+
8
+ initializer 'releaf.route_mapper', after: 'action_dispatch.prepare_dispatcher' do
9
+ ActionDispatch::Routing::Mapper.send(:include, Releaf::RouteMapper)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ module Releaf
2
+ class Error < StandardError; end
3
+ class AccessDenied < Error; end
4
+ class FeatureDisabled < Error; end
5
+ end
@@ -0,0 +1,72 @@
1
+ module Releaf::InstanceCache
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ cattr_accessor :cached_instance_methods, :instance_methods_to_cache
6
+
7
+ self.cached_instance_methods = []
8
+ self.instance_methods_to_cache = []
9
+
10
+ def self.instance_cache_original_method_name(method_name)
11
+ "instance_cache_original_#{method_name}"
12
+ end
13
+
14
+ if respond_to?(:method_added)
15
+ # preserve any previous definitions of method_added
16
+ singleton_class.send(:alias_method, instance_cache_original_method_name(:method_added), :method_added)
17
+ end
18
+
19
+ def self.method_added(method_name)
20
+ # call previous definition of method_added if present
21
+ parent_method_added = instance_cache_original_method_name(:method_added)
22
+ send(parent_method_added, method_name) if respond_to?(parent_method_added)
23
+
24
+ # see if the newly added method is in the queue needing to be cached
25
+ method_needs_to_be_cached = instance_methods_to_cache.delete(method_name)
26
+ if method_needs_to_be_cached.present?
27
+ create_instance_cache_method_alias(method_name)
28
+ end
29
+ end
30
+
31
+ def self.cache_instance_methods(*method_names)
32
+ method_names.each { |method_name| cache_instance_method(method_name) }
33
+ end
34
+
35
+ def self.cache_instance_method method_name
36
+ if instance_methods.include?(method_name)
37
+ # method already defined, alias it
38
+ create_instance_cache_method_alias method_name
39
+ else
40
+ # method not defined yet, add to queue
41
+ instance_methods_to_cache << method_name
42
+ end
43
+ end
44
+
45
+ def self.create_instance_cache_method_alias method_name
46
+ original_method_name = instance_cache_original_method_name( method_name )
47
+ alias_method original_method_name, method_name
48
+ define_method(method_name) do
49
+ instance_cache(method_name) do
50
+ send(original_method_name)
51
+ end
52
+ end
53
+ self.cached_instance_methods << method_name
54
+ end
55
+ end
56
+
57
+ def instance_cache_store
58
+ @instance_cache_store ||= {}
59
+ end
60
+
61
+ def reset_instance_cache
62
+ @instance_cache_store = {}
63
+ end
64
+
65
+ def instance_cache(key)
66
+ if instance_cache_store.key?(key)
67
+ instance_cache_store[key]
68
+ else
69
+ instance_cache_store[key] = yield
70
+ end
71
+ end
72
+ end
@@ -23,7 +23,7 @@ module ActiveModel
23
23
  self[attribute] << ErrorMessage.new(message, error_code, options[:data])
24
24
  end
25
25
 
26
- def normalize_error_code(attribute, message, options)
26
+ def normalize_error_code(_attribute, message, options)
27
27
  if !options[:error_code].blank?
28
28
  options[:error_code]
29
29
  elsif message.class == Symbol
@@ -0,0 +1,6 @@
1
+ module Releaf::Root
2
+ class Configuration
3
+ include Virtus.model(strict: true)
4
+ attribute :default_controller_resolver, Class
5
+ end
6
+ end
@@ -0,0 +1,37 @@
1
+ module Releaf::Root
2
+ class DefaultControllerResolver
3
+ include Releaf::Service
4
+ attribute :current_controller
5
+
6
+ def call
7
+ controllers.each do |controller_name|
8
+ path = controller_index_path(controller_name)
9
+ return path if path
10
+ end
11
+
12
+ nil
13
+ end
14
+
15
+ def controller_index_path(controller_name)
16
+ route_options = {controller: controller_name, action: "index"}
17
+
18
+ subdomain.present? && route_path(route_options.merge(subdomain: subdomain)) || route_path(route_options)
19
+ end
20
+
21
+ def route_path(route_options)
22
+ Rails.application.routes.url_helpers.url_for(route_options.merge(only_path: true)) if route_exists?(route_options)
23
+ end
24
+
25
+ def controllers
26
+ Releaf.application.config.available_controllers
27
+ end
28
+
29
+ def route_exists?(route_options)
30
+ Rails.application.routes.routes.map(&:defaults).include?(route_options)
31
+ end
32
+
33
+ def subdomain
34
+ current_controller.request.subdomain
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,12 @@
1
+ module Releaf::Root
2
+ class SettingsManager
3
+
4
+ def self.read(controller:, key:)
5
+ controller.send(:cookies)[key]
6
+ end
7
+
8
+ def self.write(controller:, key:, value:)
9
+ controller.send(:cookies)[key] = value
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ module Releaf::Root
2
+ extend Releaf::Component
3
+
4
+ def self.configure_component
5
+ Releaf.application.config.add_configuration(
6
+ Releaf::Root::Configuration.new(default_controller_resolver: Releaf::Root::DefaultControllerResolver)
7
+ )
8
+ Releaf.application.config.settings_manager = Releaf::Root::SettingsManager
9
+ end
10
+
11
+ def self.draw_component_routes(router)
12
+ router.namespace :releaf, path: nil do
13
+ router.root to: "root#home", as: :root
14
+ router.post "store_settings", to: "root#store_settings"
15
+ end
16
+ end
17
+ end
@@ -1,8 +1,8 @@
1
- module Releaf::Core::RouteMapper
1
+ module Releaf::RouteMapper
2
2
  # Pass given resource to "resources" mount method and
3
3
  # add extra routes for members and collections needed by releaf
4
- def releaf_resources(*args, &block)
5
- resources *args do
4
+ def releaf_resources(*args)
5
+ resources(*args) do
6
6
  yield if block_given?
7
7
  member do
8
8
  get :confirm_destroy if route_enabled?(:destroy, args.last)
@@ -22,8 +22,8 @@ module Releaf::Core::RouteMapper
22
22
  end
23
23
  end
24
24
 
25
- def mount_releaf_at(mount_location, options={}, &block)
26
- mount_location_namespace = mount_location.gsub("/", "").to_sym
25
+ def mount_releaf_at(mount_location)
26
+ mount_location_namespace = mount_location.delete("/").to_sym
27
27
  Releaf.application.config.mount_location = mount_location_namespace.to_s
28
28
  scope mount_location do
29
29
  initialize_releaf_components
@@ -37,7 +37,7 @@ module Releaf::Core::RouteMapper
37
37
  end
38
38
 
39
39
  namespace :releaf, path: nil do
40
- get '/*path' => 'core/errors#page_not_found'
40
+ get '/*path' => 'errors#page_not_found'
41
41
  end
42
42
  end
43
43
  end
@@ -0,0 +1,11 @@
1
+ module Releaf::Service
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ include Virtus.model(strict: true)
6
+
7
+ def self.call(*args)
8
+ new(*args).call
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Releaf::SettingsUI
2
+ extend Releaf::Component
3
+
4
+ def self.draw_component_routes router
5
+ resource_route(router, nil, :settings)
6
+ end
7
+ end
@@ -1,3 +1,3 @@
1
1
  module Releaf
2
- VERSION = "0.2.1"
2
+ VERSION = "1.0.3"
3
3
  end
data/lib/releaf-core.rb CHANGED
@@ -1,14 +1,43 @@
1
+ require 'rails-settings-cached'
2
+ require 'ckeditor_rails'
3
+ require 'will_paginate'
4
+ require 'font-awesome-rails'
5
+ require 'haml'
6
+ require 'haml-rails'
7
+ require 'jquery-rails'
8
+ require 'jquery-ui-rails'
9
+ require 'vanilla-ujs'
10
+ require 'acts_as_list'
11
+ require 'dragonfly'
12
+ require 'globalize'
13
+ require 'virtus'
14
+ require 'globalize-accessors'
15
+
1
16
  module Releaf
2
- require 'releaf/core/engine'
3
- require 'releaf/core/configuration'
4
- require 'releaf/core/application'
5
- require 'releaf/core/route_mapper'
6
- require 'releaf/core/exceptions'
7
- require 'releaf/core/validation_error_codes'
17
+ module Core
18
+ require 'releaf/engine'
19
+ require 'releaf/service'
20
+ require 'releaf/instance_cache'
21
+ require 'releaf/component'
22
+ require 'releaf/settings_ui'
23
+ require 'releaf/route_mapper'
24
+ require 'releaf/configuration'
25
+ require 'releaf/root'
26
+ require 'releaf/root/configuration'
27
+ require 'releaf/root/default_controller_resolver'
28
+ require 'releaf/root/settings_manager'
29
+ require 'releaf/application'
30
+ require 'releaf/route_mapper'
31
+ require 'releaf/exceptions'
32
+ require 'releaf/core_ext/array/reorder'
33
+ require 'releaf/rails_ext/validation_error_codes'
8
34
 
9
- class << self
10
- def application
11
- @@application ||= Releaf::Core::Application.new
35
+ def self.components
36
+ [Releaf::SettingsUI, Releaf::Root]
12
37
  end
13
38
  end
39
+
40
+ def self.application
41
+ @@application ||= Releaf::Application.new
42
+ end
14
43
  end