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
@@ -0,0 +1,81 @@
1
+ format do
2
+ def limit
3
+ default_limit
4
+ end
5
+
6
+ def offset
7
+ search_params[:offset] || 0
8
+ end
9
+ end
10
+
11
+ format :html do
12
+ def with_paging path_args={}
13
+ paging_path_args path_args
14
+ output [yield, _optional_render_paging]
15
+ end
16
+
17
+ view :paging, cache: :never do
18
+ return "" unless paging_needed?
19
+ <<-HTML
20
+ <nav>
21
+ <ul class="pagination paging">
22
+ #{paging_links.join}
23
+ </ul>
24
+ </nav>
25
+ HTML
26
+ end
27
+
28
+ def paging_links
29
+ total_pages = ((count_with_params - 1) / limit).to_i
30
+ current_page = (offset / limit).to_i
31
+ PagingLinks.new(total_pages, current_page)
32
+ .build do |text, page, status, options|
33
+ page_link_li text, page, status, options
34
+ end
35
+ end
36
+
37
+ # First page is 0 (not 1)
38
+ def page_link_li text, page, status, options={}
39
+ wrap_with :li, class: status do
40
+ page_link text, page, options
41
+ end
42
+ end
43
+
44
+ def page_link text, page, options
45
+ return text unless page
46
+ paging_path_args[:offset] = page * limit
47
+ options.merge! class: "card-paging-link slotter",
48
+ remote: true,
49
+ path: paging_path_args
50
+ link_to raw(text), options
51
+ end
52
+
53
+ def paging_path_args local_args={}
54
+ @paging_path_args ||= {
55
+ limit: limit,
56
+ view: voo.home_view,
57
+ slot: voo.slot_options
58
+ }.merge(extra_paging_path_args).merge local_args
59
+ end
60
+
61
+ def paging_view
62
+ (voo && voo.home_view) || :content
63
+ end
64
+
65
+ def extra_paging_path_args
66
+ {}
67
+ end
68
+
69
+ def paging_needed?
70
+ return false if limit < 1
71
+ return false if fewer_results_than_limit? # avoid extra count search
72
+ # count search result instead
73
+ limit < count_with_params
74
+ end
75
+
76
+ # clear we don't need paging even before running count query
77
+ def fewer_results_than_limit?
78
+ return false unless offset.zero?
79
+ limit > offset + search_with_params.length
80
+ end
81
+ end
@@ -0,0 +1,90 @@
1
+ #! no set module
2
+
3
+ # render paging links
4
+ class PagingLinks
5
+ def initialize total_pages, current_page
6
+ @total = total_pages
7
+ @current = current_page
8
+ end
9
+
10
+ # @param window [integer] number of page links shown left and right
11
+ # of the current page
12
+ # @example: current page = 5, window = 2
13
+ # |<<|1|...|3|4|[5]|6|7|...|10|>>|
14
+ # @yield [text, page, status, options] block to build single paging link
15
+ # @yieldparam status [Symbol] :active (for current page) or :disabled
16
+ # @yieldparam page [Integer] page number, first page is 0
17
+ # @return [Array<String>]
18
+ def build window=2, &block
19
+ @render_item = block
20
+ links window
21
+ end
22
+
23
+ private
24
+
25
+ def links window
26
+ @window_start = [@current - window, 0].max
27
+ @window_end = [@current + window, @total].min
28
+ left_part + window_part + right_part
29
+ end
30
+
31
+ # the links around the current page
32
+ def window_part
33
+ (@window_start..@window_end).map do |page|
34
+ direct_page_link page
35
+ end.compact
36
+ end
37
+
38
+ def left_part
39
+ [
40
+ previous_page_link,
41
+ (direct_page_link 0 if @window_start > 0),
42
+ (ellipse if @window_start > 1)
43
+ ].compact
44
+ end
45
+
46
+ def right_part
47
+ [
48
+ (ellipse if @total > @window_end + 1),
49
+ (direct_page_link @total if @total > @window_end),
50
+ next_page_link
51
+ ].compact
52
+ end
53
+
54
+ def previous_page_link
55
+ paging_item '<span aria-hidden="true">&laquo;</span>', previous_page,
56
+ "aria-label" => "Previous"
57
+ end
58
+
59
+ def next_page_link
60
+ paging_item '<span aria-hidden="true">&raquo;</span>', next_page,
61
+ "aria-label" => "Next"
62
+ end
63
+
64
+ def direct_page_link page
65
+ return unless page >= 0 && page <= @total
66
+ paging_item page + 1, page
67
+ end
68
+
69
+ def ellipse
70
+ @render_item.call "<span>...</span>", false
71
+ end
72
+
73
+ def paging_item text, page, options={}
74
+ status =
75
+ if page == @current
76
+ :active
77
+ elsif !page
78
+ :disabled
79
+ end
80
+ @render_item.call text, page, status, options
81
+ end
82
+
83
+ def previous_page
84
+ @current > 0 ? @current - 1 : false
85
+ end
86
+
87
+ def next_page
88
+ @current < @total ? @current + 1 : false
89
+ end
90
+ end
@@ -0,0 +1,67 @@
1
+ include_set Abstract::Search
2
+
3
+ def search args={}
4
+ query = fetch_query(args)
5
+ # forces explicit limiting
6
+ # can be 0 or less to force no limit
7
+ raise "OH NO.. no limit" unless query.mods[:limit]
8
+ query.run
9
+ end
10
+
11
+ # override this to define search
12
+ def wql_hash
13
+ @wql_hash ||= begin
14
+ query = raw_content
15
+ query = query.is_a?(Hash) ? query : parse_json_query(query)
16
+ query.symbolize_keys
17
+ end
18
+ end
19
+
20
+ def query args={}
21
+ query_args = wql_hash.merge! args
22
+ query_args = standardized_query_args query_args
23
+ Query.new query_args, name
24
+ end
25
+
26
+ def fetch_query args={}
27
+ @query ||= {}
28
+ @query[args.to_s] ||= query(args.clone) # cache query
29
+ end
30
+
31
+ def standardized_query_args args
32
+ args = args.symbolize_keys
33
+ args[:context] ||= cardname
34
+ args
35
+ end
36
+
37
+ def parse_json_query query
38
+ empty_query_error! if query.empty?
39
+ JSON.parse query
40
+ rescue
41
+ raise Error::BadQuery, "Invalid JSON search query: #{query}"
42
+ end
43
+
44
+ def empty_query_error!
45
+ raise Error::BadQuery,
46
+ "Error in card '#{name}':can't run search with empty content"
47
+ end
48
+
49
+ format do
50
+ def default_search_params
51
+ @default_search_params ||= { limit: (card_content_limit || default_limit) }
52
+ end
53
+
54
+ def card_content_limit
55
+ card.wql_hash[:limit]
56
+ rescue
57
+ nil
58
+ end
59
+
60
+ def query_with_params
61
+ @query_with_params ||= card.fetch_query search_params
62
+ end
63
+
64
+ def limit
65
+ query_with_params.limit
66
+ end
67
+ end
@@ -9,8 +9,8 @@ format do
9
9
  ""
