mercury-rails 0.8.0 → 0.9.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 (80) hide show
  1. data/app/assets/images/mercury/toolbar/primary/tools.png +0 -0
  2. data/app/assets/images/mercury/toolbar/primary/user.png +0 -0
  3. data/app/assets/javascripts/mercury/dialogs/snippetpanel.js.coffee +1 -1
  4. data/app/assets/javascripts/mercury/lightview.js.coffee +11 -4
  5. data/app/assets/javascripts/mercury/locales/ar.locale.js.coffee +0 -4
  6. data/app/assets/javascripts/mercury/locales/da.locale.js.coffee +0 -4
  7. data/app/assets/javascripts/mercury/locales/de.locale.js.coffee +0 -4
  8. data/app/assets/javascripts/mercury/locales/es.locale.js.coffee +0 -4
  9. data/app/assets/javascripts/mercury/locales/example.local.js.coffee +0 -4
  10. data/app/assets/javascripts/mercury/locales/fr.locale.js.coffee +0 -4
  11. data/app/assets/javascripts/mercury/locales/hu.locale.js.coffee +209 -0
  12. data/app/assets/javascripts/mercury/locales/it.locale.js.coffee +0 -4
  13. data/app/assets/javascripts/mercury/locales/ko.local.js.coffee +0 -4
  14. data/app/assets/javascripts/mercury/locales/nl.locale.js.coffee +0 -4
  15. data/app/assets/javascripts/mercury/locales/pt.locale.js.coffee +0 -4
  16. data/app/assets/javascripts/mercury/locales/ru.locale.js.coffee +200 -0
  17. data/app/assets/javascripts/mercury/locales/sv.local.js.coffee +0 -4
  18. data/app/assets/javascripts/mercury/locales/swedish_chef.locale.js.coffee +0 -4
  19. data/app/assets/javascripts/mercury/locales/zh.local.js.coffee +0 -4
  20. data/app/assets/javascripts/mercury/mercury-compiled.js +10720 -0
  21. data/app/assets/javascripts/mercury/mercury.js.coffee +1 -1
  22. data/app/assets/javascripts/mercury/modal.js.coffee +14 -7
  23. data/app/assets/javascripts/mercury/modals/htmleditor.js.coffee +1 -1
  24. data/app/assets/javascripts/mercury/modals/insertmedia.js.coffee +2 -0
  25. data/app/assets/javascripts/mercury/modals/inserttable.js.coffee +10 -4
  26. data/app/assets/javascripts/mercury/page_editor.js.coffee +9 -9
  27. data/app/assets/javascripts/mercury/palette.js.coffee +1 -1
  28. data/app/assets/javascripts/mercury/panel.js.coffee +1 -0
  29. data/app/assets/javascripts/mercury/region.js.coffee +3 -3
  30. data/app/assets/javascripts/mercury/regions/{full.coffee → full.js.coffee} +2 -2
  31. data/app/assets/javascripts/mercury/regions/{markdown.coffee → markdown.js.coffee} +7 -1
  32. data/app/assets/javascripts/mercury/regions/snippets.js.coffee +1 -1
  33. data/app/assets/javascripts/mercury/select.js.coffee +1 -1
  34. data/app/assets/javascripts/mercury/snippet.js.coffee +40 -21
  35. data/app/assets/javascripts/mercury/toolbar.button.js.coffee +35 -20
  36. data/app/assets/javascripts/mercury/toolbar.expander.js.coffee +4 -3
  37. data/app/assets/javascripts/mercury/toolbar.js.coffee +6 -2
  38. data/app/assets/stylesheets/_mercury-bootstrap-overrides.scss +61 -0
  39. data/app/assets/stylesheets/_mercury-sass.scss +33 -0
  40. data/app/assets/stylesheets/mercury.css +1 -0
  41. data/app/assets/stylesheets/mercury/all_images.css.erb +4 -0
  42. data/app/assets/stylesheets/mercury/dialog.css +5 -2
  43. data/app/assets/stylesheets/mercury/mercury.css +0 -1
  44. data/app/assets/stylesheets/mercury/toolbar.css +3 -0
  45. data/app/assets/stylesheets/mercury/uploader.css +1 -1
  46. data/app/views/mercury/modals/media.html +10 -0
  47. data/app/views/mercury/panels/snippets.html +6 -1
  48. data/app/views/mercury/snippets/example/options.html.erb +1 -1
  49. data/app/views/mercury/snippets/no_options/preview.html.erb +1 -0
  50. data/features/loading/loading.feature +1 -1
  51. data/features/regions/full/basic_editing.feature +2 -2
  52. data/features/regions/full/inserting_media.feature +18 -0
  53. data/features/regions/full/inserting_snippets.feature +11 -0
  54. data/features/step_definitions/custom_web_steps.rb +22 -0
  55. data/features/step_definitions/mercury_steps.rb +1 -439
  56. data/features/support/selectors.rb +23 -0
  57. data/lib/generators/mercury/install/images/templates/ar_paperclip_image.rb +2 -0
  58. data/lib/mercury/cucumber/step_definitions.rb +13 -0
  59. data/lib/mercury/cucumber/step_definitions/mercury_steps.rb +408 -0
  60. data/{features → lib/mercury/cucumber}/support/mercury_contents.rb +1 -1
  61. data/{features → lib/mercury/cucumber}/support/mercury_selectors.rb +0 -20
  62. data/lib/mercury/rails.rb +1 -0
  63. data/lib/mercury/version.rb +1 -1
  64. data/spec/dummy/config/application.rb +4 -1
  65. data/spec/dummy/config/database.yml +10 -0
  66. data/spec/dummy/db/.gitkeep +0 -0
  67. data/spec/dummy/public/index.html +13 -2
  68. data/spec/javascripts/mercury/lightview_spec.js.coffee +33 -1
  69. data/spec/javascripts/mercury/modal_spec.js.coffee +35 -3
  70. data/spec/javascripts/mercury/modals/htmleditor_spec.js.coffee +1 -1
  71. data/spec/javascripts/mercury/modals/insertmedia_spec.js.coffee +6 -2
  72. data/spec/javascripts/mercury/modals/inserttable_spec.js.coffee +10 -0
  73. data/spec/javascripts/mercury/page_editor_spec.js.coffee +6 -5
  74. data/spec/javascripts/mercury/region_spec.js.coffee +4 -0
  75. data/spec/javascripts/mercury/snippet_spec.js.coffee +65 -21
  76. data/spec/javascripts/mercury/toolbar_spec.js.coffee +22 -0
  77. data/spec/javascripts/templates/mercury/modals/insertmedia.html +10 -0
  78. metadata +26 -16
  79. data/spec/dummy/config/database.example.yml +0 -25
  80. data/spec/dummy/config/database.travisci.yml +0 -4
