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,106 +1,103 @@
1
1
  format :html do
2
- view :menu, denial: :blank, tags: :unknown_ok do |args|
3
- return _render_template_closer if args[:menu_hack] == :template_closer
2
+ view :menu, denial: :blank, tags: :unknown_ok do
4
3
  return "" if card.unknown?
5
4
  wrap_with :div, class: "menu-slot nodblclick" do
6
5
  [
7
- _optional_render(:horizontal_menu, args, :hide),
8
- _render_menu_link(args),
9
- _render_modal_slot(args.merge(modal_id: card.cardname.safe_key))
6
+ _render(:horizontal_menu, optional: :hide),
7
+ _render_menu_link,
8
+ _render_modal_slot(modal_id: card.cardname.safe_key)
10
9
  ]
11
10
  end
12
11
  end
13
12
 
14
- view :menu_link do |args|
15
- menu_icon = glyphicon args[:menu_icon]
16
- path_opts = { slot: { home_view: args[:home_view] } }
17
- path_opts[:is_main] = true if main?
13
+ view :menu_link do
18
14
  css_class =
19
- if show_view?(:horizontal_menu,
20
- args.merge(default_visibility: :hide, optional: true))
21
- "visible-xs"
22
- else
23
- "show-on-hover"
24
- end
15
+ show_view?(:horizontal_menu, :hide) ? "visible-xs" : "show-on-hover"
16
+
25
17
  wrap_with :div, class: "vertical-card-menu card-menu #{css_class}" do
26
- content_tag :div, class: "btn-group slotter card-slot pull-right" do
27
- link_to_view(:vertical_menu, menu_icon, path: path_opts).html_safe
18
+ wrap_with :div, class: "btn-group slotter card-slot pull-right" do
19
+ link_to_view(:vertical_menu, menu_icon, path: menu_path_opts).html_safe
28
20
  end
29
21
  end
30
22
  end
31
23
 
32
- view :vertical_menu, tags: :unknown_ok do |args|
33
- items = menu_item_list(args).map do |item|
34
- "<li class='#{args[:item_class]}'>#{item}</li>"
35
- end.join "\n"
24
+ def menu_path_opts
25
+ opts = { slot: { home_view: (voo.home_view || @slot_view),
26
+ name_context: context_names_to_params } }
27
+ opts[:is_main] = true if main?
28
+ opts
29
+ end
30
+
31
+ def menu_icon
32
+ glyphicon "cog"
33
+ end
34
+
35
+ view :vertical_menu, tags: :unknown_ok do
36
36
  wrap_with :ul, class: "btn-group pull-right slotter" do
37
- [
38
- content_tag(:span,
39
- "<a href='#'>#{glyphicon args[:menu_icon]}</a>".html_safe,
40
- class: "open-menu dropdown-toggle",
41
- "data-toggle" => "dropdown", "aria-expanded" => "false"),
42
- content_tag(:ul, items.html_safe, class: "dropdown-menu", role: "menu")
43
- ]
37
+ [vertical_menu_toggle, vertical_menu_item_list]
44
38
  end
45
39
  end
46
40
 
47
- view :horizontal_menu do |args|
48
- content_tag :div, class: "btn-group slotter pull-right card-menu "\
49
- "horizontal-card-menu hidden-xs" do
50
- list_opts = args.merge(link_opts: { class: "btn btn-default" })
51
- menu_item_list(list_opts).join("\n").html_safe
41
+ def vertical_menu_toggle
42
+ wrap_with :span, "<a href='#'>#{menu_icon}</a>".html_safe,
43
+ class: "open-menu dropdown-toggle",
44
+ "data-toggle" => "dropdown",
45
+ "aria-expanded" => "false"
46
+ end
47
+
48
+ def vertical_menu_item_list
49
+ wrap_with :ul, class: "dropdown-menu", role: "menu" do
50
+ menu_item_list.map do |item|
51
+ "<li>#{item}</li>"
52
+ end.join("\n").html_safe
52
53
  end
53
54
  end
54
55
 
