card 1.15.7 → 1.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/card.gemspec +3 -2
  4. data/config/initializers/inflections.rb +1 -1
  5. data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +0 -1
  6. data/db/migrate_core_cards/20150601133433_add_recent_setting_session_card.rb +12 -0
  7. data/db/migrate_core_cards/20150610171702_add_debugger_session_card.rb +11 -0
  8. data/db/migrate_core_cards/20150611203506_rails_inflection_updates.rb +82 -0
  9. data/db/migrate_core_cards/20150627205133_fix_script_bootstrap_card_type.rb +7 -0
  10. data/db/migrate_core_cards/20150702130543_remove_edit_toolbar_pinned.rb +9 -0
  11. data/db/schema.rb +81 -81
  12. data/db/seed/new/card_actions.yml +12581 -1647
  13. data/db/seed/new/card_acts.yml +1 -1
  14. data/db/seed/new/card_changes.yml +39326 -7569
  15. data/db/seed/new/card_references.yml +518 -455
  16. data/db/seed/new/cards.yml +1547 -1291
  17. data/db/seed/test/fixtures/card_actions.yml +13700 -2717
  18. data/db/seed/test/fixtures/card_acts.yml +314 -272
  19. data/db/seed/test/fixtures/card_changes.yml +45409 -13573
  20. data/db/seed/test/fixtures/card_references.yml +1223 -1125
  21. data/db/seed/test/fixtures/cards.yml +2694 -2433
  22. data/db/seed/test/fixtures/file1.txt +1 -0
  23. data/db/seed/test/fixtures/file2.txt +1 -0
  24. data/db/version_core_cards.txt +1 -1
  25. data/lib/card.rb +23 -13
  26. data/lib/card/auth.rb +6 -6
  27. data/lib/card/cache.rb +24 -5
  28. data/lib/card/env.rb +10 -10
  29. data/lib/card/format.rb +29 -12
  30. data/lib/card/log.rb +5 -3
  31. data/lib/card/migration.rb +17 -41
  32. data/lib/card/name.rb +12 -0
  33. data/lib/card/reference.rb +11 -12
  34. data/lib/card/set.rb +59 -6
  35. data/lib/card/simplecov_helper.rb +6 -1
  36. data/lib/card/spec_helper.rb +3 -2
  37. data/lib/card/view_cache.rb +77 -0
  38. data/lib/cardio.rb +30 -22
  39. data/mod/01_core/format/html_format.rb +17 -9
  40. data/mod/01_core/layout/blank.html +1 -1
  41. data/mod/01_core/layout/default.html +6 -16
  42. data/mod/01_core/layout/modal.html +9 -0
  43. data/mod/01_core/layout/noside.html +5 -12
  44. data/mod/01_core/layout/simple.html +1 -1
  45. data/mod/01_core/set/all/collection.rb +57 -5
  46. data/mod/01_core/set/all/content.rb +5 -7
  47. data/mod/01_core/set/all/name.rb +8 -10
  48. data/mod/01_core/set/all/permissions.rb +1 -2
  49. data/mod/01_core/set/all/phases.rb +5 -13
  50. data/mod/01_core/set/all/references.rb +10 -10
  51. data/mod/01_core/set/all/rules.rb +2 -2
  52. data/mod/01_core/set/all/tracked_attributes.rb +5 -3
  53. data/mod/01_core/set/all/utils.rb +79 -9
  54. data/mod/01_core/set/all/view_cache.rb +9 -0
  55. data/mod/01_core/spec/format/html_format_spec.rb +2 -2
  56. data/mod/01_core/spec/set/all/collection_spec.rb +1 -1
  57. data/mod/01_history/lib/card/act.rb +3 -1
  58. data/mod/01_history/lib/card/action.rb +20 -12
  59. data/mod/01_history/lib/card/change.rb +12 -8
  60. data/mod/01_history/set/all/actions.rb +2 -2
  61. data/mod/01_history/set/all/content_history.rb +3 -2
  62. data/mod/01_history/set/all/history.rb +57 -19
  63. data/mod/02_basic_types/set/all/rss.rb +5 -6
  64. data/mod/{05_standard → 02_basic_types}/set/type/html.rb +4 -3
  65. data/mod/02_basic_types/set/type/plain_text.rb +1 -1
  66. data/mod/02_basic_types/set/type/pointer.rb +7 -4
  67. data/mod/02_basic_types/spec/set/type/pointer_spec.rb +21 -17
  68. data/mod/03_machines/lib/card/machine.rb +33 -31
  69. data/mod/03_machines/lib/javascript/script_card_menu.js.coffee +2 -10
  70. data/mod/03_machines/lib/javascript/wagn.js.coffee +10 -10
  71. data/mod/03_machines/lib/javascript/wagn_mod.js.coffee +87 -40
  72. data/mod/03_machines/lib/stylesheets/style_cards.scss +26 -28
  73. data/mod/03_machines/set/right/machine_output.rb +3 -3
  74. data/mod/03_machines/set/type/coffee_script.rb +6 -6
  75. data/mod/03_machines/set/type/css.rb +1 -1
  76. data/mod/03_machines/set/type/java_script.rb +5 -6
  77. data/mod/03_machines/spec/lib/shared_machine_examples.rb +3 -1
  78. data/mod/03_machines/spec/set/type/scss_spec.rb +9 -10
  79. data/mod/04_settings/lib/card/setting.rb +16 -14
  80. data/mod/04_settings/set/right/structure.rb +6 -0
  81. data/mod/04_settings/set/self/add_help.rb +1 -1
  82. data/mod/04_settings/set/self/autoname.rb +1 -1
  83. data/mod/04_settings/set/self/captcha.rb +1 -1
  84. data/mod/04_settings/set/self/default.rb +1 -1
  85. data/mod/04_settings/set/self/help.rb +1 -1
  86. data/mod/04_settings/set/self/input.rb +1 -1
  87. data/mod/04_settings/set/self/layout.rb +1 -1
  88. data/mod/04_settings/set/self/on_create.rb +1 -1
  89. data/mod/04_settings/set/self/on_delete.rb +1 -1
  90. data/mod/04_settings/set/self/on_update.rb +1 -1
  91. data/mod/04_settings/set/self/options.rb +1 -1
  92. data/mod/04_settings/set/self/options_label.rb +1 -1
  93. data/mod/04_settings/set/self/script.rb +1 -1
  94. data/mod/04_settings/set/self/structure.rb +1 -1
  95. data/mod/04_settings/set/self/style.rb +1 -1
  96. data/mod/04_settings/set/self/table_of_contents.rb +1 -1
  97. data/mod/04_settings/set/self/thanks.rb +1 -1
  98. data/mod/05_email/set/all/follow.rb +3 -21
  99. data/mod/05_email/set/all/notify.rb +20 -4
  100. data/mod/05_email/set/right/follow.rb +16 -18
  101. data/mod/05_email/set/self/follow.rb +1 -1
  102. data/mod/05_email/spec/set/all/follow_spec.rb +6 -13
  103. data/mod/05_standard/set/all/attach.rb +23 -9
  104. data/mod/05_standard/set/all/error.rb +5 -7
  105. data/mod/05_standard/set/all/event_viz.rb +10 -6
  106. data/mod/05_standard/set/all/links.rb +37 -13
  107. data/mod/05_standard/set/all/rich_html/content.rb +46 -18
  108. data/mod/05_standard/set/all/rich_html/editing.rb +29 -25
  109. data/mod/05_standard/set/all/rich_html/form.rb +17 -10
  110. data/mod/05_standard/set/all/rich_html/header.rb +26 -4
  111. data/mod/05_standard/set/all/rich_html/menu.rb +17 -34
  112. data/mod/05_standard/set/all/rich_html/modal.rb +50 -12
  113. data/mod/05_standard/set/all/rich_html/toolbar.rb +178 -186
  114. data/mod/05_standard/set/all/rich_html/wrapper.rb +44 -21
  115. data/mod/05_standard/set/rstar/rules.rb +43 -53
  116. data/mod/05_standard/set/self/all.rb +2 -1
  117. data/mod/05_standard/set/self/head.rb +2 -2
  118. data/mod/05_standard/set/self/signin.rb +18 -18
  119. data/mod/05_standard/set/self/stats.rb +14 -2
  120. data/mod/05_standard/set/type/search_type.rb +9 -4
  121. data/mod/05_standard/set/type/session.rb +12 -7
  122. data/mod/05_standard/set/type/set.rb +135 -18
  123. data/mod/05_standard/spec/chunk/include_spec.rb +15 -16
  124. data/mod/05_standard/spec/set/all/account_spec.rb +21 -21
  125. data/mod/05_standard/spec/set/all/event_viz_spec.rb +7 -7
  126. data/mod/05_standard/spec/set/all/history_spec.rb +54 -24
  127. data/mod/05_standard/spec/set/all/rich_html/editing_spec.rb +42 -40
  128. data/mod/05_standard/spec/set/rstar/rules_spec.rb +1 -1
  129. data/mod/05_standard/spec/set/type/search_type_spec.rb +9 -1
  130. data/mod/05_standard/spec/set/type/signup_spec.rb +42 -42
  131. data/mod/06_bootstrap/lib/stylesheets/bootstrap_cards.scss +6 -0
  132. data/mod/06_bootstrap/set/all/bootstrap/form.rb +4 -5
  133. data/mod/06_bootstrap/set/all/bootstrap/helper.rb +145 -0
  134. data/mod/06_bootstrap/set/all/rich_bootstrap.rb +0 -59
  135. data/spec/lib/card/action_spec.rb +1 -1
  136. data/spec/lib/card/log_spec.rb +7 -7
  137. data/spec/models/card/cardtype_spec.rb +1 -1
  138. data/spec/spec_helper.rb +1 -1
  139. metadata +31 -6
  140. 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
