mercury-rails 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/app/assets/javascripts/mercury.js +1 -0
- data/app/assets/javascripts/mercury/lightview.js.coffee +26 -12
- data/app/assets/javascripts/mercury/locales/ar.locale.js.coffee +3 -5
- data/app/assets/javascripts/mercury/locales/da.locale.js.coffee +3 -5
- data/app/assets/javascripts/mercury/locales/de.locale.js.coffee +4 -6
- data/app/assets/javascripts/mercury/locales/es.locale.js.coffee +3 -5
- data/app/assets/javascripts/mercury/locales/example.local.js.coffee +3 -1
- data/app/assets/javascripts/mercury/locales/fr.locale.js.coffee +3 -5
- data/app/assets/javascripts/mercury/locales/it.locale.js.coffee +3 -5
- data/app/assets/javascripts/mercury/locales/ko.local.js.coffee +4 -6
- data/app/assets/javascripts/mercury/locales/nl.locale.js.coffee +3 -5
- data/app/assets/javascripts/mercury/locales/pt.locale.js.coffee +3 -5
- data/app/assets/javascripts/mercury/locales/sv.local.js.coffee +3 -5
- data/app/assets/javascripts/mercury/locales/swedish_chef.locale.js.coffee +3 -5
- data/app/assets/javascripts/mercury/locales/zh.local.js.coffee +3 -5
- data/app/assets/javascripts/mercury/mercury.js.coffee +1 -1
- data/app/assets/javascripts/mercury/modal.js.coffee +38 -23
- data/app/assets/javascripts/mercury/modals/htmleditor.js.coffee +1 -0
- data/app/assets/javascripts/mercury/modals/insertcharacter.js.coffee +1 -0
- data/app/assets/javascripts/mercury/modals/insertlink.js.coffee +111 -60
- data/app/assets/javascripts/mercury/modals/insertmedia.js.coffee +80 -35
- data/app/assets/javascripts/mercury/modals/insertsnippet.js.coffee +1 -0
- data/app/assets/javascripts/mercury/modals/inserttable.js.coffee +59 -51
- data/app/assets/javascripts/mercury/page_editor.js.coffee +1 -1
- data/app/assets/javascripts/mercury/regions/full.coffee +1 -1
- data/app/assets/javascripts/mercury/regions/image.js.coffee +1 -1
- data/app/assets/javascripts/mercury/regions/markdown.coffee +1 -1
- data/app/assets/javascripts/mercury/regions/simple.js.coffee +1 -1
- data/app/assets/javascripts/mercury/regions/snippets.js.coffee +1 -1
- data/app/assets/javascripts/mercury/table_editor.js.coffee +16 -0
- data/app/assets/javascripts/mercury/toolbar.js.coffee +2 -2
- data/app/assets/stylesheets/mercury.css +0 -5
- data/app/assets/stylesheets/mercury/bootstrap-ish.css +1367 -0
- data/app/assets/stylesheets/mercury/bootstrap-overrides.css +60 -0
- data/app/assets/stylesheets/mercury/lightview.css +2 -52
- data/app/assets/stylesheets/mercury/mercury.css +2 -2
- data/app/assets/stylesheets/mercury/modal.css +13 -31
- data/app/assets/stylesheets/mercury/uploader.css +3 -3
- data/app/views/mercury/modals/htmleditor.html +2 -6
- data/app/views/mercury/modals/link.html +70 -64
- data/app/views/mercury/modals/media.html +80 -71
- data/app/views/mercury/modals/table.html +79 -73
- data/app/views/mercury/snippets/example/options.html.erb +11 -30
- data/features/loading/loading.feature +1 -1
- data/features/regions/full/inserting_links.feature +4 -4
- data/features/regions/full/inserting_media.feature +3 -3
- data/features/step_definitions/mercury_steps.rb +5 -5
- data/features/support/env.rb +1 -1
- data/lib/mercury/version.rb +1 -1
- data/spec/javascripts/mercury/lightview_spec.js.coffee +136 -129
- data/spec/javascripts/mercury/modal_spec.js.coffee +143 -139
- data/spec/javascripts/mercury/modals/insertlink_spec.js.coffee +105 -31
- data/spec/javascripts/mercury/modals/insertmedia_spec.js.coffee +76 -38
- data/spec/javascripts/mercury/modals/inserttable_spec.js.coffee +32 -35
- data/spec/javascripts/mercury/toolbar_spec.js.coffee +8 -0
- data/spec/javascripts/templates/mercury/modals/insertlink.html +58 -21
- data/spec/javascripts/templates/mercury/modals/insertmedia.html +69 -27
- data/spec/javascripts/templates/mercury/modals/inserttable.html +66 -20
- metadata +5 -5
- data/app/assets/stylesheets/mercury/buttons.css +0 -73
- data/app/assets/stylesheets/mercury/form.css +0 -125
@@ -1,19 +1,27 @@
|
|
1
1
|
@Mercury.modal = (url, options = {}) ->
|
2
|
-
Mercury.modal.
|
3
|
-
|
2
|
+
Mercury.modal.instance ||= new Mercury.Modal(url, options)
|
3
|
+
Mercury.modal.instance.show(url, options)
|
4
|
+
return Mercury.modal.instance
|
4
5
|
|
5
|
-
jQuery.extend Mercury.modal,
|
6
|
-
minWidth: 400
|
7
6
|
|
8
|
-
|
7
|
+
class @Mercury.Modal
|
8
|
+
|
9
|
+
constructor: (@url, @options = {}) ->
|
10
|
+
|
11
|
+
|
12
|
+
show: (url = null, options = null) ->
|
13
|
+
@url = url || @url
|
14
|
+
@options = options || @options
|
15
|
+
@options.minWidth ||= 400
|
16
|
+
|
9
17
|
Mercury.trigger('focus:window')
|
10
|
-
@
|
18
|
+
@initializeModal()
|
11
19
|
if @visible then @update() else @appear()
|
12
20
|
if @options.content
|
13
|
-
setTimeout
|
21
|
+
setTimeout((=> @loadContent(@options.content)), 500)
|
14
22
|
|
15
23
|
|
16
|
-
|
24
|
+
initializeModal: ->
|
17
25
|
return if @initialized
|
18
26
|
@build()
|
19
27
|
@bindEvents()
|
@@ -51,7 +59,7 @@ jQuery.extend Mercury.modal,
|
|
51
59
|
@loadContent(content)
|
52
60
|
|
53
61
|
jQuery(document).on 'keydown', (event) =>
|
54
|
-
|
62
|
+
@hide() if event.keyCode == 27 && @visible
|
55
63
|
|
56
64
|
|
57
65
|
appear: ->
|
@@ -81,16 +89,16 @@ jQuery.extend Mercury.modal,
|
|
81
89
|
|
82
90
|
height = @contentElement.outerHeight() + titleHeight
|
83
91
|
|
84
|
-
width = @minWidth if width < @minWidth
|
85
|
-
height = Mercury.displayRect.fullHeight
|
92
|
+
width = @options.minWidth if width < @options.minWidth
|
93
|
+
height = Mercury.displayRect.fullHeight if height > Mercury.displayRect.fullHeight || @options.fullHeight
|
86
94
|
|
87
95
|
@element.stop().animate {left: (Mercury.displayRect.width - width) / 2, width: width, height: height}, 200, 'easeInOutSine', =>
|
88
96
|
@contentElement.css({visibility: 'visible', display: 'block'})
|
89
97
|
if @contentPane.length
|
90
98
|
@contentElement.css({height: height - titleHeight, overflow: 'visible'})
|
91
|
-
controlHeight = if @contentControl.length then @contentControl.outerHeight() else 0
|
92
|
-
@contentPane.css({height: height - titleHeight - controlHeight -
|
93
|
-
@contentPane.find('.mercury-display-pane').css({width: width -
|
99
|
+
controlHeight = if @contentControl.length then @contentControl.outerHeight() + 10 else 0
|
100
|
+
@contentPane.css({height: height - titleHeight - controlHeight - 20})
|
101
|
+
@contentPane.find('.mercury-display-pane').css({width: width - 20})
|
94
102
|
else
|
95
103
|
@contentElement.css({height: height - titleHeight, overflow: 'auto'})
|
96
104
|
|
@@ -105,15 +113,15 @@ jQuery.extend Mercury.modal,
|
|
105
113
|
width = @element.width()
|
106
114
|
height = @element.height()
|
107
115
|
|
108
|
-
width = @minWidth if width < @minWidth
|
109
|
-
height = Mercury.displayRect.fullHeight
|
116
|
+
width = @options.minWidth if width < @options.minWidth
|
117
|
+
height = Mercury.displayRect.fullHeight if height > Mercury.displayRect.fullHeight || @options.fullHeight
|
110
118
|
|
111
119
|
titleHeight = @titleElement.outerHeight()
|
112
120
|
if @contentPane && @contentPane.length
|
113
121
|
@contentElement.css({height: height - titleHeight, overflow: 'visible'})
|
114
|
-
controlHeight = if @contentControl.length then @contentControl.outerHeight() else 0
|
115
|
-
@contentPane.css({height: height - titleHeight - controlHeight -
|
116
|
-
@contentPane.find('.mercury-display-pane').css({width: width -
|
122
|
+
controlHeight = if @contentControl.length then @contentControl.outerHeight() + 10 else 0
|
123
|
+
@contentPane.css({height: height - titleHeight - controlHeight - 20})
|
124
|
+
@contentPane.find('.mercury-display-pane').css({width: width - 20})
|
117
125
|
else
|
118
126
|
@contentElement.css({height: height - titleHeight, overflow: 'auto'})
|
119
127
|
|
@@ -151,7 +159,7 @@ jQuery.extend Mercury.modal,
|
|
151
159
|
|
152
160
|
|
153
161
|
loadContent: (data, options = null) ->
|
154
|
-
@
|
162
|
+
@initializeModal()
|
155
163
|
@options = options || @options
|
156
164
|
@setTitle()
|
157
165
|
@loaded = true
|
@@ -166,9 +174,17 @@ jQuery.extend Mercury.modal,
|
|
166
174
|
@options.afterLoad.call(@) if @options.afterLoad
|
167
175
|
if @options.handler
|
168
176
|
if Mercury.modalHandlers[@options.handler]
|
169
|
-
Mercury.modalHandlers[@options.handler]
|
177
|
+
if typeof(Mercury.modalHandlers[@options.handler]) == 'function'
|
178
|
+
Mercury.modalHandlers[@options.handler].call(@)
|
179
|
+
else
|
180
|
+
jQuery.extend(@, Mercury.modalHandlers[@options.handler])
|
181
|
+
@initialize()
|
170
182
|
else if Mercury.lightviewHandlers[@options.handler]
|
171
|
-
Mercury.lightviewHandlers[@options.handler]
|
183
|
+
if typeof(Mercury.lightviewHandlers[@options.handler]) == 'function'
|
184
|
+
Mercury.lightviewHandlers[@options.handler].call(@)
|
185
|
+
else
|
186
|
+
jQuery.extend(@, Mercury.lightviewHandlers[@options.handler])
|
187
|
+
@initialize()
|
172
188
|
|
173
189
|
@element.localize(Mercury.locale()) if Mercury.config.localization.enabled
|
174
190
|
@resize()
|
@@ -188,7 +204,6 @@ jQuery.extend Mercury.modal,
|
|
188
204
|
hide: ->
|
189
205
|
return if @showing
|
190
206
|
@options = {}
|
191
|
-
@initialized = false
|
192
207
|
|
193
208
|
Mercury.trigger('focus:frame')
|
194
209
|
@element.hide()
|
@@ -1,67 +1,117 @@
|
|
1
|
-
@Mercury.modalHandlers.insertLink =
|
2
|
-
# make the inputs work with the radio buttons
|
3
|
-
@element.find('label input').on 'click', ->
|
4
|
-
jQuery(@).closest('label').next('.selectable').focus()
|
1
|
+
@Mercury.modalHandlers.insertLink = {
|
5
2
|
|
6
|
-
|
7
|
-
|
3
|
+
initialize: ->
|
4
|
+
# make the inputs work with the radio buttons
|
5
|
+
@element.find('.control-label input').on('click', @onLabelChecked)
|
6
|
+
@element.find('.controls .optional, .controls .required').on('focus', @onInputFocused)
|
8
7
|
|
9
|
-
|
10
|
-
|
8
|
+
# show/hide the link target options on target change
|
9
|
+
@element.find('#link_target').on('change', => @onChangeTarget())
|
10
|
+
|
11
|
+
@initializeForm()
|
12
|
+
|
13
|
+
# build the link on form submission
|
14
|
+
@element.find('form').on 'submit', (event) =>
|
15
|
+
event.preventDefault()
|
16
|
+
@validateForm()
|
17
|
+
unless @valid
|
18
|
+
@resize()
|
19
|
+
return
|
20
|
+
@submitForm()
|
21
|
+
@hide()
|
22
|
+
|
23
|
+
|
24
|
+
initializeForm: ->
|
25
|
+
@fillExistingBookmarks()
|
26
|
+
|
27
|
+
# get the selection and initialize its information into the form
|
28
|
+
return unless Mercury.region && Mercury.region.selection
|
29
|
+
selection = Mercury.region.selection()
|
30
|
+
|
31
|
+
# set the text content
|
32
|
+
@element.find('#link_text').val(selection.textContent()) if selection.textContent
|
33
|
+
|
34
|
+
# if we're editing a link prefill the information
|
35
|
+
a = selection.commonAncestor(true).closest('a') if selection && selection.commonAncestor
|
36
|
+
return false unless a && a.length
|
37
|
+
@editing = a
|
38
|
+
|
39
|
+
# don't allow changing the content on edit
|
40
|
+
@element.find('#link_text_container').hide()
|
41
|
+
|
42
|
+
# fill in the external url or bookmark select based on what it looks like
|
43
|
+
if a.attr('href') && a.attr('href').indexOf('#') == 0
|
44
|
+
bookmarkSelect = @element.find('#link_existing_bookmark')
|
45
|
+
bookmarkSelect.val(a.attr('href').replace(/[^#]*#/, ''))
|
46
|
+
bookmarkSelect.closest('.control-group').find('input[type=radio]').prop('checked', true)
|
47
|
+
else
|
48
|
+
@element.find('#link_external_url').val(a.attr('href'))
|
49
|
+
|
50
|
+
# if it has a name, assume it's a bookmark target
|
51
|
+
if a.attr('name')
|
52
|
+
newBookmarkInput = @element.find('#link_new_bookmark')
|
53
|
+
newBookmarkInput.val(a.attr('name'))
|
54
|
+
newBookmarkInput.closest('.control-group').find('input[type=radio]').prop('checked', true)
|
55
|
+
|
56
|
+
# if it has a target, select it, and try to pull options out
|
57
|
+
if a.attr('target')
|
58
|
+
@element.find('#link_target').val(a.attr('target'))
|
59
|
+
|
60
|
+
# if it's a popup window
|
61
|
+
if a.attr('href') && a.attr('href').indexOf('javascript:void') == 0
|
62
|
+
href = a.attr('href')
|
63
|
+
@element.find('#link_external_url').val(href.match(/window.open\('([^']+)',/)[1])
|
64
|
+
@element.find('#link_target').val('popup')
|
65
|
+
@element.find('#link_popup_width').val(href.match(/width=(\d+),/)[1])
|
66
|
+
@element.find('#link_popup_height').val(href.match(/height=(\d+),/)[1])
|
67
|
+
@element.find('#popup_options').show()
|
68
|
+
|
69
|
+
|
70
|
+
fillExistingBookmarks: ->
|
71
|
+
bookmarkSelect = @element.find('#link_existing_bookmark')
|
72
|
+
for tag in jQuery('a[name]', window.mercuryInstance.document)
|
73
|
+
bookmarkSelect.append(jQuery('<option>', {value: jQuery(tag).attr('name')}).text(jQuery(tag).text()))
|
74
|
+
|
75
|
+
|
76
|
+
onLabelChecked: ->
|
77
|
+
forInput = jQuery(@).closest('.control-label').attr('for')
|
78
|
+
jQuery(@).closest('.control-group').find("##{forInput}").focus()
|
79
|
+
|
80
|
+
|
81
|
+
onInputFocused: ->
|
82
|
+
jQuery(@).closest('.control-group').find('input[type=radio]').prop('checked', true)
|
83
|
+
|
84
|
+
|
85
|
+
onChangeTarget: ->
|
11
86
|
@element.find(".link-target-options").hide()
|
12
87
|
@element.find("##{@element.find('#link_target').val()}_options").show()
|
13
88
|
@resize(true)
|
14
89
|
|
15
|
-
# fill the existing bookmark select
|
16
|
-
bookmarkSelect = @element.find('#link_existing_bookmark')
|
17
|
-
for link in jQuery('a[name]', window.mercuryInstance.document)
|
18
|
-
bookmarkSelect.append(jQuery('<option>', {value: jQuery(link).attr('name')}).text(jQuery(link).text()))
|
19
90
|
|
20
|
-
|
21
|
-
|
22
|
-
|
91
|
+
addInputError: (input, message) ->
|
92
|
+
input.after('<span class="help-inline error-message">' + Mercury.I18n(message) + '</span>').closest('.control-group').addClass('error')
|
93
|
+
@valid = false
|
23
94
|
|
24
|
-
# if we're editing a link prefill the information
|
25
|
-
container = selection.commonAncestor(true).closest('a') if selection && selection.commonAncestor
|
26
|
-
if container && container.length
|
27
|
-
existingLink = container
|
28
95
|
|
29
|
-
|
30
|
-
|
96
|
+
clearInputErrors: ->
|
97
|
+
@element.find('.control-group.error').removeClass('error').find('.error-message').remove()
|
98
|
+
@valid = true
|
31
99
|
|
32
|
-
# fill in the external url or bookmark select based on what it looks like
|
33
|
-
if container.attr('href') && container.attr('href').indexOf('#') == 0
|
34
|
-
bookmarkSelect.val(container.attr('href').replace(/[^#]*#/, ''))
|
35
|
-
bookmarkSelect.prev('label').find('input[type=radio]').prop("checked", true)
|
36
|
-
else
|
37
|
-
@element.find('#link_external_url').val(container.attr('href'))
|
38
|
-
|
39
|
-
# if it has a name, assume it's a bookmark target
|
40
|
-
if container.attr('name')
|
41
|
-
newBookmarkInput = @element.find('#link_new_bookmark')
|
42
|
-
newBookmarkInput.val(container.attr('name'))
|
43
|
-
newBookmarkInput.prev('label').find('input[type=radio]').prop("checked", true)
|
44
|
-
|
45
|
-
# if it has a target, select it, and try to pull options out
|
46
|
-
if container.attr('target')
|
47
|
-
@element.find('#link_target').val(container.attr('target'))
|
48
|
-
|
49
|
-
# if it's a popup window
|
50
|
-
if container.attr('href') && container.attr('href').indexOf('javascript:void') == 0
|
51
|
-
href = container.attr('href')
|
52
|
-
@element.find('#link_external_url').val(href.match(/window.open\('([^']+)',/)[1])
|
53
|
-
@element.find('#link_target').val('popup')
|
54
|
-
@element.find('#link_popup_width').val(href.match(/width=(\d+),/)[1])
|
55
|
-
@element.find('#link_popup_height').val(href.match(/height=(\d+),/)[1])
|
56
|
-
@element.find('#popup_options').show()
|
57
|
-
|
58
|
-
# get the text content
|
59
|
-
@element.find('#link_text').val(selection.textContent()) if selection.textContent
|
60
100
|
|
61
|
-
|
62
|
-
|
63
|
-
|
101
|
+
validateForm: ->
|
102
|
+
@clearInputErrors()
|
103
|
+
|
104
|
+
type = @element.find('input[name=link_type]:checked').val()
|
105
|
+
|
106
|
+
el = @element.find("#link_#{type}")
|
107
|
+
@addInputError(el, "can't be blank") unless el.val()
|
108
|
+
|
109
|
+
unless @editing
|
110
|
+
el = @element.find('#link_text')
|
111
|
+
@addInputError(el, "can't be blank") unless el.val()
|
64
112
|
|
113
|
+
|
114
|
+
submitForm: ->
|
65
115
|
content = @element.find('#link_text').val()
|
66
116
|
target = @element.find('#link_target').val()
|
67
117
|
type = @element.find('input[name=link_type]:checked').val()
|
@@ -74,19 +124,20 @@
|
|
74
124
|
switch target
|
75
125
|
when 'popup'
|
76
126
|
args = {
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
127
|
+
width: parseInt(@element.find('#link_popup_width').val()) || 500,
|
128
|
+
height: parseInt(@element.find('#link_popup_height').val()) || 500,
|
129
|
+
menubar: 'no',
|
130
|
+
toolbar: 'no'
|
81
131
|
}
|
82
132
|
attrs['href'] = "javascript:void(window.open('#{attrs['href']}', 'popup_window', '#{jQuery.param(args).replace(/&/g, ',')}'))"
|
83
|
-
else
|
133
|
+
else
|
134
|
+
attrs['target'] = target if target
|
84
135
|
|
85
136
|
value = {tagName: 'a', attrs: attrs, content: content}
|
86
137
|
|
87
|
-
if
|
88
|
-
Mercury.trigger('action', {action: 'replaceLink', value: value, node:
|
138
|
+
if @editing
|
139
|
+
Mercury.trigger('action', {action: 'replaceLink', value: value, node: @editing.get(0)})
|
89
140
|
else
|
90
141
|
Mercury.trigger('action', {action: 'insertLink', value: value})
|
91
142
|
|
92
|
-
|
143
|
+
}
|
@@ -1,46 +1,97 @@
|
|
1
|
-
@Mercury.modalHandlers.insertMedia =
|
2
|
-
# make the inputs work with the radio buttons, and options
|
3
|
-
@element.find('label input').on 'click', ->
|
4
|
-
jQuery(@).closest('label').next('.selectable').focus()
|
1
|
+
@Mercury.modalHandlers.insertMedia = {
|
5
2
|
|
6
|
-
|
7
|
-
element
|
8
|
-
element.
|
3
|
+
initialize: ->
|
4
|
+
@element.find('.control-label input').on('click', @onLabelChecked)
|
5
|
+
@element.find('.controls .optional, .controls .required').on('focus', (event) => @onInputFocused($(event.target)))
|
6
|
+
|
7
|
+
@focus('#media_image_url')
|
8
|
+
@initializeForm()
|
9
|
+
|
10
|
+
# build the image or embed/iframe on form submission
|
11
|
+
@element.find('form').on 'submit', (event) =>
|
12
|
+
event.preventDefault()
|
13
|
+
@validateForm()
|
14
|
+
unless @valid
|
15
|
+
@resize()
|
16
|
+
return
|
17
|
+
@submitForm()
|
18
|
+
@hide()
|
9
19
|
|
10
|
-
@element.find(".media-options").hide()
|
11
|
-
@element.find("##{element.attr('id').replace('media_', '')}").show()
|
12
|
-
@resize(true)
|
13
20
|
|
14
|
-
|
15
|
-
|
21
|
+
initializeForm: ->
|
22
|
+
# get the selection and initialize its information into the form
|
23
|
+
return unless Mercury.region && Mercury.region.selection
|
16
24
|
selection = Mercury.region.selection()
|
17
25
|
|
18
26
|
# if we're editing an image prefill the information
|
19
|
-
if
|
27
|
+
if image = selection.is?('img')
|
20
28
|
@element.find('#media_image_url').val(image.attr('src'))
|
21
29
|
@element.find('#media_image_alignment').val(image.attr('align'))
|
22
|
-
|
30
|
+
@focus('#media_image_url')
|
23
31
|
|
24
32
|
# if we're editing an iframe (assume it's a video for now)
|
25
|
-
if
|
33
|
+
if iframe = selection.is?('iframe')
|
26
34
|
src = iframe.attr('src')
|
27
|
-
if
|
35
|
+
if /^https?:\/\/www.youtube.com\//i.test(src)
|
28
36
|
# it's a youtube video
|
29
|
-
@element.find('#media_youtube_url').val("
|
37
|
+
@element.find('#media_youtube_url').val("#{src.match(/^https?/)[0]}://youtu.be/#{src.match(/\/embed\/(\w+)/)[1]}")
|
30
38
|
@element.find('#media_youtube_width').val(iframe.width())
|
31
39
|
@element.find('#media_youtube_height').val(iframe.height())
|
32
|
-
|
33
|
-
else if
|
40
|
+
@focus('#media_youtube_url')
|
41
|
+
else if /^https?:\/\/player.vimeo.com\//i.test(src)
|
34
42
|
# it's a vimeo video
|
35
|
-
@element.find('#media_vimeo_url').val("
|
43
|
+
@element.find('#media_vimeo_url').val("#{src.match(/^https?/)[0]}://vimeo.com/#{src.match(/\/video\/(\w+)/)[1]}")
|
36
44
|
@element.find('#media_vimeo_width').val(iframe.width())
|
37
45
|
@element.find('#media_vimeo_height').val(iframe.height())
|
38
|
-
|
46
|
+
@focus('#media_vimeo_url')
|
47
|
+
|
48
|
+
|
49
|
+
focus: (selector) ->
|
50
|
+
setTimeout((=> @element.find(selector).focus()), 300)
|
51
|
+
|
52
|
+
|
53
|
+
onLabelChecked: ->
|
54
|
+
forInput = jQuery(@).closest('.control-label').attr('for')
|
55
|
+
jQuery(@).closest('.control-group').find("##{forInput}").focus()
|
56
|
+
|
57
|
+
|
58
|
+
onInputFocused: (input) ->
|
59
|
+
input.closest('.control-group').find('input[type=radio]').prop('checked', true)
|
60
|
+
|
61
|
+
return if input.closest('.media-options').length
|
62
|
+
@element.find(".media-options").hide()
|
63
|
+
@element.find("##{input.attr('id').replace('media_', '')}_options").show()
|
64
|
+
@resize(true)
|
65
|
+
|
66
|
+
|
67
|
+
addInputError: (input, message) ->
|
68
|
+
input.after('<span class="help-inline error-message">' + Mercury.I18n(message) + '</span>').closest('.control-group').addClass('error')
|
69
|
+
@valid = false
|
70
|
+
|
71
|
+
|
72
|
+
clearInputErrors: ->
|
73
|
+
@element.find('.control-group.error').removeClass('error').find('.error-message').remove()
|
74
|
+
@valid = true
|
75
|
+
|
76
|
+
|
77
|
+
validateForm: ->
|
78
|
+
@clearInputErrors()
|
79
|
+
|
80
|
+
type = @element.find('input[name=media_type]:checked').val()
|
81
|
+
el = @element.find("#media_#{type}")
|
82
|
+
|
83
|
+
switch type
|
84
|
+
when 'youtube_url'
|
85
|
+
url = @element.find('#media_youtube_url').val()
|
86
|
+
@addInputError(el, "is invalid") unless /^https?:\/\/youtu.be\//.test(url)
|
87
|
+
when 'vimeo_url'
|
88
|
+
url = @element.find('#media_vimeo_url').val()
|
89
|
+
@addInputError(el, "is invalid") unless /^https?:\/\/vimeo.com\//.test(url)
|
90
|
+
else
|
91
|
+
@addInputError(el, "can't be blank") unless el.val()
|
39
92
|
|
40
93
|
|
41
|
-
|
42
|
-
@element.find('form').on 'submit', (event) =>
|
43
|
-
event.preventDefault()
|
94
|
+
submitForm: ->
|
44
95
|
type = @element.find('input[name=media_type]:checked').val()
|
45
96
|
|
46
97
|
switch type
|
@@ -51,15 +102,12 @@
|
|
51
102
|
|
52
103
|
when 'youtube_url'
|
53
104
|
url = @element.find('#media_youtube_url').val()
|
54
|
-
unless /^https?:\/\/youtu.be\//.test(url)
|
55
|
-
Mercury.notify('Error: The provided youtube share url was invalid.')
|
56
|
-
return
|
57
105
|
code = url.replace(/https?:\/\/youtu.be\//, '')
|
58
106
|
protocol = 'http'
|
59
107
|
protocol = 'https' if /^https:/.test(url)
|
60
108
|
value = jQuery('<iframe>', {
|
61
|
-
width: @element.find('#media_youtube_width').val() || 560,
|
62
|
-
height: @element.find('#media_youtube_height').val() || 349,
|
109
|
+
width: parseInt(@element.find('#media_youtube_width').val(), 10) || 560,
|
110
|
+
height: parseInt(@element.find('#media_youtube_height').val(), 10) || 349,
|
63
111
|
src: "#{protocol}://www.youtube.com/embed/#{code}?wmode=transparent",
|
64
112
|
frameborder: 0,
|
65
113
|
allowfullscreen: 'true'
|
@@ -68,18 +116,15 @@
|
|
68
116
|
|
69
117
|
when 'vimeo_url'
|
70
118
|
url = @element.find('#media_vimeo_url').val()
|
71
|
-
unless /^https?:\/\/vimeo.com\//.test(url)
|
72
|
-
Mercury.notify('Error: The provided vimeo url was invalid.')
|
73
|
-
return
|
74
119
|
code = url.replace(/^https?:\/\/vimeo.com\//, '')
|
75
120
|
protocol = 'http'
|
76
121
|
protocol = 'https' if /^https:/.test(url)
|
77
122
|
value = jQuery('<iframe>', {
|
78
|
-
width: @element.find('#media_vimeo_width').val() || 400,
|
79
|
-
height: @element.find('#media_vimeo_height').val() || 225,
|
123
|
+
width: parseInt(@element.find('#media_vimeo_width').val(), 10) || 400,
|
124
|
+
height: parseInt(@element.find('#media_vimeo_height').val(), 10) || 225,
|
80
125
|
src: "#{protocol}://player.vimeo.com/video/#{code}?title=1&byline=1&portrait=0&color=ffffff",
|
81
126
|
frameborder: 0
|
82
127
|
})
|
83
128
|
Mercury.trigger('action', {action: 'insertHTML', value: value})
|
84
129
|
|
85
|
-
|
130
|
+
}
|