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
@@ -1,6 +1,6 @@
1
1
 
2
2
  format :rss do
3
- def raw_feed_items args
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
@@ -0,0 +1,2 @@
1
+ extend Card::Setting
2
+ setting_opts group: :other, position: 4, rule_type_editable: false
@@ -0,0 +1,2 @@
1
+ extend Card::Setting
2
+ setting_opts group: :other, position: 5, rule_type_editable: false
@@ -1,3 +1,3 @@
1
1
  def followable?
2
2
  false
3
- end
3
+ end
@@ -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, opts={}
6
+ def link_to text, href, _opts={}
8
7
  href = interpret_href href
9
8
 
10
- if text and href != 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].kind_of? String
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 = case href
40
- when /^https?:/ ; 'external-link'
41
- when /^mailto:/ ; 'email-link'
42
- when /^([a-zA-Z][\-+\.a-zA-Z\d]*):/ ; $1 + '-link'
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] ; 'internal-link'
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 = case name_or_card
56
- when Symbol then Card.fetch( name_or_card, skip_modules: true ).cardname
57
- when Card then name_or_card.cardname
58
- else name_or_card
59
- end
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( :path_opts ) || {}
63
- path_opts[:name ] = name
64
- path_opts[:known] = opts[:known].nil? ? Card.known?(name) : opts.delete(:known)
65
- add_class opts, ( path_opts[:known] ? 'known-card' : 'wanted-card' )
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 = case name_or_card
82
- when Symbol then Card.fetch( name_or_card, skip_modules: true ).cardname
83
- when Card then name_or_card.cardname
84
- else name_or_card
85
- end
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,7 +1,7 @@
1
1
 
2
2
  format :html do
3
3
  def toolbar_pinned?
4
- Card[:toolbar_pinned].content == 'true'
4
+ (tp = Card[:toolbar_pinned]) && tp.content == 'true'
5
5
  end
6
6
 
7
7
  view :toolbar do |args|
@@ -1,319 +1,11 @@
1
- event :save_recently_edited_settings, before: :extend, on: :save, when: proc{|c| c.is_rule? } do
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
- rule_setting_name
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
- first = new_card? ? 0 : set_prototype.set_names.index{|s| s.to_name.key == rule_set_key}
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,:current]
63
+ [set_name, :current]
370
64
  else
371
65
  fallback_set ||= set_name
372
- [set_name,:overwritten]
66
+ [set_name, :overwritten]
373
67
  end
374
68
  else
375
- res << (rule_cnt < 1 ? [set_name,:enabled] : [set_name,:disabled])
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 show up in the set_names. FIXME!!
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 "DELETE" the current one)
390
- # 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
391
- # have the option to create rules based on arbitrary narrower sets, though narrower sets will always apply to whatever prototype we create
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
-