зеркало из https://github.com/mozilla/pjs.git
- adding missing template files for testcase management
This commit is contained in:
Родитель
2830dc886b
Коммит
034d3ccfa4
|
@ -0,0 +1,159 @@
|
|||
[%# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# The Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
#%]
|
||||
|
||||
[%# INTERFACE:
|
||||
# $testcase - the testcase object to show
|
||||
#%]
|
||||
|
||||
[% INCLUDE test/formattingHelp.js.tmpl %]
|
||||
|
||||
<script type="text/javascript">
|
||||
function checkFormContents(f) {
|
||||
return (
|
||||
checkString(f.editform_summary, 'Summary') &&
|
||||
verifySelected(f.product, 'Product') &&
|
||||
verifySelected(f.subgroup, 'Subgroup') &&
|
||||
verifySelected(f.editform_author_id, 'Author')
|
||||
);
|
||||
}
|
||||
</script>
|
||||
|
||||
<form id="edit_testcase_form" name="edit_testcase_form" method="post" action="manage_testcases.cgi" onSubmit="return checkFormContents(this);">
|
||||
<input id="editform_mode" name="editform_mode" type="hidden" value="edit">
|
||||
<input id="editform_testcase_id" name="editform_testcase_id" type="hidden" value="">
|
||||
|
||||
<table class="edit-testcase">
|
||||
<tr>
|
||||
<td class="headerleft">Testcase ID#:</td>
|
||||
<td name="editform_testcase_id_display" id="editform_testcase_id_display"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Summary:</td>
|
||||
<td><input name="editform_summary"
|
||||
id="editform_summary"
|
||||
value=""
|
||||
size="35"/ disabled></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td width="50%" class="headerleft">Steps to Perform:<br/>
|
||||
<textarea name="editform_steps"
|
||||
id="editform_steps"
|
||||
rows="10" cols="40" disabled></textarea>
|
||||
</td>
|
||||
<td width="50%" class="headerleft">Expected Results:<br/>
|
||||
<textarea name="editform_results"
|
||||
id="editform_results"
|
||||
rows="10" cols="40" disabled></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">⇑ <a name="showFormattingHelp" onclick="toggleHelp(formattingHelpTitle,formattingHelpText);">Formatting Help</a> | ⇑ <a name="stepsPreview" onClick="var newwin = window.open('preview.cgi?preview=' + escape(document.getElementById('editform_steps').value),'preview_window','height=400,width=400,resizeable=yes,scrollable=yes');newwin.focus();">Preview</a></td>
|
||||
<td align="right">⇑ <a name="showFormattingHelp" onclick="toggleHelp(formattingHelpTitle,formattingHelpText);">Formatting Help</a> | ⇑ <a name="resultsPreview" onClick="var newwin = window.open('preview.cgi?preview=' + escape(document.getElementById('editform_results').value),'preview_window','height=400,width=400,resizeable=yes,scrollable=yes');newwin.focus();">Preview</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="headerleft">Product:</td>
|
||||
<td>[% INCLUDE productbox %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Test Group(s):</td>
|
||||
<td>[% INCLUDE testgroupbox %]</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Subgroup(s):</td>
|
||||
<td>[% INCLUDE subgroupbox %]</td>
|
||||
</tr>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Enabled?</td>
|
||||
<td>
|
||||
<input name="editform_enabled"
|
||||
type="checkbox"
|
||||
id="editform_enabled"
|
||||
value="1" disabled
|
||||
onChange="if (this.checked == false) {document.getElementById('editform_communityenabled').checked =false;}">
|
||||
</td>
|
||||
<td>⇐ Uncheck this to completely disable this testcase.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Community Enabled?</td>
|
||||
<td>
|
||||
<input name="editform_communityenabled"
|
||||
type="checkbox"
|
||||
id="editform_communityenabled"
|
||||
value="1" disabled
|
||||
onChange="if (this.checked == true) {document.getElementById('editform_enabled').checked =true;}">
|
||||
</td>
|
||||
<td>⇐ Uncheck this to disable this testcase for the community-at-large.<br/>Note: trusted testers will stlil be able to see and run this testcase.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Regression Bug ID#:</td>
|
||||
<td><input name="editform_regression_bug_id"
|
||||
type="text"
|
||||
id="editform_regression_bug_id"
|
||||
value="" disabled>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Author:</td>
|
||||
<td>[% INCLUDE form_widgets/select_author.tmpl name="editform_author_id" disabled=1 placeholder=1 %]
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Creation Date:</td>
|
||||
<td name="editform_creation_date" id="editform_creation_date"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Last Updated:</td>
|
||||
<td name="editform_last_updated" id="editform_last_updated"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Litmus Version:</td>
|
||||
<td name="editform_litmus_version" id="editform_litmus_version"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Testrunner Case ID#:</td>
|
||||
<td name="editform_testrunner_case_id" id="editform_testrunner_case_id"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="headerleft">Testrunner Case Version:</td>
|
||||
<td name="editform_testrunner_case_version" id="editform_testrunner_case_version"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3" align="right"><input id="editform_reset" class="button" type="button" value="Reset" disabled /> <input class="button" type="submit" id="editform_submit" name="editform_submit" value="Submit Edits" disabled /></div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</form>
|
|
@ -0,0 +1,322 @@
|
|||
[%# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# The Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
#%]
|
||||
|
||||
[% PROCESS global/selects.none.tmpl %]
|
||||
|
||||
[% includeselects=1 %]
|
||||
[% INCLUDE global/html_header.tmpl js_files=['js/prototype.lite.js','js/moo.fx.js','js/moo.fx.pack.js','js/FormValidation.js','js/Mochikit/Mochikit.js','js/json.js','js/Help.js','js/SelectBoxes.js'] %]
|
||||
[% INCLUDE global/litmus_header.tmpl %]
|
||||
|
||||
<script type="text/javascript">
|
||||
var d;
|
||||
var testcase;
|
||||
|
||||
function changeSelectedValue(selectid, optionvalue) {
|
||||
var em = document.getElementById(selectid)
|
||||
var options = em.getElementsByTagName('option');
|
||||
var found = 0;
|
||||
for (var i=0; i<options.length; i++) {
|
||||
if (options[i].value == optionvalue) {
|
||||
options[i].selected = true;
|
||||
found=1;
|
||||
} else {
|
||||
options[i].selected = false;
|
||||
}
|
||||
}
|
||||
if (found == 0) {
|
||||
options[0].selected = true;
|
||||
}
|
||||
}
|
||||
|
||||
function setAuthor(user_id) {
|
||||
changeSelectedValue('editform_author_id',user_id);;
|
||||
}
|
||||
|
||||
function enableForm(formid) {
|
||||
var f = document.getElementById(formid);
|
||||
var ems = f.getElementsByTagName('input');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=false;
|
||||
}
|
||||
ems = f.getElementsByTagName('select');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=false;
|
||||
}
|
||||
ems = f.getElementsByTagName('textarea');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=false;
|
||||
}
|
||||
}
|
||||
|
||||
function disableForm(formid) {
|
||||
var f = document.getElementById(formid);
|
||||
var ems = f.getElementsByTagName('input');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=true;
|
||||
}
|
||||
ems = f.getElementsByTagName('select');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=true;
|
||||
}
|
||||
ems = f.getElementsByTagName('textarea');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=true;
|
||||
}
|
||||
}
|
||||
|
||||
function enableModeButtons() {
|
||||
document.getElementById("edit_testcase_button").disabled=false;
|
||||
document.getElementById("clone_testcase_button").disabled=false;
|
||||
document.getElementById("delete_testcase_button").disabled=false;
|
||||
}
|
||||
|
||||
function disableModeButtons() {
|
||||
document.getElementById("edit_testcase_button").disabled=true;
|
||||
document.getElementById("clone_testcase_button").disabled=true;
|
||||
document.getElementById("delete_testcase_button").disabled=true;
|
||||
}
|
||||
|
||||
function loadTestcase() {
|
||||
var testcase_select = document.getElementById("testcase_id");
|
||||
|
||||
if (! testcase_select ||
|
||||
testcase_select.options[testcase_select.selectedIndex].value=="") {
|
||||
disableModeButtons();
|
||||
disableForm('edit_testcase_form');
|
||||
blankForm('edit_testcase_form');
|
||||
return false;
|
||||
}
|
||||
|
||||
var testcase_id = testcase_select.options[testcase_select.selectedIndex].value;
|
||||
|
||||
disableForm('edit_testcase_form');
|
||||
var url = 'json.cgi?testcase_id=' + testcase_id;
|
||||
var d = loadJSONDoc(url);
|
||||
d.addBoth(function (res) {
|
||||
d.deferred = null;
|
||||
return res;
|
||||
});
|
||||
d.addCallback(populateTestcase);
|
||||
// if anything goes wrong, except for a simple cancellation,
|
||||
// then log the error and show the logger
|
||||
d.addErrback(function (err) {
|
||||
if (err instanceof CancelledError) {
|
||||
return;
|
||||
}
|
||||
logError(err);
|
||||
logger.debuggingBookmarklet();
|
||||
});
|
||||
}
|
||||
|
||||
function populateTestcase(data) {
|
||||
testcase=data;
|
||||
document.getElementById('editform_testcase_id').value = testcase.testcase_id;
|
||||
document.getElementById('editform_testcase_id_display').innerHTML = testcase.testcase_id;
|
||||
document.getElementById('editform_summary').value = testcase.summary;
|
||||
document.getElementById('editform_steps').value = testcase.steps;
|
||||
document.getElementById('editform_results').value = testcase.expected_results;
|
||||
var product_box = document.getElementById('product');
|
||||
var options = product_box.getElementsByTagName('option');
|
||||
var found_product = 0;
|
||||
for (var i=0; i<options.length; i++) {
|
||||
if (options[i].value == testcase.product_id.product_id) {
|
||||
options[i].selected = true;
|
||||
found_product=1;
|
||||
} else {
|
||||
options[i].selected = false;
|
||||
}
|
||||
}
|
||||
if (found_product == 0) {
|
||||
options[0].selected = true;
|
||||
}
|
||||
changeProduct();
|
||||
var found_testgroup = 0;
|
||||
if (testcase.testgroups[0]) {
|
||||
var testgroup_box = document.getElementById('testgroup');
|
||||
options = testgroup_box.getElementsByTagName('option');
|
||||
for (var i=0; i<options.length; i++) {
|
||||
if (options[i].value == testcase.testgroups[0].testgroup_id) {
|
||||
options[i].selected = true;
|
||||
found_testgroup=1;
|
||||
} else {
|
||||
options[i].selected = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (found_testgroup == 0) {
|
||||
options[0].selected = true;
|
||||
}
|
||||
changeTestgroup();
|
||||
var found_subgroup = 0;
|
||||
if (testcase.subgroups[0]) {
|
||||
var subgroup_box = document.getElementById('subgroup');
|
||||
options = subgroup_box.getElementsByTagName('option');
|
||||
for (var i=0; i<options.length; i++) {
|
||||
if (options[i].value == testcase.subgroups[0].subgroup_id) {
|
||||
options[i].selected = true;
|
||||
found_subgroup=1;
|
||||
} else {
|
||||
options[i].selected = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (found_subgroup == 0) {
|
||||
options[0].selected = true;
|
||||
}
|
||||
var enabled_em = document.getElementById('editform_enabled')
|
||||
if (testcase.enabled == 1) {
|
||||
enabled_em.checked = true;
|
||||
} else {
|
||||
enabled_em.checked = false;
|
||||
}
|
||||
var communityenabled_em = document.getElementById('editform_communityenabled')
|
||||
if (testcase.community_enabled == 1) {
|
||||
communityenabled_em.checked = true;
|
||||
} else {
|
||||
communityenabled_em.checked = false;
|
||||
}
|
||||
if (testcase.regression_bug_id) {
|
||||
document.getElementById('editform_regression_bug_id').value = testcase.regression_bug_id;
|
||||
}
|
||||
setAuthor(testcase.author_id.user_id);
|
||||
document.getElementById('editform_creation_date').innerHTML = testcase.creation_date;
|
||||
document.getElementById('editform_last_updated').innerHTML = testcase.last_updated;
|
||||
document.getElementById('editform_litmus_version').innerHTML = testcase.version;
|
||||
document.getElementById('editform_testrunner_case_id').innerHTML = testcase.testrunner_case_id;
|
||||
document.getElementById('editform_testrunner_case_version').innerHTML = testcase.testrunner_case_version;
|
||||
|
||||
enableModeButtons();
|
||||
}
|
||||
|
||||
function blankForm(formid) {
|
||||
var f = document.getElementById(formid);
|
||||
var ems = f.getElementsByTagName('input');
|
||||
for (var i in ems) {
|
||||
if (ems[i].type == 'submit' ||
|
||||
ems[i].value == 'Reset' ||
|
||||
ems[i].type == 'radio' ||
|
||||
ems[i].type == 'checkbox') {
|
||||
continue;
|
||||
}
|
||||
ems[i].value='';
|
||||
ems[i].checked=false;
|
||||
}
|
||||
ems = f.getElementsByTagName('select');
|
||||
for (var i in ems) {
|
||||
ems[i].selectedIndex=0;
|
||||
}
|
||||
ems = f.getElementsByTagName('textarea');
|
||||
for (var i in ems) {
|
||||
ems[i].value='';
|
||||
}
|
||||
document.getElementById('editform_testcase_id_display').innerHTML = '';
|
||||
document.getElementById('editform_creation_date').innerHTML = '';
|
||||
document.getElementById('editform_last_updated').innerHTML = '';
|
||||
document.getElementById('editform_litmus_version').innerHTML = '';
|
||||
document.getElementById('editform_testrunner_case_id').innerHTML = '';
|
||||
document.getElementById('editform_testrunner_case_version').innerHTML = '';
|
||||
changeProduct();
|
||||
changeTestgroup();
|
||||
}
|
||||
|
||||
function switchToAdd() {
|
||||
disableModeButtons();
|
||||
blankForm('edit_testcase_form');
|
||||
setAuthor([% user.user_id %]);
|
||||
document.getElementById('editform_submit').value = 'Add Testcase';
|
||||
document.getElementById('editform_mode').value = 'add';
|
||||
enableForm('edit_testcase_form');
|
||||
}
|
||||
|
||||
function switchToEdit() {
|
||||
document.getElementById('editform_submit').value = 'Submit Edits';
|
||||
document.getElementById('editform_mode').value = 'edit';
|
||||
enableForm('edit_testcase_form');
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<div id="page">
|
||||
|
||||
[% INCLUDE sidebar/sidebar.tmpl %]
|
||||
|
||||
<div id="content">
|
||||
|
||||
<h1 class="firstHeading">[% title %]</h1>
|
||||
|
||||
<div class="section-full">
|
||||
<div class="section-header">Existing Testcases</div>
|
||||
|
||||
<div class="section-content">
|
||||
|
||||
<form id="select_testcase_and_mode_form" name="select_testcase_and_mode_form" method="post" action="manage_testcases.cgi">
|
||||
<table border="0" cellspacing="0" cellpadding="5">
|
||||
<tr>
|
||||
<td>
|
||||
[% INCLUDE form_widgets/select_testcase_id.tmpl name="testcase_id" placeholder=1 size=10 show_summary=1 onchange="loadTestcase();" %]
|
||||
</td>
|
||||
<td>
|
||||
<input id="add_testcase_button" name="add_testcase_button" class="manage" type="button" onClick="switchToAdd();" value="Add testcase"><br/><br/>
|
||||
<input id="edit_testcase_button" name="edit_testcase_button" class="manage" type="button" onClick="switchToEdit();" value="Edit testcase" disabled><br/><br/>
|
||||
<input id="clone_testcase_button" name="clone_testcase_button" class="manage" type="submit" onClick="confirm('Really clone this testcase?');" value="Clone testcase" disabled><br/><br/>
|
||||
<input id="delete_testcase_button" name="delete_testcase_button" class="manage" type="submit" onClick="confirm('Really delete this testcase?');" value="Delete testcase" disabled>
|
||||
</td>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
</div> <!--end section-content-->
|
||||
</div> <!--end section-full-->
|
||||
|
||||
<div class="section-full">
|
||||
<div id="testcase-title" class="section-header">Testcase info</div>
|
||||
|
||||
<div class="section-content">
|
||||
|
||||
[% INCLUDE admin/edit_testcase.tmpl %]
|
||||
|
||||
</div> <!--end section-content-->
|
||||
</div> <!--end section-full-->
|
||||
|
||||
</div> <!--END content-->
|
||||
|
||||
</div> <!--END page-->
|
||||
|
||||
<script type="text/javascript">
|
||||
var em = document.getElementById('testcase_id');
|
||||
if (em.selectedIndex >= 0) {
|
||||
loadTestcase();
|
||||
enableForm('edit_testcase_form');
|
||||
} else {
|
||||
disableForm('edit_testcase_form');
|
||||
}
|
||||
</script>
|
||||
|
||||
[% INCLUDE global/litmus_footer.tmpl %]
|
||||
[% INCLUDE global/html_footer.tmpl %]
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
[%# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# The Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
#%]
|
||||
|
||||
[% INCLUDE global/html_header.tmpl %]
|
||||
[% INCLUDE global/litmus_header.tmpl %]
|
||||
|
||||
<div id="page">
|
||||
|
||||
<h1 class="firstHeading">[% title %]</h1>
|
||||
|
||||
<div class="section-full">
|
||||
[% IF text_to_preview %][% text_to_preview | markdown | testdata %][% ELSE %]<span class="errorHeading">Nothing to preview!</span>[% END %]
|
||||
</div>
|
||||
|
||||
<div class="closeLink"><a name="closePreview" onClick="window.close();"><img class="chrome" src="images/close.png" />Close Preview</a></div>
|
||||
|
||||
</div> <!--END page-->
|
||||
|
||||
[% INCLUDE global/html_footer.tmpl %]
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
<select id="[% name %]" name="[% name %]"[% IF size %] size="[% size %]"[% END %][% IF disabled %] disabled[% END %][% IF onChange %] onChange="[% onChange %]"[% END %]>
|
||||
[% IF placeholder %]<option value="">-Author-</option>[% END %]
|
||||
[% IF authors %]
|
||||
[% FOREACH author=authors %]
|
||||
<option[% IF defaults.author==author.email %] selected[% END %]
|
||||
value="[% author.user_id | html %]">[% author.email | html %]</option>
|
||||
[% END %]
|
||||
[% END %]
|
||||
</select>
|
|
@ -0,0 +1,9 @@
|
|||
<select id="[% name %]" name="[% name %]"[% IF size %] size="[% size %]"[% END %][% IF disabled %] disabled[% END %][% IF onChange %] onChange="[% onChange %]"[% END %]>
|
||||
[% IF placeholder %]<option value="">-Product-</option>[% END %]
|
||||
[% IF products %]
|
||||
[% FOREACH product=products %]
|
||||
<option[% IF defaults.product==product.name %] selected[% END %]
|
||||
value="[% product.product_id | html %]">[% product.name | html %]</option>
|
||||
[% END %]
|
||||
[% END %]
|
||||
</select>
|
Загрузка…
Ссылка в новой задаче