@@ -34,7 +34,7 @@
34
34
  #
35
35
  @Mercury ||= {}
36
36
  jQuery.extend @Mercury,
37
- version: '0.8.0'
37
+ version: '0.9.0'
38
38
 
39
39
  # Mercury object namespaces
40
40
  Regions: Mercury.Regions || {}
@@ -1,7 +1,7 @@
1
1
  @Mercury.modal = (url, options = {}) ->
2
- Mercury.modal.instance ||= new Mercury.Modal(url, options)
3
- Mercury.modal.instance.show(url, options)
4
- return Mercury.modal.instance
2
+ instance = new Mercury.Modal(url, options)
3
+ instance.show()
4
+ return instance
5
5
 
6
6
 
7
7
  class @Mercury.Modal
@@ -13,6 +13,7 @@ class @Mercury.Modal
13
13
  @url = url || @url
14
14
  @options = options || @options
15
15
  @options.minWidth ||= 400
16
+ @options.ujsHandling = true unless @options.ujsHandling == false
16
17
 
17
18
  Mercury.trigger('focus:window')
18
19
  @initializeModal()
@@ -54,9 +55,10 @@ class @Mercury.Modal
54
55
  @titleElement.find('a').on 'click', =>
55
56
  @hide()
56
57
 
57
- @element.on 'ajax:beforeSend', (event, xhr, options) =>
58
- options.success = (content) =>
59
- @loadContent(content)
58
+ if @options.ujsHandling
59
+ @element.on 'ajax:beforeSend', (event, xhr, options) =>
60
+ options.success = (content) =>
61
+ @loadContent(content)
60
62
 
