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
@@ -29,11 +29,11 @@ module RenameMethods
29
29
  end
30
30
  end
31
31
 
32
- describe Card::Set::All::TrackedAttributes do
32
+ describe Card::Set::All::AssignAttributes do
33
33
  include RenameMethods
34
34
 
35
35
  describe "set_name" do
36
- it "should handle case variants" do
36
+ it "handles case variants" do
37
37
  @c = Card.create! name: "chump"
38
38
  expect(@c.name).to eq("chump")
39
39
  @c.name = "Chump"
@@ -41,7 +41,7 @@ describe Card::Set::All::TrackedAttributes do
41
41
  expect(@c.name).to eq("Chump")
42
42
  end
43
43
 
44
- it "should handle changing from plus card to simple" do
44
+ it "handles changing from plus card to simple" do
45
45
  c = Card.create! name: "four+five"
46
46
  c.name = "nine"
47
47
  c.save!
@@ -144,7 +144,7 @@ describe Card::Set::All::TrackedAttributes do
144
144
  @t = card "T"
145
145
  @t.name = "A+B"
146
146
  assert !@t.save, "save should fail"
147
- assert @t.errors[:name], "should have errors on key"
147
+ assert @t.errors[:name], "has errors on key"
148
148
  end
149
149
 
150
150
  it "test_used_as_tag" do
@@ -209,7 +209,7 @@ describe Card::Set::All::TrackedAttributes do
209
209
  end
210
210
  end
211
211
 
212
- it "should handle plus cards that have children" do
212
+ it "handles plus cards that have children" do
213
213
  Card::Auth.as_bot do
214
214
  Card.create name: "a+b+c+d"
215
215
  ab = Card["a+b"]
@@ -259,7 +259,7 @@ describe Card::Set::All::TrackedAttributes do
259
259
  assert_equal "[[/new/{{_self|name}}|new]]", Card["Buttah"].content
260
260
  end
261
261
 
262
- it "should rename card without updating references" do
262
+ it "renames card without updating references" do
263
263
  c = Card["Dairy"]
264
264
  c.update_attributes name: "Newt", update_referers: false
265
265
  assert_equal "[[/new/{{_self|name}}|new]]", Card["Newt"].content
@@ -9,19 +9,19 @@ describe Card::Set::All::Type do
9
9
  @hat = Card.new type: "Hat"
10
10
  end
11
11
 
12
- it "should have a type_name" do
12
+ it "has a type_name" do
13
13
  expect(@hat.type_name).to eq("Hat")
14
14
  end
15
15
 
16
- it "should not have a type_code" do
16
+ it "does not have a type_code" do
17
17
  expect(@hat.type_code).to eq(nil)
18
18
  end
19
19
 
20
- it "should have a type_id" do
20
+ it "has a type_id" do
21
21
  expect(@hat.type_id).to eq(@type.id)
22
22
  end
23
23
 
24
- it "should have a type_card" do
24
+ it "has a type_card" do
25
25
  expect(@hat.type_card).to eq(@type)
26
26
  end
27
27
  end
@@ -36,7 +36,7 @@ describe Card::Set::All::Type do
36
36
  end
37
37
  end
38
38
 
39
- it "should clear cache of structured nested card after saving" do
39
+ it "clears cache of structured nested card after saving" do
40
40
  pending "need new mechanism to replace #reset_type_specific_fields"
41
41
  Card::Auth.as_bot do
42
42
  expect(Card.fetch("t1+results", new: {}).type_name).to eq("Basic")
@@ -2,7 +2,7 @@
2
2
 
3
3
  # describe Card::Set::All::EventViz do
4
4
  # describe '#events' do
5
- # it "should have at least twenty events" do
5
+ # it "has at least twenty events" do
6
6
  # expect(Card['A'].events( :update ).split("\n").length).to be > 20
7
7
  # end
8
8
  # end
@@ -2,7 +2,7 @@
2
2
 
3
3
  describe Card::Set::Right::Debug do
4
4
  context "core view" do
5
- it "should have a table" do
5
+ it "has a table" do
6
6
  Card::Auth.as_bot do
