Fix(UI): UI bug fixes.

This commit is contained in:
2025-07-10 15:37:55 +01:00
parent 28158cb0c4
commit d5d2f6f710
18 changed files with 90 additions and 42 deletions

View File

@@ -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):

View File

@@ -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

View File

@@ -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'

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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);

View File

@@ -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 }}">

View File

@@ -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 }}"

View File

@@ -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 }}">

View File

@@ -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%; -->

View File

@@ -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 %}

View File

@@ -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>

View File

@@ -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 }}">

View File

@@ -7,3 +7,6 @@ Print page option on Dog Command Links Page, Assessment-single Page for test ses
UI warning for attempt to create duplicate
Dog Command Links page Dog filter - many replicated options
Layout logo