card 1.99.2 → 1.100.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (655) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/VERSION +1 -1
  4. data/config/initializers/01_core_extensions/module.rb +0 -45
  5. data/config/initializers/01_core_extensions/object.rb +0 -4
  6. data/config/initializers/core_extensions.rb +8 -14
  7. data/db/migrate/20200718051236_compound_names_do_not_store_name_and_key.rb +7 -0
  8. data/db/migrate/20200805200729_add_unique_pair_indeces.rb +9 -0
  9. data/db/migrate_core_cards/20140629222005_add_email_cards.rb +1 -1
  10. data/db/migrate_core_cards/20180712042655_head_rule.rb +1 -1
  11. data/db/migrate_core_cards/20180905061537_migrate_layouts.rb +1 -0
  12. data/db/schema.rb +12 -13
  13. data/db/seed/new/card_actions.yml +768 -768
  14. data/db/seed/new/card_acts.yml +2 -2
  15. data/db/seed/new/cards.yml +2547 -2547
  16. data/db/seed/new/schema_migrations.yml +4 -0
  17. data/db/seed/test/fixtures/card_actions.yml +1709 -1709
  18. data/db/seed/test/fixtures/card_acts.yml +499 -499
  19. data/db/seed/test/fixtures/card_changes.yml +157 -97
  20. data/db/seed/test/fixtures/card_references.yml +1475 -1475
  21. data/db/seed/test/fixtures/cards.yml +4047 -4047
  22. data/db/seed/test/fixtures/schema_migrations.yml +4 -0
  23. data/db/seeds.rb +1 -0
  24. data/db/test_seed.rb +1 -1
  25. data/db/version.txt +1 -1
  26. data/lib/card.rb +25 -57
  27. data/lib/card/auth/current.rb +1 -3
  28. data/lib/card/auth/permissions.rb +6 -10
  29. data/lib/card/cache/prepopulate.rb +9 -6
  30. data/lib/card/codename.rb +16 -13
  31. data/lib/card/content.rb +10 -4
  32. data/lib/card/content/chunk.rb +1 -0
  33. data/lib/card/content/clean.rb +26 -20
  34. data/lib/card/director.rb +231 -0
  35. data/lib/card/director/act_direction.rb +111 -0
  36. data/lib/card/director/card_methods.rb +45 -0
  37. data/lib/card/{act_manager → director}/event_delay.rb +13 -15
  38. data/lib/card/director/phases.rb +55 -0
  39. data/lib/card/director/run.rb +107 -0
  40. data/lib/card/director/stages.rb +85 -0
  41. data/lib/card/director/store.rb +73 -0
  42. data/lib/card/{act_manager → director}/subdirector_array.rb +21 -15
  43. data/lib/card/dirty.rb +37 -2
  44. data/lib/card/env.rb +17 -53
  45. data/lib/card/env/location.rb +16 -2
  46. data/lib/card/env/request_assignments.rb +24 -0
  47. data/lib/card/env/serialization.rb +24 -0
  48. data/lib/card/env/slot_options.rb +30 -0
  49. data/lib/card/env/success.rb +1 -1
  50. data/lib/card/format.rb +5 -1
  51. data/lib/card/format/content.rb +2 -1
  52. data/lib/card/format/error.rb +7 -4
  53. data/lib/card/format/nesting.rb +1 -1
  54. data/lib/card/lexicon.rb +90 -0
  55. data/lib/card/mod.rb +1 -1
  56. data/lib/card/mod/load_strategy/set_tmp_files.rb +1 -1
  57. data/lib/card/mod/loader/set_loader.rb +2 -1
  58. data/lib/card/mod/loader/set_pattern_loader.rb +5 -1
  59. data/lib/card/mod/module_template.rb +2 -2
  60. data/lib/card/model/save_helper.rb +5 -1
  61. data/lib/card/name.rb +8 -3
  62. data/lib/card/query.rb +5 -6
  63. data/lib/card/query/abstract_query.rb +1 -1
  64. data/lib/card/query/card_query/match_attributes.rb +12 -59
  65. data/lib/card/query/card_query/normalization.rb +4 -4
  66. data/lib/card/query/card_query/run.rb +14 -7
  67. data/lib/card/query/card_query/sorting.rb +1 -1
  68. data/lib/card/query/sql_statement.rb +13 -14
  69. data/lib/card/query/value.rb +44 -23
  70. data/lib/card/query/value/match_value.rb +65 -0
  71. data/lib/card/set.rb +1 -1
  72. data/lib/card/set/event.rb +69 -24
  73. data/lib/card/set/event/delayed_event.rb +50 -10
  74. data/lib/card/set/event/options.rb +4 -7
  75. data/lib/card/set/pattern/base.rb +18 -0
  76. data/lib/card/set/trait.rb +2 -6
  77. data/lib/card/subcards.rb +11 -8
  78. data/lib/card/subcards/add.rb +12 -11
  79. data/lib/card/subcards/remove.rb +1 -1
  80. data/lib/card/view.rb +2 -2
  81. data/lib/card/view/cache.rb +3 -3
  82. data/lib/card/view/cache/cache_action.rb +2 -5
  83. data/lib/card/view/cache/stub.rb +7 -1
  84. data/lib/card/view/classy.rb +9 -9
  85. data/lib/card/view/options/voo_api.rb +0 -8
  86. data/lib/cardio.rb +2 -2
  87. data/mod/account/set/abstract/account_field.rb +6 -4
  88. data/mod/account/set/all/account.rb +15 -11
  89. data/mod/account/set/right/account.rb +1 -1
  90. data/mod/account/set/right/email.rb +1 -1
  91. data/mod/account/set/self/signin.rb +1 -1
  92. data/mod/account/set/type/signup.rb +2 -1
  93. data/mod/account/set/type/signup/views.rb +1 -1
  94. data/mod/account/spec/set/right/account_spec.rb +2 -2
  95. data/mod/account/spec/set/type/signup_spec.rb +1 -1
  96. data/mod/admin/set/self/admin.rb +1 -1
  97. data/mod/admin/set/self/admin_info.rb +26 -44
  98. data/mod/basic_formats/set/all/all_csv.rb +2 -6
  99. data/mod/basic_formats/set/all/base.rb +0 -1
  100. data/mod/basic_formats/set/all/head.rb +4 -2
  101. data/mod/basic_formats/set/all/json.rb +1 -1
  102. data/mod/basic_formats/set/all/rss.rb +1 -1
  103. data/mod/basic_formats/set/self/head.rb +1 -1
  104. data/mod/bootstrap/lib/card/lazy_tab.rb +37 -0
  105. data/mod/bootstrap/lib/card/tab.rb +76 -0
  106. data/mod/bootstrap/set/all/bootstrap/dropdown.rb +0 -1
  107. data/mod/bootstrap/set/all/bootstrap/tabs.rb +33 -124
  108. data/mod/bootstrap/set/all/bootstrap/tabs/tab_panel.haml +7 -0
  109. data/mod/carrierwave/set/abstract/attachment.rb +1 -1
  110. data/mod/carrierwave/set/abstract/attachment/cloud.rb +133 -0
  111. data/mod/carrierwave/set/abstract/attachment/coded.rb +22 -0
  112. data/mod/carrierwave/set/abstract/attachment/local.rb +40 -0
  113. data/mod/carrierwave/set/abstract/attachment/storage_type.rb +18 -186
  114. data/mod/carrierwave/set/abstract/attachment/upload_cache.rb +1 -1
  115. data/mod/carrierwave/set/abstract/attachment/web.rb +3 -0
  116. data/mod/carrierwave/set/type/file.rb +12 -11
  117. data/mod/carrierwave/set/type/image.rb +0 -2
  118. data/mod/carrierwave/spec/lib/carrier_wave/file_card_uploader_spec.rb +1 -15
  119. data/mod/carrierwave/spec/set/abstract/attachment/cloud_spec.rb +109 -0
  120. data/mod/carrierwave/spec/set/abstract/attachment/coded_spec.rb +111 -0
  121. data/mod/carrierwave/spec/set/abstract/attachment/web_spec.rb +41 -0
  122. data/mod/carrierwave/spec/set/type/file_spec.rb +11 -349
  123. data/mod/core/chunk/{literal.rb → escaped_literal.rb} +1 -1
  124. data/mod/core/chunk/keep_escaped_literal.rb +26 -0
  125. data/mod/core/chunk/uri.rb +2 -2
  126. data/mod/core/format/html_format.rb +4 -0
  127. data/mod/core/lib/card/fetch.rb +54 -0
  128. data/mod/core/lib/card/fetch/results.rb +125 -0
  129. data/mod/core/lib/card/fetch/retrieve.rb +56 -0
  130. data/mod/core/lib/card/fetch/store.rb +66 -0
  131. data/mod/core/lib/card/rule.rb +227 -0
  132. data/mod/core/set/abstract/code_file.rb +6 -6
  133. data/mod/core/set/abstract/haml_file.rb +4 -0
  134. data/mod/core/set/all/actify.rb +21 -20
  135. data/mod/core/set/all/active_card.rb +0 -28
  136. data/mod/core/set/all/assign_attributes.rb +29 -25
  137. data/mod/core/set/all/cache.rb +21 -28
  138. data/mod/core/set/all/chunk.rb +73 -78
  139. data/mod/core/set/all/codename.rb +2 -1
  140. data/mod/core/set/all/content.rb +5 -2
  141. data/mod/core/set/all/event_conditions.rb +65 -52
  142. data/mod/core/set/all/fetch.rb +10 -42
  143. data/mod/core/set/all/fetch_helper.rb +2 -125
  144. data/mod/core/set/all/initialize.rb +12 -8
  145. data/mod/core/set/all/location_history.rb +1 -1
  146. data/mod/core/set/all/name.rb +92 -90
  147. data/mod/core/set/all/name_events.rb +59 -35
  148. data/mod/core/set/all/pattern.rb +12 -17
  149. data/mod/core/set/all/permissions.rb +37 -46
  150. data/mod/core/set/all/references.rb +25 -32
  151. data/mod/core/set/all/rename.rb +18 -25
  152. data/mod/core/set/all/rules.rb +9 -234
  153. data/mod/core/set/all/states.rb +1 -1
  154. data/mod/core/set/all/subcards.rb +6 -23
  155. data/mod/core/set/all/tabs.rb +4 -3
  156. data/mod/core/set/all/templating.rb +3 -3
  157. data/mod/core/set/all/trash.rb +8 -7
  158. data/mod/core/set/all/type.rb +4 -4
  159. data/mod/core/set/all/update_read_rules.rb +2 -2
  160. data/mod/core/set_pattern/08_type_plus_right.rb +1 -2
  161. data/mod/core/spec/chunk/{literal_spec.rb → escaped_literal_spec.rb} +1 -1
  162. data/mod/core/spec/chunk/keep_escaped_literal_spec.rb +21 -0
  163. data/mod/core/spec/chunk/query_reference_spec.rb +2 -2
  164. data/mod/core/spec/chunk/uri_spec.rb +7 -7
  165. data/mod/core/spec/set/all/actify_spec.rb +7 -199
  166. data/mod/core/spec/set/all/chunk_spec.rb +1 -0
  167. data/mod/core/spec/set/all/event_conditions_spec.rb +6 -4
  168. data/mod/core/spec/set/all/fetch_helper_spec.rb +25 -8
  169. data/mod/core/spec/set/all/name_events_spec.rb +1 -1
  170. data/mod/core/spec/set/all/name_spec.rb +5 -16
  171. data/mod/core/spec/set/all/pattern_spec.rb +1 -1
  172. data/mod/core/spec/set/all/permissions_spec.rb +14 -6
  173. data/mod/core/spec/set/all/references_spec.rb +9 -0
  174. data/mod/core/spec/set/all/rename_spec.rb +13 -3
  175. data/mod/core/spec/set/all/rules_spec.rb +1 -1
  176. data/mod/core/spec/set/all/subcards_spec.rb +106 -0
  177. data/mod/core/spec/set/all/trash_spec.rb +24 -20
  178. data/mod/developer/set/all/event_viz.rb +1 -2
  179. data/mod/developer/set/right/debug.rb +13 -14
  180. data/mod/edit/set/all/bridge.rb +7 -7
  181. data/mod/edit/set/all/bridge/tab_visibility.rb +2 -2
  182. data/mod/edit/set/all/edit_name.rb +5 -37
  183. data/mod/edit/set/all/form.rb +3 -3
  184. data/mod/edit/set/all/form_buttons.rb +1 -1
  185. data/mod/edit/spec/set/all/form_spec.rb +1 -1
  186. data/mod/email/set/type/email_template/email_config.rb +1 -1
  187. data/mod/follow/set/all/follow/followed_by.rb +1 -2
  188. data/mod/follow/set/all/follow/follower_ids.rb +16 -4
  189. data/mod/follow/set/all/notify.rb +4 -7
  190. data/mod/follow/set/right/following.rb +1 -1
  191. data/mod/follow/set/self/edited.rb +1 -1
  192. data/mod/follow/set/type_plus_right/user/follow.rb +4 -7
  193. data/mod/follow/spec/set/all/notify_spec.rb +2 -2
  194. data/mod/google_analytics/set/all/google_analytics.rb +1 -1
  195. data/mod/history/lib/card/act.rb +1 -1
  196. data/mod/history/lib/card/act/act_renderer/relative_act_renderer.rb +3 -2
  197. data/mod/history/lib/card/change.rb +1 -1
  198. data/mod/history/set/all/history.rb +39 -6
  199. data/mod/history/set/all/history/act_listing.rb +1 -1
  200. data/mod/history/set/all/history/acts.rb +0 -4
  201. data/mod/history/set/all/history/events.rb +6 -5
  202. data/mod/history/set/all/history/last.rb +2 -2
  203. data/mod/history/set/all/history/revision.rb +1 -0
  204. data/mod/history/spec/set/all/history/revision_spec.rb +7 -3
  205. data/mod/machines/file/all_script_machine_output/file.js +69 -38415
  206. data/mod/machines/file/all_style_machine_output/file.css +4 -4
  207. data/mod/machines/file/script_html5shiv_printshiv_machine_output/file.js +1 -1
  208. data/mod/machines/lib/javascript/decko/bridge.js.coffee +3 -0
  209. data/mod/machines/lib/javascript/decko/filter_items.js.coffee +4 -4
  210. data/mod/machines/lib/javascript/decko/navbox.js.coffee +1 -0
  211. data/mod/machines/lib/javascript/decko/nest_editor_name.js.coffee +1 -1
  212. data/mod/machines/lib/javascript/decko/selectable_filtered_content.js.coffee +12 -0
  213. data/mod/machines/lib/javascript/decko/slotter.js.coffee +16 -3
  214. data/mod/machines/lib/stylesheets/style_cards.scss +1 -1
  215. data/mod/machines/lib/stylesheets/style_jquery_ui_smoothness.css +13 -13
  216. data/mod/machines/set/abstract/machine.rb +2 -2
  217. data/mod/machines/set/abstract/machine/output_cache.rb +1 -1
  218. data/mod/machines/set/abstract/machine/output_update.rb +15 -6
  219. data/mod/machines/set/all/reset_machines.rb +2 -2
  220. data/mod/machines/set/self/script_decko.rb +1 -1
  221. data/mod/machines/spec/set/type/coffeescript_spec.rb +19 -19
  222. data/mod/navbar/set/right/enabled_roles.rb +1 -1
  223. data/mod/navbar/set/self/account_links.rb +2 -2
  224. data/mod/navbar/set/self/navbox.rb +24 -20
  225. data/mod/pointer/lib/javascript/script_pointer_list_editor.js.coffee +7 -0
  226. data/mod/pointer/set/abstract/00_paging_params.rb +1 -3
  227. data/mod/pointer/set/abstract/02_pointer/events.rb +2 -1
  228. data/mod/pointer/set/abstract/02_pointer/html_views/filter.rb +1 -3
  229. data/mod/pointer/set/abstract/02_pointer/item_api.rb +7 -6
  230. data/mod/pointer/set/abstract/02_pointer/options_api.rb +1 -1
  231. data/mod/pointer/set/type/nest_list.rb +40 -0
  232. data/mod/pointer/set/type/nest_list/nest_list_input.haml +28 -0
  233. data/mod/pointer/spec/set/abstract/paging_params_spec.rb +1 -1
  234. data/mod/pointer/spec/set/abstract/pointer/html_views_spec.rb +3 -4
  235. data/mod/pointer/spec/set/type/mirror_list_spec.rb +6 -3
  236. data/mod/recaptcha/config/initializers/recaptcha.rb +54 -0
  237. data/mod/recaptcha/set/all/recaptcha.rb +1 -1
  238. data/mod/recaptcha/set/self/admin_info.rb +32 -0
  239. data/mod/{admin → recaptcha}/set/self/recaptcha_proxy.rb +0 -0
  240. data/mod/{admin → recaptcha}/set/self/recaptcha_secret_key.rb +0 -0
  241. data/mod/{admin → recaptcha}/set/self/recaptcha_settings.rb +0 -0
  242. data/mod/{admin → recaptcha}/set/self/recaptcha_site_key.rb +0 -0
  243. data/mod/rules/set/rule/editor.rb +2 -2
  244. data/mod/rules/set/rule/html_views.rb +1 -1
  245. data/mod/rules/set/rule/rules.rb +1 -2
  246. data/mod/rules/set/type/set.rb +1 -1
  247. data/mod/rules/spec/set/type/set_spec.rb +1 -1
  248. data/mod/search/lib/card/filter_query.rb +1 -2
  249. data/mod/search/set/abstract/00_filter_helper.rb +3 -5
  250. data/mod/search/set/abstract/02_search_params.rb +1 -1
  251. data/mod/search/set/abstract/03_filter.rb +2 -0
  252. data/mod/search/set/abstract/03_filter/filter_form.rb +1 -1
  253. data/mod/search/set/abstract/03_filter/form_helper.rb +4 -16
  254. data/mod/search/set/abstract/03_filter/selectable_filtered_content.haml +2 -0
  255. data/mod/search/set/self/search.rb +1 -1
  256. data/mod/search/template/abstract/search/checkbox_item.haml +2 -3
  257. data/mod/settings/set/abstract/permission.rb +2 -2
  258. data/mod/settings/set/right/read.rb +53 -43
  259. data/mod/settings/set/right/structure.rb +1 -1
  260. data/mod/settings/set/right/style.rb +1 -1
  261. data/mod/settings/set/type/setting.rb +5 -5
  262. data/mod/solid_cache/set/abstract/solid_cache.rb +1 -1
  263. data/mod/standard/set/all/comment.rb +1 -1
  264. data/mod/standard/set/all/list_changes.rb +2 -3
  265. data/mod/standard/set/all/path.rb +2 -1
  266. data/mod/standard/set/all/rich_html/content.rb +1 -1
  267. data/mod/standard/set/all/rich_html/error.rb +1 -1
  268. data/mod/standard/set/all/rich_html/menu.rb +1 -1
  269. data/mod/standard/set/all/rich_html/modal.rb +2 -2
  270. data/mod/standard/set/all/rich_html/show.rb +8 -0
  271. data/mod/standard/set/type/cardtype.rb +1 -3
  272. data/mod/standard/spec/set/all/history_spec.rb +20 -3
  273. data/mod/standard/spec/set/type/phrase_spec.rb +1 -1
  274. data/mod/tinymce_editor/public/assets/tinymce/skins/ui/oxide-dark/content.mobile.min.css +7 -0
  275. data/mod/tinymce_editor/public/assets/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff +0 -0
  276. data/mod/tinymce_editor/public/assets/tinymce/skins/ui/oxide-dark/skin.mobile.min.css +7 -0
  277. data/mod/tinymce_editor/set/all/reference_editor/nest_editor.rb +6 -8
  278. data/mod/tinymce_editor/set/all/reference_editor/nest_editor/nest_parser.rb +4 -2
  279. data/mod/tinymce_editor/set/all/reference_editor/nest_image.rb +1 -1
  280. data/mod/virtual/lib/card/virtual.rb +3 -3
  281. data/tmpsets/set/mod001-utility/abstract/bs_badge.rb +3 -2
  282. data/tmpsets/set/mod001-utility/abstract/filterable.rb +8 -11
  283. data/tmpsets/set/mod001-utility/abstract/filterable_bar.rb +20 -0
  284. data/tmpsets/set/mod002-admin/self/admin_info.rb +26 -77
  285. data/tmpsets/set/mod002-admin/self/debugger.rb +12 -0
  286. data/tmpsets/set/mod002-admin/self/trash.rb +1 -1
  287. data/tmpsets/set/mod002-admin/self/version.rb +2 -2
  288. data/tmpsets/set/mod003-core/abstract/code_file.rb +1 -1
  289. data/tmpsets/set/mod003-core/abstract/haml_file.rb +4 -0
  290. data/tmpsets/set/mod003-core/all/abort.rb +1 -0
  291. data/tmpsets/set/mod003-core/all/actify.rb +16 -2
  292. data/tmpsets/set/mod003-core/all/assign_attributes.rb +29 -25
  293. data/tmpsets/set/mod003-core/all/cache.rb +21 -28
  294. data/tmpsets/set/mod003-core/all/chunk.rb +73 -78
  295. data/tmpsets/set/mod003-core/all/codename.rb +3 -1
  296. data/tmpsets/set/mod003-core/all/content.rb +64 -2
  297. data/tmpsets/set/mod003-core/all/event_conditions.rb +76 -37
  298. data/tmpsets/set/mod003-core/all/fetch.rb +20 -48
  299. data/tmpsets/set/mod003-core/all/fetch_helper.rb +6 -124
  300. data/tmpsets/set/mod003-core/all/initialize.rb +46 -16
  301. data/tmpsets/set/mod003-core/all/item.rb +16 -6
  302. data/tmpsets/set/mod003-core/all/location_history.rb +1 -1
  303. data/tmpsets/set/mod003-core/all/name.rb +93 -85
  304. data/tmpsets/set/mod003-core/all/name_events.rb +61 -36
  305. data/tmpsets/set/mod003-core/all/pattern.rb +16 -17
  306. data/tmpsets/set/mod003-core/all/permissions.rb +51 -90
  307. data/tmpsets/set/mod003-core/all/phases.rb +0 -4
  308. data/tmpsets/set/mod003-core/all/references.rb +34 -35
  309. data/tmpsets/set/mod003-core/all/rename.rb +20 -25
  310. data/tmpsets/set/mod003-core/all/rules.rb +8 -238
  311. data/tmpsets/set/mod003-core/all/states.rb +5 -3
  312. data/tmpsets/set/mod003-core/all/subcards.rb +27 -4
  313. data/tmpsets/set/mod003-core/all/tabs.rb +4 -3
  314. data/tmpsets/set/mod003-core/all/templating.rb +3 -3
  315. data/tmpsets/set/mod003-core/all/trash.rb +6 -6
  316. data/tmpsets/set/mod003-core/all/type.rb +5 -5
  317. data/tmpsets/set/mod003-core/all/update_read_rules.rb +2 -20
  318. data/tmpsets/set/mod004-virtual/abstract/virtual_cache.rb +1 -1
  319. data/tmpsets/set/mod005-history/all/history.rb +40 -7
  320. data/tmpsets/set/mod005-history/all/history/act_listing.rb +1 -1
  321. data/tmpsets/set/mod005-history/all/history/acts.rb +1 -5
  322. data/tmpsets/set/mod005-history/all/history/events.rb +1 -0
  323. data/tmpsets/set/mod005-history/all/history/last.rb +2 -2
  324. data/tmpsets/set/mod005-history/all/history/revision.rb +1 -0
  325. data/tmpsets/set/mod005-history/all/history_bridge.rb +4 -4
  326. data/tmpsets/set/mod006-basic_formats/all/all_css.rb +1 -1
  327. data/tmpsets/set/mod006-basic_formats/all/all_csv.rb +3 -7
  328. data/tmpsets/set/mod006-basic_formats/all/base.rb +19 -61
  329. data/tmpsets/set/mod006-basic_formats/all/head.rb +4 -2
  330. data/tmpsets/set/mod006-basic_formats/all/json.rb +1 -1
  331. data/tmpsets/set/mod006-basic_formats/all/rss.rb +1 -1
  332. data/tmpsets/set/mod006-basic_formats/self/head.rb +2 -2
  333. data/tmpsets/set/mod007-item/all/bar.rb +33 -43
  334. data/tmpsets/set/mod008-pointer/abstract/00_paging_params.rb +11 -6
  335. data/tmpsets/set/mod008-pointer/abstract/01_paging.rb +0 -1
  336. data/tmpsets/set/mod008-pointer/abstract/02_pointer.rb +1 -1
  337. data/tmpsets/set/mod008-pointer/abstract/02_pointer/events.rb +32 -11
  338. data/tmpsets/set/mod008-pointer/abstract/02_pointer/html_views.rb +26 -9
  339. data/tmpsets/set/mod008-pointer/abstract/02_pointer/html_views/filter.rb +2 -4
  340. data/tmpsets/set/mod008-pointer/abstract/02_pointer/item_api.rb +52 -31
  341. data/tmpsets/set/mod008-pointer/abstract/02_pointer/options_api.rb +7 -14
  342. data/tmpsets/set/mod008-pointer/abstract/id_pointer.rb +30 -0
  343. data/tmpsets/set/mod008-pointer/right/{options.rb → content_options.rb} +4 -4
  344. data/tmpsets/set/mod008-pointer/type/link_list.rb +49 -0
  345. data/tmpsets/set/mod008-pointer/type/list.rb +25 -0
  346. data/tmpsets/set/{mod021-standard/type/listed_by.rb → mod008-pointer/type/mirror_list.rb} +13 -12
  347. data/tmpsets/set/{mod021-standard/type/list.rb → mod008-pointer/type/mirrored_list.rb} +9 -9
  348. data/tmpsets/set/mod008-pointer/type/nest_list.rb +49 -0
  349. data/tmpsets/set/mod009-ace_editor/self/ace.rb +16 -0
  350. data/tmpsets/set/mod011-tinymce_editor/all/reference_editor.rb +32 -0
  351. data/tmpsets/set/mod011-tinymce_editor/all/reference_editor/link_editor.rb +42 -0
  352. data/tmpsets/set/mod011-tinymce_editor/all/reference_editor/link_editor/link_parser.rb +43 -0
  353. data/tmpsets/set/mod011-tinymce_editor/all/reference_editor/nest_editor.rb +181 -0
  354. data/tmpsets/set/{mod023-edit/all → mod011-tinymce_editor/all/reference_editor}/nest_editor/nest_parser.rb +14 -6
  355. data/tmpsets/set/mod011-tinymce_editor/all/reference_editor/nest_image.rb +79 -0
  356. data/tmpsets/set/mod011-tinymce_editor/self/tiny_mce.rb +16 -0
  357. data/tmpsets/set/mod012-solid_cache/abstract/solid_cache.rb +1 -1
  358. data/tmpsets/set/mod012-solid_cache/right/solid_cache.rb +3 -3
  359. data/tmpsets/set/mod013-basic_types/type/html.rb +7 -3
  360. data/tmpsets/set/mod013-basic_types/type/json.rb +5 -1
  361. data/tmpsets/set/mod013-basic_types/type/plain_text.rb +1 -1
  362. data/tmpsets/set/mod014-machines/abstract/machine.rb +4 -4
  363. data/tmpsets/set/mod014-machines/abstract/machine/output_update.rb +15 -6
  364. data/tmpsets/set/mod014-machines/abstract/script.rb +1 -1
  365. data/tmpsets/set/mod014-machines/self/script_decko.rb +4 -3
  366. data/tmpsets/set/mod014-machines/type/css.rb +1 -1
  367. data/tmpsets/set/mod015-settings/abstract/permission.rb +6 -2
  368. data/tmpsets/set/mod015-settings/all/supports_content_options.rb +16 -0
  369. data/tmpsets/set/mod015-settings/right/content_option_view.rb +19 -0
  370. data/tmpsets/set/mod015-settings/right/content_options.rb +27 -0
  371. data/tmpsets/set/mod015-settings/right/default.rb +18 -2
  372. data/tmpsets/set/mod015-settings/right/guide.rb +17 -0
  373. data/tmpsets/set/mod015-settings/right/help.rb +2 -1
  374. data/tmpsets/set/mod015-settings/right/input_type.rb +44 -0
  375. data/tmpsets/set/mod015-settings/right/read.rb +53 -43
  376. data/tmpsets/set/mod015-settings/right/script.rb +6 -0
  377. data/tmpsets/set/mod015-settings/right/structure.rb +7 -1
  378. data/tmpsets/set/mod015-settings/right/style.rb +2 -2
  379. data/tmpsets/set/mod015-settings/self/autoname.rb +3 -1
  380. data/tmpsets/set/mod015-settings/self/captcha.rb +4 -1
  381. data/tmpsets/set/mod015-settings/self/content_option_view.rb +19 -0
  382. data/tmpsets/set/mod015-settings/self/content_options.rb +19 -0
  383. data/tmpsets/set/mod015-settings/self/create.rb +2 -1
  384. data/tmpsets/set/mod015-settings/self/default.rb +1 -1
  385. data/tmpsets/set/mod015-settings/self/delete.rb +2 -1
  386. data/tmpsets/set/mod015-settings/self/{add_help.rb → guide.rb} +6 -5
  387. data/tmpsets/set/mod015-settings/self/head.rb +3 -1
  388. data/tmpsets/set/mod015-settings/self/help.rb +3 -1
  389. data/tmpsets/set/mod015-settings/self/input_type.rb +22 -0
  390. data/tmpsets/set/mod015-settings/self/layout.rb +3 -1
  391. data/tmpsets/set/mod015-settings/self/on_create.rb +2 -1
  392. data/tmpsets/set/mod015-settings/self/on_delete.rb +2 -1
  393. data/tmpsets/set/mod015-settings/self/on_update.rb +2 -1
  394. data/tmpsets/set/mod015-settings/self/read.rb +2 -1
  395. data/tmpsets/set/mod015-settings/self/structure.rb +3 -1
  396. data/tmpsets/set/mod015-settings/self/style.rb +3 -1
  397. data/tmpsets/set/mod015-settings/self/table_of_contents.rb +4 -1
  398. data/tmpsets/set/mod015-settings/self/thanks.rb +3 -1
  399. data/tmpsets/set/mod015-settings/self/update.rb +2 -1
  400. data/tmpsets/set/mod015-settings/type/setting.rb +19 -39
  401. data/tmpsets/set/mod016-email/abstract/test_context.rb +1 -1
  402. data/tmpsets/set/mod016-email/all/email_html.rb +2 -2
  403. data/tmpsets/set/mod016-email/all/email_text.rb +2 -2
  404. data/tmpsets/set/mod016-email/type/email_template/email_config.rb +2 -2
  405. data/tmpsets/set/mod017-follow/all/follow/followed_by.rb +2 -3
  406. data/tmpsets/set/mod017-follow/all/follow/follower_ids.rb +16 -4
  407. data/tmpsets/set/mod017-follow/all/notify.rb +2 -6
  408. data/tmpsets/set/mod017-follow/all/notify/base_views.rb +5 -8
  409. data/tmpsets/set/mod017-follow/right/account.rb +8 -6
  410. data/tmpsets/set/mod017-follow/right/followers.rb +3 -6
  411. data/tmpsets/set/mod017-follow/right/following.rb +2 -2
  412. data/tmpsets/set/mod017-follow/self/edited.rb +1 -1
  413. data/tmpsets/set/mod017-follow/self/follow_defaults.rb +1 -1
  414. data/tmpsets/set/mod017-follow/type/cardtype.rb +6 -0
  415. data/tmpsets/set/mod017-follow/type_plus_right/user/follow.rb +7 -10
  416. data/tmpsets/set/mod018-developer/right/debug.rb +14 -15
  417. data/tmpsets/set/mod019-carrierwave/abstract/attachment.rb +3 -6
  418. data/tmpsets/set/mod019-carrierwave/abstract/attachment/storage_type.rb +1 -2
  419. data/tmpsets/set/mod019-carrierwave/abstract/attachment/upload_cache.rb +1 -2
  420. data/tmpsets/set/mod019-carrierwave/all/file_utils.rb +5 -1
  421. data/tmpsets/set/mod019-carrierwave/self/admin.rb +1 -1
  422. data/tmpsets/set/mod019-carrierwave/self/favicon.rb +5 -0
  423. data/tmpsets/set/mod019-carrierwave/self/new_file.rb +1 -1
  424. data/tmpsets/set/mod019-carrierwave/self/new_image.rb +1 -1
  425. data/tmpsets/set/mod019-carrierwave/type/file.rb +3 -2
  426. data/tmpsets/set/mod019-carrierwave/type/image.rb +2 -72
  427. data/tmpsets/set/mod019-carrierwave/type/image/html_views.rb +78 -0
  428. data/tmpsets/set/mod020-media/abstract/media.rb +26 -0
  429. data/tmpsets/set/mod020-media/self/style_media.rb +15 -0
  430. data/tmpsets/set/mod020-media/type/image.rb +47 -0
  431. data/tmpsets/set/{mod020-search → mod021-search}/abstract/00_filter_helper.rb +5 -7
  432. data/tmpsets/set/{mod020-search → mod021-search}/abstract/02_search_params.rb +1 -1
  433. data/tmpsets/set/mod021-search/abstract/03_filter.rb +32 -0
  434. data/tmpsets/set/{mod020-search/abstract/03_filter.rb → mod021-search/abstract/03_filter/filter_form.rb} +47 -80
  435. data/tmpsets/set/{mod020-search/abstract/01_filter_form_helper.rb → mod021-search/abstract/03_filter/form_helper.rb} +32 -43
  436. data/tmpsets/set/mod021-search/abstract/03_filter/query_construction.rb +45 -0
  437. data/tmpsets/set/{mod020-search → mod021-search}/abstract/04_right_filter_form.rb +6 -2
  438. data/tmpsets/set/{mod020-search → mod021-search}/abstract/search.rb +1 -0
  439. data/tmpsets/set/{mod020-search → mod021-search}/abstract/search/views.rb +2 -2
  440. data/tmpsets/set/{mod020-search → mod021-search}/abstract/wql_search.rb +5 -5
  441. data/tmpsets/set/mod021-search/right/children.rb +13 -0
  442. data/tmpsets/set/mod021-search/right/created.rb +12 -0
  443. data/tmpsets/set/mod021-search/right/edited.rb +12 -0
  444. data/tmpsets/set/mod021-search/right/editors.rb +12 -0
  445. data/tmpsets/set/mod021-search/right/follow.rb +12 -0
  446. data/tmpsets/set/mod021-search/right/linked_to_by.rb +12 -0
  447. data/tmpsets/set/mod021-search/right/links_to.rb +12 -0
  448. data/tmpsets/set/mod021-search/right/mates.rb +12 -0
  449. data/tmpsets/set/mod021-search/right/nested_by.rb +12 -0
  450. data/tmpsets/set/mod021-search/right/nests.rb +12 -0
  451. data/tmpsets/set/mod021-search/right/referred_to_by.rb +12 -0
  452. data/tmpsets/set/mod021-search/right/refers_to.rb +12 -0
  453. data/tmpsets/set/{mod020-search → mod021-search}/self/recent.rb +1 -1
  454. data/tmpsets/set/{mod020-search → mod021-search}/self/search.rb +4 -2
  455. data/tmpsets/set/{mod020-search → mod021-search}/type/search_type.rb +6 -5
  456. data/tmpsets/set/{mod021-standard → mod022-standard}/all/comment.rb +2 -1
  457. data/tmpsets/set/{mod021-standard → mod022-standard}/all/error.rb +2 -2
  458. data/tmpsets/set/{mod021-standard → mod022-standard}/all/links.rb +0 -0
  459. data/tmpsets/set/{mod021-standard → mod022-standard}/all/list_changes.rb +7 -8
  460. data/tmpsets/set/{mod021-standard → mod022-standard}/all/path.rb +7 -7
  461. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html.rb +0 -0
  462. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/alert.rb +0 -0
  463. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/content.rb +48 -18
  464. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/error.rb +21 -28
  465. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/frame.rb +0 -0
  466. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/header.rb +0 -8
  467. data/tmpsets/set/mod022-standard/all/rich_html/html_views/guide.rb +60 -0
  468. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/html_views/help.rb +28 -6
  469. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/html_views/info.rb +1 -1
  470. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/html_views/size.rb +0 -0
  471. data/tmpsets/set/mod022-standard/all/rich_html/menu.rb +138 -0
  472. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/modal.rb +3 -3
  473. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/overlay.rb +26 -4
  474. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/process_layout.rb +0 -0
  475. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/show.rb +8 -0
  476. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/title.rb +3 -3
  477. data/tmpsets/set/{mod021-standard → mod022-standard}/all/rich_html/wrapper.rb +0 -0
  478. data/tmpsets/set/{mod021-standard → mod022-standard}/right/discussion.rb +8 -2
  479. data/tmpsets/set/{mod021-standard → mod022-standard}/right/head.rb +4 -0
  480. data/tmpsets/set/mod022-standard/right/type_plus_right.rb +13 -0
  481. data/tmpsets/set/{mod021-standard → mod022-standard}/right/when_created.rb +0 -0
  482. data/tmpsets/set/{mod021-standard → mod022-standard}/right/when_last_edited.rb +0 -0
  483. data/tmpsets/set/{mod021-standard → mod022-standard}/self/alerts.rb +0 -0
  484. data/tmpsets/set/mod022-standard/self/cardtype.rb +51 -0
  485. data/tmpsets/set/{mod021-standard → mod022-standard}/self/codenames.rb +0 -0
  486. data/tmpsets/set/{mod021-standard → mod022-standard}/self/foot.rb +0 -0
  487. data/tmpsets/set/{mod021-standard → mod022-standard}/self/home.rb +0 -0
  488. data/tmpsets/set/{mod021-standard → mod022-standard}/self/now.rb +0 -0
  489. data/tmpsets/set/mod022-standard/self/sidebar.rb +14 -0
  490. data/tmpsets/set/{mod021-standard → mod022-standard}/type/basic.rb +2 -2
  491. data/tmpsets/set/mod022-standard/type/cardtype.rb +136 -0
  492. data/tmpsets/set/{mod021-standard → mod022-standard}/type/layout_type.rb +0 -0
  493. data/tmpsets/set/{mod021-standard → mod022-standard}/type/notification_template.rb +0 -0
  494. data/tmpsets/set/{mod021-standard → mod022-standard}/type/number.rb +1 -1
  495. data/tmpsets/set/{mod021-standard → mod022-standard}/type/phrase.rb +1 -1
  496. data/tmpsets/set/{mod021-standard → mod022-standard}/type/session.rb +37 -9
  497. data/tmpsets/set/{mod021-standard → mod022-standard}/type/toggle.rb +9 -1
  498. data/tmpsets/set/{mod021-standard → mod022-standard}/type/uri.rb +1 -1
  499. data/tmpsets/set/mod023-rules/right/self.rb +12 -0
  500. data/tmpsets/set/{mod022-rules → mod023-rules}/rstar/rule_user.rb +0 -0
  501. data/tmpsets/set/mod023-rules/rule/bar_view.rb +97 -0
  502. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/bridge_rules_editor.rb +5 -10
  503. data/tmpsets/set/mod023-rules/rule/editor.rb +120 -0
  504. data/tmpsets/set/mod023-rules/rule/html_views.rb +22 -0
  505. data/tmpsets/set/mod023-rules/rule/quick_editor.rb +48 -0
  506. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rule_form.rb +0 -0
  507. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rule_form/buttons.rb +3 -1
  508. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rule_form/form_elements.rb +2 -2
  509. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rule_form/rule_set_radio.rb +3 -6
  510. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rule_form/set_selection.rb +3 -10
  511. data/tmpsets/set/{mod022-rules → mod023-rules}/rule/rules.rb +9 -1
  512. data/tmpsets/set/{mod022-rules → mod023-rules}/self/script_rules.rb +0 -0
  513. data/tmpsets/set/{mod022-rules → mod023-rules}/type/set.rb +38 -21
  514. data/tmpsets/set/mod023-rules/type/set/html_views.rb +60 -0
  515. data/tmpsets/set/mod023-rules/type/set/html_views/rule_lists.rb +51 -0
  516. data/tmpsets/set/mod023-rules/type/set/html_views/template.rb +21 -0
  517. data/tmpsets/set/{mod022-rules → mod023-rules}/type/set/rules_filter.rb +24 -10
  518. data/tmpsets/set/{mod022-rules → mod023-rules}/type/set/setting_lists.rb +18 -25
  519. data/tmpsets/set/{mod023-edit → mod024-edit}/all/bridge.rb +8 -7
  520. data/tmpsets/set/mod024-edit/all/bridge/bridge_pills.rb +56 -0
  521. data/tmpsets/set/{mod023-edit → mod024-edit}/all/bridge/follow_section.rb +0 -0
  522. data/tmpsets/set/mod024-edit/all/bridge/related_section.rb +43 -0
  523. data/tmpsets/set/mod024-edit/all/bridge/tab_views.rb +50 -0
  524. data/tmpsets/set/{mod023-edit → mod024-edit}/all/bridge/tab_visibility.rb +12 -10
  525. data/tmpsets/set/{mod023-edit → mod024-edit}/all/edit_content.rb +12 -16
  526. data/tmpsets/set/{mod023-edit → mod024-edit}/all/edit_inline.rb +16 -8
  527. data/tmpsets/set/{mod023-edit → mod024-edit}/all/edit_name.rb +10 -44
  528. data/tmpsets/set/mod024-edit/all/edit_type.rb +110 -0
  529. data/tmpsets/set/{mod023-edit → mod024-edit}/all/editing.rb +7 -3
  530. data/tmpsets/set/{mod023-edit → mod024-edit}/all/editor.rb +28 -15
  531. data/tmpsets/set/{mod023-edit → mod024-edit}/all/form.rb +34 -44
  532. data/tmpsets/set/{mod023-edit → mod024-edit}/all/form_buttons.rb +13 -4
  533. data/tmpsets/set/{mod023-edit → mod024-edit}/all/form_elements.rb +1 -0
  534. data/tmpsets/set/{mod023-edit → mod024-edit}/all/formgroup.rb +5 -5
  535. data/tmpsets/set/{mod023-edit → mod024-edit}/all/new.rb +66 -4
  536. data/tmpsets/set/mod024-edit/all/overlay_guide.rb +18 -0
  537. data/tmpsets/set/mod024-edit/all/template_nest.rb +51 -0
  538. data/tmpsets/set/mod024-edit/type/list.rb +24 -0
  539. data/tmpsets/set/mod024-edit/type/plain_text.rb +22 -0
  540. data/tmpsets/set/mod024-edit/type/pointer.rb +20 -0
  541. data/tmpsets/set/{mod024-date → mod025-date}/all/calendar.rb +1 -1
  542. data/tmpsets/set/mod025-date/self/datepicker.rb +15 -0
  543. data/tmpsets/set/{mod024-date → mod025-date}/self/script_datepicker.rb +0 -0
  544. data/tmpsets/set/{mod024-date → mod025-date}/self/script_datepicker_config.rb +0 -0
  545. data/tmpsets/set/{mod024-date → mod025-date}/self/style_datepicker.rb +0 -0
  546. data/tmpsets/set/{mod024-date → mod025-date}/type/date.rb +1 -1
  547. data/tmpsets/set/mod026-account/abstract/account_field.rb +26 -0
  548. data/tmpsets/set/mod026-account/abstract/accountable.rb +58 -0
  549. data/tmpsets/set/mod026-account/all/account.rb +102 -0
  550. data/tmpsets/set/mod026-account/right/account.rb +67 -0
  551. data/tmpsets/set/mod026-account/right/account/events.rb +107 -0
  552. data/tmpsets/set/mod026-account/right/account/views.rb +74 -0
  553. data/tmpsets/set/mod026-account/right/api_key.rb +57 -0
  554. data/tmpsets/set/{mod025-account → mod026-account}/right/email.rb +3 -3
  555. data/tmpsets/set/{mod025-account → mod026-account}/right/password.rb +6 -9
  556. data/tmpsets/set/mod026-account/right/roles.rb +36 -0
  557. data/tmpsets/set/{mod025-account → mod026-account}/right/salt.rb +5 -1
  558. data/tmpsets/set/{mod025-account → mod026-account}/right/status.rb +10 -1
  559. data/tmpsets/set/{mod025-account → mod026-account}/self/signin.rb +5 -5
  560. data/tmpsets/set/mod026-account/type/role.rb +30 -0
  561. data/tmpsets/set/mod026-account/type/signup.rb +63 -0
  562. data/tmpsets/set/mod026-account/type/signup/views.rb +102 -0
  563. data/tmpsets/set/{mod025-account → mod026-account}/type/user.rb +16 -27
  564. data/tmpsets/set/{mod025-account → mod026-account}/type_plus_right/user/email.rb +0 -0
  565. data/tmpsets/set/mod027-navbar/abstract/account_dropdown.rb +34 -0
  566. data/tmpsets/set/mod027-navbar/abstract/pointer/html_views.rb +14 -0
  567. data/tmpsets/set/mod027-navbar/all/navbar_links.rb +67 -0
  568. data/tmpsets/set/mod027-navbar/right/enabled_roles.rb +70 -0
  569. data/tmpsets/set/{mod025-account → mod027-navbar}/self/account_links.rb +37 -20
  570. data/tmpsets/set/mod027-navbar/self/dropdown_divider.rb +18 -0
  571. data/tmpsets/set/mod027-navbar/self/navbox.rb +45 -0
  572. data/tmpsets/set/mod027-navbar/type/html.rb +23 -0
  573. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/abstract/bootstrap_code_file.rb +0 -0
  574. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/abstract/bootswatch_theme.rb +2 -2
  575. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/abstract/bootswatch_theme/html_views.rb +2 -2
  576. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/accordion.rb +0 -0
  577. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/dropdown.rb +1 -2
  578. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/form.rb +0 -0
  579. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/helper.rb +9 -4
  580. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/icon.rb +0 -0
  581. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/navbar.rb +0 -0
  582. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/table.rb +0 -0
  583. data/tmpsets/set/mod028-bootstrap/all/bootstrap/tabs.rb +49 -0
  584. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/bootstrap/wrapper.rb +0 -0
  585. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/all/rich_bootstrap.rb +0 -0
  586. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/bootstrap_core.rb +0 -0
  587. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/bootstrap_functions.rb +0 -0
  588. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/font_awesome.rb +0 -0
  589. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/material_icons.rb +0 -0
  590. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/script_bootstrap.rb +0 -0
  591. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/script_load_select2.rb +0 -0
  592. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/script_select2.rb +0 -0
  593. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/smartmenu_css.rb +0 -0
  594. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/smartmenu_js.rb +0 -0
  595. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/style_bootstrap_cards.rb +0 -0
  596. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/style_bootstrap_colorpicker.rb +0 -0
  597. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/style_select2.rb +0 -0
  598. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/self/style_select2_bootstrap.rb +0 -0
  599. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/type/bootswatch_skin.rb +0 -0
  600. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/type/customized_bootswatch_skin.rb +6 -5
  601. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/type/customized_bootswatch_skin/html_views.rb +1 -2
  602. data/tmpsets/set/{mod026-bootstrap → mod028-bootstrap}/type_plus_right/customized_bootswatch_skin/colors.rb +1 -1
  603. data/tmpsets/set/{mod027-google_analytics → mod029-google_analytics}/all/google_analytics.rb +1 -1
  604. data/tmpsets/set/{mod028-recaptcha → mod030-recaptcha}/all/recaptcha.rb +5 -10
  605. data/tmpsets/set/mod030-recaptcha/self/admin_info.rb +41 -0
  606. data/tmpsets/set/{mod002-admin → mod030-recaptcha}/self/recaptcha_proxy.rb +2 -2
  607. data/tmpsets/set/{mod002-admin → mod030-recaptcha}/self/recaptcha_secret_key.rb +2 -2
  608. data/tmpsets/set/mod030-recaptcha/self/recaptcha_settings.rb +53 -0
  609. data/tmpsets/set/{mod002-admin → mod030-recaptcha}/self/recaptcha_site_key.rb +2 -2
  610. data/tmpsets/set/mod031-markdown/type/markdown.rb +26 -0
  611. data/tmpsets/set_pattern/100-all.rb +2 -1
  612. data/tmpsets/set_pattern/101-all_plus.rb +2 -1
  613. data/tmpsets/set_pattern/102-type.rb +8 -1
  614. data/tmpsets/set_pattern/103-star.rb +2 -1
  615. data/tmpsets/set_pattern/104-rstar.rb +2 -1
  616. data/tmpsets/set_pattern/105-rule.rb +2 -1
  617. data/tmpsets/set_pattern/106-right.rb +6 -1
  618. data/tmpsets/set_pattern/107-type_plus_right.rb +7 -3
  619. data/tmpsets/set_pattern/108-self.rb +6 -1
  620. metadata +264 -173
  621. data/config/initializers/recaptcha.rb +0 -46
  622. data/lib/card/act_manager.rb +0 -188
  623. data/lib/card/act_manager/stage.rb +0 -56
  624. data/lib/card/act_manager/stage_director.rb +0 -323
  625. data/lib/card/act_manager/stage_director/phases.rb +0 -37
  626. data/lib/card/tasks/card/seed.rake +0 -0
  627. data/mod/core/set/all/erb.rb +0 -11
  628. data/mod/core/set/all/phases.rb +0 -12
  629. data/mod/core/set/all/stages.rb +0 -17
  630. data/mod/core/spec/set/all/phases_spec.rb +0 -5
  631. data/tmpsets/set/mod001-utility/abstract/media.rb +0 -42
  632. data/tmpsets/set/mod015-settings/right/add_help.rb +0 -10
  633. data/tmpsets/set/mod015-settings/self/accountable.rb +0 -12
  634. data/tmpsets/set/mod015-settings/self/input.rb +0 -12
  635. data/tmpsets/set/mod015-settings/self/options.rb +0 -13
  636. data/tmpsets/set/mod015-settings/self/options_label.rb +0 -13
  637. data/tmpsets/set/mod020-search/self/navbox.rb +0 -41
  638. data/tmpsets/set/mod021-standard/all/rich_html/menu.rb +0 -75
  639. data/tmpsets/set/mod021-standard/type/cardtype.rb +0 -104
  640. data/tmpsets/set/mod022-rules/rule/editor.rb +0 -193
  641. data/tmpsets/set/mod022-rules/rule/table.rb +0 -36
  642. data/tmpsets/set/mod022-rules/rule/table_row.rb +0 -72
  643. data/tmpsets/set/mod022-rules/type/set/html_views.rb +0 -78
  644. data/tmpsets/set/mod022-rules/type/set/html_views/nest_rules.rb +0 -23
  645. data/tmpsets/set/mod022-rules/type/set/html_views/rules_bridge.rb +0 -30
  646. data/tmpsets/set/mod022-rules/type/set/html_views/template.rb +0 -52
  647. data/tmpsets/set/mod023-edit/all/bridge/tab_views.rb +0 -84
  648. data/tmpsets/set/mod023-edit/all/edit_type.rb +0 -37
  649. data/tmpsets/set/mod023-edit/all/nest_editor.rb +0 -115
  650. data/tmpsets/set/mod023-edit/all/nest_image.rb +0 -46
  651. data/tmpsets/set/mod025-account/all/account.rb +0 -78
  652. data/tmpsets/set/mod025-account/right/account.rb +0 -199
  653. data/tmpsets/set/mod025-account/right/token.rb +0 -63
  654. data/tmpsets/set/mod025-account/type/signup.rb +0 -191
  655. data/tmpsets/set/mod026-bootstrap/all/bootstrap/tabs.rb +0 -140
