card 1.19.6 → 1.20.0

Sign up to get free protection for your applications and to get access to all the features.
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