Remove all inline event handlers

This allows blueslip to catch exceptions from the event handlers on
these elements in addition to the other benefits that not using
inline handlers provide.

(imported from commit 2bdcb2496c6c08fa7228a20ce6164b527cf64e41)
This commit is contained in:
Zev Benjamin
2013-04-02 14:47:18 -04:00
parent 79d0e78130
commit de1f4b0be2
14 changed files with 154 additions and 50 deletions

View File

@@ -6,10 +6,19 @@
<h2>Thanks for signing up!</h2> <h2>Thanks for signing up!</h2>
<p class="lead">Check your email so we can get started.<p> <p class="lead">Check your email so we can get started.<p>
<p>Still no email? We can <a href="#" onclick="$('#email_signup').submit()">resend it</a>.<br/> <p>Still no email? We can <a href="#" id="resend_email_link">resend it</a>.<br/>
<small>(Just in case, take a look at your Spam folder.)</small></p> <small>(Just in case, take a look at your Spam folder.)</small></p>
<form id="email_signup" action="/accounts/home/" method="post"> <form id="email_signup" action="/accounts/home/" method="post">
{% csrf_token %} {% csrf_token %}
<input type="hidden" class="email" id="email" value="{{ email }}" name="email"/>&nbsp; <input type="hidden" class="email" id="email" value="{{ email }}" name="email"/>&nbsp;
</form> </form>
{% endblock %} {% endblock %}
{% block customhead %}
{{ block.super }}
<script type="text/javascript">
$(function() {
$("#resend_email_link").click(function () { $('#email_signup').submit(); });
});
</script>
{% endblock %}

View File

@@ -1,6 +1,6 @@
<div class="row-fluid"> <div class="row-fluid">
<div class="span12" id="compose"> <div class="span12" id="compose">
<div class="close composebox-close" onclick="compose.cancel()">&times;</div> <div class="close composebox-close">&times;</div>
<div class="message_comp"> <div class="message_comp">
<div class="alert" id="send-status"> <div class="alert" id="send-status">
<span class="send-status-close">&times;</span> <span class="send-status-close">&times;</span>

View File

@@ -37,25 +37,25 @@
you one.</p> you one.</p>
<p>Or, <strong>take matters into your own hands</strong>, <p>Or, <strong>take matters into your own hands</strong>,
and <a href="#" onclick="compose.start('stream');return false;"> and <a href="#" class="empty_feed_compose_stream">
compose a new stream message</a>.</p> compose a new stream message</a>.</p>
</div> </div>
<div id="empty_narrow_message" class="empty_feed_notice"> <div id="empty_narrow_message" class="empty_feed_notice">
<h4>Nothing's been sent here yet!</h4> <h4>Nothing's been sent here yet!</h4>
<p>Why not <a href="#" onclick="compose.start('stream'); return false;"> <p>Why not <a href="#" class="empty_feed_compose_stream">
start the conversation</a>?</p> start the conversation</a>?</p>
</div> </div>
<div id="empty_narrow_private_message" class="empty_feed_notice"> <div id="empty_narrow_private_message" class="empty_feed_notice">
<h4>You have no private messages yet!</h4> <h4>You have no private messages yet!</h4>
<p>Why not <a href="#" onclick="compose.start('private'); return false;"> <p>Why not <a href="#" class="empty_feed_compose_private">
start the conversation</a>?</p> start the conversation</a>?</p>
</div> </div>
<div id="nonsubbed_stream_narrow_message" class="empty_feed_notice"> <div id="nonsubbed_stream_narrow_message" class="empty_feed_notice">
<h4>You aren't subscribed to this stream!</h4> <h4>You aren't subscribed to this stream!</h4>
<p>Want to <a href="#" onclick="subs.show_and_focus_on_narrow(); return false;">join it</a>?</p> <p>Want to <a href="#" class="empty_feed_join">join it</a>?</p>
</div> </div>
<div id="empty_star_narrow_message" class="empty_feed_notice"> <div id="empty_star_narrow_message" class="empty_feed_notice">
<h4>You haven't starred anything yet!</h4> <h4>You haven't starred anything yet!</h4>

View File