@@ -29,16 +29,9 @@ module ClassMethods
29
29
  # new: { opts for Card#new } Return a new card when not found
30
30
  # @return [Card]
31
31
  def fetch *args
32
- mark, opts = normalize_fetch_args args
33
- validate_fetch_opts! opts
34
-
35
- card, needs_caching = retrieve_or_new mark, opts
36
-
37
- return if card.nil?
38
- write_to_cache card, opts[:local_only] if needs_caching
39
- standard_fetch_results card, mark, opts
32
+ Card::Fetch.new(*args)&.retrieve_or_new
40
33
  rescue ActiveModel::RangeError => _e
41
- return Card.new name: "card id out of range: #{mark}"
34
+ return Card.new name: "card id out of range: #{f.mark}"
42
35
  end
43
36
 
44
37
  # fetch only real (no virtual) cards
@@ -56,16 +49,7 @@ module ClassMethods
56
49
  # @param mark - see #fetch
57
50
  # @return [Card]
58
51
  def quick_fetch *mark
59
- fetch mark, skip_virtual: true, skip_modules: true
60
- end
61
-
62
- # fetch only from the soft cache
63
- #
64
- # @param args - see #fetch
65
- # @return [Card]
66
- def fetch_soft *args
67
- mark, opts = normalize_fetch_args args
68
- fetch mark, opts.merge(local_only: true)
52
+ fetch(*mark, skip_virtual: true, skip_modules: true)
69
53
  end
