card 1.19.6 → 1.20.0

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 (298) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/card.gemspec +8 -7
  4. data/config/initializers/01_core_extensions/array.rb +4 -0
  5. data/config/initializers/01_core_extensions/persistent_identifiers.rb +12 -0
  6. data/config/initializers/02_patches/better_errors.rb +56 -0
  7. data/config/initializers/core_extensions.rb +13 -18
  8. data/config/initializers/patches.rb +8 -0
  9. data/config/locales/de.yml +0 -2
  10. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +22 -12
  11. data/db/migrate_core_cards/20161102202156_tweak_recaptcha_setting_cards.rb +17 -0
  12. data/db/migrate_core_cards/20161103154836_update_keys.rb +46 -0
  13. data/lib/card.rb +1 -8
  14. data/lib/card/act_manager.rb +4 -0
  15. data/lib/card/auth/permissions.rb +5 -3
  16. data/lib/card/cache.rb +1 -20
  17. data/lib/card/cache/persistent.rb +6 -0
  18. data/lib/card/content/chunk.rb +4 -3
  19. data/lib/card/content/diff.rb +2 -2
  20. data/lib/card/content/diff/result.rb +11 -0
  21. data/lib/card/env/success.rb +4 -0
  22. data/lib/card/error.rb +2 -0
  23. data/lib/card/format.rb +14 -17
  24. data/lib/card/format/content.rb +16 -8
  25. data/lib/card/format/error.rb +3 -5
  26. data/lib/card/format/names.rb +22 -16
  27. data/lib/card/format/nest.rb +67 -61
  28. data/lib/card/format/nest/fetch.rb +40 -33
  29. data/lib/card/format/nest/main.rb +39 -19
  30. data/lib/card/format/nest/subformat.rb +3 -16
  31. data/lib/card/format/nest/view.rb +23 -32
  32. data/lib/card/format/permission.rb +49 -34
  33. data/lib/card/format/registration.rb +12 -6
  34. data/lib/card/format/render.rb +62 -73
  35. data/lib/card/migration.rb +14 -10
  36. data/lib/card/migration/import.rb +20 -19
  37. data/lib/card/migration/import/import_data.rb +50 -59
  38. data/lib/card/migration/import/import_data/card_attributes.rb +56 -0
  39. data/lib/card/migration/import/import_data/card_content.rb +33 -0
  40. data/lib/card/migration/import/merger.rb +47 -0
  41. data/lib/card/mod/loader.rb +4 -4
  42. data/lib/card/model/save_helper.rb +49 -10
  43. data/lib/card/name.rb +16 -52
  44. data/lib/card/name/fields_and_traits.rb +67 -0
  45. data/lib/card/name/variants.rb +17 -0
  46. data/lib/card/query.rb +6 -2
  47. data/lib/card/query/attributes.rb +1 -1
  48. data/lib/card/query/interpretation.rb +3 -3
  49. data/lib/card/set/event.rb +2 -1
  50. data/lib/card/set/format.rb +18 -7
  51. data/lib/card/set_pattern.rb +17 -13
  52. data/lib/card/tasks/card.rake +1 -1
  53. data/lib/card/view.rb +55 -0
  54. data/lib/card/view/cache.rb +90 -0
  55. data/lib/card/view/fetch.rb +109 -0
  56. data/lib/card/view/options.rb +164 -0
  57. data/lib/card/view/stub.rb +30 -0
  58. data/lib/card/view/visibility.rb +95 -0
  59. data/lib/cardio.rb +3 -2
  60. data/lib/cardio/schema.rb +21 -8
  61. data/lib/generators/card.rb +16 -2
  62. data/lib/generators/card/format/format_generator.rb +10 -9
  63. data/lib/generators/card/migration/migration_generator.rb +10 -5
  64. data/lib/generators/card/set/USAGE +1 -1
  65. data/lib/generators/card/set/set_generator.rb +11 -9
  66. data/mod/account/set/right/account.rb +38 -40
  67. data/mod/account/set/right/token.rb +2 -1
  68. data/mod/account/set/self/account_links.rb +34 -54
  69. data/mod/account/set/self/signin.rb +107 -93
  70. data/mod/account/set/type/signup.rb +33 -32
  71. data/mod/account/set/type/user.rb +28 -21
  72. data/mod/account/spec/set/all/account_spec.rb +9 -9
  73. data/mod/account/spec/set/right/account_spec.rb +23 -14
  74. data/mod/account/spec/set/right/email_spec.rb +6 -6
  75. data/mod/account/spec/set/right/password_spec.rb +4 -4
  76. data/mod/account/spec/set/right/token_spec.rb +3 -3
  77. data/mod/account/spec/set/self/account_links_spec.rb +3 -3
  78. data/mod/account/spec/set/self/signin_spec.rb +2 -2
  79. data/mod/account/spec/set/type/signup_spec.rb +7 -8
  80. data/mod/ace_editor/set/abstract/ace_editor.rb +1 -4
  81. data/mod/admin/set/self/admin.rb +2 -2
  82. data/mod/admin/set/self/admin_info.rb +1 -1
  83. data/mod/admin/set/self/recaptcha_private_key.rb +3 -0
  84. data/mod/admin/set/self/recaptcha_proxy.rb +3 -0
  85. data/mod/admin/set/self/recaptcha_public_key.rb +3 -0
  86. data/mod/admin/set/self/trash.rb +4 -4
  87. data/mod/admin/spec/set/self/admin_spec.rb +4 -4
  88. data/mod/admin/spec/set/self/version_spec.rb +1 -1
  89. data/mod/basic_formats/set/all/all_css.rb +3 -3
  90. data/mod/basic_formats/set/all/all_csv.rb +6 -6
  91. data/mod/basic_formats/set/all/all_js.rb +4 -0
  92. data/mod/basic_formats/set/all/base.rb +40 -62
  93. data/mod/basic_formats/set/all/json.rb +34 -39
  94. data/mod/basic_formats/set/all/rss.rb +6 -6
  95. data/mod/basic_formats/set/all/text.rb +3 -2
  96. data/mod/basic_formats/set/self/01_head/javascript.rb +2 -2
  97. data/mod/basic_formats/set/self/head.rb +6 -10
  98. data/mod/basic_formats/spec/set/all/all_css_spec.rb +1 -1
  99. data/mod/basic_formats/spec/set/all/all_csv_spec.rb +1 -1
  100. data/mod/basic_formats/spec/set/all/base_spec.rb +8 -5
  101. data/mod/basic_formats/spec/set/all/json_spec.rb +2 -2
  102. data/mod/basic_formats/spec/set/all/rss_spec.rb +4 -4
  103. data/mod/basic_types/set/type/plain_text.rb +3 -5
  104. data/mod/basic_types/spec/set/type/plain_text_spec.rb +2 -2
  105. data/mod/bootstrap/lib/bootstrap.rb +16 -0
  106. data/mod/bootstrap/lib/bootstrap/basic_tags.rb +26 -0
  107. data/mod/bootstrap/lib/bootstrap/component.rb +133 -0
  108. data/mod/bootstrap/lib/bootstrap/component/form.rb +31 -0
  109. data/mod/bootstrap/lib/bootstrap/component/horizontal_form.rb +38 -0
  110. data/mod/bootstrap/lib/bootstrap/component/layout.rb +83 -0
  111. data/mod/bootstrap/lib/bootstrap/component/panel.rb +9 -0
  112. data/mod/bootstrap/lib/bootstrap/component_loader.rb +30 -0
  113. data/mod/bootstrap/lib/bootstrap/delegate.rb +16 -0
  114. data/mod/bootstrap/lib/bootstrapper.rb +16 -0
  115. data/mod/bootstrap/lib/stylesheets/bootstrap/_tables.scss +55 -52
  116. data/mod/bootstrap/lib/stylesheets/bootstrap/mixins/_table-row.scss +12 -12
  117. data/mod/bootstrap/lib/stylesheets/bootstrap_cards.scss +12 -0
  118. data/mod/bootstrap/set/all/bootstrap/accordion.rb +63 -0
  119. data/mod/bootstrap/set/all/bootstrap/helper.rb +7 -140
  120. data/mod/bootstrap/set/all/bootstrap/navbar.rb +74 -0
  121. data/mod/bootstrap/set/all/bootstrap/table.rb +76 -46
  122. data/mod/bootstrap/set/all/bootstrap/tabs.rb +58 -23
  123. data/mod/bootstrap/set/all/bootstrap/wrapper.rb +14 -8
  124. data/mod/bootstrap/set/all/rich_bootstrap.rb +5 -3
  125. data/mod/bootstrap/spec/set/all/bootstrap/bootstrap_builder_spec.rb +31 -0
  126. data/mod/bootstrap/spec/set/all/bootstrap/bootstrap_spec.rb +20 -0
  127. data/mod/bootstrap/spec/set/all/bootstrap/form_spec.rb +59 -1
  128. data/mod/bootstrap/spec/set/all/bootstrap/layout_spec.rb +104 -15
  129. data/mod/carrierwave/set/abstract/attachment.rb +4 -3
  130. data/mod/carrierwave/set/abstract/attachment/paths.rb +1 -1
  131. data/mod/carrierwave/set/abstract/attachment/storage_type.rb +5 -11
  132. data/mod/carrierwave/set/type/file.rb +39 -32
  133. data/mod/carrierwave/set/type/image.rb +59 -34
  134. data/mod/carrierwave/spec/set/type/image_spec.rb +3 -3
  135. data/mod/core/chunk/link.rb +5 -0
  136. data/mod/core/chunk/{include.rb → nest.rb} +8 -29
  137. data/mod/core/chunk/reference.rb +5 -6
  138. data/mod/core/chunk/view_stub.rb +42 -0
  139. data/mod/core/format/html_format.rb +23 -26
  140. data/mod/core/set/abstract/code_file.rb +1 -1
  141. data/mod/core/set/all/actify.rb +1 -1
  142. data/mod/core/set/all/active_card.rb +0 -1
  143. data/mod/core/set/all/{tracked_attributes.rb → assign_attributes.rb} +55 -24
  144. data/mod/core/set/all/collection.rb +136 -122
  145. data/mod/core/set/all/content.rb +8 -0
  146. data/mod/core/set/all/event.rb +5 -2
  147. data/mod/core/set/all/export.rb +7 -7
  148. data/mod/core/set/all/fetch.rb +90 -26
  149. data/mod/core/set/all/initialize.rb +17 -6
  150. data/mod/core/set/all/name.rb +2 -3
  151. data/mod/core/set/all/permissions.rb +19 -11
  152. data/mod/core/set/all/states.rb +12 -2
  153. data/mod/core/set/all/trash.rb +1 -1
  154. data/mod/core/set/all/type.rb +2 -0
  155. data/mod/core/set/all/utils.rb +4 -3
  156. data/mod/core/spec/chunk/literal_spec.rb +2 -2
  157. data/mod/core/spec/chunk/uri_spec.rb +17 -17
  158. data/mod/core/spec/format/html_format_spec.rb +11 -13
  159. data/mod/core/spec/set/all/attribute_tracking_spec.rb +2 -2
  160. data/mod/core/spec/set/all/collection_spec.rb +21 -24
  161. data/mod/core/spec/set/all/content_spec.rb +1 -1
  162. data/mod/core/spec/set/all/export_spec.rb +3 -3
  163. data/mod/core/spec/set/all/fetch_spec.rb +5 -5
  164. data/mod/core/spec/set/all/initialize_spec.rb +4 -4
  165. data/mod/core/spec/set/all/name_spec.rb +6 -6
  166. data/mod/core/spec/set/all/permissions_spec.rb +10 -10
  167. data/mod/core/spec/set/all/references_spec.rb +1 -1
  168. data/mod/core/spec/set/all/rules2_spec.rb +24 -24
  169. data/mod/core/spec/set/all/rules_spec.rb +1 -1
  170. data/mod/core/spec/set/all/templating_spec.rb +8 -8
  171. data/mod/core/spec/set/all/tracked_attributes_spec.rb +6 -6
  172. data/mod/core/spec/set/all/type_spec.rb +5 -5
  173. data/mod/developer/spec/set/all/event_viz_spec.rb +1 -1
  174. data/mod/developer/spec/set/right/debug_spec.rb +1 -1
  175. data/mod/email/set/all/email_html.rb +2 -2
  176. data/mod/email/set/all/notify.rb +8 -3
  177. data/mod/email/set/right/bcc.rb +3 -3
  178. data/mod/email/set/right/follow.rb +5 -5
  179. data/mod/email/set/right/following.rb +1 -1
  180. data/mod/email/set/self/follow_defaults.rb +27 -16
  181. data/mod/email/set/type/email_template.rb +1 -1
  182. data/mod/email/set/type_plus_right/user/follow.rb +10 -9
  183. data/mod/history/lib/card/act.rb +4 -0
  184. data/mod/history/lib/card/act/act_renderer.rb +194 -0
  185. data/mod/history/lib/card/act/act_renderer/absolute_act_renderer.rb +25 -0
  186. data/mod/history/lib/card/act/act_renderer/relative_act_renderer.rb +41 -0
  187. data/mod/history/lib/card/action.rb +1 -0
  188. data/mod/history/lib/card/action/action_renderer.rb +92 -0
  189. data/mod/history/lib/card/action/differ.rb +6 -1
  190. data/mod/history/set/all/act_view.rb +64 -0
  191. data/mod/history/set/all/action_view.rb +65 -0
  192. data/mod/history/set/all/content_history.rb +44 -37
  193. data/mod/history/set/all/history.rb +49 -263
  194. data/mod/machines/lib/stylesheets/style_cards.scss +30 -115
  195. data/mod/machines/set/abstract/script.rb +42 -7
  196. data/mod/machines/set/right/machine_input.rb +4 -0
  197. data/mod/machines/set/type/coffee_script.rb +8 -22
  198. data/mod/machines/set/type/css.rb +2 -2
  199. data/mod/machines/set/type/java_script.rb +4 -24
  200. data/mod/machines/set/type/scss.rb +1 -1
  201. data/mod/machines/spec/set/type/css_spec.rb +1 -1
  202. data/mod/machines/spec/set/type/scss_spec.rb +3 -3
  203. data/mod/machines/spec/set/type/skin_spec.rb +7 -7
  204. data/mod/pointer/set/abstract/01_pointer.rb +44 -46
  205. data/mod/pointer/set/abstract/01_pointer/edit.rb +13 -13
  206. data/mod/pointer/set/right/options.rb +4 -0
  207. data/mod/pointer/spec/set/type/pointer_spec.rb +7 -7
  208. data/mod/prosemirror_editor/set/abstract/prosemirror_editor.rb +3 -3
  209. data/mod/settings/set/abstract/permission.rb +25 -18
  210. data/mod/settings/set/right/add_help.rb +3 -3
  211. data/mod/settings/set/right/structure.rb +10 -16
  212. data/mod/settings/spec/set/right/comment_spec.rb +3 -3
  213. data/mod/settings/spec/set/right/create_spec.rb +1 -1
  214. data/mod/settings/spec/set/right/style_spec.rb +1 -1
  215. data/mod/settings/spec/set/type/setting_spec.rb +1 -1
  216. data/mod/solid_cache/set/abstract/solid_cache.rb +4 -4
  217. data/mod/solid_cache/set/right/solid_cache.rb +9 -10
  218. data/mod/standard/set/abstract/01_search_params.rb +41 -0
  219. data/mod/standard/set/abstract/search.rb +132 -0
  220. data/mod/standard/set/abstract/search/paging.rb +81 -0
  221. data/mod/standard/set/abstract/search/paging/paging_links.rb +90 -0
  222. data/mod/standard/set/abstract/wql_search.rb +67 -0
  223. data/mod/standard/set/all/error.rb +89 -82
  224. data/mod/standard/set/all/links.rb +1 -1
  225. data/mod/standard/set/all/rich_html/content.rb +125 -141
  226. data/mod/standard/set/all/rich_html/editing.rb +115 -178
  227. data/mod/standard/set/all/rich_html/form.rb +111 -131
  228. data/mod/standard/set/all/rich_html/header.rb +57 -39
  229. data/mod/standard/set/all/rich_html/menu.rb +94 -94
  230. data/mod/standard/set/all/rich_html/modal.rb +5 -10
  231. data/mod/standard/set/all/rich_html/new.rb +103 -0
  232. data/mod/standard/set/all/rich_html/toolbar.rb +54 -74
  233. data/mod/standard/set/all/rich_html/wrapper.rb +111 -138
  234. data/mod/standard/set/rstar/rules.rb +27 -38
  235. data/mod/standard/set/rstar/rules_editor.rb +298 -277
  236. data/mod/standard/set/self/navbox.rb +20 -15
  237. data/mod/standard/set/self/recent.rb +25 -17
  238. data/mod/standard/set/self/search.rb +25 -4
  239. data/mod/standard/set/type/cardtype.rb +11 -9
  240. data/mod/standard/set/type/date.rb +1 -1
  241. data/mod/standard/set/type/number.rb +1 -1
  242. data/mod/standard/set/type/phrase.rb +1 -1
  243. data/mod/standard/set/type/search_type.rb +17 -282
  244. data/mod/standard/set/type/session.rb +1 -1
  245. data/mod/standard/set/type/set.rb +155 -131
  246. data/mod/standard/set/type/toggle.rb +1 -1
  247. data/mod/standard/set/type/uri.rb +4 -4
  248. data/mod/standard/spec/chunk/include_spec.rb +13 -31
  249. data/mod/standard/spec/chunk/link_spec.rb +1 -1
  250. data/mod/standard/spec/set/all/error_spec.rb +1 -1
  251. data/mod/standard/spec/set/all/history_spec.rb +2 -2
  252. data/mod/standard/spec/set/all/rich_html/form_spec.rb +4 -4
  253. data/mod/standard/spec/set/all/rich_html/toolbar_spec.rb +22 -0
  254. data/mod/standard/spec/set/all/rich_html/wrapper_spec.rb +3 -2
  255. data/mod/standard/spec/set/right/when_created_spec.rb +1 -1
  256. data/mod/standard/spec/set/right/when_last_edited_spec.rb +1 -1
  257. data/mod/standard/spec/set/rstar/rules_spec.rb +2 -3
  258. data/mod/standard/spec/set/self/head_spec.rb +2 -2
  259. data/mod/standard/spec/set/self/navbox_spec.rb +1 -1
  260. data/mod/standard/spec/set/self/now_spec.rb +1 -1
  261. data/mod/standard/spec/set/type/date_spec.rb +1 -1
  262. data/mod/standard/spec/set/type/email_template_spec.rb +1 -1
  263. data/mod/standard/spec/set/type/layout_type_spec.rb +1 -1
  264. data/mod/standard/spec/set/type/number_spec.rb +1 -1
  265. data/mod/standard/spec/set/type/phrase_spec.rb +1 -1
  266. data/mod/standard/spec/set/type/search_type_spec.rb +2 -2
  267. data/mod/standard/spec/set/type/set_spec.rb +2 -2
  268. data/mod/standard/spec/set/type/toggle_spec.rb +2 -2
  269. data/mod/standard/spec/set/type/uri_spec.rb +3 -1
  270. data/mod/tinymce_editor/set/abstract/tinymce_editor.rb +1 -1
  271. data/spec/config/initializers/core_extensions_spec.rb +40 -10
  272. data/spec/lib/card/auth_spec.rb +8 -8
  273. data/spec/lib/card/cache_spec.rb +3 -3
  274. data/spec/lib/card/chunk_spec.rb +4 -4
  275. data/spec/lib/card/codename_spec.rb +2 -2
  276. data/spec/lib/card/content_spec.rb +23 -23
  277. data/spec/lib/card/diff_spec.rb +1 -1
  278. data/spec/lib/card/format_spec.rb +19 -24
  279. data/spec/lib/card/loader_spec.rb +4 -4
  280. data/spec/lib/card/name_spec.rb +16 -16
  281. data/spec/lib/card/query_spec.rb +80 -80
  282. data/spec/lib/card/reference_spec.rb +5 -5
  283. data/spec/lib/card/set_spec.rb +6 -6
  284. data/spec/lib/card/subcards_spec.rb +14 -0
  285. data/spec/lib/card/view_cache_spec.rb +5 -5
  286. data/spec/models/card/cardtype_spec.rb +15 -15
  287. data/spec/models/card/create_spec.rb +2 -2
  288. data/spec/models/card/trash_spec.rb +24 -24
  289. data/spec/models/card/type_transition_spec.rb +8 -8
  290. data/spec/models/card/validation_spec.rb +5 -5
  291. data/spec/models/card_spec.rb +14 -14
  292. data/spec/spec_helper.rb +6 -2
  293. data/spec/support/card_spec_helper.rb +21 -11
  294. data/spec/support/helper/card_helper.rb +11 -4
  295. metadata +73 -15
  296. data/lib/card/cache/view_cache.rb +0 -103
  297. data/mod/bootstrap/set/all/bootstrap/layout.rb +0 -58
  298. data/mod/core/set/all/view_cache.rb +0 -9