61
63
  jQuery(document).on 'keydown', (event) =>
62
64
  @hide() if event.keyCode == 27 && @visible
@@ -187,6 +189,7 @@ class @Mercury.Modal
187
189
  @initialize()
188
190
 
189
191
  @element.localize(Mercury.locale()) if Mercury.config.localization.enabled
192
+ @element.find('.modal-close').on('click', @hide)
190
193
  @resize()
191
194
 
192
195
 
@@ -196,12 +199,16 @@ class @Mercury.Modal
196
199
  if @options.closeButton == false then closeButton.hide() else closeButton.show()
197
200
 
198
201
 
202
+ serializeForm: ->
203
+ return @element.find('form').serializeObject() || {}
204
+
205
+
199
206
  reset: ->
200
207
  @titleElement.find('span').html('')
201
208
  @contentElement.html('')
202
209
 
203
210
 
204
- hide: ->
211
+ hide: =>
205
212
  return if @showing
206
213
  @options = {}
207
214
 
@@ -7,6 +7,6 @@
7
7
  # replace the contents on form submit
8
8
  @element.find('form').on 'submit', (event) =>
9
9
  event.preventDefault()
10
- value = @element.find('textarea').val().replace(/\n/g, '')
10
+ value = @element.find('textarea').val()
11
11
  Mercury.trigger('action', {action: 'replaceHTML', value: value})
12
12
  @hide()
@@ -27,6 +27,7 @@
27
27
  if image = selection.is?('img')
28
28
  @element.find('#media_image_url').val(image.attr('src'))
29
29
  @element.find('#media_image_alignment').val(image.attr('align'))
30
+ @element.find('#media_image_float').val(if image.attr('style')? then image.css('float') else '')
30
31
  @focus('#media_image_url')
31
32
 
32
33
  # if we're editing an iframe (assume it's a video for now)
@@ -98,6 +99,7 @@
98
99
  when 'image_url'
99
100
  attrs = {src: @element.find('#media_image_url').val()}
100
101
  attrs['align'] = alignment if alignment = @element.find('#media_image_alignment').val()
102
+ attrs['style'] = 'float: ' + float + ';' if float = @element.find('#media_image_float').val()
101
103
  Mercury.trigger('action', {action: 'insertImage', value: attrs})
102
104
 
103
105
  when 'youtube_url'
@@ -41,13 +41,19 @@
41
41
  setTableAlignment: ->
42
42
  @table.attr({align: @element.find('#table_alignment').val()})
43
43
 
44
-
45
44
  setTableBorder: ->
46
- @table.attr({border: parseInt(@element.find('#table_border').val(), 10) || 1})
47
-
45
+ border = parseInt(@element.find('#table_border').val(), 10)
46
+ if isNaN(border)
47
+ @table.removeAttr('border')
48
+ else
49
+ @table.attr({border: border})
48
50
 
49
51
  setTableCellSpacing: ->
50
- @table.attr({cellspacing: parseInt(@element.find('#table_spacing').val(), 10) || 1})
52
+ cellspacing = parseInt(@element.find('#table_spacing').val(), 10)
53
+ if isNaN(cellspacing)
54
+ @table.removeAttr('cellspacing')
55
+ else
56
+ @table.attr({cellspacing: cellspacing})
51
57
 
52
58
 
53
59
  submitForm: ->
