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,107 @@
1
+ class Releaf::Builders::PaginationBuilder
2
+ include Releaf::Builders::Base
3
+ include Releaf::Builders::Template
4
+
5
+ attr_accessor :collection
6
+ attr_accessor :params
7
+
8
+ delegate :total_pages, :current_page, :total_entries, :per_page, to: :collection
9
+
10
+ def initialize( template, options = {} )
11
+ self.collection = options[:collection]
12
+ self.params = options[:params]
13
+ super template
14
+ end
15
+
16
+ def output
17
+ return nil unless collection.total_pages > 1
18
+ pagination_block
19
+ end
20
+
21
+ def pagination_block
22
+ content_tag( :div, class: :pagination ) do
23
+ safe_join { pagination_parts }
24
+ end
25
+ end
26
+
27
+ def pagination_parts
28
+ [
29
+ previous_page_button,
30
+ pagination_select,
31
+ next_page_button
32
+ ]
33
+ end
34
+
35
+ def previous_page_button
36
+ page_button( -1, 'previous', 'chevron-left' )
37
+ end
38
+
39
+ def next_page_button
40
+ page_button( 1, 'next', 'chevron-right' )
41
+ end
42
+
43
+ def page_button( offset, class_name, icon_name )
44
+ attributes =
45
+ {
46
+ class: ['secondary', class_name ],
47
+ title: t( "#{class_name.capitalize} page", scope: 'pagination')
48
+ }
49
+
50
+ page_number = relative_page_number( offset )
51
+
52
+ if page_number.present?
53
+ attributes[:rel] = relative_page_relationship(offset)
54
+ attributes[:href] = page_url(page_number)
55
+ else
56
+ attributes[:disabled] = true
57
+ end
58
+
59
+ button( nil, icon_name, attributes )
60
+ end
61
+
62
+ def page_numbers
63
+ (1..total_pages).to_a
64
+ end
65
+
66
+ def relative_page_number( offset )
67
+ page_number = current_page + offset
68
+ page_numbers.include?(page_number) ? page_number : nil
69
+ end
70
+
71
+ def relative_page_relationship(offset)
72
+ if offset == -1
73
+ :prev
74
+ elsif offset == 1
75
+ :next
76
+ else
77
+ nil
78
+ end
79
+ end
80
+
81
+ def page_url(page_number)
82
+ template.url_for( params.merge( page: page_number ))
83
+ end
84
+
85
+ def pagination_select
86
+ content_tag('select', name: :page) do
87
+ safe_join do
88
+ pagination_options
89
+ end
90
+ end
91
+ end
92
+
93
+ def pagination_options
94
+ page_numbers.map do |page_number|
95
+ attributes = { value: page_number }
96
+ attributes[:selected] = true if page_number == current_page
97
+ content_tag(:option, attributes) { page_label(page_number) }
98
+ end
99
+ end
100
+
101
+ def page_label page_number
102
+ first_item_in_page = (page_number - 1) * per_page + 1
103
+ last_item_in_page = [page_number * per_page, total_entries].min
104
+ "#{first_item_in_page}-#{last_item_in_page}"
105
+ end
106
+
107
+ end
@@ -0,0 +1,68 @@
1
+ class Releaf::Builders::RefusedDestroyDialogBuilder
2
+ include Releaf::Builders::ResourceDialog
3
+
4
+ def section_body
5
+ tag(:div, class: "body") do
6
+ [
7
+ icon("ban"),
8
+ tag(:div, t("Deletion of %{resource} was refused due to existing relations:", default: "Deletion of %{resource} restricted, due to existing relations:", resource: resource_to_text(resource)), class: "description"),
9
+ restricted_relations
10
+ ]
11
+ end
12
+ end
13
+
14
+ def restricted_relations
15
+ tag(:ul, class: "restricted-relations") do
16
+ template_variable("restricted_relations").collect do|key, relation|
17
+ tag(:li) do
18
+ restricted_relation(relation, key)
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ def relation_description(relation, key)
25
+ (
26
+ unless relation[:controller].nil?
27
+ I18n.t(relation[:controller], scope: 'admin.controllers')
28
+ else
29
+ I18n.t(key, scope: 'admin.controllers')
30
+ end
31
+ ) << " (#{relation[:objects].count})"
32
+ end
33
+
34
+ def relation_objects(relation)
35
+ tag(:ul, class: "relations") do
36
+ relation[:objects][0..2].collect do |item|
37
+ relation_objects_item(item, relation)
38
+ end + [(tag(:li, "...") if relation[:objects].count > 3)]
39
+ end
40
+ end
41
+
42
+ def relation_objects_item(item, relation)
43
+ tag(:li) do
44
+ unless relation[:controller].nil?
45
+ link_to(resource_to_text(item), controller: relation[:controller], action: "edit", id: item)
46
+ else
47
+ resource_to_text(item)
48
+ end
49
+ end
50
+ end
51
+
52
+ def restricted_relation(relation, key)
53
+ [
54
+ relation_description(relation, key),
55
+ relation_objects(relation)
56
+ ]
57
+ end
58
+
59
+ def footer_primary_tools
60
+ [
61
+ button(t("Ok"), "check", href: index_url, data: {type: 'cancel'})
62
+ ]
63
+ end
64
+
65
+ def section_header_text
66
+ t("Deletion refused")
67
+ end
68
+ end
@@ -0,0 +1,9 @@
1
+ module Releaf::Builders::Resource
2
+ attr_accessor :resource
3
+
4
+ def initialize(template)
5
+ super
6
+ self.resource = template_variable("resource")
7
+ end
8
+
9
+ end
@@ -0,0 +1,8 @@
1
+ module Releaf::Builders::ResourceDialog
2
+ include Releaf::Builders::View
3
+ include Releaf::Builders::Resource
4
+
5
+ def dialog?
6
+ true
7
+ end
8
+ end
@@ -0,0 +1,54 @@
1
+ module Releaf::Builders::ResourceView
2
+ include Releaf::Builders::View
3
+ include Releaf::Builders::Resource
4
+ include Releaf::Builders::Toolbox
5
+
6
+ def section
7
+ tag(:section, section_attributes) do
8
+ section_content
9
+ end
10
+ end
11
+
12
+ def section_content
13
+ section_blocks
14
+ end
15
+
16
+ def section_header_text
17
+ resource.new_record? ? t("Create new resource") : resource_to_text(resource)
18
+ end
19
+
20
+ def section_header_extras
21
+ return unless feature_available? :toolbox
22
+ tag(:div, class: "extras toolbox-wrap") do
23
+ toolbox(resource, index_url: index_url)
24
+ end
25
+ end
26
+
27
+ def section_body
28
+ tag(:div, section_body_attributes) do
29
+ section_body_blocks
30
+ end
31
+ end
32
+
33
+ def section_body_attributes
34
+ {class: ["body"]}
35
+ end
36
+
37
+ def section_body_blocks
38
+ []
39
+ end
40
+
41
+ def footer_secondary_tools
42
+ list = []
43
+ list << back_to_list_button if back_to_list?
44
+ list
45
+ end
46
+
47
+ def back_to_list?
48
+ feature_available?(:index) && params[:index_url].present?
49
+ end
50
+
51
+ def back_to_list_button
52
+ button(t("Back to list"), "caret-left", class: "secondary", href: index_url)
53
+ end
54
+ end
@@ -0,0 +1,3 @@
1
+ class Releaf::Builders::ShowBuilder
2
+ include Releaf::Builders::ResourceView
3
+ end
@@ -0,0 +1,280 @@
1
+ class Releaf::Builders::TableBuilder
2
+ include Releaf::Builders::Base
3
+ include Releaf::Builders::Toolbox
4
+ include Releaf::Builders::Orderer
5
+ attr_accessor :collection, :options, :template, :resource_class
6
+
7
+ def initialize(collection, resource_class, template, options)
8
+ self.collection = collection
9
+ self.options = options
10
+ self.template = template
11
+ self.resource_class = resource_class
12
+ end
13
+
14
+ def column_names
15
+ Releaf::Core::ResourceTableFields.new(resource_class).values(include_associations: false)
16
+ end
17
+
18
+ def columns
19
+ @columns ||= columns_schema
20
+ end
21
+
22
+ def columns_schema
23
+ data = {}
24
+
25
+ final_column_names = []
26
+ final_column_names += column_names
27
+ final_column_names << :toolbox if options[:toolbox] == true
28
+
29
+ final_column_names.map do|column|
30
+ if cell_method(column)
31
+ data[column] = {cell_method: cell_method(column)}
32
+ elsif cell_content_method(column)
33
+ data[column] = {content_method: cell_content_method(column)}
34
+ else
35
+ data[column] = {format_method: cell_format_method(column)}
36
+ end
37
+ end
38
+
39
+ data
40
+ end
41
+
42
+ def output
43
+ tag(:table, table_attributes) do
44
+ if collection.empty?
45
+ empty_body
46
+ else
47
+ head << body
48
+ end
49
+ end
50
+ end
51
+
52
+ def table_attributes
53
+ {class: ["table", resource_class.name.pluralize.underscore.dasherize]}
54
+ end
55
+
56
+ def head
57
+ tag(:thead) do
58
+ tag(:tr) do
59
+ content = ActiveSupport::SafeBuffer.new
60
+ columns.each_pair do|column, options|
61
+ content << head_cell(column)
62
+ end
63
+ content
64
+ end
65
+ end
66
+ end
67
+
68
+ def head_cell(column)
69
+ tag(:th) do
70
+ head_cell_content(column)
71
+ end
72
+ end
73
+
74
+ def head_cell_content(column)
75
+ unless column.to_sym == :toolbox
76
+ attribute = column.to_s.gsub(".", "_")
77
+ resource_class.human_attribute_name(attribute, create_default: false)
78
+ end
79
+ end
80
+
81
+ def empty_body
82
+ tag(:tr) do
83
+ tag(:th) do
84
+ tag(:div, class: "nothing-found") do
85
+ t("Nothing found")
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ def body
92
+ tag(:tbody, class: "tbody") do
93
+ collection.collect do |resource|
94
+ row(resource)
95
+ end
96
+ end
97
+ end
98
+
99
+ def row_url(resource)
100
+ resource_action = row_url_action(resource)
101
+ url_for(action: resource_action, id: resource.id, index_url: index_url) if resource_action
102
+ end
103
+
104
+ def row_url_action(resource)
105
+ if feature_available?(:show)
106
+ resource_action = :show
107
+ elsif feature_available?(:edit)
108
+ resource_action = :edit
109
+ end
110
+ end
111
+
112
+ def row_attributes(resource)
113
+ {
114
+ class: "row",
115
+ data: {
116
+ id: resource.id
117
+ }
118
+ }
119
+ end
120
+
121
+ def row(resource)
122
+ url = row_url(resource)
123
+ tag(:tr, row_attributes(resource)) do
124
+ content = ActiveSupport::SafeBuffer.new
125
+ columns.each_pair do|column, options|
126
+ cell_options = options.merge(url: url)
127
+ if options[:cell_method]
128
+ content << send(options[:cell_method], resource, cell_options)
129
+ else
130
+ content << cell(resource, column, cell_options)
131
+ end
132
+ end
133
+ content
134
+ end
135
+ end
136
+
137
+ def cell_content(resource, column, options)
138
+ if options[:content_method]
139
+ send(options[:content_method], resource)
140
+ else
141
+ send(options[:format_method], resource, column)
142
+ end
143
+ end
144
+
145
+ def format_text_content(resource, column)
146
+ truncate(column_value(resource, column).to_s, length: 32, separator: ' ')
147
+ end
148
+
149
+ def format_string_content(resource, column)
150
+ value = column_value(resource, column)
151
+ if value.respond_to? :to_text
152
+ value.to_text
153
+ else
154
+ value.to_s
155
+ end
156
+ end
157
+
158
+ def format_boolean_content(resource, column)
159
+ t(column_value(resource, column) == true ? "Yes" : "No")
160
+ end
161
+
162
+ def format_date_content(resource, column)
163
+ value = column_value(resource, column)
164
+ I18n.l(value, format: :default, default: '%Y-%m-%d') unless value.nil?
165
+ end
166
+
167
+ def format_datetime_content(resource, column)
168
+ value = column_value(resource, column)
169
+ I18n.l(value, format: :default, default: '%Y-%m-%d %H:%M:%S') unless value.nil?
170
+ end
171
+
172
+ def format_image_content(resource, column)
173
+ if resource.send(column).present?
174
+ association_name = column.to_s.sub(/_uid$/, '')
175
+ image_tag(resource.send(association_name).thumb('x16').url, alt: '')
176
+ end
177
+ end
178
+
179
+ def format_association_content(resource, column)
180
+ format_string_content(resource, association_name(column))
181
+ end
182
+
183
+ def association_name(column)
184
+ column.to_s.sub(/_id$/, '').to_sym
185
+ end
186
+
187
+ def cell_method(column)
188
+ method_name = "#{column}_cell"
189
+ if respond_to? method_name
190
+ method_name
191
+ else
192
+ nil
193
+ end
194
+ end
195
+
196
+ def cell_content_method(column)
197
+ method_name = "#{column}_content"
198
+ if respond_to? method_name
199
+ method_name
200
+ else
201
+ nil
202
+ end
203
+ end
204
+
205
+ def column_type(klass, column)
206
+ column_description = klass.columns_hash[column.to_s]
207
+ if column_description
208
+ column_description.type
209
+ else
210
+ :string
211
+ end
212
+ end
213
+
214
+ def column_type_format_method(column)
215
+ klass = column_klass(resource_class, column)
216
+
217
+ format_method = "format_#{column_type(klass, column)}_content".to_sym
218
+ if respond_to?(format_method)
219
+ format_method
220
+ else
221
+ :format_string_content
222
+ end
223
+ end
224
+
225
+ def column_klass(klass, column)
226
+ column.to_s.split(".")[0..-2].each do|part|
227
+ reflection = klass.reflect_on_association(part)
228
+ klass = reflection.klass if reflection
229
+ end
230
+
231
+ klass
232
+ end
233
+
234
+ def column_value(resource_or_value, column)
235
+ column.to_s.split(".").each do|part|
236
+ resource_or_value = resource_or_value.send(part) if resource_or_value.present?
237
+ end
238
+
239
+ resource_or_value
240
+ end
241
+
242
+ def cell_format_method(column)
243
+ if association_column?(column)
244
+ :format_association_content
245
+ elsif image_column?(column)
246
+ :format_image_content
247
+ else
248
+ column_type_format_method(column)
249
+ end
250
+ end
251
+
252
+ def image_column?(column)
253
+ column =~ /(thumbnail|image|photo|picture|avatar|logo|icon)_uid$/
254
+ end
255
+
256
+ def association_column?(column)
257
+ !!(column =~ /_id$/) && resource_class.reflections[association_name(column).to_s].present?
258
+ end
259
+
260
+ def toolbox_cell(resource, options)
261
+ toolbox_args = {index_url: controller.index_url}.merge(options.fetch(:toolbox, {}))
262
+ tag(:td, class: "only-icon toolbox-cell") do
263
+ toolbox(resource, toolbox_args)
264
+ end
265
+ end
266
+
267
+ def cell(resource, column, options)
268
+ content = cell_content(resource, column, options)
269
+
270
+ tag(:td) do
271
+ if options[:url].blank?
272
+ content
273
+ else
274
+ tag(:a, href: options[:url]) do
275
+ content
276
+ end
277
+ end
278
+ end
279
+ end
280
+ end