70
54
 
71
55
  # @return [Card]
@@ -87,19 +71,17 @@ module ClassMethods
87
71
  end
88
72
  end
89
73
 
90
- # @param mark - see #fetch
74
+ # @param args - see #fetch
91
75
  # @return [Integer]
92
- def fetch_id *mark
93
- mark, _opts = normalize_fetch_args mark
94
- return mark if mark.is_a? Integer
95
- card = quick_fetch mark.to_s
96
- card && card.id
76
+ def fetch_id *mark_parts
77
+ mark = Card::Fetch.new(*mark_parts)&.mark
78
+ mark.is_a?(Integer) ? mark : quick_fetch(mark.to_s)&.id
97
79
  end
98
80
 
99
81
  # @param mark - see #fetch
100
82
  # @return [Card::Name]
101
83
  def fetch_name *mark
102
- if (card = quick_fetch(mark))
84
+ if (card = quick_fetch(*mark))
103
85
  card.name
104
86
  elsif block_given?
105
87
  yield.to_name
@@ -112,8 +94,8 @@ module ClassMethods
112
94
 
113
95
  # @param mark - see #fetch
114
96
  # @return [Integer]
115
- def fetch_type_id *mark
116
- (card = quick_fetch(mark)) && card.type_id
97
+ def fetch_type_id mark
98
+ quick_fetch(mark)&.type_id
117
99
  end
