Updated interest buttons to use ajax instead of a round-trip post
This commit is contained in:
parent
0079c21f66
commit
30954e7907
@ -91,4 +91,28 @@
|
||||
htmlNode.setAttribute('data-input', 'mouse');
|
||||
}
|
||||
});
|
||||
Array.prototype.forEach.call(document.querySelectorAll('form.js-xhr'), function(form) {
|
||||
if (form.addEventListener) {
|
||||
form.addEventListener('submit', function(event) {
|
||||
event.preventDefault();
|
||||
form.classList.add('requesting');
|
||||
var data = new FormData(form);
|
||||
var request = new XMLHttpRequest();
|
||||
request.onreadystatechange = function() {
|
||||
if (request.readyState == 4) {
|
||||
form.classList.remove('requesting');
|
||||
if (request.status == 200) {
|
||||
var response = JSON.parse(request.responseText);
|
||||
for (var i = 0; i < response.length; i++) {
|
||||
form.querySelector(response[i].selector).outerHTML = response[i].html;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
request.open('POST', form.getAttribute('action'), true);
|
||||
request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
||||
request.send(data);
|
||||
}, false);
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
@ -591,6 +591,13 @@ input {
|
||||
}
|
||||
|
||||
form {
|
||||
@include _(transition, 'opacity 250ms ease-in-out, filter 250ms ease-in-out, -webkit-filter 250ms ease-in-out');
|
||||
|
||||
&.requesting {
|
||||
opacity: 0.5;
|
||||
-webkit-filter: blur(5px);
|
||||
}
|
||||
|
||||
&.composition {
|
||||
textarea {
|
||||
height: 16em;
|
||||
|
@ -1084,6 +1084,12 @@ class ConferencesController < ApplicationController
|
||||
WorkshopInterest.create(:workshop_id => workshop.id, :user_id => current_user.id) unless interested
|
||||
|
||||
if request.xhr?
|
||||
interest = workshop.interested?(current_user) ? :remove_interest : :show_interest
|
||||
css_class = workshop.interested?(current_user) ? :delete : :add
|
||||
render json: [ {
|
||||
selector: 'button[value="toggle_interest"]',
|
||||
html: view_context.button_tag(interest, :value => :toggle_interest, :class => css_class)
|
||||
} ]
|
||||
else
|
||||
# go back to the workshop
|
||||
redirect_to view_workshop_url(@this_conference.slug, workshop.id)
|
||||
|
@ -94,6 +94,7 @@ class Workshop < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def can_translate?(user, lang)
|
||||
return false unless user.present?
|
||||
user.can_translate?(lang, locale) || (can_edit?(user) && lang.to_s != locale.to_s)
|
||||
end
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
- else
|
||||
=_'articles.workshops.info.interested_count', "#{workshop.interested_count} people are interested in this workshop", :vars => {:count => workshop.interested_count}
|
||||
- if preview.blank? && workshop.can_show_interest?(current_user)
|
||||
= form_tag toggle_workshop_interest_path(workshop.conference.slug, workshop.id) do
|
||||
= form_tag toggle_workshop_interest_path(workshop.conference.slug, workshop.id), class: 'js-xhr' do
|
||||
= button_tag (workshop.interested?(current_user) ? :remove_interest : :show_interest), :value => :toggle_interest, :class => (workshop.interested?(current_user) ? :delete : :add)
|
||||
= richtext workshop.info
|
||||
- if preview.blank? && translations_available_for_editing
|
||||
|
Loading…
x
Reference in New Issue
Block a user