7
7
  @core = render_card :core, name: "A+*debug"
8
8
  assert_view_select @core, "table"
@@ -1,4 +1,4 @@
1
1
  format :email_html do
2
- view :missing do |_args| "" end
3
- view :closed_missing do |_args| "" end
2
+ view(:missing) { "" }
3
+ view(:closed_missing) { "" }
4
4
  end
@@ -76,14 +76,17 @@ event :only_notify_on_web_requests, :initialize,
76
76
  @silent_change = true
77
77
  end
78
78
 
79
-
80
79
  def notable_change?
81
80
  !silent_change? && current_act_card? &&
82
81
  Card::Auth.current_id != WagnBotID && followable?
83
82
  end
84
83
 
85
84
  def current_act_card?
86
- current_act && current_act.card_id == id
85
+ return false unless current_act
86
+ current_act.card_id.nil? || current_act.card_id == id
87
+ # FIXME: currently card_id is nil for deleted acts (at least
88
+ # in the store phase when it's tested). This nil test was needed
89
+ # to make this work.
87
90
  end
88
91
 
89
92
  event :notify_followers_after_save, :integrate_with_delay,
@@ -95,10 +98,12 @@ end
95
98
  # but we can't pass the follower_stash through the ActiveJob queue.
96
99
  # We have to deal with the notifications in the integrate phase instead of the
97
100
  # integrate_with_delay phase
98
- event :stash_followers, :store, on: :delete do
101
+ event :stash_followers, :store,
102
+ on: :delete, when: proc { |ca| ca.notable_change? } do
99
103
  act_card.follower_stash ||= FollowerStash.new
100
104
  act_card.follower_stash.add_affected_card self
101
105
  end
106
+
102
107
  event :notify_followers_after_delete, :integrate,
103
108
  on: :delete, when: proc { |ca| ca.notable_change? } do
104
109
  notify_followers
@@ -10,15 +10,15 @@ format do
10
10
  end
11
11
 
12
12
  format :html do
13
- view :pointer_items do |args|
13
+ def pointer_items args
14
14
  card.item_names(context: :raw).map do |iname|
15
15
  wrap_item iname, args
16
- end.join ", "
16
+ end
17
17
  end
18
18
  end
19
19
 
20
20
  format :email_text do
21
- view :email_addresses do |args|
21
+ view :email_addresses, cache: :never do |args|
22
22
  context = args[:context] || self
23
23
  card.item_names(context: context.cardname).map do |item_name|
24
24
  # note that context is processed twice here because pointers absolutize
@@ -17,7 +17,7 @@ format :html do
17
17
  args[:condition] ||= Env.params[:condition] || "*always"
18
18
  end
19
19
 
20
- view :follow_item, tags: :unknown_ok do |args|
20
+ view :follow_item, tags: :unknown_ok, cache: :never do |args|
21
21
  if card.new_card? || !card.include_item?(args[:condition])
22
22
  button_view = :add_follow_rule_button
23
23
  form_opts = { add_item: args[:condition] }
@@ -65,10 +65,10 @@ format :html do
65
65
  class: "btn update-follow-link", "data-card_key" => key
66
66
  end
67
67
 
68
- view :follow_status_delete_options do
68
+ view :follow_status_delete_options, cache: :never do
69
69
  wrap_with(:ul, class: "delete-list list-group") do
70
70
  card.item_names.map do |option|
71
- content_tag :li, class: "list-group-item" do
71
+ wrap_with :li, class: "list-group-item" do
72
72
  condition = option == "*never" ? "*always" : option
73
73
  subformat(card).render_follow_item condition: condition
74
74
  end
@@ -76,7 +76,7 @@ format :html do
76
76
  end
77
77
  end
78
78
 