118
100
  end
119
101
 
@@ -121,30 +103,20 @@ end
121
103
  # INSTANCE METHODS
122
104
  # fetching from the context of a card
123
105
 
124
- def fetch opts={}
125
- traits = opts.delete(:trait)
126
- return unless traits
127
- # should this fail as an incorrect api call?
128
- traits = Array.wrap traits
129
- traits.inject(self) do |card, trait|
106
+ def fetch traits, opts={}
107
+ opts[:new][:supercard] = self if opts[:new]
108
+ Array.wrap(traits).inject(self) do |card, trait|
130
109
  Card.fetch card.name.trait(trait), opts
131
110
  end
132
111
  end
133
112
 
134
- def renew args={}
135
- opts = args[:new].clone
136
- handle_default_content opts
137
- opts[:name] ||= name
138
- opts[:skip_modules] = args[:skip_modules]
139
- Card.new opts
140
- end
141
-
142
- def handle_default_content opts
143
- if (default_content = opts.delete(:default_content)) && db_content.blank?
144
- opts[:content] ||= default_content
145
- elsif db_content.present? && !opts[:content]
146
- # don't overwrite existing content
147
- opts[:content] = db_content
113
+ def newish opts
114
+ reset_patterns
115
+ Card.with_normalized_new_args opts do |norm_opts|
116
+ handle_type norm_opts do
117
+ assign_attributes norm_opts
118
+ self.name = name # trigger superize_name
119
+ end
148
120
  end
