mercury-rails 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +5 -0
- data/{README.rdoc → README.md} +150 -60
- data/VERSION +1 -1
- data/annotated_source.template +57 -0
- data/app/controllers/mercury_controller.rb +8 -4
- data/app/models/image.rb +2 -2
- data/app/views/layouts/mercury.html.erb +14 -0
- data/app/views/mercury/lightviews/about.html +7 -0
- data/app/views/mercury/lightviews/imageprocessor.html +3 -0
- data/app/views/mercury/modals/character.html +255 -0
- data/app/views/mercury/modals/htmleditor.html +13 -0
- data/app/views/mercury/modals/link.html +75 -0
- data/app/views/mercury/modals/media.html +82 -0
- data/app/views/mercury/modals/sanitizer.html +9 -0
- data/app/views/mercury/modals/table.html +84 -0
- data/app/views/mercury/palettes/backcolor.html +73 -0
- data/app/views/mercury/palettes/forecolor.html +73 -0
- data/app/views/mercury/panels/history.html +3 -0
- data/app/views/mercury/panels/notes.html +3 -0
- data/app/views/mercury/panels/snippets.html +12 -0
- data/app/views/mercury/selects/formatblock.html +11 -0
- data/app/views/mercury/selects/style.html +5 -0
- data/app/views/mercury/snippets/example.html.erb +1 -0
- data/app/views/mercury/snippets/example_options.html.erb +23 -0
- data/config/routes.rb +1 -1
- data/features/editing/basic.feature +1 -1
- data/features/support/paths.rb +1 -0
- data/lib/generators/mercury/install/install_generator.rb +14 -0
- data/mercury-rails.gemspec +115 -106
- data/spec/javascripts/mercury/dialog_spec.js.coffee +54 -38
- data/spec/javascripts/mercury/dialogs/backcolor_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/dialogs/forecolor_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/dialogs/formatblock_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/dialogs/{objectspanel_spec.js.coffee → snippetpanel_spec.js.coffee} +4 -4
- data/spec/javascripts/mercury/dialogs/style_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/history_buffer_spec.js.coffee +0 -1
- data/spec/javascripts/mercury/lightview_spec.js.coffee +448 -0
- data/spec/javascripts/mercury/mercury_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/modal_spec.js.coffee +474 -0
- data/spec/javascripts/mercury/modals/htmleditor_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/modals/insertcharacter_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/modals/insertlink_spec.js.coffee +8 -2
- data/spec/javascripts/mercury/modals/insertmedia_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/modals/insertsnippet_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/modals/inserttable_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/native_extensions_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/page_editor_spec.js.coffee +160 -20
- data/spec/javascripts/mercury/palette_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/panel_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/region_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/regions/editable_spec.js.coffee +191 -6
- data/spec/javascripts/mercury/regions/markupable_spec.js.coffee +369 -0
- data/spec/javascripts/mercury/regions/snippetable_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/select_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/snippet_spec.js.coffee +3 -3
- data/spec/javascripts/mercury/snippet_toolbar_spec.js.coffee +2 -2
- data/spec/javascripts/mercury/statusbar_spec.js.coffee +91 -17
- data/spec/javascripts/mercury/table_editor_spec.js.coffee +5 -1
- data/spec/javascripts/mercury/toolbar.button_group_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/toolbar.button_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/toolbar.expander_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/toolbar_spec.js.coffee +70 -15
- data/spec/javascripts/mercury/tooltip_spec.js.coffee +1 -1
- data/spec/javascripts/mercury/uploader_spec.js.coffee +9 -1
- data/spec/javascripts/templates/mercury/dialogs/{objectspanel.html → snippetpanel.html} +0 -0
- data/spec/javascripts/templates/mercury/lightview.html +13 -0
- data/spec/javascripts/templates/mercury/modal.html +13 -0
- data/spec/javascripts/templates/mercury/page_editor.html +11 -1
- data/spec/javascripts/templates/mercury/statusbar.html +1 -0
- data/spec/javascripts/templates/mercury/toolbar.html +1 -0
- data/{app → vendor}/assets/images/mercury/button.png +0 -0
- data/{app → vendor}/assets/images/mercury/clippy.png +0 -0
- data/{app → vendor}/assets/images/mercury/default-snippet.png +0 -0
- data/{app → vendor}/assets/images/mercury/loading-dark.gif +0 -0
- data/{app → vendor}/assets/images/mercury/loading-light.gif +0 -0
- data/{app → vendor}/assets/images/mercury/search-icon.png +0 -0
- data/vendor/assets/images/mercury/temp-logo.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/editable/buttons.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/_expander.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/_pressed.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/historypanel.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/insertcharacter.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/insertlink.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/insertmedia.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/inserttable.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/inspectorpanel.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/notespanel.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/preview.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/redo.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/save.png +0 -0
- data/{app/assets/images/mercury/toolbar/primary/objectspanel.png → vendor/assets/images/mercury/toolbar/primary/snippetpanel.png} +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/primary/undo.png +0 -0
- data/{app → vendor}/assets/images/mercury/toolbar/snippetable/buttons.png +0 -0
- data/vendor/assets/javascripts/mercury.js +302 -0
- data/vendor/assets/javascripts/mercury/dialog.js.coffee +157 -0
- data/{app → vendor}/assets/javascripts/mercury/dialogs/backcolor.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/dialogs/forecolor.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/dialogs/formatblock.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/dialogs/objectspanel.js.coffee +1 -1
- data/{app → vendor}/assets/javascripts/mercury/dialogs/style.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/history_buffer.js.coffee +0 -0
- data/vendor/assets/javascripts/mercury/lightview.js.coffee +156 -0
- data/vendor/assets/javascripts/mercury/lightviews/imageprocessor.js.coffee +2 -0
- data/vendor/assets/javascripts/mercury/mercury.js.coffee +63 -0
- data/{app → vendor}/assets/javascripts/mercury/modal.js.coffee +25 -17
- data/{app → vendor}/assets/javascripts/mercury/modals/htmleditor.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/modals/insertcharacter.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/modals/insertlink.js.coffee +3 -0
- data/{app → vendor}/assets/javascripts/mercury/modals/insertmedia.js.coffee +10 -2
- data/{app → vendor}/assets/javascripts/mercury/modals/insertsnippet.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/modals/inserttable.js.coffee +2 -2
- data/{app → vendor}/assets/javascripts/mercury/native_extensions.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/page_editor.js.coffee +44 -13
- data/{app → vendor}/assets/javascripts/mercury/palette.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/panel.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/region.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/regions/editable.js.coffee +58 -12
- data/{app → vendor}/assets/javascripts/mercury/regions/markupable.js.coffee +26 -24
- data/{app → vendor}/assets/javascripts/mercury/regions/snippetable.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/select.js.coffee +3 -0
- data/{app → vendor}/assets/javascripts/mercury/snippet.js.coffee +9 -5
- data/{app → vendor}/assets/javascripts/mercury/snippet_toolbar.js.coffee +0 -0
- data/vendor/assets/javascripts/mercury/statusbar.js.coffee +51 -0
- data/{app → vendor}/assets/javascripts/mercury/table_editor.js.coffee +9 -8
- data/{app → vendor}/assets/javascripts/mercury/toolbar.button.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/toolbar.button_group.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/toolbar.expander.js.coffee +0 -0
- data/{app → vendor}/assets/javascripts/mercury/toolbar.js.coffee +14 -1
- data/{app → vendor}/assets/javascripts/mercury/tooltip.js.coffee +3 -0
- data/{app → vendor}/assets/javascripts/mercury/uploader.js.coffee +22 -13
- data/vendor/assets/javascripts/{jquery-1.6.js → mercury_dependencies/jquery-1.6.js} +0 -0
- data/vendor/assets/javascripts/{jquery-ui-1.8.13.custom.js → mercury_dependencies/jquery-ui-1.8.13.custom.js} +0 -0
- data/vendor/assets/javascripts/{jquery.additions.js → mercury_dependencies/jquery.additions.js} +0 -0
- data/vendor/assets/javascripts/{liquidmetal.js → mercury_dependencies/liquidmetal.js} +0 -0
- data/vendor/assets/javascripts/{showdown.js → mercury_dependencies/showdown.js} +0 -0
- data/vendor/assets/javascripts/mercury_loader.js +191 -0
- data/{app → vendor}/assets/stylesheets/mercury.css +3 -6
- data/vendor/assets/stylesheets/mercury/dialog.css +199 -0
- data/vendor/assets/stylesheets/mercury/lightview.css +92 -0
- data/vendor/assets/stylesheets/mercury/mercury.css +134 -0
- data/vendor/assets/stylesheets/mercury/modal.css +191 -0
- data/{app/assets/stylesheets/mercury/statusbar.scss → vendor/assets/stylesheets/mercury/statusbar.css} +9 -1
- data/vendor/assets/stylesheets/mercury/toolbar.css +329 -0
- data/{app/assets/stylesheets/mercury/tooltip.scss → vendor/assets/stylesheets/mercury/tooltip.css} +7 -7
- data/vendor/assets/stylesheets/mercury/uploader.css +111 -0
- metadata +230 -225
- data/app/assets/images/mercury/toolbar/markupable/buttons.png +0 -0
- data/app/assets/images/mercury/toolbar/primary/todospanel.png +0 -0
- data/app/assets/javascripts/mercury.js +0 -30
- data/app/assets/javascripts/mercury/dialog.js.coffee +0 -75
- data/app/assets/javascripts/mercury/mercury.js.coffee +0 -286
- data/app/assets/javascripts/mercury/statusbar.js.coffee +0 -29
- data/app/assets/javascripts/mercury_loader.js +0 -98
- data/app/assets/stylesheets/mercury/dialog.scss +0 -179
- data/app/assets/stylesheets/mercury/mercury.scss +0 -127
- data/app/assets/stylesheets/mercury/modal.scss +0 -194
- data/app/assets/stylesheets/mercury/toolbar.scss +0 -415
- data/app/assets/stylesheets/mercury/uploader.scss +0 -109
- data/app/views/layouts/mercury.html.haml +0 -8
- data/app/views/mercury/modals/character.html.haml +0 -252
- data/app/views/mercury/modals/htmleditor.html.haml +0 -8
- data/app/views/mercury/modals/link.html.haml +0 -31
- data/app/views/mercury/modals/media.html.haml +0 -33
- data/app/views/mercury/modals/sanitizer.html.haml +0 -4
- data/app/views/mercury/modals/table.html.haml +0 -49
- data/app/views/mercury/palettes/backcolor.html.haml +0 -79
- data/app/views/mercury/palettes/forecolor.html.haml +0 -79
- data/app/views/mercury/panels/history.html.haml +0 -0
- data/app/views/mercury/panels/notes.html.haml +0 -0
- data/app/views/mercury/panels/snippets.html.haml +0 -10
- data/app/views/mercury/selects/formatblock.html.haml +0 -10
- data/app/views/mercury/selects/style.html.haml +0 -4
- data/app/views/mercury/snippets/example.html.haml +0 -2
- data/app/views/mercury/snippets/example_options.html.haml +0 -16
- data/log/.gitkeep +0 -0
- data/spec/javascripts/mercury/regions/_markupable_.js.coffee +0 -0
@@ -0,0 +1,157 @@
|
|
1
|
+
# # Mercury Dialog
|
2
|
+
#
|
3
|
+
# Dialog is a base class that's used by Palette, Select, Panel, and through Palette, the Toolbar.Expander. It's basic
|
4
|
+
# function is to provide an interface element that can be opened, interacted with, and then closed.
|
5
|
+
#
|
6
|
+
class @Mercury.Dialog
|
7
|
+
|
8
|
+
# The constructor expects a url to load, a name, and options.
|
9
|
+
#
|
10
|
+
# @url _string_ used to load the contents, either using Ajax or by pulling content from preloadedViews
|
11
|
+
#
|
12
|
+
# @name _string_ used in building of the element, and is assigned as part of the elements class (eg.
|
13
|
+
# `mercury-[name]-dialog`)
|
14
|
+
#
|
15
|
+
# @options _object_
|
16
|
+
#
|
17
|
+
# **Options**
|
18
|
+
#
|
19
|
+
# @for _Toolbar.Button_ used so the dialog can be shown/hidden based on button interactions.
|
20
|
+
#
|
21
|
+
# @preload _boolean_ if true, the view for this dialog will be loaded prior to being shown, otherwise the view will be
|
22
|
+
# loaded the first time it's shown, and cached for all future interactions.
|
23
|
+
#
|
24
|
+
# @appendTo _element_ you can append a dialog to any element by providing this option.
|
25
|
+
constructor: (@url, @name, @options = {}) ->
|
26
|
+
@button = @options.for
|
27
|
+
|
28
|
+
@build()
|
29
|
+
@bindEvents()
|
30
|
+
@preload()
|
31
|
+
|
32
|
+
|
33
|
+
# ## #build
|
34
|
+
#
|
35
|
+
# Builds the element and appends it to the DOM. You can provide an element to append it to in the options, otherwise
|
36
|
+
# it will be appended to the body.
|
37
|
+
build: ->
|
38
|
+
@element = jQuery('<div>', {class: "mercury-dialog mercury-#{@name}-dialog loading", style: 'display:none'})
|
39
|
+
@element.appendTo(jQuery(@options.appendTo).get(0) ? 'body')
|
40
|
+
|
41
|
+
|
42
|
+
# ## #bindEvents
|
43
|
+
#
|
44
|
+
# Bind to all the events we should handle. In this case we only stop the mousedown event, since dialogs aren't
|
45
|
+
# expected to have inputs etc.
|
46
|
+
#
|
47
|
+
# **Note:** By stopping the mousedown event we're limiting what's possible in dialogs, but this is needed to keep
|
48
|
+
# focus from being taken away from the active region when different things are clicked on in dialogs.
|
49
|
+
bindEvents: ->
|
50
|
+
@element.mousedown (event) -> event.stopPropagation()
|
51
|
+
|
52
|
+
|
53
|
+
# ## #preload
|
54
|
+
#
|
55
|
+
# If the options dictate that the content should be preloaded we load the view before we do anything else. This is
|
56
|
+
# useful if you don't want to make the user wait the half second or however long the server may take to respond when
|
57
|
+
# they open various dialogs.
|
58
|
+
preload: ->
|
59
|
+
@load() if @options.preload
|
60
|
+
|
61
|
+
|
62
|
+
# ## #toggle
|
63
|
+
#
|
64
|
+
# Toggle the dialog based on current visibility.
|
65
|
+
toggle: ->
|
66
|
+
if @visible then @hide() else @show()
|
67
|
+
|
68
|
+
|
69
|
+
# ## #resize
|
70
|
+
#
|
71
|
+
# In the base class resize just calls through to show, but in the implementation classes resize typically adjusts the
|
72
|
+
# size based on it's contents.
|
73
|
+
resize: ->
|
74
|
+
@show()
|
75
|
+
|
76
|
+
|
77
|
+
# ## #show
|
78
|
+
#
|
79
|
+
# When showing a dialog it's expected that all other dialogs will close, and we fire an event for this. The dialog is
|
80
|
+
# then positioned and shown. The show animation of the dialog is typically dictated by the implementation class.
|
81
|
+
show: ->
|
82
|
+
# Tell all other dialogs to close.
|
83
|
+
Mercury.trigger('hide:dialogs', @)
|
84
|
+
@visible = true
|
85
|
+
if @loaded
|
86
|
+
@element.css({width: 'auto', height: 'auto'})
|
87
|
+
@position(@visible)
|
88
|
+
else
|
89
|
+
@position()
|
90
|
+
# Then show the element.
|
91
|
+
@appear()
|
92
|
+
|
93
|
+
|
94
|
+
# ## #position
|
95
|
+
#
|
96
|
+
# Interface method. Implemenations are expected to position the dialog themselves.
|
97
|
+
#
|
98
|
+
# @keepVisible _boolean_ specifies if the element should stay visible if it's already visible.
|
99
|
+
position: (keepVisible) ->
|
100
|
+
|
101
|
+
|
102
|
+
# ## #appear
|
103
|
+
#
|
104
|
+
# Animate the element into view. After it's done showing, we load and resize it if it's not already loaded, so in
|
105
|
+
# cases where content is not preloaded we can display the dialog, fill it's contents, and then animate the resize.
|
106
|
+
appear: ->
|
107
|
+
@element.css({display: 'block', opacity: 0})
|
108
|
+
@element.animate {opacity: 0.95}, 200, 'easeInOutSine', =>
|
109
|
+
@load(=> @resize()) unless @loaded
|
110
|
+
|
111
|
+
|
112
|
+
# ## #hide
|
113
|
+
#
|
114
|
+
# Hides the element and keeps track of it's visibility.
|
115
|
+
hide: ->
|
116
|
+
@element.hide()
|
117
|
+
@visible = false
|
118
|
+
|
119
|
+
|
120
|
+
# ## #load
|
121
|
+
#
|
122
|
+
# Fetches the content that will be loaded into the dialog.
|
123
|
+
#
|
124
|
+
# @callback _function_ will be called after the content is loaded.
|
125
|
+
load: (callback) ->
|
126
|
+
return unless @url
|
127
|
+
if Mercury.preloadedViews[@url]
|
128
|
+
# If there's a preloadedView defined for the url being requested, load that one.
|
129
|
+
@loadContent(Mercury.preloadedViews[@url])
|
130
|
+
# And call the dialog handler if there's one. We've broken the handlers out into seperate files so they can be
|
131
|
+
# tested more easily, but you can define your own by putting them in dialogHanders.
|
132
|
+
Mercury.dialogHandlers[@name].call(@) if Mercury.dialogHandlers[@name]
|
133
|
+
callback() if callback
|
134
|
+
else
|
135
|
+
# Otherwise make an Ajax request to get the content.
|
136
|
+
jQuery.ajax @url, {
|
137
|
+
success: (data) =>
|
138
|
+
@loadContent(data)
|
139
|
+
Mercury.dialogHandlers[@name].call(@) if Mercury.dialogHandlers[@name]
|
140
|
+
callback() if callback
|
141
|
+
error: =>
|
142
|
+
# If the Ajax fails, we hide the dialog and alert the user about the error.
|
143
|
+
@hide()
|
144
|
+
@button.removeClass('pressed') if @button
|
145
|
+
alert("Mercury was unable to load #{@url} for the #{@name} dialog.")
|
146
|
+
}
|
147
|
+
|
148
|
+
|
149
|
+
# ## #loadContent
|
150
|
+
#
|
151
|
+
# Loads content into the element, and removes the loading class.
|
152
|
+
#
|
153
|
+
# @data _mixed_ a string or jQuery object that can be inserted into the dialog.
|
154
|
+
loadContent: (data) ->
|
155
|
+
@loaded = true
|
156
|
+
@element.removeClass('loading')
|
157
|
+
@element.html(data)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,156 @@
|
|
1
|
+
@Mercury.lightview = (url, options = {}) ->
|
2
|
+
Mercury.lightview.show(url, options)
|
3
|
+
return Mercury.lightview
|
4
|
+
|
5
|
+
jQuery.extend Mercury.lightview, {
|
6
|
+
|
7
|
+
minWidth: 400
|
8
|
+
|
9
|
+
show: (@url, @options = {}) ->
|
10
|
+
Mercury.trigger('focus:window')
|
11
|
+
@initialize()
|
12
|
+
if @visible then @update() else @appear()
|
13
|
+
|
14
|
+
|
15
|
+
initialize: ->
|
16
|
+
return if @initialized
|
17
|
+
@build()
|
18
|
+
@bindEvents()
|
19
|
+
@initialized = true
|
20
|
+
|
21
|
+
|
22
|
+
build: ->
|
23
|
+
@element = jQuery('<div>', {class: 'mercury-lightview loading'})
|
24
|
+
@element.html('<h1 class="mercury-lightview-title"><span></span></h1>')
|
25
|
+
@element.append('<div class="mercury-lightview-content"></div>')
|
26
|
+
|
27
|
+
@overlay = jQuery('<div>', {class: 'mercury-lightview-overlay'})
|
28
|
+
|
29
|
+
@titleElement = @element.find('.mercury-lightview-title')
|
30
|
+
@contentElement = @element.find('.mercury-lightview-content')
|
31
|
+
|
32
|
+
@element.appendTo(jQuery(@options.appendTo).get(0) ? 'body')
|
33
|
+
@overlay.appendTo(jQuery(@options.appendTo).get(0) ? 'body')
|
34
|
+
|
35
|
+
@titleElement.find('span').html(@options.title)
|
36
|
+
|
37
|
+
|
38
|
+
bindEvents: ->
|
39
|
+
Mercury.bind 'refresh', => @resize(true)
|
40
|
+
Mercury.bind 'resize', => @position() if @visible
|
41
|
+
|
42
|
+
@overlay.click => @hide()
|
43
|
+
|
44
|
+
jQuery(document).bind 'keydown', (event) =>
|
45
|
+
@hide() if event.keyCode == 27 && @visible
|
46
|
+
|
47
|
+
|
48
|
+
appear: ->
|
49
|
+
@position()
|
50
|
+
|
51
|
+
@overlay.show().css({opacity: 0})
|
52
|
+
@overlay.animate {opacity: 1}, 200, 'easeInOutSine', =>
|
53
|
+
@setTitle()
|
54
|
+
@element.show().css({opacity: 0})
|
55
|
+
@element.animate {opacity: 1}, 200, 'easeInOutSine', =>
|
56
|
+
@visible = true
|
57
|
+
@load()
|
58
|
+
|
59
|
+
|
60
|
+
resize: (keepVisible) ->
|
61
|
+
viewportWidth = Mercury.displayRect.width
|
62
|
+
viewportHeight = Mercury.displayRect.fullHeight
|
63
|
+
|
64
|
+
@element.css({overflow: 'hidden'})
|
65
|
+
@contentElement.css({visibility: 'hidden', display: 'none', width: 'auto', height: 'auto'})
|
66
|
+
|
67
|
+
width = @contentElement.outerWidth() + 40 + 2
|
68
|
+
width = viewportWidth - 40 if width > viewportWidth - 40 || @options.fullSize
|
69
|
+
height = @contentElement.outerHeight() + @titleElement.outerHeight() + 30
|
70
|
+
height = viewportHeight - 20 if height > viewportHeight - 20 || @options.fullSize
|
71
|
+
|
72
|
+
width = 300 if width < 300
|
73
|
+
height = 150 if height < 150
|
74
|
+
|
75
|
+
@element.stop().animate {top: ((viewportHeight - height) / 2) + 10, left: (Mercury.displayRect.width - width) / 2, width: width, height: height}, 200, 'easeInOutSine', =>
|
76
|
+
@contentElement.css({visibility: 'visible', display: 'block', opacity: 0})
|
77
|
+
@contentElement.stop().animate({opacity: 1}, 200, 'easeInOutSine')
|
78
|
+
@element.css({overflow: 'auto'})
|
79
|
+
|
80
|
+
|
81
|
+
position: ->
|
82
|
+
viewportWidth = Mercury.displayRect.width
|
83
|
+
viewportHeight = Mercury.displayRect.fullHeight
|
84
|
+
|
85
|
+
@contentElement.css({position: 'absolute', width: 'auto', height: 'auto'})
|
86
|
+
width = @contentElement.width() + 40 + 2
|
87
|
+
width = viewportWidth - 40 if width > viewportWidth - 40 || @options.fullSize
|
88
|
+
|
89
|
+
height = @contentElement.height() + @titleElement.outerHeight() + 30
|
90
|
+
height = viewportHeight - 20 if height > viewportHeight - 20 || @options.fullSize
|
91
|
+
@contentElement.css({position: 'relative'})
|
92
|
+
|
93
|
+
width = 300 if width < 300
|
94
|
+
height = 150 if height < 150
|
95
|
+
|
96
|
+
@element.css({top: ((viewportHeight - height) / 2) + 10, left: (viewportWidth - width) / 2, width: width, height: height, overflow: 'auto'})
|
97
|
+
@contentElement.css({width: width - 40, height: height - 30 - @titleElement.outerHeight()}) if @visible
|
98
|
+
|
99
|
+
|
100
|
+
update: ->
|
101
|
+
@reset()
|
102
|
+
@resize()
|
103
|
+
@load()
|
104
|
+
|
105
|
+
|
106
|
+
load: ->
|
107
|
+
@setTitle()
|
108
|
+
return unless @url
|
109
|
+
@element.addClass('loading')
|
110
|
+
if Mercury.preloadedViews[@url]
|
111
|
+
setTimeout((=> @loadContent(Mercury.preloadedViews[@url])), 10)
|
112
|
+
else
|
113
|
+
jQuery.ajax @url, {
|
114
|
+
type: @options.loadType || 'get'
|
115
|
+
data: @options.loadData
|
116
|
+
success: (data) => @loadContent(data)
|
117
|
+
error: =>
|
118
|
+
@hide()
|
119
|
+
alert("Mercury was unable to load #{@url} for the lightview.")
|
120
|
+
}
|
121
|
+
|
122
|
+
|
123
|
+
loadContent: (data, options = null) ->
|
124
|
+
@initialize()
|
125
|
+
@options = options || @options
|
126
|
+
@setTitle()
|
127
|
+
@loaded = true
|
128
|
+
@element.removeClass('loading')
|
129
|
+
@contentElement.html(data)
|
130
|
+
@contentElement.css({display: 'none', visibility: 'hidden'})
|
131
|
+
|
132
|
+
@options.afterLoad.call(@) if @options.afterLoad
|
133
|
+
if @options.handler && Mercury.lightviewHandlers[@options.handler]
|
134
|
+
Mercury.lightviewHandlers[@options.handler].call(@)
|
135
|
+
|
136
|
+
@resize()
|
137
|
+
|
138
|
+
|
139
|
+
setTitle: ->
|
140
|
+
@titleElement.find('span').html(@options.title)
|
141
|
+
|
142
|
+
|
143
|
+
reset: ->
|
144
|
+
@titleElement.find('span').html('')
|
145
|
+
@contentElement.html('')
|
146
|
+
|
147
|
+
|
148
|
+
hide: ->
|
149
|
+
Mercury.trigger('focus:frame')
|
150
|
+
@element.hide()
|
151
|
+
@overlay.hide()
|
152
|
+
@reset()
|
153
|
+
|
154
|
+
@visible = false
|
155
|
+
|
156
|
+
}
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# ## Require all the dependencies
|
2
|
+
#= require mercury_dependencies/jquery-1.6
|
3
|
+
#= require mercury_dependencies/jquery-ui-1.8.13.custom
|
4
|
+
#= require mercury_dependencies/jquery.additions
|
5
|
+
#= require mercury_dependencies/liquidmetal
|
6
|
+
#= require mercury_dependencies/showdown
|
7
|
+
#
|
8
|
+
# ## Require all mercury files
|
9
|
+
#= require_self
|
10
|
+
#= require ./native_extensions
|
11
|
+
#= require ./page_editor
|
12
|
+
#= require ./history_buffer
|
13
|
+
#= require ./table_editor
|
14
|
+
#= require ./dialog
|
15
|
+
#= require ./palette
|
16
|
+
#= require ./select
|
17
|
+
#= require ./panel
|
18
|
+
#= require ./modal
|
19
|
+
#= require ./lightview
|
20
|
+
#= require ./statusbar
|
21
|
+
#= require ./toolbar
|
22
|
+
#= require ./toolbar.button
|
23
|
+
#= require ./toolbar.button_group
|
24
|
+
#= require ./toolbar.expander
|
25
|
+
#= require ./tooltip
|
26
|
+
#= require ./snippet
|
27
|
+
#= require ./snippet_toolbar
|
28
|
+
#= require ./region
|
29
|
+
#= require ./uploader
|
30
|
+
#= require_tree ./regions
|
31
|
+
#= require_tree ./dialogs
|
32
|
+
#= require_tree ./modals
|
33
|
+
#
|
34
|
+
@Mercury ||= {}
|
35
|
+
jQuery.extend @Mercury, {
|
36
|
+
version: '0.2.0'
|
37
|
+
|
38
|
+
# No IE support yet because it doesn't follow the W3C standards for HTML5 contentEditable (aka designMode).
|
39
|
+
supported: document.getElementById && document.designMode && !jQuery.browser.konqueror && !jQuery.browser.msie
|
40
|
+
|
41
|
+
# Mercury object namespaces
|
42
|
+
Regions: {}
|
43
|
+
modalHandlers: {}
|
44
|
+
lightviewHandlers: {}
|
45
|
+
dialogHandlers: {}
|
46
|
+
preloadedViews: {}
|
47
|
+
|
48
|
+
# Custom event and logging methods
|
49
|
+
bind: (eventName, callback) ->
|
50
|
+
jQuery(document).bind("mercury:#{eventName}", callback)
|
51
|
+
|
52
|
+
|
53
|
+
trigger: (eventName, options) ->
|
54
|
+
Mercury.log(eventName, options)
|
55
|
+
jQuery(document).trigger("mercury:#{eventName}", options)
|
56
|
+
|
57
|
+
|
58
|
+
log: ->
|
59
|
+
if Mercury.debug && console
|
60
|
+
return if arguments[0] == 'hide:toolbar' || arguments[0] == 'show:toolbar'
|
61
|
+
try console.debug(arguments) catch e
|
62
|
+
|
63
|
+
}
|
@@ -44,8 +44,12 @@ jQuery.extend Mercury.modal, {
|
|
44
44
|
|
45
45
|
@titleElement.find('a').click => @hide()
|
46
46
|
|
47
|
+
jQuery(document).bind 'keydown', (event) =>
|
48
|
+
@hide() if event.keyCode == 27 && @visible
|
49
|
+
|
47
50
|
|
48
51
|
appear: ->
|
52
|
+
@showing = true
|
49
53
|
@position()
|
50
54
|
|
51
55
|
@overlay.show()
|
@@ -55,14 +59,13 @@ jQuery.extend Mercury.modal, {
|
|
55
59
|
@element.show()
|
56
60
|
@element.animate {top: 0}, 200, 'easeInOutSine', =>
|
57
61
|
@visible = true
|
62
|
+
@showing = false
|
58
63
|
@load()
|
59
64
|
|
60
65
|
|
61
66
|
resize: (keepVisible) ->
|
62
|
-
# TODO: resizing is a bit shitty when the modal has panes and is scrollable
|
63
67
|
visibility = if keepVisible then 'visible' else 'hidden'
|
64
68
|
|
65
|
-
viewportHeight = jQuery(window).height()
|
66
69
|
titleHeight = @titleElement.outerHeight()
|
67
70
|
|
68
71
|
width = @contentElement.outerWidth()
|
@@ -73,9 +76,9 @@ jQuery.extend Mercury.modal, {
|
|
73
76
|
height = @contentElement.outerHeight() + titleHeight
|
74
77
|
|
75
78
|
width = @minWidth if width < @minWidth
|
76
|
-
height =
|
79
|
+
height = Mercury.displayRect.fullHeight - 20 if height > Mercury.displayRect.fullHeight - 20 || @options.fullHeight
|
77
80
|
|
78
|
-
@element.stop().animate {left: (
|
81
|
+
@element.stop().animate {left: (Mercury.displayRect.width - width) / 2, width: width, height: height}, 200, 'easeInOutSine', =>
|
79
82
|
@contentElement.css({visibility: 'visible', display: 'block'})
|
80
83
|
if @contentPane.length
|
81
84
|
@contentElement.css({height: height - titleHeight, overflow: 'visible'})
|
@@ -87,8 +90,7 @@ jQuery.extend Mercury.modal, {
|
|
87
90
|
|
88
91
|
|
89
92
|
position: ->
|
90
|
-
viewportWidth =
|
91
|
-
viewportHeight = jQuery(window).height()
|
93
|
+
viewportWidth = Mercury.displayRect.width
|
92
94
|
|
93
95
|
@contentPane.css({height: 'auto'}) if @contentPane
|
94
96
|
@contentElement.css({height: 'auto'})
|
@@ -98,7 +100,7 @@ jQuery.extend Mercury.modal, {
|
|
98
100
|
height = @element.height()
|
99
101
|
|
100
102
|
width = @minWidth if width < @minWidth
|
101
|
-
height =
|
103
|
+
height = Mercury.displayRect.fullHeight - 20 if height > Mercury.displayRect.fullHeight - 20 || @options.fullHeight
|
102
104
|
|
103
105
|
titleHeight = @titleElement.outerHeight()
|
104
106
|
if @contentPane && @contentPane.length
|
@@ -125,19 +127,23 @@ jQuery.extend Mercury.modal, {
|
|
125
127
|
|
126
128
|
|
127
129
|
load: ->
|
128
|
-
@element.addClass('loading')
|
129
130
|
@setTitle()
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
131
|
+
return unless @url
|
132
|
+
@element.addClass('loading')
|
133
|
+
if Mercury.preloadedViews[@url]
|
134
|
+
setTimeout((=> @loadContent(Mercury.preloadedViews[@url])), 10)
|
135
|
+
else
|
136
|
+
jQuery.ajax @url, {
|
137
|
+
type: @options.loadType || 'get'
|
138
|
+
data: @options.loadData
|
139
|
+
success: (data) => @loadContent(data)
|
140
|
+
error: =>
|
141
|
+
@hide()
|
142
|
+
alert("Mercury was unable to load #{@url} for the modal.")
|
143
|
+
}
|
138
144
|
|
139
145
|
|
140
|
-
loadContent: (data, options) ->
|
146
|
+
loadContent: (data, options = null) ->
|
141
147
|
@initialize()
|
142
148
|
@options = options || @options
|
143
149
|
@setTitle()
|
@@ -167,6 +173,8 @@ jQuery.extend Mercury.modal, {
|
|
167
173
|
|
168
174
|
|
169
175
|
hide: ->
|
176
|
+
return if @showing
|
177
|
+
|
170
178
|
Mercury.trigger('focus:frame')
|
171
179
|
@element.hide()
|
172
180
|
@overlay.hide()
|