card 1.19.6 → 1.20.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/card.gemspec +8 -7
- data/config/initializers/01_core_extensions/array.rb +4 -0
- data/config/initializers/01_core_extensions/persistent_identifiers.rb +12 -0
- data/config/initializers/02_patches/better_errors.rb +56 -0
- data/config/initializers/core_extensions.rb +13 -18
- data/config/initializers/patches.rb +8 -0
- data/config/locales/de.yml +0 -2
- data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +22 -12
- data/db/migrate_core_cards/20161102202156_tweak_recaptcha_setting_cards.rb +17 -0
- data/db/migrate_core_cards/20161103154836_update_keys.rb +46 -0
- data/lib/card.rb +1 -8
- data/lib/card/act_manager.rb +4 -0
- data/lib/card/auth/permissions.rb +5 -3
- data/lib/card/cache.rb +1 -20
- data/lib/card/cache/persistent.rb +6 -0
- data/lib/card/content/chunk.rb +4 -3
- data/lib/card/content/diff.rb +2 -2
- data/lib/card/content/diff/result.rb +11 -0
- data/lib/card/env/success.rb +4 -0
- data/lib/card/error.rb +2 -0
- data/lib/card/format.rb +14 -17
- data/lib/card/format/content.rb +16 -8
- data/lib/card/format/error.rb +3 -5
- data/lib/card/format/names.rb +22 -16
- data/lib/card/format/nest.rb +67 -61
- data/lib/card/format/nest/fetch.rb +40 -33
- data/lib/card/format/nest/main.rb +39 -19
- data/lib/card/format/nest/subformat.rb +3 -16
- data/lib/card/format/nest/view.rb +23 -32
- data/lib/card/format/permission.rb +49 -34
- data/lib/card/format/registration.rb +12 -6
- data/lib/card/format/render.rb +62 -73
- data/lib/card/migration.rb +14 -10
- data/lib/card/migration/import.rb +20 -19
- data/lib/card/migration/import/import_data.rb +50 -59
- data/lib/card/migration/import/import_data/card_attributes.rb +56 -0
- data/lib/card/migration/import/import_data/card_content.rb +33 -0
- data/lib/card/migration/import/merger.rb +47 -0
- data/lib/card/mod/loader.rb +4 -4
- data/lib/card/model/save_helper.rb +49 -10
- data/lib/card/name.rb +16 -52
- data/lib/card/name/fields_and_traits.rb +67 -0
- data/lib/card/name/variants.rb +17 -0
- data/lib/card/query.rb +6 -2
- data/lib/card/query/attributes.rb +1 -1
- data/lib/card/query/interpretation.rb +3 -3
- data/lib/card/set/event.rb +2 -1
- data/lib/card/set/format.rb +18 -7
- data/lib/card/set_pattern.rb +17 -13
- data/lib/card/tasks/card.rake +1 -1
- data/lib/card/view.rb +55 -0
- data/lib/card/view/cache.rb +90 -0
- data/lib/card/view/fetch.rb +109 -0
- data/lib/card/view/options.rb +164 -0
- data/lib/card/view/stub.rb +30 -0
- data/lib/card/view/visibility.rb +95 -0
- data/lib/cardio.rb +3 -2
- data/lib/cardio/schema.rb +21 -8
- data/lib/generators/card.rb +16 -2
- data/lib/generators/card/format/format_generator.rb +10 -9
- data/lib/generators/card/migration/migration_generator.rb +10 -5
- data/lib/generators/card/set/USAGE +1 -1
- data/lib/generators/card/set/set_generator.rb +11 -9
- data/mod/account/set/right/account.rb +38 -40
- data/mod/account/set/right/token.rb +2 -1
- data/mod/account/set/self/account_links.rb +34 -54
- data/mod/account/set/self/signin.rb +107 -93
- data/mod/account/set/type/signup.rb +33 -32
- data/mod/account/set/type/user.rb +28 -21
- data/mod/account/spec/set/all/account_spec.rb +9 -9
- data/mod/account/spec/set/right/account_spec.rb +23 -14
- data/mod/account/spec/set/right/email_spec.rb +6 -6
- data/mod/account/spec/set/right/password_spec.rb +4 -4
- data/mod/account/spec/set/right/token_spec.rb +3 -3
- data/mod/account/spec/set/self/account_links_spec.rb +3 -3
- data/mod/account/spec/set/self/signin_spec.rb +2 -2
- data/mod/account/spec/set/type/signup_spec.rb +7 -8
- data/mod/ace_editor/set/abstract/ace_editor.rb +1 -4
- data/mod/admin/set/self/admin.rb +2 -2
- data/mod/admin/set/self/admin_info.rb +1 -1
- data/mod/admin/set/self/recaptcha_private_key.rb +3 -0
- data/mod/admin/set/self/recaptcha_proxy.rb +3 -0
- data/mod/admin/set/self/recaptcha_public_key.rb +3 -0
- data/mod/admin/set/self/trash.rb +4 -4
- data/mod/admin/spec/set/self/admin_spec.rb +4 -4
- data/mod/admin/spec/set/self/version_spec.rb +1 -1
- data/mod/basic_formats/set/all/all_css.rb +3 -3
- data/mod/basic_formats/set/all/all_csv.rb +6 -6
- data/mod/basic_formats/set/all/all_js.rb +4 -0
- data/mod/basic_formats/set/all/base.rb +40 -62
- data/mod/basic_formats/set/all/json.rb +34 -39
- data/mod/basic_formats/set/all/rss.rb +6 -6
- data/mod/basic_formats/set/all/text.rb +3 -2
- data/mod/basic_formats/set/self/01_head/javascript.rb +2 -2
- data/mod/basic_formats/set/self/head.rb +6 -10
- data/mod/basic_formats/spec/set/all/all_css_spec.rb +1 -1
- data/mod/basic_formats/spec/set/all/all_csv_spec.rb +1 -1
- data/mod/basic_formats/spec/set/all/base_spec.rb +8 -5
- data/mod/basic_formats/spec/set/all/json_spec.rb +2 -2
- data/mod/basic_formats/spec/set/all/rss_spec.rb +4 -4
- data/mod/basic_types/set/type/plain_text.rb +3 -5
- data/mod/basic_types/spec/set/type/plain_text_spec.rb +2 -2
- data/mod/bootstrap/lib/bootstrap.rb +16 -0
- data/mod/bootstrap/lib/bootstrap/basic_tags.rb +26 -0
- data/mod/bootstrap/lib/bootstrap/component.rb +133 -0
- data/mod/bootstrap/lib/bootstrap/component/form.rb +31 -0
- data/mod/bootstrap/lib/bootstrap/component/horizontal_form.rb +38 -0
- data/mod/bootstrap/lib/bootstrap/component/layout.rb +83 -0
- data/mod/bootstrap/lib/bootstrap/component/panel.rb +9 -0
- data/mod/bootstrap/lib/bootstrap/component_loader.rb +30 -0
- data/mod/bootstrap/lib/bootstrap/delegate.rb +16 -0
- data/mod/bootstrap/lib/bootstrapper.rb +16 -0
- data/mod/bootstrap/lib/stylesheets/bootstrap/_tables.scss +55 -52
- data/mod/bootstrap/lib/stylesheets/bootstrap/mixins/_table-row.scss +12 -12
- data/mod/bootstrap/lib/stylesheets/bootstrap_cards.scss +12 -0
- data/mod/bootstrap/set/all/bootstrap/accordion.rb +63 -0
- data/mod/bootstrap/set/all/bootstrap/helper.rb +7 -140
- data/mod/bootstrap/set/all/bootstrap/navbar.rb +74 -0
- data/mod/bootstrap/set/all/bootstrap/table.rb +76 -46
- data/mod/bootstrap/set/all/bootstrap/tabs.rb +58 -23
- data/mod/bootstrap/set/all/bootstrap/wrapper.rb +14 -8
- data/mod/bootstrap/set/all/rich_bootstrap.rb +5 -3
- data/mod/bootstrap/spec/set/all/bootstrap/bootstrap_builder_spec.rb +31 -0
- data/mod/bootstrap/spec/set/all/bootstrap/bootstrap_spec.rb +20 -0
- data/mod/bootstrap/spec/set/all/bootstrap/form_spec.rb +59 -1
- data/mod/bootstrap/spec/set/all/bootstrap/layout_spec.rb +104 -15
- data/mod/carrierwave/set/abstract/attachment.rb +4 -3
- data/mod/carrierwave/set/abstract/attachment/paths.rb +1 -1
- data/mod/carrierwave/set/abstract/attachment/storage_type.rb +5 -11
- data/mod/carrierwave/set/type/file.rb +39 -32
- data/mod/carrierwave/set/type/image.rb +59 -34
- data/mod/carrierwave/spec/set/type/image_spec.rb +3 -3
- data/mod/core/chunk/link.rb +5 -0
- data/mod/core/chunk/{include.rb → nest.rb} +8 -29
- data/mod/core/chunk/reference.rb +5 -6
- data/mod/core/chunk/view_stub.rb +42 -0
- data/mod/core/format/html_format.rb +23 -26
- data/mod/core/set/abstract/code_file.rb +1 -1
- data/mod/core/set/all/actify.rb +1 -1
- data/mod/core/set/all/active_card.rb +0 -1
- data/mod/core/set/all/{tracked_attributes.rb → assign_attributes.rb} +55 -24
- data/mod/core/set/all/collection.rb +136 -122
- data/mod/core/set/all/content.rb +8 -0
- data/mod/core/set/all/event.rb +5 -2
- data/mod/core/set/all/export.rb +7 -7
- data/mod/core/set/all/fetch.rb +90 -26
- data/mod/core/set/all/initialize.rb +17 -6
- data/mod/core/set/all/name.rb +2 -3
- data/mod/core/set/all/permissions.rb +19 -11
- data/mod/core/set/all/states.rb +12 -2
- data/mod/core/set/all/trash.rb +1 -1
- data/mod/core/set/all/type.rb +2 -0
- data/mod/core/set/all/utils.rb +4 -3
- data/mod/core/spec/chunk/literal_spec.rb +2 -2
- data/mod/core/spec/chunk/uri_spec.rb +17 -17
- data/mod/core/spec/format/html_format_spec.rb +11 -13
- data/mod/core/spec/set/all/attribute_tracking_spec.rb +2 -2
- data/mod/core/spec/set/all/collection_spec.rb +21 -24
- data/mod/core/spec/set/all/content_spec.rb +1 -1
- data/mod/core/spec/set/all/export_spec.rb +3 -3
- data/mod/core/spec/set/all/fetch_spec.rb +5 -5
- data/mod/core/spec/set/all/initialize_spec.rb +4 -4
- data/mod/core/spec/set/all/name_spec.rb +6 -6
- data/mod/core/spec/set/all/permissions_spec.rb +10 -10
- data/mod/core/spec/set/all/references_spec.rb +1 -1
- data/mod/core/spec/set/all/rules2_spec.rb +24 -24
- data/mod/core/spec/set/all/rules_spec.rb +1 -1
- data/mod/core/spec/set/all/templating_spec.rb +8 -8
- data/mod/core/spec/set/all/tracked_attributes_spec.rb +6 -6
- data/mod/core/spec/set/all/type_spec.rb +5 -5
- data/mod/developer/spec/set/all/event_viz_spec.rb +1 -1
- data/mod/developer/spec/set/right/debug_spec.rb +1 -1
- data/mod/email/set/all/email_html.rb +2 -2
- data/mod/email/set/all/notify.rb +8 -3
- data/mod/email/set/right/bcc.rb +3 -3
- data/mod/email/set/right/follow.rb +5 -5
- data/mod/email/set/right/following.rb +1 -1
- data/mod/email/set/self/follow_defaults.rb +27 -16
- data/mod/email/set/type/email_template.rb +1 -1
- data/mod/email/set/type_plus_right/user/follow.rb +10 -9
- data/mod/history/lib/card/act.rb +4 -0
- data/mod/history/lib/card/act/act_renderer.rb +194 -0
- data/mod/history/lib/card/act/act_renderer/absolute_act_renderer.rb +25 -0
- data/mod/history/lib/card/act/act_renderer/relative_act_renderer.rb +41 -0
- data/mod/history/lib/card/action.rb +1 -0
- data/mod/history/lib/card/action/action_renderer.rb +92 -0
- data/mod/history/lib/card/action/differ.rb +6 -1
- data/mod/history/set/all/act_view.rb +64 -0
- data/mod/history/set/all/action_view.rb +65 -0
- data/mod/history/set/all/content_history.rb +44 -37
- data/mod/history/set/all/history.rb +49 -263
- data/mod/machines/lib/stylesheets/style_cards.scss +30 -115
- data/mod/machines/set/abstract/script.rb +42 -7
- data/mod/machines/set/right/machine_input.rb +4 -0
- data/mod/machines/set/type/coffee_script.rb +8 -22
- data/mod/machines/set/type/css.rb +2 -2
- data/mod/machines/set/type/java_script.rb +4 -24
- data/mod/machines/set/type/scss.rb +1 -1
- data/mod/machines/spec/set/type/css_spec.rb +1 -1
- data/mod/machines/spec/set/type/scss_spec.rb +3 -3
- data/mod/machines/spec/set/type/skin_spec.rb +7 -7
- data/mod/pointer/set/abstract/01_pointer.rb +44 -46
- data/mod/pointer/set/abstract/01_pointer/edit.rb +13 -13
- data/mod/pointer/set/right/options.rb +4 -0
- data/mod/pointer/spec/set/type/pointer_spec.rb +7 -7
- data/mod/prosemirror_editor/set/abstract/prosemirror_editor.rb +3 -3
- data/mod/settings/set/abstract/permission.rb +25 -18
- data/mod/settings/set/right/add_help.rb +3 -3
- data/mod/settings/set/right/structure.rb +10 -16
- data/mod/settings/spec/set/right/comment_spec.rb +3 -3
- data/mod/settings/spec/set/right/create_spec.rb +1 -1
- data/mod/settings/spec/set/right/style_spec.rb +1 -1
- data/mod/settings/spec/set/type/setting_spec.rb +1 -1
- data/mod/solid_cache/set/abstract/solid_cache.rb +4 -4
- data/mod/solid_cache/set/right/solid_cache.rb +9 -10
- data/mod/standard/set/abstract/01_search_params.rb +41 -0
- data/mod/standard/set/abstract/search.rb +132 -0
- data/mod/standard/set/abstract/search/paging.rb +81 -0
- data/mod/standard/set/abstract/search/paging/paging_links.rb +90 -0
- data/mod/standard/set/abstract/wql_search.rb +67 -0
- data/mod/standard/set/all/error.rb +89 -82
- data/mod/standard/set/all/links.rb +1 -1
- data/mod/standard/set/all/rich_html/content.rb +125 -141
- data/mod/standard/set/all/rich_html/editing.rb +115 -178
- data/mod/standard/set/all/rich_html/form.rb +111 -131
- data/mod/standard/set/all/rich_html/header.rb +57 -39
- data/mod/standard/set/all/rich_html/menu.rb +94 -94
- data/mod/standard/set/all/rich_html/modal.rb +5 -10
- data/mod/standard/set/all/rich_html/new.rb +103 -0
- data/mod/standard/set/all/rich_html/toolbar.rb +54 -74
- data/mod/standard/set/all/rich_html/wrapper.rb +111 -138
- data/mod/standard/set/rstar/rules.rb +27 -38
- data/mod/standard/set/rstar/rules_editor.rb +298 -277
- data/mod/standard/set/self/navbox.rb +20 -15
- data/mod/standard/set/self/recent.rb +25 -17
- data/mod/standard/set/self/search.rb +25 -4
- data/mod/standard/set/type/cardtype.rb +11 -9
- data/mod/standard/set/type/date.rb +1 -1
- data/mod/standard/set/type/number.rb +1 -1
- data/mod/standard/set/type/phrase.rb +1 -1
- data/mod/standard/set/type/search_type.rb +17 -282
- data/mod/standard/set/type/session.rb +1 -1
- data/mod/standard/set/type/set.rb +155 -131
- data/mod/standard/set/type/toggle.rb +1 -1
- data/mod/standard/set/type/uri.rb +4 -4
- data/mod/standard/spec/chunk/include_spec.rb +13 -31
- data/mod/standard/spec/chunk/link_spec.rb +1 -1
- data/mod/standard/spec/set/all/error_spec.rb +1 -1
- data/mod/standard/spec/set/all/history_spec.rb +2 -2
- data/mod/standard/spec/set/all/rich_html/form_spec.rb +4 -4
- data/mod/standard/spec/set/all/rich_html/toolbar_spec.rb +22 -0
- data/mod/standard/spec/set/all/rich_html/wrapper_spec.rb +3 -2
- data/mod/standard/spec/set/right/when_created_spec.rb +1 -1
- data/mod/standard/spec/set/right/when_last_edited_spec.rb +1 -1
- data/mod/standard/spec/set/rstar/rules_spec.rb +2 -3
- data/mod/standard/spec/set/self/head_spec.rb +2 -2
- data/mod/standard/spec/set/self/navbox_spec.rb +1 -1
- data/mod/standard/spec/set/self/now_spec.rb +1 -1
- data/mod/standard/spec/set/type/date_spec.rb +1 -1
- data/mod/standard/spec/set/type/email_template_spec.rb +1 -1
- data/mod/standard/spec/set/type/layout_type_spec.rb +1 -1
- data/mod/standard/spec/set/type/number_spec.rb +1 -1
- data/mod/standard/spec/set/type/phrase_spec.rb +1 -1
- data/mod/standard/spec/set/type/search_type_spec.rb +2 -2
- data/mod/standard/spec/set/type/set_spec.rb +2 -2
- data/mod/standard/spec/set/type/toggle_spec.rb +2 -2
- data/mod/standard/spec/set/type/uri_spec.rb +3 -1
- data/mod/tinymce_editor/set/abstract/tinymce_editor.rb +1 -1
- data/spec/config/initializers/core_extensions_spec.rb +40 -10
- data/spec/lib/card/auth_spec.rb +8 -8
- data/spec/lib/card/cache_spec.rb +3 -3
- data/spec/lib/card/chunk_spec.rb +4 -4
- data/spec/lib/card/codename_spec.rb +2 -2
- data/spec/lib/card/content_spec.rb +23 -23
- data/spec/lib/card/diff_spec.rb +1 -1
- data/spec/lib/card/format_spec.rb +19 -24
- data/spec/lib/card/loader_spec.rb +4 -4
- data/spec/lib/card/name_spec.rb +16 -16
- data/spec/lib/card/query_spec.rb +80 -80
- data/spec/lib/card/reference_spec.rb +5 -5
- data/spec/lib/card/set_spec.rb +6 -6
- data/spec/lib/card/subcards_spec.rb +14 -0
- data/spec/lib/card/view_cache_spec.rb +5 -5
- data/spec/models/card/cardtype_spec.rb +15 -15
- data/spec/models/card/create_spec.rb +2 -2
- data/spec/models/card/trash_spec.rb +24 -24
- data/spec/models/card/type_transition_spec.rb +8 -8
- data/spec/models/card/validation_spec.rb +5 -5
- data/spec/models/card_spec.rb +14 -14
- data/spec/spec_helper.rb +6 -2
- data/spec/support/card_spec_helper.rb +21 -11
- data/spec/support/helper/card_helper.rb +11 -4
- metadata +73 -15
- data/lib/card/cache/view_cache.rb +0 -103
- data/mod/bootstrap/set/all/bootstrap/layout.rb +0 -58
- data/mod/core/set/all/view_cache.rb +0 -9
@@ -1,184 +1,157 @@
|
|
1
1
|
format :html do
|
2
|
-
def slot_options args
|
3
|
-
@@slot_option_keys ||=
|
4
|
-
Card::Content::Chunk::Include.options
|
5
|
-
.reject { |k| k == :view }
|
6
|
-
.unshift :home_view
|
7
|
-
options_hash = {}
|
8
|
-
|
9
|
-
if @context_names.present?
|
10
|
-
options_hash["name_context"] = @context_names.map(&:key) * ","
|
11
|
-
end
|
12
|
-
|
13
|
-
options_hash[:subslot] = "true" if args[:subslot]
|
14
|
-
|
15
|
-
@@slot_option_keys.each_with_object(options_hash) do |opt, hash|
|
16
|
-
hash[opt] = args[opt] if args[opt].present?
|
17
|
-
end
|
18
|
-
|
19
|
-
JSON(options_hash)
|
20
|
-
end
|
21
2
|
|
22
3
|
# Does two main things:
|
23
4
|
# (1) gives CSS classes for styling and
|
24
5
|
# (2) adds card data for javascript - including the "card-slot" class,
|
25
6
|
# which in principle is not supposed to be in styles
|
26
|
-
def wrap
|
7
|
+
def wrap slot=true
|
27
8
|
@slot_view = @current_view
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
9
|
+
debug_slot do
|
10
|
+
wrap_with :div, yield, id: card.cardname.url_key,
|
11
|
+
class: wrap_classes(slot),
|
12
|
+
data: wrap_data
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def wrap_data
|
17
|
+
{ "card-id" => card.id,
|
18
|
+
"card-name" => h(card.name),
|
19
|
+
"slot" => slot_options }
|
20
|
+
end
|
21
|
+
|
22
|
+
def slot_options_json
|
23
|
+
html_escape_except_quotes JSON(slot_options)
|
24
|
+
end
|
25
|
+
|
26
|
+
def slot_options
|
27
|
+
options = voo.slot_options
|
28
|
+
name_context_slot_option options
|
29
|
+
options
|
30
|
+
end
|
31
|
+
|
32
|
+
def name_context_slot_option opts
|
33
|
+
return unless initial_context_names.present?
|
34
|
+
opts[:name_context] = initial_context_names.map(&:key) * ","
|
35
|
+
end
|
36
|
+
|
37
|
+
def debug_slot
|
38
|
+
debug_slot? ? debug_slot_wrap { yield } : yield
|
39
|
+
end
|
40
|
+
|
41
|
+
def debug_slot?
|
42
|
+
params[:debug] == "slot" && !tagged(@current_view, :no_wrap_comments)
|
43
|
+
end
|
44
|
+
|
45
|
+
def debug_slot_wrap
|
46
|
+
pre = "<!--\n\n#{' ' * @depth}"
|
47
|
+
post = " SLOT: #{h card.name}\n\n-->"
|
48
|
+
[pre, "BEGIN", post, yield, pre, "END", post].join
|
49
|
+
end
|
50
|
+
|
51
|
+
def wrap_classes slot
|
52
|
+
list = ["card-slot", "#{@current_view}-view", card.safe_set_keys]
|
53
|
+
list.push "STRUCTURE-#{voo.structure.to_name.key}" if voo.structure
|
54
|
+
list.shift unless slot
|
55
|
+
classy list
|
56
|
+
end
|
57
|
+
|
58
|
+
def wrap_body
|
68
59
|
css_classes = ["card-body"]
|
69
|
-
css_classes
|
70
|
-
|
71
|
-
|
72
|
-
yield args
|
60
|
+
css_classes += ["card-content", card.safe_set_keys] if @content_body
|
61
|
+
wrap_with :div, class: classy(*css_classes) do
|
62
|
+
yield
|
73
63
|
end
|
74
64
|
end
|
75
65
|
|
76
|
-
def panel
|
77
|
-
wrap_with :div, class: "card-frame
|
78
|
-
|
66
|
+
def panel
|
67
|
+
wrap_with :div, class: classy("card-frame") do
|
68
|
+
yield
|
79
69
|
end
|
80
70
|
end
|
81
71
|
|
82
|
-
def
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
wrap args do
|
92
|
-
[
|
93
|
-
_optional_render(:menu, args),
|
94
|
-
panel(args) do
|
95
|
-
[
|
96
|
-
_optional_render(:header, args, :show),
|
97
|
-
_optional_render(:subheader, args,
|
98
|
-
(show_subheader ? :show : :hide)),
|
99
|
-
_optional_render(:help,
|
100
|
-
args.merge(help_class: "alert alert-info"),
|
101
|
-
:hide),
|
102
|
-
wrap_body(args) { output(yield(args)) }
|
103
|
-
]
|
104
|
-
end
|
105
|
-
]
|
106
|
-
end
|
72
|
+
def related_frame
|
73
|
+
voo.show :menu
|
74
|
+
wrap do
|
75
|
+
[
|
76
|
+
_render_menu,
|
77
|
+
_optional_render_subheader,
|
78
|
+
frame_help,
|
79
|
+
panel { wrap_body { yield } }
|
80
|
+
]
|
107
81
|
end
|
108
82
|
end
|
109
83
|
|
110
|
-
def
|
111
|
-
|
84
|
+
def frame &block
|
85
|
+
method = show_related_frame? ? :related_frame : :standard_frame
|
86
|
+
send method, &block
|
87
|
+
end
|
88
|
+
|
89
|
+
def show_related_frame?
|
90
|
+
parent && parent.voo.ok_view == :related
|
91
|
+
end
|
92
|
+
|
93
|
+
def standard_frame
|
94
|
+
voo.hide :horizontal_menu, :help
|
95
|
+
wrap do
|
112
96
|
[
|
113
|
-
|
114
|
-
|
115
|
-
_optional_render(:help, args.merge(help_class: "alert alert-info"),
|
116
|
-
:hide),
|
117
|
-
panel(args) do
|
97
|
+
_optional_render_menu,
|
98
|
+
panel do
|
118
99
|
[
|
119
|
-
|
120
|
-
|
100
|
+
_optional_render_header,
|
101
|
+
frame_help,
|
102
|
+
wrap_body { yield }
|
121
103
|
]
|
122
104
|
end
|
123
105
|
]
|
124
106
|
end
|
125
107
|
end
|
126
108
|
|
127
|
-
def
|
128
|
-
|
129
|
-
|
130
|
-
|
109
|
+
def frame_help
|
110
|
+
# TODO: address these args
|
111
|
+
_optional_render :help, help_class: "alert alert-info"
|
112
|
+
end
|
113
|
+
|
114
|
+
def frame_and_form action, form_opts={}
|
115
|
+
frame do
|
131
116
|
card_form action, form_opts do
|
132
|
-
output
|
117
|
+
output yield
|
133
118
|
end
|
134
119
|
end
|
135
120
|
end
|
136
121
|
|
137
122
|
# alert_types: 'success', 'info', 'warning', 'danger'
|
138
|
-
def alert alert_type,
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
if
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
""
|
152
|
-
end
|
153
|
-
content_tag :div, class: css_class, role: "alert" do
|
154
|
-
close_button + output(yield args)
|
123
|
+
def alert alert_type, dismissable=false
|
124
|
+
classes = ["alert", "alert-#{alert_type}"]
|
125
|
+
classes << "alert-dismissible " if dismissable
|
126
|
+
|
127
|
+
wrap_with :div, class: classy(classes), role: "alert" do
|
128
|
+
[(alert_close_button if dismissable), output(yield)]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def alert_close_button
|
133
|
+
wrap_with :button, type: "button", "data-dismiss" => "alert",
|
134
|
+
class: "close", "aria-label" => "Close" do
|
135
|
+
wrap_with :span, "×", "aria-hidden" => true
|
155
136
|
end
|
156
137
|
end
|
157
138
|
|
158
|
-
def wrap_main
|
159
|
-
return
|
160
|
-
|
139
|
+
def wrap_main
|
140
|
+
return yield if Env.ajax? || params[:layout] == "none"
|
141
|
+
wrap_with :div, yield, id: "main"
|
161
142
|
end
|
162
143
|
|
163
144
|
def wrap_with tag, content_or_args={}, html_args={}
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
end
|
168
|
-
else
|
169
|
-
content_tag(tag, html_args) do
|
170
|
-
output(content_or_args).html_safe
|
171
|
-
end
|
172
|
-
end
|
145
|
+
content = block_given? ? yield : content_or_args
|
146
|
+
tag_args = block_given? ? content_or_args : html_args
|
147
|
+
content_tag(tag, tag_args) { output(content).to_s.html_safe }
|
173
148
|
end
|
174
149
|
|
175
150
|
def wrap_each_with tag, content_or_args={}, args={}
|
176
151
|
content = block_given? ? yield(args) : content_or_args
|
177
152
|
args = block_given? ? content_or_args : args
|
178
153
|
content.compact.map do |item|
|
179
|
-
wrap_with
|
180
|
-
item
|
181
|
-
end
|
154
|
+
wrap_with(tag, args) { item }
|
182
155
|
end.join "\n"
|
183
156
|
end
|
184
157
|
end
|
@@ -30,6 +30,10 @@ def rule_setting_name
|
|
30
30
|
cardname.tag
|
31
31
|
end
|
32
32
|
|
33
|
+
def rule_setting_title
|
34
|
+
rule_setting_name.tr "*", ""
|
35
|
+
end
|
36
|
+
|
33
37
|
def rule_user_setting_name
|
34
38
|
if is_preference?
|
35
39
|
"#{rule_user_name}+#{rule_setting_name}"
|
@@ -46,49 +50,34 @@ def rule_user
|
|
46
50
|
is_preference? ? self[-2] : nil
|
47
51
|
end
|
48
52
|
|
49
|
-
# ~~~~~~~~~~ determine the set options to which
|
53
|
+
# ~~~~~~~~~~ determine the set options to which a user can apply the rule.
|
50
54
|
def set_options
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
55
|
+
candidates = set_prototype.set_names
|
56
|
+
first = first_set_option_index candidates
|
57
|
+
tally = { existing: 0, options: [] }
|
58
|
+
candidates[first..-1].each do |set_name|
|
59
|
+
tally_set_option set_name, tally
|
60
|
+
end
|
61
|
+
tally[:options]
|
62
|
+
end
|
63
|
+
|
64
|
+
def tally_set_option set_name, tally
|
65
|
+
state =
|
60
66
|
if Card.exists?("#{set_name}+#{rule_user_setting_name}")
|
61
|
-
|
62
|
-
|
63
|
-
[set_name, :current]
|
64
|
-
else
|
65
|
-
fallback_set ||= set_name
|
66
|
-
[set_name, :overwritten]
|
67
|
-
end
|
67
|
+
tally[:existing] += 1
|
68
|
+
tally[:existing] == 1 ? :current : :overwritten
|
68
69
|
else
|
69
|
-
|
70
|
+
tally[:existing] < 1 ? :enabled : :disabled
|
70
71
|
end
|
71
|
-
|
72
|
-
|
73
|
-
# fallback_set = if first > 0
|
74
|
-
# res[0..(first-1)].find do |set_name|
|
75
|
-
# Card.exists?("#{set_name}+#{rule_user_setting_name}")
|
76
|
-
# end
|
77
|
-
# end
|
78
|
-
# last = res.index{|s| s.to_name.key == cardname.trunk_name.key} || -1
|
79
|
-
# # note, the -1 can happen with virtual cards because the self set doesn't
|
80
|
-
# show up in the set_names. FIXME!!
|
81
|
-
# [res[first..last], fallback_set]
|
82
|
-
#
|
83
|
-
# The broadest set should always be the currently applied rule
|
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
|
72
|
+
tally[:options] << [set_name, state]
|
73
|
+
end
|
90
74
|
|
91
|
-
|
75
|
+
# the narrowest rule should be the one attached to the set being viewed.
|
76
|
+
# So, eg, if you're looking at the '*all plus' set, you shouldn't
|
77
|
+
# have the option to create rules based on arbitrary narrower sets, though
|
78
|
+
# narrower sets will always apply to whatever prototype we create
|
79
|
+
def first_set_option_index candidates
|
80
|
+
new_card? ? 0 : candidates.index { |c| c.to_name.key == rule_set_key }
|
92
81
|
end
|
93
82
|
|
94
83
|
def set_prototype
|
@@ -1,371 +1,392 @@
|
|
1
1
|
format :html do
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
def current_rule force_reload=true
|
3
|
+
@current_rule = nil if force_reload
|
4
|
+
@current_rule ||= begin
|
5
|
+
rule = determine_current_rule
|
6
|
+
reload_rule rule
|
7
|
+
end
|
8
|
+
end
|
6
9
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
+
def determine_current_rule
|
11
|
+
existing = find_existing_rule_card
|
12
|
+
return existing if existing
|
13
|
+
Card.new name: "#{Card[:all].name}+#{card.rule_user_setting_name}"
|
14
|
+
end
|
10
15
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
].map do |css_class, cell_content|
|
16
|
-
wrap_rule_cell css_class, cell_content, known_or_missing
|
16
|
+
def open_rule_wrap rule_view
|
17
|
+
rule_view_class = rule_view.to_s.tr '_', '-'
|
18
|
+
wrap_with :tr, class: "card-slot open-rule #{rule_view_class}" do
|
19
|
+
wrap_with(:td, class: "rule-cell", colspan: 3) { yield }
|
17
20
|
end
|
18
|
-
%(<tr class="card-slot closed-rule">#{cells.join "\n"}</tr>)
|
19
21
|
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
view :open_rule, cache: :never, tags: :unknown_ok do
|
24
|
+
return "not a rule" unless card.is_rule?
|
25
|
+
rule_view = open_rule_body_view
|
26
|
+
open_rule_wrap(rule_view) do
|
27
|
+
[open_rule_instruction,
|
28
|
+
open_rule_setting_links,
|
29
|
+
open_rule_body(rule_view)]
|
30
|
+
end
|
27
31
|
end
|
28
32
|
|
29
|
-
def
|
30
|
-
|
33
|
+
def open_rule_body rule_view
|
34
|
+
wrap_with :div, class: "card-body" do
|
35
|
+
nest current_rule, view: rule_view, rule_context: card
|
36
|
+
end
|
31
37
|
end
|
32
38
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
</div>
|
38
|
-
)
|
39
|
+
def open_rule_body_view
|
40
|
+
return :show_rule if params[:success] && !params[:type_reload]
|
41
|
+
card_action = card.new_card? ? :create : :update
|
42
|
+
card.ok?(card_action) ? :edit_rule : :show_rule
|
39
43
|
end
|
40
44
|
|
41
|
-
|
42
|
-
|
43
|
-
|
45
|
+
view :show_rule, cache: :never, tags: :unknown_ok do
|
46
|
+
return "not a rule" unless card.is_rule?
|
47
|
+
return "No Current Rule" if card.new_card?
|
48
|
+
|
49
|
+
voo.items[:view] ||= :link
|
50
|
+
show_rule_set(card.rule_set) + _render_core
|
44
51
|
end
|
45
52
|
|
46
|
-
def
|
47
|
-
|
48
|
-
|
49
|
-
set_context: card.cardname.trunk_name
|
50
|
-
)
|
51
|
-
else
|
52
|
-
""
|
53
|
+
def show_rule_set set
|
54
|
+
wrap_with :div, class: "rule-set" do
|
55
|
+
%(<label>Applies to</label> #{link_to_card set.cardname, set.label}:)
|
53
56
|
end
|
54
57
|
end
|
55
58
|
|
56
|
-
view :
|
59
|
+
view :closed_rule, cache: :never, tags: :unknown_ok do
|
57
60
|
return "not a rule" unless card.is_rule?
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
<<-HTML
|
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
|
-
#{open_rule_setting_links setting_name}
|
70
|
-
</div>
|
71
|
-
<div class="alert alert-info rule-instruction">
|
72
|
-
#{open_rule_instruction setting_name}
|
73
|
-
</div>
|
74
|
-
<div class="card-body">
|
75
|
-
#{body}
|
76
|
-
</div>
|
77
|
-
</td>
|
78
|
-
</tr>
|
79
|
-
HTML
|
80
|
-
end
|
81
|
-
|
82
|
-
def open_rule_setting_links setting_name
|
83
|
-
setting_title = setting_name.tr "*", ""
|
84
|
-
closed_rule_link = link_to_view :closed_rule, setting_title,
|
85
|
-
class: "close-rule-link slotter"
|
86
|
-
all_rules_link = link_to_card setting_name, "all #{setting_title} rules",
|
87
|
-
class: "setting-link", target: "wagn_setting"
|
88
|
-
closed_rule_link + all_rules_link
|
89
|
-
end
|
90
|
-
|
91
|
-
def open_rule_instruction setting_name
|
92
|
-
process_content "{{#{setting_name}+*right+*help|content}}"
|
61
|
+
rule_card = find_existing_rule_card
|
62
|
+
wrap_closed_rule rule_card do
|
63
|
+
[:setting, :content, :set].map do |cell|
|
64
|
+
send "closed_rule_#{cell}_cell", rule_card
|
65
|
+
end
|
66
|
+
end
|
93
67
|
end
|
94
68
|
|
95
|
-
def
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
:edit_rule
|
69
|
+
def closed_rule_setting_cell _rule_card
|
70
|
+
wrap_rule_cell "rule-setting" do
|
71
|
+
link_to_open_rule
|
72
|
+
end
|
100
73
|
end
|
101
74
|
|
102
|
-
def
|
103
|
-
|
104
|
-
|
105
|
-
Card.new card_args
|
106
|
-
else
|
107
|
-
current_rule = current_rule.refresh
|
108
|
-
current_rule.assign_attributes card_args
|
109
|
-
current_rule.include_set_modules
|
75
|
+
def closed_rule_content_cell rule_card
|
76
|
+
wrap_rule_cell "rule-content" do
|
77
|
+
rule_content_container { closed_rule_content rule_card }
|
110
78
|
end
|
111
79
|
end
|
112
80
|
|
113
|
-
def
|
114
|
-
|
115
|
-
|
81
|
+
def closed_rule_set_cell rule_card
|
82
|
+
wrap_rule_cell "rule-set" do
|
83
|
+
rule_card ? rule_card.trunk.label : ""
|
116
84
|
end
|
117
|
-
current_rule = reload_current_rule current_rule
|
118
|
-
args.reverse_merge! current_rule: current_rule,
|
119
|
-
setting_name: card.rule_setting_name
|
120
85
|
end
|
121
86
|
|
122
|
-
|
123
|
-
|
87
|
+
def wrap_closed_rule rule_card
|
88
|
+
klass = rule_card && rule_card.real? ? "known-rule" : "missing-rule"
|
89
|
+
wrap_with(:tr, class: "card-slot closed-rule #{klass}") { yield }
|
90
|
+
end
|
124
91
|
|
125
|
-
|
126
|
-
|
127
|
-
args[:item] ||= :link
|
128
|
-
%(
|
129
|
-
<div class="rule-set">
|
130
|
-
<label>Applies to</label> #{link_to_card set.cardname, set.label}:
|
131
|
-
</div>
|
132
|
-
#{_render_core args}
|
133
|
-
)
|
134
|
-
else
|
135
|
-
"No Current Rule"
|
136
|
-
end
|
92
|
+
def wrap_rule_cell css_class
|
93
|
+
wrap_with(:td, class: "rule-cell #{css_class}") { yield }
|
137
94
|
end
|
138
95
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
url: path(action: :update, no_mark: true),
|
143
|
-
html: { class: "card-form card-rule-form" }
|
144
|
-
}
|
145
|
-
if args[:remote]
|
146
|
-
form_args[:remote] = true
|
147
|
-
form_args[:html][:class] += " slotter"
|
96
|
+
def rule_content_container
|
97
|
+
wrap_with :div, class: "rule-content-container" do
|
98
|
+
wrap_with(:span, class: "closed-content content") { yield }
|
148
99
|
end
|
100
|
+
end
|
149
101
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
102
|
+
def link_to_open_rule
|
103
|
+
setting_title = card.cardname.tag.tr "*", ""
|
104
|
+
link_to_view :open_rule, setting_title, class: "edit-rule-link slotter"
|
105
|
+
end
|
106
|
+
|
107
|
+
def closed_rule_content rule_card
|
108
|
+
return "" unless rule_card
|
109
|
+
nest rule_card, view: :closed_content,
|
110
|
+
set_context: card.cardname.trunk_name
|
111
|
+
end
|
112
|
+
|
113
|
+
def open_rule_setting_links
|
114
|
+
wrap_with :div, class: "rule-setting" do
|
115
|
+
[link_to_closed_rule, link_to_all_rules]
|
157
116
|
end
|
158
117
|
end
|
159
118
|
|
160
|
-
|
161
|
-
|
119
|
+
def link_to_all_rules
|
120
|
+
link_to_card card.rule_setting_name, "all #{card.rule_setting_title} rules",
|
121
|
+
class: "setting-link", target: "wagn_setting"
|
162
122
|
end
|
163
123
|
|
164
|
-
def
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
args[:set_selected] = params[:type_reload] ? card.rule_set_name : false
|
169
|
-
args[:set_options], args[:fallback_set] = args[:rule_context].set_options
|
124
|
+
def link_to_closed_rule
|
125
|
+
link_to_view :closed_rule, card.rule_setting_title,
|
126
|
+
class: "close-rule-link slotter"
|
127
|
+
end
|
170
128
|
|
171
|
-
|
172
|
-
|
173
|
-
card
|
174
|
-
|
175
|
-
view: "open_rule",
|
176
|
-
item: "view_rule"
|
177
|
-
)
|
178
|
-
edit_rule_button_args args
|
179
|
-
end
|
180
|
-
|
181
|
-
def edit_rule_button_args args
|
182
|
-
args[:delete_button] ||= delete_button args
|
183
|
-
args[:cancel_button] ||=
|
184
|
-
begin
|
185
|
-
cancel_view = card.new_card? ? :closed_rule : :open_rule
|
186
|
-
cancel_button class: "rule-cancel-button",
|
187
|
-
href: path(view: cancel_view, success: false)
|
188
|
-
end
|
129
|
+
def open_rule_instruction
|
130
|
+
wrap_with :div, class: "alert alert-info rule-instruction" do
|
131
|
+
process_content "{{#{card.rule_setting_name}+*right+*help|content}}"
|
132
|
+
end
|
189
133
|
end
|
190
134
|
|
191
|
-
def
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
default_edit_rule_args args
|
201
|
-
edit_single_rule_button_args args
|
135
|
+
def reload_rule rule
|
136
|
+
return rule unless (card_args = params[:card])
|
137
|
+
if card_args[:name] && card_args[:name].to_name.key != rule.key
|
138
|
+
Card.new card_args
|
139
|
+
else
|
140
|
+
rule = rule.refresh
|
141
|
+
rule.assign_attributes card_args
|
142
|
+
rule.include_set_modules
|
143
|
+
end
|
202
144
|
end
|
203
145
|
|
204
|
-
|
205
|
-
|
146
|
+
view :edit_rule, cache: :never, tags: :unknown_ok do |args|
|
147
|
+
return "not a rule" unless card.is_rule?
|
148
|
+
@rule_context = args[:rule_context] || card
|
149
|
+
@edit_rule_success = edit_rule_success
|
150
|
+
action_args = { action: :update, no_mark: true }
|
151
|
+
|
152
|
+
card_form action_args, class: "card-rule-form" do |_form|
|
153
|
+
[hidden_tags(success: @edit_rule_success),
|
154
|
+
editor,
|
155
|
+
edit_rule_buttons].join
|
156
|
+
end
|
157
|
+
end
|
206
158
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
159
|
+
def edit_rule_success
|
160
|
+
{ id: @rule_context.cardname.url_key,
|
161
|
+
view: "open_rule",
|
162
|
+
item: "view_rule" }
|
163
|
+
end
|
164
|
+
|
165
|
+
def edit_rule_buttons
|
166
|
+
wrap_with(:div, class: "button-area") do
|
167
|
+
[
|
168
|
+
edit_rule_delete_button,
|
169
|
+
edit_rule_submit_button,
|
170
|
+
edit_rule_cancel_button
|
171
|
+
]
|
172
|
+
end
|
211
173
|
end
|
212
174
|
|
213
|
-
def
|
175
|
+
def edit_rule_delete_button args={}
|
214
176
|
return if card.new_card?
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
"#{fcard.label}"
|
177
|
+
options = { remote: true,
|
178
|
+
type: "button",
|
179
|
+
class: "rule-delete-button slotter",
|
180
|
+
href: path(action: :delete, success: @edit_rule_success) }
|
181
|
+
options["data-slot-selector"] = slot_selector if args[:slot_selector]
|
182
|
+
delete_button_confirmation_option options, args[:fallback_set]
|
183
|
+
wrap_with :span, class: "rule-delete-section" do
|
184
|
+
button_tag "Delete", options
|
224
185
|
end
|
225
|
-
%(<span class="rule-delete-section">#{button_tag 'Delete', b_args}</span>)
|
226
186
|
end
|
227
187
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
188
|
+
def delete_button_confirmation_option options, fallback_set
|
189
|
+
return unless fallback_set && (fallback_set_card = Card.fetch fallback_set)
|
190
|
+
setting = card.rule_setting_name
|
191
|
+
options["data-confirm"] = "Deleting will revert to #{setting} rule "\
|
192
|
+
"for #{fallback_set_card.label}"
|
193
|
+
end
|
194
|
+
|
195
|
+
def edit_rule_submit_button
|
196
|
+
submit_button class: "rule-submit-button"
|
197
|
+
end
|
198
|
+
|
199
|
+
def edit_rule_cancel_button
|
200
|
+
cancel_view = card.new_card? ? :closed_rule : :open_rule
|
201
|
+
cancel_button class: "rule-cancel-button",
|
202
|
+
href: path(view: cancel_view, success: false)
|
203
|
+
end
|
204
|
+
|
205
|
+
def editor
|
232
206
|
wrap_with(:div, class: "card-editor") do
|
233
|
-
[
|
234
|
-
|
235
|
-
|
236
|
-
set_selection(args)
|
237
|
-
]
|
207
|
+
[rules_type_formgroup,
|
208
|
+
rule_content_formgroup,
|
209
|
+
rule_set_selection].compact
|
238
210
|
end
|
239
211
|
end
|
240
212
|
|
241
|
-
def
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
213
|
+
def rules_type_formgroup
|
214
|
+
return unless card.right.rule_type_editable
|
215
|
+
success = @edit_rule_success
|
216
|
+
wrap_type_formgroup do
|
217
|
+
type_field(
|
218
|
+
href: path(mark: success[:id], view: success[:view], type_reload: true),
|
219
|
+
class: "type-field rule-type-field live-type-field",
|
220
|
+
"data-remote" => true
|
221
|
+
)
|
222
|
+
end
|
250
223
|
end
|
251
224
|
|
252
|
-
def
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
#{hidden_field_tag 'success[item]', args[:item]}
|
257
|
-
)
|
225
|
+
def rule_content_formgroup
|
226
|
+
formgroup "rule", editor: "content" do
|
227
|
+
content_field true
|
228
|
+
end
|
258
229
|
end
|
259
230
|
|
260
|
-
def
|
261
|
-
wrap_with
|
262
|
-
[
|
263
|
-
|
264
|
-
related_set_formgroup(args)
|
265
|
-
]
|
231
|
+
def rule_set_selection
|
232
|
+
wrap_with :div, class: "row" do
|
233
|
+
[rule_set_formgroup,
|
234
|
+
related_set_formgroup]
|
266
235
|
end
|
267
236
|
end
|
268
237
|
|
269
|
-
def
|
270
|
-
|
271
|
-
|
238
|
+
# def default_edit_rule_args args
|
239
|
+
# args[:set_context] ||= card.rule_set_name
|
240
|
+
# end
|
241
|
+
|
242
|
+
def rule_set_formgroup
|
243
|
+
tag = @rule_context.rule_user_setting_name
|
244
|
+
narrower = []
|
272
245
|
option_list "set" do
|
273
|
-
|
274
|
-
|
275
|
-
checked: checked_set_button?(set_name, args)
|
246
|
+
rule_set_options.map do |set_name, state|
|
247
|
+
rule_set_radio_button set_name, tag, state, narrower
|
276
248
|
end
|
277
249
|
end
|
278
250
|
end
|
279
251
|
|
280
|
-
def
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
if
|
286
|
-
|
287
|
-
|
252
|
+
def rule_set_options
|
253
|
+
@rule_set_options ||= @rule_context.set_options
|
254
|
+
end
|
255
|
+
|
256
|
+
def selected_rule_set
|
257
|
+
if @rule_set_options.length == 1 then true
|
258
|
+
elsif params[:type_reload] then card.rule_set_name
|
259
|
+
else false
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
def rule_set_radio_button set_name, tag, state, narrower
|
264
|
+
warning = narrower_rule_warning narrower, state, set_name
|
265
|
+
checked = checked_set_button? set_name, selected_rule_set
|
266
|
+
rule_radio set_name, state do
|
267
|
+
radio_text = "#{set_name}+#{tag}"
|
268
|
+
radio_button :name, radio_text, checked: checked, warning: warning
|
288
269
|
end
|
289
|
-
button + set_label(card, set_name, label, state)
|
290
270
|
end
|
291
271
|
|
292
|
-
def
|
293
|
-
|
294
|
-
|
272
|
+
def narrower_rule_warning narrower_rules, state, set_name
|
273
|
+
return unless state.in? [:current, :overwritten]
|
274
|
+
narrower_rules << Card.fetch(set_name).uncapitalized_label
|
275
|
+
return unless state == :overwritten
|
276
|
+
narrower_rule_warning_message narrower_rules
|
277
|
+
end
|
278
|
+
|
279
|
+
def narrower_rule_warning_message narrower_rules
|
280
|
+
plural = narrower_rules.size > 1 ? "s" : ""
|
281
|
+
"This rule will not have any effect on this card unless you delete " \
|
282
|
+
"the narrower rule#{plural} for #{narrower_rules.to_sentence}."
|
283
|
+
end
|
284
|
+
|
285
|
+
def checked_set_button? set_name, selected
|
286
|
+
[set_name, true].include? selected
|
295
287
|
end
|
296
288
|
|
297
289
|
def current_set_key
|
298
|
-
card.new_card? ? Card
|
290
|
+
card.new_card? ? Card.quick_fetch(:all).cardname.key : card.rule_set_key
|
299
291
|
end
|
300
292
|
|
301
|
-
def related_set_formgroup
|
302
|
-
related_sets =
|
303
|
-
|
304
|
-
|
305
|
-
tag = args[:rule_context].rule_user_setting_name
|
293
|
+
def related_set_formgroup
|
294
|
+
related_sets = related_sets_in_context
|
295
|
+
return "" unless related_sets && !related_sets.empty?
|
296
|
+
tag = @rule_context.rule_user_setting_name
|
306
297
|
option_list "related set" do
|
307
|
-
related_sets
|
308
|
-
rule_name = "#{set_name}+#{tag}"
|
309
|
-
rule_card = Card.fetch rule_name, skip_modules: true
|
310
|
-
state = (rule_card && :exists)
|
311
|
-
radio_button(:name, rule_name) +
|
312
|
-
set_label(card, set_name, label, state)
|
313
|
-
end
|
298
|
+
related_rule_radios related_sets, tag
|
314
299
|
end
|
315
300
|
end
|
316
301
|
|
317
|
-
def
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
302
|
+
def related_sets_in_context
|
303
|
+
set_context = @rule_context.rule_set_name
|
304
|
+
set_context && Card.fetch(set_context).prototype.related_sets
|
305
|
+
end
|
306
|
+
|
307
|
+
def related_rule_radios related_sets, tag
|
308
|
+
related_sets.map do |set_name, _label|
|
309
|
+
rule_name = "#{set_name}+#{tag}"
|
310
|
+
state = Card.exists?(rule_name) ? :exists : nil
|
311
|
+
rule_radio set_name, state do
|
312
|
+
radio_button :name, rule_name
|
327
313
|
end
|
328
|
-
|
329
|
-
%(<label class="#{label_class}">#{label_body}</label>).html_safe
|
314
|
+
end
|
330
315
|
end
|
331
316
|
|
332
|
-
def
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
317
|
+
def rule_radio set_name, state
|
318
|
+
label_classes = ["set-label", ("current-set-label" if state == :current)]
|
319
|
+
icon = glyphicon "question-sign", "link-muted"
|
320
|
+
wrap_with :label, class: label_classes.compact.join(" ") do
|
321
|
+
[yield,
|
322
|
+
rule_radio_label(set_name, state),
|
323
|
+
link_to_card(set_name, icon, target: "wagn_set")]
|
324
|
+
end
|
337
325
|
end
|
338
326
|
|
339
|
-
def
|
340
|
-
|
341
|
-
|
327
|
+
def rule_radio_label set_name, state
|
328
|
+
label = Card.fetch(set_name).label
|
329
|
+
extra_info = extra_rule_radio_info state, set_name
|
330
|
+
label += " <em>#{extra_info}</em>".html_safe if extra_info
|
331
|
+
label
|
342
332
|
end
|
343
333
|
|
344
|
-
def
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
]
|
334
|
+
def extra_rule_radio_info state, set_name
|
335
|
+
case state
|
336
|
+
when :current
|
337
|
+
"(current)"
|
338
|
+
when :overwritten, :exists
|
339
|
+
link_to_card "#{set_name}+#{card.rule_user_setting_name}", "(#{state})"
|
351
340
|
end
|
352
341
|
end
|
353
342
|
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
343
|
+
def option_list title
|
344
|
+
formgroup title, editor: "set", class: "col-xs-6" do
|
345
|
+
wrap_with :ul do
|
346
|
+
wrap_each_with(:li, class: "radio") { yield }
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
|
352
|
+
|
353
|
+
|
354
|
+
|
355
|
+
|
356
|
+
|
357
|
+
|
358
|
+
|
359
|
+
|
360
|
+
|
361
|
+
view :edit_single_rule, cache: :never do |args|
|
362
|
+
%(<div class="edit-single-rule panel-body">#{render_edit_rule args}</div>)
|
363
|
+
end
|
364
|
+
|
365
|
+
def default_edit_single_rule_args args
|
366
|
+
args[:remote] ||= false
|
367
|
+
args[:success] ||= {
|
368
|
+
card: args[:parent] || card,
|
369
|
+
id: (args[:parent] && args[:parent].cardname.url_key) ||
|
370
|
+
card.cardname.url_key,
|
371
|
+
view: :open,
|
372
|
+
item: nil
|
373
|
+
}
|
374
|
+
default_edit_rule_args args
|
375
|
+
edit_single_rule_button_args args
|
376
|
+
end
|
377
|
+
|
378
|
+
def edit_single_rule_button_args args
|
379
|
+
args[:delete_button] = delete_button args, ".card-slot.related-view"
|
380
|
+
|
381
|
+
args[:cancel_button] =
|
382
|
+
link_to_card args[:success][:id], "Cancel",
|
383
|
+
class: "rule-cancel-button btn btn-default",
|
384
|
+
path: { view: args[:success][:view] }
|
385
|
+
end
|
365
386
|
|
366
387
|
private
|
367
388
|
|
368
|
-
def
|
389
|
+
def find_existing_rule_card
|
369
390
|
# self.card is a POTENTIAL rule; it quacks like a rule but may or may not
|
370
391
|
# exist.
|
371
392
|
# This generates a prototypical member of the POTENTIAL rule's set
|