add UI notifications when a form is submitted + disable the form when it is being submitted + pass the current ability to the presenter + remove debug statements
This commit is contained in:
parent
f973ccef1b
commit
655fe18d72
@ -11,5 +11,4 @@ class Locomotive.Views.ContentTypes.EditView extends Locomotive.Views.ContentTyp
|
|||||||
|
|
||||||
if custom_field.isNew() # assign an id for each new custom field
|
if custom_field.isNew() # assign an id for each new custom field
|
||||||
custom_field.set id: data._id, _id: data._id
|
custom_field.set id: data._id, _id: data._id
|
||||||
console.log(custom_field)
|
|
||||||
|
|
||||||
|
@ -26,8 +26,6 @@ class Locomotive.Views.InlinEditor.ApplicationView extends Backbone.View
|
|||||||
iframe = @iframe
|
iframe = @iframe
|
||||||
|
|
||||||
iframe.load =>
|
iframe.load =>
|
||||||
console.log('iframe loading')
|
|
||||||
|
|
||||||
if @_$('meta[name=inline-editor]').size() > 0
|
if @_$('meta[name=inline-editor]').size() > 0
|
||||||
# bind the resize event. When the iFrame's size changes, update its height
|
# bind the resize event. When the iFrame's size changes, update its height
|
||||||
iframe_content = iframe.contents().find('body')
|
iframe_content = iframe.contents().find('body')
|
||||||
@ -46,8 +44,6 @@ class Locomotive.Views.InlinEditor.ApplicationView extends Backbone.View
|
|||||||
@enhance_iframe_links()
|
@enhance_iframe_links()
|
||||||
|
|
||||||
set_page: (attributes) ->
|
set_page: (attributes) ->
|
||||||
console.log('set_page')
|
|
||||||
|
|
||||||
@page = new Locomotive.Models.Page(attributes)
|
@page = new Locomotive.Models.Page(attributes)
|
||||||
|
|
||||||
@toolbar_view.model = @page
|
@toolbar_view.model = @page
|
||||||
|
@ -13,8 +13,6 @@ class Locomotive.Views.InlinEditor.ToolbarView extends Backbone.View
|
|||||||
render: ->
|
render: ->
|
||||||
super
|
super
|
||||||
|
|
||||||
console.log('render toolbar')
|
|
||||||
|
|
||||||
@enable_editing_mode_checkbox()
|
@enable_editing_mode_checkbox()
|
||||||
|
|
||||||
@enable_content_locale_picker()
|
@enable_content_locale_picker()
|
||||||
@ -22,8 +20,6 @@ class Locomotive.Views.InlinEditor.ToolbarView extends Backbone.View
|
|||||||
@
|
@
|
||||||
|
|
||||||
notify: (aloha_editable) ->
|
notify: (aloha_editable) ->
|
||||||
console.log('editable_element has been modified...')
|
|
||||||
|
|
||||||
window.bar = aloha_editable
|
window.bar = aloha_editable
|
||||||
|
|
||||||
element_id = aloha_editable.obj.attr('data-element-id')
|
element_id = aloha_editable.obj.attr('data-element-id')
|
||||||
@ -125,8 +121,6 @@ class Locomotive.Views.InlinEditor.ToolbarView extends Backbone.View
|
|||||||
context.find('span.text').html(values[1])
|
context.find('span.text').html(values[1])
|
||||||
|
|
||||||
refresh: ->
|
refresh: ->
|
||||||
console.log('refreshing toolbar...')
|
|
||||||
|
|
||||||
@$('h1').html(@model.get('title')).removeClass()
|
@$('h1').html(@model.get('title')).removeClass()
|
||||||
|
|
||||||
if @$('.editing-mode input[type=checkbox]').is(':checked')
|
if @$('.editing-mode input[type=checkbox]').is(':checked')
|
||||||
|
@ -5,10 +5,14 @@ class Locomotive.Views.Pages.EditView extends Locomotive.Views.Pages.FormView
|
|||||||
save: (event) ->
|
save: (event) ->
|
||||||
event.stopPropagation() & event.preventDefault()
|
event.stopPropagation() & event.preventDefault()
|
||||||
|
|
||||||
|
form = $(event.target).trigger('ajax:beforeSend')
|
||||||
|
|
||||||
@clear_errors()
|
@clear_errors()
|
||||||
|
|
||||||
@model.save {},
|
@model.save {},
|
||||||
success: (model, response, xhr) =>
|
success: (model, response, xhr) =>
|
||||||
|
form.trigger('ajax:complete')
|
||||||
|
|
||||||
model._normalize()
|
model._normalize()
|
||||||
|
|
||||||
if model.get('template_changed') == true
|
if model.get('template_changed') == true
|
||||||
@ -17,9 +21,8 @@ class Locomotive.Views.Pages.EditView extends Locomotive.Views.Pages.FormView
|
|||||||
@refresh_editable_elements()
|
@refresh_editable_elements()
|
||||||
|
|
||||||
error: (model, xhr) =>
|
error: (model, xhr) =>
|
||||||
|
form.trigger('ajax:complete')
|
||||||
|
|
||||||
errors = JSON.parse(xhr.responseText)
|
errors = JSON.parse(xhr.responseText)
|
||||||
|
|
||||||
@show_errors errors
|
@show_errors errors
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,6 +16,9 @@ class Locomotive.Views.Shared.FormView extends Backbone.View
|
|||||||
# allow users to save with CTRL+S or CMD+s
|
# allow users to save with CTRL+S or CMD+s
|
||||||
@enable_save_with_keys_combination()
|
@enable_save_with_keys_combination()
|
||||||
|
|
||||||
|
# enable form notifications
|
||||||
|
@enable_form_notifications()
|
||||||
|
|
||||||
return @
|
return @
|
||||||
|
|
||||||
save: (event) ->
|
save: (event) ->
|
||||||
@ -24,6 +27,8 @@ class Locomotive.Views.Shared.FormView extends Backbone.View
|
|||||||
save_in_ajax: (event, options) ->
|
save_in_ajax: (event, options) ->
|
||||||
event.stopPropagation() & event.preventDefault()
|
event.stopPropagation() & event.preventDefault()
|
||||||
|
|
||||||
|
form = $(event.target).trigger('ajax:beforeSend')
|
||||||
|
|
||||||
@clear_errors()
|
@clear_errors()
|
||||||
|
|
||||||
options ||= { headers: {}, on_success: null, on_error: null }
|
options ||= { headers: {}, on_success: null, on_error: null }
|
||||||
@ -33,11 +38,15 @@ class Locomotive.Views.Shared.FormView extends Backbone.View
|
|||||||
@model.save {},
|
@model.save {},
|
||||||
headers: options.headers
|
headers: options.headers
|
||||||
success: (model, response, xhr) =>
|
success: (model, response, xhr) =>
|
||||||
|
form.trigger('ajax:complete')
|
||||||
|
|
||||||
model.attributes = previous_attributes
|
model.attributes = previous_attributes
|
||||||
|
|
||||||
options.on_success(response, xhr) if options.on_success
|
options.on_success(response, xhr) if options.on_success
|
||||||
|
|
||||||
error: (model, xhr) =>
|
error: (model, xhr) =>
|
||||||
|
form.trigger('ajax:complete')
|
||||||
|
|
||||||
errors = JSON.parse(xhr.responseText)
|
errors = JSON.parse(xhr.responseText)
|
||||||
|
|
||||||
@show_errors errors
|
@show_errors errors
|
||||||
@ -72,7 +81,10 @@ class Locomotive.Views.Shared.FormView extends Backbone.View
|
|||||||
content.slideUp 100, -> parent.addClass('folded')
|
content.slideUp 100, -> parent.addClass('folded')
|
||||||
|
|
||||||
enable_save_with_keys_combination: ->
|
enable_save_with_keys_combination: ->
|
||||||
$.cmd 'S', (() => @$('form').trigger('submit')), [], ignoreCase: true
|
$.cmd 'S', (() => @$('form input[type=submit]').trigger('click')), [], ignoreCase: true
|
||||||
|
|
||||||
|
enable_form_notifications: ->
|
||||||
|
@$('form').formSubmitNotification()
|
||||||
|
|
||||||
after_inputs_fold: ->
|
after_inputs_fold: ->
|
||||||
# overide this method if necessary
|
# overide this method if necessary
|
||||||
|
@ -7,7 +7,7 @@ class Locomotive.Views.ThemeAssets.IndexView extends Backbone.View
|
|||||||
_lists_views: []
|
_lists_views: []
|
||||||
|
|
||||||
initialize: ->
|
initialize: ->
|
||||||
_.bindAll(@, 'add_asset')
|
_.bindAll(@, 'insert_asset')
|
||||||
|
|
||||||
render: ->
|
render: ->
|
||||||
@build_uploader()
|
@build_uploader()
|
||||||
@ -29,16 +29,24 @@ class Locomotive.Views.ThemeAssets.IndexView extends Backbone.View
|
|||||||
input = form.find('input[type=file]')
|
input = form.find('input[type=file]')
|
||||||
link = form.find('a.new')
|
link = form.find('a.new')
|
||||||
|
|
||||||
|
form.formSubmitNotification()
|
||||||
|
|
||||||
link.bind 'click', (event) ->
|
link.bind 'click', (event) ->
|
||||||
event.stopPropagation() & event.preventDefault()
|
event.stopPropagation() & event.preventDefault()
|
||||||
input.click()
|
input.click()
|
||||||
|
|
||||||
input.bind 'change', (event) =>
|
input.bind 'change', (event) =>
|
||||||
|
form.trigger('ajax:beforeSend')
|
||||||
_.each event.target.files, (file) =>
|
_.each event.target.files, (file) =>
|
||||||
asset = new Locomotive.Models.ThemeAsset(source: file)
|
asset = new Locomotive.Models.ThemeAsset(source: file)
|
||||||
asset.save {}, success: @add_asset, headers: { 'X-Flash': true }
|
asset.save {},
|
||||||
|
success: (model, response, xhr) =>
|
||||||
|
form.trigger('ajax:complete')
|
||||||
|
@insert_asset(model)
|
||||||
|
error: (() => form.trigger('ajax:complete'))
|
||||||
|
headers: { 'X-Flash': true }
|
||||||
|
|
||||||
add_asset: (model) ->
|
insert_asset: (model) ->
|
||||||
list_view = @pick_list_view(model.get('content_type'))
|
list_view = @pick_list_view(model.get('content_type'))
|
||||||
list_view.collection.add(model)
|
list_view.collection.add(model)
|
||||||
|
|
||||||
|
@ -314,6 +314,29 @@ ul.list {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ___ form notification ___ */
|
||||||
|
|
||||||
|
#form-submit-notification {
|
||||||
|
position: fixed;
|
||||||
|
top: 0px;
|
||||||
|
right: 0px;
|
||||||
|
z-index: 9999;
|
||||||
|
|
||||||
|
> div {
|
||||||
|
padding: 5px 10px;
|
||||||
|
|
||||||
|
background-color: #fffbe5;
|
||||||
|
border-left: 4px solid #efe4a5;
|
||||||
|
border-bottom: 4px solid #efe4a5;
|
||||||
|
|
||||||
|
text-align: center;
|
||||||
|
@include single-text-shadow(rgba(255, 255, 255, 1), 0px, 1px, 0px);
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #aa9a79;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ___ paragraph (for help for example) ___ */
|
/* ___ paragraph (for help for example) ___ */
|
||||||
|
|
||||||
p span.code {
|
p span.code {
|
||||||
|
@ -176,7 +176,7 @@ body {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=submit] {
|
input[type=submit], button[type=submit] {
|
||||||
@include light-button;
|
@include light-button;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
|
|
||||||
.span-12.last
|
.span-12.last
|
||||||
%p
|
%p
|
||||||
= submit_tag button_label.is_a?(Symbol) ? t(".#{button_label}") : button_label
|
= submit_tag button_label.is_a?(Symbol) ? t(".#{button_label}") : button_label, :disable_with => t('.disable_with'), :'data-sending-form-message' => t('locomotive.messages.sending_form')
|
||||||
|
|
||||||
.clear
|
.clear
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
- content_for :buttons do
|
- content_for :buttons do
|
||||||
- if can?(:manage, Locomotive::ThemeAsset)
|
- if can?(:manage, Locomotive::ThemeAsset)
|
||||||
= form_tag theme_assets_url(:json), :id => 'theme-assets-quick-upload', :class => 'quick-upload' do
|
= form_tag theme_assets_url(:json), :id => 'theme-assets-quick-upload', :class => 'quick-upload', :'data-sending-form-message' => t('locomotive.messages.sending_form') do
|
||||||
= file_field_tag 'theme_asset[source]', :multiple => 'multiple'
|
= file_field_tag 'theme_asset[source]', :multiple => 'multiple'
|
||||||
= local_action_button :quick_upload, '#', :class => 'new'
|
= local_action_button :quick_upload, '#', :class => 'new'
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ de:
|
|||||||
create: Neu
|
create: Neu
|
||||||
update: Speichern
|
update: Speichern
|
||||||
send: Senden
|
send: Senden
|
||||||
|
disable_with: "locomotive.disable_with.form_actions"
|
||||||
footer:
|
footer:
|
||||||
who_is_behind: "Dienst entwickelt von %{development} und entworfen von <a href=\"http://www.sachagreif.com\">Sacha Greif</a> — <small>version</small> %{version}"
|
who_is_behind: "Dienst entwickelt von %{development} und entworfen von <a href=\"http://www.sachagreif.com\">Sacha Greif</a> — <small>version</small> %{version}"
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ en:
|
|||||||
|
|
||||||
messages:
|
messages:
|
||||||
confirm: Are you sure ?
|
confirm: Are you sure ?
|
||||||
|
sending_form: Your form is being submitted
|
||||||
|
|
||||||
shared:
|
shared:
|
||||||
header:
|
header:
|
||||||
@ -48,6 +49,7 @@ en:
|
|||||||
create: Create
|
create: Create
|
||||||
update: Save
|
update: Save
|
||||||
send: Send
|
send: Send
|
||||||
|
disable_with: Pending...
|
||||||
list:
|
list:
|
||||||
untranslated: untranslated
|
untranslated: untranslated
|
||||||
footer:
|
footer:
|
||||||
@ -193,6 +195,7 @@ en:
|
|||||||
index:
|
index:
|
||||||
title: Listing theme files
|
title: Listing theme files
|
||||||
help: "The theme files section is the place where you manage the files needed by your layout, snippets...etc. If you need to manage an image gallery, create a new content type instead.<br/><b>Warning:</b> you may not see all the assets depending on your rights."
|
help: "The theme files section is the place where you manage the files needed by your layout, snippets...etc. If you need to manage an image gallery, create a new content type instead.<br/><b>Warning:</b> you may not see all the assets depending on your rights."
|
||||||
|
quick_upload: Quick upload
|
||||||
new: new file
|
new: new file
|
||||||
snippets: Snippets
|
snippets: Snippets
|
||||||
css_and_js: Style and javascript
|
css_and_js: Style and javascript
|
||||||
|
@ -37,6 +37,7 @@ es:
|
|||||||
account: Mi Cuenta
|
account: Mi Cuenta
|
||||||
site: Sitio
|
site: Sitio
|
||||||
theme_assets: Ficheros del Tema
|
theme_assets: Ficheros del Tema
|
||||||
|
disable_with: "locomotive.disable_with.form_actions"
|
||||||
footer:
|
footer:
|
||||||
who_is_behind: "Servicio desarrollado por %{development} y diseñado por <a href=\"http://www.sachagreif.com\">Sacha Greif</a>"
|
who_is_behind: "Servicio desarrollado por %{development} y diseñado por <a href=\"http://www.sachagreif.com\">Sacha Greif</a>"
|
||||||
form_actions:
|
form_actions:
|
||||||
|
@ -31,6 +31,7 @@ fr:
|
|||||||
|
|
||||||
messages:
|
messages:
|
||||||
confirm: "Êtes-vous sûr(e) ?"
|
confirm: "Êtes-vous sûr(e) ?"
|
||||||
|
sending_form: "Votre formulaire est en cours d'envoi"
|
||||||
|
|
||||||
shared:
|
shared:
|
||||||
header:
|
header:
|
||||||
@ -57,6 +58,7 @@ fr:
|
|||||||
create: Créer
|
create: Créer
|
||||||
update: Mettre à jour
|
update: Mettre à jour
|
||||||
send: Envoyer
|
send: Envoyer
|
||||||
|
disable_with: En cours...
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
new_content_entry:
|
new_content_entry:
|
||||||
|
@ -34,6 +34,7 @@ it:
|
|||||||
create: Crea
|
create: Crea
|
||||||
update: Salva
|
update: Salva
|
||||||
send: Invia
|
send: Invia
|
||||||
|
disable_with: "locomotive.disable_with.form_actions"
|
||||||
|
|
||||||
errors:
|
errors:
|
||||||
"500":
|
"500":
|
||||||
|
@ -31,6 +31,7 @@ nl:
|
|||||||
create: Maak
|
create: Maak
|
||||||
update: Update
|
update: Update
|
||||||
send: Verstuur
|
send: Verstuur
|
||||||
|
disable_with: "locomotive.disable_with.form_actions"
|
||||||
|
|
||||||
errors:
|
errors:
|
||||||
"500":
|
"500":
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
create: Opprett
|
create: Opprett
|
||||||
update: Lagre
|
update: Lagre
|
||||||
send: Send
|
send: Send
|
||||||
|
disable_with: "locomotive.disable_with.form_actions"
|
||||||
|
|
||||||
errors:
|
errors:
|
||||||
"500":
|
"500":
|
||||||
|
@ -31,6 +31,7 @@ pt-BR:
|
|||||||
create: Criar
|
create: Criar
|
||||||
update: Atualizar
|
update: Atualizar
|
||||||
send: Enviar
|
send: Enviar
|
||||||
|
disable_with: "locomotive.disable_with.form_actions"
|
||||||
|
|
||||||
errors:
|
errors:
|
||||||
"500":
|
"500":
|
||||||
|
@ -34,6 +34,7 @@ ru:
|
|||||||
create: Создать
|
create: Создать
|
||||||
update: Сохранить
|
update: Сохранить
|
||||||
send: Отправить
|
send: Отправить
|
||||||
|
disable_with: "locomotive.disable_with.form_actions"
|
||||||
|
|
||||||
errors:
|
errors:
|
||||||
"500":
|
"500":
|
||||||
|
4
doc/TODO
4
doc/TODO
@ -124,11 +124,11 @@ x override sort for contents
|
|||||||
x unable to remove a field
|
x unable to remove a field
|
||||||
x "back to admin" link does not work if inline editor disabled
|
x "back to admin" link does not work if inline editor disabled
|
||||||
x unable to delete memberships
|
x unable to delete memberships
|
||||||
|
x disallow to click twice on the submit form button (spinner ?)
|
||||||
|
x weird behaviour when changing the default locale of a site
|
||||||
- editable_elements does not display the first time they get created (and if there are no existing ones)
|
- editable_elements does not display the first time they get created (and if there are no existing ones)
|
||||||
- display by categories does not work when localized
|
- display by categories does not work when localized
|
||||||
- disallow to click twice on the submit form button (spinner ?)
|
|
||||||
- message to notify people if their browser is too old
|
- message to notify people if their browser is too old
|
||||||
- weird behaviour when changing the default locale of a site
|
|
||||||
|
|
||||||
? install a site by default at the first installation (without asking)
|
? install a site by default at the first installation (without asking)
|
||||||
|
|
||||||
|
@ -9,6 +9,14 @@ module Locomotive
|
|||||||
super || has_errors?
|
super || has_errors?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def options
|
||||||
|
super.merge({
|
||||||
|
:current_site => self.controller.send(:current_site),
|
||||||
|
:current_account => self.controller.send(:current_locomotive_account),
|
||||||
|
:ability => self.controller.send(:current_ability)
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
def to_json
|
def to_json
|
||||||
if get?
|
if get?
|
||||||
display resource
|
display resource
|
||||||
|
@ -6,8 +6,6 @@ module ActionView
|
|||||||
|
|
||||||
# Only preserve whitespace in the tag's content: https://github.com/nex3/haml/pull/503
|
# Only preserve whitespace in the tag's content: https://github.com/nex3/haml/pull/503
|
||||||
def content_tag_with_haml_and_preserve(name, content_or_options_with_block = nil, *args, &block)
|
def content_tag_with_haml_and_preserve(name, content_or_options_with_block = nil, *args, &block)
|
||||||
Rails.logger.debug("[content_tag_with_haml_and_preserve / ENGINE] #{name} / #{respond_to?(:content_tag_with_haml)} / #{respond_to?(:content_tag_without_haml)}")
|
|
||||||
|
|
||||||
return content_tag_without_haml(name, content_or_options_with_block, *args, &block) unless is_haml?
|
return content_tag_without_haml(name, content_or_options_with_block, *args, &block) unless is_haml?
|
||||||
|
|
||||||
preserve = haml_buffer.options[:preserve].include?(name.to_s)
|
preserve = haml_buffer.options[:preserve].include?(name.to_s)
|
||||||
|
39
vendor/assets/javascripts/locomotive/form_submit_notification.js
vendored
Normal file
39
vendor/assets/javascripts/locomotive/form_submit_notification.js
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/**
|
||||||
|
* Version 0.0.1
|
||||||
|
* Display a message letting the user know the form is being submitted
|
||||||
|
* Didier Lafforgue
|
||||||
|
*/
|
||||||
|
$.fn.formSubmitNotification = function(settings) {
|
||||||
|
|
||||||
|
function show() {
|
||||||
|
$('#form-submit-notification').fadeIn()
|
||||||
|
}
|
||||||
|
|
||||||
|
function hide() {
|
||||||
|
$('#form-submit-notification').fadeOut()
|
||||||
|
}
|
||||||
|
|
||||||
|
function create(message) {
|
||||||
|
if ($('#form-submit-notification').size() == 0) {
|
||||||
|
var element = $("<div id=\"form-submit-notification\"><div>" + message + "</div></div>").hide();
|
||||||
|
$('body').append(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.each(function() {
|
||||||
|
var form = $(this);
|
||||||
|
var message = form.attr('data-sending-form-message');
|
||||||
|
|
||||||
|
if (typeof(message) == 'undefined')
|
||||||
|
message = form.find('input[type=submit]').attr('data-sending-form-message');
|
||||||
|
|
||||||
|
if (typeof(message) == 'undefined')
|
||||||
|
return ;
|
||||||
|
|
||||||
|
create(message);
|
||||||
|
|
||||||
|
form.bind('ajax:beforeSend', function(event) { show() });
|
||||||
|
form.bind('ajax:complete', function(event) { hide() });
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user