card-mod-rules 0.14.2 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/assets/script/rules.js.coffee +52 -0
  3. data/assets/style/rules.scss +143 -0
  4. data/{locales → config/locales}/de.yml +1 -0
  5. data/{locales → config/locales}/en.yml +1 -0
  6. data/data/files/mod_rules_script_asset_output/file.js +2 -0
  7. data/data/files/mod_rules_script_local_machine_output/file.js +31 -0
  8. data/data/real.yml +27 -0
  9. data/set/abstract/virtual_set.rb +3 -0
  10. data/set/all/cardtype_groups.rb +1 -2
  11. data/set/all/related_sets.rb +2 -18
  12. data/set/all/set_select.rb +58 -0
  13. data/set/right/right.rb +7 -0
  14. data/set/right/self.rb +8 -0
  15. data/set/right/type.rb +7 -0
  16. data/set/right/type_plus_right.rb +9 -2
  17. data/set/rule/bar_view.rb +21 -32
  18. data/set/rule/bridge_rules_editor.rb +1 -1
  19. data/set/rule/editor.rb +29 -7
  20. data/set/rule/quick_editor/quick_edit.haml +2 -2
  21. data/set/rule/quick_editor.rb +1 -1
  22. data/set/rule/rule_form/rule_form.haml +1 -3
  23. data/set/rule/rule_form/rule_set_radio.rb +16 -13
  24. data/set/rule/rule_form/set_selection.rb +3 -20
  25. data/set/rule/rule_form.rb +19 -3
  26. data/set/self/cardtype.rb +0 -2
  27. data/set/self/recent_settings.rb +2 -0
  28. data/set/type/cardtype.rb +1 -1
  29. data/set/type/set/html_views/filtered_rule_lists.rb +23 -0
  30. data/set/type/set/html_views/rule_lists.rb +82 -22
  31. data/set/type/set/html_views/setting_filter.rb +38 -0
  32. data/set/type/set/html_views.rb +4 -31
  33. data/set/type/set/setting_categories.rb +67 -0
  34. data/set/type/set.rb +10 -4
  35. data/set/type/setting/core.haml +11 -0
  36. data/set/type/setting.rb +3 -1
  37. data/set/type_plus_right/set/setting.rb +12 -0
  38. data/set/type_plus_right/set/structure.rb +10 -0
  39. metadata +27 -16
  40. data/assets/script/script_rules.js.coffee +0 -23
  41. data/set/rule/rule_form/form_elements.rb +0 -52
  42. data/set/type/set/html_views/group_panel.haml +0 -14
  43. data/set/type/set/rules_filter.rb +0 -60
  44. data/set/type/set/setting_lists.rb +0 -76
@@ -2,7 +2,7 @@
2
2
  class RuleSetRadio
3
3
  attr_reader :format
4
4
 
5
- delegate :link_to_card, :radio_button, :wrap_with, :icon_tag,
5
+ delegate :link_to_card, :radio_button, :wrap_with, :icon_tag, :unique_id,
6
6
  to: :format
7
7
 
8
8
  # @param state [:current, :overwritten]
@@ -12,14 +12,14 @@ class RuleSetRadio
12
12
  @set_name = set_name
13
13
  @tag = tag
14
14
  @state = state
15
+ @id = "#{unique_id}-#{Time.now.to_i}"
15
16
  end
16
17
 
17
18
  def html narrower
18
19
  @narrower_rules = narrower
19
20
 
20
- rule_radio do
21
- radio_text = "#{@set_name}+#{@tag}"
22
- radio_button :name, radio_text, checked: false, warning: warning
21
+ wrap_with :div, class: "form-check" do
22
+ [radio, label]
23
23
  end
24
24
  end
25
25
 
@@ -33,18 +33,21 @@ class RuleSetRadio
33
33
  @state == :overwritten
34
34
  end
35
35
 