- builder.new("card[subcards][#{card.relative_name}]", card, template, {}, block)
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 }" ) if card.new_card?
192
- opts[:class] += " RIGHT-#{ card.cardname.tag_name.safe_key }" if card.cardname.junction?
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
- _render_raw(args).scan( /\{\{\s*\+[^\}]*\}\}/ ).map do |inc| #fixme - wrong place for regexp!
199
- process_content( inc ).strip
200
- end.join
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 << _render_follow_modal_link(args) if args[:show_menu_item][:follow]
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
- opts = {
60
- :view=>:edit,
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', {:page=>card}, args[:html_args])
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
- opts = { :related=>{:name=>'+*account',:view=>:edit,:slot=>{:hide=>'edit_toolbar'}},
80
- :path_opts=>{:slot=>{:show=>:account_toolbar}} }
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
- opts = { :view=>args[:home_view] || :open,
86
- :path_opts=>{:slot=>{:show=>:toolbar}}}
87
- menu_item('', 'option-horizontal', opts, args[:html_args])
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
- def menu_item text, icon, target, html_args=nil
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.merge!(html_args) if html_args
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
- view :modal_link_and_dialog do |args|
13
- _render_modal_link(args) + _render_modal(args)
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
- _optional_render :modal_content, args, :hide
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
- (wrap_with(:p, :class=>"navbar-text navbar-left") do
16
- _optional_render(:type_link,args,:show)
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
- close_link('hidden-xs navbar-right'),
19
- %{
20
- <form class="navbar-form navbar-right">
21
- <div class="form-group">
22
- #{_optional_render :toolbar_buttons_advanced, args, :show}
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 close_link css_class
32
- wrap_with :ul, :class=>"nav navbar-nav #{css_class}" do
33
- [
34
- toolbar_pin_link,
35
- "<li>#{view_link(glyphicon('remove'), :home, :title=>'cancel')}</li>"
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
- navbar id, :toggle=>'Edit<span class="caret"></span>', :toggle_align=>:left,
48
- :class=>'slotter toolbar', :navbar_type=>'inverse', :collapsed_content=>close_link('pull-right visible-xs') do
49
- [
50
- content_tag(:span, 'Edit:', :class=>"navbar-text hidden-xs"),
51
- (wrap_with :ul, :class=>'nav navbar-nav nav-pills' do
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
- view :account_toolbar do |args|
66
- if card.accountable?
67
- links = []
68
- links << account_pill( 'account', true, :view=>:edit, :slot=>{:hide=>'edit_toolbar'})
69
- links << account_pill( 'roles')
70
- links << account_pill( 'created')
71
- links << account_pill( 'edited')
72
- links << account_pill( 'follow')
73
- navbar 'account-toolbar',:toggle_align=>:left, :collapsed_content=>close_link('pull-right visible-xs'), :navbar_type=>'inverse',
74
- :class=>"slotter toolbar", :nav_opts=>{'data-slot-selector'=>'.card-slot.related-view > .card-frame > .card-body > .card-slot'} do
75
- [
76
- content_tag(:ul, links.join("\n").html_safe, :class=>'nav navbar-nav nav-pills'),
77
- content_tag(:ul, "<li>#{view_link(glyphicon('remove','hidden-xs'), :open)}</li>".html_safe, :class=>'nav navbar-nav navbar-right'),
78
- ]
79
- end
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
- view :toolbar_buttons do |args|
84
- wrap_with(:div, :class=>'btn-group') do
85
- [
86
- _optional_render(:history_button, args, :show),
87
- _optional_render(:delete_button, args, (card.ok?(:delete) ? :show : :hide)),
88
- _optional_render(:refresh_button, args, :hide)
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
- view :toolbar_buttons_advanced do |args|
94
- wrap_with(:div, :class=>'btn-group') do
95
- [
96
- _optional_render(:rules_button, args, :show),
97
- _optional_render(:related_button, args, :show),
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 :edit_toolbar_buttons do |args|
147
+ view :toolbar_buttons do |args|
103
148
  wrap_with(:div, :class=>'btn-group') do
104
149
  [
105
- _optional_render(:edit_content_button, args, :show),
106
- _optional_render(:edit_structure_button, args, :show),
107
- _optional_render(:edit_name_button, args, :show),
108
- _optional_render(:edit_type_button, args, :show),
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
- view :rules_button do |args|
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
- btn_dropdown('related', 'tree-deciduous', [
119
- menu_item('children', 'baby-formula', {:related=>'*children', :path_opts=>path_opts}),
120
- menu_item('mates', 'bed', {:related=>'*mates', :path_opts=>path_opts}),
121
- menu_item('references out', 'log-out', {:related=>'*refers_to', :path_opts=>path_opts}),
122
- menu_item('references in', 'log-in', {:related=>'*referred_to_by', :path_opts=>path_opts})
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
- ], :class=>'related')
125
- end
126
- view :history_button do |args|
127
- toolbar_button('history', 'time', 'hidden-xs hidden-sm hidden-md', :view=>'history')
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
- view :type_link do |args|
168
- card_link(card.type_name, :text=>"Type: #{card.type_name}", :class=>'navbar-link') +
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
- tag_args[:class] = [ tag_args[:class], 'btn btn-default' ].compact * ' '
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 pill_view_link name, view, args
190
- active_view = args[:active_toolbar_view] || args[:home_view]
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 pill_dropdown name, items, active=false
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
- def btn_dropdown name, icon, items, opts={}
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
- def dropdown_list items, extra_css_class=nil
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
- def toolbar_pin_link
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
- def edit_toolbar_pin_link
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
- def edit_toolbar_close_link
257
- link = view_link glyphicon('remove', 'hidden-xs'), :home, :path_opts=>{:slot=>{:hide=>:edit_toolbar}}
258
- "<li>#{link}</li>"
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 edit_toolbar_autosave_link
262
- link = view_link('autosaved draft', :edit, :path_opts=>{:edit_draft=>true, :slot=>{:show=>:edit_toolbar}}, :class=>'navbar-link slotter')
263
- "<li>#{link}</li>"
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