@@ -1,10 +1,7 @@
1
1
  format :html do
2
2
  def glyphicon icon_type, extra_class=""
3
- content_tag(
4
- :span, "",
5
- class: "glyphicon glyphicon-#{icon_type} #{extra_class}",
6
- "aria-hidden" => true
7
- )
3
+ wrap_with :span, "", "aria-hidden" => true,
4
+ class: "glyphicon glyphicon-#{icon_type} #{extra_class}"
8
5
  end
9
6
 
10
7
  def button_link link_text, opts={}
@@ -52,80 +49,6 @@ format :html do
52
49
  '<li role="separator" class="divider"></li>'
53
50
  end
54
51
 
55
- def breadcrumb items
56
- content_tag :ol, class: "breadcrumb" do
57
- items.map do |item|
58
- content_tag :li, item, class: "breadcrumb-item"
59
- end.join
60
- end
61
- end
62
-
63
- # Options
64
- # header: { content: String, brand: ( String | {name: , href: } ) }
65
- def navbar id, opts={}
66
- nav_opts = opts[:navbar_opts] || {}
67
- nav_opts[:class] ||= opts[:class]
68
- add_class nav_opts,
69
- "navbar navbar-#{opts.delete(:navbar_type) || 'default'}"
70
- header_opts = opts[:header] || {}
71
- if opts[:toggle_align] == :left
72
- opts[:toggle] = :hide
73
- opts[:collapsed_content] ||= ""
74
- opts[:collapsed_content] +=
75
- navbar_toggle(
76
- id, opts[:toggle], "pull-left navbar-link"
77
- ).html_safe
78
- end
79
- wrap_with :nav, nav_opts do
80
- [
81
- navbar_header(id, header_opts.delete(:content),
82
- header_opts.reverse_merge(toggle: opts[:toggle])),
83
- navbar_collapsed_content(opts[:collapsed_content]),
84
- content_tag(:div, output(yield).html_safe,
85
- class: "collapse navbar-collapse",
86
- id: "navbar-collapse-#{id}")
87
- ]
88
- end
89
- end
90
-
91
- def navbar_collapsed_content content
92
- content_tag(:div, content.html_safe, class: "container-fluid") if content
93
- end
94
-
95
- def navbar_header id, content="", opts={}
96
- brand =
97
- if opts[:brand]
98
- if opts[:brand].is_a? String
99
- "<a class='navbar-brand' href='#'>#{opts[:brand]}</a>"
100
- else
101
- link = opts[:brand][:href] || "#"
102
- "<a class='navbar-brand' href='#{link}#'>#{opts[:brand][:name]}</a>"
103
- end
104
- end
105
- wrap_with :div, class: "navbar-header" do
106
- [
107
- (navbar_toggle(id, opts[:toggle]) unless opts[:toggle] == :hide),
108
- brand,
109
- (content if content)
110
- ]
111
- end
112
- end
113
-
114
- def navbar_toggle id, content=nil, css_class=""
115
- content ||= %(
116
- <span class="icon-bar"></span>
117
- <span class="icon-bar"></span>
118
- <span class="icon-bar"></span>
119
- )
120
- <<-HTML
121
- <button type="button" class="navbar-toggle collapsed #{css_class}"
122
- data-toggle="collapse" data-target="#navbar-collapse-#{id}">
123
- <span class="sr-only">Toggle navigation</span>
124
- #{content}
125
- </button>
126
- HTML
127
- end
128
-
129
52
  def split_button button, args={}
