releaf-core 0.2.1

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 (288) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +24 -0
  3. data/app/assets/fonts/releaf/RobotoRegular_normal_400.ttf +0 -0
  4. data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff +0 -0
  5. data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff2 +0 -0
  6. data/app/assets/images/releaf/icons/apple-touch-icon-114x114-precomposed.png +0 -0
  7. data/app/assets/images/releaf/icons/apple-touch-icon-152x152-precomposed.png +0 -0
  8. data/app/assets/images/releaf/icons/apple-touch-icon-72x72-precomposed.png +0 -0
  9. data/app/assets/images/releaf/icons/favicon.ico +0 -0
  10. data/app/assets/images/releaf/icons/favicon.png +0 -0
  11. data/app/assets/images/releaf/icons/msapplication-tile-144x144.png +0 -0
  12. data/app/assets/images/releaf/logo-login.png +0 -0
  13. data/app/assets/images/releaf/logo.png +0 -0
  14. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/hidpi/mediaembed.png +0 -0
  15. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/mediaembed.png +0 -0
  16. data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/en.js +12 -0
  17. data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/es.js +12 -0
  18. data/app/assets/javascripts/ckeditor/plugins/mediaembed/plugin.js +63 -0
  19. data/app/assets/javascripts/releaf/3rd_party/jquery-ui-timepicker-addon.js +1882 -0
  20. data/app/assets/javascripts/releaf/3rd_party/jquery.magnific-popup.min.js +4 -0
  21. data/app/assets/javascripts/releaf/application.js +13 -0
  22. data/app/assets/javascripts/releaf/include/ajax.js +66 -0
  23. data/app/assets/javascripts/releaf/include/ajaxbox.js +179 -0
  24. data/app/assets/javascripts/releaf/include/dialogs.js +13 -0
  25. data/app/assets/javascripts/releaf/include/field.type_associated_set.js +32 -0
  26. data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +73 -0
  27. data/app/assets/javascripts/releaf/include/field.type_richtext.js +188 -0
  28. data/app/assets/javascripts/releaf/include/loader.js +45 -0
  29. data/app/assets/javascripts/releaf/include/localization.js +213 -0
  30. data/app/assets/javascripts/releaf/include/nested_fields.js +295 -0
  31. data/app/assets/javascripts/releaf/include/notifications.js +267 -0
  32. data/app/assets/javascripts/releaf/include/pagination.js +19 -0
  33. data/app/assets/javascripts/releaf/include/profile_settings.js +28 -0
  34. data/app/assets/javascripts/releaf/include/remote_validator.js +437 -0
  35. data/app/assets/javascripts/releaf/include/search.js +140 -0
  36. data/app/assets/javascripts/releaf/include/sidebar.js +149 -0
  37. data/app/assets/javascripts/releaf/include/sortable.js +69 -0
  38. data/app/assets/javascripts/releaf/include/toolbox.js +221 -0
  39. data/app/assets/javascripts/releaf/include/url_builder.js +193 -0
  40. data/app/assets/stylesheets/releaf/application.scss +9 -0
  41. data/app/assets/stylesheets/releaf/environment/extras.scss +11 -0
  42. data/app/assets/stylesheets/releaf/environment/functions/units.scss +12 -0
  43. data/app/assets/stylesheets/releaf/environment/functions.scss +1 -0
  44. data/app/assets/stylesheets/releaf/environment/mixins/blocks.scss +133 -0
  45. data/app/assets/stylesheets/releaf/environment/mixins/elements.scss +64 -0
  46. data/app/assets/stylesheets/releaf/environment/mixins/text.scss +61 -0
  47. data/app/assets/stylesheets/releaf/environment/mixins.scss +3 -0
  48. data/app/assets/stylesheets/releaf/environment/variables/colors.scss +93 -0
  49. data/app/assets/stylesheets/releaf/environment/variables/dimensions.scss +0 -0
  50. data/app/assets/stylesheets/releaf/environment/variables/magnific-popup.scss +6 -0
  51. data/app/assets/stylesheets/releaf/environment/variables.scss +5 -0
  52. data/app/assets/stylesheets/releaf/environment.scss +4 -0
  53. data/app/assets/stylesheets/releaf/layout/base.scss +32 -0
  54. data/app/assets/stylesheets/releaf/layout/breadcrumbs.scss +47 -0
  55. data/app/assets/stylesheets/releaf/layout/buttons.scss +107 -0
  56. data/app/assets/stylesheets/releaf/layout/deprecated.scss +29 -0
  57. data/app/assets/stylesheets/releaf/layout/dialogs.scss +138 -0
  58. data/app/assets/stylesheets/releaf/layout/errors.scss +28 -0
  59. data/app/assets/stylesheets/releaf/layout/extras.scss +10 -0
  60. data/app/assets/stylesheets/releaf/layout/fields.scss +305 -0
  61. data/app/assets/stylesheets/releaf/layout/fonts.scss +16 -0
  62. data/app/assets/stylesheets/releaf/layout/footer.scss +80 -0
  63. data/app/assets/stylesheets/releaf/layout/forms.scss +23 -0
  64. data/app/assets/stylesheets/releaf/layout/header.scss +55 -0
  65. data/app/assets/stylesheets/releaf/layout/icons.scss +4 -0
  66. data/app/assets/stylesheets/releaf/layout/images.scss +4 -0
  67. data/app/assets/stylesheets/releaf/layout/links.scss +7 -0
  68. data/app/assets/stylesheets/releaf/layout/localization.scss +79 -0
  69. data/app/assets/stylesheets/releaf/layout/main.scss +43 -0
  70. data/app/assets/stylesheets/releaf/layout/notifications.scss +67 -0
  71. data/app/assets/stylesheets/releaf/layout/pagination.scss +18 -0
  72. data/app/assets/stylesheets/releaf/layout/search.scss +70 -0
  73. data/app/assets/stylesheets/releaf/layout/sections.scss +138 -0
  74. data/app/assets/stylesheets/releaf/layout/sidebar.scss +306 -0
  75. data/app/assets/stylesheets/releaf/layout/tables.scss +99 -0
  76. data/app/assets/stylesheets/releaf/layout/text.scss +31 -0
  77. data/app/assets/stylesheets/releaf/layout/toolboxes.scss +69 -0
  78. data/app/assets/stylesheets/releaf/layout.scss +35 -0
  79. data/app/assets/stylesheets/releaf/vendor/magnific-popup/main.scss +596 -0
  80. data/app/assets/stylesheets/releaf/vendor/magnific-popup/settings.scss +45 -0
  81. data/app/builders/releaf/builders/association_reflector.rb +58 -0
  82. data/app/builders/releaf/builders/base.rb +80 -0
  83. data/app/builders/releaf/builders/collection.rb +8 -0
  84. data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +25 -0
  85. data/app/builders/releaf/builders/confirm_dialog_builder.rb +54 -0
  86. data/app/builders/releaf/builders/edit_builder.rb +66 -0
  87. data/app/builders/releaf/builders/form_builder.rb +594 -0
  88. data/app/builders/releaf/builders/index_builder.rb +118 -0
  89. data/app/builders/releaf/builders/orderer.rb +5 -0
  90. data/app/builders/releaf/builders/page/header_builder.rb +70 -0
  91. data/app/builders/releaf/builders/page/layout_builder.rb +155 -0
  92. data/app/builders/releaf/builders/page/menu_builder.rb +140 -0
  93. data/app/builders/releaf/builders/pagination_builder.rb +107 -0
  94. data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +68 -0
  95. data/app/builders/releaf/builders/resource.rb +9 -0
  96. data/app/builders/releaf/builders/resource_dialog.rb +8 -0
  97. data/app/builders/releaf/builders/resource_view.rb +54 -0
  98. data/app/builders/releaf/builders/show_builder.rb +3 -0
  99. data/app/builders/releaf/builders/table_builder.rb +280 -0
  100. data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +40 -0
  101. data/app/builders/releaf/builders/template.rb +8 -0
  102. data/app/builders/releaf/builders/toolbox.rb +23 -0
  103. data/app/builders/releaf/builders/toolbox_builder.rb +27 -0
  104. data/app/builders/releaf/builders/view.rb +132 -0
  105. data/app/builders/releaf/builders.rb +38 -0
  106. data/app/builders/releaf/core/settings/form_builder.rb +21 -0
  107. data/app/builders/releaf/core/settings/table_builder.rb +11 -0
  108. data/app/controllers/concerns/releaf/breadcrumbs.rb +42 -0
  109. data/app/controllers/concerns/releaf/richtext_attachments.rb +20 -0
  110. data/app/controllers/releaf/base_controller.rb +458 -0
  111. data/app/controllers/releaf/core/errors_controller.rb +5 -0
  112. data/app/controllers/releaf/core/settings_controller.rb +50 -0
  113. data/app/helpers/releaf/application_helper.rb +53 -0
  114. data/app/helpers/releaf/button_helper.rb +50 -0
  115. data/app/helpers/releaf/javascript_helper.rb +75 -0
  116. data/app/lib/releaf/core/assets_resolver.rb +58 -0
  117. data/app/lib/releaf/core/default_searchable_fields.rb +43 -0
  118. data/app/lib/releaf/core/error_formatter.rb +103 -0
  119. data/app/lib/releaf/core/item_orderer.rb +102 -0
  120. data/app/lib/releaf/core/resource_base.rb +66 -0
  121. data/app/lib/releaf/core/resource_fields.rb +6 -0
  122. data/app/lib/releaf/core/resource_params.rb +47 -0
  123. data/app/lib/releaf/core/resource_table_fields.rb +10 -0
  124. data/app/lib/releaf/core/resource_utilities.rb +36 -0
  125. data/app/lib/releaf/core/responders/access_denied_responder.rb +9 -0
  126. data/app/lib/releaf/core/responders/after_save_responder.rb +28 -0
  127. data/app/lib/releaf/core/responders/confirm_destroy_responder.rb +13 -0
  128. data/app/lib/releaf/core/responders/destroy_responder.rb +10 -0
  129. data/app/lib/releaf/core/responders/error_responder.rb +9 -0
  130. data/app/lib/releaf/core/responders/feature_disabled_responder.rb +9 -0
  131. data/app/lib/releaf/core/responders/page_not_found_responder.rb +9 -0
  132. data/app/lib/releaf/core/responders.rb +31 -0
  133. data/app/lib/releaf/core/search.rb +147 -0
  134. data/app/lib/releaf/core/template_field_type_mapper.rb +127 -0
  135. data/app/models/releaf/richtext_attachment.rb +6 -0
  136. data/app/models/releaf/settings.rb +27 -0
  137. data/app/views/layouts/releaf/admin.html.erb +1 -0
  138. data/app/views/releaf/base/confirm_destroy.ruby +1 -0
  139. data/app/views/releaf/base/create_releaf_richtext_attachment.haml +1 -0
  140. data/app/views/releaf/base/edit.ruby +1 -0
  141. data/app/views/releaf/base/index.ruby +1 -0
  142. data/app/views/releaf/base/new.ruby +1 -0
  143. data/app/views/releaf/base/refused_destroy.ruby +1 -0
  144. data/app/views/releaf/base/show.ruby +1 -0
  145. data/app/views/releaf/base/toolbox.ruby +1 -0
  146. data/app/views/releaf/error_pages/_error.html.haml +10 -0
  147. data/app/views/releaf/error_pages/access_denied.html.haml +1 -0
  148. data/app/views/releaf/error_pages/feature_disabled.html.haml +1 -0
  149. data/app/views/releaf/error_pages/page_not_found.html.haml +2 -0
  150. data/lib/generators/dummy/install_generator.rb +18 -0
  151. data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +13 -0
  152. data/lib/generators/dummy/templates/builders/admin/books/index_builder.rb +30 -0
  153. data/lib/generators/dummy/templates/builders/admin/books/table_builder.rb +7 -0
  154. data/lib/generators/dummy/templates/builders/admin/nodes/form_builder.rb +7 -0
  155. data/lib/generators/dummy/templates/config/routes.rb +19 -0
  156. data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +12 -0
  157. data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +17 -0
  158. data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +3 -0
  159. data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +3 -0
  160. data/lib/generators/dummy/templates/controllers/application_controller.rb +39 -0
  161. data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
  162. data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +37 -0
  163. data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -0
  164. data/lib/generators/dummy/templates/controllers/home_pages_controller.rb +3 -0
  165. data/lib/generators/dummy/templates/controllers/text_pages_controller.rb +3 -0
  166. data/lib/generators/dummy/templates/initializers/releaf.rb +35 -0
  167. data/lib/generators/dummy/templates/migrations/create_authors.rb +14 -0
  168. data/lib/generators/dummy/templates/migrations/create_banners.rb +11 -0
  169. data/lib/generators/dummy/templates/migrations/create_book_sequels.rb +14 -0
  170. data/lib/generators/dummy/templates/migrations/create_books.rb +27 -0
  171. data/lib/generators/dummy/templates/migrations/create_bundles.rb +7 -0
  172. data/lib/generators/dummy/templates/migrations/create_chapters.rb +13 -0
  173. data/lib/generators/dummy/templates/migrations/create_home_pages.rb +9 -0
  174. data/lib/generators/dummy/templates/migrations/create_node_extra_fields.rb +5 -0
  175. data/lib/generators/dummy/templates/migrations/create_publishers.rb +8 -0
  176. data/lib/generators/dummy/templates/migrations/create_text_pages.rb +9 -0
  177. data/lib/generators/dummy/templates/models/author.rb +10 -0
  178. data/lib/generators/dummy/templates/models/banner.rb +5 -0
  179. data/lib/generators/dummy/templates/models/book.rb +19 -0
  180. data/lib/generators/dummy/templates/models/book_sequel.rb +4 -0
  181. data/lib/generators/dummy/templates/models/bundle.rb +17 -0
  182. data/lib/generators/dummy/templates/models/chapter.rb +7 -0
  183. data/lib/generators/dummy/templates/models/home_page.rb +5 -0
  184. data/lib/generators/dummy/templates/models/node.rb +10 -0
  185. data/lib/generators/dummy/templates/models/publisher.rb +9 -0
  186. data/lib/generators/dummy/templates/models/text_page.rb +5 -0
  187. data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -0
  188. data/lib/generators/dummy/templates/views/home_pages/show.haml +1 -0
  189. data/lib/generators/dummy/templates/views/layouts/application.html.haml +22 -0
  190. data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -0
  191. data/lib/generators/releaf/install_generator.rb +93 -0
  192. data/lib/generators/releaf/templates/initializers/haml.rb +1 -0
  193. data/lib/generators/releaf/templates/initializers/releaf.rb +30 -0
  194. data/lib/generators/releaf/templates/migrations/create_releaf_nodes.rb +28 -0
  195. data/lib/generators/releaf/templates/migrations/create_releaf_permissions.rb +12 -0
  196. data/lib/generators/releaf/templates/migrations/create_releaf_richtext_attachments.rb +12 -0
  197. data/lib/generators/releaf/templates/migrations/create_releaf_roles.rb +9 -0
  198. data/lib/generators/releaf/templates/migrations/create_releaf_settings.rb +17 -0
  199. data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +21 -0
  200. data/lib/generators/releaf/templates/migrations/create_releaf_users.rb +52 -0
  201. data/lib/generators/releaf/templates/models/node.rb +3 -0
  202. data/lib/generators/releaf/templates/seeds/seeds.rb +54 -0
  203. data/lib/releaf/core/application.rb +17 -0
  204. data/lib/releaf/core/builders_autoload.rb +27 -0
  205. data/lib/releaf/core/component.rb +9 -0
  206. data/lib/releaf/core/configuration.rb +101 -0
  207. data/lib/releaf/core/engine.rb +35 -0
  208. data/lib/releaf/core/exceptions.rb +38 -0
  209. data/lib/releaf/core/route_mapper.rb +59 -0
  210. data/lib/releaf/core/settings_ui_component.rb +7 -0
  211. data/lib/releaf/core/validation_error_codes.rb +36 -0
  212. data/lib/releaf/version.rb +3 -0
  213. data/lib/releaf-core.rb +14 -0
  214. data/lib/tasks/releaf_tasks.rake +4 -0
  215. data/releaf-core.gemspec +35 -0
  216. data/spec/builders/builders/association_reflector_spec.rb +138 -0
  217. data/spec/builders/builders/base_spec.rb +276 -0
  218. data/spec/builders/builders/collection_spec.rb +18 -0
  219. data/spec/builders/builders/confirm_destroy_dialog_builder_spec.rb +71 -0
  220. data/spec/builders/builders/confirm_dialog_builder_spec.rb +105 -0
  221. data/spec/builders/builders/edit_builder_spec.rb +215 -0
  222. data/spec/builders/builders/form_builder_spec.rb +562 -0
  223. data/spec/builders/builders/index_builder_spec.rb +345 -0
  224. data/spec/builders/builders/orderer_spec.rb +22 -0
  225. data/spec/builders/builders/page/header_builder_spec.rb +143 -0
  226. data/spec/builders/builders/page/layout_builder_spec.rb +73 -0
  227. data/spec/builders/builders/page/menu_builder_spec.rb +160 -0
  228. data/spec/builders/builders/pagination_builder_spec.rb +330 -0
  229. data/spec/builders/builders/resource_dialog_spec.rb +21 -0
  230. data/spec/builders/builders/resource_view_spec.rb +158 -0
  231. data/spec/builders/builders/show_builder_spec.rb +7 -0
  232. data/spec/builders/builders/table_builder_spec.rb +638 -0
  233. data/spec/builders/builders/template_spec.rb +12 -0
  234. data/spec/builders/builders/toolbox_builder_spec.rb +67 -0
  235. data/spec/builders/builders/toolbox_spec.rb +48 -0
  236. data/spec/builders/builders/view_spec.rb +281 -0
  237. data/spec/builders/builders_spec.rb +134 -0
  238. data/spec/builders/core/settings/form_builder_spec.rb +69 -0
  239. data/spec/builders/core/settings/table_builder_spec.rb +21 -0
  240. data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +51 -0
  241. data/spec/controllers/releaf/base_controller_spec.rb +447 -0
  242. data/spec/controllers/releaf/core/settings_controller_spec.rb +31 -0
  243. data/spec/features/ajaxbox_spec.rb +111 -0
  244. data/spec/features/authorization_spec.rb +50 -0
  245. data/spec/features/dragonfly_integration_spec.rb +24 -0
  246. data/spec/features/edit_actions_spec.rb +142 -0
  247. data/spec/features/errors_spec.rb +29 -0
  248. data/spec/features/index_actions_spec.rb +85 -0
  249. data/spec/features/index_table_spec.rb +32 -0
  250. data/spec/features/menu_spec.rb +71 -0
  251. data/spec/features/richtext_attachments_spec.rb +64 -0
  252. data/spec/features/richtext_embed_spec.rb +29 -0
  253. data/spec/features/richtext_spec.rb +19 -0
  254. data/spec/features/search_spec.rb +825 -0
  255. data/spec/features/settings_spec.rb +38 -0
  256. data/spec/features/title_spec.rb +13 -0
  257. data/spec/fixtures/common_fields.yml +17 -0
  258. data/spec/fixtures/cs.png +0 -0
  259. data/spec/fixtures/time.formats.xlsx +0 -0
  260. data/spec/fixtures/unicorn.jpg +0 -0
  261. data/spec/helpers/application_helper_spec.rb +75 -0
  262. data/spec/helpers/button_helper_spec.rb +146 -0
  263. data/spec/lib/releaf/core/application_spec.rb +42 -0
  264. data/spec/lib/releaf/core/assets_resolver_spec.rb +113 -0
  265. data/spec/lib/releaf/core/configuration_spec.rb +230 -0
  266. data/spec/lib/releaf/core/default_searchable_fields_spec.rb +161 -0
  267. data/spec/lib/releaf/core/error_formatter_spec.rb +242 -0
  268. data/spec/lib/releaf/core/item_orderer_spec.rb +142 -0
  269. data/spec/lib/releaf/core/resource_base_spec.rb +174 -0
  270. data/spec/lib/releaf/core/resource_fields_spec.rb +12 -0
  271. data/spec/lib/releaf/core/resource_params_spec.rb +117 -0
  272. data/spec/lib/releaf/core/resource_table_fields_spec.rb +18 -0
  273. data/spec/lib/releaf/core/resource_utilities_spec.rb +87 -0
  274. data/spec/lib/releaf/core/responders/access_denied_responder_spec.rb +12 -0
  275. data/spec/lib/releaf/core/responders/after_save_responder_spec.rb +102 -0
  276. data/spec/lib/releaf/core/responders/confirm_destroy_responder_spec.rb +26 -0
  277. data/spec/lib/releaf/core/responders/destroy_responder_spec.rb +30 -0
  278. data/spec/lib/releaf/core/responders/error_responder_spec.rb +26 -0
  279. data/spec/lib/releaf/core/responders/feature_disabled_responder_spec.rb +12 -0
  280. data/spec/lib/releaf/core/responders/page_not_found_responder_spec.rb +12 -0
  281. data/spec/lib/releaf/core/responders_spec.rb +60 -0
  282. data/spec/lib/releaf/core/template_field_type_mapper_spec.rb +311 -0
  283. data/spec/lib/validation_error_codes_spec.rb +56 -0
  284. data/spec/misc/factories_spec.rb +43 -0
  285. data/spec/models/settings_spec.rb +58 -0
  286. data/spec/routing/route_mapper_spec.rb +185 -0
  287. data/spec/rspec_helpers/test_helpers_spec.rb +20 -0
  288. metadata +657 -0
