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