130
53
  items = yield
131
54
  args[:situation] ||= "primary"
@@ -160,69 +83,13 @@ format :html do
160
83
  options = content_or_options if block_given?
161
84
  content = block_given? ? yield : content_or_options
162
85
  content = Array(content)
163
- item_options = options.delete(:items) || {}
164
- wrap_with :ul, options do
86
+ default_item_options = options.delete(:items) || {}
87
+ wrap_with :ul, options do
165
88
  content.map do |item|
166
- content_tag :li, item.html_safe, item_options
167
- end.join "\n"
168
- end
169
- end
170
-
171
- def accordion_group list, collapse_id=card.cardname.safe_key
172
- accordions = ""
173
- index = 1
174
- list.each_pair do |title, content|
175
- accordions << accordion(title, content, "#{collapse_id}-#{index}")
176
- index += 1
177
- end
178
- content_tag :div, accordions.html_safe,
179
- class: "panel-group",
180
- id: "accordion-#{collapse_id}",
181
- role: "tablist",
182
- "aria-multiselectable" => "true"
183
- end
184
-
185
- private
186
-
187
- def accordion title, content, collapse_id=card.cardname.safe_key
188
- accordion_content =
189
- case content
190
- when Hash then accordion_group(content, collapse_id)
191
- when Array then content.present? && list_group(content)
192
- when String then content
89
+ i_content, i_opts = item
90
+ i_opts ||= default_item_options
91
+ wrap_with :li, i_content, i_opts
193
92
  end
