card 1.15.1 → 1.15.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/card.gemspec +19 -16
  4. data/config/initializers/recaptcha.rb +1 -0
  5. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +13 -14
  6. data/db/migrate_core_cards/20150326205655_bootswatch_themes.rb +30 -0
  7. data/db/migrate_core_cards/20150331135745_new_card_menu.rb +8 -0
  8. data/db/migrate_core_cards/20150508212032_menu_compatibility.rb +27 -0
  9. data/db/migrate_core_cards/20150510031118_fix_skin_images.rb +13 -0
  10. data/db/migrate_core_cards/data/1.12_stylesheets/classic_cards.scss +9 -5
  11. data/db/migrate_core_cards/data/1.12_stylesheets/common.scss +5 -5
  12. data/{test/fixtures/.gitkeep → db/migrate_core_cards/data/themes/bootstrap_default/_bootswatch.scss} +0 -0
  13. data/db/migrate_core_cards/data/themes/bootstrap_default/_variables.scss +866 -0
  14. data/db/migrate_core_cards/data/themes/cerulean/_bootswatch.scss +125 -0
  15. data/db/migrate_core_cards/data/themes/cerulean/_variables.scss +861 -0
  16. data/db/migrate_core_cards/data/themes/cosmo/_bootswatch.scss +237 -0
  17. data/db/migrate_core_cards/data/themes/cosmo/_variables.scss +861 -0
  18. data/db/migrate_core_cards/data/themes/cyborg/_bootswatch.scss +210 -0
  19. data/db/migrate_core_cards/data/themes/cyborg/_variables.scss +861 -0
  20. data/db/migrate_core_cards/data/themes/darkly/_bootswatch.scss +330 -0
  21. data/db/migrate_core_cards/data/themes/darkly/_variables.scss +861 -0
  22. data/db/migrate_core_cards/data/themes/flatly/_bootswatch.scss +313 -0
  23. data/db/migrate_core_cards/data/themes/flatly/_variables.scss +861 -0
  24. data/db/migrate_core_cards/data/themes/journal/_bootswatch.scss +120 -0
  25. data/db/migrate_core_cards/data/themes/journal/_variables.scss +861 -0
  26. data/db/migrate_core_cards/data/themes/lumen/_bootswatch.scss +496 -0
  27. data/db/migrate_core_cards/data/themes/lumen/_variables.scss +861 -0
  28. data/db/migrate_core_cards/data/themes/paper/_bootswatch.scss +607 -0
  29. data/db/migrate_core_cards/data/themes/paper/_variables.scss +861 -0
  30. data/db/migrate_core_cards/data/themes/readable/_bootswatch.scss +174 -0
  31. data/db/migrate_core_cards/data/themes/readable/_variables.scss +861 -0
  32. data/db/migrate_core_cards/data/themes/sandstone/_bootswatch.scss +194 -0
  33. data/db/migrate_core_cards/data/themes/sandstone/_variables.scss +861 -0
  34. data/db/migrate_core_cards/data/themes/simplex/_bootswatch.scss +142 -0
  35. data/db/migrate_core_cards/data/themes/simplex/_variables.scss +861 -0
  36. data/db/migrate_core_cards/data/themes/slate/_bootswatch.scss +417 -0
  37. data/db/migrate_core_cards/data/themes/slate/_variables.scss +861 -0
  38. data/db/migrate_core_cards/data/themes/spacelab/_bootswatch.scss +137 -0
  39. data/db/migrate_core_cards/data/themes/spacelab/_variables.scss +861 -0
  40. data/db/migrate_core_cards/data/themes/superhero/_bootswatch.scss +332 -0
  41. data/db/migrate_core_cards/data/themes/superhero/_variables.scss +861 -0
  42. data/db/migrate_core_cards/data/themes/united/_bootswatch.scss +42 -0
  43. data/db/migrate_core_cards/data/themes/united/_variables.scss +861 -0
  44. data/db/migrate_core_cards/data/themes/yeti/_bootswatch.scss +437 -0
  45. data/db/migrate_core_cards/data/themes/yeti/_variables.scss +861 -0
  46. data/db/seed/README.md +2 -0
  47. data/db/{bootstrap → seed/new}/card_actions.yml +561 -295
  48. data/db/{bootstrap → seed/new}/card_acts.yml +1 -1
  49. data/db/seed/new/card_changes.yml +29331 -0
  50. data/db/{bootstrap → seed/new}/card_references.yml +1544 -1355
  51. data/db/seed/new/cards.yml +28057 -0
  52. data/db/seed/test/fixtures/.gitkeep +0 -0
  53. data/{test → db/seed/test}/fixtures/card_actions.yml +1501 -1235
  54. data/{test → db/seed/test}/fixtures/card_acts.yml +244 -244
  55. data/db/seed/test/fixtures/card_changes.yml +34527 -0
  56. data/{test → db/seed/test}/fixtures/card_references.yml +2215 -2026
  57. data/db/seed/test/fixtures/cards.yml +32708 -0
  58. data/{test → db/seed/test}/fixtures/mao2.jpg +0 -0
  59. data/{test → db/seed/test}/fixtures/rails.gif +0 -0
  60. data/{test → db/seed/test}/seed.rb +0 -0
  61. data/db/version_core_cards.txt +1 -1
  62. data/lib/card/format.rb +56 -56
  63. data/lib/cardio.rb +7 -5
  64. data/mod/01_core/chunk/include.rb +1 -1
  65. data/mod/01_core/set/all/fetch.rb +27 -27
  66. data/mod/01_core/set/all/rules.rb +53 -53
  67. data/mod/01_core/set/all/states.rb +5 -0
  68. data/mod/01_core/spec/format/html_format_spec.rb +6 -6
  69. data/mod/01_core/spec/set/all/rules2_spec.rb +6 -6
  70. data/mod/01_history/set/all/history.rb +4 -4
  71. data/mod/02_basic_types/set/all/rss.rb +10 -9
  72. data/mod/03_machines/lib/javascript/script_card_menu.js.coffee +20 -0
  73. data/mod/03_machines/lib/javascript/wagn.js.coffee +46 -34
  74. data/mod/03_machines/lib/javascript/wagn_mod.js.coffee +36 -148
  75. data/mod/03_machines/lib/stylesheets/style_bootstrap_compatible.css +10 -96
  76. data/mod/03_machines/lib/stylesheets/style_cards.scss +127 -87
  77. data/mod/03_machines/set/self/script_card_menu.rb +10 -2
  78. data/mod/05_email/set/all/follow.rb +38 -22
  79. data/mod/05_email/set/right/follow.rb +79 -1
  80. data/mod/05_email/set/type_plus_right/user/follow.rb +31 -31
  81. data/mod/05_email/spec/set/all/follow_spec.rb +37 -28
  82. data/mod/05_email/spec/set/right/followers_spec.rb +29 -29
  83. data/mod/05_standard/set/all/error.rb +17 -20
  84. data/mod/05_standard/set/all/links.rb +31 -18
  85. data/mod/05_standard/set/all/rich_html/content.rb +41 -18
  86. data/mod/05_standard/set/all/rich_html/editing.rb +21 -17
  87. data/mod/05_standard/set/all/rich_html/header.rb +13 -48
  88. data/mod/05_standard/set/all/rich_html/menu.rb +147 -0
  89. data/mod/05_standard/set/all/rich_html/modal.rb +54 -0
  90. data/mod/05_standard/set/all/rich_html/toolbar.rb +237 -0
  91. data/mod/05_standard/set/all/rich_html/wrapper.rb +43 -25
  92. data/mod/05_standard/set/right/account.rb +8 -7
  93. data/mod/05_standard/set/rstar/rules.rb +111 -84
  94. data/mod/05_standard/set/self/head.rb +15 -15
  95. data/mod/05_standard/set/type/set.rb +65 -34
  96. data/mod/05_standard/spec/set/all/attach_spec.rb +1 -1
  97. data/mod/05_standard/spec/set/all/rich_html/wrapper_spec.rb +13 -9
  98. data/mod/05_standard/spec/set/rstar/rules_spec.rb +1 -1
  99. data/mod/06_bootstrap/lib/javascript/bootstrap.js +108 -97
  100. data/mod/06_bootstrap/lib/javascript/smartmenu.js +94 -0
  101. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_alerts.scss +73 -0
  102. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_badges.scss +68 -0
  103. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_breadcrumbs.scss +26 -0
  104. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_button-groups.scss +243 -0
  105. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_buttons.scss +160 -0
  106. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_carousel.scss +269 -0
  107. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_close.scss +36 -0
  108. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_code.scss +69 -0
  109. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_component-animations.scss +37 -0
  110. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_dropdowns.scss +214 -0
  111. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_forms.scss +578 -0
  112. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_glyphicons.scss +305 -0
  113. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_grid.scss +84 -0
  114. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_input-groups.scss +166 -0
  115. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_jumbotron.scss +50 -0
  116. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_labels.scss +66 -0
  117. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_list-group.scss +124 -0
  118. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_media.scss +61 -0
  119. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_mixins.scss +39 -0
  120. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_modals.scss +150 -0
  121. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_navbar.scss +662 -0
  122. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_navs.scss +242 -0
  123. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_normalize.scss +427 -0
  124. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_pager.scss +54 -0
  125. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_pagination.scss +88 -0
  126. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_panels.scss +265 -0
  127. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_popovers.scss +135 -0
  128. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_print.scss +107 -0
  129. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_progress-bars.scss +87 -0
  130. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_responsive-embed.scss +35 -0
  131. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_responsive-utilities.scss +177 -0
  132. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_scaffolding.scss +162 -0
  133. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_tables.scss +234 -0
  134. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_theme.scss +273 -0
  135. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_thumbnails.scss +38 -0
  136. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_tooltip.scss +102 -0
  137. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_type.scss +298 -0
  138. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_utilities.scss +55 -0
  139. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_variables.scss +866 -0
  140. data/mod/06_bootstrap/lib/stylesheets/bootstrap/_wells.scss +29 -0
  141. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_alerts.scss +14 -0
  142. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_background-variant.scss +11 -0
  143. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_border-radius.scss +18 -0
  144. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_buttons.scss +52 -0
  145. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
  146. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_clearfix.scss +22 -0
  147. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_forms.scss +88 -0
  148. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_gradients.scss +58 -0
  149. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_grid-framework.scss +81 -0
  150. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_grid.scss +122 -0
  151. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_hide-text.scss +21 -0
  152. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_image.scss +33 -0
  153. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_labels.scss +12 -0
  154. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_list-group.scss +31 -0
  155. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
  156. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +9 -0
  157. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_opacity.scss +8 -0
  158. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_pagination.scss +23 -0
  159. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_panels.scss +24 -0
  160. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_progress-bar.scss +10 -0
  161. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
  162. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  163. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_responsive-visibility.scss +21 -0
  164. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_size.scss +10 -0
  165. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
  166. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_table-row.scss +28 -0
  167. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_text-emphasis.scss +11 -0
  168. data/mod/06_bootstrap/lib/stylesheets/bootstrap/mixins/_text-overflow.scss +8 -0
  169. data/mod/06_bootstrap/lib/stylesheets/{bootswatch_mixins.scss → bootstrap/mixins/_vendor-prefixes.scss} +1 -61
  170. data/mod/06_bootstrap/lib/stylesheets/bootstrap_cards.scss +20 -13
  171. data/mod/06_bootstrap/lib/stylesheets/smartmenu.css +433 -0
  172. data/mod/06_bootstrap/set/all/bootstrap/wrapper.rb +2 -2
  173. data/mod/06_bootstrap/set/all/rich_bootstrap.rb +58 -4
  174. data/mod/06_bootstrap/set/self/bootstrap_js.rb +1 -1
  175. data/mod/06_bootstrap/set/self/bootswatch_shared.rb +32 -0
  176. data/mod/06_bootstrap/set/self/smartmenu_css.rb +7 -0
  177. data/mod/06_bootstrap/set/self/smartmenu_js.rb +7 -0
  178. data/spec/spec_helper.rb +16 -16
  179. metadata +133 -93
  180. data/db/bootstrap/card_changes.yml +0 -12765
  181. data/db/bootstrap/cards.yml +0 -11567
  182. data/db/seeds.rb +0 -8
  183. data/mod/03_machines/lib/javascript/script_card_menu.js +0 -72
  184. data/mod/06_bootstrap/lib/stylesheets/bootstrap_css.css +0 -6565
  185. data/mod/06_bootstrap/lib/stylesheets/theme_bootstrap_default.css +0 -476
  186. data/mod/06_bootstrap/lib/stylesheets/theme_cerulean.css +0 -6721
  187. data/mod/06_bootstrap/lib/stylesheets/theme_cosmo.css +0 -5898
  188. data/mod/06_bootstrap/lib/stylesheets/theme_cyborg.css +0 -5876
  189. data/mod/06_bootstrap/lib/stylesheets/theme_darkly.css +0 -5986
  190. data/mod/06_bootstrap/lib/stylesheets/theme_flatly.css +0 -6830
  191. data/mod/06_bootstrap/lib/stylesheets/theme_journal.css +0 -6647
  192. data/mod/06_bootstrap/lib/stylesheets/theme_lumen.css +0 -6097
  193. data/mod/06_bootstrap/lib/stylesheets/theme_paper.css +0 -6647
  194. data/mod/06_bootstrap/lib/stylesheets/theme_readable.css +0 -5896
  195. data/mod/06_bootstrap/lib/stylesheets/theme_sandstone.css +0 -6733
  196. data/mod/06_bootstrap/lib/stylesheets/theme_simplex.css +0 -5886
  197. data/mod/06_bootstrap/lib/stylesheets/theme_slate.css +0 -7057
  198. data/mod/06_bootstrap/lib/stylesheets/theme_spacelab.css +0 -5935
  199. data/mod/06_bootstrap/lib/stylesheets/theme_superhero.css +0 -5964
  200. data/mod/06_bootstrap/lib/stylesheets/theme_united.css +0 -6588
  201. data/mod/06_bootstrap/lib/stylesheets/theme_yeti.css +0 -6088
  202. data/mod/06_bootstrap/set/self/bootstrap_css.rb +0 -9
  203. data/mod/06_bootstrap/set/self/bootswatch_mixins.rb +0 -9
  204. data/mod/06_bootstrap/set/self/theme_bootstrap_default.rb +0 -2
  205. data/mod/06_bootstrap/set/self/theme_cerulean.rb +0 -9
  206. data/mod/06_bootstrap/set/self/theme_cosmo.rb +0 -2
  207. data/mod/06_bootstrap/set/self/theme_cyborg.rb +0 -2
  208. data/mod/06_bootstrap/set/self/theme_darkly.rb +0 -2
  209. data/mod/06_bootstrap/set/self/theme_flatly.rb +0 -2
  210. data/mod/06_bootstrap/set/self/theme_journal.rb +0 -2
  211. data/mod/06_bootstrap/set/self/theme_lumen.rb +0 -2
  212. data/mod/06_bootstrap/set/self/theme_paper.rb +0 -2
  213. data/mod/06_bootstrap/set/self/theme_readable.rb +0 -2
  214. data/mod/06_bootstrap/set/self/theme_sandstone.rb +0 -2
  215. data/mod/06_bootstrap/set/self/theme_simplex.rb +0 -2
  216. data/mod/06_bootstrap/set/self/theme_slate.rb +0 -2
  217. data/mod/06_bootstrap/set/self/theme_spacelab.rb +0 -2
  218. data/mod/06_bootstrap/set/self/theme_superhero.rb +0 -2
  219. data/mod/06_bootstrap/set/self/theme_united.rb +0 -2
  220. data/mod/06_bootstrap/set/self/theme_yeti.rb +0 -2
  221. data/test/fixtures/card_changes.yml +0 -17961
  222. data/test/fixtures/cards.yml +0 -16218