36
- def rule_radio
37
- label_classes = ["set-label", ("current-set-label" if current?)]
38
- icon = icon_tag "open_in_new", "link-muted"
39
- wrap_with :label, class: label_classes.compact.join(" ") do
40
- [yield, label, link_to_card(@set_name, icon, target: "decko_set")]
41
- end
36
+ def radio
37
+ radio_text = "#{@set_name}+#{@tag}"
38
+ radio_button :name, radio_text,
39
+ checked: false, warning: warning, class: "form-check-input", id: @id
42
40
  end
43
41
 
44
42
  def label
45
- label = Card.fetch(@set_name).label
46
- label += " <em>#{extra_info}</em>".html_safe if extra_info
47
- label
43
+ label_classes = ["set-label", ("current-set-label" if current?)].compact.join(" ")
44
+ icon = icon_tag "open_in_new", "text-muted"
45
+ text = Card.fetch(@set_name).label
46
+ text += " <em>#{extra_info}</em>".html_safe if extra_info
47
+
48
+ wrap_with :label, class: "form-check-label #{label_classes}", for: @id do
49
+ [text, link_to_card(@set_name, icon, target: "decko_set")]
50
+ end
48
51
  end
49
52
 
50
53
  def extra_info
@@ -1,6 +1,6 @@
1
1
  format :html do
2
2
  def bridge_rule_set_selection
3
- wrap_with :div, class: "set-list" do
3
+ wrap_with :div, class: "set-list _set-editor" do
4
4
  bridge_rule_set_formgroup
5
5
  end
6
6
  end
@@ -9,30 +9,13 @@ format :html do
9
9
  tag = @rule_context.rule_user_setting_name
10
10
  narrower = []
11
11
 
12
- bridge_option_list "Set" do
13
- rule_set_options.map do |set_name, state|
12
+ wrap_with :div, class: "col-xs-6 mt-3 mb-5" do
13
+ rule_set_options.reverse.map do |set_name, state|
14
14
  RuleSetRadio.new(self, set_name, tag, state).html narrower
15
15
  end
16
16
  end
17
17
  end
18
18
 
19
- def bridge_option_list title
20
- index = -1
21
- formgroup title, input: "set", class: "col-xs-6", help: false do
22
- yield.inject("") do |res, radio|
23
- index += 1
24
- # TODO
25
- if false # index.in? [2,3]
26
- wrap_with(:li, radio, class: "radio") + res
27
- else
28
- wrap_with :ul do
29
- wrap_with(:li, (radio + res), class: "radio")
30
- end
31
- end
32
- end
33
- end
34
- end
35
-
36
19
  def rule_set_options
37
20
  @rule_set_options ||= @rule_context.set_options
38
21
  end
@@ -1,8 +1,6 @@
1
1
  format :html do
2
2
  view :rule_form, cache: :never, unknown: true do
3
- @success_view ||= :open
4
- @rule_context ||= card
5
- @form_type ||= :overlay
3
+ prepare_rule_form_options
6
4
 
7
5
  wrap do
8
6
  edit_rule_form @success_view do
@@ -14,6 +12,24 @@ format :html do
14
12
  end
15
13
  end
16
14
 
15
+ def prepare_rule_form_options
16
+ @success_view ||= :open
17
+ @rule_context ||= card
18
+ @form_type ||= :overlay
19
+ @edit_rule_success = edit_rule_success @success_view
20
+ end
21
+
22
+ view :rule_form_card_editor, cache: :never, unknown: true do
23
+ prepare_rule_form_options
24
+
25
+ wrap true, class: "card-editor slotter" do
26
+ [
27
+ rules_type_formgroup,
28
+ rule_content_formgroup
29
+ ]
30
+ end
31
+ end
32
+
17
33
  def form_type
18
34
  @form_type || :overlay
19
35
  end
data/set/self/cardtype.rb CHANGED
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  format :html do
4
2
  view :grouped_list do