194
- <<-HTML.html_safe
195
- <div class="panel panel-default">
196
- #{accordion_panel(title, accordion_content, collapse_id)}
197
- </div>
198
- HTML
199
- end
200
-
201
- def accordion_panel title, body, collapse_id
202
- if body
203
- <<-HTML
204
- <div class="panel-heading" role="tab" id="heading-#{collapse_id}">
205
- <h4 class="panel-title">
206
- <a data-toggle="collapse" data-parent="#accordion-#{collapse_id}" \
207
- href="##{collapse_id}" aria-expanded="true" \
208
- aria-controls="#{collapse_id}">
209
- #{title}
210
- </a>
211
- </h4>
212
- </div>
213
- <div id="#{collapse_id}" class="panel-collapse collapse" \
214
- role="tabpanel" aria-labelledby="heading-#{collapse_id}">
215
- <div class="panel-body">
216
- #{body}
217
- </div>
218
- </div>
219
- HTML
220
- else
221
- <<-HTML
222
- <li class="list-group-item">
223
- <h4 class="panel-title">#{title}</h4>
224
- </li>
225
- HTML
226
93
  end
227
94
  end
228
95
  end
@@ -0,0 +1,74 @@
1
+ format :html do
2
+ # Options
3
+ # header: { content: String, brand: ( String | {name: , href: } ) }
4
+ def navbar id, opts={}
5
+ nav_opts = opts[:navbar_opts] || {}
6
+ nav_opts[:class] ||= opts[:class]
7
+ add_class nav_opts,
8
+ "navbar navbar-#{opts.delete(:navbar_type) || 'default'}"
9
+ header_opts = opts[:header] || {}
10
+ if opts[:toggle_align] == :left
11
+ opts[:toggle] = :hide
12
+ opts[:collapsed_content] ||= ""
13
+ opts[:collapsed_content] +=
14
+ navbar_toggle(
15
+ id, opts[:toggle], "pull-left navbar-link"
16
+ ).html_safe
17
+ end
18
+ wrap_with :nav, nav_opts do
19
+ [
20
+ navbar_header(id, header_opts.delete(:content),
21
+ header_opts.reverse_merge(toggle: opts[:toggle])),
22
+ navbar_collapsed_content(opts[:collapsed_content]),
23
+ wrap_with(:div, class: "collapse navbar-collapse",
24
+ id: "navbar-collapse-#{id}") { yield }
25
+ ]
26
+ end
27
+ end
28
+
29
+ def navbar_collapsed_content content
30
+ wrap_with(:div, content, class: "container-fluid") if content
31
+ end
32
+
33
+ def navbar_header id, content="", opts={}
34
+ brand =
35
+ if opts[:brand]
36
+ if opts[:brand].is_a? String
37
+ "<a class='navbar-brand' href='#'>#{opts[:brand]}</a>"
38
+ else
39
+ link = opts[:brand][:href] || "#"
40
+ "<a class='navbar-brand' href='#{link}#'>#{opts[:brand][:name]}</a>"
41
+ end
42
+ end
43
+ wrap_with :div, class: "navbar-header" do
44
+ [
45
+ (navbar_toggle(id, opts[:toggle]) unless opts[:toggle] == :hide),
46
+ brand,
47
+ (content if content)
48
+ ]
49
+ end
50
+ end
51
+
52
+ def navbar_toggle id, content=nil, css_class=""
53
+ content ||= %(
54
+ <span class="icon-bar"></span>
55
+ <span class="icon-bar"></span>
56
+ <span class="icon-bar"></span>
57
+ )
58
+ <<-HTML
59
+ <button type="button" class="navbar-toggle collapsed #{css_class}"
60
+ data-toggle="collapse" data-target="#navbar-collapse-#{id}">
61
+ <span class="sr-only">Toggle navigation</span>
62
+ #{content}
63
+ </button>
64
+ HTML
65
+ end
66
+
67
+ def breadcrumb items
68
+ wrap_with :ol, class: "breadcrumb" do
69
+ items.map do |item|
70
+ wrap_with :li, item, class: "breadcrumb-item"
71
+ end.join
72
+ end
73
+ end
74
+ end
@@ -1,61 +1,91 @@
1
1
  format :html do
