card 1.16.15 → 1.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/config/initializers/recaptcha.rb +21 -4
- data/db/migrate_core_cards/20130823192433_add_style_cards.rb +1 -1
- data/db/migrate_core_cards/20140512155840_add_script_cards.rb +1 -1
- data/db/migrate_core_cards/20140629222005_add_email_cards.rb +2 -2
- data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +1 -1
- data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +1 -1
- data/db/migrate_core_cards/20150610180019_add_recaptcha_key_and_admin_info_cards.rb +63 -0
- data/db/migrate_core_cards/20150724123438_update_file_and_image_cards.rb +1 -1
- data/db/migrate_core_cards/20150903130006_attachment_upload_cards.rb +1 -1
- data/db/schema.rb +1 -1
- data/db/seed/new/card_actions.yml +602 -394
- data/db/seed/new/card_acts.yml +595 -1
- data/db/seed/new/card_changes.yml +26282 -10262
- data/db/seed/new/card_references.yml +1252 -1084
- data/db/seed/new/cards.yml +1899 -1423
- data/db/seed/test/fixtures/card_actions.yml +1653 -1413
- data/db/seed/test/fixtures/card_acts.yml +1063 -445
- data/db/seed/test/fixtures/card_changes.yml +29674 -13637
- data/db/seed/test/fixtures/card_references.yml +1976 -1815
- data/db/seed/test/fixtures/cards.yml +3194 -2719
- data/lib/card.rb +14 -13
- data/lib/card/auth.rb +10 -6
- data/lib/card/cache.rb +58 -120
- data/lib/card/cache/persistent.rb +50 -0
- data/lib/card/cache/temporary.rb +38 -0
- data/lib/card/chunk.rb +34 -25
- data/lib/card/content.rb +3 -3
- data/lib/card/env.rb +3 -0
- data/lib/card/format.rb +56 -53
- data/lib/card/migration.rb +6 -2
- data/lib/card/name.rb +9 -1
- data/lib/card/query.rb +1 -1
- data/lib/card/reference.rb +17 -11
- data/lib/card/set.rb +1 -1
- data/lib/card/subcards.rb +6 -6
- data/lib/card/view_cache.rb +45 -28
- data/lib/generators/card/migration/templates/card_migration.erb +1 -2
- data/mod/01_core/chunk/include.rb +71 -48
- data/mod/01_core/chunk/link.rb +6 -3
- data/mod/01_core/chunk/query_reference.rb +38 -29
- data/mod/01_core/chunk/reference.rb +23 -24
- data/mod/01_core/set/all/collection.rb +1 -1
- data/mod/01_core/set/all/fetch.rb +39 -12
- data/mod/01_core/set/all/permissions.rb +2 -4
- data/mod/01_core/set/all/references.rb +50 -75
- data/mod/01_core/set/all/rules.rb +19 -18
- data/mod/01_core/set/all/subcards.rb +1 -1
- data/mod/01_core/set/all/templating.rb +31 -88
- data/mod/01_core/set/all/tracked_attributes.rb +7 -14
- data/mod/01_core/set/all/utils.rb +77 -66
- data/mod/01_core/set_pattern/07_type_plus_right.rb +6 -3
- data/mod/01_core/spec/set/all/fetch_spec.rb +148 -96
- data/mod/01_core/spec/set/all/templating_spec.rb +49 -40
- data/mod/01_core/spec/set/all/trash_spec.rb +1 -1
- data/mod/01_history/set/all/actions.rb +1 -1
- data/mod/02_basic_types/set/all/base.rb +13 -7
- data/mod/02_basic_types/set/all/rss.rb +17 -22
- data/mod/02_basic_types/set/type/plain_text.rb +5 -2
- data/mod/02_basic_types/spec/set/all/base_spec.rb +1 -0
- data/mod/02_basic_types/spec/set/all/rss_spec.rb +7 -6
- data/mod/03_machines/lib/javascript/wagn.js.coffee +22 -9
- data/mod/03_machines/set/right/machine_output.rb +1 -1
- data/mod/04_settings/lib/card/setting.rb +45 -31
- data/mod/04_settings/set/right/structure.rb +47 -1
- data/mod/04_settings/set/self/default_html_view.rb +2 -0
- data/mod/04_settings/set/self/follow_fields.rb +2 -0
- data/mod/04_settings/set/self/recent_settings.rb +1 -1
- data/mod/05_standard/file/favicon/image-icon.png +0 -0
- data/mod/05_standard/file/favicon/image-large.png +0 -0
- data/mod/05_standard/file/favicon/image-medium.png +0 -0
- data/mod/05_standard/file/favicon/image-original.png +0 -0
- data/mod/05_standard/file/favicon/image-small.png +0 -0
- data/mod/05_standard/set/all/links.rb +27 -26
- data/mod/05_standard/set/all/rich_html/editing.rb +1 -1
- data/mod/05_standard/set/all/rich_html/toolbar.rb +1 -1
- data/mod/05_standard/set/rstar/rules.rb +20 -325
- data/mod/05_standard/set/rstar/rules_editor.rb +362 -0
- data/mod/05_standard/set/self/admin_info.rb +82 -0
- data/mod/05_standard/set/self/all.rb +16 -10
- data/mod/05_standard/set/self/head.rb +20 -19
- data/mod/05_standard/set/type/signup.rb +0 -1
- data/mod/05_standard/spec/set/all/account_spec.rb +44 -43
- data/mod/05_standard/spec/set/right/account_spec.rb +4 -2
- data/mod/05_standard/spec/set/type/search_type_spec.rb +8 -0
- data/mod/05_standard/spec/set/type/signup_spec.rb +24 -17
- data/mod/06_bootstrap/set/all/bootstrap/helper.rb +1 -1
- data/spec/lib/card/cache_spec.rb +64 -70
- data/spec/lib/card/content_spec.rb +236 -150
- data/spec/lib/card/reference_spec.rb +22 -38
- data/spec/lib/card/subcards_spec.rb +38 -0
- data/spec/lib/card/view_cache_spec.rb +8 -0
- data/spec/spec_helper.rb +1 -1
- data/tmpsets/set/mod001-01_core/all/collection.rb +77 -74
- data/tmpsets/set/mod001-01_core/all/content.rb +14 -16
- data/tmpsets/set/mod001-01_core/all/fetch.rb +137 -110
- data/tmpsets/set/mod001-01_core/all/name.rb +58 -40
- data/tmpsets/set/mod001-01_core/all/pattern.rb +12 -11
- data/tmpsets/set/mod001-01_core/all/permissions.rb +125 -117
- data/tmpsets/set/mod001-01_core/all/phases.rb +2 -1
- data/tmpsets/set/mod001-01_core/all/references.rb +52 -77
- data/tmpsets/set/mod001-01_core/all/rules.rb +47 -53
- data/tmpsets/set/mod001-01_core/all/templating.rb +31 -87
- data/tmpsets/set/mod001-01_core/all/tracked_attributes.rb +12 -21
- data/tmpsets/set/mod001-01_core/all/trash.rb +4 -1
- data/tmpsets/set/mod001-01_core/all/type.rb +23 -21
- data/tmpsets/set/mod001-01_core/all/utils.rb +80 -64
- data/tmpsets/set/mod002-01_history/all/actions.rb +20 -16
- data/tmpsets/set/mod002-01_history/all/history.rb +18 -13
- data/tmpsets/set/mod003-02_basic_types/all/base.rb +37 -10
- data/tmpsets/set/mod003-02_basic_types/all/rss.rb +17 -22
- data/tmpsets/set/mod003-02_basic_types/type/plain_text.rb +5 -2
- data/tmpsets/set/mod003-02_basic_types/type/pointer.rb +51 -39
- data/tmpsets/set/mod004-03_machines/right/machine_output.rb +10 -6
- data/tmpsets/set/mod005-04_settings/abstract/permission.rb +10 -5
- data/tmpsets/set/mod005-04_settings/right/structure.rb +47 -1
- data/tmpsets/set/mod005-04_settings/self/recent_settings.rb +1 -0
- data/tmpsets/set/mod005-04_settings/type/setting.rb +4 -1
- data/tmpsets/set/mod006-05_email/all/follow.rb +45 -54
- data/tmpsets/set/mod006-05_email/all/notify.rb +88 -73
- data/tmpsets/set/mod006-05_email/right/followers.rb +17 -14
- data/tmpsets/set/mod006-05_email/self/follow_defaults.rb +22 -18
- data/tmpsets/set/mod006-05_email/type/email_template.rb +1 -1
- data/tmpsets/set/mod007-05_standard/abstract/attachment.rb +94 -67
- data/tmpsets/set/mod007-05_standard/all/account.rb +18 -20
- data/tmpsets/set/mod007-05_standard/all/comment.rb +51 -29
- data/tmpsets/set/mod007-05_standard/all/error.rb +129 -99
- data/tmpsets/set/mod007-05_standard/all/links.rb +27 -26
- data/tmpsets/set/mod007-05_standard/all/rich_html/content.rb +115 -103
- data/tmpsets/set/mod007-05_standard/all/rich_html/editing.rb +112 -78
- data/tmpsets/set/mod007-05_standard/all/rich_html/form.rb +123 -81
- data/tmpsets/set/mod007-05_standard/all/rich_html/modal.rb +15 -58
- data/tmpsets/set/mod007-05_standard/all/rich_html/toolbar.rb +2 -2
- data/tmpsets/set/mod007-05_standard/right/account.rb +71 -75
- data/tmpsets/set/mod007-05_standard/right/email.rb +16 -13
- data/tmpsets/set/mod007-05_standard/right/password.rb +20 -12
- data/tmpsets/set/mod007-05_standard/right/status.rb +2 -2
- data/tmpsets/set/mod007-05_standard/right/token.rb +49 -2
- data/tmpsets/set/mod007-05_standard/rstar/rules.rb +20 -325
- data/tmpsets/set/mod007-05_standard/self/all.rb +16 -10
- data/tmpsets/set/mod007-05_standard/self/head.rb +76 -62
- data/tmpsets/set/mod007-05_standard/self/search.rb +45 -22
- data/tmpsets/set/mod007-05_standard/self/signin.rb +14 -12
- data/tmpsets/set/mod007-05_standard/type/cardtype.rb +13 -11
- data/tmpsets/set/mod007-05_standard/type/file.rb +1 -1
- data/tmpsets/set/mod007-05_standard/type/search_type.rb +3 -2
- data/tmpsets/set/mod007-05_standard/type/set.rb +20 -16
- data/tmpsets/set/mod007-05_standard/type/signup.rb +19 -25
- data/tmpsets/set/mod007-05_standard/type/user.rb +1 -1
- data/tmpsets/set/mod008-06_bootstrap/all/bootstrap/helper.rb +1 -1
- data/tmpsets/set_pattern/106-type_plus_right.rb +6 -3
- 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
|
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
|
-
|
7
|
-
|
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,
|
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
|
-
|
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
|
-
|
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
|
66
|
+
[set_name, :current]
|
373
67
|
else
|
374
68
|
fallback_set ||= set_name
|
375
|
-
[set_name
|
69
|
+
[set_name, :overwritten]
|
376
70
|
end
|
377
71
|
else
|
378
|
-
res << (rule_cnt < 1 ? [set_name
|
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
|
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
|
393
|
-
#
|
394
|
-
#
|
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;
|