79
- view :delete_follow_rule_button do |_args|
79
+ view :delete_follow_rule_button do
80
80
  button_tag(
81
81
  type: :submit,
82
82
  class: "btn-xs btn-item-delete btn-primary", "aria-label" => "Left Align"
@@ -85,7 +85,7 @@ format :html do
85
85
  end
86
86
  end
87
87
 
88
- view :add_follow_rule_button do |_args|
88
+ view :add_follow_rule_button do
89
89
  button_tag(
90
90
  type: :submit,
91
91
  class: "btn-xs btn-item-add", "aria-label" => "Left Align"
@@ -10,7 +10,7 @@ format :html do
10
10
  else
11
11
  fname = "#{card.cardname.left}+#{Card[:followers].name}"
12
12
  fcard = Card.fetch fname
13
- nest fcard, view: :titled, item: :link
13
+ nest fcard, view: :titled, items: { view: :link }
14
14
  end
15
15
  end
16
16
 
@@ -30,18 +30,37 @@ event :update_follow_rules, :finalize,
30
30
  end
31
31
 
32
32
  format :html do
33
- view :edit, perms: :update, tags: :unknown_ok do |args|
34
- frame_and_form :update, args do
33
+ view :edit, perms: :update, tags: :unknown_ok do
34
+ frame_and_form :update do
35
35
  [
36
- _optional_render(:content_formgroup, args),
37
- _optional_render(:confirm_update_all, args),
38
- _optional_render(:button_formgroup, args)
36
+ _optional_render_content_formgroup,
37
+ _optional_render_confirm_update_all,
38
+ _optional_render_edit_buttons
39
39
  ]
40
40
  end
41
41
  end
42
42
 
43
+ view :edit_buttons do
44
+ button_formgroup do
45
+ [submit_and_update_button, simple_submit_button, cancel_to_edit_button]
46
+ end
47
+ end
48
+
49
+ def submit_and_update_button
50
+ submit_button text: "Submit and update all users",
51
+ disable_with: "Updating", class: "follow-updater"
52
+ end
53
+
54
+ def simple_submit_button
55
+ button_tag "Submit", class: "follow"
56
+ end
57
+
58
+ def cancel_to_edit_button
59
+ cancel_button href: path(view: :edit, id: card.id)
60
+ end
61
+
43
62
  view :confirm_update_all do |args|
44
- wrap args do
63
+ wrap do
45
64
  alert "info" do
46
65
  %(
47
66
  <h1>Are you sure you want to change the default follow rules?</h1>
@@ -54,15 +73,7 @@ format :html do
54
73
 
55
74
  def default_edit_args args
56
75
  args[:hidden] ||= {}
57
- args[:hidden].reverse_merge!(
58
- success: "_self",
59
- card: { update_all_users: false }
60
- )
61
- args[:buttons] = %(
62
- #{submit_button text: 'Submit and update all users',
63
- disable_with: 'Updating', class: 'follow-updater'}
64
- #{button_tag 'Submit', class: 'follow'}
65
- #{cancel_button href: path(view: :edit, id: card.id)}
66
- )
76
+ args[:hidden].reverse_merge!(success: "_self",
77
+ card: { update_all_users: false })
67
78
  end
68
79
  end
@@ -79,7 +79,7 @@ def email_config args={}
79
79
  end
80
80
 
81
81
  format do
82
- view :mail, perms: :none do |args|
82
+ view :mail, perms: :none, cache: :never do |args|
83
83
  args = card.email_config(args)
84
84
  text_message = args.delete(:text_message)
85
85
  html_message = args.delete(:html_message)
@@ -105,7 +105,7 @@ format :html do
105
105
  res
106
106
  end
107
107
 
108
- view :following_list do |_args|
108
+ view :following_list, cache: :never do |_args|
109
109
  if !Auth.signed_in? || Auth.current_id != card.left.id
110
110
  hide_buttons = [:delete_follow_rule_button, :add_follow_rule_button]
111
111
  end
@@ -116,7 +116,7 @@ format :html do
116
116
  Card.set_patterns.select { |p| sets[p] }.reverse.map do |set_pattern|
117
117
  sets[set_pattern].map do |rule|
118
118
  rule[:options].map do |option|
119
- content_tag :li, class: "list-group-item" do
119
+ wrap_with :li, class: "list-group-item" do
120
120
  subformat(rule[:card]).render_follow_item condition: option,
121
121
  hide: hide_buttons
122
122
  end
@@ -127,7 +127,7 @@ format :html do
127
127
  end
128
128
  end
129
129
 
130
- view :ignoring_list do |_args|
130
+ view :ignoring_list, cache: :never do |_args|
131
131
  ignore_list = []
132
132
  card.known_item_cards.each do |follow_rule|
133
133
  follow_rule.item_cards.each do |follow_option|
@@ -141,7 +141,7 @@ format :html do
141
141
  wrap_with :div, class: "pointer-list-editor" do
142
142
  wrap_with :ul, class: "delete-list list-group" do
143
143
  ignore_list.map do |rule_card|
144
- content_tag :li, class: "list-group-item" do
144
+ wrap_with :li, class: "list-group-item" do
145
145
  subformat(rule_card).render_follow_item condition: never,
146
146
  hide: hide_buttons
147
147
  end
@@ -150,17 +150,18 @@ format :html do
150
150
  end
151
151
  end
152
152
 
153
- view :pointer_items, tags: :unknown_ok do |args|
154
- super(args.merge(item: :link))
153
+ def pointer_items args
154
+ voo.items[:view] ||= :link
155
+ super(args)
155
156
  end
156
157
 
157
158
  view :errors, perms: :none do |args|
158
159
  if card.errors.any?
159
160
  if card.errors.find { |attrib, _msg| attrib == :permission_denied }
160
161
  Env.save_interrupted_action(request.env["REQUEST_URI"])
161
- title = "Problems with #{card.name}"
162
- frame args.merge(panel_class: "panel panel-warning",
163
- title: title, hide: "menu") do
162
+ voo.title = "Problems with #{card.name}"
163
+ class_up "card-frame", "panel panel-warning"
164
+ frame do
164
165
  "Please #{link_to_card :signin, 'sign in'}" # " #{to_task}"
165
166
  end
166
167
  else
@@ -88,6 +88,10 @@ class Card
88
88
  action_on(card_id) || actions.first
89
89
  end
90
90
 
91
+ def draft?
92
+ main_action.draft
93
+ end
94
+
91
95
  # time (in words) since act took place
92
96
  # @return [String]
93
97
  def elapsed_time
@@ -0,0 +1,194 @@
1
+ #require_dependency File.expand_path("../../action/action_renderer", __FILE__)
2
+
3
+ class Card
4
+ class Act
5
+ class ActRenderer
6
+ def initialize format, act, args
7
+ @format = format
8
+ @act = act
9
+ @args = args
10
+ @card = @format.card
11
+ @context = @args[:act_context]
12
+ end
13
+
14
+ include ::Bootstrapper
15
+
16
+ def method_missing(method_name, *args, &block)
17
+ if block_given?
18
+ @format.send(method_name, *args, &block)
19
+ else
20
+ @format.send(method_name, *args)
21
+ end
22
+ end
23
+
24
+ def respond_to_missing? method_name, _include_private=false
25
+ @format.respond_to? method_name
26
+ end
27
+
28
+ def render
29
+ act_accordion
30
+ end
31
+
32
+ def header
33
+ #::Bootstrap.new(self).render do
34
+ #::Boo.bs do
35
+ bs_layout do
36
+ row 10, 2 do
37
+ column do
38
+ html title
39
+ tag(:span, "text-muted") { summary }
40
+ end
41
+ column act_links, class: "text-right"
42
+ end
43
+ row 12 do
44
+ column subtitle
45
+ end
46
+ end
47
+ #end
48
+ end
49
+
50
+ def absolute_title
51
+ accordion_expand_link(@act.card.name)
52
+ end
53
+
54
+ def details
55
+ approved_actions[0..20].map do |action|
56
+ Action::ActionRenderer.new(@format, action, action_header?,
57
+ :summary).render
58
+ end.join
59
+ end
60
+
61
+ def summary
62
+ [:create, :update, :delete, :draft].map do |type|
63
+ next unless count_types[type] > 0
64
+ "#{@format.action_icon type} #{count_types[type]}"
65
+ end.compact.join " | "
66
+ end
67
+
68
+ def act_links
69
+ [
70
+ link_to_history,
71
+ (link_to_act_card unless @act.card.trash)
72
+ ].compact.join " "
73
+ end
74
+
75
+ def link_to_act_card
76
+ link_to_card @act.card, glyphicon("new-window")
77
+ end
78
+
79
+ def link_to_history
80
+ link_to_card @act.card, glyphicon("time"), path: { view: :history,
81
+ look_in_trash: true }
82
+ end
83
+
84
+ def approved_actions
85
+ @approved_actions ||= actions.select { |a| a.card && a.card.ok?(:read) }
86
+ # FIXME: should not need to test for presence of card here.
87
+ end
88
+
89
+ def action_header?
90
+ true
91
+ # @action_header ||= approved_actions.size != 1 ||
92
+ # approved_actions[0].card_id != @format.card.id
93
+ end
94
+
95
+ def count_types
96
+ @count_types ||=
97
+ approved_actions.each_with_object(
98
+ Hash.new { |h, k| h[k] = 0 }
99
+ ) do |action, type_cnt|
100
+ type_cnt[action.action_type] += 1
101
+ end
102
+ end
103
+
104
+ def edited_ago
105
+ "#{time_ago_in_words(@act.acted_at)} ago"
106
+ end
107
+
108
+ def collapse_id
109
+ "act-id-#{@act.id}"
110
+ end
111
+
112
+ def accordion_expand_link text
113
+ <<-HTML
114
+ <a>
115
+ #{text}
116
+ </a>
117
+ HTML
118
+ end
119
+
120
+ # TODO: change accordion API in bootstrap/helper.rb so that it can be used
121
+ # here. The problem is that here we have extra links in the title
122
+ # that are not supposed to expand the accordion
123
+ def act_accordion
124
+ context = @act.main_action.draft ? :warning : :default
125
+ <<-HTML
126
+ <div class="panel panel-#{context}">
127
+ #{act_accordion_panel}
128
+ </div>
129
+ HTML
130
+ end
131
+
132
+ def accordion_expand_options
133
+ {
134
+ "data-toggle" => "collapse",
135
+ "data-parent" => "#accordion-#{collapse_id}",
136
+ "data-target" => ".#{collapse_id}",
137
+ "aria-expanded" => true,
138
+ "aria-controls" => collapse_id
139
+ }
140
+ end
141
+
142
+ def act_panel_options
143
+ { class: "panel-heading", role: "tab", id: "heading-#{collapse_id}" }
144
+ end
145
+
146
+ def act_accordion_panel
147
+ act_accordion_heading + act_accordion_body
148
+ end
149
+
150
+ def act_accordion_heading
151
+ wrap_with :div, act_panel_options.merge(accordion_expand_options) do
152
+ wrap_with :h4, header, class: "panel-title"
153
+ end
154
+ end
155
+
156
+ def act_accordion_body
157
+ wrap_with :div, id: collapse_id,
158
+ class: "panel-collapse collapse #{collapse_id}" do
159
+ wrap_with :div, details, class: "panel-body"
160
+ end
161
+ end
162
+
163
+ def rollback_link
164
+ return unless card.ok? :update
165
+ return unless (prior = previous_action)
166
+ wrap_with :div, class: "act-link collapse #{collapse_id}" do
167
+ link_to "Save as current",
168
+ class: "slotter", remote: true,
169
+ method: :post, rel: "nofollow",
170
+ "data-slot-selector" => ".card-slot.history-view",
171
+ path: { action: :update, action_ids: prior,
172
+ view: :open, look_in_trash: true }
173
+ end
174
+ end
175
+
176
+ def previous_action
177
+ # TODO: optimize
178
+ actions.select { |action| action.card.last_action_id != action.id }
179
+ end
180
+
181
+ def show_or_hide_changes_link
182
+ wrap_with :div, class: "act-link" do
183
+ @format.link_to_view(
184
+ :act, "#{@args[:hide_diff] ? 'Show' : 'Hide'} changes",
185
+ class: "slotter",
186
+ path: { act_id: @args[:act].id, act_seq: @args[:act_seq],
187
+ hide_diff: !@args[:hide_diff], action_view: :expanded,
188
+ act_context: @args[:act_context], look_in_trash: true }
189
+ )
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end