Files
zulip/zephyr/static/js/subs.js
Zev Benjamin d980afcf25 Actually convert to JSON instead of hacking it with string concatenation
Old browsers might not have the global JSON object, so we may have to
include something like https://github.com/douglascrockford/JSON-js
for old browsers in the future.

(imported from commit e30a291d1212f2a00b543551b3a77082c7406eec)
2012-11-09 18:08:31 -05:00

154 lines
4.9 KiB
JavaScript

var subs = (function () {
var exports = {};
var stream_set = {};
function case_insensitive_subscription_index(stream_name) {
var i;
var name = stream_name.toLowerCase();
for (i = 1; i < stream_list.length; i++) {
if (name === stream_list[i].toLowerCase()) {
return i;
}
}
return -1;
}
function add_to_stream_list(stream_name) {
var stream_sub_row;
if (!exports.have(stream_name)) {
stream_list.push(stream_name);
stream_set[stream_name.toLowerCase()] = true;
stream_sub_row = $('#subscriptions_table').find('button[value="' + stream_name + '"]');
if (stream_sub_row.length) {
stream_sub_row.text("Unsubscribe")
.removeClass("btn-primary")
.unbind('click');
} else {
$('#subscriptions_table').prepend(templates.subscription({subscription: stream_name}));
}
}
}
function remove_from_stream_list(stream_name) {
delete stream_set[stream_name.toLowerCase()];
var removal_index = case_insensitive_subscription_index(stream_name);
if (removal_index !== -1) {
stream_list.splice(removal_index, 1);
}
}
exports.fetch = function () {
$.ajax({
type: 'POST',
url: '/json/subscriptions/list',
dataType: 'json',
timeout: 10*1000,
success: function (data) {
$('#subscriptions_table tr').remove();
if (data) {
$.each(data.subscriptions, function (index, name) {
$('#subscriptions_table').append(templates.subscription({subscription: name}));
});
}
$('#streams').focus().select();
},
error: function (xhr) {
report_error("Error listing subscriptions", xhr, $("#subscriptions-status"));
}
});
};
exports.subscribe_for_send = function (stream, prompt_button) {
$.ajax({
type: 'POST',
url: '/json/subscriptions/add',
data: {"streams": JSON.stringify([stream]) },
dataType: 'json',
timeout: 10*60*1000, // 10 minutes in ms
success: function (response) {
add_to_stream_list(stream);
compose.finish();
prompt_button.stop(true).fadeOut(500);
},
error: function (xhr, error_type, exn) {
report_error("Unable to subscribe", xhr, $("#home-error"));
}
});
};
exports.have = function (stream_name) {
return (stream_set[stream_name.toLowerCase()] === true);
};
function ajaxSubscribe(streams) {
$.ajax({
type: "POST",
url: "/json/subscriptions/add",
dataType: 'json', // This seems to be ignored. We still get back an xhr.
data: {"streams": JSON.stringify([streams]) },
success: function (resp, statusText, xhr, form) {
if ($("#streams").val() === streams) {
$("#streams").val("");
}
var name, res = $.parseJSON(xhr.responseText);
if (res.subscribed.length === 0) {
name = res.already_subscribed[0];
report_success("Already subscribed to " + name, $("#subscriptions-status"));
} else {
name = res.subscribed[0];
report_success("Successfully added subscription to " + name,
$("#subscriptions-status"));
}
add_to_stream_list(name);
$("#streams").focus();
},
error: function (xhr) {
report_error("Error adding subscription", xhr, $("#subscriptions-status"));
$("#streams").focus();
}
});
}
$(function () {
var i;
// Populate stream_set with data handed over to client-side template.
for (i = 0; i < stream_list.length; i++) {
stream_set[stream_list[i].toLowerCase()] = true;
}
// FIXME: It would be nice to move the UI setup into ui.js.
$("#current_subscriptions").ajaxForm({
dataType: 'json', // This seems to be ignored. We still get back an xhr.
success: function (resp, statusText, xhr, form) {
var name = $.parseJSON(xhr.responseText).data;
$('#subscriptions_table').find('button[value="' + name + '"]').text("Subscribe")
.addClass("btn-primary")
.click(function (e) {
e.preventDefault();
ajaxSubscribe(name);
});
remove_from_stream_list(name);
composebox_typeahead.update_autocomplete();
report_success("Successfully removed subscription to " + name,
$("#subscriptions-status"));
},
error: function (xhr) {
report_error("Error removing subscription", xhr, $("#subscriptions-status"));
}
});
$("#add_new_subscription").on("submit", function (e) {
e.preventDefault();
ajaxSubscribe($("#streams").val());
});
});
return exports;
}());