5
3
  All::CardtypeGroups::GROUP.keys.map do |group|
@@ -1,3 +1,5 @@
1
+ include_set Abstract::List
2
+
1
3
  def history?
2
4
  false
3
5
  end
data/set/type/cardtype.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  def related_sets with_self=false
2
2
  sets = []
3
- sets << ["#{name}+*type", Card::Set::Type.label(name)] if known?
3
+ sets << Card.fetch(name, :type) if known?
4
4
  sets + super
5
5
  end
@@ -0,0 +1,23 @@
1
+ format :html do
2
+ view :nest_rules,
3
+ cache: :never, unknown: true, wrap: :slot do
4
+ render :quick_edit_setting_list
5
+ end
6
+
7
+ view :modal_nest_rules,
8
+ cache: :never, unknown: true,
9
+ wrap: { modal: { title: "Rules for nest" } } do
10
+ filtered_rule_list :quick_edit_setting_list, :field_related
11
+ end
12
+
13
+ view :bridge_rules_tab,
14
+ cache: :never,
15
+ wrap: { slot: { class: "d-flex flex-column gap-3 mx-3 mt-2" } } do
16
+ class_up "accordion-item", "_setting-list"
17
+ filtered_rule_list :accordion_rule_list, :common, mark: ""
18
+ end
19
+
20
+ view :filtered_accordion_rule_list do
21
+ filtered_rule_list :accordion_rule_list
22
+ end
23
+ end
@@ -1,42 +1,102 @@
1
1
  format :html do
2
- view :quick_edit_rule_list, cache: :never, wrap: { slot: { class: "rule-list" } } do
3
- quick_edit_rule_list setting_list_from_params(:field_related)
2
+ setting_list_view_options = { cache: :never,
3
+ wrap: { slot: { class: "_setting-list" } } }
4
+
5
+ # rule can be edited in-place
6
+ view :quick_edit_setting_list, setting_list_view_options do
7
+ quick_edit_setting_list
8
+ end
9
+
10
+ # show the settings in bars
11
+ view :bar_setting_list, setting_list_view_options do
12
+ group = voo.filter&.to_sym || :all
13
+ category_setting_list_items(group, :bar, hide: :full_name).join("\n").html_safe
14
+ end
15
+
16
+ # a click on a setting opens the rule editor in an overlay
17
+ view :pill_setting_list, setting_list_view_options do
18
+ pill_setting_list
19
+ end
20
+
21
+ # a click on a setting opens the rule editor in a modal
22
+ view :modal_pill_setting_list, setting_list_view_options do
23
+ pill_setting_list true
24
+ end
25
+
26
+ view :accordion_rule_list, setting_list_view_options do
27
+ class_up "accordion", "bar-accordion"
28
+ category_accordion(:rule_bridge_link) do |list|
29
+ bridge_pills list
30
+ end
31
+ end
32
+
33
+ view :accordion_bar_list do
34
+ class_up "accordion", "bar-accordion"
35
+ category_accordion(:bar) do |list|
36
+ list_tag(class: "nav flex-column", items: { class: "nav-item" }) { list }
37
+ end
4
38
  end
5
39
 
6
- view :bar_rule_list, cache: :never, wrap: { slot: { class: "rule-list" } } do
7
- bar_rule_list setting_list_from_params
40
+ def category_accordion view, &block
41
+ class_up "accordion-item", "_setting-group"
42
+ wrap_with :div, class: "_setting-list" do
43
+ accordion do
44
+ category_accordion_item(view, &block)
45
+ end
46
+ end
47
+ end
48
+
49
+ def category_accordion_item view
50
+ Card::Setting.groups.keys.map do |group_key|
51
+ list =
52
+ card.group_settings(group_key).map do |setting|
53
+ setting_list_item setting, view
54
+ end
55
+ body = yield list
56
+ accordion_item "#{group_key} #{count_badge(list.size)}",
57
+ body: body, context: group_key
58
+ end
8
59
  end