@@ -24,12 +24,12 @@ class @Mercury.PageEditor
24
24
  @iframe = jQuery('<iframe>', {id: 'mercury_iframe', class: 'mercury-iframe', frameborder: '0', src: 'about:blank'})
25
25
  @iframe.appendTo(jQuery(@options.appendTo).get(0) ? 'body')
26
26
 
27
- @toolbar = new Mercury.Toolbar(@options)
28
- @statusbar = new Mercury.Statusbar(@options)
27
+ @toolbar = new Mercury.Toolbar(jQuery.extend(true, {}, @options, @options.toolbarOptions))
28
+ @statusbar = new Mercury.Statusbar(jQuery.extend(true, {}, @options, @options.statusbarOptions))
29
29
  @resize()
30
30
 
31
- @iframe.on 'load', => @initializeFrame()
32
31
  @iframe.one 'load', => @bindEvents()
32
+ @iframe.on 'load', => @initializeFrame()
33
33
  @loadIframeSrc(null)
34
34
 
35
35
 
@@ -93,7 +93,7 @@ class @Mercury.PageEditor
93
93
 
94
94
 
95
95
  finalizeInterface: ->
96
- @santizerElement = jQuery('<div>', {id: 'mercury_sanitizer', contenteditable: 'true', style: 'position:fixed;width:100px;height:100px;top:0;left:-100px;opacity:0;overflow:hidden'})
96
+ @santizerElement = jQuery('<div>', {id: 'mercury_sanitizer', contenteditable: 'true', style: 'position:fixed;width:100px;height:100px;min-width:0;top:0;left:-100px;opacity:0;overflow:hidden'})
97
97
  @santizerElement.appendTo(@options.appendTo ? @document.find('body'))
98
98
 
99
99
  @snippetToolbar.release() if @snippetToolbar
@@ -126,7 +126,7 @@ class @Mercury.PageEditor
126
126
  Mercury.on 'action', (event, options) =>
127
127
  action = Mercury.config.globalBehaviors[options.action] || @[options.action]
128
128
  return unless typeof(action) == 'function'
129
- options.already_handled = true
129
+ event.preventDefault()
130
130
  action.call(@, options)
131
131
 
132
132
  jQuery(window).on 'resize', =>
@@ -161,7 +161,7 @@ class @Mercury.PageEditor
161
161
  resize: ->
162
162
  width = jQuery(window).width()
163
163
  height = @statusbar.top()
164
- toolbarHeight = @toolbar.height()
164
+ toolbarHeight = @toolbar.top() + @toolbar.height()
165
165
 
166
166
  Mercury.displayRect = {top: toolbarHeight, left: 0, width: width, height: height - toolbarHeight, fullHeight: height}
167
167
 
@@ -178,7 +178,7 @@ class @Mercury.PageEditor
178
178
  # remove the /editor segment of the url if it gets passed through
179
179
  url = (url ? window.location.href).replace(Mercury.config.editorUrlRegEx ?= /([http|https]:\/\/.[^\/]*)\/editor\/?(.*)/i, "$1/$2")
180
180
  url = url.replace(/[\?|\&]mercury_frame=true/gi, '')
181
- url = url.replace(/\&_=i\d+/gi, '')
181
+ url = url.replace(/\&_=\d+/gi, '')
182
182
  if params
183
183
  # add a param allowing the server to know that the request is coming from mercury
184
184
  # and add a cache busting param so we don't get stale content
@@ -236,9 +236,9 @@ class @Mercury.PageEditor
236
236
  type: method
237
237
  dataType: @options.saveDataType
238
238
  data: data
239
- success: =>
239
+ success: (response) =>
240
240
  Mercury.changes = false
241
- Mercury.trigger('saved')
241
+ Mercury.trigger('saved', response)
242
242
  callback() if typeof(callback) == 'function'
243
243
  error: (response) =>
244
244
  Mercury.trigger('save_failed', response)
