Show the new bot's default stream settings in the edit view

(imported from commit d6f1872e0dedd57ebde31da2caf075804195dfb0)
This commit is contained in:
Jason Michalski
2014-02-19 10:07:28 -05:00
parent eb1032c9c2
commit eebbf0d4ee
4 changed files with 153 additions and 52 deletions

View File

@@ -1,18 +1,66 @@
var settings = (function () {
var exports = {};
var _streams_defered = $.Deferred();
var streams = _streams_defered.promise(); // promise to the full stream list
var streams = [];
function build_stream_list($select, extra_options) {
if (extra_options === undefined) {
extra_options = [];
}
function add_bot_row(name, email, avatar_url, api_key) {
var info = {
name: name,
email: email,
avatar_url: avatar_url,
api_key: api_key
};
streams.done(function (stream_list) {
var option_list = extra_options;
var stream_names = _.pluck(stream_list, 'name');
option_list.push.apply(option_list, _.zip(stream_names, stream_names));
$select.empty();
_.each(option_list, function (option) {
$select.append($('<option>')
.attr('value', option[0])
.text(option[1])
);
});
});
}
function add_bot_row(info) {
info.id_suffix = _.uniqueId('_bot_');
var row = $(templates.render('bot_avatar_row', info));
var default_sending_stream_select = row.find('select[name=bot_default_sending_stream]');
var default_events_register_stream_select = row.find('select[name=bot_default_events_register_stream]');
if (!feature_flags.new_bot_ui) {
row.find('.new-bot-ui').hide();
}
var to_extra_options = [];
if (info.default_sending_stream === null) {
to_extra_options.push(['', 'No default selected']);
}
build_stream_list(
default_sending_stream_select,
to_extra_options
);
default_sending_stream_select.val(
info.default_sending_stream,
to_extra_options
);
var events_extra_options = [['__all_public__', 'All public streams']];
if (info.default_events_register_stream === null && !info.default_all_public_streams) {
events_extra_options.unshift(['', 'No default selected']);
}
build_stream_list(
default_events_register_stream_select,
events_extra_options
);
if (info.default_all_public_streams) {
default_events_register_stream_select.val('__all_public__');
} else {
default_events_register_stream_select.val(info.default_events_register_stream);
}
$('#bots_list').append(row);
$('#bots_list').show();
}
@@ -22,28 +70,30 @@ function is_local_part(value, element) {
return this.optional(element) || /^[\-!#$%&'*+\/=?\^_`{}|~0-9A-Z]+(\.[\-!#$%&'*+\/=?\^_`{}|~0-9A-Z]+)*$/i.test(value);
}
function build_stream_list($select, extra_options) {
if (extra_options === undefined) {
extra_options = [];
}
var option_list = extra_options;
var stream_names = _.pluck(streams, 'name');
option_list.push.apply(option_list, _.zip(stream_names, stream_names));
$select.empty();
_.each(option_list, function (option) {
$select.append($('<option>')
.attr('value', option[0])
.text(option[1])
);
});
}
// Choose avatar stamp fairly randomly, to help get old avatars out of cache.
exports.avatar_stamp = Math.floor(Math.random()*100);
exports.setup_page = function () {
// To build the edit bot streams dropdown we need both the bot and stream
// API results. To prevent a race streams will be initialized to a promise
// at page load. This promise will be resolved with a list of streams after
// the first settings page load. build_stream_list then adds a callback to
// the promise, which in most cases will already be resolved.
if (!_streams_defered.isResolved()) {
channel.get({
url: '/json/streams',
success: function (data) {
_streams_defered.resolve(data.streams);
build_stream_list($('#create_bot_default_sending_stream'));
build_stream_list(
$('#create_bot_default_events_register_stream'),
[['__all_public__', 'All public streams']]
);
}
});
}
var settings_tab = templates.render('settings_tab', {page_params: page_params});
$("#settings").html(settings_tab);
$("#settings-status").hide();
@@ -65,18 +115,6 @@ exports.setup_page = function () {
clear_password_change();
channel.get({
url: '/json/streams',
success: function (data) {
streams = data.streams;
build_stream_list($('#create_bot_default_sending_stream'));
build_stream_list(
$('#create_bot_default_events_register_stream'),
[['__all_public__', 'All public streams']]
);
}
});
$('#api_key_button').click(function (e) {
if (page_params.password_auth_enabled !== false) {
$("#get_api_key_box").show();
@@ -373,7 +411,15 @@ exports.setup_page = function () {
$('#bot_table_error').hide();
_.each(data.bots, function (elem) {
add_bot_row(elem.full_name, elem.username, elem.avatar_url, elem.api_key);
add_bot_row({
name: elem.full_name,
email: elem.username,
avatar_url: elem.avatar_url,
api_key: elem.api_key,
default_sending_stream: elem.default_sending_stream,
default_events_register_stream: elem.default_events_register_stream,
default_all_public_streams: elem.default_all_public_streams
});
});
},
error: function (xhr, error_type, xhn) {
@@ -434,12 +480,15 @@ exports.setup_page = function () {
$('#create_bot_button').show();
create_avatar_widget.clear();
add_bot_row(
full_name,
short_name + "-bot@" + page_params.domain,
data.avatar_url,
data.api_key
);
add_bot_row({
name: full_name,
email: short_name + "-bot@" + page_params.domain,
avatar_url: data.avatar_url,
api_key: data.api_key,
default_sending_stream: data.default_sending_stream,
default_events_register_stream: data.default_events_register_stream,
default_all_public_streams: data.default_all_public_streams
});
},
error: function (xhr, error_type, exn) {
$('#bot_table_error').text(JSON.parse(xhr.responseText).msg).show();

View File

@@ -27,7 +27,7 @@
<i class="icon-vector-trash"></i>
</button>
</div>
<div id="bot_delete_error" class="alert alert-error hide"></div>
<div id="bot_delete_error{{id_suffix}}" class="alert alert-error hide"></div>
</div>
<div class='edit_bot'>
<form class="edit_bot_form form-horizontal" data-email="{{email}}">
@@ -35,21 +35,29 @@
<div class="edit_bot_email">{{email}}</div>
<div class="edit-bot-form-box">
<div class="control-group">
<label for="edit_bot_name" class="control-label">Full name</label>
<label for="edit_bot_name{{id_suffix}}" class="control-label">Full name</label>
<div class="controls">
<input type="text" name="bot_name" class="edit_bot_name required" maxlength=50 />
<div><label for="edit_bot_name" generated="true" class="text-error"></label></div>
<input type="text" name="bot_name" id="edit_bot_name{{id_suffix}}" class="edit_bot_name required" maxlength=50 />
<div><label for="edit_bot_name{{id_suffix}}" generated="true" class="text-error"></label></div>
</div>
</div>
<div class="control-group new-bot-ui">
<label for="edit_bot_default_sending_stream{{id_suffix}}" class="control-label">Send to stream</label>
<select name="bot_default_sending_stream" class="edit_bot_default_sending_stream" id="edit_bot_default_sending_stream{{id_suffix}}"></select>
</div>
<div class="control-group new-bot-ui">
<label for="edit_bot_default_events_register_stream{{id_suffix}}" class="control-label">Listen on</label>
<select name="bot_default_events_register_stream" class="edit_bot_default_events_register_stream" id="edit_bot_default_events_register_stream{{id_suffix}}"></select>
</div>
<div class="control-group">
<label for="bot_avatar_file_input" class="control-label">Avatar</label>
<input type="file" name="bot_avatar_file_input" class="notvisible edit_bot_avatar_file_input" value="Upload avatar" />
<label for="bot_avatar_file_input{{id_suffix}}" class="control-label">Avatar</label>
<input type="file" id="bot_avatar_file_input{{id_suffix}}" name="bot_avatar_file_input" class="notvisible edit_bot_avatar_file_input" value="Upload avatar" />
<div class="controls">
<div class="edit_bot_avatar_file"></div>
<button type="button" class="btn edit_bot_avatar_upload_button">Choose avatar</button>
<button type="button" class="btn edit_bot_avatar_clear_button">Clear avatar</button>
</div>
<div><label for="edit_bot_avatar_file" generated="true" class="edit_bot_avatar_error text-error"></label></div>
<div><label for="edit_bot_avatar_file{{id_suffix}}" generated="true" class="edit_bot_avatar_error text-error"></label></div>
</div>
<div class="control-group">
<div class="controls">

View File

@@ -149,6 +149,12 @@ exports.get_rendered_messages = function (table) {
});
};
exports.get_form_field_value = function (selector) {
return casper.evaluate(function (selector) {
return $(selector).val();
}, selector);
};
// Inject key presses by running some jQuery code in page context.
// PhantomJS and CasperJS don't provide a clean way to insert key
// presses by code, only strings of printable characters.

View File

@@ -60,6 +60,44 @@ casper.waitUntilVisible('#settings-status', function () {
casper.test.assertSelectorHasText('#settings-status', 'Updated settings!');
});
casper.then(function create_bot() {
casper.test.info('Filling out the create bot form');
casper.fill('#create_bot_form',{
bot_name: 'Bot 1',
bot_short_name: '1',
bot_default_sending_stream: 'Denmark',
bot_default_events_register_stream: 'Rome'
});
casper.test.info('Submiting the create bot form');
casper.click('#create_bot_button');
});
casper.waitUntilVisible('.open_edit_bot_form', function open_edit_bot_form() {
casper.test.info('Opening edit bot form');
casper.click('.open_edit_bot_form');
});
casper.waitUntilVisible('.edit_bot_form', function test_edit_bot_forn_values() {
var form_sel = 'form[data-email="1-bot@zulip.com"]';
casper.test.info('Testing edit bot form values');
casper.test.assertEqual(
common.get_form_field_value(form_sel + ' [name=bot_name]'),
'Bot 1'
);
casper.test.assertEqual(
common.get_form_field_value(form_sel + ' [name=bot_default_sending_stream]'),
'Denmark'
);
casper.test.assertEqual(
common.get_form_field_value(form_sel + ' [name=bot_default_events_register_stream]'),
'Rome'
);
});
// TODO: test the "Declare Zulip Bankruptcy option"
common.then_log_out();