Fix(UI): UI bug fixes.
This commit is contained in:
@@ -228,11 +228,11 @@ class Parameters_Command(Get_Many_Parameters_Base):
|
||||
filters.get_all_command_category = not has_filter_command_category
|
||||
filters.get_inactive_command_category = not active_only
|
||||
filters.ids_command_category = form.id_command_category.data if has_filter_command_category else ''
|
||||
filters.names_command_category = form.search_text.data if has_filter_search_text else ''
|
||||
filters.names_command_category = form.search.data if has_filter_search_text else ''
|
||||
filters.get_all_command = True
|
||||
filters.get_inactive_command = not active_only
|
||||
filters.ids_command = ''
|
||||
filters.names_command = form.search_text.data if has_filter_search_text else ''
|
||||
filters.names_command = form.search.data if has_filter_search_text else ''
|
||||
return filters
|
||||
|
||||
@classmethod
|
||||
@@ -244,11 +244,13 @@ class Parameters_Command(Get_Many_Parameters_Base):
|
||||
filters.get_all_command_category = True
|
||||
filters.get_inactive_command_category = not active_only
|
||||
filters.ids_command_category = ''
|
||||
filters.names_command_category = form.search_text.data if has_filter_search_text else ''
|
||||
filters.get_all_command = True
|
||||
filters.get_inactive_command = not active_only
|
||||
filters.names_command_category = form.search.data if has_filter_search_text else ''
|
||||
filters.get_all_command = False
|
||||
filters.get_inactive_command = False
|
||||
filters.ids_command = ''
|
||||
filters.names_command = form.search_text.data if has_filter_search_text else ''
|
||||
filters.names_command = ''
|
||||
filters.require_all_id_search_filters_met = False
|
||||
filters.output_commands = False
|
||||
return filters
|
||||
|
||||
def to_json(self):
|
||||
|
||||
@@ -99,7 +99,7 @@ class Command_Category_Temp(db.Model, Base):
|
||||
__table_args__ = { 'extend_existing': True }
|
||||
id_temp = db.Column(db.Integer, primary_key=True)
|
||||
id_command_category = db.Column(db.Integer)
|
||||
code = db.Column(db.String(100))
|
||||
# code = db.Column(db.String(100))
|
||||
name = db.Column(db.String(250))
|
||||
active = db.Column(db.Boolean)
|
||||
guid: str = db.Column(db.String(36))
|
||||
@@ -112,7 +112,7 @@ class Command_Category_Temp(db.Model, Base):
|
||||
_m = 'Command_Category_Temp.from_Command_Category'
|
||||
temp = cls()
|
||||
temp.id_command_category = command_category.id_command_category
|
||||
temp.code = command_category.code
|
||||
# temp.code = command_category.code
|
||||
temp.name = command_category.name
|
||||
temp.active = command_category.active
|
||||
return temp
|
||||
@@ -98,6 +98,7 @@ class Model_View_Base(BaseModel, ABC):
|
||||
FLAG_DATA: ClassVar[str] = 'data'
|
||||
FLAG_DATE_FROM: ClassVar[str] = Base.FLAG_DATE_FROM
|
||||
FLAG_DATE_TO: ClassVar[str] = Base.FLAG_DATE_TO
|
||||
FLAG_DDL_PREVIEW: ClassVar[str] = "ddl-preview"
|
||||
FLAG_DELETE: ClassVar[str] = 'delete'
|
||||
FLAG_DESCRIPTION: ClassVar[str] = Base.FLAG_DESCRIPTION
|
||||
FLAG_DETAIL: ClassVar[str] = 'detail'
|
||||
|
||||
@@ -25,6 +25,7 @@ import dog_training.lib.argument_validation as av
|
||||
# external
|
||||
from pydantic import BaseModel
|
||||
from typing import ClassVar
|
||||
from operator import attrgetter
|
||||
|
||||
class Model_View_Dog_Dog_Command_Link(Model_View_Dog_Base):
|
||||
FLAG_HAND_SIGNAL_DESCRIPTION: ClassVar[str] = Dog_Command_Link.FLAG_HAND_SIGNAL_DESCRIPTION
|
||||
@@ -47,12 +48,19 @@ class Model_View_Dog_Dog_Command_Link(Model_View_Dog_Base):
|
||||
datastore = DataStore_Dog()
|
||||
parameters_filter_dog = Parameters_Dog.get_default()
|
||||
self.filter_dogs, errors = datastore.get_many_dog(parameters_filter_dog)
|
||||
self.form_filters.id_dog.choices += [(str(dog.id_dog), dog.name) for dog in self.filter_dogs]
|
||||
if len(self.filter_dogs) > 0:
|
||||
self.form_filters.id_dog.choices += [(str(dog.id_dog), dog.name) for dog in self.filter_dogs]
|
||||
|
||||
parameters_filter_command = Parameters_Command.get_default()
|
||||
self.filter_command_categories, self.filter_commands, errors = datastore.get_many_command(parameters_filter_command)
|
||||
self.form_filters.id_command_category.choices += [(str(command_category.id_command_category), command_category.name) for command_category in self.filter_command_categories]
|
||||
self.form_filters.id_command.choices += [(str(command.id_command), command.name) for command in self.filter_commands]
|
||||
if len(self.filter_command_categories) > 0:
|
||||
self.form_filters.id_command_category.choices += [(str(command_category.id_command_category), command_category.name) for command_category in self.filter_command_categories]
|
||||
if len(self.filter_commands) > 0:
|
||||
Helper_App.console_log(f'filter commands: {self.filter_commands}')
|
||||
sorted_filter_commands = self.filter_commands
|
||||
sorted_filter_commands.sort(key = attrgetter('name'))
|
||||
Helper_App.console_log(f'sorted filter commands: {sorted_filter_commands}')
|
||||
self.form_filters.id_command.choices += [(str(command.id_command), command.name) for command in sorted_filter_commands] # .sort(key = lambda command: command[1])
|
||||
|
||||
Helper_App.console_log(f'Form filters: {self.form_filters}')
|
||||
parameters_filter_dog_command_link = Parameters_Dog_Command_Link.from_form_filters_dog_command_link(self.form_filters)
|
||||
|
||||
@@ -55,13 +55,21 @@
|
||||
}
|
||||
#tableMain tbody tr td {
|
||||
height: 5vh;
|
||||
padding-top: 0.5vh;
|
||||
/* padding-top: 0.5vh; */
|
||||
}
|
||||
#tableMain tbody tr td:has(.dirty) {
|
||||
background-color: var(--colour-primary);
|
||||
}
|
||||
#tableMain tbody tr:not(:last-of-type) td {
|
||||
padding-bottom: 0.5vh;
|
||||
padding-bottom: 0.25vh;
|
||||
}
|
||||
#tableMain tbody tr td.ddl-preview div,
|
||||
#tableMain tbody tr td.ddl-preview select {
|
||||
padding-left: 2vh;
|
||||
padding-right: 2vh;
|
||||
}
|
||||
#tableMain tbody tr td.ddl-preview select {
|
||||
font-size: 12px;
|
||||
}
|
||||
#tableMain thead tr th.active,
|
||||
#tableMain tbody tr td.active {
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
|
||||
/*
|
||||
#formFilters .container {
|
||||
max-width: fit-content;
|
||||
#formFilters #search {
|
||||
width: 20vh;
|
||||
min-width: 20vh;
|
||||
}
|
||||
*/
|
||||
|
||||
#tableMain thead tr th,
|
||||
#tableMain tbody tr td {
|
||||
height: 3vh;
|
||||
}
|
||||
#tableMain tbody tr td.name .name {
|
||||
border: 1px solid var(--colour-accent);
|
||||
/*
|
||||
@@ -22,11 +25,12 @@
|
||||
box-sizing: border-box;
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
#tableMain thead tr th.code,
|
||||
#tableMain tbody tr td.code,
|
||||
*/
|
||||
#tableMain thead tr th.name ,
|
||||
#tableMain tbody tr td.name {
|
||||
width: 35vh;
|
||||
min-width: 35vh;
|
||||
width: 50vh;
|
||||
min-width: 50vh;
|
||||
}
|
||||
@@ -3,4 +3,9 @@
|
||||
#formFilters .container {
|
||||
max-width: fit-content;
|
||||
}
|
||||
*/
|
||||
*/
|
||||
#tableMain thead tr th.can-have-button,
|
||||
#tableMain tbody tr td.can-have-button {
|
||||
width: 6vh;
|
||||
min-width: 6vh;
|
||||
}
|
||||
@@ -208,7 +208,12 @@ export default class TableBasePage extends BasePage {
|
||||
}
|
||||
let formElement = this.getFormFilters();
|
||||
let comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm));
|
||||
/*
|
||||
Utils.consoleLogIfNotProductionEnvironment({ formElement, comment, records });
|
||||
Utils.consoleLogIfNotProductionEnvironment('records');
|
||||
Utils.consoleLogIfNotProductionEnvironment(records);
|
||||
debugger;
|
||||
*/
|
||||
this.callSaveTableContent(records, formElement, comment)
|
||||
.then(data => {
|
||||
if (data[flagStatus] == flagSuccess) {
|
||||
|
||||
@@ -32,6 +32,7 @@ export default class PageDogCommandCategories extends TableBasePage {
|
||||
if (_verbose) { Utils.consoleLogIfNotProductionEnvironment("applying data row: ", rowJson); }
|
||||
}
|
||||
getJsonRow(row) {
|
||||
Utils.consoleLogIfNotProductionEnvironment({ row });
|
||||
if (row == null) return;
|
||||
let inputCode = row.querySelector('td.' + flagCode + ' .' + flagCode);
|
||||
let inputName = row.querySelector('td.' + flagName + ' .' + flagName);
|
||||
@@ -41,7 +42,7 @@ export default class PageDogCommandCategories extends TableBasePage {
|
||||
console.log("inputName");
|
||||
console.log(inputName);
|
||||
*/
|
||||
|
||||
|
||||
let jsonRow = {};
|
||||
jsonRow[attrIdCommandCategory] = row.getAttribute(attrIdCommandCategory);
|
||||
jsonRow[flagCode] = DOM.getElementAttributeValueCurrent(inputCode);
|
||||
|
||||
@@ -37,12 +37,17 @@ export default class PageDogCommands extends TableBasePage {
|
||||
}
|
||||
getJsonRow(row) {
|
||||
if (row == null) return;
|
||||
let inputName = row.querySelector('td.' + flagName + ' textarea');
|
||||
let inputHandSignalDefaultDescription = row.querySelector('td.' + flagHandSignalDefaultDescription + ' textarea');
|
||||
let inputCanHaveButton = row.querySelector('td.' + flagCanHaveButton + ' input');
|
||||
let inputNotes = row.querySelector('td.' + flagNotes + ' textarea');
|
||||
let inputName = row.querySelector('td.' + flagName + ' .' + flagName);
|
||||
let inputHandSignalDefaultDescription = row.querySelector('td.' + flagHandSignalDefaultDescription + ' .' + flagHandSignalDefaultDescription);
|
||||
let inputCanHaveButton = row.querySelector('td.' + flagCanHaveButton + ' .' + flagCanHaveButton);
|
||||
let inputNotes = row.querySelector('td.' + flagNotes + ' .' + flagNotes);
|
||||
let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);
|
||||
|
||||
/*
|
||||
Utils.consoleLogIfNotProductionEnvironment({ inputName, inputHandSignalDefaultDescription, inputCanHaveButton, inputNotes, buttonActive });
|
||||
debugger;
|
||||
*/
|
||||
|
||||
let jsonRow = {};
|
||||
jsonRow[attrIdCommand] = row.getAttribute(attrIdCommand);
|
||||
jsonRow[attrIdCommandCategory] = this.getIdCommandCategoryRow(row);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
{% if is_blank_row %}
|
||||
<tr class="{{ model.FLAG_ROW_NEW }} {{ model.FLAG_COMMAND }}" {{ model.ATTR_ID_COMMAND }}>
|
||||
<td class="{{ model.FLAG_COMMAND_CATEGORY }}">
|
||||
<td class="{{ model.FLAG_COMMAND_CATEGORY }} {{ model.FLAG_DDL_PREVIEW }}">
|
||||
{% include 'components/dog/_preview_DDL_command_category.html' %}
|
||||
</td>
|
||||
<td class="{{ model.FLAG_NAME }}">
|
||||
@@ -28,7 +28,7 @@
|
||||
{% else %}
|
||||
<tr class="{{ model.FLAG_COMMAND }}" {{ model.ATTR_ID_COMMAND }}="{{ command.id_command }}">
|
||||
{% set command_category = command.command_category %}
|
||||
<td class="{{ model.FLAG_COMMAND_CATEGORY }}">
|
||||
<td class="{{ model.FLAG_COMMAND_CATEGORY }} {{ model.FLAG_DDL_PREVIEW }}">
|
||||
{% include 'components/dog/_preview_DDL_command_category.html' %}
|
||||
</td>
|
||||
<td class="{{ model.FLAG_NAME }}">
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
|
||||
{% if is_blank_row %}
|
||||
<tr class="{{ model.FLAG_ROW_NEW }} {{ model.FLAG_COMMAND_CATEGORY }}" {{ model.ATTR_ID_COMMAND_CATEGORY }}>
|
||||
{#
|
||||
<td class="{{ model.FLAG_CODE }}">
|
||||
<input type="text" class="{{ model.FLAG_CODE }}"
|
||||
{{ model.ATTR_VALUE_CURRENT }} {{ model.ATTR_VALUE_PREVIOUS }} />
|
||||
</td>
|
||||
#}
|
||||
<td class="{{ model.FLAG_NAME }}">
|
||||
<input type="text" class="{{ model.FLAG_NAME }}"
|
||||
{{ model.ATTR_VALUE_CURRENT }} {{ model.ATTR_VALUE_PREVIOUS }} />
|
||||
@@ -14,12 +16,14 @@
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr class="{{ model.FLAG_COMMAND_CATEGORY }}" {{ model.ATTR_ID_COMMAND_CATEGORY }}="{{ command_category.id_command_category }}">
|
||||
{#
|
||||
<td class="{{ model.FLAG_CODE }}">
|
||||
<input type="text" class="{{ model.FLAG_CODE }}"
|
||||
value="{{ model.format_null_string_as_blank(command_category.code)|escape }}"
|
||||
{{ model.ATTR_VALUE_CURRENT }}="{{ model.format_null_string_as_blank(command_category.code)|escape }}"
|
||||
{{ model.ATTR_VALUE_PREVIOUS }}="{{ model.format_null_string_as_blank(command_category.code)|escape }}" />
|
||||
</td>
|
||||
#}
|
||||
<td class="{{ model.FLAG_NAME }}">
|
||||
<input type="text" class="{{ model.FLAG_NAME }}"
|
||||
{{ model.ATTR_VALUE_CURRENT }}="{{ model.format_null_string_as_blank(command_category.name)|escape }}"
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
|
||||
{% if is_blank_row %}
|
||||
<tr class="{{ model.FLAG_ROW_NEW }} {{ model.FLAG_DOG_COMMAND_LINK }}" {{ model.ATTR_ID_DOG_COMMAND_LINK }}>
|
||||
<td class="{{ model.FLAG_DOG }}">
|
||||
<td class="{{ model.FLAG_DOG }} {{ model.FLAG_DDL_PREVIEW }}">
|
||||
{% include 'components/dog/_preview_DDL_dog.html' %}
|
||||
</td>
|
||||
<td class="{{ model.FLAG_COMMAND_CATEGORY }}">
|
||||
<td class="{{ model.FLAG_COMMAND_CATEGORY }} {{ model.FLAG_DDL_PREVIEW }}">
|
||||
{% include 'components/dog/_preview_DDL_command_category.html' %}
|
||||
</td>
|
||||
<td class="{{ model.FLAG_COMMAND }}">
|
||||
<td class="{{ model.FLAG_COMMAND }} {{ model.FLAG_DDL_PREVIEW }}">
|
||||
{% include 'components/dog/_preview_DDL_command.html' %}
|
||||
</td>
|
||||
<td class="{{ model.FLAG_HAND_SIGNAL_DESCRIPTION }}">
|
||||
@@ -26,15 +26,15 @@
|
||||
{% else %}
|
||||
<tr class="{{ model.FLAG_DOG_COMMAND_LINK }}" {{ model.ATTR_ID_DOG_COMMAND_LINK }}="{{ link.id_link }}">
|
||||
{% set dog = link.dog %}
|
||||
<td class="{{ model.FLAG_DOG }}">
|
||||
<td class="{{ model.FLAG_DOG }} {{ model.FLAG_DDL_PREVIEW }}">
|
||||
{% include 'components/dog/_preview_DDL_dog.html' %}
|
||||
</td>
|
||||
{% set command_category = link.command.command_category %}
|
||||
<td class="{{ model.FLAG_COMMAND_CATEGORY }}">
|
||||
<td class="{{ model.FLAG_COMMAND_CATEGORY }} {{ model.FLAG_DDL_PREVIEW }}">
|
||||
{% include 'components/dog/_preview_DDL_command_category.html' %}
|
||||
</td>
|
||||
{% set command = link.command %}
|
||||
<td class="{{ model.FLAG_COMMAND }}">
|
||||
<td class="{{ model.FLAG_COMMAND }} {{ model.FLAG_DDL_PREVIEW }}">
|
||||
{% include 'components/dog/_preview_DDL_command.html' %}
|
||||
</td>
|
||||
<td class="{{ model.FLAG_HAND_SIGNAL_DESCRIPTION }}">
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta charset="utf-8"/>
|
||||
<title>{{ model.title }} - DOG</title>
|
||||
<meta name="description" content="Explore our wide range of software engineering services. We specialize in various tech stacks including MySQL, Python, Microsoft SQL Server, C#, Firebase, Node.js, Java, HTML5, React, CSS3, Flask, JavaScript, MVC, and REST." />
|
||||
<meta name="keywords" content="software engineering, software development, software design, software testing, software maintenance, software support, software consultancy, software training, software documentation, software project management, software quality assurance, software process improvement, software configuration management, software requirements engineering, software architecture, software design patterns, software design principles, software testing principles, software testing techniques, software testing tools, software testing automation, software testing manual, software testing exploratory, software testing regression, software testing performance, software testing security, software testing usability, software testing accessibility, software testing compatibility, software testing reliability, software testing maintainability, software testing portability, software testing scalability, software testing test-driven development, software testing behaviour-driven development, software testing acceptance test-driven development, software testing continuous integration, software testing continuous deployment, software testing continuous delivery, software testing continuous monitoring, software testing continuous feedback, software testing continuous improvement, software testing agile, software testing scrum, software testing kanban, software testing lean, software testing waterfall, software testing v-model, software testing spiral, software testing incremental, software testing iterative, software testing adaptive, software testing predictive, software testing hybrid, software testing manual, software testing automated, software testing exploratory, software testing regression, software testing performance, software testing security, software testing usability, software testing accessibility, software testing compatibility, software testing reliability, software testing maintainability, software testing portability, software testing scalability, software testing test-driven development, software testing behaviour-driven development, software testing acceptance test-driven development, software testing continuous integration, software testing continuous deployment, software testing continuous delivery, software testing continuous monitoring, software testing continuous feedback, software testing continuous improvement, software testing agile, software testing scrum, software testing kanban, software testing lean, software testing waterfall, software testing v-model, software testing spiral, software testing incremental, software testing iterative, software testing adaptive, software testing predictive, software testing hybrid, software testing manual, software testing automated, software testing exploratory, software testing regression, software testing performance, software testing security, software testing usability, software testing accessibility, software testing compatibility, software testing reliability, software testing maintainability, software testing portability, software testing scalability, software testing test-driven development, software testing behaviour-driven development, software testing acceptance test-driven development, software testing continuous integration, software testing continuous deployment, software testing continuous delivery, software testing continuous monitoring, software testing continuous feedback, software testing continuous improvement, software testing agile, software testing, MySQL, Python, Microsoft SQL Server, MS SQL Server, C#, Firebase, Node.js, Java, HTML5, React, CSS3, Flask, JavaScript, MVC, REST" />
|
||||
<meta name="description" content="Explore our dog training management web app." />
|
||||
<meta name="keywords" content="dog training, dog, training" />
|
||||
<link rel="canonical" href="{{ model.get_url_host() }}" />
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
@@ -226,7 +226,7 @@
|
||||
<img class="header-logo" src="{{ url_for('static', filename='images/Logo.png') }}" alt="{{ model.NAME_COMPANY }} logo" aria-label="{{ model.NAME_COMPANY }} logo" tabindex="0">
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}" style="width: 75vw; min-width: 65vw; max-width: 80vw;">
|
||||
<h1 class="company-name">{{ model.NAME_COMPANY }} - {{ model.title }}</h1>
|
||||
<h1 class="company-name">Dog Training - {{ model.title }}</h1>
|
||||
</div>
|
||||
{#
|
||||
<div class="{{ model.FLAG_CONTAINER }}" style="width: 7vw; min-width: 7vw; max-width: 15vw; justify-content: flex-end; "> <!-- padding-left: 25%; -->
|
||||
|
||||
@@ -32,7 +32,9 @@
|
||||
<table id="{{ model.ID_TABLE_MAIN }}" class="{{ model.FLAG_ROW }} {{ model.FLAG_CARD }} {{ model.FLAG_COMMAND_CATEGORY }}">
|
||||
<thead>
|
||||
<tr class="{{ model.FLAG_COMMAND_CATEGORY }}">
|
||||
<th class="{{ model.FLAG_CODE }}">Code</th>
|
||||
{#
|
||||
<th class="{{ model.FLAG_CODE }}">Code</th>
|
||||
#}
|
||||
<th class="{{ model.FLAG_NAME }}">Name</th>
|
||||
<th class="{{ model.FLAG_ACTIVE }}">
|
||||
{% set class_name = model.FLAG_ACTIVE %}
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<table id="{{ model.ID_TABLE_MAIN }}" class="{{ model.FLAG_ROW }} {{ model.FLAG_CARD }} {{ model.FLAG_COMMAND }}">
|
||||
<thead>
|
||||
<tr class="{{ model.FLAG_COMMAND }}">
|
||||
<th class="{{ model.FLAG_COMMAND_CATEGORY }}">Command Category</th>
|
||||
<th class="{{ model.FLAG_COMMAND_CATEGORY }} {{ model.FLAG_DDL_PREVIEW }}">Command Category</th>
|
||||
<th class="{{ model.FLAG_NAME }}">Command</th>
|
||||
<th class="{{ model.FLAG_HAND_SIGNAL_DEFAULT_DESCRIPTION }}">Default Hand Signal</th>
|
||||
<th class="{{ model.FLAG_CAN_HAVE_BUTTON }}">Can Have Button?</th>
|
||||
|
||||
@@ -53,9 +53,9 @@
|
||||
<table id="{{ model.ID_TABLE_MAIN }}" class="{{ model.FLAG_ROW }} {{ model.FLAG_CARD }} {{ model.FLAG_DOG_COMMAND_LINK }}">
|
||||
<thead>
|
||||
<tr class="{{ model.FLAG_DOG_COMMAND_LINK }}">
|
||||
<th class="{{ model.FLAG_DOG }}">Dog</th>
|
||||
<th class="{{ model.FLAG_COMMAND_CATEGORY }}">Command Category</th>
|
||||
<th class="{{ model.FLAG_COMMAND }}">Command</th>
|
||||
<th class="{{ model.FLAG_DOG }} {{ model.FLAG_DDL_PREVIEW }}">Dog</th>
|
||||
<th class="{{ model.FLAG_COMMAND_CATEGORY }} {{ model.FLAG_DDL_PREVIEW }}">Command Category</th>
|
||||
<th class="{{ model.FLAG_COMMAND }} {{ model.FLAG_DDL_PREVIEW }}">Command</th>
|
||||
<th class="{{ model.FLAG_HAND_SIGNAL_DESCRIPTION }}">Hand Signal</th>
|
||||
<th class="{{ model.FLAG_NOTES }}">Notes</th>
|
||||
<th class="{{ model.FLAG_ACTIVE }}">
|
||||
|
||||
Reference in New Issue
Block a user