10
10
  end
11
11
 
12
- view :unsupported_view, perms: :none, tags: :unknown_ok do |args|
13
- "view (#{args[:unsupported_view]}) not supported for #{error_cardname}"
12
+ view :unsupported_view, perms: :none, tags: :unknown_ok do
13
+ "view (#{voo.unsupported_view}) not supported for #{error_cardname}"
14
14
  end
15
15
 
16
16
  view :missing, perms: :none do
@@ -48,31 +48,31 @@ format do
48
48
  end
49
49
 
50
50
  format :html do
51
- def view_for_unknown view, args
51
+ def view_for_unknown view
52
52
  case
53
- when focal? && ok?(:create) then :new
54
- when commentable?(view, args) then view
53
+ when focal? && ok?(:create) then :new
54
+ when commentable?(view) then view
55
55
  else super
56
56
  end
57
57
  end
58
58
 
59
- def commentable? view, args
60
- return false unless self.class.tagged view, :comment
61
- visibility_args = args.merge default_visibility: :hide
62
- return false unless show_view? :comment_box, visibility_args
59
+ def commentable? view
60
+ return false unless self.class.tagged(view, :comment) &&
61
+ show_view?(:comment_box, :hide)
63
62
  ok? :comment
64
63
  end
65
64
 
66
65
  def rendering_error exception, view
