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
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
format :rss do
|
3
|
-
def raw_feed_items
|
3
|
+
def raw_feed_items _args
|
4
4
|
[card]
|
5
5
|
end
|
6
6
|
end
|
@@ -8,3 +8,49 @@ end
|
|
8
8
|
format :html do
|
9
9
|
include AddHelp::HtmlFormat
|
10
10
|
end
|
11
|
+
|
12
|
+
event :update_structurees_references,
|
13
|
+
before: :subsequent,
|
14
|
+
when: proc { |c| c.db_content_changed? || c.action == :delete } do
|
15
|
+
return unless (statement = structuree_statement)
|
16
|
+
Auth.as_bot do
|
17
|
+
Card::Query.run(statement).each(&:update_references)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
event :update_structurees_type, after: :store, changed: :type_id,
|
22
|
+
when: proc { |c| c.assigns_type? } do
|
23
|
+
update_structurees type_id: type_id
|
24
|
+
end
|
25
|
+
|
26
|
+
def structuree_names
|
27
|
+
if (wql = structuree_statement)
|
28
|
+
Auth.as_bot do
|
29
|
+
Card::Query.run(wql.merge return: :name)
|
30
|
+
end
|
31
|
+
else
|
32
|
+
[]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def update_structurees args
|
37
|
+
# note that this is not smart about overriding templating rules
|
38
|
+
# for example, if someone were to change the type of a
|
39
|
+
# +*right+*structure rule that was overridden
|
40
|
+
# by a +*type plus right+*structure rule, the override would not be respected.
|
41
|
+
|
42
|
+
statement = structuree_statement
|
43
|
+
return unless statement
|
44
|
+
Auth.as_bot do
|
45
|
+
statement[:return] = :id
|
46
|
+
Card::Query.run(statement).each_slice(100) do |id_batch|
|
47
|
+
Card.where(id: id_batch).update_all args
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def structuree_statement
|
53
|
+
set_card = trunk
|
54
|
+
return unless set_card.type_id == SetID
|
55
|
+
set_card.get_query
|
56
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,13 +1,12 @@
|
|
1
1
|
|
2
2
|
|
3
3
|
format do
|
4
|
-
|
5
4
|
# link is called by web_link, card_link, and view_link
|
6
5
|
# (and is overridden in other formats)
|
7
|
-
def link_to text, href,
|
6
|
+
def link_to text, href, _opts={}
|
8
7
|
href = interpret_href href
|
9
8
|
|
10
|
-
if text
|
9
|
+
if text && href != text
|
11
10
|
"#{text}[#{href}]"
|
12
11
|
else
|
13
12
|
href
|
@@ -15,15 +14,14 @@ format do
|
|
15
14
|
end
|
16
15
|
|
17
16
|
# link to url, view, card or related card
|
18
|
-
#
|
19
17
|
def smart_link link_text, target, html_args={}
|
20
18
|
if (view = target.delete(:view))
|
21
19
|
view_link link_text, view, html_args.merge(path_opts: target)
|
22
20
|
elsif (page = target.delete(:card))
|
23
21
|
card_link page, html_args.merge(path_opts: target, text: link_text)
|
24
22
|
elsif target[:related]
|
25
|
-
if target[:related].
|
26
|
-
target[:related] = {name: "+#{target[:related]}"}
|
23
|
+
if target[:related].is_a? String
|
24
|
+
target[:related] = { name: "+#{target[:related]}" }
|
27
25
|
end
|
28
26
|
view_link link_text, :related, html_args.merge(path_opts: target)
|
29
27
|
elsif target[:web]
|
@@ -32,16 +30,16 @@ format do
|
|
32
30
|
end
|
33
31
|
end
|
34
32
|
|
35
|
-
|
36
33
|
# link to a specific url or path
|
37
34
|
def web_link href, opts={}
|
38
35
|
text = opts.delete(:text) || href
|
39
|
-
new_class =
|
40
|
-
|
41
|
-
when /^
|
42
|
-
when /^
|
36
|
+
new_class =
|
37
|
+
case href
|
38
|
+
when /^https?\:/ then 'external-link'
|
39
|
+
when /^mailto\:/ then 'email-link'
|
40
|
+
when /^([a-zA-Z][\-+\.a-zA-Z\d]*):/ then $1 + '-link'
|
43
41
|
when /^\//
|
44
|
-
href = internal_url href[1..-1]
|
42
|
+
(href = internal_url href[1..-1]) ; 'internal-link'
|
45
43
|
else
|
46
44
|
return card_link href, opts
|
47
45
|
end
|
@@ -52,17 +50,19 @@ format do
|
|
52
50
|
|
53
51
|
# link to a specific card
|
54
52
|
def card_link name_or_card, opts={}
|
55
|
-
name =
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
53
|
+
name =
|
54
|
+
case name_or_card
|
55
|
+
when Symbol then Card.fetch(name_or_card, skip_modules: true).cardname
|
56
|
+
when Card then name_or_card.cardname
|
57
|
+
else name_or_card
|
58
|
+
end
|
60
59
|
text = (opts.delete(:text) || name).to_name.to_show @context_names
|
61
60
|
|
62
|
-
path_opts = opts.delete(
|
63
|
-
path_opts[:name
|
64
|
-
path_opts[:known] =
|
65
|
-
|
61
|
+
path_opts = opts.delete(:path_opts) || {}
|
62
|
+
path_opts[:name] = name
|
63
|
+
path_opts[:known] =
|
64
|
+
opts[:known].nil? ? Card.known?(name) : opts.delete(:known)
|
65
|
+
add_class opts, (path_opts[:known] ? 'known-card' : 'wanted-card')
|
66
66
|
link_to text, path_opts, opts
|
67
67
|
end
|
68
68
|
|
@@ -78,11 +78,12 @@ format do
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def related_link name_or_card, opts={}
|
81
|
-
name =
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
81
|
+
name =
|
82
|
+
case name_or_card
|
83
|
+
when Symbol then Card.fetch(name_or_card, skip_modules: true).cardname
|
84
|
+
when Card then name_or_card.cardname
|
85
|
+
else name_or_card
|
86
|
+
end
|
86
87
|
opts[:path_opts] ||= {view: :related}
|
87
88
|
opts[:path_opts][:related] = {name: "+#{name}"}
|
88
89
|
opts[:path_opts][:related].merge! opts[:related_opts] if opts[:related_opts]
|
@@ -231,7 +231,7 @@ format :html do
|
|
231
231
|
# with_inclusion_mode :edit do
|
232
232
|
nested_fields(args).map do |chunk|
|
233
233
|
nest Card.fetch("#{chunk.referee_name}+*self"),
|
234
|
-
view: :titled, rule_view: view,
|
234
|
+
view: :titled, title: chunk.referee_name, rule_view: view,
|
235
235
|
optional_set_label: :hide,
|
236
236
|
optional_rule_navbar: :show
|
237
237
|
end
|
@@ -1,319 +1,11 @@
|
|
1
|
-
event :save_recently_edited_settings,
|
1
|
+
event :save_recently_edited_settings,
|
2
|
+
before: :extend, on: :save, when: proc { |c| c.is_rule? } do
|
2
3
|
if (recent = Card[:recent_settings])
|
3
4
|
recent.insert_item 0, cardname.right
|
4
5
|
recent.save
|
5
6
|
end
|
6
7
|
end
|
7
8
|
|
8
|
-
format :html do
|
9
|
-
|
10
|
-
view :closed_rule, tags: :unknown_ok do |args|
|
11
|
-
return 'not a rule' if !card.is_rule? #these are helpful for handling non-rule rstar cards until we have real rule sets
|
12
|
-
|
13
|
-
rule_card = find_current_rule_card
|
14
|
-
|
15
|
-
rule_content = !rule_card ? '' : begin
|
16
|
-
subformat(rule_card)._render_closed_content set_context: card.cardname.trunk_name
|
17
|
-
end
|
18
|
-
|
19
|
-
cells = [
|
20
|
-
["rule-setting",
|
21
|
-
link_to( card.cardname.tag.sub(/^\*/,''), path(view: :open_rule),
|
22
|
-
class: 'edit-rule-link slotter', remote: true, rel: 'nofollow' )
|
23
|
-
],
|
24
|
-
["rule-content",
|
25
|
-
%{<div class="rule-content-container">
|
26
|
-
<span class="closed-content content">#{rule_content}</span>
|
27
|
-
</div> } ],
|
28
|
-
["rule-set", (rule_card ? rule_card.trunk.label : '') ],
|
29
|
-
]
|
30
|
-
|
31
|
-
extra_css_class = rule_card && !rule_card.new_card? ? 'known-rule' : 'missing-rule'
|
32
|
-
|
33
|
-
%{<tr class="card-slot closed-rule">} +
|
34
|
-
cells.map do |css_class, content|
|
35
|
-
%{<td class="rule-cell #{css_class} #{extra_css_class}">#{content}</td>}
|
36
|
-
end.join("\n") +
|
37
|
-
'</tr>'
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
|
-
view :open_rule, tags: :unknown_ok do |args|
|
42
|
-
return 'not a rule' if !card.is_rule?
|
43
|
-
current_rule = args[:current_rule]
|
44
|
-
setting_name = args[:setting_name]
|
45
|
-
|
46
|
-
edit_mode = !params[:success] && card.ok?( ( card.new_card? ? :create : :update ) )
|
47
|
-
#~~~~~~ handle reloading due to type change
|
48
|
-
if params[:type_reload] && card_args=params[:card]
|
49
|
-
if card_args[:name] && card_args[:name].to_name.key != current_rule.key
|
50
|
-
current_rule = Card.new card_args
|
51
|
-
else
|
52
|
-
current_rule = current_rule.refresh
|
53
|
-
current_rule.assign_attributes card_args
|
54
|
-
current_rule.include_set_modules
|
55
|
-
end
|
56
|
-
edit_mode = true
|
57
|
-
end
|
58
|
-
|
59
|
-
opts = {
|
60
|
-
rule_context: card, # determines the set options and the success view
|
61
|
-
set_context: card.rule_set_name,
|
62
|
-
}
|
63
|
-
rule_view = edit_mode ? :edit_rule : :show_rule
|
64
|
-
|
65
|
-
%{
|
66
|
-
<tr class="card-slot open-rule #{rule_view.to_s.sub '_', '-'}">
|
67
|
-
<td class="rule-cell" colspan="3">
|
68
|
-
<div class="rule-setting">
|
69
|
-
#{ view_link setting_name.sub(/^\*/,''), :closed_rule, class: 'close-rule-link slotter' }
|
70
|
-
#{ card_link setting_name, text: "all #{setting_name} rules", class: 'setting-link', target: 'wagn_setting' }
|
71
|
-
</div>
|
72
|
-
|
73
|
-
<div class="alert alert-info rule-instruction">
|
74
|
-
#{ process_content "{{#{setting_name}+*right+*help|content}}" }
|
75
|
-
</div>
|
76
|
-
|
77
|
-
<div class="card-body">
|
78
|
-
#{ subformat( current_rule )._render rule_view, opts }
|
79
|
-
</div>
|
80
|
-
</td>
|
81
|
-
</tr>
|
82
|
-
}
|
83
|
-
end
|
84
|
-
|
85
|
-
def default_open_rule_args args
|
86
|
-
current_rule_card = find_current_rule_card || begin
|
87
|
-
Card.new name: "#{Card[:all].name}+#{card.rule_user_setting_name}"
|
88
|
-
end
|
89
|
-
|
90
|
-
args.reverse_merge! current_rule: current_rule_card, setting_name: card.rule_setting_name
|
91
|
-
end
|
92
|
-
|
93
|
-
view :show_rule, tags: :unknown_ok do |args|
|
94
|
-
return 'not a rule' if !card.is_rule?
|
95
|
-
|
96
|
-
if !card.new_card?
|
97
|
-
set = card.rule_set
|
98
|
-
args[:item] ||= :link
|
99
|
-
%{
|
100
|
-
<div class="rule-set">
|
101
|
-
<label>Applies to</label> #{ card_link set.cardname, text: set.label }:
|
102
|
-
</div>
|
103
|
-
#{ _render_core args }
|
104
|
-
}
|
105
|
-
else
|
106
|
-
'No Current Rule'
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
view :edit_rule, tags: :unknown_ok do |args|
|
111
|
-
return 'not a rule' if !card.is_rule?
|
112
|
-
form_args = { url: path(action: :update, no_id: true),
|
113
|
-
html: {class: "card-form card-rule-form" } }
|
114
|
-
if args[:remote]
|
115
|
-
form_args[:remote] = true
|
116
|
-
form_args[:html][:class] += ' slotter'
|
117
|
-
end
|
118
|
-
|
119
|
-
form_for card, form_args do |form|
|
120
|
-
@form = form
|
121
|
-
%{
|
122
|
-
#{ hidden_success_formgroup args[:success]}
|
123
|
-
#{ editor args }
|
124
|
-
#{ edit_buttons args }
|
125
|
-
}
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
view :related_edit_rule, view: :edit_rule
|
130
|
-
|
131
|
-
def default_edit_rule_args args
|
132
|
-
args[:remote] ||= true
|
133
|
-
args[:rule_context] ||= card
|
134
|
-
args[:set_context] ||= card.rule_set_name
|
135
|
-
args[:set_selected] = params[:type_reload] ? card.rule_set_name : false
|
136
|
-
args[:set_options], args[:fallback_set] = args[:rule_context].set_options
|
137
|
-
|
138
|
-
args[:success] ||= {}
|
139
|
-
args[:success].reverse_merge!( {
|
140
|
-
card: args[:rule_context],
|
141
|
-
id: args[:rule_context].cardname.url_key,
|
142
|
-
view: 'open_rule',
|
143
|
-
item: 'view_rule'
|
144
|
-
})
|
145
|
-
|
146
|
-
args[:delete_button] ||= delete_button args
|
147
|
-
args[:cancel_button] ||=
|
148
|
-
begin
|
149
|
-
cancel_view = card.new_card? ? :closed_rule : :open_rule
|
150
|
-
cancel_button class: 'rule-cancel-button',
|
151
|
-
href: path(view: cancel_view, success: false)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
def default_related_edit_rule_args args
|
156
|
-
args[:remote] ||= false
|
157
|
-
args[:success] ||= {
|
158
|
-
card: args[:parent] || card,
|
159
|
-
id: (args[:parent] && args[:parent].cardname.url_key) || card.cardname.url_key,
|
160
|
-
view: :open,
|
161
|
-
item: nil
|
162
|
-
}
|
163
|
-
default_edit_rule_args args
|
164
|
-
args[:delete_button] = delete_button args, '.card-slot.related-view'
|
165
|
-
args[:cancel_button] = card_link( args[:success][:id], text: 'Cancel',
|
166
|
-
class: 'rule-cancel-button btn btn-default', path_opts: {view: args[:success][:view]} )
|
167
|
-
end
|
168
|
-
|
169
|
-
def delete_button args, slot_selector=nil
|
170
|
-
if !card.new_card?
|
171
|
-
b_args = { remote: true, class: 'rule-delete-button slotter', type: 'button' }
|
172
|
-
b_args['data-slot-selector'] = slot_selector if slot_selector
|
173
|
-
b_args[:href] = path action: :delete, success: args[:success]
|
174
|
-
if (fset = args[:fallback_set]) && (fcard = Card.fetch(fset))
|
175
|
-
b_args['data-confirm']="Deleting will revert to #{card.rule_setting_name} rule for #{fcard.label }"
|
176
|
-
end
|
177
|
-
%{<span class="rule-delete-section">#{ button_tag 'Delete', b_args }</span>}
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
# used keys for args:
|
182
|
-
# :success, :set_selected, :set_options, :rule_context
|
183
|
-
def editor args
|
184
|
-
wrap_with( :div, class: 'card-editor' ) do
|
185
|
-
[
|
186
|
-
(type_formgroup( args ) if card.right.rule_type_editable),
|
187
|
-
formgroup( 'rule', content_field( form, args.merge(skip_rev_id: true) ), editor: 'content' ),
|
188
|
-
set_selection( args )
|
189
|
-
]
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
|
194
|
-
def type_formgroup args
|
195
|
-
formgroup 'type', type_field(
|
196
|
-
href: path(name: args[:success][:card].name, view: args[:success][:view], type_reload: true),
|
197
|
-
class: 'type-field rule-type-field live-type-field',
|
198
|
-
'data-remote' => true
|
199
|
-
), editor: 'type'
|
200
|
-
end
|
201
|
-
|
202
|
-
|
203
|
-
def hidden_success_formgroup args
|
204
|
-
%{
|
205
|
-
#{ hidden_field_tag 'success[id]', args[:id] || args[:card].name }
|
206
|
-
#{ hidden_field_tag 'success[view]', args[:view] }
|
207
|
-
#{ hidden_field_tag 'success[item]', args[:item] }
|
208
|
-
}
|
209
|
-
end
|
210
|
-
|
211
|
-
def set_selection args
|
212
|
-
wrap_with( :div, class: 'row') do
|
213
|
-
[
|
214
|
-
set_formgroup( args ),
|
215
|
-
related_set_formgroup( args)
|
216
|
-
]
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
def set_formgroup args
|
221
|
-
current_set_key = card.new_card? ? Card[:all].cardname.key : card.rule_set_key # (should have a constant for this?)
|
222
|
-
tag = args[:rule_context].rule_user_setting_name
|
223
|
-
narrower_rules = []
|
224
|
-
option_list =
|
225
|
-
wrap_each_with :li, class: 'radio' do
|
226
|
-
args[:set_options].map do |set_name, state|
|
227
|
-
|
228
|
-
checked = ( args[:set_selected] == set_name or current_set_key && args[:set_options].length==1 )
|
229
|
-
is_current = (state == :current)
|
230
|
-
warning = if narrower_rules.present?
|
231
|
-
plural = narrower_rules.size > 1 ? 's' : ''
|
232
|
-
"This rule will not have any effect on this card unless you delete the narrower rule#{plural} "+
|
233
|
-
"for #{narrower_rules.to_sentence}."
|
234
|
-
end
|
235
|
-
if is_current || state == :overwritten
|
236
|
-
narrower_rules << Card.fetch(set_name).label
|
237
|
-
narrower_rules.last[0] = narrower_rules.last[0].downcase
|
238
|
-
end
|
239
|
-
rule_name = "#{set_name}+#{tag}"
|
240
|
-
radio_button( :name, rule_name, checked: checked, warning: warning ) + %{
|
241
|
-
<label class="set-label" #{'current-set-label' if is_current }>
|
242
|
-
#{ card_link set_name, text: Card.fetch(set_name).label, target: 'wagn_set' }
|
243
|
-
#{'<em>(current)</em>' if is_current }
|
244
|
-
#{"<em> #{card_link "#{set_name}+#{card.rule_user_setting_name}", text: "(overwritten)"}</em>" if state == :overwritten }
|
245
|
-
</label>
|
246
|
-
}.html_safe
|
247
|
-
end
|
248
|
-
|
249
|
-
end
|
250
|
-
formgroup 'set', "<ul>#{ option_list }</ul>", editor: 'set', class: 'col-xs-6'
|
251
|
-
end
|
252
|
-
|
253
|
-
def related_set_formgroup args
|
254
|
-
related_sets = args[:set_context] && Card.fetch(args[:set_context]).prototype.related_sets
|
255
|
-
return '' unless related_sets && related_sets.size > 0
|
256
|
-
tag = args[:rule_context].rule_user_setting_name
|
257
|
-
option_list =
|
258
|
-
wrap_each_with :li, class: 'radio' do
|
259
|
-
related_sets.map do |set_name, label|
|
260
|
-
rule_name = "#{set_name}+#{tag}"
|
261
|
-
rule_card = Card.fetch rule_name, skip_modules: true
|
262
|
-
radio_button( :name, rule_name) + %{
|
263
|
-
<label class="set-label">
|
264
|
-
#{ card_link set_name, text: label, target: 'wagn_set' }
|
265
|
-
#{"<em> #{card_link "#{set_name}+#{card.rule_user_setting_name}", text: "(exists)"}</em>" if rule_card}
|
266
|
-
</label>
|
267
|
-
}.html_safe
|
268
|
-
end
|
269
|
-
end
|
270
|
-
formgroup 'related set', "<ul>#{ option_list }</ul>", editor: 'set', class: 'col-xs-6'
|
271
|
-
end
|
272
|
-
|
273
|
-
def edit_buttons args
|
274
|
-
wrap_with( :div, class: 'button-area' ) do
|
275
|
-
[
|
276
|
-
args[:delete_button],
|
277
|
-
button_tag( 'Submit', class: 'rule-submit-button', situation: 'primary' ),
|
278
|
-
args[:cancel_button]
|
279
|
-
]
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
=begin
|
284
|
-
view :edit_rule2 do |args|
|
285
|
-
|
286
|
-
card_form :update do
|
287
|
-
[
|
288
|
-
_optional_render( :type_formgroup, args ),
|
289
|
-
_optional_render( :content_formgroup, args ),
|
290
|
-
_optional_render( :set_formgroup, args ),
|
291
|
-
_optional_render( :button_formgroup, args )
|
292
|
-
]
|
293
|
-
end
|
294
|
-
end
|
295
|
-
=end
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
private
|
300
|
-
|
301
|
-
def find_current_rule_card
|
302
|
-
# self.card is a POTENTIAL rule; it quacks like a rule but may or may not exist.
|
303
|
-
# This generates a prototypical member of the POTENTIAL rule's set
|
304
|
-
# and returns that member's ACTUAL rule for the POTENTIAL rule's setting
|
305
|
-
if card.new_card?
|
306
|
-
if setting = card.right
|
307
|
-
card.set_prototype.rule_card setting.codename, user: card.rule_user
|
308
|
-
end
|
309
|
-
else
|
310
|
-
card
|
311
|
-
end
|
312
|
-
end
|
313
|
-
|
314
|
-
end
|
315
|
-
|
316
|
-
|
317
9
|
def rule_set_key
|
318
10
|
rule_set_name.key
|
319
11
|
end
|
@@ -342,7 +34,7 @@ def rule_user_setting_name
|
|
342
34
|
if is_user_rule?
|
343
35
|
"#{rule_user_name}+#{rule_setting_name}"
|
344
36
|
else
|
345
|
-
|
37
|
+
rule_setting_name
|
346
38
|
end
|
347
39
|
end
|
348
40
|
|
@@ -354,11 +46,13 @@ def rule_user
|
|
354
46
|
is_user_rule? ? self[-2] : nil
|
355
47
|
end
|
356
48
|
|
357
|
-
|
358
|
-
#~~~~~~~~~~ determine the set options to which the user can apply the rule.
|
49
|
+
# ~~~~~~~~~~ determine the set options to which the user can apply the rule.
|
359
50
|
def set_options
|
360
|
-
|
361
|
-
|
51
|
+
first = if new_card?
|
52
|
+
0
|
53
|
+
else
|
54
|
+
set_prototype.set_names.index { |s| s.to_name.key == rule_set_key }
|
55
|
+
end
|
362
56
|
rule_cnt = 0
|
363
57
|
res = []
|
364
58
|
fallback_set = nil
|
@@ -366,13 +60,13 @@ def set_options
|
|
366
60
|
if Card.exists?("#{set_name}+#{rule_user_setting_name}")
|
367
61
|
rule_cnt += 1
|
368
62
|
res << if rule_cnt == 1
|
369
|
-
[set_name
|
63
|
+
[set_name, :current]
|
370
64
|
else
|
371
65
|
fallback_set ||= set_name
|
372
|
-
[set_name
|
66
|
+
[set_name, :overwritten]
|
373
67
|
end
|
374
68
|
else
|
375
|
-
res << (rule_cnt < 1 ? [set_name
|
69
|
+
res << (rule_cnt < 1 ? [set_name, :enabled] : [set_name, :disabled])
|
376
70
|
end
|
377
71
|
end
|
378
72
|
|
@@ -382,13 +76,17 @@ def set_options
|
|
382
76
|
# end
|
383
77
|
# end
|
384
78
|
# last = res.index{|s| s.to_name.key == cardname.trunk_name.key} || -1
|
385
|
-
# # note, the -1 can happen with virtual cards because the self set doesn't
|
79
|
+
# # note, the -1 can happen with virtual cards because the self set doesn't
|
80
|
+
# show up in the set_names. FIXME!!
|
386
81
|
# [res[first..last], fallback_set]
|
387
82
|
#
|
388
83
|
# The broadest set should always be the currently applied rule
|
389
|
-
# (for anything more general, they must explicitly choose to
|
390
|
-
#
|
391
|
-
#
|
84
|
+
# (for anything more general, they must explicitly choose to 'DELETE' the
|
85
|
+
# current one)
|
86
|
+
# the narrowest rule should be the one attached to the set being viewed.
|
87
|
+
# So, eg, if you're looking at the '*all plus' set, you shouldn't
|
88
|
+
# have the option to create rules based on arbitrary narrower sets, though
|
89
|
+
# narrower sets will always apply to whatever prototype we create
|
392
90
|
|
393
91
|
return res, fallback_set
|
394
92
|
end
|
@@ -400,6 +98,3 @@ def set_prototype
|
|
400
98
|
trunk.prototype
|
401
99
|
end
|
402
100
|
end
|
403
|
-
|
404
|
-
|
405
|
-
|