9
60
 
10
- view :pill_rule_list, cache: :never, wrap: { slot: { class: "rule-list" } } do
11
- pill_rule_list setting_list_from_params
61
+ def count_badge count
62
+ "<span class=\"_count badge bg-secondary ms-3\">#{count}</span>"
12
63
  end
13
64
 
14
- def quick_edit_rule_list settings
15
- list_tag class: "nav nav-pills flex-column bridge-pills" do
16
- settings.map { |setting| rule_list_item setting, :quick_edit }
65
+ view :overlay_rule_list_link, cache: :never do
66
+ opts = bridge_link_opts(class: "edit-rule-link btn btn-primary")
67
+ # opts[:path].delete(:layout)
68
+
69
+ wrap_with :div do
70
+ link_to_view(:core, "Show existing rules", opts)
17
71
  end
18
72
  end
19
73
 
20
- def pill_rule_list settings
21
- list_items =
22
- settings.map { |setting| rule_list_item setting, :rule_bridge_link }
23
- bridge_pills list_items
74
+ def quick_edit_setting_list
75
+ classes = "nav nav-pills flex-column bridge-pills _setting-list _setting-group"
76
+ list_tag class: classes do
77
+ category_setting_list_items :field, :quick_edit
78
+ end
24
79
  end
25
80
 
26
- def bar_rule_list settings
27
- list_items =
28
- settings.map { |setting| rule_list_item setting, :bar, hide: :full_name }
29
- list_items.join("\n").html_safe
81
+ def pill_setting_list open_rule_in_modal=false
82
+ item_view = open_rule_in_modal ? :rule_nest_editor_link : :rule_bridge_link
83
+ bridge_pills category_setting_list_items(:all, item_view)
30
84
  end
31
85
 
32
- def rule_list_item setting, view, opts={}
86
+ view :pill_setting_list, cache: :never, wrap: { slot: { class: "_setting-list" } } do
87
+ pill_setting_list
88
+ end
89
+
90
+ def category_setting_list_items category, item_view, options={}
91
+ card.category_settings(category).map do |setting|
92
+ setting_list_item setting, item_view, options
93
+ end
94
+ end
95
+
96
+ def setting_list_item setting, view, opts={}
33
97
  return "" unless show_view? setting
34
98
 
35
99
  rule_card = card.fetch setting, new: {}
36
100
  nest(rule_card, opts.merge(view: view)).html_safe
37
101
  end
38
-
39
- def setting_list_from_params default=:common
40
- setting_list setting_group(default)
41
- end
42
102
  end
@@ -0,0 +1,38 @@
1
+ format :html do
2
+ def filtered_rule_list view, *filter_args
3
+ [
4
+ setting_filter(view, *filter_args),
5
+ render(view)
6
+ ]
7
+ end
8
+
9
+ def setting_filter view, selected_category=:common, path_opts={}
10
+ form_tag path(path_opts.merge(view: view)),
11
+ remote: true, method: "get", role: "filter",
12
+ "data-slot-selector": ".card-slot._setting-list",
13
+ class: classy("nodblclick slotter") do
14
+ output [
15
+ filter_buttons(selected_category)
16
+ ].flatten
17
+ end
18
+ end
19
+
20
+ def filter_buttons selected=:all
21
+ wrap_with :div, class: "my-4 mx-2 _setting-filter" do
22
+ [
23
+ content_tag(:label, "Settings"),
24
+ filter_radio(:all, "All", selected == :all),
25
+ filter_radio(:common, "Common", selected == :common),
26
+ filter_radio(:field, "Field", selected == :field_related),
27
+ filter_radio(:recent, "Recent", selected == :recent)
28
+ ]
29
+ end
30
+ end
31
+
32
+ def filter_radio name, label, checked=false
33
+ <<-HTML.strip_heredoc
34
+ <input type="radio" class="btn-check _setting-category" name="options" id="#{name}" autocomplete="off" #{'checked' if checked}>
35
+ <label class="btn btn-outline-primary" for="#{name}">#{label}</label>
36
+ HTML
37
+ end
38
+ end
@@ -4,43 +4,16 @@ format :html do
4
4
  end