66
+ debug_error exception if Auth.always_ok?
67
67
  details = Auth.always_ok? ? backtrace_link(exception) : error_cardname
68
- content_tag :span, class: "render-error alert alert-danger" do
68
+ wrap_with :span, class: "render-error alert alert-danger" do
69
69
  ["error rendering", details, "(#{view} view)"].join "\n"
70
70
  end
71
71
  end
72
72
 
73
73
  def backtrace_link exception
74
- alert_class = "render-error-message errors-view admin-error-message"
75
- warning = alert("warning", dismissible: true, alert_class: alert_class) do
74
+ class_up "alert", "render-error-message errors-view admin-error-message"
75
+ warning = alert("warning", true) do
76
76
  %{
77
77
  <h3>Error message (visible to admin only)</h3>
78
78
  <p><strong>#{exception.message}</strong></p>
@@ -83,39 +83,38 @@ format :html do
83
83
  link + warning
84
84
  end
85
85
 
86
- view :unsupported_view, perms: :none, tags: :unknown_ok do |args|
86
+ view :unsupported_view, perms: :none, tags: :unknown_ok do
87
87
  %(
88
88
  <strong>
89
- view <em>#{args[:unsupported_view]}</em>
89
+ view <em>#{voo.unsupported_view}</em>
90
90
  not supported for <em>#{error_cardname}</em>
91
91
  </strong>
92
92
  )
93
93
  end
94
94
 
95
- view :message, perms: :none, tags: :unknown_ok do |args|
96
- frame args do
97
- params[:message]
98
- end
95
+ view :message, perms: :none, tags: :unknown_ok do
96
+ frame { params[:message] }
99
97
  end
100
98
 
101
- view :missing do |args|
99
+ view :missing do
102
100
  return "" unless card.ok? :create # should this be moved into ok_view?
103
- path_opts = args[:type] ? { card: { type: args[:type] } } : {}
104
- link_text = "Add #{fancy_title args[:title]}"
105
- klass = "slotter missing-#{args[:denied_view] || args[:home_view]}"
106
- wrap(args) { link_to_view :new, link_text, path: path_opts, class: klass }
101
+ path_opts = voo.type ? { card: { type: voo.type } } : {}
102
+ link_text = "Add #{fancy_title _render_title}"
103
+ klass = "slotter missing-#{@denied_view || voo.home_view}"
104
+ wrap { link_to_view :new, link_text, path: path_opts, class: klass }
107
105
  end
108
106
 
109
107
  view :closed_missing, perms: :none do
110
- %(<span class="faint"> #{showname} </span>)
108
+ wrap_with :span, showname, class: "faint"
111
109
  end
112
110
 
113
- view :conflict, error_code: 409 do |args|
111
+ view :conflict, error_code: 409 do
114
112
  actor_link = link_to_card card.last_action.act.actor.cardname
115
- expanded_act = wrap(args) do
113
+ expanded_act = wrap do
116
114
  _render_act_expanded act: card.last_action.act, current_rev_nr: 0
117
115
  end
118
- wrap args.merge(slot_class: "error-view") do # ENGLISH below
116
+ class_up "card-slot", "error-view"
117
+ wrap do # ENGLISH below
119
118
  alert "warning" do
120
119
  %(
121
120
  <strong>Conflict!</strong>
@@ -128,72 +127,80 @@ format :html do
128
127
  end
129
128
  end
130
129
 
131
- view :errors, perms: :none do |args|
132
- if card.errors.any?
133
- title = "Problems"
134
- title += " with #{card.name}" unless card.name.blank?
135
- frame_opts = { panel_class: "panel panel-warning",
136
- title: title, hide: "menu" }
137
- frame args.merge(frame_opts) do
138
- card.errors.map do |attrib, msg|
139
- unless attrib == :abort
140
- msg = "<strong>#{attrib.to_s.upcase}:</strong> #{msg}"
141
- end
142
- alert "warning", dismissible: true, alert_class: "card-error-msg" do
143
- msg
144
- end
130
+ view :errors, perms: :none do
131
+ return if card.errors.empty?
132
+ voo.title = card.name.blank? ? "Problems" : "Problems with #{card.name}"
133
+ voo.hide! :menu
134
+ class_up "card-frame", "panel panel-warning"
135
+ class_up "alert", "card-error-msg"
136
+ frame do
137
+ card.errors.map do |attrib, msg|
138
+ alert "warning", true do
139
+ attrib == :abort ? msg : standard_error_message(attrib, msg)
145
140
  end
146
141
  end
147
142
  end
148
143
  end
149
144
 
150
- view :not_found do |args| # ug. bad name.
151
- sign_in_or_up_links =
152
- unless Auth.signed_in?
153
- signin_link = link_to_card :signin, "Sign in"
154
- signup_link = link_to "Sign up", path: { action: :new, mark: :signup }
155
- %(<div>#{signin_link} or #{signup_link} to create it.</div>)
156
- end
157
- frame args.merge(title: "Not Found", optional_menu: :never) do
158
- card_label = card.name.present? ? "<em>#{card.name}</em>" : "that"
159
- %(<h2>Could not find #{card_label}.</h2> #{sign_in_or_up_links})
145
+ def standard_error_message attribute, message
146
+ "<strong>#{attribute.to_s.upcase}:</strong> #{message}"
147
+ end
148
+
149
+ view :not_found do # ug. bad name.
150
+ voo.hide! :menu
151
+ voo.title = "Not Found"
152
+ card_label = card.name.present? ? "<em>#{card.name}</em>" : "that"
153
+ frame do
154
+ [wrap_with(:h2) { "Could not find #{card_label}." },
155
+ sign_in_or_up_links]
156
+ end
157
+ end
158
+
159
+ def sign_in_or_up_links
160
+ return if Auth.signed_in?
161
+ signin_link = link_to_card :signin, "Sign in"
162
+ signup_link = link_to "Sign up", path: { action: :new, mark: :signup }
163
+ wrap_with(:div) { "#{signin_link} or #{signup_link} to create it." }
164
+ end
165
+
166
+ view :denial do
167
+ focal? ? loud_denial : quiet_denial
168
+ end
169
+
170
+ def quiet_denial
171
+ wrap_with :span, class: "denied" do
172
+ "<!-- Sorry, you don't have permission (#{@denied_task}) -->"
160
173
  end
161
174
  end
162
175
 
163
- view :denial do |args|
164
- task = args[:denied_task]
165
- to_task = task ? "to #{task} this." : "to do that."
166
- if !focal?
167
- %(
168
- <span class="denied">
169
- <!-- Sorry, you don't have permission #{to_task} -->
170
- </span>
171
- )
176
+ def loud_denial
177
+ frame do
178
+ [
179
+ wrap_with(:h1, "Sorry!"),
180
+ wrap_with(:div, loud_denial_message)
181
+ ]
182
+ end
183
+ end
184
+
185
+ def loud_denial_message
186
+ to_task = @denied_task ? "to #{@denied_task} this." : "to do that."
187
+ case
188
+ when @denied_task != :read && Card.config.read_only
189
+ "We are currently in read-only mode. Please try again later."
190
+ when Auth.signed_in?
191
+ "You need permission #{to_task}"
172
192
  else
173
- frame args do # ENGLISH below
174
- message =
175
- case
176
- when task != :read && Card.config.read_only
177
- "We are currently in read-only mode. Please try again later."
178
- when Auth.signed_in?
179
- "You need permission #{to_task}"
180
- else
181
- signin_link = link_to_card :signin, "sign in"
182
- or_signup_link =
183
- if Card.new(type_id: Card::SignupID).ok? :create
184
- "or " +
185
- link_to("sign up", path: { action: "new", mark: :signup })
186
- end
187
- Env.save_interrupted_action(request.env["REQUEST_URI"])
188
- "Please #{signin_link} #{or_signup_link} #{to_task}"
189
- end
193
+ denial_message_with_links to_task
194
+ end
195
+ end
190
196
 
191
- %(
192
- <h1>Sorry!</h1>
193
- <div>#{message}</div>
194
- )
195
- end
197
+ def denial_message_with_links to_task
198
+ linx = [link_to_card(:signin, "sign in")]
199
+ if Card.new(type_id: Card::SignupID).ok?(:create)
200
+ linx += ["or", link_to("sign up", path: { action: "new", mark: :signup })]
196
201
  end
202
+ Env.save_interrupted_action request.env["REQUEST_URI"]
203
+ "Please #{linx.join ' '} #{to_task}"
197
204
  end
198
205
 
199
206
  view :server_error do