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
@@ -3,32 +3,52 @@ class Card
3
3
  module Nest
4
4
  # Handle the main nest
5
5
  module Main
6
- def wrap_main content
7
- content # no wrapping in base format
6
+ def wrap_main
7
+ yield # no wrapping in base format
8
8
  end
9
9
 
10
- protected
11
-
12
10
  def main_nest opts
13
- opts.merge! root.main_opts if root.main_opts
14
- legacy_main_opts_tweaks! opts
15
-
16
- with_nest_mode :normal do
17
- @mainline = true
18
- result = wrap_main nest_card(root.card, opts)
19
- @mainline = false
20
- result
11
+ wrap_main do
12
+ with_nest_mode :normal do
13
+ nest root.card, opts.merge(main_view: true, main: true)
14
+ end
21
15
  end
22
16
  end
23
17
 
24
- def legacy_main_opts_tweaks! opts
25
- if (val = params[:size]) && val.present?
26
- opts[:size] = val.to_sym
27
- end
18
+ def main_nest? nest_name
19
+ nest_name == "_main" && !root.already_mained?
20
+ end
28
21
 
29
- if (val = params[:item]) && val.present?
30
- opts[:items] = (opts[:items] || {}).reverse_merge view: val.to_sym
31
- end
22
+ def already_mained?
23
+ return true if @main || @already_main
24
+ @already_main = true
25
+ false
26
+ end
27
+
28
+ def main!
29
+ @main = true
30
+ end
31
+
32
+ def main_nest_options
33
+ opts = root.main_opts || {}
34
+ main_nest_size_opt opts
35
+ main_nest_items_opt opts
36
+ opts
37
+ end
38
+
39
+ protected
40
+
41
+ def main_nest_size_opt opts
42
+ val = params[:size]
43
+ return unless val.present?
44
+ opts[:size] = val.to_sym
45
+ end
46
+
47
+ def main_nest_items_opt opts
48
+ val = params[:item]
49
+ return unless val.present?
50
+ opts[:items] ||= {}
51
+ opts[:items][:view] = val.to_sym
32
52
  end
33
53
  end
34
54
  end
@@ -4,28 +4,15 @@ class Card
4
4
  module Subformat
5
5
  def subformat subcard
6
6
  subcard = Card.fetch(subcard, new: {}) if subcard.is_a?(String)
7
- self.class.new subcard,
8
- parent: self, depth: @depth + 1, root: @root,
9
- # FIXME: - the following four should not be hard-coded
10
- # here. need a generalized mechanism
11
- # for attribute inheritance
12
- context_names: @context_names, mode: @mode,
13
- mainline: @mainline, form: @form
7
+ self.class.new subcard, root: @root, parent: self, depth: @depth + 1,
8
+ form: @form, mode: @mode,
9
+ context_names: @context_names
14
10
  end
15
11
 
16
12
  def field_subformat field
17
13
  field = card.cardname.field(field) unless field.is_a?(Card)
18
14
  subformat field
19
15
  end
20
-
21
- private
22
-
23
- def nest_subformat nested_card, opts
24
- return self if opts[:inc_name] =~ /^_(self)?$/
25
- sub = subformat nested_card
26
- sub.nest_opts = opts[:items] ? opts[:items].clone : {}
27
- sub
28
- end
29
16
  end
30
17
  end
31
18
  end
@@ -1,38 +1,28 @@
1
1
  class Card
2
2
  class Format
3
3
  module Nest
4
+ NEST_MODES = { new: :edit,
5
+ closed_content: :closed,
6
+ setup: :edit,
7
+ edit: :edit, closed: :closed, layout: :layout,
8
+ normal: :normal, template: :template }.freeze
9
+
4
10
  # Renders views for a nests
5
11
  module View
6
- NEST_MODES = { new: :edit,
7
- closed_content: :closed,
8
- setup: :edit,
9
- edit: :edit, closed: :closed, layout: :layout,
10
- normal: :normal, template: :template }.freeze
11
-
12
- def nest_render view, opts
13
- optional_render nest_view(view), opts
14
- end
15
-
16
12
  def with_nest_mode mode
17
- if (switch_mode = NEST_MODES[mode]) && @mode != switch_mode
18
- old_mode = @mode
13
+ old_mode = @mode
14
+ if (switch_mode = NEST_MODES[mode])
19
15
  @mode = switch_mode
