tobyqin/testcube

View on GitHub
testcube/static/modules/case-detail.js

Summary

Maintainability
A
3 hrs
Test Coverage
define(['jquery', './table-support', 'bloodhound', './utils', 'typeahead', 'bootstrapTagsInput'],
    function ($, support, Bloodhound, utils) {

        "use strict";
        let f = support.formatter;

        let caseDetailColumns = [
            {title: 'ID', field: 'id'},
            {title: 'Team', field: 'team_name'},
            {title: 'Product', field: 'product.name'},
            {title: 'Name', field: 'name'},
            {title: 'FullName', field: 'full_name'},
            {title: 'Keyword', field: 'keyword'},
            {title: 'Priority', field: 'priority'},
            {title: 'Description', field: 'description'},
            {title: 'Created On', field: 'created_on', formatter: f.timeFormatter},
            {title: 'Update On', field: 'updated_on', formatter: f.timeFormatter},
            {title: 'Created By', field: 'created_by'},
            {title: 'Owner', field: 'owner'}
        ];

        let caseHistoryColumns = [
            {title: 'ID', field: 'id', formatter: f.resultIdFormatter},
            {title: 'TestCase', field: 'testcase_info.name'},
            {title: 'Run On', field: 'run_info.start_time', formatter: f.timeFormatter},
            {title: 'Duration', field: 'duration', formatter: f.durationFormatter},
            {title: 'Error Message', field: 'error_message'},
            {title: 'Client', field: 'test_client.name'},
            {title: 'Outcome', field: 'get_outcome_display', formatter: f.outcomeFormatter}
        ];

        function resultHistoryTableDataHandler(data) {
            window.app.resultHistory = data;
            for (let r of data.results) {
                r.error_message = utils.safeMessage(r.error_message);
            }
            return data.results;
        }

        function caseDetailSummaryDataHandler(data) {
            window.app.caseInfo = data;
            return [data];
        }

        function caseDetailSummaryTablePostEvent(data) {
            if (data[0] === undefined) return;
            let testcase = data[0];
            let nav = `${testcase.id} - ${testcase.name}`;
            $('#case-nav').empty().append(nav);

            for (let tags of testcase.tags_list.split(':')) {
                $('#tc-tags').tagsinput('add', tags);
            }

            caseTagsEvent(testcase.id);
            enableTypeAhead(testcase.product.id);
            loadingCompleted();
        }

        function enableTypeAhead(productId) {
            $.getJSON('/api/products/' + productId + '/tags/', function (data) {
                let tags = new Bloodhound({
                    datumTokenizer: Bloodhound.tokenizers.whitespace,
                    queryTokenizer: Bloodhound.tokenizers.whitespace,
                    local: data
                });

                $('input').typeahead(null, {
                    name: 'tags',
                    source: tags
                });
            });
        }

        function caseTagsEvent(id) {
            function tagsAction(event, data) {
                $.ajax({
                    url: '/api/cases/' + id + '/tags/',
                    type: 'post',
                    dataType: 'application/json',
                    data: data,
                    async: false,
                    complete: function (xhr) {
                        if (xhr.status !== 200) {
                            console.error(xhr.responseText);
                            event.cancel = true;
                            require(['bootstrap-dialog'], function (BootstrapDialog) {
                                BootstrapDialog.alert({
                                    type: BootstrapDialog.TYPE_WARNING,
                                    message: xhr.responseText
                                });
                            });
                        }
                    }
                });
            }

            let data = $('form').serialize();
            $('#tc-tags').on('beforeItemAdd', function (event) {
                let tagName = event.item;
                data += "&method=add&tags=" + tagName;
                tagsAction(event, data);

            }).on('beforeItemRemove', function (event) {
                let tagName = event.item;
                data += "&method=remove&tags=" + tagName;
                tagsAction(event, data);
            });
        }

        function renderCaseDetailTable(caseId) {
            $('#case-summary').bootstrapTable({
                url: `/api/cases/${caseId}/info/`,
                responseHandler: caseDetailSummaryDataHandler,
                search: false,
                pagination: false,
                sortable: true,
                cardView: true,
                showFooter: false,
                columns: caseDetailColumns,
                onPostBody: caseDetailSummaryTablePostEvent
            });

            $('#case-history').bootstrapTable({
                sidePagination: 'client',
                url: `/api/cases/${caseId}/history/`,
                responseHandler: resultHistoryTableDataHandler,
                search: false,
                pagination: false,
                showFooter: false,
                columns: caseHistoryColumns,
                onPostBody: undefined
            });
        }

        return {
            renderCaseDetailTable: renderCaseDetailTable
        };

    });