55
- def menu_item_list args
56
- menu_items = []
57
- menu_items << menu_edit_link(args) if args[:show_menu_item][:edit]
58
- menu_items << menu_discuss_link(args) if args[:show_menu_item][:discuss]
59
- menu_items << menu_follow_link(args) if args[:show_menu_item][:follow]
60
- menu_items << menu_page_link(args) if args[:show_menu_item][:page]
61
- menu_items << menu_rules_link(args) if args[:show_menu_item][:rules]
62
- menu_items << menu_account_link(args) if args[:show_menu_item][:account]
63
- menu_items << menu_more_link(args) if args[:show_menu_item][:more]
64
- menu_items
56
+ view :horizontal_menu do
57
+ wrap_with :div, class: "btn-group slotter pull-right card-menu "\
58
+ "horizontal-card-menu hidden-xs" do
59
+ menu_item_list(class: "btn btn-default").join("\n").html_safe
60
+ end
65
61
  end
66
62
 
67
- def menu_link_opts old, new
68
- opts = old[:link_opts] || {}
69
- opts.merge new
63
+ def menu_item_list link_opts={}
64
+ [:edit, :discuss, :follow, :page, :rules, :account, :more].map do |item|
65
+ next unless send "show_menu_item_#{item}?"
66
+ send "menu_#{item}_link", link_opts
67
+ end.compact
70
68
  end
71
69
 
72
- def menu_edit_link args
73
- menu_item "edit", "edit", menu_link_opts(args, view: :edit)
70
+ def menu_edit_link opts
71
+ menu_item "edit", "edit", opts.merge(view: :edit, path: menu_path_opts)
74
72
  end
75
73
 
76
- def menu_discuss_link args
77
- opts = menu_link_opts args, related: Card[:discussion].key
78
- menu_item "discuss", "comment", opts
74
+ def menu_discuss_link opts
75
+ menu_item "discuss", "comment", opts.merge(related: Card[:discussion].key)
79
76
  end
80
77
 
81
- def menu_follow_link args
82
- _render_follow_link(args.merge(icon: true))
78
+ def menu_follow_link opts
79
+ _render_follow_link(icon: true, link_opts: opts)
83
80
  end
84
81
 
85
- def menu_page_link args
86
- menu_item "page", "new-window", menu_link_opts(args, card: card)
82
+ def menu_page_link opts
83
+ menu_item "page", "new-window", opts.merge(card: card)
87
84
  end
88
85
 
89
- def menu_rules_link args
90
- menu_item "rules", "wrench", menu_link_opts(args, view: :options)
86
+ def menu_rules_link opts
87
+ menu_item "rules", "wrench", opts.merge(view: :options)
91
88
  end
92
89
 
