card 1.15.7 → 1.16.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 +3 -2
- data/config/initializers/inflections.rb +1 -1
- data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +0 -1
- data/db/migrate_core_cards/20150601133433_add_recent_setting_session_card.rb +12 -0
- data/db/migrate_core_cards/20150610171702_add_debugger_session_card.rb +11 -0
- data/db/migrate_core_cards/20150611203506_rails_inflection_updates.rb +82 -0
- data/db/migrate_core_cards/20150627205133_fix_script_bootstrap_card_type.rb +7 -0
- data/db/migrate_core_cards/20150702130543_remove_edit_toolbar_pinned.rb +9 -0
- data/db/schema.rb +81 -81
- data/db/seed/new/card_actions.yml +12581 -1647
- data/db/seed/new/card_acts.yml +1 -1
- data/db/seed/new/card_changes.yml +39326 -7569
- data/db/seed/new/card_references.yml +518 -455
- data/db/seed/new/cards.yml +1547 -1291
- data/db/seed/test/fixtures/card_actions.yml +13700 -2717
- data/db/seed/test/fixtures/card_acts.yml +314 -272
- data/db/seed/test/fixtures/card_changes.yml +45409 -13573
- data/db/seed/test/fixtures/card_references.yml +1223 -1125
- data/db/seed/test/fixtures/cards.yml +2694 -2433
- data/db/seed/test/fixtures/file1.txt +1 -0
- data/db/seed/test/fixtures/file2.txt +1 -0
- data/db/version_core_cards.txt +1 -1
- data/lib/card.rb +23 -13
- data/lib/card/auth.rb +6 -6
- data/lib/card/cache.rb +24 -5
- data/lib/card/env.rb +10 -10
- data/lib/card/format.rb +29 -12
- data/lib/card/log.rb +5 -3
- data/lib/card/migration.rb +17 -41
- data/lib/card/name.rb +12 -0
- data/lib/card/reference.rb +11 -12
- data/lib/card/set.rb +59 -6
- data/lib/card/simplecov_helper.rb +6 -1
- data/lib/card/spec_helper.rb +3 -2
- data/lib/card/view_cache.rb +77 -0
- data/lib/cardio.rb +30 -22
- data/mod/01_core/format/html_format.rb +17 -9
- data/mod/01_core/layout/blank.html +1 -1
- data/mod/01_core/layout/default.html +6 -16
- data/mod/01_core/layout/modal.html +9 -0
- data/mod/01_core/layout/noside.html +5 -12
- data/mod/01_core/layout/simple.html +1 -1
- data/mod/01_core/set/all/collection.rb +57 -5
- data/mod/01_core/set/all/content.rb +5 -7
- data/mod/01_core/set/all/name.rb +8 -10
- data/mod/01_core/set/all/permissions.rb +1 -2
- data/mod/01_core/set/all/phases.rb +5 -13
- data/mod/01_core/set/all/references.rb +10 -10
- data/mod/01_core/set/all/rules.rb +2 -2
- data/mod/01_core/set/all/tracked_attributes.rb +5 -3
- data/mod/01_core/set/all/utils.rb +79 -9
- data/mod/01_core/set/all/view_cache.rb +9 -0
- data/mod/01_core/spec/format/html_format_spec.rb +2 -2
- data/mod/01_core/spec/set/all/collection_spec.rb +1 -1
- data/mod/01_history/lib/card/act.rb +3 -1
- data/mod/01_history/lib/card/action.rb +20 -12
- data/mod/01_history/lib/card/change.rb +12 -8
- data/mod/01_history/set/all/actions.rb +2 -2
- data/mod/01_history/set/all/content_history.rb +3 -2
- data/mod/01_history/set/all/history.rb +57 -19
- data/mod/02_basic_types/set/all/rss.rb +5 -6
- data/mod/{05_standard → 02_basic_types}/set/type/html.rb +4 -3
- data/mod/02_basic_types/set/type/plain_text.rb +1 -1
- data/mod/02_basic_types/set/type/pointer.rb +7 -4
- data/mod/02_basic_types/spec/set/type/pointer_spec.rb +21 -17
- data/mod/03_machines/lib/card/machine.rb +33 -31
- data/mod/03_machines/lib/javascript/script_card_menu.js.coffee +2 -10
- data/mod/03_machines/lib/javascript/wagn.js.coffee +10 -10
- data/mod/03_machines/lib/javascript/wagn_mod.js.coffee +87 -40
- data/mod/03_machines/lib/stylesheets/style_cards.scss +26 -28
- data/mod/03_machines/set/right/machine_output.rb +3 -3
- data/mod/03_machines/set/type/coffee_script.rb +6 -6
- data/mod/03_machines/set/type/css.rb +1 -1
- data/mod/03_machines/set/type/java_script.rb +5 -6
- data/mod/03_machines/spec/lib/shared_machine_examples.rb +3 -1
- data/mod/03_machines/spec/set/type/scss_spec.rb +9 -10
- data/mod/04_settings/lib/card/setting.rb +16 -14
- data/mod/04_settings/set/right/structure.rb +6 -0
- data/mod/04_settings/set/self/add_help.rb +1 -1
- data/mod/04_settings/set/self/autoname.rb +1 -1
- data/mod/04_settings/set/self/captcha.rb +1 -1
- data/mod/04_settings/set/self/default.rb +1 -1
- data/mod/04_settings/set/self/help.rb +1 -1
- data/mod/04_settings/set/self/input.rb +1 -1
- data/mod/04_settings/set/self/layout.rb +1 -1
- data/mod/04_settings/set/self/on_create.rb +1 -1
- data/mod/04_settings/set/self/on_delete.rb +1 -1
- data/mod/04_settings/set/self/on_update.rb +1 -1
- data/mod/04_settings/set/self/options.rb +1 -1
- data/mod/04_settings/set/self/options_label.rb +1 -1
- data/mod/04_settings/set/self/script.rb +1 -1
- data/mod/04_settings/set/self/structure.rb +1 -1
- data/mod/04_settings/set/self/style.rb +1 -1
- data/mod/04_settings/set/self/table_of_contents.rb +1 -1
- data/mod/04_settings/set/self/thanks.rb +1 -1
- data/mod/05_email/set/all/follow.rb +3 -21
- data/mod/05_email/set/all/notify.rb +20 -4
- data/mod/05_email/set/right/follow.rb +16 -18
- data/mod/05_email/set/self/follow.rb +1 -1
- data/mod/05_email/spec/set/all/follow_spec.rb +6 -13
- data/mod/05_standard/set/all/attach.rb +23 -9
- data/mod/05_standard/set/all/error.rb +5 -7
- data/mod/05_standard/set/all/event_viz.rb +10 -6
- data/mod/05_standard/set/all/links.rb +37 -13
- data/mod/05_standard/set/all/rich_html/content.rb +46 -18
- data/mod/05_standard/set/all/rich_html/editing.rb +29 -25
- data/mod/05_standard/set/all/rich_html/form.rb +17 -10
- data/mod/05_standard/set/all/rich_html/header.rb +26 -4
- data/mod/05_standard/set/all/rich_html/menu.rb +17 -34
- data/mod/05_standard/set/all/rich_html/modal.rb +50 -12
- data/mod/05_standard/set/all/rich_html/toolbar.rb +178 -186
- data/mod/05_standard/set/all/rich_html/wrapper.rb +44 -21
- data/mod/05_standard/set/rstar/rules.rb +43 -53
- data/mod/05_standard/set/self/all.rb +2 -1
- data/mod/05_standard/set/self/head.rb +2 -2
- data/mod/05_standard/set/self/signin.rb +18 -18
- data/mod/05_standard/set/self/stats.rb +14 -2
- data/mod/05_standard/set/type/search_type.rb +9 -4
- data/mod/05_standard/set/type/session.rb +12 -7
- data/mod/05_standard/set/type/set.rb +135 -18
- data/mod/05_standard/spec/chunk/include_spec.rb +15 -16
- data/mod/05_standard/spec/set/all/account_spec.rb +21 -21
- data/mod/05_standard/spec/set/all/event_viz_spec.rb +7 -7
- data/mod/05_standard/spec/set/all/history_spec.rb +54 -24
- data/mod/05_standard/spec/set/all/rich_html/editing_spec.rb +42 -40
- data/mod/05_standard/spec/set/rstar/rules_spec.rb +1 -1
- data/mod/05_standard/spec/set/type/search_type_spec.rb +9 -1
- data/mod/05_standard/spec/set/type/signup_spec.rb +42 -42
- data/mod/06_bootstrap/lib/stylesheets/bootstrap_cards.scss +6 -0
- data/mod/06_bootstrap/set/all/bootstrap/form.rb +4 -5
- data/mod/06_bootstrap/set/all/bootstrap/helper.rb +145 -0
- data/mod/06_bootstrap/set/all/rich_bootstrap.rb +0 -59
- data/spec/lib/card/action_spec.rb +1 -1
- data/spec/lib/card/log_spec.rb +7 -7
- data/spec/models/card/cardtype_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +31 -6
- data/mod/04_settings/set/self/comment.rb +0 -2
@@ -4,10 +4,10 @@ format :html do
|
|
4
4
|
if args[:structure] || card.structure
|
5
5
|
# multi-card editing
|
6
6
|
|
7
|
-
if args[:core_edit] #need better name
|
7
|
+
if args[:core_edit] #need better name
|
8
8
|
_render_core args
|
9
9
|
else
|
10
|
-
process_relative_tags args
|
10
|
+
process_relative_tags :optional_toolbar=>:hide, :structure=>args[:structure]
|
11
11
|
end
|
12
12
|
|
13
13
|
else
|
@@ -25,11 +25,14 @@ format :html do
|
|
25
25
|
|
26
26
|
|
27
27
|
def form_for_multi
|
28
|
-
block = Proc.new {}
|
29
|
-
builder = ActionView::Base.default_form_builder
|
30
28
|
card.name = card.name.gsub(/^#{Regexp.escape(root.card.name)}\+/, '+') if root.card.new_card? ##FIXME -- need to match other relative inclusions.
|
31
29
|
|
32
|
-
|
30
|
+
# doesn't work anymore in Rails 4
|
31
|
+
# TODO -- check whether forms work with the new instantiate_builder call
|
32
|
+
# block = Proc.new {}
|
33
|
+
# builder = ActionView::Base.default_form_builder
|
34
|
+
# builder.new("card[subcards][#{card.relative_name}]", card, template, {}, block)
|
35
|
+
builder = instantiate_builder("card[subcards][#{card.relative_name}]", card, {})
|
33
36
|
end
|
34
37
|
|
35
38
|
def form
|
@@ -188,16 +191,20 @@ format :html do
|
|
188
191
|
content = content_field eform, args.merge( :nested=>true )
|
189
192
|
opts = { :editor=>'content', :help=>true, :class=>'card-editor' }
|
190
193
|
|
191
|
-
content += raw( "\n #{ eform.hidden_field :type_id }" )
|
192
|
-
opts[:class] += " RIGHT-#{ card.cardname.tag_name.safe_key }"
|
194
|
+
content += raw( "\n #{ eform.hidden_field :type_id }" ) if card.new_card?
|
195
|
+
opts[:class] += " RIGHT-#{ card.cardname.tag_name.safe_key }" if card.cardname.junction?
|
193
196
|
|
194
197
|
formgroup fancy_title( args[:title] ), content, opts
|
195
198
|
end
|
196
199
|
|
197
200
|
def process_relative_tags args
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
+
nested_fields(args).map do |chunk|
|
202
|
+
nested_card = fetch_nested_card chunk.options
|
203
|
+
nest nested_card, chunk.options.reverse_merge(args)
|
204
|
+
end.join "\n"
|
205
|
+
# _render_raw(args).scan( /\{\{\s*\+[^\}]*\}\}/ ).map do |inc| #fixme - wrong place for regexp!
|
206
|
+
# process_content( inc ).strip
|
207
|
+
# end.join
|
201
208
|
end
|
202
209
|
|
203
210
|
# form helpers
|
@@ -1,19 +1,41 @@
|
|
1
1
|
format :html do
|
2
2
|
|
3
3
|
view :header do |args|
|
4
|
+
|
4
5
|
%{
|
5
6
|
<div class="card-header #{ args[:header_class] }">
|
6
7
|
<div class="card-header-title #{ args[:title_class] }">
|
7
8
|
#{ _optional_render :toggle, args, :hide }
|
8
9
|
#{ _optional_render :title, args }
|
9
10
|
</div>
|
11
|
+
#{ _optional_render :type_info, args, :hide }
|
12
|
+
</div>
|
13
|
+
#{ _optional_render :toolbar, args, :hide }
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def default_header_args args
|
18
|
+
if @slot_view == :open
|
19
|
+
if (show_view?(:toolbar,args.merge(:default_visibility=>:hide)) || toolbar_pinned?) && card.type_code != :basic
|
20
|
+
args[:optional_type_info] ||= :show
|
21
|
+
end
|
22
|
+
if toolbar_pinned?
|
23
|
+
args[:optional_toolbar] ||= :show
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
view :subheader do |args|
|
29
|
+
args[:subheader] ||= toolbar_view_title(@slot_view) || _render_title(args)
|
30
|
+
%{
|
31
|
+
<div class="card-subheader navbar-inverse btn-primary active">
|
32
|
+
#{ args[:subheader] }
|
33
|
+
#{ autosaved_draft_link if card.drafts.present? && @slot_view == :edit }
|
10
34
|
</div>
|
11
|
-
#{ _optional_render :toolbar, args, (toolbar_pinned? ? :show : :hide) }
|
12
|
-
#{ _optional_render :edit_toolbar, args, (edit_toolbar_pinned? ? :show : :hide)}
|
13
|
-
#{ _optional_render :account_toolbar, args, :hide}
|
14
35
|
}
|
15
36
|
end
|
16
37
|
|
38
|
+
|
17
39
|
view :toggle do |args|
|
18
40
|
verb, adjective, direction = ( args[:toggle_mode] == :close ? %w{ open open expand } : %w{ close closed collapse-down } )
|
19
41
|
|
@@ -41,7 +63,7 @@ format :html do
|
|
41
63
|
end
|
42
64
|
|
43
65
|
def show_follow?
|
44
|
-
Auth.signed_in? && !card.new_card?
|
66
|
+
Auth.signed_in? && !card.new_card? && card.followable?
|
45
67
|
end
|
46
68
|
|
47
69
|
def structure_editable?
|
@@ -6,7 +6,7 @@ format :html do
|
|
6
6
|
[
|
7
7
|
_optional_render(:horizontal_menu, args, :hide),
|
8
8
|
_render_menu_link(args),
|
9
|
-
_render_modal_slot(args)
|
9
|
+
_render_modal_slot(args.merge(:modal_id=>card.cardname.safe_key))
|
10
10
|
]
|
11
11
|
end
|
12
12
|
end
|
@@ -32,7 +32,7 @@ format :html do
|
|
32
32
|
[
|
33
33
|
content_tag( :span, "<a href='#'>#{ glyphicon args[:menu_icon] }</a>".html_safe,
|
34
34
|
:class=>'open-menu dropdown-toggle', 'data-toggle'=>'dropdown', 'aria-expanded'=>'false'),
|
35
|
-
content_tag( :ul, items.html_safe, :class=>'dropdown-menu', :role=>'menu')
|
35
|
+
content_tag( :ul, items.html_safe, :class=>'dropdown-menu', :role=>'menu'),
|
36
36
|
]
|
37
37
|
end
|
38
38
|
end
|
@@ -47,7 +47,7 @@ format :html do
|
|
47
47
|
menu_items = []
|
48
48
|
menu_items << menu_edit_link(args) if args[:show_menu_item][:edit]
|
49
49
|
menu_items << menu_discuss_link(args) if args[:show_menu_item][:discuss]
|
50
|
-
menu_items <<
|
50
|
+
menu_items << _render_follow_link(args.merge(:icon=>true)) if args[:show_menu_item][:follow]
|
51
51
|
menu_items << menu_page_link(args) if args[:show_menu_item][:page]
|
52
52
|
menu_items << menu_rules_link(args) if args[:show_menu_item][:rules]
|
53
53
|
menu_items << menu_account_link(args) if args[:show_menu_item][:account]
|
@@ -56,11 +56,8 @@ format :html do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def menu_edit_link args
|
59
|
-
|
60
|
-
|
61
|
-
:path_opts=>{ :slot=>{:show=>'edit_toolbar', :hide=>'type_link'}}
|
62
|
-
}
|
63
|
-
menu_item('edit', 'edit', opts, args[:html_args] )
|
59
|
+
path_opts = { :view=>:edit }
|
60
|
+
menu_item('edit', 'edit', path_opts, args[:html_args] )
|
64
61
|
end
|
65
62
|
|
66
63
|
def menu_discuss_link args
|
@@ -68,7 +65,7 @@ format :html do
|
|
68
65
|
end
|
69
66
|
|
70
67
|
def menu_page_link args
|
71
|
-
menu_item('page', 'new-window', {:
|
68
|
+
menu_item('page', 'new-window', {:card=>card}, args[:html_args])
|
72
69
|
end
|
73
70
|
|
74
71
|
def menu_rules_link args
|
@@ -76,39 +73,25 @@ format :html do
|
|
76
73
|
end
|
77
74
|
|
78
75
|
def menu_account_link args
|
79
|
-
|
80
|
-
|
81
|
-
menu_item('account', 'user',opts, args[:html_args])
|
76
|
+
path_opts = { :related=>{:name=>'+*account',:view=>:edit} }
|
77
|
+
menu_item('account', 'user', path_opts, args[:html_args])
|
82
78
|
end
|
83
79
|
|
84
80
|
def menu_more_link args
|
85
|
-
|
86
|
-
|
87
|
-
|
81
|
+
path_opts = {
|
82
|
+
:view=>args[:home_view] || :open,
|
83
|
+
:slot=>{:show=>:toolbar}
|
84
|
+
}
|
85
|
+
menu_item('', 'option-horizontal', path_opts, args[:html_args])
|
88
86
|
end
|
89
87
|
|
90
|
-
|
88
|
+
|
89
|
+
def menu_item text, icon, target, html_args={}
|
91
90
|
link_text = "#{glyphicon(icon)}<span class='menu-item-label'>#{text}</span>".html_safe
|
92
|
-
target
|
93
|
-
if target[:view]
|
94
|
-
view_link(link_text, target.delete(:view), target)
|
95
|
-
elsif target[:page]
|
96
|
-
card_link target.delete(:page), target.merge(:text=>link_text)
|
97
|
-
elsif target[:related]
|
98
|
-
target[:path_opts] ||= {}
|
99
|
-
|
100
|
-
target[:path_opts][:related] =
|
101
|
-
if target[:related].kind_of? String
|
102
|
-
{:name=>"+#{target.delete(:related)}"}
|
103
|
-
else
|
104
|
-
target[:related]
|
105
|
-
end
|
106
|
-
view_link link_text, :related, target
|
107
|
-
else
|
108
|
-
link_to link_text, {:action=>target.delete(:action)}, target
|
109
|
-
end
|
91
|
+
smart_link link_text, target, html_args || {}
|
110
92
|
end
|
111
93
|
|
94
|
+
|
112
95
|
def default_menu_link_args args
|
113
96
|
args[:menu_icon] ||= 'cog'
|
114
97
|
end
|
@@ -1,28 +1,64 @@
|
|
1
1
|
format :html do
|
2
|
-
def default_modal_content_args args
|
3
|
-
args[:buttons] ||= button_tag 'Close', 'data-dismiss'=>'modal'
|
4
|
-
end
|
5
2
|
|
6
|
-
view :modal_link do |args|
|
7
|
-
args[:html_args] ||= {}
|
8
|
-
args[:html_args].merge!('data-target'=>"#modal-#{card.cardname.safe_key}", 'data-toggle'=>'modal')
|
9
|
-
link_to(args[:text] || _render_title(args), path(:view=>:modal_content), args[:html_args])
|
10
|
-
end
|
11
3
|
|
12
|
-
|
13
|
-
|
4
|
+
|
5
|
+
|
6
|
+
view :modal_link do |args|
|
7
|
+
path_opts = args[:path_opts] || {}
|
8
|
+
path_opts.merge!(:layout=>:modal)
|
9
|
+
html_args = args[:html_args] || {}
|
10
|
+
#html_args.merge!('data-target'=>"#modal-#{card.cardname.safe_key}#{args[:modal_slot_id_postfix]}",
|
11
|
+
html_args.merge!('data-target'=>"#modal-main-slot",
|
12
|
+
'data-toggle'=>'modal')
|
13
|
+
link_to(args[:text] || _render_title(args), path(path_opts), html_args)
|
14
14
|
end
|
15
15
|
|
16
16
|
view :modal_slot do |args|
|
17
|
-
wrap_with(:div, :class=>'modal fade', :role=>'dialog', :id=>"modal-#{card.cardname.safe_key}") do
|
17
|
+
#wrap_with(:div, :class=>'modal fade', :role=>'dialog', :id=>"modal-#{card.cardname.safe_key}#{args[:modal_slot_id_postfix]}") do
|
18
|
+
id = "modal-"
|
19
|
+
id += (args[:modal_id] || 'main-slot')
|
20
|
+
wrap_with(:div, :class=>'modal fade', :role=>'dialog', :id=>id) do
|
18
21
|
wrap_with(:div, :class=>'modal-dialog') do
|
19
22
|
content_tag :div, :class=>'modal-content' do
|
20
|
-
|
23
|
+
''
|
21
24
|
end
|
22
25
|
end
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
29
|
+
|
30
|
+
view :modal_menu, :tags=>:unknown_ok do |args|
|
31
|
+
popout_params = {}
|
32
|
+
popout_params[:view] = params[:view] if params[:view]
|
33
|
+
# we probably want to pass on a lot more params than just view, but not all of them
|
34
|
+
# (eg we don't want layout, id, controller...)
|
35
|
+
wrap_with :div, :class=>'modal-menu' do
|
36
|
+
[
|
37
|
+
link_to( glyphicon('remove'), '', :class=>'close-modal pull-right close', 'data-dismiss'=>'modal'),
|
38
|
+
link_to( glyphicon('new-window'), popout_params, :class=>'pop-out-modal pull-right close ' )
|
39
|
+
]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
view :modal_footer, :tags=>:unknown_ok do |args|
|
44
|
+
args[:buttons] || ''
|
45
|
+
end
|
46
|
+
|
47
|
+
def default_modal_footer_args args
|
48
|
+
args[:buttons] ||= button_tag 'Close', :class=>'btn-xs close-modal pull-right', 'data-dismiss'=>'modal'
|
49
|
+
end
|
50
|
+
|
51
|
+
=begin
|
52
|
+
def default_modal_content_args args
|
53
|
+
args[:buttons] ||= button_tag 'Close', 'data-dismiss'=>'modal'
|
54
|
+
end
|
55
|
+
|
56
|
+
view :modal_link_and_dialog do |args|
|
57
|
+
_render_modal_link(args) + _render_modal(args)
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
|
26
62
|
# use modal_content for ajax calls to fill a modal_slot with content
|
27
63
|
view :modal_content do |args|
|
28
64
|
output [
|
@@ -51,4 +87,6 @@ format :html do
|
|
51
87
|
view :modal do |args|
|
52
88
|
_render_modal_slot args.merge(:optional_modal_content=>:show)
|
53
89
|
end
|
90
|
+
=end
|
91
|
+
|
54
92
|
end
|
@@ -1,130 +1,181 @@
|
|
1
1
|
|
2
2
|
format :html do
|
3
|
-
def edit_toolbar_pinned?
|
4
|
-
Card[:edit_toolbar_pinned].content == 'true'
|
5
|
-
end
|
6
|
-
|
7
3
|
def toolbar_pinned?
|
8
4
|
Card[:toolbar_pinned].content == 'true'
|
9
5
|
end
|
10
6
|
|
11
7
|
view :toolbar do |args|
|
12
8
|
navbar "toolbar-#{card.cardname.safe_key}-#{args[:home_view]}", :toggle_align=>:left, :class=>"slotter toolbar", :navbar_type=>'inverse',
|
13
|
-
:collapsed_content=>close_link('pull-right visible-xs') do
|
9
|
+
:collapsed_content=>close_link(args.merge(:class=>'pull-right visible-xs')) do
|
14
10
|
[
|
15
|
-
(
|
16
|
-
|
11
|
+
close_link(args.merge(:class=>'hidden-xs navbar-right')),
|
12
|
+
(wrap_with(:form, :class=>'navbar-form navbar-left') do
|
13
|
+
[
|
14
|
+
(account_split_button(args) if card.accountable?),
|
15
|
+
engage_split_button(args),
|
16
|
+
rules_split_button(args),
|
17
|
+
edit_split_button(args),
|
18
|
+
]
|
17
19
|
end),
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
#{_optional_render :toolbar_buttons, args, :show}
|
24
|
-
</div>
|
25
|
-
</form>
|
26
|
-
}.html_safe,
|
20
|
+
(wrap_with(:form, :class=>'navbar-form navbar-right') do
|
21
|
+
content_tag :div, :class=>'form-group' do
|
22
|
+
_optional_render(:toolbar_buttons, args, :show)
|
23
|
+
end
|
24
|
+
end)
|
27
25
|
]
|
28
26
|
end
|
29
27
|
end
|
28
|
+
def default_toolbar_args args
|
29
|
+
args[:nested_fields] = nested_fields(args)
|
30
|
+
args[:active_toolbar_button] ||= active_toolbar_button @slot_view, args
|
31
|
+
end
|
30
32
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
def active_toolbar_button active_view, args
|
34
|
+
case active_view
|
35
|
+
when :follow, :editors
|
36
|
+
'engage'
|
37
|
+
when :edit_rules, :edit_nest_rules
|
38
|
+
'rules'
|
39
|
+
when :edit, :edit_name, :edit_type, :edit_structure, :edit_nests, :history
|
40
|
+
'edit'
|
41
|
+
when :related
|
42
|
+
if args[:related_card] && (tag=args[:related_card].tag)
|
43
|
+
case tag.codename
|
44
|
+
when 'discussion', 'editors'
|
45
|
+
'engage'
|
46
|
+
when 'account', 'roles', 'edited', 'created', 'follow'
|
47
|
+
'account'
|
48
|
+
else
|
49
|
+
'rules'
|
50
|
+
end
|
51
|
+
end
|
37
52
|
end
|
38
53
|
end
|
39
54
|
|
40
|
-
view :edit_toolbar do |args|
|
41
|
-
id = "edit-toolbar-#{card.cardname.safe_key}-#{args[:home_view]}"
|
42
|
-
navbar_right = ''
|
43
|
-
navbar_right += edit_toolbar_autosave_link if card.drafts.present?
|
44
|
-
navbar_right += edit_toolbar_pin_link
|
45
|
-
navbar_right += edit_toolbar_close_link
|
46
55
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
[
|
53
|
-
_optional_render(:edit_content_button, args, :show),
|
54
|
-
_optional_render(:edit_name_button, args, :show),
|
55
|
-
_optional_render(:edit_type_button, args, :show),
|
56
|
-
_optional_render(:edit_rules_button, args, :show),
|
57
|
-
_optional_render(:edit_nests_button, args, :show),
|
58
|
-
]
|
59
|
-
end),
|
60
|
-
content_tag( :ul, navbar_right.html_safe, :class=>'nav navbar-nav navbar-right' )
|
61
|
-
]
|
56
|
+
def toolbar_view_title view
|
57
|
+
if view == :edit_rules
|
58
|
+
current_set_card.name
|
59
|
+
else
|
60
|
+
{:edit=>'content', :edit_name=>'name', :edit_type=>'type', :edit_structure=>'structure', :edit_nests=>'nests', :history=>'history', :common_rules=>'common', :recent_rules=>'recent', :grouped_rules=>'all', :edit_nest_rules=>'nests'}[view]
|
62
61
|
end
|
63
62
|
end
|
64
63
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
64
|
+
def engage_split_button args
|
65
|
+
discuss = smart_link 'discuss', { :related=>Card[:discussion].key }
|
66
|
+
editors = smart_link 'editors', { :related=>Card[:editors].key }
|
67
|
+
toolbar_split_button 'engage', { :related=>Card[:discussion].key }, args do
|
68
|
+
{
|
69
|
+
:discuss => discuss,
|
70
|
+
:follow =>_render_follow_link(args),
|
71
|
+
:editors => editors
|
72
|
+
}
|
73
|
+
end
|
74
|
+
end
|
75
|
+
def rules_split_button args
|
76
|
+
recent = smart_link 'recent', {:view => :edit_rules, :slot=>{:rule_view=>:recent_rules}}
|
77
|
+
common = smart_link 'common', {:view => :edit_rules, :slot=>{:rule_view=>:common_rules}}
|
78
|
+
group = smart_link 'by group', {:view => :edit_rules, :slot=>{:rule_view=>:grouped_rules}}
|
79
|
+
all = smart_link 'by name', {:view => :edit_rules, :slot=>{:rule_view=>:all_rules}}
|
80
|
+
nests = smart_link 'nests', {:view => :edit_nest_rules, :slot=>{:rule_view=>:field_related_rules}}
|
81
|
+
toolbar_split_button 'rules', {:view => :edit_rules }, args do
|
82
|
+
{
|
83
|
+
:common_rules => common,
|
84
|
+
:grouped_rules => group,
|
85
|
+
:all_rules => all,
|
86
|
+
:separator => (separator if args[:nested_fields].present?),
|
87
|
+
:recent_rules => (recent if recently_edited_settings?),
|
88
|
+
:edit_nest_rules => (nests if args[:nested_fields].present?)
|
89
|
+
}
|
90
|
+
end
|
91
|
+
end
|
92
|
+
def edit_split_button args
|
93
|
+
toolbar_split_button 'edit', {:view=>:edit}, args do
|
94
|
+
{
|
95
|
+
:edit => _render_edit_content_link(args),
|
96
|
+
:edit_nests => (_render_edit_nests_link if !card.structure && args[:nested_fields].present?),
|
97
|
+
:edit_structure => (smart_link 'structure', {:view => :edit_structure} if structure_editable?),
|
98
|
+
:edit_name => _render_edit_name_link,
|
99
|
+
:edit_type => _render_edit_type_link,
|
100
|
+
:separator => separator,
|
101
|
+
:history => (_render_history_link if card.history?)
|
102
|
+
}
|
103
|
+
end
|
104
|
+
end
|
105
|
+
def account_split_button args
|
106
|
+
toolbar_split_button 'account', {:related=>Card[:account].key}, args do
|
107
|
+
{
|
108
|
+
:account => smart_link('details',{:related=>{:name=>"#{card.name}+#{Card[:account].key}", :view=>:edit}}),
|
109
|
+
:roles => smart_link('roles', {:related=>Card[:roles].key}),
|
110
|
+
:created => smart_link('created',{:related=>Card[:created].key}),
|
111
|
+
:edited => smart_link('edited', {:related=>Card[:edited].key}),
|
112
|
+
:follow => smart_link('follow', {:related=>Card[:follow].key})
|
113
|
+
}
|
80
114
|
end
|
81
115
|
end
|
82
116
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
117
|
+
|
118
|
+
def toolbar_split_button name, button_args, args
|
119
|
+
button = button_link name, button_args, :class=>('active' if args[:active_toolbar_button] == name)
|
120
|
+
active_item =
|
121
|
+
if @slot_view == :related
|
122
|
+
if args[:rule_view]
|
123
|
+
args[:rule_view].to_sym
|
124
|
+
elsif args[:related_card] && (r = args[:related_card].right) && (cn = r.codename)
|
125
|
+
cn.to_sym
|
126
|
+
end
|
127
|
+
else
|
128
|
+
@slot_view
|
129
|
+
end
|
130
|
+
split_button button, args.merge(:active_item=>active_item) do
|
131
|
+
yield
|
90
132
|
end
|
91
133
|
end
|
92
134
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
]
|
135
|
+
|
136
|
+
def close_link args
|
137
|
+
link_opts = {:title=>'cancel'}
|
138
|
+
if args[:subslot]
|
139
|
+
link_opts[:path_opts] = {:slot=>{:subframe=>true}}
|
99
140
|
end
|
141
|
+
|
142
|
+
link = view_link glyphicon('remove'), :home, link_opts
|
143
|
+
css_class = ['nav navbar-nav', args[:class]].compact.join "\n"
|
144
|
+
list_tag link, :class=>css_class
|
100
145
|
end
|
101
146
|
|
102
|
-
view :
|
147
|
+
view :toolbar_buttons do |args|
|
103
148
|
wrap_with(:div, :class=>'btn-group') do
|
104
149
|
[
|
105
|
-
_optional_render(:
|
106
|
-
|
107
|
-
_optional_render(:
|
108
|
-
_optional_render(:
|
150
|
+
_optional_render(:related_button, args, :show),
|
151
|
+
toolbar_pin_button,
|
152
|
+
_optional_render(:delete_button, args, (card.ok?(:delete) ? :show : :hide)),
|
153
|
+
_optional_render(:refresh_button, args, :hide),
|
154
|
+
_optional_render(:history_button, args, :hide),
|
109
155
|
]
|
110
156
|
end
|
111
157
|
end
|
112
158
|
|
113
|
-
|
114
|
-
toolbar_button('rules', 'wrench', 'hidden-xs hidden-sm', :view=>'options')
|
115
|
-
end
|
159
|
+
|
116
160
|
view :related_button do |args|
|
117
161
|
path_opts = {:slot=>{:show=>:toolbar}}
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
162
|
+
page_link =
|
163
|
+
if main?
|
164
|
+
menu_item ' refresh', 'refresh', path_opts.merge(:card=>card), args[:html_args]
|
165
|
+
else
|
166
|
+
menu_item ' page', 'new-window', path_opts.merge(:card=>card), args[:html_args]
|
167
|
+
end
|
123
168
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
169
|
+
dropdown_button '', :class=>'related', :icon=>'eye-open' do
|
170
|
+
[
|
171
|
+
page_link,
|
172
|
+
separator,
|
173
|
+
menu_item(' children', 'baby-formula', path_opts.merge(:related=>'*children')),
|
174
|
+
menu_item(' mates', 'bed', path_opts.merge(:related=>'*mates')),
|
175
|
+
menu_item(' references out', 'log-out', path_opts.merge(:related=>'*refers_to')),
|
176
|
+
menu_item(' references in', 'log-in', path_opts.merge(:related=>'*referred_to_by'))
|
177
|
+
]
|
178
|
+
end
|
128
179
|
end
|
129
180
|
view :delete_button do |args|
|
130
181
|
toolbar_button('delete', 'trash', 'hidden-xs hidden-sm hidden-md hidden-lg',
|
@@ -135,42 +186,14 @@ format :html do
|
|
135
186
|
:'data-confirm' => "Are you sure you want to delete #{card.name}?"
|
136
187
|
)
|
137
188
|
end
|
138
|
-
view :refresh_button do |args|
|
139
|
-
toolbar_button('refresh', 'refresh', 'hidden-xs hidden-sm hidden-md hidden-lg', :view=>args[:home_view] || :open)
|
140
|
-
end
|
141
|
-
|
142
|
-
view :edit_content_button do |args|
|
143
|
-
pill_view_link 'content', :edit, args
|
144
|
-
end
|
145
|
-
view :edit_name_button do |args|
|
146
|
-
pill_view_link 'name',:edit_name, args
|
147
|
-
end
|
148
|
-
view :edit_type_button do |args|
|
149
|
-
pill_view_link 'type', :edit_type, args
|
150
|
-
end
|
151
|
-
view :edit_rules_button do |args|
|
152
|
-
if structure_editable?
|
153
|
-
active = [:edit_rules, :edit_structure].include? args.delete(:active_toolbar_view)
|
154
|
-
rule_items = pill_view_link 'structure', :edit_structure, args
|
155
|
-
rule_items += pill_view_link '...', :edit_rules, args
|
156
|
-
pill_dropdown 'rules', rule_items, active
|
157
|
-
else
|
158
|
-
pill_view_link 'rules', :edit_rules, args
|
159
|
-
end
|
160
|
-
end
|
161
|
-
view :edit_nests_button do |args|
|
162
|
-
if (nests = card.fetch(:trait=>:includes)) && nests.item_names.present?
|
163
|
-
pill_view_link 'nests', :edit_nests, args
|
164
|
-
end
|
165
|
-
end
|
166
189
|
|
167
|
-
|
168
|
-
|
169
|
-
view_link(glyphicon('edit'),'edit_type', :class=>'navbar-link slotter', 'data-toggle'=>'tooltip', :title=>'edit type')
|
190
|
+
def toolbar_pin_button
|
191
|
+
button_tag glyphicon('pushpin'), :situation=>:primary, :remote=>true, :title=>"#{'un' if toolbar_pinned?}pin", :class=>"toolbar-pin #{'in' unless toolbar_pinned?}active"
|
170
192
|
end
|
171
193
|
|
172
|
-
def toolbar_button text, symbol, hide, tag_args
|
173
|
-
|
194
|
+
def toolbar_button text, symbol, hide=nil, tag_args={}
|
195
|
+
hide ||= 'hidden-xs hidden-sm hidden-md hidden-lg'
|
196
|
+
tag_args[:class] = [ tag_args[:class], 'btn btn-primary' ].compact * ' '
|
174
197
|
tag_args[:title] ||= text
|
175
198
|
link_text = "#{glyphicon symbol}<span class='menu-item-label #{hide}'>#{text}</span>"
|
176
199
|
|
@@ -181,86 +204,55 @@ format :html do
|
|
181
204
|
view_link link_text, viewname, tag_args
|
182
205
|
else
|
183
206
|
path_opts = tag_args.delete(:path_opts) || {}
|
184
|
-
path_opts.merge! :action=>tag_args.delete(:action)
|
207
|
+
path_opts.merge! :action=>tag_args.delete(:action) if tag_args[:action]
|
185
208
|
link_to link_text, path_opts, tag_args
|
186
209
|
end
|
187
210
|
end
|
188
211
|
|
189
|
-
def
|
190
|
-
|
191
|
-
opts = {:class=>'slotter', :role=>'pill'}
|
192
|
-
li_pill view_link(name, view, opts), active_view == view
|
212
|
+
def autosaved_draft_link
|
213
|
+
view_link('autosaved draft', :edit, :path_opts=>{:edit_draft=>true, :slot=>{:show=>:edit_toolbar}}, :class=>'navbar-link slotter pull-right')
|
193
214
|
end
|
194
215
|
|
195
|
-
def account_pill name, active=false, path_opts={}
|
196
|
-
opts = {:text=>name, :role=>'pill', :remote=>true, :path_opts=>path_opts}
|
197
|
-
opts[:path_opts][:slot] ||= {}
|
198
|
-
opts[:path_opts][:slot][:hide] = "toggle #{opts[:path_opts][:slot][:hide]}"
|
199
|
-
li_pill card_link("#{card.name}+*#{name}", opts), active
|
200
|
-
end
|
201
216
|
|
202
|
-
def li_pill content, active
|
203
|
-
"<li role='presentation' #{"class='active'" if active}>#{content}</li>"
|
204
|
-
end
|
205
217
|
|
206
|
-
def
|
207
|
-
|
208
|
-
<li role="presentation" class="dropdown #{'active' if active}">
|
209
|
-
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-expanded="false">
|
210
|
-
#{name} <span class="caret"></span>
|
211
|
-
</a>
|
212
|
-
#{ dropdown_list items }
|
213
|
-
</li>
|
214
|
-
}
|
218
|
+
def default_edit_content_link_args args
|
219
|
+
args[:title] ||= 'content'
|
215
220
|
end
|
216
|
-
|
217
|
-
|
218
|
-
%{
|
219
|
-
<div class="btn-group" role="group">
|
220
|
-
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" title="#{name}" aria-expanded="false">
|
221
|
-
#{glyphicon icon} #{name}
|
222
|
-
<span class="caret"></span>
|
223
|
-
</button>
|
224
|
-
#{ dropdown_list items, opts[:class] }
|
225
|
-
</div>
|
226
|
-
}
|
221
|
+
view :edit_content_link do |args|
|
222
|
+
toolbar_view_link :edit, args
|
227
223
|
end
|
228
|
-
|
229
|
-
|
230
|
-
if items.kind_of? Array
|
231
|
-
items = items.map {|item| "<li>#{item}</li>"}.join "\n"
|
232
|
-
end
|
233
|
-
%{
|
234
|
-
<ul class="dropdown-menu #{extra_css_class}" role="menu">
|
235
|
-
#{items}
|
236
|
-
</ul>
|
237
|
-
}
|
224
|
+
def default_edit_name_link_args args
|
225
|
+
args[:title] ||= 'name'
|
238
226
|
end
|
239
|
-
|
240
|
-
|
241
|
-
%{
|
242
|
-
<li class='toolbar-pin #{'in' unless toolbar_pinned?}active'>
|
243
|
-
<a href='#' title='#{'un' if toolbar_pinned?}pin'>#{glyphicon 'pushpin'}</a>
|
244
|
-
</li>
|
245
|
-
}
|
227
|
+
view :edit_name_link do |args|
|
228
|
+
toolbar_view_link :edit_name, args
|
246
229
|
end
|
247
|
-
|
248
|
-
|
249
|
-
%{
|
250
|
-
<li class='edit-toolbar-pin #{'in' unless edit_toolbar_pinned?}active'>
|
251
|
-
<a href='#' title='#{'un' if edit_toolbar_pinned?}pin'>#{glyphicon 'pushpin'}</a>
|
252
|
-
</li>
|
253
|
-
}
|
230
|
+
def default_edit_type_link_args args
|
231
|
+
args[:title] ||= 'type'
|
254
232
|
end
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
233
|
+
view :edit_type_link do |args|
|
234
|
+
toolbar_view_link :edit_type, args
|
235
|
+
end
|
236
|
+
def default_history_link_args args
|
237
|
+
args[:title] ||= 'history'
|
238
|
+
end
|
239
|
+
view :history_link do |args|
|
240
|
+
toolbar_view_link :history, args
|
241
|
+
end
|
242
|
+
def default_edit_nests_link_args args
|
243
|
+
args[:title] ||= 'nests'
|
244
|
+
end
|
245
|
+
view :edit_nests_link do |args|
|
246
|
+
toolbar_view_link :edit_nests, args
|
259
247
|
end
|
260
248
|
|
261
|
-
def
|
262
|
-
|
263
|
-
|
249
|
+
def toolbar_view_link view, args
|
250
|
+
text = args.delete(:title)
|
251
|
+
view_link text, view, args
|
264
252
|
end
|
265
253
|
|
254
|
+
|
255
|
+
def recently_edited_settings?
|
256
|
+
(rs = Card[:recent_settings]) && rs.item_names.present?
|
257
|
+
end
|
266
258
|
end
|