TicketDescriptionTemplates 的 版本 8 与 版本 9 间的差异
- 时间戳:
- 2020-03-10T10:18:30+08:00 (5年 前)
图例:
- 未修改
- 增加
- 删除
- 修改
-
TicketDescriptionTemplates
v8 v9 44 44 } 45 45 #properties table.trac-properties > tbody > tr > th, #properties table.trac-properties > colgroup > col.th { 46 width: 12 %;46 width: 12.5%; 47 47 } 48 48 #propertyform table.trac-properties td input[type="text"], #propertyform table.trac-properties td textarea { … … 54 54 </style> 55 55 <script type="text/javascript"> 56 String.prototype.replaceAll = function(exp, newStr) { 57 return this.replace(new RegExp(exp, "gm"), newStr); 58 } 59 60 String.prototype.format = function(args) { 61 var result = this; 62 if (arguments.length < 1) 63 return result; 64 65 var data = arguments; 66 if (arguments.length == 1 && typeof(args) == "object") 67 data = args; 68 69 for (var key in data) { 70 var value = data[key]; 71 if (undefined != value) 72 result = result.replaceAll("\\{" + key + "\\}", value); 73 } 74 return result; 75 } 76 56 77 function clearDescriptionCookie() { 57 78 $.cookie("description_panel", ""); … … 67 88 68 89 function createDescriptionPanel() { 69 let template = $("#panel tbody").html(); 90 function updateDescriptionForServer(event) { 91 var found_empty_field = false; 92 var required_elements = $(".required-field"); 93 for (var i = 0; i < required_elements.length; i++) { 94 if ($(required_elements.get(i)).val() == "") { 95 found_empty_field = true; 96 break; 97 } 98 } 99 if (found_empty_field) { 100 event.preventDefault(); 101 alert('有必填项为空,请补充。带 * 的为必填项。'); 102 } 103 var data = populateDescription(); 104 if (data != null) { 105 setDescriptionCookie(data.panel_info); 106 $("#field-description").val(data.description); 107 } 108 } 109 110 if (/msie/.test(navigator.userAgent.toLowerCase())) { 111 $("#content").prepend('<div id="browser-warning" class="system-message">检测到浏览器为 IE,由于 IE 浏览器兼容性不好,请使用 Chrome 或 Firefox 浏览器</div>'); 112 $("#browser-warning").css("background-color", "#ffb"); 113 $("#browser-warning").css("border", "1px solid #500"); 114 $("input:submit[name='preview']").remove(); 115 $("input:submit[name='submit']").remove(); 116 } else { 117 $("input:submit[name='preview']").click(function(event) { 118 updateDescriptionForServer(event); 119 }); 120 121 $("input:submit[name='submit']").click(function(event) { 122 updateDescriptionForServer(event); 123 }); 124 } 125 126 var template = $("#panel tbody").html(); 70 127 $("#panel").remove(); 71 letdescription_row = $("label#field-description-help").parent().parent();128 var description_row = $("label#field-description-help").parent().parent(); 72 129 description_row.css("display", "none"); 73 130 description_row.before(template); … … 76 133 $("#properties table th").css("vertical-align", "super"); 77 134 78 letrequired_fields = [135 var required_fields = [ 79 136 'field-summary', 'field-reporter', 'field-type', 'field-component', 80 137 'field-priority', 'field-severity', 'field-version', 'field-chip' 81 138 ]; 82 139 83 for ( leti = 0; i < required_fields.length; i++) {84 let element = $(`label[for='${required_fields[i]}']`);140 for (var i = 0; i < required_fields.length; i++) { 141 var element = $("label[for='{0}']".format(required_fields[i])); 85 142 if (element.length != 0) { 86 lettext = element.html().replace(':', '');87 element.html( `${text} <span class="required-field-label">*</span>:`);88 } 89 $( `#${required_fields[i]}`).attr("class", "required-field");143 var text = element.html().replace(':', ''); 144 element.html('{label} <span class="required-field-label">*</span>:'.format({label: text})); 145 } 146 $('#{0}'.format(required_fields[i])).attr("class", "required-field"); 90 147 } 91 148 … … 94 151 changeYear: true, 95 152 onClose: function(date_text, picker) { 96 letwarning_tip = $(this).parent().find("span.empty-warning");153 var warning_tip = $(this).parent().find("span.empty-warning"); 97 154 if (warning_tip.length != 0) 98 155 warning_tip.remove(); … … 108 165 109 166 $(".required-field").blur(function(event) { 110 letwarning_tip = $(event.target).parent().find("span.empty-warning");167 var warning_tip = $(event.target).parent().find("span.empty-warning"); 111 168 if ($(event.target).val() == "") { 112 169 if (warning_tip.length == 0) … … 118 175 }); 119 176 120 letdescription_panel = getDescriptionCookie();177 var description_panel = getDescriptionCookie(); 121 178 if (description_panel != undefined && description_panel != "") { 122 letpanel_info = JSON.parse(description_panel);179 var panel_info = JSON.parse(description_panel); 123 180 $(".panel-row label").each(function(index, element) { 124 lettext_element = $(element).parent().next("td").find("input:text")[0];181 var text_element = $(element).parent().next("td").find("input:text")[0]; 125 182 if (text_element == undefined) { 126 183 text_element = $(element).parent().next("td").find("textarea")[0]; … … 132 189 }); 133 190 } 134 135 function updateDescriptionForServer(event) {136 let found_empty_field = false;137 let required_elements = $(".required-field");138 for (let i = 0; i < required_elements.length; i++) {139 if ($(required_elements.get(i)).val() == "") {140 found_empty_field = true;141 break;142 }143 }144 if (found_empty_field) {145 event.preventDefault();146 alert('有必填项为空,请补充。带 * 的为必填项。');147 }148 let data = populateDescription();149 if (data != null) {150 setDescriptionCookie(data.panel_info);151 $("#field-description").val(data.description);152 }153 }154 155 $("input:submit[name='preview']").click(function(event) {156 updateDescriptionForServer(event);157 });158 159 $("input:submit[name='submit']").click(function(event) {160 updateDescriptionForServer(event);161 });162 191 } 163 192 164 193 function populateDescription() { 165 letboundary = "|------";166 167 letpanel_info = [];168 letdescription = "";169 letexchange_tags = []194 var boundary = "|------"; 195 196 var panel_info = []; 197 var description = ""; 198 var exchange_tags = [] 170 199 $(".panel-row").each(function(index, element) { 171 letlabels = $(element).find("th label");172 letrow_data = [];173 lettitle = $(element).attr("title");200 var labels = $(element).find("th label"); 201 var row_data = []; 202 var title = $(element).attr("title"); 174 203 description += "== " + title + "\n"; 175 204 176 205 if (labels.length == 1) { 177 letvalue = $(element).find("td").children("input:text").val();206 var value = $(element).find("td").children("input:text").val(); 178 207 if (value == undefined) { 179 208 value = $(element).find("td").children("textarea").val(); … … 185 214 panel_info.push(value); 186 215 } else { 187 letvalues = $(element).find("td input:text");188 for ( leti = 0; i < labels.length; i++) {189 letlabel_name = $(labels.get(i)).text();216 var values = $(element).find("td input:text"); 217 for (var i = 0; i < labels.length; i++) { 218 var label_name = $(labels.get(i)).text(); 190 219 label_name = label_name.replace(/\s*\*/, ''); 191 letinput_val = $(values.get(i)).val();192 letlabel_class = $(labels.get(i)).attr("class");193 lettag = null;220 var input_val = $(values.get(i)).val(); 221 var label_class = $(labels.get(i)).attr("class"); 222 var tag = null; 194 223 if (label_class != undefined) { 195 letmatched = label_class.match(/exchange-\d+/);224 var matched = label_class.match(/exchange-\d+/); 196 225 if (matched != null) { 197 226 tag = matched[0]; … … 200 229 } 201 230 if (tag != null) 202 description += `- <${tag}>${label_name}${input_val}</${tag}>\n`;231 description += '- <{tag}>{label_name}{input_val}</{tag}>\n'.format({tag:tag, label_name:label_name, input_val:input_val}); 203 232 else 204 description += `- ${label_name}${input_val}\n`;233 description += '- {label_name}{input_val}\n'.format({label_name:label_name, input_val:input_val}); 205 234 panel_info.push(input_val); 206 235 } … … 209 238 }); 210 239 211 for ( leti = 0; i < exchange_tags.length; i++) {212 lettag = exchange_tags[i];213 let tag_pattern = new RegExp(`<${tag}>.*</${tag}>`, 'g');214 let content_pattern = new RegExp(`<${tag}>(.*)</${tag}>`);215 letmatched = description.match(tag_pattern);240 for (var i = 0; i < exchange_tags.length; i++) { 241 var tag = exchange_tags[i]; 242 var tag_pattern = new RegExp('<{tag}>.*</{tag}>'.format({tag:tag}), 'g'); 243 var content_pattern = new RegExp('<{tag}>(.*)</{tag}>'.format({tag:tag})); 244 var matched = description.match(tag_pattern); 216 245 if (matched != null) { 217 246 description = description.replace(matched[0], matched[1].match(content_pattern)[1]); … … 257 286 <th><label>电话 <span class="required-field-label">*</span>:</label></th> 258 287 <td><input type="text" class="required-field"></td> 259 <th style="width: 28px"><label>邮箱:</label></th>288 <th style="width: 30px"><label>邮箱:</label></th> 260 289 <td><input type="text" style="width: 96%;"></td> 261 290 </tr>