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,41 +1,41 @@
1
1
  include_set Abstract::ProsemirrorEditor
2
2
 
3
3
  format :html do
4
- def edit_slot args={}
5
- # note: @mode should already be :edit here...
6
- if args[:structure] || card.structure ||
7
- args[:edit_fields]
8
- multi_card_edit_slot args
9
- else
10
- single_card_edit_slot args
11
- end
4
+ def edit_slot
5
+ multi_edit? ? multi_card_edit_slot : single_card_edit_slot
12
6
  end
13
7
 
14
- def multi_card_edit_slot args
15
- if args[:core_edit] # need better name
16
- _render_core args
17
- elsif args[:edit_fields]
18
- process_edit_fields args[:edit_fields]
19
- else
20
- process_nested_fields optional_toolbar: :hide,
21
- structure: args[:structure]
22
- end
8
+ def multi_edit?
9
+ inline_nests_editor? || nests_editor? || # editor configured in voo
10
+ voo.structure || voo.edit_structure || # structure configured in voo
11
+ card.structure # structure in card rule
12
+ end
13
+
14
+ def multi_card_edit_slot
15
+ inline_nests_editor? ? _render_core : process_nested_fields
16
+ end
17
+
18
+ def inline_nests_editor?
19
+ voo.editor == :inline_nests
20
+ end
21
+
22
+ def nests_editor?
23
+ voo.editor == :nests
23
24
  end
24
25
 
25
- def single_card_edit_slot args
26
- field = content_field form, args
27
- if [args[:optional_type_formgroup], args[:optional_name_formgroup]]
28
- .member? :show
26
+ def single_card_edit_slot
27
+ if voo.show?(:type_formgroup) || voo.show?(:name_formgroup)
29
28
  # display content field in formgroup for consistency with other fields
30
- formgroup "", field, editor: :content
29
+ formgroup("", editor: :content) { content_field }
31
30
  else
32
- editor_wrap(:content) { field }
31
+ editor_wrap(:content) { content_field }
33
32
  end
34
33
  end
35
34
 
36
- def process_nested_fields args
37
- nested_fields(args).map do |chunk|
38
- nest chunk.options.reverse_merge(args)
35
+ def process_nested_fields
36
+ nested_fields_for_edit.map do |name, options|
37
+ options[:hide] = :toolbar
38
+ nest name, options
39
39
  end.join "\n"
40
40
  end
41
41
 
@@ -63,71 +63,64 @@ format :html do
63
63
 
64
64
  def card_form action, opts={}
65
65
  @form_root = true
66
- hidden_args = opts.delete :hidden
67
- form_for card, card_form_opts(action, opts) do |form|
66
+ url, action = card_form_url action
67
+ html_opts = card_form_html_opts action, opts
68
+ form_for card, url: url, html: html_opts, remote: true do |form|
68
69
  @form = form
69
- %(
70
- #{hidden_tags hidden_args if hidden_args}
71
- #{yield form}
72
- )
70
+ output yield(form)
73
71
  end
74
72
  end
75
73
 
76
74
  def form_root_format
77
- if @form_root
78
- self
79
- elsif !@parent
80
- nil
81
- else
82
- @parent.form_root_format
75
+ if @form_root then self
76
+ elsif !@parent then nil
77
+ else @parent.form_root_format
83
78
  end
84
79
  end
85
80
 
86
- def card_form_opts action, html={}
87
- url, action = url_from_action(action)
88
-
89
- klasses = Array.wrap(html[:class])
90
- klasses << "card-form slotter"
81
+ def card_form_html_opts action, opts={}
82
+ klasses = Array.wrap(opts[:class]) << "card-form slotter"
91
83
  klasses << "autosave" if action == :update
92
- html[:class] = klasses.join " "
84
+ opts[:class] = klasses.join " "
93
85
 
94
- html[:recaptcha] ||= "on" if card.recaptcha_on?
95
- html.delete :recaptcha if html[:recaptcha] == :off
96
-
97
- { url: url, remote: true, html: html }
86
+ opts[:recaptcha] ||= "on" if card.recaptcha_on?
87
+ opts.delete :recaptcha if opts[:recaptcha] == :off
88
+ opts
98
89
  end
99
90
 
100
- def url_from_action action
91
+ def card_form_url action
101
92
  case action