@@ -16,7 +16,7 @@ class @Mercury.Palette extends Mercury.Dialog
16
16
 
17
17
  position: (keepVisible) ->
18
18
  @element.css({top: 0, left: 0, display: 'block', visibility: 'hidden'})
19
- position = @button.offset()
19
+ position = @button.position()
20
20
  width = @element.width()
21
21
 
22
22
  position.left = position.left - width + @button.width() if position.left + width > jQuery(window).width()
@@ -57,6 +57,7 @@ class @Mercury.Panel extends Mercury.Dialog
57
57
  @titleElement.find('.mercury-panel-close').animate({opacity: 1}, 100)
58
58
 
59
59
  @paneElement.css({display: 'block', width: postWidth})
60
+ jQuery(@paneElement.find('.focusable').get(0)).focus()
60
61
  @makeDraggable()
61
62
 
62
63
  @hide() unless @visible
@@ -28,7 +28,7 @@ class @Mercury.Region
28
28
  @focus()
29
29
 
30
30
  Mercury.on 'action', (event, options) =>
31
- return if @previewing || Mercury.region != @
31
+ return if @previewing || Mercury.region != @ || event.isDefaultPrevented()
32
32
  @execCommand(options.action, options) if options.action
33
33
 
34
34
  @element.on 'mousemove', (event) =>
@@ -76,7 +76,7 @@ class @Mercury.Region
76
76
  @pushHistory() unless action == 'redo'
77
77
 
78
78
  Mercury.log('execCommand', action, options.value)
79
- Mercury.changes = true unless options.already_handled
79
+ Mercury.changes = true
80
80
 
81
81
 
82
82
  pushHistory: ->
@@ -94,7 +94,7 @@ class @Mercury.Region
94
94
 
95
95
  dataAttributes: ->
96
96
  data = {}
97
- data[attr] = @element.attr('data-' + attr) for attr in Mercury.config.regions.dataAttributes
97
+ data[attr] = (@container || @element).attr('data-' + attr) for attr in Mercury.config.regions.dataAttributes
98
98
  return data
99
99
 
100
100
 
@@ -94,7 +94,7 @@ class @Mercury.Regions.Full extends Mercury.Region
94
94
  return if @previewing
95
95
  if snippetPlaceHolder = @element.find('img[data-snippet]').get(0)
96
96
  @focus()
97
- Mercury.Snippet.displayOptionsFor(jQuery(snippetPlaceHolder).data('snippet'))
97
+ Mercury.Snippet.displayOptionsFor(jQuery(snippetPlaceHolder).data('snippet'), {}, jQuery(snippetPlaceHolder).data('options'))
98
98
  @document.execCommand('undo', false, null)
99
99
 
100
100
  # custom paste handling: we have to do some hackery to get the pasted content since it's not exposed normally
@@ -425,7 +425,7 @@ class @Mercury.Regions.Full extends Mercury.Region
425
425
 
426
426
  redo: -> @content(@history.redo())
427
427
 
428
- horizontalRule: -> this.execCommand('insertHorizontalRule')
428
+ horizontalRule: -> @execCommand('insertHTML', {value: '<hr/>'})
429
429
 
430
430
  removeFormatting: (selection) -> selection.insertTextNode(selection.textContent())
431
431
 
@@ -34,6 +34,12 @@ class @Mercury.Regions.Markdown extends Mercury.Region
34
34
  @resize()
35
35
 
36
36
 
37
+ dataAttributes: ->
38
+ data = {}
39
+ data[attr] = @container.attr('data-' + attr) for attr in Mercury.config.regions.dataAttributes
40
+ return data
41
+
42
+
37
43
  bindEvents: ->
38
44
  Mercury.on 'mode', (event, options) => @togglePreview() if options.mode == 'preview'
39
45
  Mercury.on 'focus:frame', => @focus() if !@previewing && Mercury.region == @
@@ -65,7 +71,7 @@ class @Mercury.Regions.Markdown extends Mercury.Region
65
71
  if Mercury.snippet