5
5
 
6
6
  view :core, cache: :never do
7
- filtered_rule_list :bar_rule_list
8
- end
9
-
10
- view :nest_rules, cache: :never, unknown: true, wrap: :slot do
11
- filtered_rule_list :quick_edit_rule_list, :field_related_rules, :related, mark: ""
12
- end
13
-
14
- view :modal_nest_rules, cache: :never, unknown: true,
15
- wrap: { modal: { title: "Rules for nest" } } do
16
- filtered_rule_list :quick_edit_rule_list, :field_related_rules, :self
17
- end
18
-
19
- view :bridge_rules_tab, cache: :never do
20
- filtered_rule_list :pill_rule_list, :common, :related, mark: ""
21
- end
22
-
23
- def filtered_rule_list view, *filter_args
24
- [rules_filter(view, *filter_args),
25
- render(view)]
7
+ [
8
+ content_tag(:h4, t("rules_header"), class: "mt-3"),
9
+ filtered_rule_list(:accordion_bar_list)
10
+ ]
26
11
  end
27
12
 
28
13
  view :set_label do
29
14
  wrap_with :strong, card.label, class: "set-label"
30
15
  end
31
16
 
32
- Card::Setting.groups.each_key do |group_key|
33
- view group_key.to_sym do
34
- next unless card.visible_settings(group_key).present?
35
-
36
- haml :group_panel, group_key: group_key
37
- end
38
- end
39
-
40
- def setting_group default=:common
41
- voo&.filter&.to_sym || params[:group]&.to_sym || default
42
- end
43
-
44
17
  view :input do
45
18
  "Cannot currently edit Sets" # LOCALIZE
46
19
  end
@@ -0,0 +1,67 @@
1
+ SETTING_OPTIONS = [["Common", :common_rules],
2
+ ["All", :all_rules],
3
+ ["Field", :field_related_rules],
4
+ ["Recent", :recent_rules]].freeze
5
+
6
+ COMMON_SETTINGS = %i[create read update delete structure default guide].freeze
7
+ FIELD_SETTINGS = %i[default help].freeze
8
+
9
+ def categories setting
10
+ result = [:all]
11
+ result += %i[field recent common].select do |cat|
12
+ category_settings(cat)&.include? setting
13
+ end
14
+ result
15
+ end
16
+
17
+ def selected_setting_category default=:common
18
+ voo&.filter&.to_sym || params[:group]&.to_sym || default
19
+ end
20
+
21
+ def field_settings
22
+ %i[default help input_type content_options content_option_view]
23
+ end
24
+
25
+ # @param val setting category, setting group or single setting
26
+ def setting_list val
27
+ category_settings(val) || group_settings(val) || [val]
28
+ end
29
+
30
+ def category_settings cat
31
+ case cat
32
+ when :all, :all_rules
33
+ all_settings
34
+ when :recent, :recent_rules
35
+ recent_settings
36
+ when :common, :common_rules
37
+ visible_setting_codenames & COMMON_SETTINGS
38
+ when :field, :field_related, :field_related_rules
39
+ field_related_settings
40
+ when :nest_editor_field_related
41
+ nest_editor_field_related_settings
42
+ else
43
+ group_settings cat
44
+ end
45
+ end
46
+
47
+ def group_settings group
48
+ visible_settings(group).map(&:codename) if Card::Setting.groups[group]
49
+ end
50
+
51
+ def all_settings
52
+ visible_setting_codenames.sort
53
+ end
54
+
55
+ def nest_editor_field_related_settings
56
+ field_settings
57
+ # & card.visible_settings(nil, card.prototype_default_type_id).map(&:codename)
58
+ end
59
+
60
+ def field_related_settings
61
+ field_settings # card.visible_setting_codenames &
62
+ end
63
+
64
+ def recent_settings
65
+ recent_settings = Card[:recent_settings].item_cards.map(&:codename).compact
66
+ recent_settings & visible_setting_codenames
67
+ end
data/set/type/set.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  include_set Type::SearchType
2
2
 