149
121
  end
150
122
 
@@ -20,143 +20,25 @@ module ClassMethods
20
20
  end
21
21
  end
22
22
 
23
- def safe_param param
24
- if param.respond_to? :to_unsafe_h
25
- # clone doesn't work for Parameters
26
- param.to_unsafe_h
27
- else
28
- # clone so that original params remain unaltered. need deeper clone?
29
- (param || {}).clone
30
- end
31
- end
32
-
33
23
  private
34
24
 
35
25
  def standard_controller_fetch args, card_opts
36
26
  mark = args[:mark] || card_opts[:name]
37
- card = Card.fetch mark, look_in_trash: args[:look_in_trash], new: card_opts
27
+ card = Card.fetch mark, skip_modules: true,
28
+ look_in_trash: args[:look_in_trash],
29
+ new: card_opts
38
30
  card.assign_attributes card_opts if args[:assign] && card&.real?
31
+ card&.include_set_modules
39
32
  card
40
33
  end
41
34
 
42
35
  def controller_fetch_opts args
43
- opts = safe_param args[:card]
36
+ opts = Env.hash args[:card]
44
37
  opts[:type] ||= args[:type] if args[:type]
45
38
  # for /new/:type shortcut. we should handle in routing and deprecate this
46
- opts[:name] ||= Card::Name.url_key_to_standard(args[:mark])
39
+ opts[:name] ||= Card::Name.url_key_to_standard args[:mark]
47
40
  opts
