refactor and fix script for bans

This commit is contained in:
Jordan Blasenhauer 2024-02-23 17:08:48 +01:00
parent 3db2b2e0d4
commit 09c34d8500
2 changed files with 154 additions and 118 deletions

View file

@ -80,7 +80,7 @@ class Filter {
const el = bans[i];
const ip = this.getElAttribut(el, "ip");
const banStart = this.getElAttribut(el, "ban_sart");
const banStart = this.getElAttribut(el, "ban_start");
const banEnd = this.getElAttribut(el, "ban_end");
const remain = this.getElAttribut(el, "remain");

View file

@ -1,8 +1,7 @@
{% extends "base.html" %}
{% block content %}
{% set current_endpoint = url_for(request.endpoint)[1:].split("/")[-1].strip() %}
{% set reasons = [] %}
{% set terms = [] %}
{% set reasons = ["all"] %}
{% set terms = ["all"] %}
{% for ban in bans %}
{% if ban["reason"] not in reasons %}
{% if reasons.append(ban["reason"]) %}{% endif %}
@ -42,99 +41,112 @@
</div>
</div>
<!-- info-->
{% set bans_info = [
{"name" : "BANS TOTAL", "data" : bans|length|string},
{"name" : "TOP REASON", "data" : top_reason|string},
] %}
<div class="{% if bans|length == 0 %}hidden{% endif %} h-fit col-span-12 md:col-span-4 3xl:col-span-3 p-4 relative min-w-0 break-words bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border">
<h5 class="mb-2 font-bold dark:text-white/90">INFO</h5>
<div class="mx-1 flex items-center my-4">
<p class="transition duration-300 ease-in-out font-bold mb-0 font-sans text-sm leading-normal uppercase dark:text-gray-500 dark:opacity-80">
BANS TOTAL
</p>
<p class="transition duration-300 ease-in-out pl-2 col-span-1 mb-0 font-sans text-sm font-semibold leading-normal uppercase dark:text-white dark:opacity-80">
{{ bans|length }}
</p>
</div>
<div class="{% if bans|length == 0 %}hidden{% endif %} mx-1 flex items-center my-4">
<p class="transition duration-300 ease-in-out font-bold mb-0 font-sans text-sm leading-normal uppercase dark:text-gray-500 dark:opacity-80">
TOP REASON
</p>
<p class="transition duration-300 ease-in-out pl-2 col-span-1 mb-0 font-sans text-sm font-semibold leading-normal uppercase dark:text-white dark:opacity-80">
{{ top_reason }}
</p>
</div>
{% for info in bans_info %}
<div class="mx-1 flex items-center my-4">
<p class="transition duration-300 ease-in-out font-bold mb-0 font-sans text-sm leading-normal uppercase dark:text-gray-500 dark:opacity-80">
{{ info['name'] }}
</p>
<p class="transition duration-300 ease-in-out pl-2 col-span-1 mb-0 font-sans text-sm font-semibold leading-normal uppercase dark:text-white dark:opacity-80">
{{ info['data'] }}
</p>
</div>
{% endfor %}
</div>
<!-- end info -->
<!-- filter -->
<div data-{{ current_endpoint }}-filter class="{% if bans|length == 0 %}hidden{% endif %} h-fit col-span-12 md:col-span-8 2xl:col-span-6 3xl:col-span-5 p-4 relative flex flex-col min-w-0 break-words bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border">
{% set filters = [
{
"type": "input",
"name": "Search",
"label": "search",
"id": "keyword",
"placeholder": "ip, ban start, ban end",
"pattern": "(.*?)"
},
{
"type": "select",
"name": "Reason",
"id": "reason",
"value": "all",
"values": reasons
},
{
"type": "select",
"name": "Range",
"id": "term",
"value": "all",
"values": terms
}
] %}
<div data-bans-filter
class="{% if bans|length == 0 %}hidden{% endif %} h-fit col-span-12 md:col-span-8 2xl:col-span-6 3xl:col-span-5 p-4 relative flex flex-col min-w-0 break-words bg-white shadow-xl dark:bg-slate-850 dark:shadow-dark-xl rounded-2xl bg-clip-border">
<h5 class="mb-2 font-bold dark:text-white/90">FILTER</h5>
<div class="mx-2 grid grid-cols-12 gap-x-4 gap-y-2">
<!-- search inpt-->
<div class="flex flex-col relative col-span-12 md:col-span-6">
<h5 class="my-1 transition duration-300 ease-in-out dark:opacity-90 text-sm sm:text-md font-bold m-0 dark:text-gray-300">
Search
</h5>
<label for="keyword" class="sr-only">search</label>
<input type="text"
id="keyword"
name="keyword"
class="dark:border-slate-600 dark:bg-slate-700 dark:text-gray-300 disabled:opacity-75 focus:valid:border-green-500 focus:invalid:border-red-500 outline-none focus:border-primary text-sm leading-5.6 ease block w-full appearance-none rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-3 py-1 font-normal text-gray-700 transition-all placeholder:text-gray-500"
placeholder="ip, ban start, ban end"
pattern="(.*?)"
required />
</div>
<!-- end search inpt-->
<!-- select reason -->
<div class="flex flex-col relative col-span-12 md:col-span-6">
<h5 class="my-1 transition duration-300 ease-in-out dark:opacity-90 text-sm sm:text-md font-bold m-0 dark:text-gray-300">
Reason
</h5>
<button aria-controls="filter-state" data-{{ current_endpoint }}-setting-select="reason" class="disabled:opacity-75 dark:disabled:text-gray-300 disabled:text-gray-700 disabled:bg-gray-400 disabled:border-gray-400 dark:disabled:bg-gray-800 dark:disabled:border-gray-800 duration-300 ease-in-out dark:opacity-90 dark:border-slate-600 dark:bg-slate-700 dark:text-gray-300 focus:border-green-500 flex justify-between align-middle items-center text-left text-sm leading-5.6 ease w-full rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-1.5 py-1 md:px-3 font-normal text-gray-700 transition-all placeholder:text-gray-500">
<span aria-description="current filter state value" id="{{ current_endpoint }}-reason" data-name="{{ current_endpoint }}-reason" data-{{ current_endpoint }}-setting-select-text="reason">all</span>
<!-- chevron -->
<svg data-{{ current_endpoint }}-setting-select="reason" class="transition-transform h-4 w-4 fill-gray-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path d="M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z" />
</svg>
</button>
<!-- end chevron -->
<!-- dropdown-->
<div id="filter-state" role="listbox" data-{{ current_endpoint }}-setting-select-dropdown="reason" class="hidden z-100 absolute h-full flex-col w-full translate-y-16">
<button role="option" data-{{ current_endpoint }}-setting-select-dropdown-btn="reason" value="all" class="border-t rounded-t border-b border-l border-r border-gray-300 dark:hover:brightness-90 hover:brightness-90 my-0 relative py-2 px-3 text-left align-middle transition-all rounded-none cursor-pointer leading-normal text-sm ease-in tracking-tight-rem dark:border-slate-600 dark:text-gray-300 dark:bg-primary bg-primary text-gray-300">
all
</button>
{% for reason in reasons %}
<button role="option" data-{{ current_endpoint }}-setting-select-dropdown-btn="reason" value="{{ reason }}" class="{% if loop.last %}rounded-b{% endif %} border-b border-l border-r border-gray-300 dark:hover:brightness-90 hover:brightness-90 bg-white text-gray-700 my-0 relative py-2 px-3 text-left align-middle transition-all rounded-none cursor-pointer leading-normal text-sm ease-in tracking-tight-rem dark:border-slate-600 dark:bg-slate-700 dark:text-gray-300">
{{ reason }}
{% for filter in filters %}
{% if filter['type'] == 'input' %}
<!-- search inpt-->
<div class="flex flex-col relative col-span-12 md:col-span-6">
<h5 class="my-1 transition duration-300 ease-in-out dark:opacity-90 text-sm sm:text-md font-bold m-0 dark:text-gray-300">
{{ filter['name'] }}
</h5>
<label for="{{ filter['id'] }}" class="sr-only">{{ filter['label'] }}</label>
<input type="text"
id="{{ filter['id'] }}"
name="{{ filter['id'] }}"
class="dark:border-slate-600 dark:bg-slate-700 dark:text-gray-300 disabled:opacity-75 focus:valid:border-green-500 focus:invalid:border-red-500 outline-none focus:border-primary text-sm leading-5.6 ease block w-full appearance-none rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-3 py-1 font-normal text-gray-700 transition-all placeholder:text-gray-500"
placeholder="{{ filter['placeholder'] }}"
pattern="{{ filter['pattern'] }}"
required />
</div>
<!-- end search inpt-->
{% endif %}
{% if filter['type'] == 'select' %}
<!-- select -->
<div class="flex flex-col relative col-span-12 md:col-span-6">
<h5 class="my-1 transition duration-300 ease-in-out dark:opacity-90 text-sm sm:text-md font-bold m-0 dark:text-gray-300">
{{ filter['name'] }}
</h5>
<button aria-controls="filter-{{ filter['id'] }}"
data-bans-setting-select="{{ filter['id'] }}"
class="disabled:opacity-75 dark:disabled:text-gray-300 disabled:text-gray-700 disabled:bg-gray-400 disabled:border-gray-400 dark:disabled:bg-gray-800 dark:disabled:border-gray-800 duration-300 ease-in-out dark:opacity-90 dark:border-slate-600 dark:bg-slate-700 dark:text-gray-300 focus:border-green-500 flex justify-between align-middle items-center text-left text-sm leading-5.6 ease w-full rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-1.5 py-1 md:px-3 font-normal text-gray-700 transition-all placeholder:text-gray-500">
<span aria-description="current filter state value"
id="bans-{{ filter['id'] }}"
data-name="bans-{{ filter['id'] }}"
data-bans-setting-select-text="{{ filter['id'] }}">all</span>
<!-- chevron -->
<svg data-bans-setting-select="{{ filter['id'] }}"
class="transition-transform h-4 w-4 fill-gray-500"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512">
<path d="M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z" />
</svg>
</button>
{% endfor %}
</div>
<!-- end dropdown-->
</div>
<!-- end select reason -->
<!-- select term -->
<div class="flex flex-col relative col-span-12 md:col-span-6">
<h5 class="my-1 transition duration-300 ease-in-out dark:opacity-90 text-sm sm:text-md font-bold m-0 dark:text-gray-300">
Range
</h5>
<button aria-controls="filter-state" data-{{ current_endpoint }}-setting-select="term" class="disabled:opacity-75 dark:disabled:text-gray-300 disabled:text-gray-700 disabled:bg-gray-400 disabled:border-gray-400 dark:disabled:bg-gray-800 dark:disabled:border-gray-800 duration-300 ease-in-out dark:opacity-90 dark:border-slate-600 dark:bg-slate-700 dark:text-gray-300 focus:border-green-500 flex justify-between align-middle items-center text-left text-sm leading-5.6 ease w-full rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-1.5 py-1 md:px-3 font-normal text-gray-700 transition-all placeholder:text-gray-500">
<span aria-description="current filter state value" id="{{ current_endpoint }}-term" data-name="{{ current_endpoint }}-term" data-{{ current_endpoint }}-setting-select-text="term">all</span>
<!-- chevron -->
<svg data-{{ current_endpoint }}-setting-select="term" class="transition-transform h-4 w-4 fill-gray-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path d="M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z" />
</svg>
</button>
<!-- end chevron -->
<!-- dropdown-->
<div id="filter-state" role="listbox" data-{{ current_endpoint }}-setting-select-dropdown="term" class="hidden z-100 absolute h-full flex-col w-full translate-y-16">
<button role="option" data-{{ current_endpoint }}-setting-select-dropdown-btn="term" value="all" class="border-t rounded-t border-b border-l border-r border-gray-300 dark:hover:brightness-90 hover:brightness-90 my-0 relative py-2 px-3 text-left align-middle transition-all rounded-none cursor-pointer leading-normal text-sm ease-in tracking-tight-rem dark:border-slate-600 dark:text-gray-300 dark:bg-primary bg-primary text-gray-300">
all
</button>
{% for term in terms %}
<button role="option" data-{{ current_endpoint }}-setting-select-dropdown-btn="term" value="{{ term }}" class="{% if loop.last %}rounded-b{% endif %} border-b border-l border-r border-gray-300 dark:hover:brightness-90 hover:brightness-90 bg-white text-gray-700 my-0 relative py-2 px-3 text-left align-middle transition-all rounded-none cursor-pointer leading-normal text-sm ease-in tracking-tight-rem dark:border-slate-600 dark:bg-slate-700 dark:text-gray-300">
{{ term }}
</button>
{% endfor %}
</div>
<!-- end dropdown-->
</div>
<!-- end select term -->
<!-- end chevron -->
<!-- dropdown-->
<div id="filter-{{ filter['id'] }}"
role="listbox"
data-bans-setting-select-dropdown="{{ filter['id'] }}"
class="hidden z-100 absolute h-full flex-col w-full translate-y-16">
{% for value in filter['values'] %}
<button role="option"
data-bans-setting-select-dropdown-btn="{{ filter['id'] }}"
value="{{ value }}"
class="{% if loop.first %}dark:bg-primary bg-primary text-gray-300 border-t rounded-t {% else %} bg-white {% endif %} {% if loop.last %}rounded-b{% endif %} border-b border-l border-r border-gray-300 dark:hover:brightness-90 hover:brightness-90 my-0 relative py-2 px-3 text-left align-middle transition-all rounded-none cursor-pointer leading-normal text-sm ease-in tracking-tight-rem dark:border-slate-600 dark:text-gray-300">
{{ value }}
</button>
{% endfor %}
</div>
<!-- end dropdown-->
</div>
<!-- end select -->
{% endif %}
{% endfor %}
</div>
</div>
<!-- end filter -->
@ -143,23 +155,54 @@
<h5 class="mb-4 mt-2 font-bold dark:text-white/90 mx-2">BANS LIST</h5>
</div>
<div class="col-span-12 overflow-y-auto overflow-x-auto">
<div data-{{ current_endpoint }}-bans-list>
<div data-bans-bans-list>
<!-- list container-->
{% set bans_headers = [
{
"name": "Select",
"position": "col-span-1"
},
{
"name": "IP",
"position": "col-span-2"
},
{
"name": "Reason",
"position": "col-span-2"
},
{
"name": "Ban start",
"position": "col-span-2"
},
{
"name": "Ban end",
"position": "col-span-2"
},
{
"name": "Remain",
"position": "col-span-3"
},
{
"name": "Term",
"position": "hidden"
}
] %}
<div class="overflow-hidden min-w-[1150px] w-full grid grid-cols-12 rounded p-2">
<!-- header-->
<p class="dark:text-gray-300 h-8 text-sm font-bold col-span-1 m-0 pb-2 border-b border-gray-400">Select</p>
<p class="dark:text-gray-300 h-8 text-sm font-bold col-span-2 m-0 pb-2 border-b border-gray-400">IP</p>
<p class="dark:text-gray-300 h-8 text-sm font-bold col-span-2 m-0 pb-2 border-b border-gray-400">Reason</p>
<p class="dark:text-gray-300 h-8 text-sm font-bold col-span-2 m-0 pb-2 border-b border-gray-400">Ban start</p>
<p class="dark:text-gray-300 h-8 text-sm font-bold col-span-2 m-0 pb-2 border-b border-gray-400">Ban end</p>
<p class="dark:text-gray-300 h-8 text-sm font-bold col-span-3 m-0 pb-2 border-b border-gray-400">Remain</p>
<p class="hidden">Term</p>
{% for header in bans_headers %}
<p class="dark:text-gray-300 h-8 text-sm font-bold {{ header['position'] }} m-0 pb-2 border-b border-gray-400">
{{ header['name'] }}
</p>
{% endfor %}
<!-- end header-->
<!-- list -->
<ul class="col-span-12 w-full" data-{{ current_endpoint }}-list>
<ul class="col-span-12 w-full" data-bans-list>
{% for ban in bans %}
<li data-{{ current_endpoint }}-list-item="{{ ban }}" class="items-center grid grid-cols-12 border-b border-gray-300 py-2.5">
<div data-{{ current_endpoint }}-ban-select data-checkbox-handler="ban-item-{{ loop.index }}" class="relative mb-7 md:mb-0 z-10 ml-2">
<li data-bans-list-item="{{ ban }}"
class="items-center grid grid-cols-12 border-b border-gray-300 py-2.5">
<div data-bans-ban-select
data-checkbox-handler="ban-item-{{ loop.index }}"
class="relative mb-7 md:mb-0 z-10 ml-2">
<label class="sr-only" for="ban-item-{{ loop.index }}">Ban ip {{ loop.index }}</label>
<input id="ban-item-{{ loop.index }}"
name="ban-item-{{ loop.index }}"
@ -178,24 +221,17 @@
</path>
</svg>
</div>
<p class="dark:text-gray-400 dark:opacity-80 text-sm col-span-2 m-0 my-1" data-{{ current_endpoint }}-ip="{{ ban["ip"] }}">
{{ ban['ip'] }}
</p>
<p class="dark:text-gray-400 dark:opacity-80 text-sm col-span-2 m-0 my-1" data-{{ current_endpoint }}-reason="{{ ban["reason"] }}">
{{ ban["reason"] }}
</p>
<p class="dark:text-gray-400 dark:opacity-80 text-sm col-span-2 m-0 my-1" data-{{ current_endpoint }}-ban_start="{{ ban["ban_start"] }}">
{{ ban["ban_start"] }}
</p>
<p class="dark:text-gray-400 dark:opacity-80 text-sm col-span-2 m-0 my-1" data-{{ current_endpoint }}-ban_end="{{ ban["ban_end"] }}">
{{ ban["ban_end"] }}
</p>
<p class="dark:text-gray-400 dark:opacity-80 text-sm col-span-3 m-0 my-1" data-{{ current_endpoint }}-remain="{{ ban["remain"] }}">
{{ ban["remain"] }}
</p>
<p class="hidden" data-{{ current_endpoint }}-term="{{ ban["term"] }}">
{{ ban["term"] }}
</p>
<p class="dark:text-gray-400 dark:opacity-80 text-sm col-span-2 m-0 my-1"
data-bans-ip="{{ ban['ip'] }}">{{ ban['ip'] }}</p>
<p class="dark:text-gray-400 dark:opacity-80 text-sm col-span-2 m-0 my-1"
data-bans-reason="{{ ban['reason'] }}">{{ ban['reason'] }}</p>
<p class="dark:text-gray-400 dark:opacity-80 text-sm col-span-2 m-0 my-1"
data-bans-ban_start="{{ ban['ban_start'] }}">{{ ban['ban_start'] }}</p>
<p class="dark:text-gray-400 dark:opacity-80 text-sm col-span-2 m-0 my-1"
data-bans-ban_end="{{ ban['ban_end'] }}">{{ ban['ban_end'] }}</p>
<p class="dark:text-gray-400 dark:opacity-80 text-sm col-span-3 m-0 my-1"
data-bans-remain="{{ ban['remain'] }}">{{ ban['remain'] }}</p>
<p class="hidden" data-bans-term="{{ ban['term'] }}">{{ ban['term'] }}</p>
</li>
{% endfor %}
</ul>