wikiTicketDescriptionTemplates

Version 4 (modified by huxy, 5年 ago) (diff)

--

Ticket 问题描述模板定义规则

按照下面的格式定义:

  1. 使用== 开头定义模板名字,这个名字会显示在模板选择列表里
  2. 使用{{{、}}}将模板内容包含起来,模板内容可以是任意符合wiki语法的文本
    == 模板名字
    {{{
    模板内容
    }}}
    

补丁申请模板(html)

<!-- html template -->
<style type="text/css">
    #panel textarea {
        margin: 2px;
        height: 85px;
    }
    #panel th {
        width: 100px;
        text-align: right;
        vertical-align: top;
        padding: 0.4em;
    }
    .required-field-label {
        color: red;
        font-size: 0.6em;
    }
</style>
<script type="text/javascript">
    function clearDescriptionCookie() {
        $.cookie("description_panel", "");
    }

    function getDescriptionCookie() {
        return $.cookie("description_panel");
    }

    function setDescriptionCookie(value) {
        $.cookie("description_panel", value);
    }

    function createDescriptionPanel() {
        let template = '<fieldset id="panel">' + $("#panel").html() + "</fieldset>";
        $("#panel").remove();
        let description_element = $("label#field-description-help").parent();
        $(description_element).children().css("display", "none");
        $(description_element).css("display", "");
        $(description_element).prepend(template);
        $("table.trac-properties").css("width", "910px");

        let required_fields = [
            'field-summary', 'field-reporter', 'field-type', 'field-component',
            'field-priority', 'field-severity', 'field-version', 'field-chip'
        ];

        for (let i = 0; i < required_fields.length; i++) {
            let element = $(`label[for='${required_fields[i]}']`);
            if (element.length != 0) {
                let text = element.html().replace(':', '');
                element.html(`${text} <span class="required-field-label">(必填)</span>:`);
            }
            $(`#${required_fields[i]}`).attr("class", "required-field");
        }

        $(".date-picker").datepicker({
            changeMonth: true,
            changeYear: true,
            onClose: function(date_text, picker) {
                let warning_tip = $(this).parent().find("span.empty-warning");
                if (warning_tip.length != 0)
                    warning_tip.remove();
            }
        });
        $(".date-picker").datepicker("option", "dateFormat", "yy-mm-dd");

        if (window.location.href.split(window.location.host)[1] != $("#propertyform").attr("action")) {
            clearDescriptionCookie();
        }

        $("#developer-resolve-date").val("[=#developer-resolve-date]");

        $(".required-field").blur(function(event) {
            let warning_tip = $(event.target).parent().find("span.empty-warning");
            if ($(event.target).val() == "") {
                if (warning_tip.length == 0)
                    $(event.target).parent().append('<span class="required-field-label empty-warning">内容不能为空</span>');
            } else {
                if (warning_tip.length != 0)
                    warning_tip.remove();
            }
        });

        let description_panel = getDescriptionCookie();
        if (description_panel != undefined && description_panel != "") {
            let panel_info = JSON.parse(description_panel);
            $("#panel table label").each(function(index, element) {
                let text_element = $(element).parent().next("td").find("input:text")[0];
                if (text_element == undefined) {
                    text_element = $(element).parent().next("td").find("textarea")[0];
                }
                if ($(text_element).attr("class") != undefined && $(text_element).attr("class").match(/date-picker/) != null)
                    $(text_element).datepicker("setDate", panel_info[index]);
                else
                    $(text_element).val(panel_info[index]);
            });
        }

        function updateDescriptionForServer(event) {
            let found_empty_field = false;
            let required_elements = $(".required-field");
            for (let i = 0; i < required_elements.length; i++) {
                if ($(required_elements.get(i)).val() == "") {
                    found_empty_field = true;
                    break;
                }
            }
            if (found_empty_field) {
                event.preventDefault();
                alert('有必填项为空,请补充');
            }
            let data = populateDescription();
            if (data != null) {
                setDescriptionCookie(data.panel_info);
                $("#field-description").val(data.description);
            }
        }

        $("input:submit[name='preview']").click(function(event) {
            updateDescriptionForServer(event);
        });

        $("input:submit[name='submit']").click(function(event) {
            updateDescriptionForServer(event);
        });
    }

    function populateDescription() {
        let boundary = "|------";

        let panel_info = [];
        let description = "";
        $("#panel tr").each(function(index, element) {
            let labels = $(element).find("th label");
            let row_data = [];
            let title = $(element).attr("title");
            description += "== " + title + "\n";

            if (labels.length == 1) {
                let value = $(element).find("td").children("input:text").val();
                if (value == undefined) {
                    value = $(element).find("td").children("textarea").val();
                }
                if (title == "出错日志")
                    description += "{{{\n" + value + "\n}}}\n";
                else
                    description += value + "\n";
                panel_info.push(value);
            } else {
                let values = $(element).find("td input:text");
                for (let i = 0; i < labels.length; i++) {
                    let input_val = $(values.get(i)).val();
                    description += "- " + $(labels.get(i)).text() + input_val + "\n";
                    panel_info.push(input_val);
                }
            }
            description += boundary + "\n";
        });
        return {panel_info: JSON.stringify(panel_info), description: description};
    }
</script>
<fieldset id="panel">
    <table>
        <tbody>
            <tr title="问题描述">
                <th><label>问题描述 <span class="required-field-label">(必填)</span>:</label></th>
                <td colspan="5"><textarea class="required-field"></textarea></td>
            </tr>
            <tr title="问题场景">
                <th><label>问题场景 <span class="required-field-label">(必填)</span>:</label></th>
                <td colspan="5"><textarea class="required-field"></textarea></td>
            </tr>
            <tr title="复现步骤">
                <th><label>复现步骤 <span class="required-field-label">(必填)</span>:</label></th>
                <td colspan="5"><textarea class="required-field"></textarea></td>
            </tr>
            <tr title="出错日志">
                <th><label>出错日志:</label></th>
                <td colspan="5"><textarea></textarea></td>
            </tr>
            <tr title="初步定位">
                <th><label>初步定位:</label></th>
                <td colspan="5"><textarea></textarea></td>
            </tr>
            <tr title="问题处理时间段">
                <th><label>发现日期 <span class="required-field-label">(必填)</span>:</label></th>
                <td><input type="text" id="issue-occur-date" class="date-picker required-field"></td>
                <th style="width: 130px;"><label>期望解决日期 <span class="required-field-label">(必填)</span>:</label></th>
                <td><input type="text" id="issue-resolve-date" class="date-picker required-field"></td>
                <th style="display: none"><label>开发人员预期解决日期:</label></th>
                <td style="display: none"><input type="text" id="developer-resolve-date"></td>
            </tr>
            <tr title="联系人信息">
                <th style="width: 109px;"><label>沟通联系人:</label></th>
                <td><input type="text"></td>
                <th><label>电话:</label></th>
                <td><input type="text"></td>
                <th style="width: 35px"><label>邮箱:</label></th>
                <td><input type="text" style="width: 160px"></td>
            </tr>
        </tbody>
    </table>
</fieldset>

附件 (1)

Download all attachments as: .zip