20
- @nest_defaults = nil
21
16
  end
22
17
  result = yield
23
- if old_mode
24
- @nest_defaults = nil
25
- @mode = old_mode
26
- end
18
+ @mode = old_mode
27
19
  result
28
20
  end
29
21
 
30
- private
22
+ # private
31
23
 
32
- def nest_view view
33
- # This was refactored based on the assumption that the subformat
34
- # has always the same @mode as its parent format
35
- # The nest view used to be based on the mode of the parent format
24
+ def modal_nest_view view
25
+ # Note: the subformat always has the same @mode as its parent format
36
26
  case @mode
37
27
  when :edit then view_in_edit_mode(view)
38
28
  when :template then :template_rule
@@ -44,22 +34,23 @@ class Card
44
34
  # Returns the view that the card should use
45
35
  # if nested in edit mode
46
36
  def view_in_edit_mode homeview
47
- not_in_form =
48
- Card::Format.perms[homeview] == :none || # view configured not to keep in form
49
- card.structure || # not yet nesting structures
50
- card.key.blank? # eg {{_self|type}} on new cards
37
+ hide_view_in_edit_mode?(homeview) ? :blank : :edit_in_form
38
+ end
51
39
 
52
- not_in_form ? :blank : :edit_in_form
40
+ def hide_view_in_edit_mode? view
41
+ Card::Format.perms[view] == :none || # view never edited
42
+ card.structure || # not yet nesting structures
43
+ card.key.blank? # eg {{_self|type}} on new cards
53
44
  end
54
45
 
55
46
  # Return the view that the card should use
56
47
  # if nested in closed mode
57
- def view_in_closed_mode homeview
58
- approved_view = Card::Format.closed[homeview]
48
+ def view_in_closed_mode view
49
+ approved_view = Card::Format.closed[view]
59
50
  if approved_view == true
60
- homeview
61
- elsif Card::Format.error_code[homeview]
62
- homeview
51
+ view
52
+ elsif Card::Format.error_code[view]
53
+ view
63
54
  elsif approved_view
64
55
  approved_view
65
56
  elsif !card.known?
@@ -1,53 +1,68 @@
1
1
  class Card
2
2
  class Format
3
3
  module Permission
4
- def ok_view view, args={}
5
- return view if args.delete :skip_permissions
6
- approved_view = approved_view view, args
7
- args[:denied_view] = view if approved_view != view
8
- if focal? && (error_code = Card::Format.error_code[approved_view])
9
- root.error_status = error_code
10
- end
4
+ def ok_view view, skip_perms=false
5
+ return :too_deep if subformats_nested_too_deeply?
6
+ approved_view = check_view view, skip_perms
7
+ handle_view_denial view, approved_view
8
+ assign_view_error_status approved_view
9
+
11
10
  approved_view
12
11
  end
13
12
 
14
- def approved_view view, args={}
13
+ def handle_view_denial view, approved_view
14
+ return if approved_view == view
15
+ @denied_view = view
16
+ end
17
+
18
+ def assign_view_error_status view
19
+ return unless focal?
20
+ return unless (error_code = Card::Format.error_code[view])
21
+ root.error_status = error_code
22
+ end
23
+
24
+ def check_view view, skip_perms
15
25
  case
16
- when @depth >= Card.config.max_depth
17
- # prevent recursion. @depth tracks subformats
18
- :too_deep
19
- when Card::Format.perms[view] == :none
20
- # permission skipping specified in view definition
21
- view
22
- when args.delete(:skip_permissions)
23
- # permission skipping specified in args
24
- view
25
- when !card.known? && !tagged(view, :unknown_ok)
26
- # handle unknown cards (where view not exempt)
27
- view_for_unknown view, args
28
- else
29
- # run explicit permission checks
30
- permitted_view view, args
26
+ when skip_perms then view
27
+ when view_always_permitted?(view) then view
28
+ when unknown_disqualifies_view?(view) then view_for_unknown view
29
+ else permitted_view view # run explicit permission checks
31
30
  end
32
31
  end
33
32
 
