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