card 1.16.15 → 1.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/config/initializers/recaptcha.rb +21 -4
  4. data/db/migrate_core_cards/20130823192433_add_style_cards.rb +1 -1
  5. data/db/migrate_core_cards/20140512155840_add_script_cards.rb +1 -1
  6. data/db/migrate_core_cards/20140629222005_add_email_cards.rb +2 -2
  7. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +1 -1
  8. data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +1 -1
  9. data/db/migrate_core_cards/20150610180019_add_recaptcha_key_and_admin_info_cards.rb +63 -0
  10. data/db/migrate_core_cards/20150724123438_update_file_and_image_cards.rb +1 -1
  11. data/db/migrate_core_cards/20150903130006_attachment_upload_cards.rb +1 -1
  12. data/db/schema.rb +1 -1
  13. data/db/seed/new/card_actions.yml +602 -394
  14. data/db/seed/new/card_acts.yml +595 -1
  15. data/db/seed/new/card_changes.yml +26282 -10262
  16. data/db/seed/new/card_references.yml +1252 -1084
  17. data/db/seed/new/cards.yml +1899 -1423
  18. data/db/seed/test/fixtures/card_actions.yml +1653 -1413
  19. data/db/seed/test/fixtures/card_acts.yml +1063 -445
  20. data/db/seed/test/fixtures/card_changes.yml +29674 -13637
  21. data/db/seed/test/fixtures/card_references.yml +1976 -1815
  22. data/db/seed/test/fixtures/cards.yml +3194 -2719
  23. data/lib/card.rb +14 -13
  24. data/lib/card/auth.rb +10 -6
  25. data/lib/card/cache.rb +58 -120
  26. data/lib/card/cache/persistent.rb +50 -0
  27. data/lib/card/cache/temporary.rb +38 -0
  28. data/lib/card/chunk.rb +34 -25
  29. data/lib/card/content.rb +3 -3
  30. data/lib/card/env.rb +3 -0
  31. data/lib/card/format.rb +56 -53
  32. data/lib/card/migration.rb +6 -2
  33. data/lib/card/name.rb +9 -1
  34. data/lib/card/query.rb +1 -1
  35. data/lib/card/reference.rb +17 -11
  36. data/lib/card/set.rb +1 -1
  37. data/lib/card/subcards.rb +6 -6
  38. data/lib/card/view_cache.rb +45 -28
  39. data/lib/generators/card/migration/templates/card_migration.erb +1 -2
  40. data/mod/01_core/chunk/include.rb +71 -48
  41. data/mod/01_core/chunk/link.rb +6 -3
  42. data/mod/01_core/chunk/query_reference.rb +38 -29
  43. data/mod/01_core/chunk/reference.rb +23 -24
  44. data/mod/01_core/set/all/collection.rb +1 -1
  45. data/mod/01_core/set/all/fetch.rb +39 -12
  46. data/mod/01_core/set/all/permissions.rb +2 -4
  47. data/mod/01_core/set/all/references.rb +50 -75
  48. data/mod/01_core/set/all/rules.rb +19 -18
  49. data/mod/01_core/set/all/subcards.rb +1 -1
  50. data/mod/01_core/set/all/templating.rb +31 -88
  51. data/mod/01_core/set/all/tracked_attributes.rb +7 -14
  52. data/mod/01_core/set/all/utils.rb +77 -66
  53. data/mod/01_core/set_pattern/07_type_plus_right.rb +6 -3
  54. data/mod/01_core/spec/set/all/fetch_spec.rb +148 -96
  55. data/mod/01_core/spec/set/all/templating_spec.rb +49 -40
  56. data/mod/01_core/spec/set/all/trash_spec.rb +1 -1
  57. data/mod/01_history/set/all/actions.rb +1 -1
  58. data/mod/02_basic_types/set/all/base.rb +13 -7
  59. data/mod/02_basic_types/set/all/rss.rb +17 -22
  60. data/mod/02_basic_types/set/type/plain_text.rb +5 -2
  61. data/mod/02_basic_types/spec/set/all/base_spec.rb +1 -0
  62. data/mod/02_basic_types/spec/set/all/rss_spec.rb +7 -6
  63. data/mod/03_machines/lib/javascript/wagn.js.coffee +22 -9
  64. data/mod/03_machines/set/right/machine_output.rb +1 -1
  65. data/mod/04_settings/lib/card/setting.rb +45 -31
  66. data/mod/04_settings/set/right/structure.rb +47 -1
  67. data/mod/04_settings/set/self/default_html_view.rb +2 -0
  68. data/mod/04_settings/set/self/follow_fields.rb +2 -0
  69. data/mod/04_settings/set/self/recent_settings.rb +1 -1
  70. data/mod/05_standard/file/favicon/image-icon.png +0 -0
  71. data/mod/05_standard/file/favicon/image-large.png +0 -0
  72. data/mod/05_standard/file/favicon/image-medium.png +0 -0
  73. data/mod/05_standard/file/favicon/image-original.png +0 -0
  74. data/mod/05_standard/file/favicon/image-small.png +0 -0
  75. data/mod/05_standard/set/all/links.rb +27 -26
  76. data/mod/05_standard/set/all/rich_html/editing.rb +1 -1
  77. data/mod/05_standard/set/all/rich_html/toolbar.rb +1 -1
  78. data/mod/05_standard/set/rstar/rules.rb +20 -325
  79. data/mod/05_standard/set/rstar/rules_editor.rb +362 -0
  80. data/mod/05_standard/set/self/admin_info.rb +82 -0
  81. data/mod/05_standard/set/self/all.rb +16 -10
  82. data/mod/05_standard/set/self/head.rb +20 -19
  83. data/mod/05_standard/set/type/signup.rb +0 -1
  84. data/mod/05_standard/spec/set/all/account_spec.rb +44 -43
  85. data/mod/05_standard/spec/set/right/account_spec.rb +4 -2
  86. data/mod/05_standard/spec/set/type/search_type_spec.rb +8 -0
  87. data/mod/05_standard/spec/set/type/signup_spec.rb +24 -17
  88. data/mod/06_bootstrap/set/all/bootstrap/helper.rb +1 -1
  89. data/spec/lib/card/cache_spec.rb +64 -70
  90. data/spec/lib/card/content_spec.rb +236 -150
  91. data/spec/lib/card/reference_spec.rb +22 -38
  92. data/spec/lib/card/subcards_spec.rb +38 -0
  93. data/spec/lib/card/view_cache_spec.rb +8 -0
  94. data/spec/spec_helper.rb +1 -1
  95. data/tmpsets/set/mod001-01_core/all/collection.rb +77 -74
  96. data/tmpsets/set/mod001-01_core/all/content.rb +14 -16
  97. data/tmpsets/set/mod001-01_core/all/fetch.rb +137 -110
  98. data/tmpsets/set/mod001-01_core/all/name.rb +58 -40
  99. data/tmpsets/set/mod001-01_core/all/pattern.rb +12 -11
  100. data/tmpsets/set/mod001-01_core/all/permissions.rb +125 -117
  101. data/tmpsets/set/mod001-01_core/all/phases.rb +2 -1
  102. data/tmpsets/set/mod001-01_core/all/references.rb +52 -77
  103. data/tmpsets/set/mod001-01_core/all/rules.rb +47 -53
  104. data/tmpsets/set/mod001-01_core/all/templating.rb +31 -87
  105. data/tmpsets/set/mod001-01_core/all/tracked_attributes.rb +12 -21
  106. data/tmpsets/set/mod001-01_core/all/trash.rb +4 -1
  107. data/tmpsets/set/mod001-01_core/all/type.rb +23 -21
  108. data/tmpsets/set/mod001-01_core/all/utils.rb +80 -64
  109. data/tmpsets/set/mod002-01_history/all/actions.rb +20 -16
  110. data/tmpsets/set/mod002-01_history/all/history.rb +18 -13
  111. data/tmpsets/set/mod003-02_basic_types/all/base.rb +37 -10
  112. data/tmpsets/set/mod003-02_basic_types/all/rss.rb +17 -22
  113. data/tmpsets/set/mod003-02_basic_types/type/plain_text.rb +5 -2
  114. data/tmpsets/set/mod003-02_basic_types/type/pointer.rb +51 -39
  115. data/tmpsets/set/mod004-03_machines/right/machine_output.rb +10 -6
  116. data/tmpsets/set/mod005-04_settings/abstract/permission.rb +10 -5
  117. data/tmpsets/set/mod005-04_settings/right/structure.rb +47 -1
  118. data/tmpsets/set/mod005-04_settings/self/recent_settings.rb +1 -0
  119. data/tmpsets/set/mod005-04_settings/type/setting.rb +4 -1
  120. data/tmpsets/set/mod006-05_email/all/follow.rb +45 -54
  121. data/tmpsets/set/mod006-05_email/all/notify.rb +88 -73
  122. data/tmpsets/set/mod006-05_email/right/followers.rb +17 -14
  123. data/tmpsets/set/mod006-05_email/self/follow_defaults.rb +22 -18
  124. data/tmpsets/set/mod006-05_email/type/email_template.rb +1 -1
  125. data/tmpsets/set/mod007-05_standard/abstract/attachment.rb +94 -67
  126. data/tmpsets/set/mod007-05_standard/all/account.rb +18 -20
  127. data/tmpsets/set/mod007-05_standard/all/comment.rb +51 -29
  128. data/tmpsets/set/mod007-05_standard/all/error.rb +129 -99
  129. data/tmpsets/set/mod007-05_standard/all/links.rb +27 -26
  130. data/tmpsets/set/mod007-05_standard/all/rich_html/content.rb +115 -103
  131. data/tmpsets/set/mod007-05_standard/all/rich_html/editing.rb +112 -78
  132. data/tmpsets/set/mod007-05_standard/all/rich_html/form.rb +123 -81
  133. data/tmpsets/set/mod007-05_standard/all/rich_html/modal.rb +15 -58
  134. data/tmpsets/set/mod007-05_standard/all/rich_html/toolbar.rb +2 -2
  135. data/tmpsets/set/mod007-05_standard/right/account.rb +71 -75
  136. data/tmpsets/set/mod007-05_standard/right/email.rb +16 -13
  137. data/tmpsets/set/mod007-05_standard/right/password.rb +20 -12
  138. data/tmpsets/set/mod007-05_standard/right/status.rb +2 -2
  139. data/tmpsets/set/mod007-05_standard/right/token.rb +49 -2
  140. data/tmpsets/set/mod007-05_standard/rstar/rules.rb +20 -325
  141. data/tmpsets/set/mod007-05_standard/self/all.rb +16 -10
  142. data/tmpsets/set/mod007-05_standard/self/head.rb +76 -62
  143. data/tmpsets/set/mod007-05_standard/self/search.rb +45 -22
  144. data/tmpsets/set/mod007-05_standard/self/signin.rb +14 -12
  145. data/tmpsets/set/mod007-05_standard/type/cardtype.rb +13 -11
  146. data/tmpsets/set/mod007-05_standard/type/file.rb +1 -1
  147. data/tmpsets/set/mod007-05_standard/type/search_type.rb +3 -2
  148. data/tmpsets/set/mod007-05_standard/type/set.rb +20 -16
  149. data/tmpsets/set/mod007-05_standard/type/signup.rb +19 -25
  150. data/tmpsets/set/mod007-05_standard/type/user.rb +1 -1
  151. data/tmpsets/set/mod008-06_bootstrap/all/bootstrap/helper.rb +1 -1
  152. data/tmpsets/set_pattern/106-type_plus_right.rb +6 -3
  153. metadata +11 -2