48
41
  end
49
-
50
- def validate_fetch_opts! opts
51
- return unless opts[:new] && opts[:skip_virtual]
52
- raise Card::Error, "fetch called with new args and skip_virtual"
53
- end
54
-
55
- def skip_type_lookup? opts
56
- # if opts[:new] is not empty then we are initializing a variant that is
57
- # different from the cached variant
58
- # and can postpone type lookup for the cached variant
59
- # if skipping virtual no need to look for actual type
60
- opts[:skip_virtual] || opts[:new].present? || opts[:skip_type_lookup]
61
- end
62
-
63
- def retrieve_or_new mark, opts
64
- card, needs_caching = retrieve_existing mark, opts
65
- if (new_card = new_for_cache card, mark, opts)
66
- [new_card, true]
67
- else
68
- [card, needs_caching]
69
- end
70
- end
71
-
72
- # look in cache. if that doesn't work, look in database
73
- # @return [{Card}, {True/False}] Card object and "needs_caching" ruling
74
- def retrieve_existing mark, opts
75
- return [nil, false] unless mark.present?
76
- mark_type, mark_key = retrievable_mark_type_and_value mark
77
- if (card = retrieve_from_cache_by_mark mark_type, mark_key, opts)
78
- # we have an acceptable card in the cache
79
- # (and don't need to cache it again!)
80
- [card, false]
81
- else
82
- # try to find the card in the database
83
- card = retrieve_from_db mark_type, mark_key, opts[:look_in_trash]
84
- [card, !(card.nil? || card.trash)]
85
- end
86
- end
87
-
88
- def retrieve_from_cache_by_mark mark_type, mark_key, opts
89
- card = send "retrieve_from_cache_by_#{mark_type}", mark_key, opts[:local_only]
90
- return_cached_card?(card, opts[:look_in_trash]) ? card : nil
91
- end
92
-
93
- # In both the cache and the db, ids and keys are used to retrieve card data.
94
- # This method identifies the kind of mark to use and its value
95
- # @return [Array] first item is :id or :key, second is corresponding value
96
- def retrievable_mark_type_and_value mark
97
- # return mark_type and mark_value
98
- if mark.is_a? Integer
99
- [:id, mark]
100
- else
101
- [:key, mark.key]
102
- end
103
- end
104
-
105
- def return_cached_card? card, look_in_trash
106
- return false unless card
107
- card.real? || !look_in_trash
108
- end
109
-
110
- # @return [Card, nil] Card object
111
- def retrieve_from_db mark_type, mark_key, look_in_trash=false
112
- query = { mark_type => mark_key }
113
- query[:trash] = false unless look_in_trash
114
- Card.where(query).take
115
- end
116
-
117
- def standard_fetch_results card, mark, opts
118
- if card.new_card?
119
- new_card_fetch_results card, mark, opts
120
- else
121
- finalize_fetch_results card, opts
122
- end
123
- end
124
-
125
- def new_card_fetch_results card, mark, opts
126
- case
127
- when opts[:new].present? then return card.renew(opts)
128
- when opts[:new] # noop for empty hash
129
- when opts[:skip_virtual] then return nil
130
- end
131
- card.assign_name_from_fetched_mark! mark, opts
132
- finalize_fetch_results card, opts
133
- card if opts[:new] || card.known?
134
- end
135
-
136
- def finalize_fetch_results card, opts
137
- card.include_set_modules unless opts[:skip_modules]
138
- card
139
- end
140
-
141
- def normalize_fetch_args args
142
- opts = args.last.is_a?(Hash) ? args.pop : {}
143
- mark = id_or_name args
144
- mark = absolutize_fetch_mark mark, opts.dig(:new, :supercard)
145
- [mark, opts]
146
- end
147
-
148
- def absolutize_fetch_mark mark, supercard
149
- return mark unless mark.name? && supercard
150
- mark.to_name.absolute_name supercard.name
151
- end
152
- end
153
-
154
- public
155
-
156
- def assign_name_from_fetched_mark! mark, opts
157
- return if opts[:local_only]
158
- return unless mark && mark.to_s != name
159
- self.name = mark.to_s
160
42
  end