102
- when Symbol
103
- [path(action: action), action]
104
- when Hash
105
- [path(action), action[:action]]
106
- when String # deprecated
107
- [card_path(action), nil]
93
+ when Symbol then [path(action: action), action]
94
+ when Hash then [path(action), action[:action]]
95
+ # for when non-action path args are required
108
96
  else
109
- raise Card::Error, "unsupported card_form action class: #{action.class}"
97
+ raise Card::Error, "unsupported #card_form_url action: #{action}"
110
98
  end
111
99
  end
112
100
 
113
101
  def editor_wrap type=nil
114
102
  html_class = "editor"
115
103
  html_class << " #{type}-editor" if type
116
- content_tag(:div, class: html_class) { yield.html_safe }
104
+ wrap_with :div, class: html_class do
105
+ yield
106
+ end
117
107
  end
118
108
 
119
- def formgroup title, content, opts={}
109
+ def formgroup title, opts={}, &block
110
+ label = formgroup_label opts[:editor], title
111
+ editor_body = editor_wrap opts[:editor], &block
112
+ help_text = formgroup_help_text opts[:help]
120
113
  wrap_with :div, formgroup_div_args(opts[:class]) do
121
- %(
122
- #{form.label(opts[:editor] || :content, title)}
123
- <div>
124
- #{editor_wrap(opts[:editor]) { content }}
125
- #{formgroup_help_text opts[:help]}
126
- </div>
127
- )
114
+ "#{label}<div>#{editor_body} #{help_text}</div>"
128
115
  end
129
116
  end
130
117
 
118
+ def formgroup_label editor_type, title
119
+ return if voo && voo.hide?(:title)
120
+ label_type = editor_type || :content
121
+ form.label label_type, title
122
+ end
123
+
131
124
  def formgroup_div_args html_class
132
125
  div_args = { class: ["form-group", html_class].compact.join(" ") }
133
126
  div_args[:card_id] = card.id if card.real?
@@ -136,10 +129,9 @@ format :html do
136
129
  end
137
130
 
138
131
  def formgroup_help_text text=nil
139
- case text
140
- when String then _render_help help_class: "help-block", help_text: text
141
- when true then _render_help help_class: "help-block"
142
- end
132
+ class_up "help-text", "help-block"
133
+ voo.help = text if voo && text.to_s != "true"
134
+ _optional_render_help
143
135
  end
144
136
 
145
137
  def hidden_tags hash, base=nil
@@ -160,46 +152,49 @@ format :html do
160
152
 
161
153
  # FIELDSET VIEWS
162
154
 
163
- view :name_formgroup do |args|
164
- formgroup "name", raw(name_field(form)),
165
- editor: "name", help: args[:help]
155
+ view :name_formgroup do
156
+ formgroup "name", editor: "name" do
157
+ raw name_field
158
+ end
159
+ end
160
+
161
+ def wrap_type_formgroup
162
+ formgroup "type", editor: "type", class: "type-formgroup" do
163
+ yield
164
+ end
166
165
  end
167
166
 
168
- view :type_formgroup do |args|
169
- field = if args[:variety] == :edit # FIXME: dislike this api -ef
170
- type_field class: "type-field edit-type-field"
171
- else
172
- type_field class: "type-field live-type-field",
173
- href: path(view: :new), "data-remote" => true
174
- end
175
- formgroup "type", field, editor: "type", class: "type-formgroup"
167
+ view :type_formgroup do
168
+ wrap_type_formgroup do
169
+ type_field class: "type-field edit-type-field"
170
+ end
176
171
  end
177
172
 