2
- # @param [Array<Array,String>] content the content for the table. Accepts
3
- # strings or arrays for each row.
4
- # @param [Hash] opts
5
- # @option opts [String, Array] :header use first row of content as header or
6
- # value of this option if it is a string
7
- # @return [HTML] bootstrap table
8
- def table content, opts={}
9
- add_class opts, "table"
10
- if opts[:header]
11
- header = opts[:header].is_a?(Array) ? opts[:header] : content.shift
2
+ class TableHelper
3
+ def initialize format, content, opts={}
4
+ @format = format
5
+ @div_table = opts.delete :div_table
6
+ if opts[:header]
7
+ @header = opts[:header].is_a?(Array) ? opts[:header] : content.shift
8
+ end
9
+ @rows = content
10
+ @opts = opts
11
+ @format.add_class opts, :table
12
12
  end
13
- wrap_with :table, class: opts[:class] do
14
- [
15
- (table_header(header) if header),
16
- table_body(content)
17
- ]
13
+
14
+ def render
15
+ tag :table, class: @opts[:class] do
16
+ [header, body]
17
+ end
18
18
  end
19
- end
20
19
 
21
- def table_header entries
22
- content_tag :thead do
23
- content_tag :tr do
24
- entries.map do |item|
25
- content_tag :th, item
26
- end.join "\n"
20
+ def header
21
+ return unless @header
22
+ tag :thead do
23
+ tag :tr do
24
+ @header.map do |item|
25
+ tag(:th) { item }
26
+ end.join "\n"
27
+ end
27
28
  end