93
- def menu_account_link args
94
- menu_item "account", "user", menu_link_opts(
95
- args, view: :related,
96
- path: { related: { name: "+*account", view: :edit } }
90
+ def menu_account_link opts
91
+ menu_item "account", "user", opts.merge(
92
+ view: :related,
93
+ path: { related: { name: "+*account", view: :edit } }
97
94
  )
98
95
  end
99
96
 
100
- def menu_more_link args
101
- view = args[:home_view] || :open
102
- menu_item "", "option-horizontal", menu_link_opts(
103
- args, path: { view: view, slot: { show: :toolbar } }
97
+ def menu_more_link opts
98
+ view = voo.home_view || :open
99
+ menu_item "", "option-horizontal", opts.merge(
100
+ view: view, path: { slot: { show: :toolbar } }
104
101
  )
105
102
  end
106
103
 
@@ -109,41 +106,44 @@ format :html do
109
106
  smart_link_to link_text.html_safe, opts
110
107
  end
111
108
 
112
- def default_menu_link_args args
113
- args[:menu_icon] ||= "cog"
109
+ def show_menu_item_discuss?
110
+ discussion_card = menu_discussion_card
111
+ return unless discussion_card
112
+ permission_task = discussion_card.new_card? ? :comment : :read
113
+ discussion_card.ok? permission_task
114
114
  end
115
115
 
116
- def default_vertical_menu_args args
117
- default_menu_link_args args
118
- args.merge! show_menu_item: show_menu_items
116
+ def show_menu_item_page?
117
+ card.name.present? && !main?
119
118
  end
120
119
 
121
- def default_horizontal_menu_args args
122
- args.merge! show_menu_item: show_menu_items
120
+ def show_menu_item_rules?
121
+ card.virtual?
123
122
  end
124
123
 
125
- def show_menu_items
126
- disc_tagname = Card.quick_fetch(:discussion).cardname
127
- disc_card =
128
- unless card.new_card? || card.junction? &&
129
- card.cardname.tag_name.key == disc_tagname.key
130
- Card.fetch "#{card.name}+#{disc_tagname}", skip_modules: true, new: {}
131
- end
124
+ def show_menu_item_edit?
125
+ return unless card.real?
126
+ card.ok?(:update) || structure_editable?
127
+ end
132
128
 
133
- res = {
134
- discuss: disc_card &&
135
- disc_card.ok?(disc_card.new_card? ? :comment : :read),
136
- page: card.name.present? && !main?,
137
- rules: card.virtual?
138
- }
139
- if card.real?
140
- res.merge!(
141
- edit: card.ok?(:update) || structure_editable?,
142
- account: card.account && card.ok?(:update),
143
- follow: show_follow?,
144
- more: true
145
- )
146
- end
147
- res
129
+ def show_menu_item_account?
130
+ return unless card.real?
131
+ card.account && card.ok?(:update)
132
+ end
133
+
134
+ def show_menu_item_follow?
135
+ return unless card.real?
136
+ show_follow?
137
+ end
138
+
139
+ def show_menu_item_more?
140
+ card.real?
141
+ end
142
+
143
+ def menu_discussion_card
144
+ return if card.new_card?
145
+ disc_tagname = Card.quick_fetch(:discussion).cardname
146
+ return if card.junction? && card.cardname.tag_name.key == disc_tagname.key
147
+ card.fetch trait: :discussion, skip_modules: true, new: {}
148
148
  end
149
149
  end
@@ -15,7 +15,7 @@ format :html do
15
15
  add_class dialog_args, args[:dialog_class]
16
16
  wrap_with(:div, class: "modal fade", role: "dialog", id: id) do
17
17
  wrap_with(:div, dialog_args) do
18
- content_tag :div, class: "modal-content" do
18
+ wrap_with :div, class: "modal-content" do
19
19
  ""
20
20
  end
21
21
  end
@@ -40,14 +40,9 @@ format :html do
40
40
  end
41
41
  end
42
42
 
43
- view :modal_footer, tags: :unknown_ok do |args|
44
- args[:buttons] || ""
45
- end
46
-
47
- def default_modal_footer_args args
48
- args[:buttons] ||=
49
- button_tag "Close",
50
- class: "btn-xs close-modal pull-right",
51
- "data-dismiss" => "modal"
43
+ view :modal_footer, tags: :unknown_ok do
44
+ button_tag "Close",
45
+ class: "btn-xs close-modal pull-right",
46
+ "data-dismiss" => "modal"
52
47
  end
53
48
  end
@@ -0,0 +1,103 @@
1
+ format :html do
2
+ view :new, perms: :create, tags: :unknown_ok, cache: :never do
3
+ voo.title ||= new_view_title if new_name_prompt?
4
+ voo.show :help
5
+ frame_and_form :create, "main-success" => "REDIRECT" do
6
+ [
7
+ new_view_hidden,
8
+ new_view_name,
9
+ new_view_type,
10
+ _optional_render_content_formgroup,
11
+ _optional_render_new_buttons
12
+ ]
13
+ end
14
+ end
15
+
16
+ def new_view_title
17
+ output(
18
+ "New",
19
+ (card.type_name unless card.type_id == Card.default_type_id)
20
+ )
21
+ end
22
+
23
+ def new_view_hidden
24
+ target = card.rule(:thanks) || "_self"
25
+ hidden_field_tag "success", target
26
+ end
27
+
28
+ # NAME HANDLING
29
+
30
+ def new_view_name
31
+ if new_name_prompt?
32
+ new_name_formgroup
33
+ elsif !autoname?
34
+ hidden_field_tag "card[name]", card.name
35
+ end
36
+ end
37
+
38
+ def new_name_formgroup
39
+ output _optional_render_name_formgroup,
40
+ hidden_field_tag("name_prompt", true)
41
+ end
42
+
43
+ def new_name_prompt?
44
+ voo.visible? :name_formgroup do
45
+ needs_name? || params[:name_prompt]
46
+ end
47
+ end
48
+
49
+ def autoname?
50
+ @autoname.nil? ? (@autoname = card.rule_card :autoname).present? : @autoname
51
+ end
52
+
53
+ def needs_name?
54
+ card.name.blank? && !autoname?
55
+ end
56
+
57
+ # TYPE HANDLING
58
+
59
+ def new_view_type
60
+ if new_type_prompt?
61
+ _render_new_type_formgroup
62
+ else
63
+ hidden_field_tag "card[type_id]", card.type_id
64
+ end
65
+ end
66
+
67
+ def new_type_prompt?
68
+ voo.visible? :new_type_formgroup do
69
+ !new_type_preset? && new_type_prompt_context? && new_type_permitted?
70
+ end
71
+ end
72
+
73
+ def new_type_preset?
74
+ params[:type] || voo.type
75
+ end
76
+
77
+ def new_type_prompt_context?
78
+ main? || card.simple? || card.is_template?
79
+ end
80
+
81
+ def new_type_permitted?
82
+ Card.new(type_id: card.type_id).ok? :create
83
+ end
84
+
85
+ view :new_type_formgroup do
86
+ wrap_type_formgroup do
87
+ type_field class: "type-field live-type-field",
88
+ href: path(view: :new),
89
+ "data-remote" => true
90
+ end
91
+ end
92
+
93
+ view :new_buttons do
94
+ cancel_path = !main? && path(view: :missing)
95
+ button_formgroup do
96
+ [standard_create_button, standard_cancel_button(cancel_path)]
97
+ end
98
+ end
99
+
100
+ def standard_create_button
101
+ submit_button class: "submit-button create-submit-button"
102
+ end
103
+ end
@@ -5,7 +5,7 @@ format :html do
5
5
 
6
6
  view :toolbar do |args|
7
7
  collapsed = close_link(args.merge(class: "pull-right visible-xs"))
8
- navbar "toolbar-#{card.cardname.safe_key}-#{args[:home_view]}",
8
+ navbar "toolbar-#{card.cardname.safe_key}-#{voo.home_view}",
9
9
  toggle_align: :left, class: "slotter toolbar",
10
10
  navbar_type: "inverse",
11
11
  collapsed_content: collapsed do
@@ -20,7 +20,7 @@ format :html do
20
20
  ]
21
21
  end),
