mirror of
https://gitlab.com/hashborgir/d2tools.git
synced 2024-11-30 12:36:03 +00:00
Item preview upgrade. Debug info/button added. Debug link when click on item pic. Proper descfuncs with sprintf.
This commit is contained in:
parent
13568c5b74
commit
21546a57db
@ -151,8 +151,6 @@ if ($cmd == "getUniqueItem") {
|
||||
|
||||
$counter = 1;
|
||||
foreach ($props as $k => $v) { // for each property Prop1 Prop2
|
||||
$value = $v['par1'] ?? $v['min1'];
|
||||
|
||||
$params = [
|
||||
'string1' => $v['desc']['string1'],
|
||||
'string2' => $v['desc']['string2'],
|
||||
@ -164,8 +162,13 @@ if ($cmd == "getUniqueItem") {
|
||||
"max" => $return['max' . $counter]
|
||||
];
|
||||
|
||||
|
||||
/*
|
||||
* getDesc should process string1, not file guide copy pasta
|
||||
*
|
||||
*/
|
||||
if (!empty($v['desc'])) {
|
||||
$props[$k]['string'][] = $idesc->getDesc($value, $params);
|
||||
$props[$k]['string'][] = $idesc->getDesc($params);
|
||||
}
|
||||
$counter++;
|
||||
}
|
||||
@ -176,7 +179,7 @@ if ($cmd == "getUniqueItem") {
|
||||
|
||||
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode($return, JSON_INVALID_UTF8_IGNORE);
|
||||
echo json_encode($return, JSON_INVALID_UTF8_IGNORE|JSON_PRETTY_PRINT);
|
||||
}
|
||||
/*
|
||||
* @cmd = sortBy
|
||||
|
Binary file not shown.
BIN
fonts/ExocetHeavy_.ttf
Normal file
BIN
fonts/ExocetHeavy_.ttf
Normal file
Binary file not shown.
BIN
fonts/ExocetLight.ttf
Normal file
BIN
fonts/ExocetLight.ttf
Normal file
Binary file not shown.
57
res/app.js
57
res/app.js
@ -39,6 +39,27 @@
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
function syntaxHighlight(json) {
|
||||
json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
||||
return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
|
||||
var cls = 'number';
|
||||
if (/^"/.test(match)) {
|
||||
if (/:$/.test(match)) {
|
||||
cls = 'key';
|
||||
} else {
|
||||
cls = 'string';
|
||||
}
|
||||
} else if (/true|false/.test(match)) {
|
||||
cls = 'boolean';
|
||||
} else if (/null/.test(match)) {
|
||||
cls = 'null';
|
||||
}
|
||||
return '<span class="' + cls + '">' + match + '</span>';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function search() {
|
||||
$.get("/ajax/uniqueitems.php?cmd=search&search=" + searchbox.value, function (data) {
|
||||
$('.uniqueitems-select').html(data)
|
||||
@ -167,24 +188,34 @@ $(document).ready(function () {
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// cmd = getUniqueItem
|
||||
$('.uniqueitems-select').change(function () {
|
||||
$(".item").attr("src", "/img/items/1.png");
|
||||
$(".item_debug_link").attr('href', "/ajax/uniqueitems.php?cmd=getUniqueItem&index=" + this.value)
|
||||
$.get("/ajax/uniqueitems.php?cmd=getUniqueItem&index=" + this.value, function (data) {
|
||||
|
||||
debugData = (JSON.stringify(data, null, 4));
|
||||
$('.debug, .debug_preview').html(syntaxHighlight(debugData));
|
||||
props = data.props;
|
||||
$('.item_desc').html("<p></p>");
|
||||
$('.item_stats div').html("<p></p>");
|
||||
|
||||
|
||||
type = data["*type"];
|
||||
lvlreq = data["lvl req"];
|
||||
|
||||
|
||||
$('.item_stats p').append(`<li class="statindex">${data.index}</li>`);
|
||||
$('.item_stats p').append(`<li class="stattype">${type}</li>`);
|
||||
$('.item_stats p').append(`<li class="statlvlreq">Level Required: ${lvlreq}</li>`);
|
||||
// $('.item_stats p').append(`<li class="index">${data.index}</li>`);
|
||||
// $('.item_stats p').append(`<li class="index">${data.index}</li>`);
|
||||
// $('.item_stats p').append(`<li class="index">${data.index}</li>`);
|
||||
// $('.item_stats p').append(`<li class="index">${data.index}</li>`);
|
||||
|
||||
|
||||
$.each(props, function (i, v) {
|
||||
|
||||
if(v.string){
|
||||
$('.item_desc p').append('<li class="'+i+'">'+v.string[0]+"</li>");
|
||||
$('.item_stats p').append('<li class="'+i+'">'+v.string[0]+"</li>");
|
||||
}
|
||||
});
|
||||
|
||||
@ -197,9 +228,13 @@ $(document).ready(function () {
|
||||
$('select[name="code[]"]').val(v);
|
||||
$('select[name="code[]"]').prop('required', '');
|
||||
}
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$(".btnDebug").click(function(){
|
||||
$(".debug_preview").slideToggle();
|
||||
});
|
||||
|
||||
|
||||
// cmd = sortBy
|
||||
|
@ -40,7 +40,7 @@
|
||||
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Exocet';
|
||||
font-family: 'ExocetHeavy';
|
||||
src: url('/fonts/ExocetHeavy.eot');
|
||||
src: local('Exocet Heavy'), local('ExocetHeavy'),
|
||||
url('/fonts/ExocetHeavy.eot?#iefix') format('embedded-opentype'),
|
||||
@ -52,6 +52,15 @@
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'ExocetLight';
|
||||
src: local('Exocet Light'), local('ExocetLight'),
|
||||
url('/fonts/ExocetLight.ttf') format('truetype');
|
||||
|
||||
font-weight: 900;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Lato';
|
||||
src: url('/fonts/Lato-Regular.ttf') format('truetype');
|
||||
@ -111,8 +120,9 @@ body {
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6, div > p {
|
||||
font-family: Exocet;
|
||||
font-family: ExocetLight;
|
||||
color: #778;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
#loading {
|
||||
margin-top: 40px;
|
||||
@ -165,25 +175,60 @@ option {
|
||||
margin: 15px 0;
|
||||
}
|
||||
|
||||
.item_desc {
|
||||
height: auto;
|
||||
width: 640px;
|
||||
position: absolute;
|
||||
left: 110px;
|
||||
top: 23px;
|
||||
.item {
|
||||
text-align: left;
|
||||
position:absolute;
|
||||
right:282px;
|
||||
}
|
||||
|
||||
.item_desc {
|
||||
height: 560px;
|
||||
width: 620px;
|
||||
position: absolute;
|
||||
left: -80px;
|
||||
top: 0px;
|
||||
|
||||
/* background: black url(/img/items/bg.png) center top no-repeat;*/
|
||||
|
||||
background: #333;
|
||||
|
||||
text-align: center;
|
||||
background: black;
|
||||
padding: 10px;
|
||||
text-transform: uppercase;
|
||||
|
||||
}
|
||||
|
||||
.item_desc p {
|
||||
font-size: 13px;
|
||||
font-size: 14px;
|
||||
color: #4169E1;
|
||||
letter-spacing: -1px;
|
||||
}
|
||||
.item_desc span {
|
||||
}
|
||||
|
||||
ul, li, ul li {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
.debug {
|
||||
height: 800px;
|
||||
}
|
||||
|
||||
pre {outline: 1px solid #ccc; padding: 5px; margin: 5px; }
|
||||
.string { color: green; }
|
||||
.number { color: darkorange; }
|
||||
.boolean { color: blue; }
|
||||
.null { color: magenta; }
|
||||
.key { color: red; }
|
||||
|
||||
.statindex, .stattype{
|
||||
color: #A59263;
|
||||
font-weight: bold;
|
||||
font-family: ExocetHeavy;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
|
||||
.statlvlreq {
|
||||
color: white;
|
||||
}
|
@ -172,7 +172,6 @@ class D2ItemDesc {
|
||||
'19' => 'StrSklTabItem20',
|
||||
'20' => 'StrSklTabItem21'
|
||||
];
|
||||
|
||||
public $charClass = [
|
||||
"ama" => "Amazon",
|
||||
"sor" => "Sorceress",
|
||||
@ -183,17 +182,23 @@ class D2ItemDesc {
|
||||
"ass" => "Assassin"
|
||||
];
|
||||
|
||||
public function getDesc($value, $params = []) {
|
||||
public function getDesc($params = []) {
|
||||
if (empty($params))
|
||||
return false;
|
||||
|
||||
$v = '<span style="font-family: Lato; color: white; font-weight: 900">' . $value . "</span>";
|
||||
$s1 = $params['string1'];
|
||||
$s2 = $params['string2'];
|
||||
$prop = $params['prop'];
|
||||
$par = $params['par'];
|
||||
$min = '<span style="color: white; font-weight: 900">' . $params['min'] . "</span>";
|
||||
$max = '<span style="color: white; font-weight: 900">' . $params['max'] . "</span>";
|
||||
$min = (int) $params['min'];
|
||||
$v = $min;
|
||||
|
||||
$max = (int) $params['max'];
|
||||
|
||||
if ($min == $max) {
|
||||
$max = '';
|
||||
}
|
||||
|
||||
foreach ($this->skilltabs as $s) {
|
||||
$sql = "SELECT `String` FROM `strings` WHERE `Key`='$s'";
|
||||
$this->skilltabsDesc[] = PDO_FetchRow($sql);
|
||||
@ -205,11 +210,23 @@ class D2ItemDesc {
|
||||
|
||||
//ddump($this->skilltabsDescClean);
|
||||
|
||||
|
||||
/*
|
||||
* Descval 1
|
||||
*
|
||||
*
|
||||
* $format = 'The %s contains %d monkeys';
|
||||
echo sprintf($format, $num, $location);
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
if ($params['descval'] == 1 || $params['descval'] == '') {
|
||||
|
||||
if ($params['descfunc'] == 1) {
|
||||
$this->str = "+$v $s1";
|
||||
if (!empty($max)) {
|
||||
$max = "-" . $max;
|
||||
}
|
||||
$this->str = "+$min$max $s1";
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 2) {
|
||||
@ -229,7 +246,7 @@ class D2ItemDesc {
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 6) {
|
||||
$this->str = "+$v $s1 $s2";
|
||||
$this->str = "+$par $s1 $s2";
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 7) {
|
||||
@ -248,7 +265,7 @@ class D2ItemDesc {
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 11) {
|
||||
$this->str = "Repairs 1 Durability In " . (100 / $value) . " seconds";
|
||||
$this->str = "Repairs 1 Durability In " . (100 / $par) . " seconds";
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 12) {
|
||||
@ -262,17 +279,18 @@ class D2ItemDesc {
|
||||
if ($params['descfunc'] == 14) {
|
||||
|
||||
$sql = "SELECT class
|
||||
FROM `charstats`
|
||||
WHERE `StrSkillTab1`='{$this->skilltabs[$par]}' OR
|
||||
`StrSkillTab2`='{$this->skilltabs[$par]}' OR
|
||||
`StrSkillTab3`='{$this->skilltabs[$par]}'";
|
||||
FROM `charstats`
|
||||
WHERE `StrSkillTab1`='{$this->skilltabs[$par]}' OR
|
||||
`StrSkillTab2`='{$this->skilltabs[$par]}' OR
|
||||
`StrSkillTab3`='{$this->skilltabs[$par]}'";
|
||||
|
||||
$class = PDO_FetchOne($sql);
|
||||
|
||||
$this->str = "+$min-$max{$this->skilltabsDescClean[$par]['String']} Skill Levels ($class Only)";
|
||||
$this->str = sprintf($s1, $min, $this->skilltabsDescClean[$par]['String']);
|
||||
}
|
||||
if ($params['descfunc'] == 15) {
|
||||
$this->str = "[chance]% to case [slvl] [skill] on [event]";
|
||||
$sql = "SELECT skill FROM `skills` WHERE `Id`='$par'";
|
||||
$skill = PDO_FetchOne($sql);
|
||||
$this->str = sprintf($s1, $min, $max, $skill);
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 16) {
|
||||
@ -292,7 +310,7 @@ WHERE `StrSkillTab1`='{$this->skilltabs[$par]}' OR
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 20) {
|
||||
$this->str = ($v * -1) . "% $s1";
|
||||
$this->str = ($v) . "% $s1";
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 21) {
|
||||
@ -307,7 +325,11 @@ WHERE `StrSkillTab1`='{$this->skilltabs[$par]}' OR
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 24) {
|
||||
$this->str = "+$v to Skill Charges Or Something";
|
||||
$string = str_replace("\\", "", $s1);
|
||||
$sql = "SELECT skill FROM `skills` WHERE `Id`='$par'";
|
||||
$skill = PDO_FetchOne($sql);
|
||||
$this->str = "+$min to Skill Charges Or Something";
|
||||
$this->str = sprintf("Level $max $skill ".$string,$min,$min);
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 25) {
|
||||
@ -319,17 +341,28 @@ WHERE `StrSkillTab1`='{$this->skilltabs[$par]}' OR
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 27) {
|
||||
$this->str = "+$v to [skill] ([class] Only)";
|
||||
$sql = "SELECT skill,charclass FROM `skills` WHERE `Id`='$par'";
|
||||
$res = PDO_FetchRow($sql);
|
||||
$this->str = "+$par to a Random Skill";
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 28) {
|
||||
$sql = "SELECT `skill` FROM `skills` WHERE `skilldesc`='$par'";
|
||||
$skill = PDO_FetchOne($sql);
|
||||
|
||||
|
||||
$this->str = "+$min to $skill ";
|
||||
}
|
||||
} else if ($params['descval'] == 0) {
|
||||
}
|
||||
/*
|
||||
* Descval 0
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/ else if ($params['descval'] == 0) {
|
||||
if ($params['descfunc'] == 1) {
|
||||
$this->str = "$s1";
|
||||
}
|
||||
@ -432,13 +465,24 @@ WHERE `StrSkillTab1`='{$this->skilltabs[$par]}' OR
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 27) {
|
||||
$this->str = "to [skill] ([class] Only)";
|
||||
$sql = "SELECT skill,charclass FROM `skills` WHERE `Id`='$par'";
|
||||
$res = PDO_FetchRow($sql);
|
||||
$this->str = "+$min to {$res['skill']} ({$this->charClass[$res['charclass']]} Only)";
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 28) {
|
||||
$this->str = "to [skill] ";
|
||||
}
|
||||
} else if ($params['descval'] == 2) {
|
||||
}
|
||||
/*
|
||||
* Descval 0
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/ else if ($params['descval'] == 2) {
|
||||
if ($params['descfunc'] == 1) {
|
||||
$this->str = "$s1 +$v";
|
||||
}
|
||||
@ -491,7 +535,16 @@ WHERE `StrSkillTab1`='{$this->skilltabs[$par]}' OR
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 14) {
|
||||
$this->str = "to [skilltab] Skill Levels ([class] Only) +$v ";
|
||||
|
||||
$sql = "SELECT class
|
||||
FROM `charstats`
|
||||
WHERE `StrSkillTab1`='{$this->skilltabs[$par]}' OR
|
||||
`StrSkillTab2`='{$this->skilltabs[$par]}' OR
|
||||
`StrSkillTab3`='{$this->skilltabs[$par]}'";
|
||||
|
||||
$class = PDO_FetchOne($sql);
|
||||
|
||||
$this->str = "{$this->skilltabsDescClean[$par]['String']} ($class Only) +$max";
|
||||
}
|
||||
if ($params['descfunc'] == 15) {
|
||||
$this->str = "[chance]% to case [slvl] [skill] on [event]";
|
||||
@ -541,7 +594,9 @@ WHERE `StrSkillTab1`='{$this->skilltabs[$par]}' OR
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 27) {
|
||||
$this->str = "+$v to [skill] ([class] Only)";
|
||||
$sql = "SELECT skill,charclass FROM `skills` WHERE `Id`='$par'";
|
||||
$res = PDO_FetchRow($sql);
|
||||
$this->str = "+$min to {$res['skill']} ({$this->charClass[$res['charclass']]} Only)";
|
||||
}
|
||||
|
||||
if ($params['descfunc'] == 28) {
|
||||
|
@ -68,6 +68,9 @@
|
||||
<li class="nav-item" role="presentation">
|
||||
<a class="nav-link" id="Gem-tab" data-toggle="tab" href="#Gem" role="tab" aria-controls="Set" aria-selected="false">Gems</a>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<a class="nav-link" id="Debug-tab" data-toggle="tab" href="#Debug" role="tab" aria-controls="Set" aria-selected="false">Debug</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@ -81,5 +84,8 @@
|
||||
<div class="tab-pane fade" id="Gem" role="tabpanel" aria-labelledby="Gem-tab">
|
||||
<?php require_once 'tabs/Gems.php'; ?>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="Debug" role="tabpanel" aria-labelledby="Debug-tab">
|
||||
<?php require_once 'tabs/Debug.php'; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
6
src/tabs/Debug.php
Normal file
6
src/tabs/Debug.php
Normal file
@ -0,0 +1,6 @@
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h2>Debug Output</h2>
|
||||
<pre class="debug"></pre>
|
||||
</div>
|
||||
</div>
|
@ -1,35 +1,7 @@
|
||||
<div style="height: 40px; margin: 40px 10px;"><h2>Unique Item Maker</h2></div>
|
||||
<div class="row">
|
||||
<div class="offset-4 col"><h3 style="font-family:fixed; font-size:80%;">Preview</h3>
|
||||
<div class="" style="height: 117px; background: url(/img/items/bg.png) no-repeat">
|
||||
<img style="" class="item" src="">
|
||||
<div class="item_desc">
|
||||
<p></p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="row" style="margin-bottom:40px;">
|
||||
<div class="col" style="">
|
||||
<p>Search for Item</p>
|
||||
<input style="border: 1px solid #999; padding: 10px;width: 440px;" id="search" type="text custom-control-inline" placeholder="Search item" name="search">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" style="">
|
||||
<div class="col-5">
|
||||
<select style="height: 260px;padding:10px;margin-bottom: 20px;" name="uniqueitems" class="custom-select uniqueitems-select" multiple>
|
||||
<!--<option value=""></option>-->
|
||||
<?php foreach ($uniqueitems as $u) { ?>
|
||||
<option value="<?php echo $u['index'] ?>"><?php echo $u['index'] ?></option>
|
||||
<?php } ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-7 sortby">
|
||||
<p style="font-family:Exocet;">Sort By: </p>
|
||||
<div class="col sortby">
|
||||
<p style="">Sort By: </p>
|
||||
<div class="custom-control custom-radio custom-control-inline">
|
||||
<input name="sort" id="sort_0" type="radio" class="custom-control-input" value="lvl">
|
||||
<label for="sort_0" class="custom-control-label">Level</label>
|
||||
@ -47,7 +19,7 @@
|
||||
<label for="sort_3" class="custom-control-label">Item Code</label>
|
||||
</div>
|
||||
<hr>
|
||||
<p style="font-family:Exocet;">Filter By: </p>
|
||||
<p style="">Filter By: </p>
|
||||
<div class="custom-control custom-radio custom-control-inline">
|
||||
<input name="view" id="view_0" type="radio" class="custom-control-input" value="rin">
|
||||
<label for="view_0" class="custom-control-label">Rings</label>
|
||||
@ -73,6 +45,45 @@
|
||||
<label for="view_5" class="custom-control-label">Charms</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div>
|
||||
<div class="center item_desc" style="">
|
||||
|
||||
<div style="height: 116px;background: url(/img/items/bg.png) center top no-repeat;">
|
||||
<a href="" target="_blank" class="item_debug_link">
|
||||
<img style="" class="item img-fluid" src="">
|
||||
</a>
|
||||
|
||||
</div>
|
||||
<div class="item_stats" style="background: #222; margin: 20px; padding: 20px;">
|
||||
<div class=""><p>ITEM PREVIEW</p></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
<button style="margin: 20px;" class="btn btn-outline-warning btnDebug">Debug Info</button>
|
||||
<pre class="debug_preview" style="display:none; background: #eee; height: 420px;width: 1123px;"></pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" style="margin-bottom:40px;">
|
||||
<div class="col" style="">
|
||||
<p>Search for Item</p>
|
||||
<input style="border: 1px solid #999; padding: 10px;width: 440px;" id="search" type="text custom-control-inline" placeholder="Search item" name="search">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" style="">
|
||||
<div class="col-5">
|
||||
<select style="height: 160px;padding:10px;margin-bottom: 20px;" name="uniqueitems" class="custom-select uniqueitems-select" multiple>
|
||||
<!--<option value=""></option>-->
|
||||
<?php foreach ($uniqueitems as $u) { ?>
|
||||
<option value="<?php echo $u['index'] ?>"><?php echo $u['index'] ?></option>
|
||||
<?php } ?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<form action="/index.php" method="post">
|
||||
<div class="form-group row">
|
||||
|
Loading…
Reference in New Issue
Block a user