28
29
  end
29
- end
30
30
 
31
- def table_body rows
32
- content_tag :tbody do
33
- rows.map do |row|
34
- table_row row
35
- end.join "\n"
31
+ def body
32
+ tag :tbody do
33
+ @rows.map do |row_content|
34
+ row row_content
35
+ end.join "\n"
36
+ end
36
37
  end
37
- end
38
38
 
39
- def table_cell cell
40
- if cell.is_a? Hash
41
- content_tag :td, cell.delete(:content).to_s.html_safe, cell
42
- else
43
- content_tag :td, String(cell).html_safe
39
+ def row row
40
+ row_data, row_class =
41
+ case row
42
+ when Hash then
43
+ [row.delete(:content), row]
44
+ else
45
+ [row, {}]
46
+ end
47
+ row_content =
48
+ if row_data.is_a?(Array)
49
+ row_data.map { |item| cell item }.join "\n"
50
+ else
51
+ row_data
52
+ end
53
+ tag :tr, row_content, row_class
44
54
  end
45
- end
46
55
 
47
- def table_row row
48
- row_data, row_class =
49
- case row
50
- when Hash then [row.delete(:content), row]
51
- else [row, nil]
52
- end
53
- row_content =
54
- if row_data.is_a?(Array)
55
- row_data.map { |item| table_cell item }.join "\n"
56
+ def cell cell
57
+ if cell.is_a? Hash
58
+ content = cell.delete(:content).to_s
59
+ tag :td, cell do
60
+ content
61
+ end
56
62
  else