@@ -11,16 +11,14 @@
</div> </div>
<div class="new_message_button"> <div class="new_message_button">
<button type="button" class="btn btn-large" <button type="button" class="btn btn-large compose_stream_button"
id="left_bar_compose_stream_button_big" id="left_bar_compose_stream_button_big">
onclick="compose.set_mode('stream');">
<i class="icon-bullhorn"></i> New stream message <i class="icon-bullhorn"></i> New stream message
</button> </button>
</div> </div>
<div class="new_message_button"> <div class="new_message_button">
<button type="button" class="btn btn-large" <button type="button" class="btn btn-large compose_private_button"
id="left_bar_compose_private_button_big" id="left_bar_compose_private_button_big">
onclick="compose.set_mode('private');">
<i class="icon-user"></i> New private message <i class="icon-user"></i> New private message
</button> </button>
</div> </div>

View File

@@ -26,12 +26,12 @@
<ul class="nav" role="navigation"> <ul class="nav" role="navigation">
{# stuff that gets visible in skinny mode #} {# stuff that gets visible in skinny mode #}
<li class="visible-phone" title="New stream message"> <li class="visible-phone" title="New stream message">
<a href="#" onclick="compose.set_mode('stream'); return false;"> <a href="#" class="compose_stream_button">
<i class="icon-bullhorn"></i> <i class="icon-bullhorn"></i>
</a> </a>
</li> </li>
<li class="visible-phone" title="New private message"> <li class="visible-phone" title="New private message">
<a href="#" onclick="compose.set_mode('private'); return false;"> <a href="#" class="compose_private_button">
<i class="icon-user"></i> <i class="icon-user"></i>
</a> </a>
</li> </li>
@@ -76,7 +76,7 @@
</li> </li>
<li class="divider"></li> <li class="divider"></li>
<li title="Feedback"> <li title="Feedback">
<a href="#feedback" onclick="compose.start('private', { 'private_message_recipient': 'feedback@humbughq.com' });"> <a href="#feedback" class="feedback_button">
<i class="icon-comment"></i> Feedback <i class="icon-comment"></i> Feedback
</a> </a>
</li> </li>
@@ -89,7 +89,7 @@
{% endif %} {% endif %}
<li class="divider"></li> <li class="divider"></li>
<li title="Log out"> <li title="Log out">
<a href="#logout" onclick="logout();"> <a href="#logout" class="logout_button">
<i class="icon-off"></i> Log out <i class="icon-off"></i> Log out
</a> </a>
</li> </li>
@@ -109,15 +109,14 @@
<div class="row-fluid"> <div class="row-fluid">
<div class="alert alert_sidebar alert-error home-error-bar" id="connection-error"> <div class="alert alert_sidebar alert-error home-error-bar" id="connection-error">
<strong>Can't receive messages</strong> <strong>Can't receive messages</strong>
&mdash; retrying soon. <a class="cursor_pointer" onclick="restart_get_updates({dont_block: true});">Try now</a>. &mdash; retrying soon. <a class="cursor_pointer restart_get_updates_button">Try now</a>.
</div> </div>
<div class="alert alert_sidebar alert-error home-error-bar" id="zephyr-mirror-error"> <div class="alert alert_sidebar alert-error home-error-bar" id="zephyr-mirror-error">
<strong>Messages you send are not being mirrored to MIT <strong>Messages you send are not being mirrored to MIT
zephyr</strong> &mdash; Please check zephyr</strong> &mdash; Please check
that <a href="/zephyr">you are running the Zephyr mirror that <a href="/zephyr">you are running the Zephyr mirror
script</a>. Once you've corrected this script</a>. Once you've corrected this
issue, you can <a class="cursor_pointer" issue, you can <a class="cursor_pointer restart_get_updates_button">click
onclick="restart_get_updates({dont_block: true});">click
here</a> to update this alert. here</a> to update this alert.
</div> </div>
<div class="alert alert_sidebar alert-error home-error-bar" id="home-error"></div> <div class="alert alert_sidebar alert-error home-error-bar" id="home-error"></div>

View File

@@ -6,7 +6,7 @@
<div id="API"> <div id="API">
<label>API Key</label> <label>API Key</label>
<div id="api_key_button_box"> <div id="api_key_button_box">
<a href="#api-settings" id="api_key_button" onclick="ui.show_api_key_box();">(show)</a> <a href="#api-settings" id="api_key_button">(show)</a>
<br /> <br />
</div> </div>
<div id="get_api_key_box"> <div id="get_api_key_box">
@@ -24,7 +24,8 @@
<div id="Photo"> <div id="Photo">
<label>Photo</label> <label>Photo</label>
<img class="img-rounded gravatar-profile" src="https://secure.gravatar.com/avatar/{{ email_hash }}?d=identicon&s=80"/> <img class="img-rounded gravatar-profile" src="https://secure.gravatar.com/avatar/{{ email_hash }}?d=identicon&s=80"/>
<a href="https://en.gravatar.com/emails" target="_blank" onclick="ui.wait_for_gravatar();">(change at Gravatar.com)</a> <a href="https://en.gravatar.com/emails" target="_blank" class="change_gravatar_button">
(change at Gravatar.com)</a>
<br /> <br />
</div> </div>
<br /><br /> <br /><br />
@@ -83,7 +84,7 @@
<hr /> <hr />
<div> <div>
<button class="btn" data-dismiss="modal" aria-hidden="true" onclick="fast_forward_pointer(this);"> <button class="btn declare_bankruptcy_button" data-dismiss="modal" aria-hidden="true">
Declare Humbug bankruptcy Declare Humbug bankruptcy
</button> </button>
<p> <p>

View File

@@ -37,11 +37,12 @@ var globals =
+ ' scroll_to_selected disable_pointer_movement get_private_message_recipient' + ' scroll_to_selected disable_pointer_movement get_private_message_recipient'
+ ' load_old_messages' + ' load_old_messages'
+ ' at_top_of_viewport at_bottom_of_viewport within_viewport' + ' at_top_of_viewport at_bottom_of_viewport within_viewport'
+ ' viewport' + ' viewport restart_get_updates'
+ ' load_more_messages reset_load_more_status have_scrolled_away_from_top' + ' load_more_messages reset_load_more_status have_scrolled_away_from_top'
+ ' maybe_scroll_to_selected recenter_pointer_on_display suppress_scroll_pointer_update' + ' maybe_scroll_to_selected recenter_pointer_on_display suppress_scroll_pointer_update'
+ ' process_visible_unread_messages message_range message_in_table process_loaded_for_unread' + ' process_visible_unread_messages message_range message_in_table process_loaded_for_unread'
+ ' mark_all_as_read message_unread process_read_messages unread_in_current_view' + ' mark_all_as_read message_unread process_read_messages unread_in_current_view'
+ ' fast_forward_pointer'
; ;

View File

@@ -82,11 +82,16 @@ exports.initialize = function () {
} }
}); });
};
exports.set_all_streams = function (e, val) { $(document).on('click', '.invite_check_all_button', function (e) {
$('#streams_to_add :checkbox').attr('checked', val); $('#streams_to_add :checkbox').attr('checked', true);
e.preventDefault(); e.preventDefault();
});
$(document).on('click', '.invite_uncheck_all_button', function (e) {
$('#streams_to_add :checkbox').attr('checked', false);
e.preventDefault();
});
}; };
return exports; return exports;