@@ -2,20 +2,19 @@ format :html do
2
2
  def slot_options args
3
3
  @@slot_option_keys ||= Card::Chunk::Include.options.reject { |k| k == :view }.unshift :home_view
4
4
  options_hash = {}
5
-
5
+
6
6
  if @context_names.present?
7
7
  options_hash['name_context'] = @context_names.map( &:key ) * ','
8
8
  end
9
-
9
+
10
10
  @@slot_option_keys.inject(options_hash) do |hash, opt|
11
11
  hash[opt] = args[opt] if args[opt].present?
12
12
  hash
13
13
  end
14
-
14
+
15
15
  JSON( options_hash )
16
16
  end
17
-
18
-
17
+
19
18
  def wrap args = {}
20
19
  classes = [
21
20
  ( 'card-slot' unless args[:no_slot] ),
@@ -24,7 +23,7 @@ format :html do
24
23
  ( "STRUCTURE-#{args[:structure].to_name.key}" if args[:structure]),
25
24
  card.safe_set_keys
26
25
  ].compact
27
-
26
+
28
27
  div = %{<div id="#{card.cardname.url_key}" data-card-id="#{card.id}" data-card-name="#{h card.name}" style="#{h args[:style]}" class="#{classes*' '}" } +
29
28
  %{data-slot='#{html_escape_except_quotes slot_options( args )}'>#{ output yield }</div>}
30
29
 
@@ -45,16 +44,26 @@ format :html do
45
44
  yield args
46
45
  end
47
46
  end
48
-
47
+
48
+ def panel args={}
49
+ wrap_with :div, :class=>"card-frame #{args[:panel_class]}" do
50
+ output(yield)
51
+ end
52
+ end
53
+
49
54
  def frame args={}
50
- args[:slot_class] = "card-frame #{args[:slot_class]}"
51
55
  wrap args do
52
- %{
53
- #{ _render_header args }
54
- #{ %{ <div class="card-subheader">#{ args[:subheader] }</div> } if args[:subheader] }
55
- #{ _optional_render :help, args.merge(:help_class=>'alert alert-info'), :hide }
56
- #{ wrap_body args do output( yield args ) end }
57
- }
56
+ [
57
+ _optional_render( :menu, args ),
58
+ panel(args) do
59
+ [
60
+ _optional_render( :header, args, :show),
61
+ (%{ <div class="card-subheader">#{ args[:subheader] }</div> } if args[:subheader]),
62
+ _optional_render( :help, args.merge(:help_class=>'alert alert-info'), :hide),
63
+ wrap_body(args) { output( yield args ) } ,
64
+ ]
65
+ end
66
+ ]
58
67
  end
59
68
  end
60
69
 
@@ -67,7 +76,8 @@ format :html do
67
76
  end
68
77
  end
69
78
  end
70
-
79
+
80
+
71
81
  # alert_types: 'success', 'info', 'warning', 'danger'
72
82
  def alert alert_type, args={}
73
83
  css_class = "alert alert-#{alert_type} "
@@ -82,24 +92,32 @@ format :html do
82
92
  close_button + output( yield args)
83
93
  end
84
94
  end
85
-
95
+
86
96
  def wrap_main(content)
87
97
  return content if params[:layout]=='none'
88
98
  %{<div id="main">#{content}</div>}
89
99
  end
90
-
91
- def wrap_with tag, html_args={}
92
- content_tag( tag, html_args ) do
93
- output( yield ).html_safe
100
+
101
+ def wrap_with tag, content_or_args={}, html_args={}
102
+ if block_given?
103
+ content_tag( tag, content_or_args ) do
104
+ output( yield ).html_safe
105
+ end
106
+ else
107
+ content_tag( tag, html_args ) do
108
+ output( content_or_args ).html_safe
109
+ end
94
110
  end
95
111
  end
96
-
97
- def wrap_each_with tag, args={}
98
- yield(args).map do |item|
112
+
113
+ def wrap_each_with tag, content_or_args={}, args={}
114
+ content = block_given? ? yield(args) : content_or_args
115
+ args = block_given? ? content_or_args : args
116
+ content.compact.map do |item|
99
117
  wrap_with tag, args do
100
118
  item
101
119
  end
102
120
  end.join "\n"
103
121
  end
104
-
105
- end
122
+
123
+ end
@@ -65,7 +65,7 @@ event :validate_accountability, :on=>:create, :before=>:approve do
65
65
  end
66
66
 
67
67
  event :require_email, :on=>:create, :after=>:approve do
68
- unless subcards["+#{Card[:email].name}"]
68
+ unless subcards["+#{Card[:email].name}"]
69
69
  errors.add :email, 'required'
70
70
  end
71
71
  end
@@ -90,7 +90,7 @@ event :generate_confirmation_token, :on=>:create, :before=>:process_subcards, :w
90
90
  subcards["+#{Card[:token].name}"] = {:content => generate_token }
91
91
  end
92
92
 
93
- event :reset_password, :on=>:update, :before=>:approve, :when=>proc{ |c| c.has_reset_token? } do
93
+ event :reset_password, :on=>:update, :before=>:approve, :when=>proc{ |c| c.has_reset_token? } do
94
94
  case ( result = authenticate_by_token @env_token )
95
95
  when Integer
96
96
  Auth.signin result
@@ -110,7 +110,7 @@ event :reset_password, :on=>:update, :before=>:approve, :when=>proc{ |c| c.has_r
110
110
  end
111
111
 
112
112
  def edit_password_success_args
113
- {
113
+ {
114
114
  :id=>left.name,
115
115
  :view=>:related,
116
116
  :related=>{ :name=>"+#{Card[:account].name}", :view=>'edit' }
@@ -126,7 +126,7 @@ event :reset_token do
126
126
  token_card.update_attributes! :content => generate_token
127
127
  end
128
128
  end
129
-
129
+
130
130
 
131
131
  event :send_welcome_email do
132
132
  if ((welcome = Card['welcome email']) && welcome.type_code == :email_template)
@@ -158,12 +158,12 @@ def changes_visible? act
158
158
  end
159
159
 
160
160
  def send_change_notice act, followed_set, follow_option
161
- if changes_visible?(act)
161
+ if changes_visible?(act)
162
162
  Auth.as(left.id) do
163
163
  Card[:follower_notification_email].deliver(
164
164
  :context => act.card,
165
165
  :to => email,
166
- :follower => left.name,
166
+ :follower => left.name,
167
167
  :followed_set => followed_set,
168
168
  :follow_option => follow_option
169
169
  )
@@ -172,9 +172,10 @@ def send_change_notice act, followed_set, follow_option
172
172
  end
173
173
 
174
174
 
175
- format :email do
175
+ format :email do
176
176
  view :mail do |args|
177
177
  args[:to] ||= card.email
178
178
  super args
179
179
  end
180
180
  end
181
+
@@ -3,7 +3,7 @@ format :html do
3
3
 
4
4
  view :closed_rule, :tags=>:unknown_ok do |args|
5
5
  return 'not a rule' if !card.is_rule? #these are helpful for handling non-rule rstar cards until we have real rule sets
6
-
6
+
7
7
  rule_card = find_current_rule_card
8
8
 
9
9
  rule_content = !rule_card ? '' : begin
@@ -31,12 +31,14 @@ format :html do
31
31
  '</tr>'
32
32
  end
33
33
 
34
-
34
+
35
+
36
+
35
37
  view :open_rule, :tags=>:unknown_ok do |args|
36
38
  return 'not a rule' if !card.is_rule?
37
- current_rule = args[:current_rule]
39
+ current_rule = args[:current_rule]
38
40
  setting_name = args[:setting_name]
39
-
41
+
40
42
  edit_mode = !params[:success] && card.ok?( ( card.new_card? ? :create : :update ) )
41
43
  #~~~~~~ handle reloading due to type change
42
44
  if params[:type_reload] && card_args=params[:card]
@@ -49,25 +51,25 @@ format :html do
49
51
  end
50
52
  edit_mode = true
51
53
  end
52
-
54
+
53
55
  opts = {
54
56
  :rule_context => card, # determines the set options and the success view
55
57
  :set_context => card.rule_set_name,
56
58
  }
57
59
  rule_view = edit_mode ? :edit_rule : :show_rule
58
60
 
59
- %{
61
+ %{
60
62
  <tr class="card-slot open-rule #{rule_view.to_s.sub '_', '-'}">
61
63
  <td class="rule-cell" colspan="3">
62
64
  <div class="rule-setting">
63
65
  #{ view_link setting_name.sub(/^\*/,''), :closed_rule, :class=>'close-rule-link slotter' }
64
66
  #{ card_link setting_name, :text=>"all #{setting_name} rules", :class=>'setting-link', :target=>'wagn_setting' }
65
67
  </div>
66
-
68
+
67
69
  <div class="alert alert-info rule-instruction">
68
70
  #{ process_content "{{#{setting_name}+*right+*help|content}}" }
69
71
  </div>
70
-
72
+
71
73
  <div class="card-body">
72
74
  #{ subformat( current_rule )._render rule_view, opts }
73
75
  </div>
@@ -76,19 +78,19 @@ format :html do
76
78
  }
77
79
 
78
80
  end
79
-
81
+
80
82
  def default_open_rule_args args
81
83
  current_rule_card = find_current_rule_card || begin
82
84
  Card.new :name=> "#{Card[:all].name}+#{card.rule_user_setting_name}"
83
85
  end
84
-
86
+
85
87
  args.reverse_merge! :current_rule => current_rule_card, :setting_name => card.rule_setting_name
86
88
  end
87
-
89
+
88
90
 
89
91
  view :show_rule, :tags=>:unknown_ok do |args|
90
92
  return 'not a rule' if !card.is_rule?
91
-
93
+
92
94
  if !card.new_card?
93
95
  set = card.rule_set
94
96
  args[:item] ||= :link
@@ -112,16 +114,17 @@ format :html do
112
114
  %{
113
115
  #{ hidden_success_formgroup args[:success]}
114
116
  #{ editor args }
117
+ #{ edit_buttons args }
115
118
  }
116
119
  end
117
120
  end
118
-
121
+
119
122
  def default_edit_rule_args args
120
123
  args[:rule_context] ||= card
121
- args[:set_context] ||= card.rule_set_name
124
+ args[:set_context] ||= card.rule_set_name
122
125
  args[:set_selected] = params[:type_reload] ? card.rule_set_name : false
123
126
  args[:set_options], args[:fallback_set] = args[:rule_context].set_options
124
-
127
+
125
128
  args[:success] ||= {}
126
129
  args[:success].reverse_merge!( {
127
130
  :card => args[:rule_context],
@@ -130,18 +133,59 @@ format :html do
130
133
  :item => 'view_rule'
131
134
  })
132
135
  end
133
-
134
-
136
+
137
+ view :related_edit_rule, :tags=>:unknown_ok do |args|
138
+ delete_button = if !card.new_card?
139
+ b_args = { :remote=>true, :class=>'rule-delete-button slotter', 'data-slot-selector'=>'.card-slot.related-view', :type=>'button' }
140
+ b_args[:href] = path :action=>:delete, :success=>args[:success]
141
+ if (fset = args[:fallback_set]) && (fcard = Card.fetch(fset))
142
+ b_args['data-confirm']="Deleting will revert to #{card.rule_setting_name} rule for #{fcard.label }"
143
+ end
144
+ %{<span class="rule-delete-section">#{ button_tag 'Delete', b_args }</span>}
145
+ end
146
+
147
+ frame do
148
+ form_for card, :url=>path(:action=>:update, :no_id=>true), :html=>
149
+ {:class=>"card-form card-rule-form" } do |form|
150
+ @form = form
151
+ %{
152
+ #{ hidden_success_formgroup args[:success]}
153
+ #{ editor args }
154
+ #{
155
+ wrap_with( :div, :class=>'button-area' ) do
156
+ [
157
+ delete_button,
158
+ button_tag( 'Submit', :class=>'rule-submit-button', :situation=>'primary' ),
159
+ card_link( args[:success][:id], :text=>'Cancel', :class=>'rule-cancel-button btn btn-default', :path_opts=>{:view=>args[:success][:view]} )
160
+ ]
161
+ end
162
+ }
163
+ }
164
+ end
165
+ end
166
+ end
167
+
168
+ def default_related_edit_rule_args args
169
+ args[:success] = {
170
+ :view => :open,
171
+ :item => nil,
172
+ :card => args[:parent] || card,
173
+ :id => (args[:parent] && args[:parent].cardname.url_key) || card.cardname.url_key
174
+ }
175
+ default_edit_rule_args args
176
+ end
177
+
178
+
135
179
  # used keys for args:
136
180
  # :success, :set_selected, :set_options, :rule_context
137
- def editor args
181
+ def editor args
138
182
  wrap_with( :div, :class=>'card-editor' ) do
139
183
  [
140
184
  (type_formgroup( args ) if card.right.rule_type_editable),
141
185
  formgroup( 'rule', content_field( form, args.merge(:skip_rev_id=>true) ), :editor=>'content' ),
142
- set_formgroup( args )
186
+ set_selection( args )
143
187
  ]
144
- end + edit_buttons( args )
188
+ end
145
189
  end
146
190
 
147
191
 
@@ -152,8 +196,8 @@ format :html do
152
196
  'data-remote' => true
153
197
  ), :editor=>'type'
154
198
  end
155
-
156
-
199
+
200
+
157
201
  def hidden_success_formgroup args
158
202
  %{
159
203
  #{ hidden_field_tag 'success[id]', args[:id] || args[:card].name }
@@ -161,15 +205,24 @@ format :html do
161
205
  #{ hidden_field_tag 'success[item]', args[:item] }
162
206
  }
163
207
  end
164
-
208
+
209
+ def set_selection args
210
+ wrap_with( :div, :class=>'row') do
211
+ [
212
+ set_formgroup( args ),
213
+ related_set_formgroup( args)
214
+ ]
215
+ end
216
+ end
217
+
165
218
  def set_formgroup args
166
219
  current_set_key = card.new_card? ? Card[:all].cardname.key : card.rule_set_key # (should have a constant for this?)
167
220
  tag = args[:rule_context].rule_user_setting_name
168
221
  narrower_rules = []
169
- option_list =
222
+ option_list =
170
223
  wrap_each_with :li, :class=>'radio' do
171
224
  args[:set_options].map do |set_name, state|
172
-
225
+
173
226
  checked = ( args[:set_selected] == set_name or current_set_key && args[:set_options].length==1 )
174
227
  is_current = (state == :current)
175
228
  warning = if narrower_rules.present?
@@ -192,9 +245,29 @@ format :html do
192
245
  end
193
246
 
194
247
  end
195
- formgroup 'set', "<ul>#{ option_list }</ul>", :editor => 'set'
248
+ formgroup 'set', "<ul>#{ option_list }</ul>", :editor => 'set', :class=>'col-xs-6'
249
+ end
250
+
251
+ def related_set_formgroup args
252
+ related_sets = args[:set_context] && Card.fetch(args[:set_context]).prototype.related_sets
253
+ return '' unless related_sets && related_sets.size > 0
254
+ tag = args[:rule_context].rule_user_setting_name
255
+ option_list =
256
+ wrap_each_with :li, :class=>'radio' do
257
+ related_sets.map do |set_name, label|
258
+ rule_name = "#{set_name}+#{tag}"
259
+ rule_card = Card.fetch rule_name, :skip_modules=>true
260
+ radio_button( :name, rule_name) + %{
261
+ <label class="set-label">
262
+ #{ card_link set_name, :text=>label, :target=>'wagn_set' }
263
+ #{"<em> #{card_link "#{set_name}+#{card.rule_user_setting_name}", :text=>"(exists)"}</em>" if rule_card}
264
+ </label>
265
+ }.html_safe
266
+ end
267
+ end
268
+ formgroup 'related set', "<ul>#{ option_list }</ul>", :editor => 'set', :class=>'col-xs-6'
196
269
  end
197
-
270
+
198
271
  def edit_buttons args
199
272
  delete_button = if !card.new_card?
200
273
  b_args = { :remote=>true, :class=>'rule-delete-button slotter', :type=>'button' }
@@ -210,14 +283,14 @@ format :html do
210
283
  delete_button,
211
284
  button_tag( 'Submit', :class=>'rule-submit-button', :situation=>'primary' ),
212
285
  button_tag( 'Cancel', :class=>'rule-cancel-button slotter', :type=>'button',
213
- :href=>cancel_path, :success=>true )
286
+ :href=>cancel_path, :success=>true )
214
287
  ]
215
288
  end
216
289
  end
217
-
290
+
218
291
  =begin
219
292
  view :edit_rule2 do |args|
220
-
293
+
221
294
  card_form :update do
222
295
  [
223
296
  _optional_render( :type_formgroup, args ),
@@ -228,54 +301,8 @@ format :html do
228
301
  end
229
302
  end
230
303
  =end
231
-
232
- def default_follow_item_args args
233
- args[:condition] ||= Env.params[:condition] || '*always'
234
- end
235
-
236
- view :follow_item, :tags=>:unknown_ok do |args|
237
- if card.new_card? || !card.include_item?(args[:condition])
238
- button_view = :add_button
239
- form_opts = {:add_item=>args[:condition]}
240
- else
241
- button_view = :delete_button
242
- form_opts = {:drop_item=>args[:condition]}
243
- end
244
304
 
245
- text = if (option_card = Card.fetch args[:condition])
246
- option_card.description(card.rule_set)
247
- else
248
- card.rule_set.follow_label
249
- end
250
- link_target = if card.rule_set.tag.codename == 'self'
251
- card.rule_set_name.left
252
- else
253
- "#{card.rule_set_name}+by name"
254
- end
255
- wrap do
256
- card_form({:action=>:update, :name=>card.name, :success=>{:view=>:follow_item}},
257
- :hidden=>{:condition=>args[:condition]}.merge(form_opts)) do
258
- output [
259
- _optional_render(button_view, args),
260
- card_link( link_target, :text=>text)
261
- ]
262
- end
263
- end
264
- end
265
-
266
- view :delete_button do |args|
267
- button_tag :type=>:submit, :class=>'btn-xs btn-item-delete btn-primary', 'aria-label'=>'Left Align' do
268
- tag :span, :class=>"glyphicon glyphicon-ok", 'aria-hidden'=>"true"
269
- end
270
305
 
271
- end
272
-
273
- view :add_button do |args|
274
- button_tag :type=>:submit, :class=>'btn-xs btn-item-add', 'aria-label'=>'Left Align' do
275
- tag :span, :class=>"glyphicon glyphicon-plus", 'aria-hidden'=>"true"
276
- end
277
- end
278
-
279
306
 
280
307
  private
281
308
 
@@ -289,7 +316,7 @@ format :html do
289
316
  end
290
317
  else
291
318
  card
292
- end
319
+ end
293
320
  end
294
321
 
295
322
  end
@@ -339,15 +366,15 @@ end
339
366
  #~~~~~~~~~~ determine the set options to which the user can apply the rule.
340
367
  def set_options
341
368
 
342
- first = new_card? ? 0 : set_prototype.set_names.index{|s| s.to_name.key == rule_set_key}
369
+ first = new_card? ? 0 : set_prototype.set_names.index{|s| s.to_name.key == rule_set_key}
343
370
  rule_cnt = 0
344
371
  res = []
345
372
  fallback_set = nil
346
373
  set_prototype.set_names[first..-1].each do |set_name|
347
374
  if Card.exists?("#{set_name}+#{rule_user_setting_name}")
348
375
  rule_cnt += 1
349
- res << if rule_cnt == 1
350
- [set_name,:current]
376
+ res << if rule_cnt == 1
377
+ [set_name,:current]
351
378
  else
352
379
  fallback_set ||= set_name
353
380
  [set_name,:overwritten]
@@ -356,7 +383,7 @@ def set_options
356
383
  res << (rule_cnt < 1 ? [set_name,:enabled] : [set_name,:disabled])
357
384
  end
358
385
  end
359
-
386
+
360
387
  # fallback_set = if first > 0
361
388
  # res[0..(first-1)].find do |set_name|
362
389
  # Card.exists?("#{set_name}+#{rule_user_setting_name}")
@@ -370,7 +397,7 @@ def set_options
370
397
  # (for anything more general, they must explicitly choose to "DELETE" the current one)
371
398
  # the narrowest rule should be the one attached to the set being viewed. So, eg, if you're looking at the "*all plus" set, you shouldn't
372
399
  # have the option to create rules based on arbitrary narrower sets, though narrower sets will always apply to whatever prototype we create
373
-
400
+
374
401
  return res, fallback_set
375
402
  end
376
403
 
@@ -384,7 +411,7 @@ end
384
411
 
385
412
 
386
413
 
387
- #
414
+ #
388
415
 
389
416
  =begin
390
417
 
@@ -396,7 +423,7 @@ def repair_set
396
423
  include_set_modules
397
424
  end
398
425
  end
399
-
426
+
400
427
  def method_missing method_id, *args
401
428
  if !@set_repair_attempted and repair_set
402
429
  send method_id, *args