@@ -4,11 +4,11 @@ class Card; module Set; module Right; module Status; extend Card::Set
4
4
  include All::Permissions::Accounts
5
5
 
6
6
  def ok_to_update
7
- if is_own_account? && !Auth.always_ok?
7
+ if own_account? && !Auth.always_ok?
8
8
  deny_because you_cant('change the status of your own account')
9
9
  else
10
10
  super
11
- end
11
+ end
12
12
  end
13
13
 
14
14
 
@@ -3,8 +3,55 @@ class Card; module Set; module Right; module Token; extend Card::Set
3
3
  # ~~~~~~~~~~~ above autogenerated; below pulled from /Users/ethan/dev/wagn/gem/card/mod/05_standard/set/right/token.rb ~~~~~~~~~~~
4
4
  include All::Permissions::Accounts
5
5
 
6
- view :raw do |args|
7
- "Private data"
6
+ DURATIONS = 'second|minute|hour|day|week|month|year'
7
+
8
+ card_accessor :expiration
9
+
10
+ view :raw do
11
+ 'Private data'
12
+ end
13
+
14
+ def validate! token
15
+ error =
16
+ case
17
+ when !real? then [:token_not_found, 'no token found']
18
+ when expired? then [:token_expired, 'expired token']
19
+ when content != token then [:incorrect_token, 'token mismatch']
20
+ end
21
+ errors.add *error if error
22
+ end
23
+
24
+ def expired?
25
+ !permanent? && updated_at <= term.ago
26
+ end
27
+
28
+ def permanent?
29
+ term == 'permanent'
30
+ end
31
+
32
+ def used!
33
+ Auth.as_bot { delete! } unless permanent?
34
+ end
35
+
36
+ def term
37
+ @term ||=
38
+ if expiration.present?
39
+ term_from_string expiration
40
+ else
41
+ Card.config.token_expiry
42
+ end
43
+ end
44
+
45
+ def term_from_string string
46
+ string.strip!
47
+ return 'permanent' if string == 'none'
48
+ re_match = /^(\d+)[\.\s]*(#{DURATIONS})s?$/.match(string)
49
+ number, unit = re_match.captures if re_match
50
+ if unit
51
+ number.to_i.send unit
52
+ else
53
+ raise Card::Oops, "illegal expiration value (eg '2 days')"
54
+ end
8
55
  end
9
56
 
10
57
 
@@ -1,322 +1,14 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  class Card; module Set; module Rstar; module Rules; extend Card::Set
3
3
  # ~~~~~~~~~~~ above autogenerated; below pulled from /Users/ethan/dev/wagn/gem/card/mod/05_standard/set/rstar/rules.rb ~~~~~~~~~~~
4
- event :save_recently_edited_settings, before: :extend, on: :save, when: proc{|c| c.is_rule? } do
4
+ event :save_recently_edited_settings,
5
+ before: :extend, on: :save, when: proc { |c| c.is_rule? } do
5
6
  if (recent = Card[:recent_settings])
6
7
  recent.insert_item 0, cardname.right
7
8
  recent.save
8
9
  end
9
10
  end
10
11
 
11
- format :html do
12
-
13
- view :closed_rule, tags: :unknown_ok do |args|
14
- return 'not a rule' if !card.is_rule? #these are helpful for handling non-rule rstar cards until we have real rule sets
15
-
16
- rule_card = find_current_rule_card
17
-
18
- rule_content = !rule_card ? '' : begin
19
- subformat(rule_card)._render_closed_content set_context: card.cardname.trunk_name
20
- end
21
-
22
- cells = [
23
- ["rule-setting",
24
- link_to( card.cardname.tag.sub(/^\*/,''), path(view: :open_rule),
25
- class: 'edit-rule-link slotter', remote: true, rel: 'nofollow' )
26
- ],
27
- ["rule-content",
28
- %{<div class="rule-content-container">
29
- <span class="closed-content content">#{rule_content}</span>
30
- </div> } ],
31
- ["rule-set", (rule_card ? rule_card.trunk.label : '') ],
32
- ]
33
-
34
- extra_css_class = rule_card && !rule_card.new_card? ? 'known-rule' : 'missing-rule'
35
-
36
- %{<tr class="card-slot closed-rule">} +
37
- cells.map do |css_class, content|
38
- %{<td class="rule-cell #{css_class} #{extra_css_class}">#{content}</td>}
39
- end.join("\n") +
40
- '</tr>'
41
- end
42
-
43
-
44
- view :open_rule, tags: :unknown_ok do |args|
45
- return 'not a rule' if !card.is_rule?
46
- current_rule = args[:current_rule]
47
- setting_name = args[:setting_name]
48
-
49
- edit_mode = !params[:success] && card.ok?( ( card.new_card? ? :create : :update ) )
50
- #~~~~~~ handle reloading due to type change
51
- if params[:type_reload] && card_args=params[:card]
52
- if card_args[:name] && card_args[:name].to_name.key != current_rule.key
53
- current_rule = Card.new card_args
54
- else
55
- current_rule = current_rule.refresh
56
- current_rule.assign_attributes card_args
57
- current_rule.include_set_modules
58
- end
59
- edit_mode = true
60
- end
61
-
62
- opts = {
63
- rule_context: card, # determines the set options and the success view
64
- set_context: card.rule_set_name,
65
- }
66
- rule_view = edit_mode ? :edit_rule : :show_rule
67
-
68
- %{
69
- <tr class="card-slot open-rule #{rule_view.to_s.sub '_', '-'}">
70
- <td class="rule-cell" colspan="3">
71
- <div class="rule-setting">
72
- #{ view_link setting_name.sub(/^\*/,''), :closed_rule, class: 'close-rule-link slotter' }
73
- #{ card_link setting_name, text: "all #{setting_name} rules", class: 'setting-link', target: 'wagn_setting' }
74
- </div>
75
-
76
- <div class="alert alert-info rule-instruction">
77
- #{ process_content "{{#{setting_name}+*right+*help|content}}" }
78
- </div>
79
-
80
- <div class="card-body">
81
- #{ subformat( current_rule )._render rule_view, opts }
82
- </div>
83
- </td>
84
- </tr>
85
- }
86
- end
87
-
88
- def default_open_rule_args args
89
- current_rule_card = find_current_rule_card || begin
90
- Card.new name: "#{Card[:all].name}+#{card.rule_user_setting_name}"
91
- end
92
-
93
- args.reverse_merge! current_rule: current_rule_card, setting_name: card.rule_setting_name
94
- end
95
-
96
- view :show_rule, tags: :unknown_ok do |args|
97
- return 'not a rule' if !card.is_rule?
98
-
99
- if !card.new_card?
100
- set = card.rule_set
101
- args[:item] ||= :link
102
- %{
103
- <div class="rule-set">
104
- <label>Applies to</label> #{ card_link set.cardname, text: set.label }:
105
- </div>
106
- #{ _render_core args }
107
- }
108
- else
109
- 'No Current Rule'
110
- end
111
- end
112
-
113
- view :edit_rule, tags: :unknown_ok do |args|
114
- return 'not a rule' if !card.is_rule?
115
- form_args = { url: path(action: :update, no_id: true),
116
- html: {class: "card-form card-rule-form" } }
117
- if args[:remote]
118
- form_args[:remote] = true
119
- form_args[:html][:class] += ' slotter'
120
- end
121
-
122
- form_for card, form_args do |form|
123
- @form = form
124
- %{
125
- #{ hidden_success_formgroup args[:success]}
126
- #{ editor args }
127
- #{ edit_buttons args }
128
- }
129
- end
130
- end
131
-
132
- view :related_edit_rule, view: :edit_rule
133
-
134
- def default_edit_rule_args args
135
- args[:remote] ||= true
136
- args[:rule_context] ||= card
137
- args[:set_context] ||= card.rule_set_name
138
- args[:set_selected] = params[:type_reload] ? card.rule_set_name : false
139
- args[:set_options], args[:fallback_set] = args[:rule_context].set_options
140
-
141
- args[:success] ||= {}
142
- args[:success].reverse_merge!( {
143
- card: args[:rule_context],
144
- id: args[:rule_context].cardname.url_key,
145
- view: 'open_rule',
146
- item: 'view_rule'
147
- })
148
-
149
- args[:delete_button] ||= delete_button args
150
- args[:cancel_button] ||=
151
- begin
152
- cancel_path = path view: ( card.new_card? ? :closed_rule : :open_rule ), success: false
153
- button_tag( 'Cancel', class: 'rule-cancel-button slotter', type: 'button',
154
- href: cancel_path )
155
- end
156
- end
157
-
158
- def default_related_edit_rule_args args
159
- args[:remote] ||= false
160
- args[:success] ||= {
161
- card: args[:parent] || card,
162
- id: (args[:parent] && args[:parent].cardname.url_key) || card.cardname.url_key,
163
- view: :open,
164
- item: nil
165
- }
166
- default_edit_rule_args args
167
- args[:delete_button] = delete_button args, '.card-slot.related-view'
168
- args[:cancel_button] = card_link( args[:success][:id], text: 'Cancel',
169
- class: 'rule-cancel-button btn btn-default', path_opts: {view: args[:success][:view]} )
170
- end
171
-
172
- def delete_button args, slot_selector=nil
173
- if !card.new_card?
174
- b_args = { remote: true, class: 'rule-delete-button slotter', type: 'button' }
175
- b_args['data-slot-selector'] = slot_selector if slot_selector
176
- b_args[:href] = path action: :delete, success: args[:success]
177
- if (fset = args[:fallback_set]) && (fcard = Card.fetch(fset))
178
- b_args['data-confirm']="Deleting will revert to #{card.rule_setting_name} rule for #{fcard.label }"
179
- end
180
- %{<span class="rule-delete-section">#{ button_tag 'Delete', b_args }</span>}
181
- end
182
- end
183
-
184
- # used keys for args:
185
- # :success, :set_selected, :set_options, :rule_context
186
- def editor args
187
- wrap_with( :div, class: 'card-editor' ) do
188
- [
189
- (type_formgroup( args ) if card.right.rule_type_editable),
190
- formgroup( 'rule', content_field( form, args.merge(skip_rev_id: true) ), editor: 'content' ),
191
- set_selection( args )
192
- ]
193
- end
194
- end
195
-
196
-
197
- def type_formgroup args
198
- formgroup 'type', type_field(
199
- href: path(name: args[:success][:card].name, view: args[:success][:view], type_reload: true),
200
- class: 'type-field rule-type-field live-type-field',
201
- 'data-remote' => true
202
- ), editor: 'type'
203
- end
204
-
205
-
206
- def hidden_success_formgroup args
207
- %{
208
- #{ hidden_field_tag 'success[id]', args[:id] || args[:card].name }
209
- #{ hidden_field_tag 'success[view]', args[:view] }
210
- #{ hidden_field_tag 'success[item]', args[:item] }
211
- }
212
- end
213
-
214
- def set_selection args
215
- wrap_with( :div, class: 'row') do
216
- [
217
- set_formgroup( args ),
218
- related_set_formgroup( args)
219
- ]
220
- end
221
- end
222
-
223
- def set_formgroup args
224
- current_set_key = card.new_card? ? Card[:all].cardname.key : card.rule_set_key # (should have a constant for this?)
225
- tag = args[:rule_context].rule_user_setting_name
226
- narrower_rules = []
227
- option_list =
228
- wrap_each_with :li, class: 'radio' do
229
- args[:set_options].map do |set_name, state|
230
-
231
- checked = ( args[:set_selected] == set_name or current_set_key && args[:set_options].length==1 )
232
- is_current = (state == :current)
233
- warning = if narrower_rules.present?
234
- plural = narrower_rules.size > 1 ? 's' : ''
235
- "This rule will not have any effect on this card unless you delete the narrower rule#{plural} "+
236
- "for #{narrower_rules.to_sentence}."
237
- end
238
- if is_current || state == :overwritten
239
- narrower_rules << Card.fetch(set_name).label
240
- narrower_rules.last[0] = narrower_rules.last[0].downcase
241
- end
242
- rule_name = "#{set_name}+#{tag}"
243
- radio_button( :name, rule_name, checked: checked, warning: warning ) + %{
244
- <label class="set-label" #{'current-set-label' if is_current }>
245
- #{ card_link set_name, text: Card.fetch(set_name).label, target: 'wagn_set' }
246
- #{'<em>(current)</em>' if is_current }
247
- #{"<em> #{card_link "#{set_name}+#{card.rule_user_setting_name}", text: "(overwritten)"}</em>" if state == :overwritten }
248
- </label>
249
- }.html_safe
250
- end
251
-
252
- end
253
- formgroup 'set', "<ul>#{ option_list }</ul>", editor: 'set', class: 'col-xs-6'
254
- end
255
-
256
- def related_set_formgroup args
257
- related_sets = args[:set_context] && Card.fetch(args[:set_context]).prototype.related_sets
258
- return '' unless related_sets && related_sets.size > 0
259
- tag = args[:rule_context].rule_user_setting_name
260
- option_list =
261
- wrap_each_with :li, class: 'radio' do
262
- related_sets.map do |set_name, label|
263
- rule_name = "#{set_name}+#{tag}"
264
- rule_card = Card.fetch rule_name, skip_modules: true
265
- radio_button( :name, rule_name) + %{
266
- <label class="set-label">
267
- #{ card_link set_name, text: label, target: 'wagn_set' }
268
- #{"<em> #{card_link "#{set_name}+#{card.rule_user_setting_name}", text: "(exists)"}</em>" if rule_card}
269
- </label>
270
- }.html_safe
271
- end
272
- end
273
- formgroup 'related set', "<ul>#{ option_list }</ul>", editor: 'set', class: 'col-xs-6'
274
- end
275
-
276
- def edit_buttons args
277
- wrap_with( :div, class: 'button-area' ) do
278
- [
279
- args[:delete_button],
280
- button_tag( 'Submit', class: 'rule-submit-button', situation: 'primary' ),
281
- args[:cancel_button]
282
- ]
283
- end
284
- end
285
-
286
- =begin
287
- view :edit_rule2 do |args|
288
-
289
- card_form :update do
290
- [
291
- _optional_render( :type_formgroup, args ),
292
- _optional_render( :content_formgroup, args ),
293
- _optional_render( :set_formgroup, args ),
294
- _optional_render( :button_formgroup, args )
295
- ]
296
- end
297
- end
298
- =end
299
-
300
-
301
-
302
- private
303
-
304
- def find_current_rule_card
305
- # self.card is a POTENTIAL rule; it quacks like a rule but may or may not exist.
306
- # This generates a prototypical member of the POTENTIAL rule's set
307
- # and returns that member's ACTUAL rule for the POTENTIAL rule's setting
308
- if card.new_card?
309
- if setting = card.right
310
- card.set_prototype.rule_card setting.codename, user: card.rule_user
311
- end
312
- else
313
- card
314
- end
315
- end
316
-
317
- end
318
-
319
-
320
12
  def rule_set_key
321
13
  rule_set_name.key
322
14
  end
@@ -345,7 +37,7 @@ def rule_user_setting_name
345
37
  if is_user_rule?
346
38
  "#{rule_user_name}+#{rule_setting_name}"
347
39
  else
348
- rule_setting_name
40
+ rule_setting_name
349
41
  end
350
42
  end
351
43
 
@@ -357,11 +49,13 @@ def rule_user
357
49
  is_user_rule? ? self[-2] : nil
358
50
  end
359
51
 
360
-
361
- #~~~~~~~~~~ determine the set options to which the user can apply the rule.
52
+ # ~~~~~~~~~~ determine the set options to which the user can apply the rule.
362
53
  def set_options
363
-
364
- first = new_card? ? 0 : set_prototype.set_names.index{|s| s.to_name.key == rule_set_key}
54
+ first = if new_card?
55
+ 0
56
+ else
57
+ set_prototype.set_names.index { |s| s.to_name.key == rule_set_key }
58
+ end
365
59
  rule_cnt = 0
366
60
  res = []
367
61
  fallback_set = nil
@@ -369,13 +63,13 @@ def set_options
369
63
  if Card.exists?("#{set_name}+#{rule_user_setting_name}")
370
64
  rule_cnt += 1
371
65
  res << if rule_cnt == 1
372
- [set_name,:current]
66
+ [set_name, :current]
373
67
  else
374
68
  fallback_set ||= set_name
375
- [set_name,:overwritten]
69
+ [set_name, :overwritten]
376
70
  end
377
71
  else
378
- res << (rule_cnt < 1 ? [set_name,:enabled] : [set_name,:disabled])
72
+ res << (rule_cnt < 1 ? [set_name, :enabled] : [set_name, :disabled])
379
73
  end
380
74
  end
381
75
 
@@ -385,13 +79,17 @@ def set_options
385
79
  # end
386
80
  # end
387
81
  # last = res.index{|s| s.to_name.key == cardname.trunk_name.key} || -1
388
- # # note, the -1 can happen with virtual cards because the self set doesn't show up in the set_names. FIXME!!
82
+ # # note, the -1 can happen with virtual cards because the self set doesn't
83
+ # show up in the set_names. FIXME!!
389
84
  # [res[first..last], fallback_set]
390
85
  #
391
86
  # The broadest set should always be the currently applied rule
392
- # (for anything more general, they must explicitly choose to "DELETE" the current one)
393
- # 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
394
- # have the option to create rules based on arbitrary narrower sets, though narrower sets will always apply to whatever prototype we create
87
+ # (for anything more general, they must explicitly choose to 'DELETE' the
88
+ # current one)
89
+ # the narrowest rule should be the one attached to the set being viewed.
90
+ # So, eg, if you're looking at the '*all plus' set, you shouldn't
91
+ # have the option to create rules based on arbitrary narrower sets, though
92
+ # narrower sets will always apply to whatever prototype we create
395
93
 
396
94
  return res, fallback_set
397
95
  end
@@ -405,8 +103,5 @@ def set_prototype
405
103
  end
406
104
 
407
105
 
408
-
409
-
410
-
411
106
  # ~~~~~~~~~~~ below autogenerated; above pulled from /Users/ethan/dev/wagn/gem/card/mod/05_standard/set/rstar/rules.rb ~~~~~~~~~~~
412
107
  end;end;end;end;