card 1.19.6 → 1.20.0
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.
- 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,10 +1,7 @@
|
|
1
1
|
format :html do
|
2
2
|
def glyphicon icon_type, extra_class=""
|
3
|
-
|
4
|
-
|
5
|
-
class: "glyphicon glyphicon-#{icon_type} #{extra_class}",
|
6
|
-
"aria-hidden" => true
|
7
|
-
)
|
3
|
+
wrap_with :span, "", "aria-hidden" => true,
|
4
|
+
class: "glyphicon glyphicon-#{icon_type} #{extra_class}"
|
8
5
|
end
|
9
6
|
|
10
7
|
def button_link link_text, opts={}
|
@@ -52,80 +49,6 @@ format :html do
|
|
52
49
|
'<li role="separator" class="divider"></li>'
|
53
50
|
end
|
54
51
|
|
55
|
-
def breadcrumb items
|
56
|
-
content_tag :ol, class: "breadcrumb" do
|
57
|
-
items.map do |item|
|
58
|
-
content_tag :li, item, class: "breadcrumb-item"
|
59
|
-
end.join
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
# Options
|
64
|
-
# header: { content: String, brand: ( String | {name: , href: } ) }
|
65
|
-
def navbar id, opts={}
|
66
|
-
nav_opts = opts[:navbar_opts] || {}
|
67
|
-
nav_opts[:class] ||= opts[:class]
|
68
|
-
add_class nav_opts,
|
69
|
-
"navbar navbar-#{opts.delete(:navbar_type) || 'default'}"
|
70
|
-
header_opts = opts[:header] || {}
|
71
|
-
if opts[:toggle_align] == :left
|
72
|
-
opts[:toggle] = :hide
|
73
|
-
opts[:collapsed_content] ||= ""
|
74
|
-
opts[:collapsed_content] +=
|
75
|
-
navbar_toggle(
|
76
|
-
id, opts[:toggle], "pull-left navbar-link"
|
77
|
-
).html_safe
|
78
|
-
end
|
79
|
-
wrap_with :nav, nav_opts do
|
80
|
-
[
|
81
|
-
navbar_header(id, header_opts.delete(:content),
|
82
|
-
header_opts.reverse_merge(toggle: opts[:toggle])),
|
83
|
-
navbar_collapsed_content(opts[:collapsed_content]),
|
84
|
-
content_tag(:div, output(yield).html_safe,
|
85
|
-
class: "collapse navbar-collapse",
|
86
|
-
id: "navbar-collapse-#{id}")
|
87
|
-
]
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def navbar_collapsed_content content
|
92
|
-
content_tag(:div, content.html_safe, class: "container-fluid") if content
|
93
|
-
end
|
94
|
-
|
95
|
-
def navbar_header id, content="", opts={}
|
96
|
-
brand =
|
97
|
-
if opts[:brand]
|
98
|
-
if opts[:brand].is_a? String
|
99
|
-
"<a class='navbar-brand' href='#'>#{opts[:brand]}</a>"
|
100
|
-
else
|
101
|
-
link = opts[:brand][:href] || "#"
|
102
|
-
"<a class='navbar-brand' href='#{link}#'>#{opts[:brand][:name]}</a>"
|
103
|
-
end
|
104
|
-
end
|
105
|
-
wrap_with :div, class: "navbar-header" do
|
106
|
-
[
|
107
|
-
(navbar_toggle(id, opts[:toggle]) unless opts[:toggle] == :hide),
|
108
|
-
brand,
|
109
|
-
(content if content)
|
110
|
-
]
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def navbar_toggle id, content=nil, css_class=""
|
115
|
-
content ||= %(
|
116
|
-
<span class="icon-bar"></span>
|
117
|
-
<span class="icon-bar"></span>
|
118
|
-
<span class="icon-bar"></span>
|
119
|
-
)
|
120
|
-
<<-HTML
|
121
|
-
<button type="button" class="navbar-toggle collapsed #{css_class}"
|
122
|
-
data-toggle="collapse" data-target="#navbar-collapse-#{id}">
|
123
|
-
<span class="sr-only">Toggle navigation</span>
|
124
|
-
#{content}
|
125
|
-
</button>
|
126
|
-
HTML
|
127
|
-
end
|
128
|
-
|
129
52
|
def split_button button, args={}
|
130
53
|
items = yield
|
131
54
|
args[:situation] ||= "primary"
|
@@ -160,69 +83,13 @@ format :html do
|
|
160
83
|
options = content_or_options if block_given?
|
161
84
|
content = block_given? ? yield : content_or_options
|
162
85
|
content = Array(content)
|
163
|
-
|
164
|
-
wrap_with :ul, options
|
86
|
+
default_item_options = options.delete(:items) || {}
|
87
|
+
wrap_with :ul, options do
|
165
88
|
content.map do |item|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
end
|
170
|
-
|
171
|
-
def accordion_group list, collapse_id=card.cardname.safe_key
|
172
|
-
accordions = ""
|
173
|
-
index = 1
|
174
|
-
list.each_pair do |title, content|
|
175
|
-
accordions << accordion(title, content, "#{collapse_id}-#{index}")
|
176
|
-
index += 1
|
177
|
-
end
|
178
|
-
content_tag :div, accordions.html_safe,
|
179
|
-
class: "panel-group",
|
180
|
-
id: "accordion-#{collapse_id}",
|
181
|
-
role: "tablist",
|
182
|
-
"aria-multiselectable" => "true"
|
183
|
-
end
|
184
|
-
|
185
|
-
private
|
186
|
-
|
187
|
-
def accordion title, content, collapse_id=card.cardname.safe_key
|
188
|
-
accordion_content =
|
189
|
-
case content
|
190
|
-
when Hash then accordion_group(content, collapse_id)
|
191
|
-
when Array then content.present? && list_group(content)
|
192
|
-
when String then content
|
89
|
+
i_content, i_opts = item
|
90
|
+
i_opts ||= default_item_options
|
91
|
+
wrap_with :li, i_content, i_opts
|
193
92
|
end
|
194
|
-
<<-HTML.html_safe
|
195
|
-
<div class="panel panel-default">
|
196
|
-
#{accordion_panel(title, accordion_content, collapse_id)}
|
197
|
-
</div>
|
198
|
-
HTML
|
199
|
-
end
|
200
|
-
|
201
|
-
def accordion_panel title, body, collapse_id
|
202
|
-
if body
|
203
|
-
<<-HTML
|
204
|
-
<div class="panel-heading" role="tab" id="heading-#{collapse_id}">
|
205
|
-
<h4 class="panel-title">
|
206
|
-
<a data-toggle="collapse" data-parent="#accordion-#{collapse_id}" \
|
207
|
-
href="##{collapse_id}" aria-expanded="true" \
|
208
|
-
aria-controls="#{collapse_id}">
|
209
|
-
#{title}
|
210
|
-
</a>
|
211
|
-
</h4>
|
212
|
-
</div>
|
213
|
-
<div id="#{collapse_id}" class="panel-collapse collapse" \
|
214
|
-
role="tabpanel" aria-labelledby="heading-#{collapse_id}">
|
215
|
-
<div class="panel-body">
|
216
|
-
#{body}
|
217
|
-
</div>
|
218
|
-
</div>
|
219
|
-
HTML
|
220
|
-
else
|
221
|
-
<<-HTML
|
222
|
-
<li class="list-group-item">
|
223
|
-
<h4 class="panel-title">#{title}</h4>
|
224
|
-
</li>
|
225
|
-
HTML
|
226
93
|
end
|
227
94
|
end
|
228
95
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
format :html do
|
2
|
+
# Options
|
3
|
+
# header: { content: String, brand: ( String | {name: , href: } ) }
|
4
|
+
def navbar id, opts={}
|
5
|
+
nav_opts = opts[:navbar_opts] || {}
|
6
|
+
nav_opts[:class] ||= opts[:class]
|
7
|
+
add_class nav_opts,
|
8
|
+
"navbar navbar-#{opts.delete(:navbar_type) || 'default'}"
|
9
|
+
header_opts = opts[:header] || {}
|
10
|
+
if opts[:toggle_align] == :left
|
11
|
+
opts[:toggle] = :hide
|
12
|
+
opts[:collapsed_content] ||= ""
|
13
|
+
opts[:collapsed_content] +=
|
14
|
+
navbar_toggle(
|
15
|
+
id, opts[:toggle], "pull-left navbar-link"
|
16
|
+
).html_safe
|
17
|
+
end
|
18
|
+
wrap_with :nav, nav_opts do
|
19
|
+
[
|
20
|
+
navbar_header(id, header_opts.delete(:content),
|
21
|
+
header_opts.reverse_merge(toggle: opts[:toggle])),
|
22
|
+
navbar_collapsed_content(opts[:collapsed_content]),
|
23
|
+
wrap_with(:div, class: "collapse navbar-collapse",
|
24
|
+
id: "navbar-collapse-#{id}") { yield }
|
25
|
+
]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def navbar_collapsed_content content
|
30
|
+
wrap_with(:div, content, class: "container-fluid") if content
|
31
|
+
end
|
32
|
+
|
33
|
+
def navbar_header id, content="", opts={}
|
34
|
+
brand =
|
35
|
+
if opts[:brand]
|
36
|
+
if opts[:brand].is_a? String
|
37
|
+
"<a class='navbar-brand' href='#'>#{opts[:brand]}</a>"
|
38
|
+
else
|
39
|
+
link = opts[:brand][:href] || "#"
|
40
|
+
"<a class='navbar-brand' href='#{link}#'>#{opts[:brand][:name]}</a>"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
wrap_with :div, class: "navbar-header" do
|
44
|
+
[
|
45
|
+
(navbar_toggle(id, opts[:toggle]) unless opts[:toggle] == :hide),
|
46
|
+
brand,
|
47
|
+
(content if content)
|
48
|
+
]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def navbar_toggle id, content=nil, css_class=""
|
53
|
+
content ||= %(
|
54
|
+
<span class="icon-bar"></span>
|
55
|
+
<span class="icon-bar"></span>
|
56
|
+
<span class="icon-bar"></span>
|
57
|
+
)
|
58
|
+
<<-HTML
|
59
|
+
<button type="button" class="navbar-toggle collapsed #{css_class}"
|
60
|
+
data-toggle="collapse" data-target="#navbar-collapse-#{id}">
|
61
|
+
<span class="sr-only">Toggle navigation</span>
|
62
|
+
#{content}
|
63
|
+
</button>
|
64
|
+
HTML
|
65
|
+
end
|
66
|
+
|
67
|
+
def breadcrumb items
|
68
|
+
wrap_with :ol, class: "breadcrumb" do
|
69
|
+
items.map do |item|
|
70
|
+
wrap_with :li, item, class: "breadcrumb-item"
|
71
|
+
end.join
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -1,61 +1,91 @@
|
|
1
1
|
format :html do
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
2
|
+
class TableHelper
|
3
|
+
def initialize format, content, opts={}
|
4
|
+
@format = format
|
5
|
+
@div_table = opts.delete :div_table
|
6
|
+
if opts[:header]
|
7
|
+
@header = opts[:header].is_a?(Array) ? opts[:header] : content.shift
|
8
|
+
end
|
9
|
+
@rows = content
|
10
|
+
@opts = opts
|
11
|
+
@format.add_class opts, :table
|
12
12
|
end
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
|
14
|
+
def render
|
15
|
+
tag :table, class: @opts[:class] do
|
16
|
+
[header, body]
|
17
|
+
end
|
18
18
|
end
|
19
|
-
end
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
def header
|
21
|
+
return unless @header
|
22
|
+
tag :thead do
|
23
|
+
tag :tr do
|
24
|
+
@header.map do |item|
|
25
|
+
tag(:th) { item }
|
26
|
+
end.join "\n"
|
27
|
+
end
|
27
28
|
end
|
28
29
|
end
|
29
|
-
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
def body
|
32
|
+
tag :tbody do
|
33
|
+
@rows.map do |row_content|
|
34
|
+
row row_content
|
35
|
+
end.join "\n"
|
36
|
+
end
|
36
37
|
end
|
37
|
-
end
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
def row row
|
40
|
+
row_data, row_class =
|
41
|
+
case row
|
42
|
+
when Hash then
|
43
|
+
[row.delete(:content), row]
|
44
|
+
else
|
45
|
+
[row, {}]
|
46
|
+
end
|
47
|
+
row_content =
|
48
|
+
if row_data.is_a?(Array)
|
49
|
+
row_data.map { |item| cell item }.join "\n"
|
50
|
+
else
|
51
|
+
row_data
|
52
|
+
end
|
53
|
+
tag :tr, row_content, row_class
|
44
54
|
end
|
45
|
-
end
|
46
55
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
row_content =
|
54
|
-
if row_data.is_a?(Array)
|
55
|
-
row_data.map { |item| table_cell item }.join "\n"
|
56
|
+
def cell cell
|
57
|
+
if cell.is_a? Hash
|
58
|
+
content = cell.delete(:content).to_s
|
59
|
+
tag :td, cell do
|
60
|
+
content
|
61
|
+
end
|
56
62
|
else
|
57
|
-
|
63
|
+
tag :td do
|
64
|
+
String(cell)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def tag elem, content_or_opts={}, opts={}, &block
|
70
|
+
if @div_table
|
71
|
+
if content_or_opts.is_a? Hash
|
72
|
+
@format.add_class content_or_opts, elem
|
73
|
+
else
|
74
|
+
@format.add_class opts, elem
|
75
|
+
end
|
76
|
+
elem = :div
|
58
77
|
end
|
59
|
-
|
78
|
+
@format.wrap_with elem, content_or_opts, opts, &block
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# @param [Array<Array,String>] content the content for the table. Accepts
|
83
|
+
# strings or arrays for each row.
|
84
|
+
# @param [Hash] opts
|
85
|
+
# @option opts [String, Array] :header use first row of content as header or
|
86
|
+
# value of this option if it is a string
|
87
|
+
# @return [HTML] bootstrap table
|
88
|
+
def table content, opts={}
|
89
|
+
TableHelper.new(self, content, opts).render
|
60
90
|
end
|
61
91
|
end
|
@@ -1,10 +1,12 @@
|
|
1
|
+
|
2
|
+
|
1
3
|
format :html do
|
2
4
|
# @param tab_type [String] 'tabs' or 'pills'
|
3
5
|
# @param tabs [Hash] keys are the labels, values the content for the tabs
|
4
6
|
# @param active_name [String] label of the tab that should be active at the
|
5
7
|
# beginning (default is the first)
|
6
8
|
# @return [HTML] bootstrap tabs element with all content preloaded
|
7
|
-
def static_tabs tabs, active_name=nil,
|
9
|
+
def static_tabs tabs, active_name=nil, tab_type="tabs"
|
8
10
|
tab_buttons = ""
|
9
11
|
tab_panes = ""
|
10
12
|
tabs.each do |tab_name, tab_content|
|
@@ -17,56 +19,89 @@ format :html do
|
|
17
19
|
tab_panel tab_buttons, tab_panes, tab_type
|
18
20
|
end
|
19
21
|
|
20
|
-
# @param [Hash] tabs keys are the
|
21
|
-
#
|
22
|
+
# @param [Hash] tabs keys are the views, values the title unless you pass a
|
23
|
+
# hash as value
|
24
|
+
# @option tabs [String] :title
|
25
|
+
# @option tabs [path] :path
|
26
|
+
# @option tabs [Symbol] :view
|
22
27
|
# @param [String] active_name label of the tab that should be active at the
|
23
28
|
# beginning
|
24
29
|
# @param [String] active_content content of the active tab
|
30
|
+
# can also be passed via a block
|
25
31
|
# @param [Hash] args options
|
26
32
|
# @option args [String] :type ('tabs') use pills or tabs
|
27
33
|
# @option args [Hash] :panel_args html args used for the panel div
|
28
34
|
# @option args [Hash] :pane_args html args used for the pane div
|
29
35
|
# @return [HTML] bootstrap tabs element with content only for the active
|
30
36
|
# tab; other tabs get loaded via ajax when selected
|
31
|
-
def lazy_loading_tabs tabs, active_name, active_content, args={}
|
37
|
+
def lazy_loading_tabs tabs, active_name, active_content="", args={}, &block
|
32
38
|
tab_buttons = ""
|
33
39
|
tab_panes = ""
|
34
|
-
tabs
|
35
|
-
|
36
|
-
id
|
37
|
-
|
38
|
-
"##{id}", tab_name, active_tab,
|
39
|
-
"data-url" => url.html_safe,
|
40
|
-
class: (active_tab ? nil : "load")
|
41
|
-
)
|
42
|
-
tab_content = active_tab ? active_content : ""
|
43
|
-
tab_panes += tab_pane(id, tab_content, active_tab, args[:pane_args])
|
40
|
+
standardize_tabs(tabs, active_name) do |tab_name, url, id, active_tab|
|
41
|
+
tab_buttons += lazy_tab_button tab_name, id, url, active_tab
|
42
|
+
tab_panes += lazy_tab_pane id, active_tab, active_content,
|
43
|
+
args[:pane_args], &block
|
44
44
|
end
|
45
45
|
tab_type = args.delete(:type) || "tabs"
|
46
46
|
tab_panel tab_buttons, tab_panes, tab_type, args[:panel_args]
|
47
47
|
end
|
48
48
|
|
49
|
+
def lazy_tab_button tab_name, id, url, active_tab
|
50
|
+
tab_button(
|
51
|
+
"##{id}", tab_name, active_tab,
|
52
|
+
"data-url" => url.html_safe,
|
53
|
+
class: (active_tab ? nil : "load")
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
def lazy_tab_pane id, active_tab, active_content, args
|
58
|
+
tab_content =
|
59
|
+
if active_tab
|
60
|
+
block_given? ? yield : active_content
|
61
|
+
else
|
62
|
+
""
|
63
|
+
end
|
64
|
+
tab_pane(id, tab_content, active_tab, args)
|
65
|
+
end
|
66
|
+
|
67
|
+
def standardize_tabs tabs, active_name
|
68
|
+
tabs.each do |tab_view_name, tab_details|
|
69
|
+
tab_title, url =
|
70
|
+
if tab_details.is_a? Hash
|
71
|
+
[tab_details[:title], tab_details[:path] || path(tab_details[:view])]
|
72
|
+
else
|
73
|
+
[tab_details, path(view: tab_view_name)]
|
74
|
+
end
|
75
|
+
id = "#{card.cardname.safe_key}-#{tab_view_name.to_name.safe_key}"
|
76
|
+
active_tab = (active_name == tab_view_name)
|
77
|
+
yield tab_title, url, id, active_tab
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
49
81
|
def tab_panel tab_buttons, tab_panes, tab_type="tabs", args=nil
|
50
82
|
args ||= {}
|
51
83
|
add_class args, "tabbable"
|
52
84
|
args.reverse_merge! role: "tabpanel"
|
53
85
|
wrap_with :div, args do
|
54
86
|
[
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
content_tag(:div, tab_panes.html_safe, class: "tab-content")
|
87
|
+
wrap_with(:ul, tab_buttons, class: "nav nav-#{tab_type}",
|
88
|
+
role: "tablist"),
|
89
|
+
wrap_with(:div, tab_panes, class: "tab-content")
|
59
90
|
]
|
60
91
|
end
|
61
92
|
end
|
62
93
|
|
63
94
|
def tab_button target, text, active=false, link_attr={}
|
64
|
-
link =
|
65
|
-
path: target, role: "tab", "data-toggle" => "tab"
|
66
|
-
)
|
95
|
+
link = tab_button_link target, text, link_attr
|
67
96
|
li_args = { role: :presentation }
|
68
97
|
li_args[:class] = "active" if active
|
69
|
-
|
98
|
+
wrap_with :li, link, li_args
|
99
|
+
end
|
100
|
+
|
101
|
+
def tab_button_link target, text, link_attr={}
|
102
|
+
link_to fancy_title(text), link_attr.merge(
|
103
|
+
path: target, role: "tab", "data-toggle" => "tab"
|
104
|
+
)
|
70
105
|
end
|
71
106
|
|
72
107
|
def tab_pane id, content, active=false, args=nil
|
@@ -75,6 +110,6 @@ format :html do
|
|
75
110
|
id: id
|
76
111
|
add_class args, "tab-pane"
|
77
112
|
add_class args, "active" if active
|
78
|
-
|
113
|
+
wrap_with :div, content, args
|
79
114
|
end
|
80
115
|
end
|