3
+ basket[:non_createable_types] << :set
4
+
3
5
  def anchor_name
4
6
  name.left_name
5
7
  end
@@ -17,7 +19,7 @@ def pattern
17
19
  end
18
20
 
19
21
  def inheritable?
20
- junction_only? || (anchor_name&.compound? && self_set?)
22
+ compound_only? || (anchor_name&.compound? && self_set?)
21
23
  end
22
24
 
23
25
  def self_set?
@@ -29,8 +31,8 @@ def subclass_for_set
29
31
  Pattern.concrete.find { |set| set.pattern_code == current_set_pattern_code }
30
32
  end
31
33
 
32
- def junction_only?
33
- @junction_only.nil? ? (@junction_only = subclass_for_set.junction_only) : @junction_only
34
+ def compound_only?
35
+ @compound_only.nil? ? (@compound_only = subclass_for_set.compound_only) : @compound_only
34
36
  end
35
37
 
36
38
  def label
@@ -82,7 +84,7 @@ def visible_settings group=nil, cardtype_id=nil
82
84
  end
83
85
 
84
86
  def broader_sets
85
- prototype.set_names[1..-1]
87
+ prototype.set_names[1..-1].map(&Card.method(:fetch))
86
88
  end
87
89
 
88
90
  def prototype
@@ -105,3 +107,7 @@ def related_sets with_self=false
105
107
  left(new: {}).related_sets with_self
106
108
  end
107
109
  end
110
+
111
+ def label_and_url_key
112
+ [label, name.to_name.url_key]
113
+ end
@@ -0,0 +1,11 @@
1
+ = _render_rule_help
2
+ %h3 All #{card.name.tr "*", ""} rules that apply to
3
+ - card.set_classes_with_rules.each do |klass, rules|
4
+ %p
5
+ %h5
6
+ = klass.generic_label.downcase
7
+ - if klass.anchorless?
8
+ = nest rules.first, view: :bar, show: :full_name
9
+ - else
10
+ - rules.each do |rule|
11
+ = nest rule, view: :bar
data/set/type/setting.rb CHANGED
@@ -1,3 +1,5 @@
1
+ basket[:non_createable_types] << :setting
2
+
1
3
  format :data do
2
4
  view :core do
3
5
  cql = { left: { type: SetID },
@@ -19,7 +21,7 @@ def set_classes_with_rules
19
21
  end
20
22
 
21
23
  def rules_for_set_class set_class
22
- cql = { left: { type: SetID }, right: id, sort: %w[content name], limit: 0 }
24
+ cql = { left: { type: SetID }, right: id, sort_by: %w[content name], limit: 0 }
23
25
  cql[:left][(set_class.anchorless? ? :id : :right_id)] = set_class.pattern_id
24
26
  Card.search cql
25
27
  end
@@ -0,0 +1,12 @@
1
+ assign_type :list
2
+
3
+ format :html do
4
+ end
5
+
6
+ def item_cards args={}
7
+ left.setting_list(args[:setting_list] || :all).map(&method(:rule_item_card))
8
+ end
9
+
10
+ def rule_item_card setting
11
+ left.fetch setting, new: {}
12
+ end
@@ -0,0 +1,10 @@
1
+ format :html do
2
+ def nest_snippet
3
+ @nest_snippet ||=
4
+ begin
5
+ super
6
+ @nest_snippet.field! if @nest_snippet.empty?
7
+ @nest_snippet
8
+ end
9
+ end
10
+ end