161
43
  end;end;end;end;
162
44
  # ~~ generated from /Users/ethan/dev/decko/gem/card/mod/core/set/all/fetch_helper.rb ~~
@@ -9,47 +9,77 @@ JUNK_INIT_ARGS = %w[missing skip_virtual id].freeze
9
9
 
10
10
  module ClassMethods
11
11
  def new args={}, _options={}
12
+ with_normalized_new_args args do |normalized_args|
13
+ super normalized_args
14
+ end
15
+ end
16
+
17
+ def with_normalized_new_args args={}
12
18
  args = (args || {}).stringify_keys
19
+ delete_junk_args args
20
+ normalize_type_args args
21
+ normalize_content_args args
22
+ yield args
23
+ end
24
+
25
+ private
26
+
27
+ def delete_junk_args args
13
28
  JUNK_INIT_ARGS.each { |a| args.delete(a) }
29
+ end
30
+
31
+ def normalize_type_args args
14
32
  %w[type type_code].each { |k| args.delete(k) if args[k].blank? }
33
+ end
34
+
35
+ def normalize_content_args args
15
36
  args.delete("content") if args["attach"] # should not be handled here!
16
- super args
37
+ args["db_content"] = args.delete "content" if args["content"]
17
38
  end
18
39
  end
19
40
 
20
41
  def initialize args={}
21
42
  args["name"] = initial_name args["name"]
22
- args["db_content"] = args.delete "content" if args["content"]
23
- @supercard = args.delete "supercard" # must come before name=
24
43
 
25
- handle_skip_args args do
26
- super args # ActiveRecord #initialize
44
+ handle_set_modules args do
45
+ handle_type args do
46
+ super args # ActiveRecord #initialize
47
+ end
27
48
  end
28
49
  self
29
50
  end
30
51
 
31
- def handle_skip_args args
52
+ def handle_set_modules args
32
53
  skip_modules = args.delete "skip_modules"
33
- skip_type_lookup = args["skip_type_lookup"]
34
54
  yield
35
- self.type_id = get_type_id_from_structure if !type_id && !skip_type_lookup
36
55
  include_set_modules unless skip_modules
37
56
  end
38
57
 
58
+ def handle_type args
59
+ type_lookup = args["type_lookup"]
60
+ @supercard = args.delete "supercard"
61
+
62
+ yield
63
+ type_id_from_template if type_lookup == :force || (!type_id && type_lookup != :skip)
64
+ end
65
+
39
66
  def initial_name name
40
- return name if name.is_a? String
41
- Card::Name[name].to_s
67
+ name.is_a?(String) ? name : Card::Name[name].to_s
42
68
  end
43
69
 
44
70
  def include_set_modules
45
- unless @set_mods_loaded
46
- set_modules.each do |m|
47
- singleton_class.send :include, m
48
- end
49
- assign_set_specific_attributes
50
- @set_mods_loaded = true
71
+ return self if @set_mods_loaded
72
+
73
+ set_modules.each do |m|
74
+ singleton_class.send :include, m
51
75
  end
76
+ assign_set_specific_attributes
77
+ @uncacheable = @set_mods_loaded = true
52
78
  self
53
79
  end
80
+
81
+ def uncacheable?
82
+ @uncacheable == true
83
+ end
54
84
  end;end;end;end;
55
85
  # ~~ generated from /Users/ethan/dev/decko/gem/card/mod/core/set/all/initialize.rb ~~
@@ -27,29 +27,39 @@ def item_count args={}
27
27
  item_names(args).size
28
28
  end
29
29
 
30
+ def items_to_content array
31
+ items = array.map { |i| standardize_item i }.reject(&:blank?)
32
+ self.content = items.to_pointer_content
33
+ end
34
+
35
+ def standardize_item item
36
+ Card::Name[item]
37
+ end
38
+
30
39
  def include_item? item
31
- key = item.is_a?(Card) ? item.name.key : item.to_name.key
32
- item_names.map { |name| name.to_name.key }.member? key
40
+ item_names.include? Card::Name[item]
33
41
  end
34
42
 
35
43
  def add_item item
36
44
  return if include_item? item
37
- self.content = "#{content}\n#{item}"
45
+ items_to_content(items_strings << item)
38
46
  end
39
47
 
40
48
  def drop_item item
49
+ item = Card::Name[item]
41
50
  return unless include_item? item
42
- new_names = item_names.reject { |i| i == item }
43
- self.content = new_names.empty? ? "" : new_names.join("\n")
51
+ items_to_content(item_names.reject { |i| i == item })
44
52
  end
