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
@@ -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?