57
- row_data
63
+ tag :td do
64
+ String(cell)
65
+ end
66
+ end
67
+ end
68
+
69
+ def tag elem, content_or_opts={}, opts={}, &block
70
+ if @div_table
71
+ if content_or_opts.is_a? Hash
72
+ @format.add_class content_or_opts, elem
73
+ else
74
+ @format.add_class opts, elem
75
+ end
76
+ elem = :div
58
77
  end
59
- content_tag :tr, row_content.html_safe, row_class
78
+ @format.wrap_with elem, content_or_opts, opts, &block
79
+ end
80
+ end
81
+
82
+ # @param [Array<Array,String>] content the content for the table. Accepts
83
+ # strings or arrays for each row.
84
+ # @param [Hash] opts
85
+ # @option opts [String, Array] :header use first row of content as header or
86
+ # value of this option if it is a string
87
+ # @return [HTML] bootstrap table
88
+ def table content, opts={}
89
+ TableHelper.new(self, content, opts).render
60
90
  end
61
91
  end
@@ -1,10 +1,12 @@
1
+
2
+
1
3
  format :html do
2
4
  # @param tab_type [String] 'tabs' or 'pills'
3
5
  # @param tabs [Hash] keys are the labels, values the content for the tabs
4
6
  # @param active_name [String] label of the tab that should be active at the
5
7
  # beginning (default is the first)
6
8
  # @return [HTML] bootstrap tabs element with all content preloaded
7
- def static_tabs tabs, active_name=nil, tab_type="tabs"
9
+ def static_tabs tabs, active_name=nil, tab_type="tabs"
8
10
  tab_buttons = ""
9
11
  tab_panes = ""
10
12
  tabs.each do |tab_name, tab_content|
@@ -17,56 +19,89 @@ format :html do
17
19
  tab_panel tab_buttons, tab_panes, tab_type
18
20
  end
19
21
 