45
53
 
46
54
  def insert_item index, name
47
55
  new_names = item_names
48
56
  new_names.delete name
49
57
  new_names.insert index, name
50
- self.content = new_names.join "\n"
58
+ items_to_content new_names
51
59
  end
52
60
 
61
+ # I think the following should work as add_item...
62
+ #
53
63
  def add_id id
54
64
  add_item "~#{id}"
55
65
  end
@@ -19,7 +19,7 @@ end
19
19
  def configure_successful_deletion
20
20
  if Env.ajax?
21
21
  success.card = self
22
- success.view = :missing unless success.view
22
+ success.view = :unknown unless success.view
23
23
  else
24
24
  success.target = :previous
25
25
  end
@@ -28,55 +28,94 @@ module ClassMethods
28
28
  end
29
29
 
30
30
  def name
31
- super.to_name
31
+ @name ||= left_id ? Card::Lexicon.lex_to_name([left_id, right_id]) : super.to_name
32
+ end
33
+
34
+ def key
35
+ @key ||= left_id ? name.key : super
32
36
  end
33
37
 
34
38
  def name= newname
35
- cardname = superize_name newname.to_name
36
- newkey = cardname.key
37
- self.key = newkey if key != newkey
38
- update_subcard_names cardname
39
- write_attribute :name, cardname.s
40
- name
39
+ @name = superize_name newname.to_name
40
+ self.key = @name.key
41
+ update_subcard_names @name
42
+ write_attribute :name, (@name.simple? ? @name.s : nil)
43
+ assign_side_ids
44
+ @name
45
+ end
46
+
47
+ def assign_side_ids
48
+ if name.simple?
49
+ self.left_id = self.right_id = nil
50
+ else
51
+ assign_side_id :left_id=, :left_name
52
+ assign_side_id :right_id=, :right_name
53
+ end
54
+ end
55
+
56
+ # assigns left_id and right_id based on names.
57
+ # if side card is new, id is temporarily stored as -1
58
+ def assign_side_id side_id_equals, side_name
59
+ side_id = Card::Lexicon.id(name.send(side_name)) || -1
60
+ send side_id_equals, side_id
41
61
  end
42
62
 
43
63
  def superize_name cardname
44
64
  return cardname unless @supercard
45
65
  @raw_name = cardname.s
46
66
  @supercard.subcards.rename key, cardname.key
47
- @superleft = @supercard if cardname.field_of? @supercard.name
67
+ update_superleft cardname
48
68
  cardname.absolute_name @supercard.name
49
69
  end
50
70
 
71
+ def update_superleft cardname
72
+ @superleft = @supercard if cardname.field_of? @supercard.name
73
+ end
74
+
51
75
  def key= newkey
52
- was_in_cache = Card.cache.soft.delete key
53
- write_attribute :key, newkey
54
- # keep the soft cache up-to-date
55
- Card.write_to_soft_cache self if was_in_cache
56
- # reset the old name - should be handled in tracked_attributes!!
57
- reset_patterns_if_rule
76
+ return if newkey == key
77
+ update_cache_key key do
78
+ write_attribute :key, (name.simple? ? newkey : nil)
79
+ @key = newkey
80
+ end
81
+ clean_patterns
82
+ @key
83
+ end
84
+
85
+ def clean_patterns
86
+ return unless patterns?
58
87
  reset_patterns
59
- newkey
88
+ patterns
89
+ end
90
+
91
+ def update_cache_key oldkey
92
+ yield
93
+ was_in_cache = Card.cache.soft.delete oldkey
94
+ Card.write_to_soft_cache self if was_in_cache
60
95
  end
61
96
 
62
97
  def update_subcard_names new_name, name_to_replace=nil
63
98
  return unless @subcards
64
99
  subcards.each do |subcard|
65
- # if subcard has a relative name like +C
66
- # and self is a subcard as well that changed from +B to A+B then
67
- # +C should change to A+B+C. #replace doesn't work in this case
68
- # because the old name +B is not a part of +C
69
- name_to_replace ||=
70
- if subcard.name.junction? &&
71
- subcard.name.parts.first.empty? &&
72
- new_name.parts.first.present?
73
- # replace the empty part
74
- "".to_name
75
- else
76
- name
77
- end
78
- subcard.name = subcard.name.swap name_to_replace, new_name.s
79
- subcard.update_subcard_names new_name, name
100
+ update_subcard_name subcard, new_name, name_to_replace if subcard.new?
101
+ end
102
+ end
103
+
104
+ def update_subcard_name subcard, new_name, name_to_replace
105
+ name_to_replace ||= name_to_replace_for_subcard subcard, new_name
106
+ subcard.name = subcard.name.swap name_to_replace, new_name.s
107
+ subcard.update_subcard_names new_name, name # needed? shouldn't #name= trigger this?
108
+ end
109
+
110
+ def name_to_replace_for_subcard subcard, new_name
111
+ # if subcard has a relative name like +C
112
+ # and self is a subcard as well that changed from +B to A+B then
113
+ # +C should change to A+B+C. #replace doesn't work in this case
114
+ # because the old name +B is not a part of +C
115
+ if subcard.name.starts_with_joint? && new_name.parts.first.present?
116
+ "".to_name
117
+ else
118
+ name
80
119
  end
81
120
  end
82
121
 
@@ -104,8 +143,8 @@ end
104
143
  def left *args
105
144
  case
106
145
  when simple? then nil
107
- when @superleft then @superleft
108
- when attribute_is_changing?(:name) && name.to_name.trunk_name.key == name_before_act.to_name.key
146
+ when superleft then superleft
147
+ when name_is_changing? && name.to_name.trunk_name == name_before_act.to_name
109
148
  nil # prevent recursion when, eg, renaming A+B to A+B+C
110
149
  else
111
150
  Card.fetch name.left, *args
@@ -138,69 +177,42 @@ def left_or_new args={}
138
177
  left(args) || Card.new(args.merge(name: name.left))
139
178
  end
140
179
 
180
+ # NOTE: for all these helpers, method returns *all* fields/children/descendants.
181
+ # (Not just those current user has permission to read.)
182
+
141
183
  def fields
142
- field_names.map { |name| Card[name] }
184
+ field_ids.map { |id| Card[id] }
143
185
  end
144
186
 
145
- def field_names parent_name=nil
146
- child_names parent_name, :left
187
+ def field_names
188
+ field_ids.map { |id| Card::Name[id] }
147
189
  end
148
190
 
149
- def children
150
- child_names.map { |name| Card[name] }
191
+ def field_ids
192
+ child_ids :left
151
193
  end
152
194
 
153
- def child_names parent_name=nil, side=nil
154
- # eg, A+B is a child of A and B
155
- parent_name ||= name
156
- side ||= parent_name.to_name.simple? ? :part : :left
157
- Card.search({ side => parent_name, return: :name },
158
- "(#{side}) children of #{parent_name}")
195
+ def each_child
196
+ child_ids.each do |id|
197
+ (child = Card[id]) && yield(child)
198
+ # check should not be needed (remove after fixing data problems)
199
+ end
159
200
  end
160
201
 
161
- # ids of children and children's children
162
- def descendant_ids parent_id=nil
163
- return [] if new_card?
164
- parent_id ||= id
202
+ # eg, A+B is a child of A and B
203
+ def child_ids side=nil
204
+ return [] unless id
205
+ side ||= name.simple? ? :part : :left_id
165
206
  Auth.as_bot do
166
- child_ids = Card.search part: parent_id, return: :id
167
- child_descendant_ids = child_ids.map { |cid| descendant_ids cid }
168
- (child_ids + child_descendant_ids).flatten.uniq
207
+ Card.search({ side => id, return: :id, limit: 0 }, "children of #{name}")
169
208
  end
170
209
  end
171
210
 
172
- # children and children's children
173
- # NOTE - set modules are not loaded
174
- # -- should only be used for name manipulations
175
- def descendants
176
- @descendants ||= descendant_ids.map { |id| Card.quick_fetch id }
177
- end
178
-
179
- def repair_key
180
- Auth.as_bot do
181
- correct_key = name.key
182
- current_key = key
183
- return self if current_key == correct_key
184
-
185
- if (key_blocker = Card.find_by_key_and_trash(correct_key, true))
186
- key_blocker.name = key_blocker.name + "*trash#{rand(4)}"
187
- key_blocker.save
188
- end
189
-
190
- saved = (self.key = correct_key) && save!
191
- saved ||= (self.name = current_key) && save!
192
-
193
- if saved
194
- descendants.each(&:repair_key)
195
- else
196
- Rails.logger.debug "FAILED TO REPAIR BROKEN KEY: #{key}"
197
- self.name = "BROKEN KEY: #{name}"
198
- end
199
- self
211
+ def each_descendant &block
212
+ each_child do |child|
213
+ yield child
214
+ child.each_descendant(&block)
200
215
  end
201
- rescue StandardError
202
- Rails.logger.info "BROKE ATTEMPTING TO REPAIR BROKEN KEY: #{key}"
203
- self
204
216
  end
205
217
 
206
218
  def right_id= card_or_id
@@ -211,10 +223,6 @@ def left_id= card_or_id
211
223
  write_card_or_id :left_id, card_or_id
212
224
  end
213
225
 
214
- def type_id= card_or_id
215
- write_card_or_id :type_id, card_or_id
216
- end
217
-
218
226
  def write_card_or_id attribute, card_or_id
219
227
  if card_or_id.is_a? Card
220
228
  write_attribute_to_card attribute, card_or_id