mirror of
https://github.com/zulip/zulip.git
synced 2025-11-03 13:33:24 +00:00
Show the new bot's default stream settings in the edit view
(imported from commit d6f1872e0dedd57ebde31da2caf075804195dfb0)
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user