66
72
  event.preventDefault()
67
73
  @focus()
68
- Mercury.Snippet.displayOptionsFor(Mercury.snippet)
74
+ Mercury.Snippet.displayOptionsFor(Mercury.snippet.name, {}, Mercury.snippet.hasOptions)
69
75
 
70
76
  # handle any files that were dropped
71
77
  if event.originalEvent.dataTransfer.files.length
@@ -46,7 +46,7 @@ class @Mercury.Regions.Snippets extends Mercury.Region
46
46
  return if @previewing || ! Mercury.snippet
47
47
  @focus()
48
48
  event.preventDefault()
49
- Mercury.Snippet.displayOptionsFor(Mercury.snippet)
49
+ Mercury.Snippet.displayOptionsFor(Mercury.snippet.name, {}, Mercury.snippet.hasOptions)
50
50
 
51
51
  jQuery(@document).on 'keydown', (event) =>
52
52
  return if @previewing || Mercury.region != @
@@ -20,7 +20,7 @@ class @Mercury.Select extends Mercury.Dialog
20
20
 
21
21
  position: (keepVisible) ->
22
22
  @element.css({top: 0, left: 0, display: 'block', visibility: 'hidden'})
23
- position = @button.offset()
23
+ position = @button.position()
24
24
  elementWidth = @element.width()
25
25
  elementHeight = @element.height()
26
26
  documentHeight = jQuery(document).height()
@@ -2,27 +2,47 @@ class @Mercury.Snippet
2
2
 
3
3
  @all: []
4
4
 
5
- @displayOptionsFor: (name, options = {}) ->
6
- Mercury.modal Mercury.config.snippets.optionsUrl.replace(':name', name), jQuery.extend({
7
- title: 'Snippet Options'
8
- handler: 'insertSnippet'
9
- snippetName: name
10
- }, options)
5
+ @displayOptionsFor: (name, options = {}, displayOptions = true) ->
6
+ if displayOptions
7
+ Mercury.modal @optionsUrl(name), jQuery.extend({
8
+ title: 'Snippet Options'
9
+ handler: 'insertSnippet'
10
+ snippetName: name
11
+ loadType: Mercury.config.snippets.method
12
+ }, options)
13
+ else
14
+ snippet = Mercury.Snippet.create(name)
15
+ Mercury.trigger('action', {action: 'insertSnippet', value: snippet})
11
16
  Mercury.snippet = null
12
17
 
13
18
 
14
- @create: (name, options) ->
15
- if @all.length > 0
16
- identity = "snippet_0"
17
- for snippet, i in @all
18
- identity = "snippet_#{i+1}" if snippet.identity == identity
19
- else
20
- identity = "snippet_#{@all.length}"
19
+ @optionsUrl: (name) ->
20
+ url = Mercury.config.snippets.optionsUrl
21
+ url = url() if typeof(url) == 'function'
22
+ return url.replace(':name', name)
23
+
21
24
 
22
- instance = new Mercury.Snippet(name, identity, options)
25
+ @previewUrl: (name) ->
26
+ url = Mercury.config.snippets.previewUrl
27
+ url = url() if typeof(url) == 'function'
28
+ return url.replace(':name', name)
29
+
30
+
31
+ @create: (name, options) ->
32
+ instance = new Mercury.Snippet(name, @uniqueId(), options)
23
33
  @all.push(instance)
24
34
  return instance
25
35
 
36
+ @uniqueId: ->
37
+ [i, identity] = [0, "snippet_0"]
38
+ identities = (snippet.identity for snippet in @all)
39
+
40
+ while identities.indexOf(identity) isnt -1
41
+ i += 1
42
+ identity = "snippet_#{i}"
43
+
44
+ return identity
45
+
26
46
 
27
47
  @find: (identity) ->
28
48
  for snippet in @all
@@ -32,7 +52,7 @@ class @Mercury.Snippet
32
52
 
33
53
  @load: (snippets) ->