22
22
  (wrap_with(:form, class: "navbar-form navbar-right") do
23
- content_tag :div, class: "form-group" do
23
+ wrap_with :div, class: "form-group" do
24
24
  _optional_render(:toolbar_buttons, args, :show)
25
25
  end
26
26
  end)
@@ -29,7 +29,7 @@ format :html do
29
29
  end
30
30
 
31
31
  def default_toolbar_args args
32
- args[:nested_fields] = nested_fields(args)
32
+ args[:nested_fields] = nested_fields
33
33
  args[:active_toolbar_button] ||= active_toolbar_button @slot_view, args
34
34
  end
35
35
 
@@ -86,32 +86,41 @@ format :html do
86
86
  end
87
87
 
88
88
  def rules_split_button args
89
- recent = smart_link_to "recent", view: :edit_rules,
90
- slot: { rule_view: :recent_rules }
91
- common = smart_link_to "common", view: :edit_rules,
92
- slot: { rule_view: :common_rules }
93
- group = smart_link_to "by group", view: :edit_rules,
94
- slot: { rule_view: :grouped_rules }
95
- all = smart_link_to "by name", view: :edit_rules,
96
- slot: { rule_view: :all_rules }
97
- nests = smart_link_to "nests", view: :edit_nest_rules,
98
- slot: { rule_view: :field_related_rules }
99
- toolbar_split_button "rules", { view: :edit_rules }, args do
100
- {
101
- common_rules: common,
102
- grouped_rules: group,
103
- all_rules: all,
104
- separator: (separator if args[:nested_fields].present?),
105
- recent_rules: (recent if recently_edited_settings?),
106
- edit_nest_rules: (nests if args[:nested_fields].present?)
107
- }
108
- end
89
+ button_hash = {
90
+ common_rules: edit_rules_link("common", :common_rules),
91
+ grouped_rules: edit_rules_link("by group", :grouped_rules),
92
+ all_rules: edit_rules_link("by name", :all_rules)
93
+ }
94
+ recently_edited_rules_link button_hash
95
+ nest_rules_link button_hash, args[:nested_fields]
96
+ toolbar_split_button("rules", { view: :edit_rules }, args) { button_hash }
97
+ end
98
+
99
+ def nest_rules_link button_hash, nested_fields
100
+ return unless nested_fields.present?
101
+ button_hash[:separator] = separator
102
+ button_hash[:edit_nest_rules] = edit_nest_rules_link "nests"
103
+ end
104
+
105
+ def recently_edited_rules_link button_hash
106
+ return unless recently_edited_settings?
107
+ button_hash[:recent_rules] = edit_rules_link "recent", :recent_rules
108
+ end
109
+
110
+ def edit_nest_rules_link text
111
+ smart_link_to text, view: :edit_nest_rules,
112
+ path: { slot: { rule_view: :field_related_rules } }
113
+ end
114
+
115
+ def edit_rules_link text, rule_view
116
+ smart_link_to text, view: :edit_rules,
117
+ path: { slot: { rule_view: rule_view } }
109
118
  end