178
- view :button_formgroup do |args|
179
- %(<div class="form-group"><div>#{args[:buttons]}</div></div>)
173
+ def button_formgroup
174
+ wrap_with :div, class: "form-group" do
175
+ wrap_with :div, yield
176
+ end
180
177
  end
181
178
 
182
- view :content_formgroup do |args|
183
- raw %(
184
- <fieldset class="card-editor editor">
185
- #{edit_slot args}
186
- </fieldset>
187
- )
179
+ view :content_formgroup, cache: :never do
180
+ wrap_with :fieldset, edit_slot, class: classy("card-editor", "editor")
188
181
  end
189
182
 
190
- def name_field form=nil, options={}
191
- form ||= self.form
192
- text_field(:name, {
193
- # needed because otherwise gets wrong value if there are updates
194
- value: card.name,
195
- autocomplete: "off"
196
- }.merge(options))
183
+ def name_field
184
+ # value needed because otherwise gets wrong value if there are updates
185
+ text_field :name, value: card.name, autocomplete: "off"
197
186
  end
198
187
 
199
188
  def type_field args={}
200
189
  typelist = Auth.createable_types
201
- current_type =
202
- unless args.delete :no_current_type
190
+ current_type = type_field_current_value args, typelist
191
+ options = options_from_collection_for_select typelist, :to_s, :to_s,
192
+ current_type
193
+ template.select_tag "card[type]", options, args
194
+ end
195
+
196
+ def type_field_current_value args, typelist
197
+ return if args.delete :no_current_type
203
198
  if !card.new_card? && !typelist.include?(card.type_name)
204
199
  # current type should be an option on existing cards,
205
200
  # regardless of create perms
@@ -208,38 +203,30 @@ format :html do
208
203
  card.type_name_or_default
209
204
  end
210
205
 
211
- options = options_from_collection_for_select typelist, :to_s, :to_s,
212
- current_type
213
- template.select_tag "card[type]", options, args
206
+ def content_field skip_rev_id=false
207
+ [content_field_revision_tracking(skip_rev_id), _render_editor].compact.join
214
208
  end
215
209
 
216
- def content_field form, options={}
217
- @form = form
218
- @nested = options[:nested]
210
+ def content_field_revision_tracking skip_rev_id
219
211
  card.last_action_id_before_edit = card.last_action_id
220
- revision_tracking =
221
- if card && !card.new_card? && !options[:skip_rev_id]
212
+ return if !card || card.new_card? || skip_rev_id
222
213
  hidden_field :last_action_id_before_edit, class: "current_revision_id"
223
- # hidden_field_tag 'card[last_action_id_before_edit]',
224
- # card.last_action_id, class: 'current_revision_id'
225
- end
226
- %(
227
- #{revision_tracking}
228
- #{_render_editor options}
229
- )
230
214
  end
231
215
 
232
216
  # FIELD VIEWS
233
217
 
234
- view :edit_in_form, perms: :update, tags: :unknown_ok do |args|
235
- eform = form_for_multi
236
- content = content_field eform, args.merge(nested: true)
237
- content += raw("\n #{eform.hidden_field :type_id}") if card.new_card?
238
- opts = { editor: "content", help: true, class: "card-editor" }
239
- if card.cardname.junction?
240
- opts[:class] += " RIGHT-#{card.cardname.tag_name.safe_key}"
218
+ view :edit_in_form, cache: :never, perms: :update, tags: :unknown_ok do
219
+ @form = form_for_multi
220
+ add_junction_class
221
+ formgroup fancy_title(voo.title),
222
+ editor: "content", help: true, class: classy("card-editor") do
223
+ [content_field, (form.hidden_field(:type_id) if card.new_card?)]
241
224
  end
242
- formgroup fancy_title(args[:title]), content, opts
225
+ end
226
+
227
+ def add_junction_class
228
+ return unless card.cardname.junction?
229
+ class_up "card-editor", "RIGHT-#{card.cardname.tag_name.safe_key}"
243
230
  end
244
231
 
245
232
  # form helpers
@@ -267,25 +254,18 @@ format :html do
267
254
  end
268
255
 
269
256
  def submit_button args={}
270
- args.reverse_merge!(
271
- situation: "primary",
272
- data: {}
273
- )
274
257
  text = args.delete(:text) || "Submit"
258
+ args.reverse_merge! situation: "primary", data: {}
275
259
  args[:data][:disable_with] ||= args.delete(:disable_with) || "Submitting"
276
260
  button_tag text, args
277
261
  end
278
262
 
279
263
  # redirect to *previous if no :href is given
280
264
  def cancel_button args={}
281
- args.reverse_merge! type: "button"
282
- if args[:href]
283
- add_class args, "slotter"
284
- else
285
- add_class args, "redirecter"
286
- args[:href] = Card.path_setting("/*previous")
287
- end
288
265
  text = args.delete(:text) || "Cancel"
266
+ args[:type] ||= "button"
267
+ add_class args, (args[:href] ? "slotter" : "redirecter")
268
+ args[:href] ||= Card.path_setting("/*previous")
289
269
  button_tag text, args
290
270
  end
291
271
  end
@@ -1,62 +1,80 @@
1
1
  format :html do
2
- view :header do |args|
3
- %(
4
- <div class="card-header #{args[:header_class]}">
5
- <div class="card-header-title #{args[:title_class]}">
6
- #{_optional_render :toggle, args, :hide}
7
- #{_optional_render :title, args}
8
- </div>
9
- #{_optional_render :type_info, args, :hide}
10
- </div>
11
- #{_optional_render :toolbar, args, :hide}
12
- )
2
+ # TODO: find these a better home.
3
+ def class_up klass, classier, force=false
4
+ key = klass.to_s
5
+ return if !force && class_list[key]
6
+ class_list[key] = classier.to_s
13
7
  end
14
8
 
15
- def default_header_args args
16
- args[:optional_toolbar] ||= :show if @slot_view == :open && toolbar_pinned?
17
- if show_view?(:toolbar, args.merge(default_visibility: :hide)) &&
18
- card.type_code != :basic
19
- args[:optional_type_info] ||= :show
20
- end
9
+ def class_list
10
+ @class_list ||= {}
11
+ end
12
+
13
+ def classy *classes
14
+ classes = Array.wrap(classes).flatten
15
+ [classes, class_list[classes.first]].flatten.compact.join " "
21
16
  end
22
17
 
23
- view :subheader do |args|
24
- args[:subheader] ||= toolbar_view_title(@slot_view) || _render_title(args)
25
- %(
26
- <div class="card-subheader navbar-inverse btn-primary active">
27
- #{args[:subheader]}
28
- #{autosaved_draft_link if card.drafts.present? && @slot_view == :edit}
29
- </div>
30
- )
18
+ view :header do
19
+ voo.hide :toggle, :toolbar
20
+ main_header + _optional_render_toolbar
31
21
  end
32
22
 
33
- view :toggle do |args|
34
- verb, adjective, direction =
35
- if args[:toggle_mode] == :close
36
- %w(open open expand)
37
- else
38
- %w(close closed collapse-down)
23
+ def main_header
24
+ wrap_with :div, class: classy("card-header") do
25
+ wrap_with :div, class: classy("card-header-title") do
26
+ header_title_elements
39
27
  end
28
+ end
29
+ end
30
+
31
+ def header_title_elements
32
+ [_optional_render_toggle, _optional_render_title]
33
+ end
40
34
 
35
+ view :subheader do
36
+ wrap_with :div, class: "card-subheader navbar-inverse btn-primary active" do
37
+ [
38
+ _render_title,
39
+ (autosaved_draft_link(class: "pull-right") if show_draft_link?)
40
+ ]
41
+ end
42
+ # toolbar_view_title(@slot_view) || _render_title(args)
43
+ end
44
+
45
+ def show_draft_link?
46
+ card.drafts.present? && @slot_view == :edit
47
+ end
48
+
49
+ view :toggle do
50
+ verb, adjective, direction = toggle_verb_adjective_direction
41
51
  link_to_view adjective, glyphicon(direction),
42
52
  title: "#{verb} #{card.name}",
43
53
  class: "#{verb}-icon toggler slotter nodblclick"
44
54
  end
45
55
 
46
- view :link_list do |args|
47
- content_tag :ul, class: args[:class] do
48
- item_links(args).map do |al|
49
- content_tag :li, raw(al)
56
+ def toggle_verb_adjective_direction
57
+ if @toggle_mode == :close
58
+ %w(open open expand)
59
+ else
60
+ %w(close closed collapse-down)
61
+ end
62
+ end
63
+
64
+ def nav_link_list side
65
+ wrap_with :ul, class: "nav navbar-nav navbar-#{side}" do
66
+ item_links.map do |link|
67
+ wrap_with(:li) { link }
50
68
  end.join "\n"
51
69
  end
52
70
  end
53
71
 
54
- view :navbar_right do |args|
55
- render_link_list args.merge(class: "nav navbar-nav navbar-right")
72
+ view :navbar_right do
73
+ nav_link_list :right
56
74
  end
57
75
 
58
- view :navbar_left do |args|
59
- render_link_list args.merge(class: "nav navbar-nav navbar-left")
76
+ view :navbar_left do
77
+ nav_link_list :left
60
78
  end
61
79
 
62
80
  def show_follow?