View File

@@ -359,6 +359,15 @@ $(function () {
$(document).on('subscription_remove.zephyr', function (e) { $(document).on('subscription_remove.zephyr', function (e) {
mark_unsubscribed(e.subscription.name); mark_unsubscribed(e.subscription.name);
}); });
$(document).on('click', '.subs_set_all_users', function (e) {
$('#people_to_add :checkbox').attr('checked', true);
e.preventDefault();
});
$(document).on('click', '.subs_unset_all_users', function (e) {
$('#people_to_add :checkbox').attr('checked', false);
e.preventDefault();
});
}); });
exports.get_color = function (stream_name) { exports.get_color = function (stream_name) {
@@ -831,11 +840,6 @@ $(function () {
}); });
}); });
exports.set_all_users = function (e, val) {
$('#people_to_add :checkbox').attr('checked', val);
e.preventDefault();
};
function focus_on_narrowed_stream() { function focus_on_narrowed_stream() {
var operators = narrow.operators(); var operators = narrow.operators();
if (!operators) { if (!operators) {

View File

@@ -841,10 +841,6 @@ $(function () {
subs.maybe_toggle_all_messages(); subs.maybe_toggle_all_messages();
tutorial.initialize(); tutorial.initialize();
$("body").bind('click', function () {
ui.hide_actions_popover();
});
$("#main_div").on("click", ".messagebox", function (e) { $("#main_div").on("click", ".messagebox", function (e) {
var target = $(e.target); var target = $(e.target);
if (target.is("a") || target.is("img.message_inline_image") || target.is("img.twitter-avatar")) { if (target.is("a") || target.is("img.message_inline_image") || target.is("img.twitter-avatar")) {
@@ -985,6 +981,101 @@ $(function () {
compose.start('private', {private_message_recipient: email}); compose.start('private', {private_message_recipient: email});
e.preventDefault(); e.preventDefault();
}); });
$('#stream_filters li').on('click', 'a', function (e) {
var stream = $(e.target).parents('li').data('name');
narrow.by('stream', stream, {select_first_unread: true});
e.preventDefault();
});
$('#stream_filters li').on('click', 'a', function (e) {
var stream = $(e.target).parents('li').data('name');
narrow.by('stream', stream, {select_first_unread: true});
e.preventDefault();
});
$('.composebox-close').click(function (e) { compose.cancel(); });
$('.compose_stream_button').click(function (e) {
compose.set_mode('stream');
return false;
});
$('.compose_private_button').click(function (e) {
compose.set_mode('private');
return false;
});
$('.empty_feed_compose_stream').click(function (e) {
compose.start('stream');
return false;
});
$('.empty_feed_compose_private').click(function (e) {
compose.start('private');
return false;
});
$('.empty_feed_join').click(function (e) {
subs.show_and_focus_on_narrow();
return false;
});
$('.feedback_button').click(function (e) {
compose.start('private', { 'private_message_recipient': 'feedback@humbughq.com' });
});
$('.logout_button').click(function (e) {
$('#logout_form').submit();
});
$('.restart_get_updates_button').click(function (e) {
restart_get_updates({dont_block: true});
});
$('#api_key_button').click(function (e) {
ui.show_api_key_box();
});
$('.change_gravatar_button').click(function (e) {
ui.wait_for_gravatar();
});
$('.declare_bankruptcy_button').click(function (e) {
fast_forward_pointer(this);
});
$('body').on('click', '.respond_button', function (e) {
respond_to_message();
ui.hide_actions_popover();
});
$('body').on('click', '.respond_personal_button', function (e) {
respond_to_message('personal');
ui.hide_actions_popover();
});
$('body').on('click', '.popover_narrow_by_subject_button', function (e) {
var msgid = $(e.currentTarget).data('msgid');
ui.hide_actions_popover();
narrow.by_subject(msgid);
});
$('body').on('click', '.popover_narrow_by_recipient_button', function (e) {
var msgid = $(e.currentTarget).data('msgid');
ui.hide_actions_popover();
narrow.by_recipient(msgid);
});
$('body').on('click', '.popover_narrow_by_sender_button', function (e) {
var msgid = $(e.currentTarget).data('msgid');
var sender_email = $(e.currentTarget).data('sender_email');
ui.hide_actions_popover();
narrow.by('sender', sender_email, {then_select_id: msgid});
});
$('body').on('click', '.popover_narrow_by_time_travel_button', function (e) {
var msgid = $(e.currentTarget).data('msgid');
ui.hide_actions_popover();
narrow.by_time_travel(msgid);
});
$("body").on('click', function (e) {
// Dismiss the popover if the user has clicked outside it
if ($('.popover-inner').has(e.target).length === 0) {
ui.hide_actions_popover();
}
});
}); });
function sort_narrow_list() { function sort_narrow_list() {

View File

@@ -1033,7 +1033,3 @@ function fast_forward_pointer(btn) {
} }
}); });
} }
function logout() {
$('#logout_form').submit();
}

View File

@@ -11,7 +11,7 @@
</div> </div>
<li> <li>
<a onclick="respond_to_message();"> <a class="respond_button">
<i class="icon-share-alt"></i> <i class="icon-share-alt"></i>
{{#if message.is_stream}} {{#if message.is_stream}}
Reply to this subject on stream <b>{{message.display_recipient}}</b> Reply to this subject on stream <b>{{message.display_recipient}}</b>
@@ -22,7 +22,7 @@
</li> </li>
{{#unless message.is_private}} {{#unless message.is_private}}
<li> <li>
<a onclick="respond_to_message('personal');"> <a class="respond_personal_button">
<i class="icon-user"></i> Reply to <b>{{message.sender_full_name}}</b> only <i class="icon-user"></i> Reply to <b>{{message.sender_full_name}}</b> only
</a> </a>
</li> </li>
@@ -30,21 +30,21 @@
{{#if message.is_stream}} {{#if message.is_stream}}
<li> <li>
<a onclick="ui.hide_actions_popover(); narrow.by_subject({{message.id}});"> <a class="popover_narrow_by_subject_button" data-msgid="{{message.id}}">
<i class="icon-bullhorn"></i> <i class="icon-bullhorn"></i>
Narrow to this subject on stream <b>{{message.display_recipient}}</b> Narrow to this subject on stream <b>{{message.display_recipient}}</b>
</a> </a>
</li> </li>
{{else}} {{else}}
<li> <li>
<a onclick="ui.hide_actions_popover(); narrow.by_recipient({{message.id}});"> <a class="popover_narrow_by_recipient_button" data-msgid="{{message.id}}">
<i class="icon-user"></i> <i class="icon-user"></i>
Narrow to this private message conversation Narrow to this private message conversation
</a> </a>
</li> </li>
{{/if}} {{/if}}
<li> <li>
<a onclick="ui.hide_actions_popover(); narrow.by('sender', '{{message.sender_email}}', {then_select_id: {{message.id}} });"> <a class="popover_narrow_by_sender_button" data-msgid="{{message.id}}" data-sender_email="{{message.sender_email}}">
<i class="icon-user"></i> <i class="icon-user"></i>
Narrow to messages sent by <b>{{message.sender_full_name}}</b> Narrow to messages sent by <b>{{message.sender_full_name}}</b>
</a> </a>
@@ -52,7 +52,7 @@
{{#if narrowed}} {{#if narrowed}}
<li> <li>
<a onclick="ui.hide_actions_popover(); narrow.by_time_travel({{message.id}});"> <a class="popover_narrow_by_time_travel_button" data-msgid="{{message.id}}">
<i class="icon-time"></i> Narrow to messages around this time <i class="icon-time"></i> Narrow to messages around this time
</a> </a>
</li> </li>

View File

@@ -1,6 +1,6 @@
{{! Client-side Mustache template for rendering subscriptions in the "invite user" form.}} {{! Client-side Mustache template for rendering subscriptions in the "invite user" form.}}
<a href="#" onclick="invite.set_all_streams(event, true);">Check all</a> | <a href="#" class="invite_check_all_button">Check all</a> |
<a href="#" onclick="invite.set_all_streams(event, false);">Uncheck all</a> <a href="#" class="invite_uncheck_all_button">Uncheck all</a>
<div id="stream-checkboxes"> <div id="stream-checkboxes">
{{#each streams}} {{#each streams}}
<label class="checkbox"> <label class="checkbox">

View File

@@ -1,6 +1,6 @@
{{! Client-side Mustache template for rendering users in the stream creation modal.}} {{! Client-side Mustache template for rendering users in the stream creation modal.}}
<a href="#" onclick="subs.set_all_users(event, true);">Check all</a> | <a href="#" class="subs_set_all_users">Check all</a> |
<a href="#" onclick="subs.set_all_users(event, false);">Uncheck all</a> <a href="#" class="subs_unset_all_users">Uncheck all</a>
<div id="user-checkboxes"> <div id="user-checkboxes">
{{#each users}} {{#each users}}
<label class="checkbox"> <label class="checkbox">