110
119
 
111
120
  def edit_split_button args
112
121
  toolbar_split_button "edit", { view: :edit }, args do
113
122
  {
114
- edit: _render_edit_content_link(args),
123
+ edit: _render_edit_link(args),
115
124
  edit_nests: (_render_edit_nests_link if nests_editable?(args)),
116
125
  structure: (_render_edit_structure_link if structure_editable?),
117
126
  edit_name: _render_edit_name_link,
@@ -186,8 +195,7 @@ format :html do
186
195
  [
187
196
  _optional_render(:delete_button, args, show_or_hide_delete),
188
197
  _optional_render(:refresh_button, args, :show),
189
- _optional_render(:related_button, args, :show),
190
- _optional_render(:history_button, args, :hide)
198
+ _optional_render(:related_button, args, :show)
191
199
  ]
192
200
  end
193
201
  end
@@ -242,62 +250,34 @@ format :html do
242
250
  icon = glyphicon symbol
243
251
  hide ||= "hidden-xs hidden-sm hidden-md hidden-lg"
244
252
  css_classes = "menu-item-label #{hide}"
245
- rich_text = content_tag :span, text.html_safe, class: css_classes
253
+ rich_text = wrap_with :span, text.html_safe, class: css_classes
246
254
  icon + rich_text
247
255
  end
248
256
 
249
- def autosaved_draft_link
250
- link_to_view :edit, "autosaved draft",
251
- path: { edit_draft: true, slot: { show: :toolbar } },
252
- class: "navbar-link slotter pull-right"
253
- end
254
-
255
- def default_edit_content_link_args args
256
- args[:title] ||= "content"
257
- end
258
-
259
- view :edit_content_link do |args|
260
- toolbar_view_link :edit, args
257
+ def autosaved_draft_link opts={}
258
+ text = opts.delete(:text) || "autosaved draft"
259
+ opts[:path] = { edit_draft: true, slot: { show: :toolbar } }
260
+ add_class opts, "navbar-link slotter"
261
+ link_to_view :edit, text, opts
261
262
  end
262
263
 
263
- def default_edit_name_link_args args
264
- args[:title] ||= "name"
265
- end
266
- view :edit_name_link do |args|
267
- toolbar_view_link :edit_name, args
268
- end
269
-
270
- def default_edit_type_link_args args
271
- args[:title] ||= "type"
272
- end
273
-
274
- view :edit_type_link do |args|
275
- toolbar_view_link :edit_type, args
276
- end
277
-
278
- view :edit_structure_link do |_args|
279
- link_to_view :edit_structure, "structure"
280
- end
264
+ {
265
+ edit: "content",
266
+ edit_name: "name",
267
+ edit_type: "type",
268
+ edit_nests: "nests",
269
+ edit_structure: "structure",
270
+ history: "history"
271
+ }.each do |viewname, viewtitle|
281
272
 
282
- def default_history_link_args args
283
- args[:title] ||= "history"
284
- end
285
-
286
- view :history_link do |args|
287
- toolbar_view_link :history, args
288
- end
289
-
290
- def default_edit_nests_link_args args
291
- args[:title] ||= "nests"
292
- end
293
-
294
- view :edit_nests_link do |args|
295
- toolbar_view_link :edit_nests, args
273
+ view "#{viewname}_link" do
274
+ voo.title ||= viewtitle
275
+ toolbar_view_link viewname
276
+ end
296
277
  end
297
278
 
298
- def toolbar_view_link view, args
299
- text = args.delete(:title)
300
- link_to_view view, text, args
279
+ def toolbar_view_link view
280
+ link_to_view view, voo.title
301
281
  end
302
282
 
303
283
  def recently_edited_settings?