34
- def permitted_view view, args
35
- perms_required = Card::Format.perms[view] || :read
36
- args[:denied_task] =
37
- if perms_required.is_a? Proc
38
- :read unless perms_required.call(self) # read isn't quite right
39
- else
40
- [perms_required].flatten.find { |task| !ok? task }
41
- end
42
-
43
- if args[:denied_task]
33
+ def unknown_disqualifies_view? view
34
+ # view can't handle unknown cards (and card is unknown)
35
+ return if tagged view, :unknown_ok
36
+ card.unknown?
37
+ end
38
+
39
+ def subformats_nested_too_deeply?
40
+ # prevent recursion
41
+ @depth >= Card.config.max_depth
42
+ end
43
+
44
+ def view_always_permitted? view
45
+ Card::Format.perms[view] == :none
46
+ end
47
+
48
+ def permitted_view view
49
+ if (@denied_task = task_denied_for_view view)
44
50
  Card::Format.denial[view] || :denial
45
51
  else
46
52
  view
47
53
  end
48
54
  end
49
55
 
50
- def view_for_unknown _view, _args
56
+ def task_denied_for_view view
57
+ perms_required = Card::Format.perms[view] || :read
58
+ if perms_required.is_a? Proc
59
+ :read unless perms_required.call(self) # read isn't quite right
60
+ else
61
+ [perms_required].flatten.find { |task| !ok? task }
62
+ end
63
+ end
64
+
65
+ def view_for_unknown _view
51
66
  # note: overridden in HTML
52
67
  focal? ? :not_found : :missing
53
68
  end
@@ -18,17 +18,19 @@ class Card
18
18
  match ? match[:format] : :base
19
19
  end
20
20
 
21
+ def interpret_view_opts view, opts
22
+ extract_class_vars view, opts
23
+ extract_view_tags view, opts.delete(:tags)
24
+ end
25
+
21
26
  def extract_class_vars view, opts
22
- return unless opts.present?
23
27
  [:perms, :error_code, :denial, :closed].each do |varname|
24
- class_var = send varname
25
- class_var[view] = opts.delete(varname) if opts[varname]
28
+ next unless (value = opts.delete varname)
29
+ send(varname)[view] = value
26
30
  end
27
- extract_view_tags view, opts
28
31
  end
29
32
 
30
- def extract_view_tags view, opts
31
- tags = opts.delete :tags
33
+ def extract_view_tags view, tags
32
34
  return unless tags
33
35
  Array.wrap(tags).each do |tag|
34
36
  view_tags[view] ||= {}
@@ -36,6 +38,10 @@ class Card
36
38
  end
37
39
  end
38
40
 
41
+ def view_cache_setting_method view
42
+ "view_#{view}_cache_setting"
43
+ end
44
+
39
45
  def new card, opts={}
40
46
  if self != Format
41
47
  super
@@ -3,110 +3,99 @@ class Card
3
3
  # View rendering methods.
4
4
  #
5
5
  module Render
6
- DEPRECATED_VIEWS = {
7
- view: :open, card: :open, line: :closed, bare: :core, naked: :core
8
- }.freeze
9
-
10
6
  def render view, args={}
11
- view = canonicalize_view view
12
- return if hidden_view? view, args
13
- view = ok_view view, args
14
- current_view(view) do
15
- args = default_render_args view, args
16
- with_nest_mode view do
17
- Card::Cache::ViewCache.fetch(self, view, args) do
18
- method = view_method view, args
19
- method.arity.zero? ? method.call : method.call(args)
20
- end
7
+ voo = View.new self, view, args, @voo
8
+ with_voo voo do
9
+ voo.process do |final_view, options|
10
+ final_render final_view, options
21
11
  end
22
12
  end
23
13
  rescue => e
24
14
  rescue_view e, view
25
15
  end
26
16
 
27
- def render_api match, opts
28
- view = match[3] ? match[4] : opts.shift
29
- args = opts[0] ? opts.shift.clone : {}
30
- optional_render_args(args, opts) if match[2]
31
- args[:skip_permissions] = true if match[1]
32
- render view, args
17
+ def with_voo voo
18
+ old_voo = @voo
19
+ @voo = voo
20
+ result = yield
21
+ @voo = old_voo
22
+ result
33
23
  end
34
24
 
35
- def optional_render_args args, opts
36
- args[:optional] = true
37
- args[:default_visibility] = opts.shift
25
+ def view_options_with_defaults view, options
26
+ default_method = "default_#{view}_args"
27
+ send default_method, options if respond_to? default_method
28
+ options
38
29
  end
39
30
 