20
- # @param [Hash] tabs keys are the labels for the tabs, values the urls to
21
- # load the content from
22
+ # @param [Hash] tabs keys are the views, values the title unless you pass a
23
+ # hash as value
24
+ # @option tabs [String] :title
25
+ # @option tabs [path] :path
26
+ # @option tabs [Symbol] :view
22
27
  # @param [String] active_name label of the tab that should be active at the
23
28
  # beginning
24
29
  # @param [String] active_content content of the active tab
30
+ # can also be passed via a block
25
31
  # @param [Hash] args options
26
32
  # @option args [String] :type ('tabs') use pills or tabs
27
33
  # @option args [Hash] :panel_args html args used for the panel div
28
34
  # @option args [Hash] :pane_args html args used for the pane div
29
35
  # @return [HTML] bootstrap tabs element with content only for the active
30
36
  # tab; other tabs get loaded via ajax when selected
31
- def lazy_loading_tabs tabs, active_name, active_content, args={}
37
+ def lazy_loading_tabs tabs, active_name, active_content="", args={}, &block
32
38
  tab_buttons = ""
33
39
  tab_panes = ""
34
- tabs.each do |tab_name, url|
35
- active_tab = (active_name == tab_name)
36
- id = "#{card.cardname.safe_key}-#{tab_name.to_name.safe_key}"
37
- tab_buttons += tab_button(
38
- "##{id}", tab_name, active_tab,
39
- "data-url" => url.html_safe,
40
- class: (active_tab ? nil : "load")
41
- )
42
- tab_content = active_tab ? active_content : ""
43
- tab_panes += tab_pane(id, tab_content, active_tab, args[:pane_args])
40
+ standardize_tabs(tabs, active_name) do |tab_name, url, id, active_tab|
41
+ tab_buttons += lazy_tab_button tab_name, id, url, active_tab
42
+ tab_panes += lazy_tab_pane id, active_tab, active_content,
43
+ args[:pane_args], &block
44
44
  end
45
45
  tab_type = args.delete(:type) || "tabs"
46
46
  tab_panel tab_buttons, tab_panes, tab_type, args[:panel_args]
47
47
  end
48
48
 
49
+ def lazy_tab_button tab_name, id, url, active_tab
50
+ tab_button(
51
+ "##{id}", tab_name, active_tab,
52
+ "data-url" => url.html_safe,
53
+ class: (active_tab ? nil : "load")
54
+ )
55
+ end
56
+
57
+ def lazy_tab_pane id, active_tab, active_content, args
58
+ tab_content =
59
+ if active_tab
60
+ block_given? ? yield : active_content
61
+ else
62
+ ""
63
+ end
64
+ tab_pane(id, tab_content, active_tab, args)
65
+ end
66
+
67
+ def standardize_tabs tabs, active_name
68
+ tabs.each do |tab_view_name, tab_details|
69
+ tab_title, url =
70
+ if tab_details.is_a? Hash
71
+ [tab_details[:title], tab_details[:path] || path(tab_details[:view])]
72
+ else
73
+ [tab_details, path(view: tab_view_name)]
74
+ end
75
+ id = "#{card.cardname.safe_key}-#{tab_view_name.to_name.safe_key}"
76
+ active_tab = (active_name == tab_view_name)
77
+ yield tab_title, url, id, active_tab
78
+ end
79
+ end
80
+
49
81
  def tab_panel tab_buttons, tab_panes, tab_type="tabs", args=nil
50
82
  args ||= {}
51
83
  add_class args, "tabbable"
52
84
  args.reverse_merge! role: "tabpanel"
53
85
  wrap_with :div, args do
54
86
  [
55
- content_tag(:ul, tab_buttons.html_safe,
56
- class: "nav nav-#{tab_type}",
57
- role: "tablist"),
58
- content_tag(:div, tab_panes.html_safe, class: "tab-content")
87
+ wrap_with(:ul, tab_buttons, class: "nav nav-#{tab_type}",
88
+ role: "tablist"),
89
+ wrap_with(:div, tab_panes, class: "tab-content")
59
90
  ]
60
91
  end
61
92
  end
62
93
 
63
94
  def tab_button target, text, active=false, link_attr={}
64
- link = link_to fancy_title(text), link_attr.merge(
65
- path: target, role: "tab", "data-toggle" => "tab"
66
- )
95
+ link = tab_button_link target, text, link_attr
67
96
  li_args = { role: :presentation }
68
97
  li_args[:class] = "active" if active
69
- content_tag :li, link, li_args
98
+ wrap_with :li, link, li_args
99
+ end
100
+
101
+ def tab_button_link target, text, link_attr={}
102
+ link_to fancy_title(text), link_attr.merge(
103
+ path: target, role: "tab", "data-toggle" => "tab"
104
+ )
70
105
  end
71
106
 
72
107
  def tab_pane id, content, active=false, args=nil
@@ -75,6 +110,6 @@ format :html do
75
110
  id: id
76
111
  add_class args, "tab-pane"
77
112
  add_class args, "active" if active
78
- content_tag :div, content.html_safe, args
113
+ wrap_with :div, content, args
79
114
  end
80
115
  end