card 1.15.7 → 1.16.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.
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