mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +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