34
54
  for own identity, details of snippets
35
- instance = new Mercury.Snippet(details.name, identity, details.options)
55
+ instance = new Mercury.Snippet(details.name, identity, details)
36
56
  @all.push(instance)
37
57
 
38
58
 
@@ -66,7 +86,7 @@ class @Mercury.Snippet
66
86
 
67
87
 
68
88
  loadPreview: (element, callback = null) ->
69
- jQuery.ajax Mercury.config.snippets.previewUrl.replace(':name', @name), {
89
+ jQuery.ajax Snippet.previewUrl(@name), {
70
90
  headers: Mercury.ajaxHeaders()
71
91
  type: Mercury.config.snippets.method
72
92
  data: @options
@@ -81,7 +101,7 @@ class @Mercury.Snippet
81
101
 
82
102
  displayOptions: ->
83
103
  Mercury.snippet = @
84
- Mercury.modal Mercury.config.snippets.optionsUrl.replace(':name', @name), {
104
+ Mercury.modal Snippet.optionsUrl(@name), {
85
105
  title: 'Snippet Options',
86
106
  handler: 'insertSnippet',
87
107
  loadType: Mercury.config.snippets.method,
@@ -107,7 +127,6 @@ class @Mercury.Snippet
107
127
 
108
128
 
109
129
  serialize: ->
110
- return {
111
- name: @name
112
- options: @options
113
- }
130
+ return $.extend({name: @name}, @options )
131
+
132
+
@@ -89,32 +89,47 @@ class @Mercury.Toolbar.Button
89
89
 
90
90
  @element.on 'click', (event) =>
91
91
  if @element.closest('.disabled').length then return
92
+ @handleClick(event)
92
93
 
93
- handled = false
94
- for own type, mixed of @handled
95
- switch type
96
- when 'toggle'
97
- @togglePressed() unless @handled.mode
98
94
 
99
- when 'mode'
100
- handled = true
101
- Mercury.trigger('mode', {mode: mixed})
95
+ handleClick: (event) ->
96
+ handled = false
97
+ for own type, mixed of @handled
98
+ switch type
99
+ when 'toggle'
100
+ @togglePressed() unless @handled.mode
101
+
102
+ when 'mode'
103
+ handled = true
104
+ Mercury.trigger('mode', {mode: mixed})
105
+
106
+ when 'modal'
107
+ handled = @handleModal(event)
108
+
109
+ when 'lightview'
110
+ handled = @handleLightview(event)
111
+
112
+ when 'palette', 'select', 'panel'
113
+ handled = @handleDialog(event, type)
114
+
115
+ Mercury.trigger('action', {action: @name}) unless handled
116
+ Mercury.trigger('focus:frame') if @options['regions'] && @options['regions'].length
117
+
118
+
119
+ handleModal: (event) ->
120
+ Mercury.modal(@handled.modal, {title: @summary || @title, handler: @name})
121
+ return true
102
122
 
103
- when 'modal'
104
- handled = true
105
- Mercury.modal(@handled.modal, {title: @summary || @title, handler: @name})
106
123
 
107
- when 'lightview'
108
- handled = true
109
- Mercury.lightview(@handled.lightview, {title: @summary || @title, handler: @name, closeButton: true})
124
+ handleLightview: (event) ->
125
+ Mercury.lightview(@handled.lightview, {title: @summary || @title, handler: @name, closeButton: true})
126
+ return true
110
127
 
111
- when 'palette', 'select', 'panel'
112
- event.stopPropagation()
113
- handled = true
114
- @handled[type].toggle()
115
128
 
116
- Mercury.trigger('action', {action: @name}) unless handled
117
- Mercury.trigger('focus:frame') if @options['regions'] && @options['regions'].length
129
+ handleDialog: (event, type) ->
130
+ event.stopPropagation()
131
+ @handled[type].toggle()
132
+ return true
118
133
 
119
134
 
120
135
  defaultDialogOptions: ->