@@ -0,0 +1,118 @@
1
+ class Releaf::Builders::IndexBuilder
2
+ include Releaf::Builders::View
3
+ include Releaf::Builders::Collection
4
+
5
+ def header_extras
6
+ search_block
7
+ end
8
+
9
+ def dialog?
10
+ false
11
+ end
12
+
13
+ def text_search_available?
14
+ controller.searchable_fields.present?
15
+ end
16
+
17
+ def extra_search_available?
18
+ extra_search_block.present?
19
+ end
20
+
21
+ def text_search_block
22
+ return unless text_search_available?
23
+ tag(:div, class: "text-search"){ text_search_content }
24
+ end
25
+
26
+ def text_search_content
27
+ search_field "search" do
28
+ [
29
+ tag(:input, "", name: "search", type: "search", class: "text", value: params[:search], autofocus: true),
30
+ button(nil, "search", type: "submit", title: t('Search'))
31
+ ]
32
+ end
33
+ end
34
+
35
+ def search_field( name )
36
+ tag(:div, class: "search-field", data: { name: name } ) do
37
+ yield
38
+ end
39
+ end
40
+
41
+
42
+ def extra_search_content; end
43
+
44
+ def extra_search_button
45
+ button(t("Filter"), "search", type: "submit", title: t("Search"))
46
+ end
47
+
48
+ def extra_search_block
49
+ if @extra_search
50
+ @extra_search
51
+ else
52
+ content = extra_search_content
53
+ @extra_search = tag(:div, class: ["extras"]){ [content, extra_search_button] } if content.present?
54
+ end
55
+ end
56
+
57
+ def search_block
58
+ parts = [text_search_block, extra_search_block].compact
59
+ tag(:form, search_form_attributes){ parts } if parts.present?
60
+ end
61
+
62
+ def search_form_attributes
63
+ classes = ["search"]
64
+ classes << "has-text-search" if text_search_available?
65
+ classes << "has-extra-search" if extra_search_available?
66
+ url = url_for(controller: controller_name, action: "index")
67
+
68
+ {class: classes, action: url}
69
+ end
70
+
71
+ def section_header_text
72
+ t("All resources")
73
+ end
74
+
75
+ def section_header_extras
76
+ return unless collection.respond_to? :total_entries
77
+ tag(:span, class: "extras totals only-text") do
78
+ t("Resources found", count: collection.total_entries, default: "%{count} resources found", create_plurals: true)
79
+ end
80
+ end
81
+
82
+ def footer_blocks
83
+ list = [footer_primary_block]
84
+ list << pagination_block if pagination?
85
+ list << footer_secondary_block
86
+ list
87
+ end
88
+
89
+ def footer_primary_tools
90
+ items = []
91
+ items << resource_creation_button if feature_available? :create
92
+ items
93
+ end
94
+
95
+ def pagination?
96
+ collection.respond_to?(:page)
97
+ end
98
+
99
+ def pagination_builder_class
100
+ Releaf::Builders::PaginationBuilder
101
+ end
102
+
103
+ def pagination_block
104
+ pagination_builder_class.new(template, collection: collection, params: params).output
105
+ end
106
+
107
+ def resource_creation_button
108
+ url = url_for(controller: controller_name, action: "new")
109
+ text = t("Create new resource")
110
+ button(text, "plus", class: "primary", href: url)
111
+ end
112
+
113
+ def section_body
114
+ tag(:div, class: "body") do
115
+ template.releaf_table(collection, template.resource_class, template.table_options)
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,5 @@
1
+ module Releaf::Builders::Orderer
2
+ def orderer(items)
3
+ Releaf::Core::ItemOrderer.new(*items.to_a)
4
+ end
5
+ end
@@ -0,0 +1,70 @@
1
+ class Releaf::Builders::Page::HeaderBuilder
2
+ include Releaf::Builders::Base
3
+ include Releaf::Builders::Template
4
+
5
+ def output
6
+ safe_join do
7
+ items
8
+ end
9
+ end
10
+
11
+ def items
12
+ [home_link, profile_block, sign_out_form]
13
+ end
14
+
15
+ def home_link
16
+ tag(:a, class: "home", href: home_url) do
17
+ image_tag(home_image_path, alt: home_text)
18
+ end
19
+ end
20
+
21
+ def home_url
22
+ url_for(:releaf_root)
23
+ end
24
+
25
+ def home_text
26
+ "Releaf"
27
+ end
28
+
29
+ def home_image_path
30
+ "releaf/logo.png"
31
+ end
32
+
33
+ def profile_url
34
+ url_for(action: 'edit', controller: profile_controller)
35
+ end
36
+
37
+ def profile_settings_url
38
+ url_for(action: 'settings', controller: profile_controller)
39
+ end
40
+
41
+ def profile_controller
42
+ "/releaf/permissions/profile"
43
+ end
44
+
45
+ def profile_block
46
+ tag(:a, class: "button profile", href: profile_url, "data-settings-url" => profile_settings_url) do
47
+ [tag(:span, profile_user_name, class: "name")]
48
+ end
49
+ end
50
+
51
+ def user
52
+ access_control.user
53
+ end
54
+
55
+ def profile_user_name
56
+ user.to_text
57
+ end
58
+
59
+ def sign_out_url
60
+ url_for(action: 'destroy', controller: "/releaf/permissions/sessions")
61
+ end
62
+
63
+ def sign_out_form
64
+ form_tag(sign_out_url, method: :delete, class: "sign-out") do
65
+ tag(:button, class: "button only-icon", type: "submit", title: t('Sign out', scope: "admin.sessions")) do
66
+ icon("power-off icon-header")
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,155 @@
1
+ class Releaf::Builders::Page::LayoutBuilder
2
+ include Releaf::Builders::Base
3
+ include Releaf::Builders::Template
4
+
5
+ def output(&block)
6
+ doctype.html_safe << tag(:html) do
7
+ head << body(&block)
8
+ end
9
+ end
10
+
11
+ def doctype
12
+ "<!DOCTYPE html>"
13
+ end
14
+
15
+ def head
16
+ tag(:head) do
17
+ head_blocks
18
+ end
19
+ end
20
+
21
+ def body(&block)
22
+ tag(:body, class: body_classes) do
23
+ body_content(&block) << assets(:javascripts, :javascript_include_tag)
24
+ end
25
+ end
26
+
27
+ def body_content(&block)
28
+ if access_control.authorized?
29
+ header << menu << tag(:main, id: "main", &block) << notifications
30
+ else
31
+ yield
32
+ end
33
+ end
34
+
35
+ def notifications
36
+ tag(:div, nil, class: 'notifications', 'data' => {'close-text' => t("Close")})
37
+ end
38
+
39
+ def header
40
+ tag(:header, header_builder.new(template).output)
41
+ end
42
+
43
+ def header_builder
44
+ Releaf::Builders::Page::HeaderBuilder
45
+ end
46
+
47
+ def menu
48
+ tag(:aside, menu_builder.new(template).output)
49
+ end
50
+
51
+ def menu_builder
52
+ Releaf::Builders::Page::MenuBuilder
53
+ end
54
+
55
+ def assets(type, tag_method)
56
+ safe_join do
57
+ send(type).collect do |asset|
58
+ template.send(tag_method, asset)
59
+ end
60
+ end
61
+ end
62
+
63
+ def body_classes
64
+ list = []
65
+ list << "application-#{Rails.application.class.parent_name.downcase}"
66
+ list += controller_body_classes
67
+ list << "view-#{controller.active_view}" if controller.respond_to? :active_view
68
+ list << "side-compact" if layout_settings("releaf.side.compact")
69
+ list
70
+ end
71
+
72
+ def controller_classes
73
+ ancestors = controller.class.ancestors.grep(Class)
74
+ slice_index = ancestors.index(Releaf::BaseController) || (ancestors.index(controller.class) + 1)
75
+ ancestors[0, slice_index].reverse
76
+ end
77
+
78
+ def controller_body_classes
79
+ controller_classes.collect do|c_class|
80
+ "controller-" + c_class.name.gsub(/Controller$/, "").underscore.tr( '_/', '-' )
81
+ end
82
+ end
83
+
84
+ def head_blocks
85
+ [title, content_type, favicons, ms_tile, assets(:stylesheets, :stylesheet_link_tag), csrf]
86
+ end
87
+
88
+ def controller_name
89
+ params[:controller]
90
+ end
91
+
92
+ def stylesheets
93
+ Releaf.application.config.assets_resolver.controller_assets(controller_name, :stylesheets)
94
+ end
95
+
96
+ def javascripts
97
+ Releaf.application.config.assets_resolver.controller_assets(controller_name, :javascripts)
98
+ end
99
+
100
+ def csrf
101
+ template.csrf_meta_tags
102
+ end
103
+
104
+ def content_type
105
+ meta(content: 'text/html; charset=utf-8', 'http-equiv': 'Content-Type')
106
+ end
107
+
108
+ def meta(options)
109
+ tag(:meta, nil, options)
110
+ end
111
+
112
+ def title
113
+ tag(:title) do
114
+ controller.page_title
115
+ end
116
+ end
117
+
118
+ def favicon_path
119
+ File.join('releaf', 'icons')
120
+ end
121
+
122
+ def ms_tile_path
123
+ favicon_path
124
+ end
125
+
126
+ def ms_tile_color
127
+ '#151515'
128
+ end
129
+
130
+ def favicon(source, options = {})
131
+ controller.view_context.favicon_link_tag(File.join(favicon_path, source), options)
132
+ end
133
+
134
+ def apple_favicon(source, options = {})
135
+ favicon(source, options.merge(rel: 'apple-touch-icon-precomposed', type: 'image/png'))
136
+ end
137
+
138
+ def favicons
139
+ [
140
+ apple_favicon("favicon.png"),
141
+ apple_favicon("apple-touch-icon-152x152-precomposed.png", sizes: "152x152"),
142
+ apple_favicon("apple-touch-icon-114x114-precomposed.png", sizes: "114x114"),
143
+ apple_favicon("apple-touch-icon-72x72-precomposed.png", sizes: "72x72"),
144
+ favicon("favicon.png", type: 'image/png', rel: 'icon'),
145
+ ]
146
+ end
147
+
148
+ def ms_tile
149
+ tile_path = ActionController::Base.helpers.image_path(File.join(ms_tile_path, 'msapplication-tile-144x144.png'))
150
+ [
151
+ meta(name: 'msapplication-TileColor', content: ms_tile_color),
152
+ meta(name: 'msapplication-TileImage', content: tile_path)
153
+ ]
154
+ end
155
+ end
@@ -0,0 +1,140 @@
1
+ class Releaf::Builders::Page::MenuBuilder
2
+ include Releaf::Builders::Base
3
+ include Releaf::Builders::Template
4
+
5
+ class Menu
6
+ mattr_accessor :access_control
7
+
8
+ def self.build(list, access_control)
9
+ self.access_control = access_control
10
+ build_list(list)
11
+ end
12
+
13
+ def self.build_list(list)
14
+ list.collect{|item| build_item(item) }.compact
15
+ end
16
+
17
+ def self.build_item(source_item)
18
+ item = source_item.dup
19
+ item[:items] = build_list(item.fetch(:items, []))
20
+ item.delete(:items) if item[:items].empty?
21
+
22
+ if item[:items]
23
+ item[:active] = item[:items].find{|i| i[:active] == true }.present?
24
+ item[:url_helper] = item[:items].first[:url_helper] if item[:items].present?
25
+ item
26
+ elsif access_control.controller_permitted?(item[:controller])
27
+ item[:active] = active_controller?(item[:controller])
28
+ item
29
+ else
30
+ nil
31
+ end
32
+ end
33
+
34
+ def self.active_controller?(controller_name)
35
+ access_control.current_controller_name == controller_name
36
+ end
37
+ end
38
+
39
+ def output
40
+ menu_items = Menu.build(Releaf.application.config.menu, access_control)
41
+ compacter << tag(:nav, menu_level(menu_items))
42
+ end
43
+
44
+ def menu_level(items)
45
+ tag(:ul) do
46
+ items.collect{|item| menu_item(item) }
47
+ end
48
+ end
49
+
50
+ def menu_item(item)
51
+ tag(:li, item_attributes(item)) do
52
+ if item[:items]
53
+ tag(:span, class: "trigger") do
54
+ item_name_content(item) << item_collapser(item)
55
+ end << menu_level(item[:items])
56
+ else
57
+ tag(:a, class: "trigger", href: url_for(item[:url_helper])) do
58
+ item_name_content(item)
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ def collapsed_item?(item)
65
+ item[:items] && !item[:active] && layout_settings("releaf.menu.collapsed.#{item[:name]}") == true
66
+ end
67
+
68
+ def item_attributes(item)
69
+ attributes = {
70
+ class: [],
71
+ data: {
72
+ name: item[:name]
73
+ }
74
+ }
75
+
76
+ attributes[:class] << "collapsed" if collapsed_item?(item)
77
+ attributes[:class] << "active" if item[:active]
78
+ attributes.delete(:class) if attributes[:class].empty?
79
+
80
+ attributes
81
+ end
82
+
83
+
84
+ def item_name_content(item)
85
+ item_full_name = t(item[:name], scope: "admin.controllers")
86
+ item_abbreviation = item_name_abbreviation( item_full_name )
87
+
88
+ tag(:abbr, item_abbreviation, title: item_full_name) + tag(:span, item_full_name, class: "name")
89
+ end
90
+
91
+ def item_name_abbreviation( item_full_name )
92
+ return "" if item_full_name.blank?
93
+ # use the first two letters after the last slash that is not preceded by a space
94
+ # to avoid identical abbreviations for namespaced items in case of missing translations
95
+ # but still use the first word in cases of user-entered slashes, e.g. "Inputs / Outputs"
96
+ item_full_name.split(/(?<!\s)\//).last.to_s[0..1].mb_chars.capitalize
97
+ end
98
+
99
+ def item_collapser(item)
100
+ tag(:span, class: "collapser") do
101
+ tag(:button, type: "button") do
102
+ item_collapser_icon(item)
103
+ end
104
+ end
105
+ end
106
+
107
+ def compact_side?
108
+ layout_settings('releaf.side.compact')
109
+ end
110
+
111
+ def item_collapser_icon(item)
112
+ if compact_side?
113
+ icon("chevron-right")
114
+ else
115
+ icon(collapsed_item?(item) ? "chevron-down" : "chevron-up")
116
+ end
117
+ end
118
+
119
+ def compacter
120
+ tag(:div, class: "compacter") do
121
+ if compact_side?
122
+ icon_name = "angle-double-right"
123
+ title_attribute = 'title-expand'
124
+ else
125
+ icon_name = "angle-double-left"
126
+ title_attribute = 'title-collapse'
127
+ end
128
+ button(nil, icon_name, title: compacter_data[title_attribute], data: compacter_data )
129
+ end
130
+ end
131
+
132
+ def compacter_data
133
+ {
134
+ 'title-expand' => t("Expand", scope: :admin),
135
+ 'title-collapse' => t("Collapse", scope: :admin)
136
+ }
137
+ end
138
+
139
+
140
+ end