40
- def view_method view, args
41
- method "_view_#{view}"
42
- rescue
43
- args[:unsupported_view] = view
44
- method "_view_unsupported_view"
31
+ def voo
32
+ @voo
45
33
  end
46
34
 
47
- def canonicalize_view view
48
- return if view.blank?
49
- view_key = view.to_viewname.key.to_sym
50
- DEPRECATED_VIEWS[view_key] || view_key
35
+ def show_view? view, default_viz=:show
36
+ voo.process_visibility_options # trigger viz processing
37
+ visibility = voo.viz_hash[view] || default_viz
38
+ visibility == :show
51
39
  end
52
40
 
53
- def default_item_view
54
- :name
41
+ def final_render view, args
42
+ current_view(view) do
43
+ with_nest_mode view do
44
+ method = view_method view
45
+ method.arity.zero? ? method.call : method.call(args)
46
+ end
47
+ end
55
48
  end
56
49
 
57
- def hidden_view? view, args
58
- args.delete(:optional) && !show_view?(view, args)
50
+ # setting (:alway, :never, :nested) designated in view definition
51
+ def view_cache_setting view
52
+ setting_method = self.class.view_cache_setting_method view
53
+ respond_to?(setting_method) ? send(setting_method) : :standard
59
54
  end
60
55
 
61
- def show_view? view, args
62
- code_config = args["optional_#{view}".to_sym]
63
- case code_config
64
- # permanent visibility specified in code
65
- when :always then true
66
- when :never then false
67
- else configured_visibility view, args, code_config
56
+ def stub_render cached_content
57
+ return cached_content unless cached_content.is_a? String
58
+ expand_stubs cached_content do |stub_hash|
59
+ prepare_stub_nest(stub_hash) do |stub_card, mode, options|
60
+ with_nest_mode(mode) { nest stub_card, options }
61
+ end
68
62
  end
69
63
  end
70
64
 
71
- def configured_visibility view, args, code_config
72
- card_config = nest_arg_visibility view, args
73
- case (card_config || code_config)
74
- when :show then true
75
- when :hide then false
76
- else
77
- default_viz = args.delete :default_visibility
78
- default_viz ? default_viz == :show : true
65
+ def prepare_stub_nest stub_hash
66
+ stub_card = Card.fetch_from_cast stub_hash[:cast]
67
+ stub_options = stub_hash[:options]
68
+ if stub_card.key.present? && stub_card.key == card.key
69
+ stub_options[:nest_name] ||= "_self"
79
70
  end
71
+ yield stub_card, stub_hash[:mode], stub_options
80
72
  end
81
73
 
82
- def nest_arg_visibility view, args
83
- [:show, :hide].each do |setting|
84
- return setting if parse_view_visibility(args[setting]).member?(view)
74
+ def expand_stubs cached_content
75
+ conto = Card::Content.new cached_content, self, chunk_list: :stub
76
+ conto.process_each_chunk do |stub_hash|
77
+ yield(stub_hash).to_s
85
78
  end
86
- false
79
+ conto.to_s
87
80
  end
88
81
 
89
- def parse_view_visibility val
90
- case val
91
- when NilClass then []
92
- when Array then val
93
- when String then val.split(/[\s,]+/)
94
- else raise Card::Error, "bad show/hide argument: #{val}"
95
- end.map { |view| canonicalize_view view }
82
+ def api_render match, opts
83
+ view = match[3] ? match[4] : opts.shift
84
+ args = opts[0] ? opts.shift.clone : {}
85
+ optional_render_args(args, opts) if match[2]
86
+ args[:skip_perms] = true if match[1]
87
+ render view, args
96
88
  end
97
89
 
98
- def default_render_args view, a=nil
99
- args =
100
- case a
101
- when nil then {}
102
- when Hash then a.clone
103
- when Array then a[0].merge a[1]
104
- else raise Card::Error, "bad render args: #{a}"
105
- end
90
+ def optional_render_args args, opts
91
+ args[:optional] = opts.shift || :show
92
+ end
106
93
 
107
- default_method = "default_#{view}_args"
108
- send default_method, args if respond_to?(default_method)
109
- args
94
+ def view_method view
95
+ method "_view_#{view}"
96
+ rescue
97
+ voo.unsupported_view = view
98
+ method "_view_unsupported_view"
110
99
  end
111
100
 
112
101
  def current_view view