2022-08-20 20:30:04 +03:00
{extends "../@layout.xml"}
2022-08-20 23:59:25 +03:00
{block title}{_bug_tracker}{/block}
2022-08-20 20:30:04 +03:00
{block header}
2022-08-20 23:59:25 +03:00
{_bug_tracker}
2022-08-20 20:30:04 +03:00
{/block}
{block content}
<div class= "tabs" >
<div n:attr= 'id => $mode === "list" ? "activetabs" : false' class= "tab" >
<a n:attr= 'id => $mode === "list" ? "act_tab_a" : false' href= "/bugtracker" >
2022-08-20 23:59:25 +03:00
{_bug_tracker_reports}
2022-08-20 20:30:04 +03:00
</a>
</div>
<div n:attr= 'id => $mode === "products" ? "activetabs" : false' class= "tab" >
<a n:attr= 'id => $mode === "products" ? "act_tab_a" : false' href= "/bugtracker?act=products" >
2022-08-20 23:59:25 +03:00
{_bug_tracker_products}
2022-08-20 20:30:04 +03:00
</a>
</div>
<div n:attr= 'id => $mode === "reporter" ? "activetabs" : false' class= "tab" >
<a n:attr= 'id => $mode === "reporter" ? "act_tab_a" : false' href= "/bugtracker?act=reporter&id={$user->id}" >
2022-08-20 23:59:25 +03:00
{_bug_tracker_reporter_card}
2022-08-20 20:30:04 +03:00
</a>
</div>
<div n:if= 'in_array($mode, ["list", "new"])' n:attr= 'id => $mode === "new" ? "activetabs" : false' class= "tab" style= "float: right;" >
<a n:attr= 'id => $mode === "new" ? "act_tab_a" : false' href= "/bugtracker?act=new" >
2022-08-20 23:59:25 +03:00
{_create}
2022-08-20 20:30:04 +03:00
</a>
</div>
2022-08-23 02:40:11 +03:00
<div n:if= 'in_array($mode, ["products", "new_product"]) AND $isModerator' n:attr= 'id => $mode === "new_product" ? "activetabs" : false' class= "tab" style= "float: right;" >
2022-08-20 20:30:04 +03:00
<a n:attr= 'id => $mode === "new_product" ? "act_tab_a" : false' href= "/bugtracker?act=new_product" >
2022-08-20 23:59:25 +03:00
{_create}
2022-08-20 20:30:04 +03:00
</a>
</div>
</div>
</div>
<br > <br >
2022-08-25 04:00:46 +03:00
{if $user->identity->isBannedInBt()}
<center >
<img src= "/assets/packages/static/openvk/img/oof.apng" alt= "{_banned_alt}" style= "width: 20%;" />
</center>
<p >
{tr("bug_tracker_banned_1", htmlentities($thisUser->getCanonicalName()))|noescape}<br />
{tr("bug_tracker_banned_2", htmlentities($user->identity->getBanInBtReason()))|noescape}
</p>
{else}
2022-08-20 20:30:04 +03:00
{if $mode === "list"}
{if $count < 1 }
{include "../components/nothing.xml"}
{/if}
<table border= "0" style= "font-size: 11px; width: 100%;" class= "post" >
<tbody >
<tr n:foreach= "$iterator as $bug" >
2022-08-23 02:40:11 +03:00
{var $isHidden = !$bug->getProduct()->hasAccess($user->identity)}
<td width= "54" >
2022-08-20 20:30:04 +03:00
<center >
<img src= "/assets/packages/static/openvk/img/note_icon.png" >
</center>
</td>
<td width= "92%" valign= "top" >
<div class= "post-author" href= "#" >
2022-08-23 02:40:11 +03:00
<a n:attr= "href => !$isHidden ? '/bug' . $bug->getId() : false" >
<b >
{!$isHidden ? $bug->getCanonicalName() : "Скрытый отчёт"}
</b>
<span n:if= "!$isHidden" > #{$bug->getId()}</span>
2022-08-20 20:30:04 +03:00
</a>
</div>
<div class= "post-content" style= "padding: 4px 0; font-size: 11px;" >
2022-08-23 02:40:11 +03:00
<table n:if= "!$isHidden" id= "basicInfo" class= "ugc-table group_info" cellspacing= "0" cellpadding= "0" border= "0" >
2022-08-20 20:30:04 +03:00
<tbody >
<tr >
2022-08-20 23:59:25 +03:00
<td class= "label" > <span class= "nobold" > {_bug_tracker_product}:</span> </td>
2022-08-22 02:11:48 +03:00
<td class= "data" > <a href= "/bugtracker?act=products" > {$bug->getProduct()->getCanonicalName()}</a> </td>
2022-08-20 20:30:04 +03:00
</tr>
<tr >
2022-08-20 23:59:25 +03:00
<td class= "label" > <span class= "nobold" > {_bug_tracker_sent_by}: </span> </td>
2022-08-20 20:30:04 +03:00
<td class= "data" >
<a href= "/bugtracker?act=reporter&id={$bug->getReporter()->getId()}" > {$bug->getReporter()->getCanonicalName()}</a>
</td>
</tr>
<tr >
2022-08-20 23:59:25 +03:00
<td class= "label" > <span class= "nobold" > {_bug_tracker_reproduced}:</span> </td>
2022-08-20 20:30:04 +03:00
<td class= "data" > <a href= "#" > {tr("participants", $bug->getReproducedCount())}</a> </td>
</tr>
<tr >
2022-08-20 23:59:25 +03:00
<td class= "label" > <span class= "nobold" > {_status}:</span> </td>
2022-08-20 20:30:04 +03:00
<td class= "data" > <a href= "#" > {$bug->getStatus()}</a> </td>
</tr>
<tr >
2022-08-22 02:11:48 +03:00
<td class= "label" > <span class= "nobold" > {_bug_tracker_priority}:</span> </td>
2022-08-22 12:59:19 +03:00
<td class= "data" > <a href= "/bugtracker?priority={$bug->getRawPriority()}" n:attr= "style => $bug->getRawPriority() === 5 ? 'color: red; font-weight: 700;' : false" > {$bug->getPriority()}</a> </td>
2022-08-20 20:30:04 +03:00
</tr>
2022-08-22 02:11:48 +03:00
<tr >
<td class= "label" > <span class= "nobold" > {_created}:</span> </td>
<td class= "data" > <a href= "#" > {$bug->getCreationTime()}</a> </td>
</tr>
2022-08-20 20:30:04 +03:00
</tbody>
</table>
2022-08-23 02:40:11 +03:00
<table n:if= "$isHidden" id= "basicInfo" class= "ugc-table group_info" cellspacing= "0" cellpadding= "0" border= "0" style= "filter: blur(3px)" >
<tbody >
<tr >
<td class= "label" >
<span class= "nobold" > {_bug_tracker_product}:</span>
</td>
<td class= "data" >
<a > AbcdEFGH</a>
</td>
</tr>
<tr >
<td class= "label" >
<span class= "nobold" > {_bug_tracker_sent_by}: </span>
</td>
<td class= "data" >
<a > John Doe</a>
</td>
</tr>
<tr >
<td class= "label" >
<span class= "nobold" > {_bug_tracker_reproduced}:</span>
</td>
<td class= "data" >
<a > ...</a>
</td>
</tr>
<tr >
<td class= "label" >
<span class= "nobold" > {_status}:</span>
</td>
<td class= "data" >
<a href= "#" > ...</a>
</td>
</tr>
<tr >
<td class= "label" >
<span class= "nobold" > {_bug_tracker_priority}:</span>
</td>
<td class= "data" >
<a > ...</a>
</td>
</tr>
<tr >
<td class= "label" >
<span class= "nobold" > {_created}:</span>
</td>
<td class= "data" >
<a > ...</a>
</td>
</tr>
</tbody>
</table>
2022-08-20 20:30:04 +03:00
</div>
</td>
</tr>
</tbody>
</table>
<div style= "padding: 8px;" >
{include "../components/paginator.xml", conf => (object) [
"page" => $page,
"count" => $count,
"amount" => sizeof($iterator),
"perPage" => 5,
"atBottom" => true,
]}
</div>
{elseif $mode === "new"}
<form method= "post" action= "/bugtracker/create" >
<input name= "title" type= "text" placeholder= "Название отчёта" >
<br > <br >
2022-08-20 23:59:25 +03:00
<textarea placeholder= "{_bug_tracker_bug_description}" name= "text" style= "width: 100%; resize: vertical;" > </textarea>
2022-08-20 20:30:04 +03:00
<br > <br >
<select name= "product" >
2022-08-20 23:59:25 +03:00
<option d i s a b l e d > {_bug_tracker_product}</option>
2022-08-20 20:30:04 +03:00
<option n:foreach= "$open_products as $product" value= "{$product->getId()}" > {$product->getCanonicalName()}</option>
</select>
<br > <br >
2022-08-20 23:59:25 +03:00
<h4 > {_bug_tracker_priority}</h4>
2022-08-20 20:30:04 +03:00
<table >
<tbody >
<tr >
<td > <input type= "radio" name= "priority" value= "0" > </td>
2022-08-20 23:59:25 +03:00
<td > <label for= "priority_1" > {_bug_tracker_priority_feature}</label> </td>
2022-08-20 20:30:04 +03:00
</tr>
<tr >
<td > <input type= "radio" name= "priority" value= "1" > </td>
2022-08-20 23:59:25 +03:00
<td > <label for= "priority_2" > {_bug_tracker_priority_low}</label> </td>
2022-08-20 20:30:04 +03:00
</tr>
<tr >
<td > <input type= "radio" name= "priority" value= "2" > </td>
2022-08-20 23:59:25 +03:00
<td > <label for= "priority_3" > {_bug_tracker_priority_medium}</label> </td>
2022-08-20 20:30:04 +03:00
</tr>
<tr >
<td > <input type= "radio" name= "priority" value= "3" > </td>
2022-08-20 23:59:25 +03:00
<td > <label for= "priority_4" > {_bug_tracker_priority_high}</label> </td>
2022-08-20 20:30:04 +03:00
</tr>
<tr >
<td > <input type= "radio" name= "priority" value= "4" > </td>
2022-08-20 23:59:25 +03:00
<td > <label for= "priority_5" > {_bug_tracker_priority_critical}</label> </td>
2022-08-20 20:30:04 +03:00
</tr>
<tr >
<td > <input type= "radio" name= "priority" value= "5" > </td>
2022-08-20 23:59:25 +03:00
<td > <label for= "priority_6" > {_bug_tracker_priority_vulnerability}</label> </td>
2022-08-20 20:30:04 +03:00
</tr>
</tbody>
</table>
<br >
2022-08-20 23:59:25 +03:00
<input type= "text" name= "device" placeholder= "{_bug_tracker_device}" >
2022-08-20 20:30:04 +03:00
<br >
<br >
<input type= "hidden" name= "hash" value= "{$csrfToken}" />
<input type= "submit" value= "{_write}" class= "button" style= "float: right;" />
<br > <br >
</form>
{elseif $mode === "products"}
2022-08-23 02:40:11 +03:00
<div >
<div n:attr= 'id => $filter === "all" ? "activetabs" : false' class= "tab" >
<a n:attr= 'id => $filter === "all" ? "act_tab_a" : false' href= "/bugtracker?act=products" >
В с е
</a>
</div>
<div n:attr= 'id => $filter === "open" ? "activetabs" : false' class= "tab" >
<a n:attr= 'id => $filter === "open" ? "act_tab_a" : false' href= "/bugtracker?act=products&filter=open" >
Открытые
</a>
</div>
<div n:attr= 'id => $filter === "closed" ? "activetabs" : false' class= "tab" >
<a n:attr= 'id => $filter === "closed" ? "act_tab_a" : false' href= "/bugtracker?act=products&filter=closed" >
Закрытые
</a>
</div>
<div n:attr= 'id => $filter === "private" ? "activetabs" : false' class= "tab" >
<a n:attr= 'id => $filter === "private" ? "act_tab_a" : false' href= "/bugtracker?act=products&filter=private" >
Приватные
</a>
</div>
</div>
<br >
{if $count < 1 }
{include "../components/nothing.xml"}
{/if}
2022-08-20 20:30:04 +03:00
<table border= "0" style= "font-size: 11px; width: 100%;" class= "post" >
<tbody >
2022-08-22 02:11:48 +03:00
<tr n:foreach= "$iterator as $product" >
2022-08-23 02:40:11 +03:00
<td width= "54" >
2022-08-20 20:30:04 +03:00
<center >
<img src= "/assets/packages/static/openvk/img/note_icon.png" >
</center>
</td>
<td width= "92%" valign= "top" >
<div class= "post-author" href= "#" >
2022-08-22 02:11:48 +03:00
<a href= "/bugtracker?product={$product->getId()}" >
2022-08-20 20:30:04 +03:00
<b > {$product->getCanonicalName()}</b>
<span > #{$product->getId()}</span>
</a>
</div>
<div class= "post-content" style= "padding: 4px 0; font-size: 11px;" >
2022-08-23 02:40:11 +03:00
<div n:if= "$product->getDescription()" style= "padding: 4px; font-size: 11px;" >
{$product->getDescription()}
<hr color= "#DAE1E8" size= "1" >
</div>
2022-08-20 20:30:04 +03:00
<table id= "basicInfo" class= "ugc-table group_info" cellspacing= "0" cellpadding= "0" border= "0" >
<tbody >
<tr >
2022-08-22 02:11:48 +03:00
<td class= "label" > <span class= "nobold" > {_bug_tracker_product}:</span> </td>
2022-08-20 20:30:04 +03:00
<td class= "data" >
2022-08-22 02:11:48 +03:00
<a href= "/bugtracker?product={$product->getId()}" > {$product->getCanonicalName()}</a>
2022-08-20 23:59:25 +03:00
<b n:if= "$product->isClosed()" > ({_bug_tracker_product_is_closed})</b>
2022-08-20 20:30:04 +03:00
</td>
</tr>
2022-08-22 02:11:48 +03:00
<tr n:if= "$isModerator" >
2022-08-20 23:59:25 +03:00
<td class= "label" > <span class= "nobold" > {_bug_tracker_product_created_by}: </span> </td>
2022-08-20 20:30:04 +03:00
<td class= "data" >
<a href= "/bugtracker?act=reporter&id={$product->getCreator()->getId()}" > {$product->getCreator()->getCanonicalName()}</a>
</td>
</tr>
<tr >
2022-08-20 23:59:25 +03:00
<td class= "label" > <span class= "nobold" > {_bug_tracker_product_creation_date}:</span> </td>
2022-08-22 02:11:48 +03:00
<td class= "data" > <a href= "#" > {$product->getCreationTime()}</a> </td>
2022-08-20 20:30:04 +03:00
</tr>
2022-08-23 02:40:11 +03:00
<tr n:if= "$isModerator" >
<td class= "label" > <span class= "nobold" > действия:</span> </td>
<td class= "data" style= "width: 100% !important;" >
<span >
<a
onClick="showBtProductStatusDialog([{$product->getId()}, {$product->getCanonicalName()}], {$csrfToken})"
>
закрытый
</a>
・
<a
onClick="showBtPrivateProductDialog([{$product->getId()}, {$product->getCanonicalName()}], {$csrfToken})"
>
приватный
</a>
・
<a onClick= "showBtProductAccessDialog([{$product->getId()}, {$product->getCanonicalName()}], {$csrfToken})" >
доступ
</a>
</span>
</td>
</tr>
2022-08-20 20:30:04 +03:00
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
2022-08-22 02:11:48 +03:00
<div style= "padding: 8px;" >
{include "../components/paginator.xml", conf => (object) [
"page" => $page,
"count" => $count,
"amount" => sizeof($iterator),
"perPage" => 5,
"atBottom" => true,
]}
</div>
2022-08-20 20:30:04 +03:00
{elseif $mode === "new_product"}
<form method= "post" action= "/bugtracker/createProduct" >
2022-08-20 23:59:25 +03:00
<input type= "text" name= "title" placeholder= "{_bug_tracker_product_name}" >
2022-08-20 20:30:04 +03:00
<br > <br >
2022-08-20 23:59:25 +03:00
<textarea placeholder= "{_bug_tracker_product_description}" name= "description" style= "width: 100%; resize: vertical;" > </textarea>
2022-08-23 02:40:11 +03:00
<div style= "display: inline;" >
<input id= "is_closed" type= "checkbox" name= "is_closed" >
<label for= "is_closed" > Закрытый</label>
2022-08-20 20:30:04 +03:00
2022-08-23 02:40:11 +03:00
<input id= "is_private" type= "checkbox" name= "is_private" >
<label for= "is_private" > Приватный</label>
</div>
2022-08-20 20:30:04 +03:00
<input type= "hidden" name= "hash" value= "{$csrfToken}" />
<br > <br >
2022-08-20 23:59:25 +03:00
<input type= "submit" value= "{_create}" class= "button" style= "float: right;" />
2022-08-20 20:30:04 +03:00
<br > <br >
</form>
{elseif $mode === "reporter"}
<div n:if= "$reporter" >
<div class= "avatar-list-item" style= "padding: 8px;" >
<div class= "avatar" >
<a href= "{$reporter->getURL()}" >
<img class= "ava" src= "{$reporter->getAvatarURL()}" >
</a>
</div>
<div class= "info" style= "width: 92%" >
<a href= "{$reporter->getURL()}" class= "title" > {$reporter->getCanonicalName()}</a>
2022-08-22 02:11:48 +03:00
<b n:if= "$reporter->isBtModerator() AND $isModerator" > [Модератор]</b>
2022-08-25 04:00:46 +03:00
<a n:if= "!$reporter->isBannedInBt() AND $isModerator" onClick= "showBtKickUserDialog([{$reporter->getId()}, {$reporter->getCanonicalName()}], {$csrfToken})" >
<b > [заблокировать]</b>
</a>
<a n:if= "$reporter->isBannedInBt() AND $isModerator" onClick= "showBtUnbanUserDialog([{$reporter->getId()}, {$reporter->getCanonicalName()}, {$reporter->getBanInBtReason()}], {$csrfToken})" >
<b > [разблокировать]</b>
</a>
2022-08-22 02:11:48 +03:00
<div > {tr("bug_tracker_reporter_card_text", $reporter_stats[0], $reporter_stats[1])}</div>
2022-08-25 04:00:46 +03:00
<div n:if= "$reporter->isBannedInBt()" >
<hr color= "#DAE1E8" size= "1" >
<div >
Исключён из программы <b > OVK Testers</b>
<span n:if= "$isModerator" > : <b > {$reporter->getBanInBtReason() ?? "причина не указана."}</b> </span>
</div>
</div>
2022-08-20 20:30:04 +03:00
</div>
</div>
<table border= "0" style= "font-size: 11px; width: 100%;" class= "post" >
<tbody >
<tr n:foreach= "$iterator as $bug" >
<td width= "54" >
<center >
<img src= "/assets/packages/static/openvk/img/note_icon.png" >
</center>
</td>
<td width= "92%" valign= "top" >
<div class= "post-author" href= "#" >
<a href= "/bug{$bug->getId()}" >
<b > {$bug->getCanonicalName()}</b>
<span > #{$bug->getId()}</span>
</a>
</div>
<div class= "post-content" style= "padding: 4px 0; font-size: 11px;" >
<table id= "basicInfo" class= "ugc-table group_info" cellspacing= "0" cellpadding= "0" border= "0" >
<tbody >
<tr >
2022-08-20 23:59:25 +03:00
<td class= "label" > <span class= "nobold" > {_bug_tracker_product}:</span> </td>
2022-08-20 20:30:04 +03:00
<td class= "data" > <a href= "#" > {$bug->getProduct()->getCanonicalName()}</a> </td>
</tr>
<tr >
2022-08-20 23:59:25 +03:00
<td class= "label" > <span class= "nobold" > {_bug_tracker_sent_by}: </span> </td>
2022-08-20 20:30:04 +03:00
<td class= "data" >
<a href= "/bugtracker?act=reporter&id={$bug->getReporter()->getId()}" > {$bug->getReporter()->getCanonicalName()}</a>
</td>
</tr>
<tr >
2022-08-20 23:59:25 +03:00
<td class= "label" > <span class= "nobold" > {_bug_tracker_reproduced}:</span> </td>
2022-08-20 20:30:04 +03:00
<td class= "data" > <a href= "#" > {tr("participants", $bug->getReproducedCount())}</a> </td>
</tr>
<tr >
2022-08-20 23:59:25 +03:00
<td class= "label" > <span class= "nobold" > {_status}:</span> </td>
2022-08-20 20:30:04 +03:00
<td class= "data" > <a href= "#" > {$bug->getStatus()}</a> </td>
</tr>
<tr >
2022-08-20 23:59:25 +03:00
<td class= "label" > <span class= "nobold" > {_bug_tracker_priority}:</span> </td>
2022-08-20 20:30:04 +03:00
<td class= "data" > <a href= "#" > {$bug->getPriority()}</a> </td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
<div style= "padding: 8px;" >
{include "../components/paginator.xml", conf => (object) [
"page" => $page,
"count" => $count,
"amount" => sizeof($iterator),
"perPage" => 5,
"atBottom" => true,
]}
</div>
</div>
<div n:if= "!$reporter" >
2022-08-20 23:59:25 +03:00
<center > {_profile_not_found}</center>
2022-08-20 20:30:04 +03:00
</div>
{/if}
2022-08-25 04:00:46 +03:00
{/if}
2022-08-20 20:30:04 +03:00
{/block}