Feat: Assessment page complete and new Home page layout for marketing phase 1 of the customer acquisition plan and offering a demo and for trainers to join the alpha trials. Reporting images created for radar diagram of Command mastery by Command Category; line graph of single command progress measured by obedience level, response latency, and compliance duration over time; Calendar Entries page filtered to unpaid bill calendary entries created using dummy data created in web server as database implementation not yet started.

This commit is contained in:
2025-07-30 19:57:47 +01:00
parent d38bf51345
commit e1fedaf773
93 changed files with 2605 additions and 875 deletions

2
app.py
View File

@@ -19,6 +19,7 @@ Initializes the Flask application, sets the configuration based on the environme
from config import app_config, Config
from controllers.dog.assessment import routes_dog_assessment
from controllers.dog.button_icon import routes_dog_button_icon
from controllers.dog.calendar_entry import routes_dog_calendar_entry
from controllers.dog.command import routes_dog_command
from controllers.dog.command_button_link import routes_dog_command_button_link
from controllers.dog.command_category import routes_dog_command_category
@@ -129,6 +130,7 @@ app.register_blueprint(routes_dog_location)
app.register_blueprint(routes_dog_button_icon)
app.register_blueprint(routes_dog_command_button_link)
app.register_blueprint(routes_dog_assessment)
app.register_blueprint(routes_dog_calendar_entry)
app.register_blueprint(routes_legal)
app.register_blueprint(routes_user)

View File

@@ -61,6 +61,7 @@ class Base():
FLAG_PATH: ClassVar[str] = 'path'
FLAG_PHONE_NUMBER: ClassVar[str] = 'phone_number'
FLAG_POSTCODE: ClassVar[str] = 'postcode'
FLAG_PRICE: ClassVar[str] = 'price'
FLAG_PRIORITY: ClassVar[str] = 'priority'
FLAG_QUANTITY: ClassVar[str] = 'quantity'
FLAG_REGION: ClassVar[str] = 'region'

View File

@@ -0,0 +1,255 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Calendar_Entry Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
from business_objects.dog.calendar_entry_type import Calendar_Entry_Type
import lib.argument_validation as av
from extensions import db
from forms.dog.calendar_entry import Filters_Calendar_Entry
from helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
class Calendar_Entry(SQLAlchemy_ABC, Base):
ATTR_ID_CALENDAR_ENTRY: ClassVar[str] = 'id_calendar_entry'
FLAG_CALENDAR_ENTRY: ClassVar[str] = 'calendar_entry'
FLAG_IS_CALENDAR_ENTRY_TYPE_BILL: ClassVar[str] = 'is-calendar-entry-type-bill'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_CALENDAR_ENTRY
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Calendar_Entry'
__table_args__ = { 'extend_existing': True }
id_calendar_entry = db.Column(db.Integer, primary_key=True)
id_calendar_entry_type = db.Column(db.Integer)
name = db.Column(db.String(250))
start_on = db.Column(db.DateTime)
end_on = db.Column(db.DateTime)
price = db.Column(db.Float)
active = db.Column(db.Boolean)
created_on = db.Column(db.DateTime)
def __init__(self):
self.id_calendar_entry = 0
self.calendar_entry_type = None
self.is_new = False
self.is_calendar_entry_type_bill = None
super().__init__()
@classmethod
def from_db_calendar_entry(cls, query_row):
_m = f'{cls.__qualname__}.from_db_calendar_entry'
calendar_entry = cls()
calendar_entry.id_calendar_entry = query_row[0]
calendar_entry.id_calendar_entry_type = query_row[1]
calendar_entry.name = query_row[2]
calendar_entry.start_on = query_row[3]
calendar_entry.end_on = query_row[4]
calendar_entry.price = query_row[5]
calendar_entry.active = av.input_bool(query_row[6], 'active', _m)
calendar_entry.is_calendar_entry_type_bill = query_row[7]
calendar_entry.calendar_entry_type = Calendar_Entry_Type.from_db_calendar_entry(query_row)
return calendar_entry
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
calendar_entry = cls()
if json is None: return calendar_entry
calendar_entry.id_calendar_entry = json.get(Calendar_Entry.ATTR_ID_CALENDAR_ENTRY, -1)
calendar_entry.id_calendar_entry_type = json[Calendar_Entry_Type.ATTR_ID_CALENDAR_ENTRY_TYPE]
calendar_entry.name = json[cls.FLAG_NAME]
calendar_entry.start_on = json[cls.FLAG_DATE_FROM]
calendar_entry.end_on = json[cls.FLAG_DATE_TO]
calendar_entry.price = json[cls.FLAG_PRICE]
calendar_entry.is_calendar_entry_type_bill = json.get(cls.FLAG_IS_CALENDAR_ENTRY_TYPE_BILL, None)
calendar_entry.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m)
calendar_entry.created_on = json.get(cls.FLAG_CREATED_ON, None)
return calendar_entry
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_CALENDAR_ENTRY: self.id_calendar_entry
, Calendar_Entry_Type.ATTR_ID_CALENDAR_ENTRY_TYPE: self.id_calendar_entry_type
, self.FLAG_NAME: self.name
, self.FLAG_DATE_FROM: self.start_on
, self.FLAG_DATE_TO: self.end_on
, self.FLAG_PRICE: self.price
, self.FLAG_IS_CALENDAR_ENTRY_TYPE_BILL: self.is_calendar_entry_type_bill
, self.FLAG_ACTIVE: self.active
, self.FLAG_CREATED_ON: self.created_on
}
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_CALENDAR_ENTRY}: {self.id_calendar_entry}
{Calendar_Entry_Type.ATTR_ID_CALENDAR_ENTRY_TYPE}: {self.id_calendar_entry_type}
{self.FLAG_NAME}: {self.name}
{self.FLAG_DATE_FROM}: {self.start_on}
{self.FLAG_DATE_TO}: {self.end_on}
{self.FLAG_PRICE}: {self.price}
{self.FLAG_IS_CALENDAR_ENTRY_TYPE_BILL}: {self.is_calendar_entry_type_bill}
{self.FLAG_ACTIVE}: {self.active}
{self.FLAG_CREATED_ON}: {self.created_on}
)
'''
"""
class Calendar_Entry_Temp(db.Model, Base):
__tablename__ = 'DOG_Calendar_Entry_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_calendar_entry = db.Column(db.Integer)
id_calendar_entry_type = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
notes = db.Column(db.Text)
active = db.Column(db.Boolean)
# created_on = db.Column(db.DateTime)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_calendar_entry(cls, calendar_entry):
_m = 'Calendar_Entry_Temp.from_calendar_entry'
temp = cls()
temp.id_calendar_entry = calendar_entry.id_calendar_entry
temp.id_calendar_entry_type = calendar_entry.id_calendar_entry_type
temp.code = calendar_entry.code
temp.name = calendar_entry.name
temp.notes = calendar_entry.notes
temp.active = calendar_entry.active
# temp.created_on = calendar_entry.created_on
return temp
def __repr__(self):
return f'''
{self.__class__.__name__}(
{Calendar_Entry.FLAG_CALENDAR_ENTRY}: {self.id_calendar_entry}
{Calendar_Entry_Type.FLAG_CALENDAR_ENTRY_TYPE}: {self.id_calendar_entry_type}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_NOTES}: {self.notes}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Parameters_Calendar_Entry(Get_Many_Parameters_Base):
get_all_file_type: bool
get_inactive_file_type: bool
ids_file_type: str
names_file_type: str
get_all_calendar_entry_type: bool
get_inactive_calendar_entry_type: bool
ids_calendar_entry_type: str
names_calendar_entry_type: str
get_all_calendar_entry: bool
get_inactive_calendar_entry: bool
ids_calendar_entry: str
names_calendar_entry: str
notes_calendar_entry: str
require_all_id_search_filters_met: bool
require_any_id_search_filters_met: bool
require_all_non_id_search_filters_met: bool
require_any_non_id_search_filters_met: bool
@classmethod
def get_default(cls):
return cls(
get_all_file_type = True
, get_inactive_file_type = False
, ids_file_type = ''
, names_file_type = ''
, get_all_calendar_entry_type = True
, get_inactive_calendar_entry_type = False
, ids_calendar_entry_type = ''
, names_calendar_entry_type = ''
, get_all_calendar_entry = True
, get_inactive_calendar_entry = False
, ids_calendar_entry = ''
, names_calendar_entry = ''
, notes_calendar_entry = ''
, require_all_id_search_filters_met = True
, require_any_id_search_filters_met = True
, require_all_non_id_search_filters_met = False
, require_any_non_id_search_filters_met = True
)
@classmethod
def from_json(cls, json):
return cls(
get_all_file_type = json.get('a_get_all_file_type', False)
, get_inactive_file_type = json.get('a_get_inactive_file_type', False)
, ids_file_type = json.get('a_ids_file_type', '')
, names_file_type = json.get('a_names_file_type', '')
, get_all_calendar_entry_type = json.get('a_get_all_calendar_entry_type', False)
, get_inactive_calendar_entry_type = json.get('a_get_inactive_calendar_entry_type', False)
, ids_calendar_entry_type = json.get('a_ids_calendar_entry_type', '')
, names_calendar_entry_type = json.get('a_names_calendar_entry_type', '')
, get_all_calendar_entry = json.get('a_get_all_calendar_entry', False)
, get_inactive_calendar_entry = json.get('a_get_inactive_calendar_entry', False)
, ids_calendar_entry = json.get('a_ids_calendar_entry', '')
, names_calendar_entry = json.get('a_names_calendar_entry', '')
, notes_calendar_entry = json.get('a_notes_calendar_entry', '')
, require_all_id_search_filters_met = json.get('a_require_all_id_search_filters_met', True)
, require_any_id_search_filters_met = json.get('a_require_any_id_search_filters_met', True)
, require_all_non_id_search_filters_met = json.get('a_require_all_non_id_search_filters_met', False)
, require_any_non_id_search_filters_met = json.get('a_require_any_non_id_search_filters_met', True)
)
@classmethod
def from_form_filters_calendar_entry(cls, form):
av.val_instance(form, 'form', 'Parameters_Calendar_Entry.from_form_filters_calendar_entry', Filters_Calendar_Entry)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
active_only = av.input_bool(form.active_only.data, "active", "Parameters_Calendar_Entry.from_form_filters_calendar_entry")
filters = cls.get_default()
filters.get_all_file_type = True
filters.get_inactive_file_type = not active_only
filters.ids_file_type = ''
filters.names_file_type = form.search.data if has_filter_search_text else ''
filters.get_all_calendar_entry_type = True
filters.get_inactive_calendar_entry_type = not active_only
filters.ids_calendar_entry_type = ''
filters.names_calendar_entry_type = form.search.data if has_filter_search_text else ''
filters.get_all_calendar_entry = True
filters.get_inactive_calendar_entry = not active_only
filters.ids_calendar_entry = ''
filters.names_calendar_entry = form.search.data if has_filter_search_text else ''
filters.notes_calendar_entry = form.search.data if has_filter_search_text else ''
return filters
def to_json(self):
return {
'a_get_all_file_type': self.get_all_file_type
, 'a_get_inactive_file_type': self.get_inactive_file_type
, 'a_ids_file_type': self.ids_file_type
, 'a_names_file_type': self.names_file_type
, 'a_get_all_calendar_entry_type': self.get_all_calendar_entry_type
, 'a_get_inactive_calendar_entry_type': self.get_inactive_calendar_entry_type
, 'a_ids_calendar_entry_type': self.ids_calendar_entry_type
, 'a_names_calendar_entry_type': self.names_calendar_entry_type
, 'a_get_all_calendar_entry': self.get_all_calendar_entry
, 'a_get_inactive_calendar_entry': self.get_inactive_calendar_entry
, 'a_ids_calendar_entry': self.ids_calendar_entry
, 'a_names_calendar_entry': self.names_calendar_entry
, 'a_notes_calendar_entry': self.notes_calendar_entry
, 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met
, 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met
, 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met
, 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met
}
"""

View File

@@ -0,0 +1,98 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Calendar Entry Type Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
class Calendar_Entry_Type(SQLAlchemy_ABC, Base):
ATTR_ID_CALENDAR_ENTRY_TYPE: ClassVar[str] = 'id_type'
FLAG_CALENDAR_ENTRY_TYPE: ClassVar[str] = 'calendar-entry-type'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_CALENDAR_ENTRY_TYPE
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Calendar_Entry_Type'
__table_args__ = { 'extend_existing': True }
id_type = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
def __init__(self):
self.id_type = 0
self.is_new = False
super().__init__()
@classmethod
def from_json(cls, json):
_m = 'Calendar_Entry_Type.from_json'
calendar_entry_type = cls()
if json is None: return calendar_entry_type
# Helper_App.console_log(f'{_m}\njson: {json}')
calendar_entry_type.id_type = json.get(cls.ATTR_ID_CALENDAR_ENTRY_TYPE, -1)
calendar_entry_type.name = json[cls.FLAG_NAME]
calendar_entry_type.code = json.get(cls.FLAG_CODE, calendar_entry_type.name.upper().replace(" ", "_"))
calendar_entry_type.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m)
# Helper_App.console_log(f'Calendar_Entry_Type: {calendar_entry_type}')
return calendar_entry_type
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_CALENDAR_ENTRY_TYPE: self.id_type
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, self.FLAG_ACTIVE: self.active
}
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_CALENDAR_ENTRY_TYPE}: {self.id_type}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
)
'''
"""
class Calendar_Entry_Type_Temp(db.Model, Base):
__tablename__ = 'DOG_Calendar_Entry_Type_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_type = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_calendar_entry_type(cls, calendar_entry_type):
_m = 'Calendar_Entry_Type_Temp.from_Calendar_Entry_Type'
temp = cls()
temp.id_type = calendar_entry_type.id_type
temp.code = calendar_entry_type.code
temp.name = calendar_entry_type.name
temp.active = calendar_entry_type.active
return temp
"""

View File

@@ -80,7 +80,7 @@ class Command_Category(SQLAlchemy_ABC, Base):
def from_json(cls, json):
_m = 'Command_Category.from_json'
command_category = cls()
if json is None: return Command_Category
if json is None: return command_category
# Helper_App.console_log(f'{_m}\njson: {json}')
command_category.id_command_category = json.get(cls.ATTR_ID_COMMAND_CATEGORY, -1)
command_category.name = json[cls.FLAG_NAME]

View File

@@ -55,7 +55,7 @@ def assessments():
Helper_App.console_log(f'form_filters={form_filters}')
model = Model_View_Dog_Assessment(form_filters_old = form_filters)
if not model.is_user_logged_in:
return redirect(url_for('routes_core_home.home'))
return redirect(url_for('routes_dog_home.home'))
Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/dog/_assessments.html', model = model)
@@ -161,7 +161,7 @@ def assessment():
else:
model.assessments = [Assessment()]
if not model.is_user_logged_in:
return redirect(url_for('routes_core_home.home'))
return redirect(url_for('routes_dog_home.home'))
session[Model_View_Dog_Assessment.FLAG_CSRF_TOKEN] = model.form_filters.csrf_token.current_token #.hidden_tag()
Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/dog/_assessment.html', model = model)

View File

@@ -51,7 +51,7 @@ def button_icons():
Helper_App.console_log(f'form_filters={form_filters}')
model = Model_View_Dog_Button_Icon(form_filters_old = form_filters)
if not model.is_user_logged_in:
return redirect(url_for('routes_core_home.home'))
return redirect(url_for('routes_dog_home.home'))
Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/dog/_button_icons.html', model = model)

View File

@@ -0,0 +1,99 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: App Routing
Feature: Dog - Calendar Entry Routes
Description:
Contact Page Controller.
"""
# IMPORTS
# internal
from business_objects.api import API
from business_objects.dog.calendar_entry import Calendar_Entry
from datastores.datastore_dog import DataStore_Dog
from forms.dog.calendar_entry import Filters_Calendar_Entry
from helpers.helper_app import Helper_App
from models.model_view_dog_calendar_entry import Model_View_Dog_Calendar_Entry
from models.model_view_home import Model_View_Home
import lib.argument_validation as av
# external
from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app, flash
from flask_mail import Mail, Message
from extensions import db, oauth, mail
from urllib.parse import quote_plus, urlencode
from authlib.integrations.flask_client import OAuth
from authlib.integrations.base_client import OAuthError
from urllib.parse import quote, urlparse, parse_qs
import json
import base64
import hmac
import hashlib
import datetime
from altcha import ChallengeOptions, create_challenge, verify_solution
routes_dog_calendar_entry = Blueprint('routes_dog_calendar_entry', __name__)
@routes_dog_calendar_entry.route(Model_View_Dog_Calendar_Entry.HASH_PAGE_DOG_CALENDAR_ENTRIES, methods=['GET'])
def calendar_entries():
Helper_App.console_log('calendar_entries')
Helper_App.console_log(f'request_args: {request.args}')
try:
form_filters = Filters_Calendar_Entry.from_json(request.args)
except Exception as e:
Helper_App.console_log(f'Error: {e}')
form_filters = Filters_Calendar_Entry()
Helper_App.console_log(f'form_filters={form_filters}')
model = Model_View_Dog_Calendar_Entry(form_filters_old = form_filters)
if not model.is_user_logged_in:
return redirect(url_for('routes_dog_home.home'))
Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/dog/_calendar_entries.html', model = model)
"""
@routes_dog_calendar_entry.route(Model_View_Dog_Calendar_Entry.HASH_SAVE_DOG_CALENDAR_ENTRY, methods=['POST'])
def save_calendar_entry():
data = Helper_App.get_request_data(request)
try:
form_filters = Filters_Calendar_Entry.from_json(data[Model_View_Dog_Calendar_Entry.FLAG_FORM_FILTERS])
if not form_filters.validate_on_submit():
return jsonify({
Model_View_Dog_Calendar_Entry.FLAG_STATUS: Model_View_Dog_Calendar_Entry.FLAG_FAILURE,
Model_View_Dog_Calendar_Entry.FLAG_MESSAGE: f'Filters form invalid.\n{form_filters.errors}'
})
model_return = Model_View_Dog_Calendar_Entry(form_filters_old=form_filters)
if not model_return.is_user_logged_in:
raise Exception('User not logged in')
calendar_entries = data[Model_View_Dog_Calendar_Entry.FLAG_CALENDAR_ENTRY]
if len(calendar_entries) == 0:
return jsonify({
Model_View_Dog_Calendar_Entry.FLAG_STATUS: Model_View_Dog_Calendar_Entry.FLAG_FAILURE,
Model_View_Dog_Calendar_Entry.FLAG_MESSAGE: f'No calendar entries.'
})
objs_calendar_entry = []
for calendar_entry in calendar_entries:
objs_calendar_entry.append(Calendar_Entry.from_json(calendar_entry))
Helper_App.console_log(f'objs_calendar_entry={objs_calendar_entry}')
errors = DataStore_Dog.save_calendar_entries(data.get('comment', 'No comment'), objs_calendar_entry)
if (len(errors) > 0):
return jsonify({
Model_View_Dog_Calendar_Entry.FLAG_STATUS: Model_View_Dog_Calendar_Entry.FLAG_FAILURE,
Model_View_Dog_Calendar_Entry.FLAG_MESSAGE: f'Error saving calendar entries.\n{model_return.convert_list_objects_to_json(errors)}'
})
return jsonify({
Model_View_Dog_Calendar_Entry.FLAG_STATUS: Model_View_Dog_Calendar_Entry.FLAG_SUCCESS,
Model_View_Dog_Calendar_Entry.FLAG_DATA: Model_View_Dog_Calendar_Entry.convert_list_objects_to_json(model_return.calendar_entries)
})
except Exception as e:
return jsonify({
Model_View_Dog_Calendar_Entry.FLAG_STATUS: Model_View_Dog_Calendar_Entry.FLAG_FAILURE,
Model_View_Dog_Calendar_Entry.FLAG_MESSAGE: f'Bad data received by controller.\n{e}'
})
"""

View File

@@ -52,7 +52,7 @@ def commands():
Helper_App.console_log(f'form_filters={form_filters}')
model = Model_View_Dog_Command(form_filters_old = form_filters)
if not model.is_user_logged_in:
return redirect(url_for('routes_core_home.home'))
return redirect(url_for('routes_dog_home.home'))
Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/dog/_commands.html', model = model)

View File

@@ -52,7 +52,7 @@ def command_button_links():
Helper_App.console_log(f'form_filters={form_filters}')
model = Model_View_Dog_Command_Button_Link(form_filters_old = form_filters)
if not model.is_user_logged_in:
return redirect(url_for('routes_core_home.home'))
return redirect(url_for('routes_dog_home.home'))
Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/dog/_command_button_links.html', model = model)

View File

@@ -51,7 +51,7 @@ def command_categories():
Helper_App.console_log(f'form_filters={form_filters}')
model = Model_View_Dog_Command_Category(form_filters_old = form_filters)
if not model.is_user_logged_in:
return redirect(url_for('routes_core_home.home'))
return redirect(url_for('routes_dog_home.home'))
Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/dog/_command_categories.html', model = model)

View File

@@ -40,9 +40,11 @@ from altcha import ChallengeOptions, create_challenge, verify_solution
routes_dog = Blueprint('routes_dog', __name__)
"""
@routes_dog.route(Model_View_Dog_Base.HASH_GET_DOG_SCRIPTS_SHARED, methods=['GET'])
def scripts_section_dog():
hash_page_current = request.args.get('hash_page_current', default = Model_View_Dog_Base.HASH_GET_DOG_SCRIPTS_SHARED, type = str)
model = Model_View_Dog_Base(hash_page_current=hash_page_current)
template = render_template('js/sections/dog.js', model = model)
return Response(template, mimetype='application/javascript')
return Response(template, mimetype='application/javascript')
"""

View File

@@ -52,7 +52,7 @@ def dog_command_links():
Helper_App.console_log(f'form_filters={form_filters}')
model = Model_View_Dog_Dog_Command_Link(form_filters_old = form_filters)
if not model.is_user_logged_in:
return redirect(url_for('routes_core_home.home'))
return redirect(url_for('routes_dog_home.home'))
Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/dog/_dog_command_links.html', model = model)

View File

@@ -41,10 +41,8 @@ routes_dog_home = Blueprint('routes_dog_home', __name__)
@routes_dog_home.route(Model_View_Dog_Base.HASH_PAGE_DOG_HOME, methods=['GET'])
def dog_command_links():
def home():
Helper_App.console_log('DOG HOME')
model = Model_View_Dog_Base(hash_page_current = Model_View_Dog_Base.HASH_PAGE_DOG_HOME)
if not model.is_user_logged_in:
return redirect(url_for('routes_dog_home.home'))
return render_template('pages/dog/_home.html', model = model)

View File

@@ -51,7 +51,7 @@ def locations():
Helper_App.console_log(f'form_filters={form_filters}')
model = Model_View_Dog_Location(form_filters_old = form_filters)
if not model.is_user_logged_in:
return redirect(url_for('routes_core_home.home'))
return redirect(url_for('routes_dog_home.home'))
Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/dog/_locations.html', model = model)

View File

@@ -169,7 +169,7 @@ def logout():
@routes_user.route("/logout_callback")
@handle_db_disconnect
def logout_callback():
return redirect(url_for('routes_core_home.home'))
return redirect(url_for('routes_dog_home.home'))
@routes_user.route("/account")
def user():
@@ -185,7 +185,7 @@ def user():
break
model.users = [model.user]
if not model.is_user_logged_in:
return redirect(url_for('routes_core_home.home'))
return redirect(url_for('routes_dog_home.home'))
html_body = render_template('pages/user/_user.html', model = model)
except Exception as e:
return str(e)

View File

@@ -0,0 +1,61 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Backend
Feature: Calendar Entry Form
Description:
Defines Flask-WTF form for handling user input on Calendar Entries page.
"""
# IMPORTS
# internal
from business_objects.base import Base
from business_objects.dog.calendar_entry_type import Calendar_Entry_Type
# from business_objects.dog.calendar_entry import Calendar_Entry # Circular
from helpers.helper_app import Helper_App
# from models.model_view_store import Model_View_Store # circular
# from models.model_view_base import Model_View_Base
from forms.base import Form_Base
import lib.argument_validation as av
# external
from flask import Flask, render_template, request, flash, redirect, url_for, current_app
from flask_wtf import FlaskForm
from wtforms import SelectField, BooleanField, StringField, SubmitField
from wtforms.validators import DataRequired, Email, ValidationError
import markupsafe
from flask_wtf.recaptcha import RecaptchaField
from abc import ABCMeta, abstractmethod
import json
class Filters_Calendar_Entry(Form_Base):
search = StringField(
'Search'
)
id_calendar_entry_type = SelectField(
'Type'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
active_only = BooleanField(
'Active'
, default = True
)
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
Helper_App.console_log(f'{_m}\njson: {json}')
filters = cls()
filters.search.data = json[Base.FLAG_SEARCH]
filters.id_calendar_entry_type = json[Calendar_Entry_Type.ATTR_ID_CALENDAR_ENTRY_TYPE]
filters.active_only.data = av.input_bool(json[Base.FLAG_ACTIVE_ONLY], Base.FLAG_ACTIVE_ONLY, f'{cls.__name__}.from_json')
return filters
def to_json(self):
return {
Base.FLAG_SEARCH: self.search.data
, Base.FLAG_ACTIVE_ONLY: self.active_only.data
}

View File

@@ -25,6 +25,8 @@ from business_objects.dog.assessment_response import Assessment_Response
from business_objects.dog.bribe import Bribe
from business_objects.dog.button_icon import Button_Icon
from business_objects.dog.button_shape import Button_Shape
from business_objects.dog.calendar_entry import Calendar_Entry
from business_objects.dog.calendar_entry_type import Calendar_Entry_Type
from business_objects.dog.colour import Colour
from business_objects.dog.command import Command
from business_objects.dog.command_button_link import Command_Button_Link
@@ -62,6 +64,8 @@ class Model_View_Base(BaseModel, ABC):
ATTR_ID_BRIBE: ClassVar[str] = Bribe.ATTR_ID_BRIBE
ATTR_ID_BUTTON_ICON: ClassVar[str] = Button_Icon.ATTR_ID_BUTTON_ICON
ATTR_ID_BUTTON_SHAPE: ClassVar[str] = Button_Shape.ATTR_ID_BUTTON_SHAPE
ATTR_ID_CALENDAR_ENTRY: ClassVar[str] = Calendar_Entry.ATTR_ID_CALENDAR_ENTRY
ATTR_ID_CALENDAR_ENTRY_TYPE: ClassVar[str] = Calendar_Entry_Type.ATTR_ID_CALENDAR_ENTRY_TYPE
ATTR_ID_COLOUR: ClassVar[str] = Colour.ATTR_ID_COLOUR
ATTR_ID_COMMAND: ClassVar[str] = Command.ATTR_ID_COMMAND
ATTR_ID_COMMAND_BUTTON_LINK: ClassVar[str] = Command_Button_Link.ATTR_ID_COMMAND_BUTTON_LINK
@@ -124,6 +128,8 @@ class Model_View_Base(BaseModel, ABC):
FLAG_BUTTON_PRIMARY: ClassVar[str] = 'button-primary'
FLAG_BUTTON_SHAPE: ClassVar[str] = Button_Shape.FLAG_BUTTON_SHAPE
FLAG_CANCEL: ClassVar[str] = 'button-cancel'
FLAG_CALENDAR_ENTRY: ClassVar[str] = Calendar_Entry.FLAG_CALENDAR_ENTRY
FLAG_CALENDAR_ENTRY_TYPE: ClassVar[str] = Calendar_Entry_Type.FLAG_CALENDAR_ENTRY_TYPE
FLAG_CALLBACK: ClassVar[str] = 'callback'
FLAG_CAPTCHA: ClassVar[str] = 'captcha'
FLAG_CARD: ClassVar[str] = 'card'
@@ -192,6 +198,7 @@ class Model_View_Base(BaseModel, ABC):
FLAG_NAV_DOG_ASSESSMENT: ClassVar[str] = 'navDogAssessment'
FLAG_NAV_DOG_ASSESSMENTS: ClassVar[str] = 'navDogAssessments'
FLAG_NAV_DOG_BUTTON_ICONS: ClassVar[str] = 'navDogButtonIcons'
FLAG_NAV_DOG_CALENDAR_ENTRIES: ClassVar[str] = 'navDogCalendarEntries'
FLAG_NAV_DOG_COLOURS: ClassVar[str] = 'navDogColours'
FLAG_NAV_DOG_COMMAND_BUTTON_LINKS: ClassVar[str] = 'navDogCommandButtonLinks'
FLAG_NAV_DOG_COMMAND_CATEGORIES: ClassVar[str] = 'navDogCommandCategories'
@@ -209,6 +216,7 @@ class Model_View_Base(BaseModel, ABC):
FLAG_OBEDIENCE_LEVEL: ClassVar[str] = Obedience_Level.FLAG_OBEDIENCE_LEVEL
FLAG_OVERLAY: ClassVar[str] = 'overlay'
FLAG_PAGE_BODY: ClassVar[str] = 'page-body'
FLAG_PRICE: ClassVar[str] = Base.FLAG_PRICE
FLAG_PRICING: ClassVar[str] = 'pricing'
FLAG_QUANTITY: ClassVar[str] = 'quantity'
FLAG_RESPONSE_QUALITY_METRIC: ClassVar[str] = Response_Quality_Metric.FLAG_RESPONSE_QUALITY_METRIC
@@ -225,6 +233,7 @@ class Model_View_Base(BaseModel, ABC):
FLAG_SUCCESS: ClassVar[str] = 'success'
FLAG_TABLE_MAIN: ClassVar[str] = 'table-main'
FLAG_TEMPORARY_ELEMENT: ClassVar[str] = 'temporary-element'
FLAG_TESTIMONIAL: ClassVar[str] = 'testimonial'
FLAG_USER: ClassVar[str] = User.FLAG_USER
# FLAG_VALUE_PROPOSITION: ClassVar[str] = 'value-proposition'
FLAG_WEATHER: ClassVar[str] = Weather.FLAG_WEATHER
@@ -240,6 +249,7 @@ class Model_View_Base(BaseModel, ABC):
HASH_PAGE_DOG_ASSESSMENT: ClassVar[str] = '/dog/assessment'
HASH_PAGE_DOG_ASSESSMENTS: ClassVar[str] = '/dog/assessments'
HASH_PAGE_DOG_BUTTON_ICONS: ClassVar[str] = '/dog/button-icons'
HASH_PAGE_DOG_CALENDAR_ENTRIES: ClassVar[str] = '/dog/calendar-entries'
HASH_PAGE_DOG_COMMAND_BUTTON_LINKS: ClassVar[str] = '/dog/command-button-links'
HASH_PAGE_DOG_COMMAND_CATEGORIES: ClassVar[str] = '/dog/command-categories'
HASH_PAGE_DOG_COMMANDS: ClassVar[str] = '/dog/commands'
@@ -404,6 +414,11 @@ class Model_View_Base(BaseModel, ABC):
return ''
return date_time.strftime('%Y-%m-%dT%H:%M')
@staticmethod
def format_datetime_text(date_time):
if date_time is None:
return ''
return date_time.strftime('%d/%m/%Y %H:%M')
@staticmethod
def jsonify(data):
return jsonify(data)
def get_mail_contact_public(self):

View File

@@ -0,0 +1,96 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: View Models
Feature: Dog Calendar Entries View Model
Description:
Data model for dog calendar entries view
"""
# internal
from business_objects.dog.calendar_entry import Calendar_Entry #, Parameters_Calendar_Entry
from business_objects.dog.calendar_entry_type import Calendar_Entry_Type
from datastores.datastore_dog import DataStore_Dog
from models.model_view_dog_base import Model_View_Dog_Base
from forms.dog.calendar_entry import Filters_Calendar_Entry
# from routes import bp_home
from helpers.helper_app import Helper_App
import lib.argument_validation as av
# external
from datetime import datetime
from pydantic import BaseModel
from typing import ClassVar
class Model_View_Dog_Calendar_Entry(Model_View_Dog_Base):
FLAG_IS_CALENDAR_ENTRY_TYPE_BILL: ClassVar[str] = Calendar_Entry.FLAG_IS_CALENDAR_ENTRY_TYPE_BILL
calendar_entries: list = None
form_filters: Filters_Calendar_Entry = None
form_filters_old: Filters_Calendar_Entry
def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_CALENDAR_ENTRIES):
_m = 'Model_View_Dog_Calendar_Entry.__init__'
Helper_App.console_log(f'{_m}\nstarting...')
super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old)
self._title = 'Overdue Bills'
self.form_filters = form_filters_old
datastore = DataStore_Dog()
Helper_App.console_log(f'Form filters: {self.form_filters}')
# parameters_filter_calendar_entry = Parameters_Calendar_Entry.from_form_filters_calendar_entry(self.form_filters)
# Helper_App.console_log(f'Query args: {parameters_filter_calendar_entry}')
# self.calendar_entrys, errors = datastore.get_many_calendar_entry(parameters_filter_calendar_entry)
id_calendar_entry_type_bill = 1
calendar_entry_types = {
id_calendar_entry_type_bill: Calendar_Entry_Type.from_json({
Calendar_Entry_Type.ATTR_ID_CALENDAR_ENTRY_TYPE: id_calendar_entry_type_bill
, Calendar_Entry_Type.FLAG_CODE: 'BILL'
, Calendar_Entry_Type.FLAG_NAME: 'Bill'
, Calendar_Entry_Type.FLAG_ACTIVE: True
})
}
bill_1 = Calendar_Entry.from_json({
Calendar_Entry.ATTR_ID_CALENDAR_ENTRY: 1
, Calendar_Entry_Type.ATTR_ID_CALENDAR_ENTRY_TYPE: id_calendar_entry_type_bill
, Calendar_Entry.FLAG_NAME: 'Client 1, monthly: July'
, Calendar_Entry.FLAG_PRICE: 200
, Calendar_Entry.FLAG_DATE_FROM: datetime(2025, 7, 26, 12, 0, 0)
, Calendar_Entry.FLAG_DATE_TO: datetime(2025, 7, 26, 12, 0, 0)
, Calendar_Entry.FLAG_ACTIVE: True
})
bill_1.calendar_entry_type = calendar_entry_types[id_calendar_entry_type_bill]
bill_1.is_calendar_entry_type_bill = True
bill_2 = Calendar_Entry.from_json({
Calendar_Entry.ATTR_ID_CALENDAR_ENTRY: 1
, Calendar_Entry_Type.ATTR_ID_CALENDAR_ENTRY_TYPE: id_calendar_entry_type_bill
, Calendar_Entry.FLAG_NAME: 'Client 2, monthly: July'
, Calendar_Entry.FLAG_PRICE: 200
, Calendar_Entry.FLAG_DATE_FROM: datetime(2025, 7, 25, 11, 0, 0)
, Calendar_Entry.FLAG_DATE_TO: datetime(2025, 7, 25, 11, 0, 0)
, Calendar_Entry.FLAG_ACTIVE: True
})
bill_2.calendar_entry_type = calendar_entry_types[id_calendar_entry_type_bill]
bill_2.is_calendar_entry_type_bill = True
bill_3 = Calendar_Entry.from_json({
Calendar_Entry.ATTR_ID_CALENDAR_ENTRY: 1
, Calendar_Entry_Type.ATTR_ID_CALENDAR_ENTRY_TYPE: id_calendar_entry_type_bill
, Calendar_Entry.FLAG_NAME: 'Client 3, monthly: July'
, Calendar_Entry.FLAG_PRICE: 200
, Calendar_Entry.FLAG_DATE_FROM: datetime(2025, 7, 23, 9, 0, 0)
, Calendar_Entry.FLAG_DATE_TO: datetime(2025, 7, 23, 9, 0, 0)
, Calendar_Entry.FLAG_ACTIVE: True
})
bill_3.calendar_entry_type = calendar_entry_types[id_calendar_entry_type_bill]
bill_3.is_calendar_entry_type_bill = True
self.calendar_entries = [
bill_1
, bill_2
, bill_3
]

View File

@@ -0,0 +1,264 @@
SELECT *
FROM demo.DOG_Assessment A
WHERE A.id_assessment = 21
ORDER BY A.created_on DESC
;
SELECT *
FROM demo.DOG_Distraction D
INNER JOIN demo.DOG_Assessment A ON D.id_assessment = A.id_assessment
WHERE
D.id_distraction = 5
-- A.id_assessment = 21
ORDER BY A.created_on DESC, D.created_on DESC
;
SELECT *
FROM demo.DOG_Assessment_Command_Modality_Link ACML
INNER JOIN demo.DOG_Assessment A ON ACML.id_assessment = A.id_assessment
WHERE
-- ACML.id_link = 5
A.id_assessment = 21
ORDER BY A.created_on DESC, ACML.created_on DESC
;
SELECT *
FROM demo.DOG_Assessment_Response AR
INNER JOIN demo.DOG_Assessment_Command_Modality_Link ACML ON AR.id_assessment_command_modality_link = ACML.id_link
INNER JOIN demo.DOG_Assessment A ON ACML.id_assessment = A.id_assessment
WHERE
-- ACML.id_link = 5
A.id_assessment = 21
ORDER BY A.created_on DESC, ACML.created_on DESC
;
/*
INSERT INTO demo.DOG_Assessment_Command_Modality_Link (
id_assessment
, id_command
, id_command_modality
,id_bribe
,distance_from_handler_metres
,is_in_sight_of_handler
,is_in_scent_range_of_handler
,is_in_hearing_range_of_handler
,is_on_lead
,active
)
SELECT
21 -- id_assessment
, C.id_command
, 1 + (C.id_command % 3) -- id_command_modality
, 1 + ((1 + C.id_command) % 3) -- id_bribe
, 1 + ((2 + C.id_command) % 3) -- distance_from_handler_metres
, case when (C.id_command % 3) = 0 then 0 else 1 end -- is_in_sight_of_handler
,case when ((1 + C.id_command) % 3) = 0 then 0 else 1 end -- is_in_scent_range_of_handler
, case when ((2 + C.id_command) % 3) = 0 then 0 else 1 end -- is_in_hearing_range_of_handler
, case when (C.id_command % 17) = 0 then 1 else 0 end -- is_on_lead
, 1 -- active
FROM demo.DOG_Command C
-- INNER JOIN Filtered_Commands FC ON C.id_command = FC.id_command
-- WHERE FC.index_command_in_category % 3 =
WHERE (C.id_command % 7 = 0) or (C.id_command % 11 = 0) or (C.id_command % 13 = 0)
;
INSERT INTO demo.DOG_Assessment_Response (
id_assessment_command_modality_link
, id_response_quality_metric
, id_obedience_level
, value_measured
)
SELECT
ACML.id_link AS id_assessment_command_modality_link
, METRIC.id_response_quality_metric
, 1 + (ACML.id_command % 8) id_obedience_level
, 1 + ((METRIC.id_response_quality_metric * 3 + ACML.id_command) % 8) value_measured
FROM demo.DOG_Assessment_Command_Modality_Link ACML
INNER JOIN demo.DOG_Assessment A ON ACML.id_assessment = A.id_assessment
CROSS JOIN (
SELECT 3 AS id_response_quality_metric
UNION
SELECT 1 AS id_response_quality_metric
) METRIC
WHERE
A.id_assessment = 21
AND ACML.id_link <> 5
;
WITH
ACML_Response_Count AS (
SELECT
ACML.id_link
, COUNT(*) AS response_count
FROM demo.DOG_Assessment_Command_Modality_Link ACML
INNER JOIN demo.DOG_Assessment_Response AR ON ACML.id_link = AR.id_assessment_command_modality_link
GROUP BY ACML.id_link
)
, ACML_With_Responses AS (
SELECT
ACML.id_link
, CASE WHEN IFNULL(ACML_RESPONSE_COUNT.response_count, 0) > 0 THEN 1 ELSE 0 END AS has_responses
FROM demo.DOG_Assessment_Command_Modality_Link ACML
LEFT JOIN ACML_Response_Count ACML_RESPONSE_COUNT ON ACML.id_link = ACML_RESPONSE_COUNT.id_link
)
, Category_Size_Known AS (
SELECT
CC.id_command_category
, COUNT(*) AS count_known_commands
FROM demo.DOG_Command_Category CC
INNER JOIN demo.DOG_Command C ON CC.id_command_category = C.id_command_category
LEFT JOIN demo.DOG_Assessment_Command_Modality_Link ACML ON C.id_command = ACML.id_command
LEFT JOIN ACML_With_Responses ACML_WITH_RESPONSES ON ACML.id_link = ACML_WITH_RESPONSES.id_link
LEFT JOIN demo.DOG_Assessment A ON ACML.id_assessment = A.id_assessment
-- LEFT JOIN demo.DOG_Assessment_Response AR ON ACML.id_link = AR.id_assessment_command_modality_link
WHERE
ACML_WITH_RESPONSES.has_responses = 1
AND CC.active = 1
AND C.active = 1
AND ACML.active = 1
AND A.active = 1
AND A.id_assessment = 21
GROUP BY CC.id_command_category
)
, Category_Size AS (
SELECT
CC.id_command_category
, COUNT(*) AS count_commands
FROM demo.DOG_Command_Category CC
INNER JOIN demo.DOG_Command C ON CC.id_command_category = C.id_command_category
WHERE
CC.active = 1
AND C.active = 1
GROUP BY CC.id_command_category
)
SELECT *
FROM demo.DOG_Command_Category CC
LEFT JOIN Category_Size_Known C_SIZE_KNOWN ON CC.id_command_category = C_SIZE_KNOWN.id_command_category
LEFT JOIN Category_Size C_SIZE ON CC.id_command_category = C_SIZE.id_command_category
WHERE CC.active = 1
;
INSERT INTO demo.DOG_Assessment (
id_temp
, id_weather
, id_lighting_level
, id_location
, id_user_handler
, notes
, temperature_celcius
, created_on
)
SELECT
A.id_assessment
, A.id_weather
, A.id_lighting_level
, A.id_location
, A.id_user_handler
, A.notes
, A.temperature_celcius
, DATE_SUB(A.created_on, INTERVAL 5 WEEK)
FROM demo.DOG_Assessment A
WHERE A.id_assessment <= 21
;
INSERT INTO demo.DOG_Distraction (
id_temp
, id_assessment
, id_distraction_type
, id_intensity_level_emotional
, id_intensity_level_scent
, id_intensity_level_sight
, id_intensity_level_sound
, id_intensity_level_touch
, quantity
, proximity_metres
, notes
)
SELECT
D.id_distraction
, D.id_assessment
, D.id_distraction_type
, D.id_intensity_level_emotional
, D.id_intensity_level_scent
, D.id_intensity_level_sight
, D.id_intensity_level_sound
, D.id_intensity_level_touch
, D.quantity
, D.proximity_metres
, D.notes
FROM demo.DOG_Distraction D
INNER JOIN demo.DOG_Assessment A
-- ON D.id_assessment = A.id_assessment
ON D.id_assessment = A.id_temp
AND A.id_assessment > 910
-- WHERE A.id_assessment <= 21
;
INSERT INTO demo.DOG_Assessment_Command_Modality_Link (
id_temp
, id_assessment
, id_command
, id_command_modality
, id_bribe
, distance_from_handler_metres
, is_in_sight_of_handler
, is_in_scent_range_of_handler
, is_in_hearing_range_of_handler
, is_on_lead
)
SELECT
ACML.id_link
, ACML.id_assessment
, ACML.id_command
, ACML.id_command_modality
, ACML.id_bribe
, ACML.distance_from_handler_metres
, ACML.is_in_sight_of_handler
, ACML.is_in_scent_range_of_handler
, ACML.is_in_hearing_range_of_handler
, ACML.is_on_lead
FROM demo.DOG_Assessment_Command_Modality_Link ACML
INNER JOIN demo.DOG_Assessment A
-- ON ACML.id_assessment = A.id_assessment
ON ACML.id_assessment = A.id_temp
AND A.id_assessment > 910
-- WHERE A.id_assessment <= 21
;
INSERT INTO demo.DOG_Assessment_Response (
id_temp
, id_assessment_command_modality_link
, id_response_quality_metric
, id_obedience_level
, value_measured
, notes
)
SELECT
AR.id_response
, ACML.id_link -- (SELECT ACML_NEW.id_assessment_command_modality_link FROM demo.DOG_Assessment_Command_Modality_Link ACML_NEW WHERE ACML_NEW.id_temp
, AR.id_response_quality_metric
, AR.id_obedience_level
, POWER(CASE WHEN AR.id_obedience_level = 3 THEN 0.9 ELSE 1.35 END, 6) * AR.value_measured
, AR.notes
FROM demo.DOG_Assessment_Response AR
INNER JOIN demo.DOG_Assessment_Command_Modality_Link ACML
-- ON AR.id_assessment_command_modality_link = ACML.id_link
ON AR.id_assessment_command_modality_link = ACML.id_temp
AND ACML.id_link > 3168
-- INNER JOIN demo.DOG_Assessment A ON AR.id_assessment = A.id_assessment
-- WHERE A.id_assessment <= 21
;
-- DELETE A FROM demo.DOG_Assessment A WHERE A.id_assessment > 21;
-- DELETE A FROM demo.DOG_Assessment A WHERE A.id_assessment > 21;
-- DELETE A FROM demo.DOG_Assessment A WHERE A.id_assessment > 21;
-- DELETE A FROM demo.DOG_Assessment A WHERE A.id_assessment > 21;
*/
SELECT *
FROM demo.DOG_Assessment_Response AR
INNER JOIN demo.DOG_Assessment_Command_Modality_Link ACML ON AR.id_assessment_command_modality_link = ACML.id_link
INNER JOIN demo.DOG_Assessment A ON ACML.id_assessment = A.id_assessment
INNER JOIN demo.DOG_Command C ON ACML.id_command = C.id_command
WHERE C.name LIKE '%SIT%'
ORDER BY A.created_on, AR.id_response
;

View File

@@ -14,16 +14,21 @@
height: 15vh;
align-items: flex-start;
}
.topnav a, .topnav label, .topnav p, .topnav h1 {
.topnav a,
.topnav label,
.topnav p,
.topnav h1 {
float: left;
display: flex;
text-align: center;
text-decoration: none;
width: 100%;
max-height: 15vh;
font-weight: normal;
justify-content: center;
}
.topnav h1 {
color: var(--colour-text-link-visited);
}
.topnav a:hover {
background-color: var(--colour-page-background);
}
@@ -35,7 +40,7 @@
align-self: center;
display: flex;
}
.topnav > .container.header-logo {
.topnav > .container.logo {
min-width: 15vh;
max-width: 15vh;
}

View File

@@ -100,11 +100,11 @@ script, link {
}
/* header image */
img.header-logo {
img.logo {
max-height: 15vh;
max-width: 15vh;
cursor: pointer;
border-radius: 3vh;
/* border-radius: 3vh; */
}
/* icon images */
@@ -236,10 +236,10 @@ input.dirty, textarea.dirty, select.dirty {
@media screen and (max-width: 400px) {
img.header-logo {
/*
img.logo {
border-radius: 3vh;
}
/*
.company-name {
font-size: 14px;
}

View File

@@ -15,12 +15,12 @@ ul li {
}
section.benefits,
section.solution {
section.social-proof {
padding: 4rem 0;
background: var(--colour-text-background);
}
section.benefits .card.benefits,
section.solution .card.solution {
section.social-proof .card.social-proof {
padding: 2rem;
background: var(--colour-page-background);
border-radius: 8px;
@@ -29,12 +29,14 @@ section.solution .card.solution {
}
section.problem,
section.early-access {
section.solution,
section.testimonial {
padding: 4rem 0;
background: var(--colour-page-background-1);
}
section.problem .card.problem,
section.early-access .card.early-access {
section.solution .card.solution,
section.testimonial .card.testimonial {
background: var(--colour-text-background);
padding: 2rem;
border-radius: 8px;
@@ -44,9 +46,7 @@ section.early-access .card.early-access {
}
section.benefits ul li,
section.solution ul li,
section.early-access ul li {
section.problem ul li {
list-style: none;
}
@@ -73,6 +73,10 @@ section.early-access ul li {
color: var(--colour-secondary);
}
section.hero .button {
margin: 1vh auto;
display: block;
}
/* Problem Section */
@@ -87,8 +91,17 @@ section.problem .section-subtitle {
/* font-size: 18px; */
font-weight: bold;
}
/*
section.problem ul li::before {
content: "😤";
position: absolute;
left: 0;
}
*/
section.problem ul li {
list-style: none;
}
/* Solution Section */
/* Benefits Section * /
section.benefits .section-subtitle {
@@ -97,6 +110,25 @@ section.benefits .section-subtitle {
}
*/
section.benefits .container .card .container {
min-width: 250px;
}
/* Solution Section */
section.solution .container .card {
margin-top: 1vh;
max-width: min(2000px, 90vw);
}
section.benefits .card.benefits .container,
section.solution .container .card .container {
padding: 1vh 2vw;
}
section.solution .project-thumbnail img {
max-width: 500px;
max-height: 500px;
}
/* Social Proof Section * /
section.social-proof {
padding: 6rem 0;
@@ -121,10 +153,23 @@ section.social-proof ul {
section.social-proof .section-subtitle {
font-size: 16px;
}
*/
section.social-proof ul li {
font-size: 14px;
}
*/
section.benefits .card.benefits,
section.social-proof .card.social-proof {
display: flex;
}
section.social-proof .section-title {
font-weight: bold;
color: var(--colour-text-link-visited);
margin-bottom: 0.25vh;
}
section.social-proof .container {
max-width: min(600px, 90vw);
width: fit-content;
}
/* Early Access Section * /
section.early-access {
@@ -164,12 +209,32 @@ section.features .button {
text-align: center;
}
section.cta-2 .button {
margin: 2vh 1vw;
}
section.cta-2 .card {
background-color: transparent;
}
section.cta-2 .card .container {
background-color: var(--colour-page-background);
color: var(--colour-primary);
border-radius: 1vh;
padding: 2vh 1vw;
margin: 1vh;
}
/* FAQs * /
section.faq .button {
margin-bottom: 0.25rem;
}
*/
@media screen and (max-width: 640px) {
header .navbar .nav-links {
display: none;
}
}
/* Animations */
/* Fallback styles to ensure content is visible without JS */
.reveal {

View File

@@ -0,0 +1,40 @@
#formFilters .container.save.button-cancel {
display: none;
}
#tableMain tbody > div {
width: 49vh;
}
/*
#tableMain tbody tr td.date_from.date_to div {
height: 3vh;
}
*/
#tableMain thead tr th.name,
#tableMain tbody tr td.name {
min-width: 43vw;
max-width: 43vw;
}
#tableMain thead tr th.is-calendar-entry-type-bill,
#tableMain tbody tr td.is-calendar-entry-type-bill {
display: none;
}
@media screen and (max-width: 450px) {
#tableMain {
max-width: 90vw;
}
#tableMain thead tr th.date_from,
#tableMain tbody tr td.date_from {
min-width: 20vw;
max-width: 20vw;
}
#tableMain thead tr th.price,
#tableMain tbody tr td.price {
min-width: 12vw;
max-width: 12vw;
}
}

View File

@@ -56,7 +56,7 @@
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0 2vw;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;

View File

@@ -172,12 +172,12 @@ ul li {
}
section.benefits,
section.solution {
section.social-proof {
padding: 4rem 0;
background: var(--colour-text-background);
}
section.benefits .card.benefits,
section.solution .card.solution {
section.social-proof .card.social-proof {
padding: 2rem;
background: var(--colour-page-background);
border-radius: 8px;
@@ -186,12 +186,14 @@ section.solution .card.solution {
}
section.problem,
section.early-access {
section.solution,
section.testimonial {
padding: 4rem 0;
background: var(--colour-page-background-1);
}
section.problem .card.problem,
section.early-access .card.early-access {
section.solution .card.solution,
section.testimonial .card.testimonial {
background: var(--colour-text-background);
padding: 2rem;
border-radius: 8px;
@@ -201,9 +203,7 @@ section.early-access .card.early-access {
}
section.benefits ul li,
section.solution ul li,
section.early-access ul li {
section.problem ul li {
list-style: none;
}
@@ -230,6 +230,10 @@ section.early-access ul li {
color: var(--colour-secondary);
}
section.hero .button {
margin: 1vh auto;
display: block;
}
/* Problem Section */
@@ -244,8 +248,17 @@ section.problem .section-subtitle {
/* font-size: 18px; */
font-weight: bold;
}
/*
section.problem ul li::before {
content: "😤";
position: absolute;
left: 0;
}
*/
section.problem ul li {
list-style: none;
}
/* Solution Section */
/* Benefits Section * /
section.benefits .section-subtitle {
@@ -254,6 +267,25 @@ section.benefits .section-subtitle {
}
*/
section.benefits .container .card .container {
min-width: 250px;
}
/* Solution Section */
section.solution .container .card {
margin-top: 1vh;
max-width: min(2000px, 90vw);
}
section.benefits .card.benefits .container,
section.solution .container .card .container {
padding: 1vh 2vw;
}
section.solution .project-thumbnail img {
max-width: 500px;
max-height: 500px;
}
/* Social Proof Section * /
section.social-proof {
padding: 6rem 0;
@@ -278,10 +310,23 @@ section.social-proof ul {
section.social-proof .section-subtitle {
font-size: 16px;
}
*/
section.social-proof ul li {
font-size: 14px;
}
*/
section.benefits .card.benefits,
section.social-proof .card.social-proof {
display: flex;
}
section.social-proof .section-title {
font-weight: bold;
color: var(--colour-text-link-visited);
margin-bottom: 0.25vh;
}
section.social-proof .container {
max-width: min(600px, 90vw);
width: fit-content;
}
/* Early Access Section * /
section.early-access {
@@ -321,12 +366,32 @@ section.features .button {
text-align: center;
}
section.cta-2 .button {
margin: 2vh 1vw;
}
section.cta-2 .card {
background-color: transparent;
}
section.cta-2 .card .container {
background-color: var(--colour-page-background);
color: var(--colour-primary);
border-radius: 1vh;
padding: 2vh 1vw;
margin: 1vh;
}
/* FAQs * /
section.faq .button {
margin-bottom: 0.25rem;
}
*/
@media screen and (max-width: 640px) {
header .navbar .nav-links {
display: none;
}
}
/* Animations */
/* Fallback styles to ensure content is visible without JS */
.reveal {

File diff suppressed because one or more lines are too long

View File

@@ -56,7 +56,7 @@
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0 2vw;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;

File diff suppressed because one or more lines are too long

View File

@@ -56,7 +56,7 @@
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0 2vw;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_assessments.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,cAAc;QACd,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C","sources":["webpack://app/./static/css/sections/dog.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}"],"names":[],"sourceRoot":""}
{"version":3,"file":"css/dog_assessments.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C","sources":["webpack://app/./static/css/sections/dog.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0.75vh 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}"],"names":[],"sourceRoot":""}

View File

@@ -56,7 +56,7 @@
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0 2vw;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_button_icons.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,cAAc;QACd,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;;ACxEA;IACI,WAAW;AACf","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/button_icons.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n\n#tableMain tbody > div {\n width: 49vh;\n}\n"],"names":[],"sourceRoot":""}
{"version":3,"file":"css/dog_button_icons.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;;ACxEA;IACI,WAAW;AACf","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/button_icons.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0.75vh 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n\n#tableMain tbody > div {\n width: 49vh;\n}\n"],"names":[],"sourceRoot":""}

View File

@@ -0,0 +1,118 @@
.container-input > input {
padding: 0vh 1vh;
border-radius: 0.5vh;
max-width: 7vh;
}
#basket {
max-width: 100%;
}
/* Right column */
.rightcolumn {
min-width: fit-content;
}
/* Main Table */
#pageBody {
/* height: 69vh !important; */
max-height: 79vh;
padding: 0 5vw;
margin: 0;
border: 0;
align-content: center;
justify-content: flex-start;
display: flex;
flex-direction: column;
align-items: flex-start;
overflow-y: auto;
overflow-x: hidden;
position: absolute;
width: 90vw;
color: var(--colour-text);
}
/* Footer */
.footer {
padding: 1vh 1vw;
text-align: center;
margin: 0;
max-height: 5vh;
overflow-y: auto;
background-color: var(--colour-accent);
position: absolute;
bottom: 0;
width: 98vw;
}
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;
}
.footer > h4 {
font-size: 10px;
}
.footer > h5 {
font-size: 9px;
}
}
.footer > h4, h5 {
padding: 0;
margin: 0;
}
#formFilters .container.save.button-cancel {
display: none;
}
#tableMain tbody > div {
width: 49vh;
}
/*
#tableMain tbody tr td.date_from.date_to div {
height: 3vh;
}
*/
#tableMain thead tr th.name,
#tableMain tbody tr td.name {
min-width: 43vw;
max-width: 43vw;
}
#tableMain thead tr th.is-calendar-entry-type-bill,
#tableMain tbody tr td.is-calendar-entry-type-bill {
display: none;
}
@media screen and (max-width: 450px) {
#tableMain {
max-width: 90vw;
}
#tableMain thead tr th.date_from,
#tableMain tbody tr td.date_from {
min-width: 20vw;
max-width: 20vw;
}
#tableMain thead tr th.price,
#tableMain tbody tr td.price {
min-width: 12vw;
max-width: 12vw;
}
}
/*# sourceMappingURL=dog_calendar_entries.bundle.css.map*/

View File

@@ -0,0 +1 @@
{"version":3,"file":"css/dog_calendar_entries.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;;ACxEA;IACI,aAAa;AACjB;;AAEA;IACI,WAAW;AACf;;AAEA;;;;CAIC;AACD;;IAEI,eAAe;IACf,eAAe;AACnB;AACA;;IAEI,aAAa;AACjB;;AAEA;IACI;QACI,eAAe;IACnB;IACA;;QAEI,eAAe;QACf,eAAe;IACnB;IACA;;QAEI,eAAe;QACf,eAAe;IACnB;AACJ","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/calendar_entries.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0.75vh 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n\n#formFilters .container.save.button-cancel {\n display: none;\n}\n\n#tableMain tbody > div {\n width: 49vh;\n}\n\n/*\n#tableMain tbody tr td.date_from.date_to div {\n height: 3vh;\n}\n*/\n#tableMain thead tr th.name,\n#tableMain tbody tr td.name {\n min-width: 43vw;\n max-width: 43vw;\n}\n#tableMain thead tr th.is-calendar-entry-type-bill,\n#tableMain tbody tr td.is-calendar-entry-type-bill {\n display: none;\n}\n\n@media screen and (max-width: 450px) {\n #tableMain {\n max-width: 90vw;\n }\n #tableMain thead tr th.date_from,\n #tableMain tbody tr td.date_from {\n min-width: 20vw;\n max-width: 20vw;\n }\n #tableMain thead tr th.price,\n #tableMain tbody tr td.price {\n min-width: 12vw;\n max-width: 12vw;\n }\n}\n"],"names":[],"sourceRoot":""}

View File

@@ -56,7 +56,7 @@
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0 2vw;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_command_button_links.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,cAAc;QACd,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;ACzEA;;;CAGC;;;AAGD;IACI,YAAY;AAChB;;AAEA;;;;;;;CAOC;AACD;;;;;;IAMI,eAAe;IACf,eAAe;AACnB;;AAEA;;;;CAIC;;AAED;IACI;;QAEI,eAAe;QACf,eAAe;IACnB;AACJ","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/command_button_links.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n/*\n#formFilters .container-input.filter.active_only {\n}\n*/\n\n\n#tableMain tbody > div {\n width: 113vh;\n}\n\n/*\n#tableMain tbody tr td table thead tr th.id_variation_type,\n#tableMain tbody tr td table tbody tr td.id_variation_type,\n#tableMain tbody tr td table thead tr th.id_variation, \n#tableMain tbody tr td table tbody tr td.id_variation {\n width: 47.5%;\n}\n*/\n#tableMain tbody tr td table thead tr th.button_shape, \n#tableMain tbody tr td table tbody tr td.button_shape,\n#tableMain tbody tr td table thead tr th.colour, \n#tableMain tbody tr td table tbody tr td.colour,\n#tableMain tbody tr td table thead tr th.button_icon, \n#tableMain tbody tr td table tbody tr td.button_icon {\n max-width: 12vh;\n max-width: 12vh;\n}\n\n/*\nselect.id_variation, select.id_variation_type {\n max-width: 40% !important;\n}\n*/\n\n@media screen and (max-width: 850px) {\n #formFilters input,\n #formFilters select {\n max-width: 12vh;\n min-width: 12vh;\n }\n}\n"],"names":[],"sourceRoot":""}
{"version":3,"file":"css/dog_command_button_links.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;ACzEA;;;CAGC;;;AAGD;IACI,YAAY;AAChB;;AAEA;;;;;;;CAOC;AACD;;;;;;IAMI,eAAe;IACf,eAAe;AACnB;;AAEA;;;;CAIC;;AAED;IACI;;QAEI,eAAe;QACf,eAAe;IACnB;AACJ","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/command_button_links.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0.75vh 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n/*\n#formFilters .container-input.filter.active_only {\n}\n*/\n\n\n#tableMain tbody > div {\n width: 113vh;\n}\n\n/*\n#tableMain tbody tr td table thead tr th.id_variation_type,\n#tableMain tbody tr td table tbody tr td.id_variation_type,\n#tableMain tbody tr td table thead tr th.id_variation, \n#tableMain tbody tr td table tbody tr td.id_variation {\n width: 47.5%;\n}\n*/\n#tableMain tbody tr td table thead tr th.button_shape, \n#tableMain tbody tr td table tbody tr td.button_shape,\n#tableMain tbody tr td table thead tr th.colour, \n#tableMain tbody tr td table tbody tr td.colour,\n#tableMain tbody tr td table thead tr th.button_icon, \n#tableMain tbody tr td table tbody tr td.button_icon {\n max-width: 12vh;\n max-width: 12vh;\n}\n\n/*\nselect.id_variation, select.id_variation_type {\n max-width: 40% !important;\n}\n*/\n\n@media screen and (max-width: 850px) {\n #formFilters input,\n #formFilters select {\n max-width: 12vh;\n min-width: 12vh;\n }\n}\n"],"names":[],"sourceRoot":""}

View File

@@ -56,7 +56,7 @@
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0 2vw;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_command_categories.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,cAAc;QACd,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;ACzEA;IACI,eAAe;IACf,eAAe;AACnB;;AAEA;IACI,eAAe;AACnB;AACA;;IAEI,WAAW;AACf;AACA;IACI,sCAAsC;AAC1C;AACA;;;CAGC;AACD;;IAEI,eAAe;IACf,eAAe;AACnB;;AAEA;IACI;;QAEI,eAAe;QACf,eAAe;IACnB;IACA;;QAEI,cAAc;QACd,cAAc;IAClB;AACJ,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/command_categories.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n#formFilters #search {\n max-width: 20vh;\n min-width: 20vh;\n}\n\n#tableMain tbody > div {\n max-width: 58vh;\n}\n#tableMain thead tr th,\n#tableMain tbody tr td {\n height: 3vh;\n}\n#tableMain tbody tr td.name .name {\n border: 1px solid var(--colour-accent);\n}\n/*\n#tableMain thead tr th.code,\n#tableMain tbody tr td.code,\n*/\n#tableMain thead tr th.name ,\n#tableMain tbody tr td.name {\n max-width: 50vh;\n min-width: 50vh;\n}\n\n@media screen and (max-width: 800px) {\n #tableMain thead tr th.name ,\n #tableMain tbody tr td.name {\n max-width: 63vw;\n min-width: 63vw;\n }\n #tableMain thead tr th.active ,\n #tableMain tbody tr td.active {\n max-width: 3vw;\n min-width: 3vw;\n }\n}"],"names":[],"sourceRoot":""}
{"version":3,"file":"css/dog_command_categories.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;ACzEA;IACI,eAAe;IACf,eAAe;AACnB;;AAEA;IACI,eAAe;AACnB;AACA;;IAEI,WAAW;AACf;AACA;IACI,sCAAsC;AAC1C;AACA;;;CAGC;AACD;;IAEI,eAAe;IACf,eAAe;AACnB;;AAEA;IACI;;QAEI,eAAe;QACf,eAAe;IACnB;IACA;;QAEI,cAAc;QACd,cAAc;IAClB;AACJ,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/command_categories.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0.75vh 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n#formFilters #search {\n max-width: 20vh;\n min-width: 20vh;\n}\n\n#tableMain tbody > div {\n max-width: 58vh;\n}\n#tableMain thead tr th,\n#tableMain tbody tr td {\n height: 3vh;\n}\n#tableMain tbody tr td.name .name {\n border: 1px solid var(--colour-accent);\n}\n/*\n#tableMain thead tr th.code,\n#tableMain tbody tr td.code,\n*/\n#tableMain thead tr th.name ,\n#tableMain tbody tr td.name {\n max-width: 50vh;\n min-width: 50vh;\n}\n\n@media screen and (max-width: 800px) {\n #tableMain thead tr th.name ,\n #tableMain tbody tr td.name {\n max-width: 63vw;\n min-width: 63vw;\n }\n #tableMain thead tr th.active ,\n #tableMain tbody tr td.active {\n max-width: 3vw;\n min-width: 3vw;\n }\n}"],"names":[],"sourceRoot":""}

View File

@@ -56,7 +56,7 @@
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0 2vw;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_commands.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,cAAc;QACd,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;ACzEA;;;;CAIC;;AAED;IACI,WAAW;AACf;AACA;;IAEI,cAAc;IACd,cAAc;AAClB;;AAEA;;;;;;;;CAQC,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/commands.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n/*\n#formFilters .container {\n max-width: fit-content;\n}\n*/\n\n#tableMain tbody > div {\n width: 99vh;\n}\n#tableMain thead tr th.can-have-button, \n#tableMain tbody tr td.can-have-button {\n max-width: 6vh;\n min-width: 6vh;\n}\n\n/*\n@media screen and (max-width: 600px) {\n #formFilters input,\n #formFilters select {\n width: 12vh;\n min-width: 12vh;\n }\n}\n*/"],"names":[],"sourceRoot":""}
{"version":3,"file":"css/dog_commands.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;ACzEA;;;;CAIC;;AAED;IACI,WAAW;AACf;AACA;;IAEI,cAAc;IACd,cAAc;AAClB;;AAEA;;;;;;;;CAQC,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/commands.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0.75vh 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n/*\n#formFilters .container {\n max-width: fit-content;\n}\n*/\n\n#tableMain tbody > div {\n width: 99vh;\n}\n#tableMain thead tr th.can-have-button, \n#tableMain tbody tr td.can-have-button {\n max-width: 6vh;\n min-width: 6vh;\n}\n\n/*\n@media screen and (max-width: 600px) {\n #formFilters input,\n #formFilters select {\n width: 12vh;\n min-width: 12vh;\n }\n}\n*/"],"names":[],"sourceRoot":""}

View File

@@ -56,7 +56,7 @@
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0 2vw;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_dog_command_links.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,cAAc;QACd,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;ACzEA;;;CAGC;;;AAGD;IACI,YAAY;AAChB;AACA;IACI,eAAe;AACnB;;AAEA;;;;;;IAMI,uCAAuC;IACvC,oBAAoB;AACxB;;AAEA;;;;IAII,YAAY;AAChB;;AAEA;;;;CAIC;;AAED;IACI;;QAEI,eAAe;QACf,eAAe;IACnB;AACJ","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/dog_command_links.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n/*\n#formFilters .container-input.filter.active_only {\n}\n*/\n\n\n#tableMain tbody > div {\n width: 113vh;\n}\n#tableMain {\n max-width: 90vw;\n}\n\ntd > input,\ntd > select,\ntd > textarea,\n.container-input > input,\n.container-input > select,\n.container-input > textarea {\n border: 2px solid var(--colour-primary);\n border-radius: 0.5vh;\n}\n\n#tableMain tbody tr td table thead tr th.id_variation_type,\n#tableMain tbody tr td table tbody tr td.id_variation_type,\n#tableMain tbody tr td table thead tr th.id_variation, \n#tableMain tbody tr td table tbody tr td.id_variation {\n width: 47.5%;\n}\n\n/*\nselect.id_variation, select.id_variation_type {\n max-width: 40% !important;\n}\n*/\n\n@media screen and (max-width: 850px) {\n #formFilters input,\n #formFilters select {\n max-width: 12vh;\n min-width: 12vh;\n }\n}\n"],"names":[],"sourceRoot":""}
{"version":3,"file":"css/dog_dog_command_links.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;ACzEA;;;CAGC;;;AAGD;IACI,YAAY;AAChB;AACA;IACI,eAAe;AACnB;;AAEA;;;;;;IAMI,uCAAuC;IACvC,oBAAoB;AACxB;;AAEA;;;;IAII,YAAY;AAChB;;AAEA;;;;CAIC;;AAED;IACI;;QAEI,eAAe;QACf,eAAe;IACnB;AACJ","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/dog_command_links.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0.75vh 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n/*\n#formFilters .container-input.filter.active_only {\n}\n*/\n\n\n#tableMain tbody > div {\n width: 113vh;\n}\n#tableMain {\n max-width: 90vw;\n}\n\ntd > input,\ntd > select,\ntd > textarea,\n.container-input > input,\n.container-input > select,\n.container-input > textarea {\n border: 2px solid var(--colour-primary);\n border-radius: 0.5vh;\n}\n\n#tableMain tbody tr td table thead tr th.id_variation_type,\n#tableMain tbody tr td table tbody tr td.id_variation_type,\n#tableMain tbody tr td table thead tr th.id_variation, \n#tableMain tbody tr td table tbody tr td.id_variation {\n width: 47.5%;\n}\n\n/*\nselect.id_variation, select.id_variation_type {\n max-width: 40% !important;\n}\n*/\n\n@media screen and (max-width: 850px) {\n #formFilters input,\n #formFilters select {\n max-width: 12vh;\n min-width: 12vh;\n }\n}\n"],"names":[],"sourceRoot":""}

View File

@@ -56,7 +56,7 @@
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0 2vw;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_dogs.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,cAAc;QACd,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C","sources":["webpack://app/./static/css/sections/dog.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}"],"names":[],"sourceRoot":""}
{"version":3,"file":"css/dog_dogs.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C","sources":["webpack://app/./static/css/sections/dog.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0.75vh 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}"],"names":[],"sourceRoot":""}

View File

@@ -56,7 +56,7 @@
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0 2vw;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_home.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,cAAc;QACd,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;AC1EA;IACI,iBAAiB;AACrB;AACA;IACI,iBAAiB;IACjB,kBAAkB;AACtB,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/home.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","#pageBody .column .row {\n margin-top: 0.5vh;\n}\n#pageBody .column .row .button {\n margin-left: auto;\n margin-right: auto;\n}"],"names":[],"sourceRoot":""}
{"version":3,"file":"css/dog_home.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;AC1EA;IACI,iBAAiB;AACrB;AACA;IACI,iBAAiB;IACjB,kBAAkB;AACtB,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/home.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0.75vh 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","#pageBody .column .row {\n margin-top: 0.5vh;\n}\n#pageBody .column .row .button {\n margin-left: auto;\n margin-right: auto;\n}"],"names":[],"sourceRoot":""}

View File

@@ -56,7 +56,7 @@
@media screen and (max-width: 400px) {
.footer {
max-height: 8vh;
padding: 0 2vw;
padding: 0.75vh 2vw;
font-size: 10px;
width: 96vw;
max-width: 96vw;

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_locations.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,cAAc;QACd,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;;ACxEA;IACI,WAAW;AACf","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/locations.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n\n#tableMain tbody > div {\n width: 49vh;\n}\n"],"names":[],"sourceRoot":""}
{"version":3,"file":"css/dog_locations.bundle.css","mappings":";;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;AAIf;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;;AAGA,WAAW;AACX;IACI,gBAAgB;IAChB,kBAAkB;IAClB,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sCAAsC;IACtC,kBAAkB;IAClB,SAAS;IACT,WAAW;AACf;;AAEA;IACI;QACI,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,WAAW;QACX,eAAe;IACnB;IACA;QACI,eAAe;IACnB;IACA;QACI,cAAc;IAClB;AACJ;;AAEA;IACI,UAAU;IACV,SAAS;AACb,C;;;ACxEA;IACI,WAAW;AACf","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/locations.css"],"sourcesContent":["\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n\n\n#pageBody {\n /* height: 69vh !important; */\n max-height: 79vh;\n padding: 0 5vw;\n margin: 0;\n border: 0;\n align-content: center;\n justify-content: flex-start;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n overflow-y: auto;\n overflow-x: hidden;\n position: absolute;\n width: 90vw;\n color: var(--colour-text);\n}\n\n\n/* Footer */\n.footer {\n padding: 1vh 1vw;\n text-align: center;\n margin: 0;\n max-height: 5vh;\n overflow-y: auto;\n background-color: var(--colour-accent);\n position: absolute;\n bottom: 0;\n width: 98vw;\n}\n\n@media screen and (max-width: 400px) {\n .footer {\n max-height: 8vh;\n padding: 0.75vh 2vw;\n font-size: 10px; \n width: 96vw;\n max-width: 96vw;\n }\n .footer > h4 {\n font-size: 10px;\n }\n .footer > h5 {\n font-size: 9px;\n }\n}\n\n.footer > h4, h5 {\n padding: 0;\n margin: 0;\n}","\n\n#tableMain tbody > div {\n width: 49vh;\n}\n"],"names":[],"sourceRoot":""}

View File

@@ -100,11 +100,11 @@ script, link {
}
/* header image */
img.header-logo {
img.logo {
max-height: 15vh;
max-width: 15vh;
cursor: pointer;
border-radius: 3vh;
/* border-radius: 3vh; */
}
/* icon images */
@@ -236,10 +236,10 @@ input.dirty, textarea.dirty, select.dirty {
@media screen and (max-width: 400px) {
img.header-logo {
/*
img.logo {
border-radius: 3vh;
}
/*
.company-name {
font-size: 14px;
}
@@ -540,16 +540,21 @@ table div {
height: 15vh;
align-items: flex-start;
}
.topnav a, .topnav label, .topnav p, .topnav h1 {
.topnav a,
.topnav label,
.topnav p,
.topnav h1 {
float: left;
display: flex;
text-align: center;
text-decoration: none;
width: 100%;
max-height: 15vh;
font-weight: normal;
justify-content: center;
}
.topnav h1 {
color: var(--colour-text-link-visited);
}
.topnav a:hover {
background-color: var(--colour-page-background);
}
@@ -561,7 +566,7 @@ table div {
align-self: center;
display: flex;
}
.topnav > .container.header-logo {
.topnav > .container.logo {
min-width: 15vh;
max-width: 15vh;
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,17 @@
/******/ (() => { // webpackBootstrap
/******/ "use strict";
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
(() => {
// extracted by mini-css-extract-plugin
})();
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
(() => {
// extracted by mini-css-extract-plugin
})();
/******/ })()
;
//# sourceMappingURL=dog_calendar_entries.bundle.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"js/dog_calendar_entries.bundle.js","mappings":";;;;AAAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/dog.css?a9d0","webpack://app/./static/css/pages/dog/calendar_entries.css?080f"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""}

View File

@@ -1039,6 +1039,25 @@ var BasePage = /*#__PURE__*/function () {
this.hookupNavigation();
this.hookupOverlays();
}
}, {
key: "hookupLogos",
value: function hookupLogos() {
var _this = this;
Events.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, function (event, element) {
utils_Utils.consoleLogIfNotProductionEnvironment('clicking logo');
_this.router.navigateToHash(hashPageHome);
});
}
/*
hookupEventHandler(eventType, selector, callback) {
Events.initialiseEventHandler(selector, flagInitialised, (element) => {
element.addEventListener(eventType, (event) => {
event.stopPropagation();
callback(event, element);
});
});
}
*/
}, {
key: "hookupNavigation",
value: function hookupNavigation() {
@@ -1070,16 +1089,7 @@ var BasePage = /*#__PURE__*/function () {
this.hookupButtonsNavDogButtonIcons();
this.hookupButtonsNavDogCommandButtonLinks();
this.hookupButtonsNavDogAssessments();
}
}, {
key: "hookupEventHandler",
value: function hookupEventHandler(eventType, selector, callback) {
Events.initialiseEventHandler(selector, flagInitialised, function (element) {
element.addEventListener(eventType, function (event) {
event.stopPropagation();
callback(event, element);
});
});
this.hookupButtonsNavDogCalendarEntries();
}
}, {
key: "hookupButtonsNavHome",
@@ -1089,9 +1099,9 @@ var BasePage = /*#__PURE__*/function () {
}, {
key: "hookupButtonsNav",
value: function hookupButtonsNav(buttonSelector, hashPageNav) {
var _this = this;
var _this2 = this;
Events.hookupEventHandler("click", buttonSelector, function (event, button) {
_this.router.navigateToHash(hashPageNav);
_this2.router.navigateToHash(hashPageNav);
});
}
}, {
@@ -1120,10 +1130,10 @@ var BasePage = /*#__PURE__*/function () {
}, {
key: "hookupButtonsNavUserLogin",
value: function hookupButtonsNavUserLogin() {
var _this2 = this;
var _this3 = this;
Events.hookupEventHandler("click", '.' + flagNavUserLogin, function (event, navigator) {
event.stopPropagation();
_this2.leave();
_this3.leave();
API.loginUser().then(function (response) {
if (response.Success) {
window.location.href = response[flagCallback];
@@ -1179,13 +1189,9 @@ var BasePage = /*#__PURE__*/function () {
this.hookupButtonsNav('.' + flagNavDogAssessments, hashPageDogAssessments);
}
}, {
key: "hookupLogos",
value: function hookupLogos() {
var _this3 = this;
Events.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, function (event, element) {
utils_Utils.consoleLogIfNotProductionEnvironment('clicking logo');
_this3.router.navigateToHash(hashPageHome);
});
key: "hookupButtonsNavDogCalendarEntries",
value: function hookupButtonsNavDogCalendarEntries() {
this.hookupButtonsNav('.' + flagNavDogCalendarEntries, hashPageDogCalendarEntries);
}
}, {
key: "hookupOverlays",
@@ -7972,6 +7978,136 @@ var PageDogAssessments = /*#__PURE__*/function (_TableBasePage) {
assessments_defineProperty(PageDogAssessments, "hash", hashPageDogAssessments);
assessments_defineProperty(PageDogAssessments, "attrIdRowObject", attrIdAssessment);
;// ./static/js/pages/dog/calendar_entries.js
function calendar_entries_typeof(o) { "@babel/helpers - typeof"; return calendar_entries_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, calendar_entries_typeof(o); }
function calendar_entries_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function calendar_entries_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, calendar_entries_toPropertyKey(o.key), o); } }
function calendar_entries_createClass(e, r, t) { return r && calendar_entries_defineProperties(e.prototype, r), t && calendar_entries_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function calendar_entries_callSuper(t, o, e) { return o = calendar_entries_getPrototypeOf(o), calendar_entries_possibleConstructorReturn(t, calendar_entries_isNativeReflectConstruct() ? Reflect.construct(o, e || [], calendar_entries_getPrototypeOf(t).constructor) : o.apply(t, e)); }
function calendar_entries_possibleConstructorReturn(t, e) { if (e && ("object" == calendar_entries_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return calendar_entries_assertThisInitialized(t); }
function calendar_entries_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
function calendar_entries_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (calendar_entries_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function calendar_entries_superPropGet(t, o, e, r) { var p = calendar_entries_get(calendar_entries_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
function calendar_entries_get() { return calendar_entries_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = calendar_entries_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, calendar_entries_get.apply(null, arguments); }
function calendar_entries_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = calendar_entries_getPrototypeOf(t));); return t; }
function calendar_entries_getPrototypeOf(t) { return calendar_entries_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, calendar_entries_getPrototypeOf(t); }
function calendar_entries_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && calendar_entries_setPrototypeOf(t, e); }
function calendar_entries_setPrototypeOf(t, e) { return calendar_entries_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, calendar_entries_setPrototypeOf(t, e); }
function calendar_entries_defineProperty(e, r, t) { return (r = calendar_entries_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function calendar_entries_toPropertyKey(t) { var i = calendar_entries_toPrimitive(t, "string"); return "symbol" == calendar_entries_typeof(i) ? i : i + ""; }
function calendar_entries_toPrimitive(t, r) { if ("object" != calendar_entries_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != calendar_entries_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
var PageDogCalendarEntries = /*#__PURE__*/function (_TableBasePage) {
function PageDogCalendarEntries(router) {
var _this;
calendar_entries_classCallCheck(this, PageDogCalendarEntries);
_this = calendar_entries_callSuper(this, PageDogCalendarEntries, [router]);
calendar_entries_defineProperty(_this, "callSaveTableContent", API.saveCalendarEntries);
_this.dogMixin = new DogTableMixinPage(_this);
return _this;
}
calendar_entries_inherits(PageDogCalendarEntries, _TableBasePage);
return calendar_entries_createClass(PageDogCalendarEntries, [{
key: "initialize",
value: function initialize() {
this.sharedInitialize();
}
}, {
key: "hookupFilters",
value: function hookupFilters() {
this.sharedHookupFilters();
// this.hookupFilterCalendarEntryType();
this.hookupFilterActive();
}
/*
hookupFilterCalendarEntryType() {
let filterSelector = idFormFilters + ' #' + attrIdCalendarEntryType;
let filterCalendarEntryTypeOld = document.querySelector(filterSelector);
filterCalendarEntryTypeOld.removeAttribute('id');
let parentDiv = filterCalendarEntryTypeOld.parentElement;
let isChecked = (DOM.getElementAttributeValuePrevious(parentDiv) == "True");
let filterCalendarEntryTypeNew = document.querySelector(idFormFilters + ' div.' + flagCalendarEntryTypeOnly + '.' + flagContainerInput + ' svg.' + flagCalendarEntryTypeOnly);
filterCalendarEntryTypeNew.setAttribute('id', flagCalendarEntryTypeOnly);
if (isChecked) filterCalendarEntryTypeNew.classList.add(flagIsChecked);
Events.hookupEventHandler("click", filterSelector, (event, filterCalendarEntryType) => {
Utils.consoleLogIfNotProductionEnvironment({ filterCalendarEntryType });
Utils.consoleLogIfNotProductionEnvironment({ [filterCalendarEntryType.tagName]: filterCalendarEntryType.tagName });
let svgElement = (filterCalendarEntryType.tagName.toUpperCase() == 'SVG') ? filterCalendarEntryType : filterCalendarEntryType.parentElement;
let wasChecked = svgElement.classList.contains(flagIsChecked);
if (wasChecked) {
svgElement.classList.remove(flagIsChecked);
}
else {
svgElement.classList.add(flagIsChecked);
}
return this.handleChangeFilter(event, filterCalendarEntryType);
});
let filter = document.querySelector(filterSelector);
let filterValuePrevious = DOM.getElementValueCurrent(filter);
filter.setAttribute(attrValueCurrent, filterValuePrevious);
filter.setAttribute(attrValuePrevious, filterValuePrevious);
}
*/
}, {
key: "loadRowTable",
value: function loadRowTable(rowJson) {
if (rowJson == null) return;
if (_verbose) {
utils_Utils.consoleLogIfNotProductionEnvironment("applying data row: ", rowJson);
}
}
}, {
key: "getJsonRow",
value: function getJsonRow(row) {
utils_Utils.consoleLogIfNotProductionEnvironment({
row: row
});
if (row == null) return;
var inputCode = row.querySelector('td.' + flagCode + ' .' + flagCode);
var inputName = row.querySelector('td.' + flagName + ' .' + flagName);
var buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);
console.log("inputCode");
console.log(inputCode);
var jsonRow = {};
jsonRow[attrIdCalendarEntry] = row.getAttribute(attrIdCalendarEntry);
jsonRow[flagCode] = DOM.getElementAttributeValueCurrent(inputCode);
jsonRow[flagName] = DOM.getElementAttributeValueCurrent(inputName);
jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);
return jsonRow;
}
}, {
key: "initialiseRowNew",
value: function initialiseRowNew(tbody, row) {}
}, {
key: "postInitialiseRowNewCallback",
value: function postInitialiseRowNewCallback(tbody) {
// let newRows = tbody.querySelectorAll('tr.' + flagRowNew);
}
}, {
key: "hookupTableMain",
value: function hookupTableMain() {
calendar_entries_superPropGet(PageDogCalendarEntries, "hookupTableMain", this, 3)([]);
this.hookupFieldsCodeTable();
this.hookupFieldsNameTable();
this.hookupFieldsActive();
}
}, {
key: "leave",
value: function leave() {
calendar_entries_superPropGet(PageDogCalendarEntries, "leave", this, 3)([]);
}
}]);
}(TableBasePage);
calendar_entries_defineProperty(PageDogCalendarEntries, "hash", hashPageDogCalendarEntries);
calendar_entries_defineProperty(PageDogCalendarEntries, "attrIdRowObject", attrIdCalendarEntry);
;// ./static/js/pages/legal/accessibility_report.js
function accessibility_report_typeof(o) { "@babel/helpers - typeof"; return accessibility_report_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, accessibility_report_typeof(o); }
function accessibility_report_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
@@ -8190,6 +8326,7 @@ function router_toPrimitive(t, r) { if ("object" != router_typeof(t) || !t) retu
// Legal
@@ -8261,6 +8398,10 @@ var Router = /*#__PURE__*/function () {
name: 'PageDogAssessments',
module: PageDogAssessments
};
this.pages[hashPageDogCalendarEntries] = {
name: 'PageDogCalendarEntries',
module: PageDogCalendarEntries
};
// Legal
this.pages[hashPageAccessibilityStatement] = {
name: 'PageAccessibilityStatement',
@@ -8335,6 +8476,10 @@ var Router = /*#__PURE__*/function () {
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
return _this.navigateToHash(hashPageDogAssessments, isPopState);
};
this.routes[hashPageDogCalendarEntries] = function () {
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
return _this.navigateToHash(hashPageDogCalendarEntries, isPopState);
};
// Legal
this.routes[hashPageAccessibilityStatement] = function () {
var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,423 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dog Training Progress - Sit Command</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js"></script>
<!--
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/2.29.3/index.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/chartjs-adapter-date-fns/2.0.0/chartjs-adapter-date-fns.bundle.min.js"></script>
-->
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
margin: 0;
padding: 20px;
background-color: #f8fafc;
}
.container {
max-width: 1200px;
margin: 0 auto;
background: white;
border-radius: 12px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
padding: 24px;
}
.header {
margin-bottom: 24px;
border-bottom: 1px solid #e2e8f0;
padding-bottom: 16px;
}
.header h1 {
margin: 0 0 8px 0;
color: #1e293b;
font-size: 24px;
font-weight: 600;
}
.header p {
margin: 0;
color: #64748b;
font-size: 14px;
}
.chart-container {
position: relative;
height: 500px;
margin-bottom: 24px;
}
.legend-container {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-top: 16px;
padding: 16px;
background-color: #f8fafc;
border-radius: 8px;
}
.legend-item {
display: flex;
align-items: center;
gap: 6px;
font-size: 12px;
color: #475569;
}
.legend-color {
width: 12px;
height: 12px;
border-radius: 2px;
}
.metrics-summary {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
margin-top: 24px;
}
.metric-card {
background: #f8fafc;
padding: 16px;
border-radius: 8px;
border-left: 4px solid #3b82f6;
}
.metric-label {
font-size: 12px;
color: #64748b;
margin-bottom: 4px;
}
.metric-value {
font-size: 20px;
font-weight: 600;
color: #1e293b;
}
.metric-change {
font-size: 12px;
margin-top: 4px;
}
.positive { color: #059669; }
.negative { color: #dc2626; }
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>Training Progress Report - "Sit" Command</h1>
<p>Tracking compliance duration and response time from April 1st - July 30th, 2025</p>
</div>
<div class="chart-container">
<canvas id="trainingChart"></canvas>
</div>
<div class="legend-container" id="obedienceLegend">
<!-- Legend will be populated by JavaScript -->
</div>
<div class="metrics-summary">
<div class="metric-card">
<div class="metric-label">Average Compliance Duration</div>
<div class="metric-value">65.2s</div>
<div class="metric-change positive">+450% from start</div>
</div>
<div class="metric-card">
<div class="metric-label">Average Response Time</div>
<div class="metric-value">4.3s</div>
<div class="metric-change positive">-64% from start</div>
</div>
<div class="metric-card">
<div class="metric-label">Most Common Obedience Level</div>
<div class="metric-value">After Firm Look</div>
<div class="metric-change">Recent sessions</div>
</div>
<div class="metric-card">
<div class="metric-label">Training Sessions</div>
<div class="metric-value">32</div>
<div class="metric-change">4 months period</div>
</div>
</div>
</div>
<script>
// Define obedience levels and their corresponding colors
const obedienceLevels = [
{ name: "Eager", color: "#16a34a", value: 15 },
{ name: "After Firm Look", color: "#22c55e", value: 14 },
{ name: "After Power Pose", color: "#65a30d", value: 13 },
{ name: "After Threatening to Approach", color: "#84cc16", value: 12 },
{ name: "After Moving a Few Steps", color: "#eab308", value: 11 },
{ name: "After Moving Half Way", color: "#f59e0b", value: 10 },
{ name: "After Approaching Most of The Way", color: "#f97316", value: 9 },
{ name: "After Touching Collar", color: "#ea580c", value: 8 },
{ name: "After Running Away And Returning", color: "#dc2626", value: 7 },
{ name: "After Being Lead by Collar or Lead", color: "#b91c1c", value: 6 },
{ name: "After Check or Bribe", color: "#991b1b", value: 5 },
{ name: "After Multiple Checks and/or Bribes", color: "#7f1d1d", value: 4 },
{ name: "None - Refusal", color: "#6b7280", value: 3 },
{ name: "Refused and Ran Away", color: "#4b5563", value: 2 },
{ name: "Refusing to Return", color: "#374151", value: 1 }
];
// Generate training data from April 1st to July 30th, 2025
function generateTrainingData() {
const data = [];
const startDate = new Date('2025-04-01');
const endDate = new Date('2025-07-30');
let currentDate = new Date(startDate);
let complianceDuration = 10; // Starting at 10 seconds
let responseTime = 12; // Starting at 12 seconds
while (currentDate <= endDate) {
// Add some volatility and general improvement trend
const volatility = (Math.random() - 0.5) * 0.3;
const progressFactor = (currentDate - startDate) / (endDate - startDate);
// Compliance duration: improve from 10s to 120s with volatility
const targetCompliance = 10 + (110 * progressFactor);
complianceDuration = Math.max(5, Math.min(120,
complianceDuration + (targetCompliance - complianceDuration) * 0.1 +
volatility * 15 + (Math.random() - 0.5) * 10
));
// Response time: improve from 12s to 2s with volatility
const targetResponse = 12 - (10 * progressFactor);
responseTime = Math.max(1, Math.min(15,
responseTime + (targetResponse - responseTime) * 0.1 +
volatility * 2 + (Math.random() - 0.5) * 2
));
// Determine obedience level based on performance
let obedienceLevel;
if (complianceDuration > 90 && responseTime < 3) {
obedienceLevel = obedienceLevels[0]; // Eager
} else if (complianceDuration > 70 && responseTime < 4) {
obedienceLevel = obedienceLevels[1]; // After Firm Look
} else if (complianceDuration > 50 && responseTime < 5) {
obedienceLevel = obedienceLevels[2]; // After Power Pose
} else if (complianceDuration > 40 && responseTime < 6) {
obedienceLevel = obedienceLevels[3]; // After Threatening to Approach
} else if (complianceDuration > 30 && responseTime < 7) {
obedienceLevel = obedienceLevels[4]; // After Moving a Few Steps
} else if (complianceDuration > 25 && responseTime < 8) {
obedienceLevel = obedienceLevels[5]; // After Moving Half Way
} else if (complianceDuration > 20 && responseTime < 9) {
obedienceLevel = obedienceLevels[6]; // After Approaching Most of The Way
} else if (complianceDuration > 15 && responseTime < 10) {
obedienceLevel = obedienceLevels[7]; // After Touching Collar
} else if (complianceDuration > 10 && responseTime < 11) {
obedienceLevel = obedienceLevels[8]; // After Running Away And Returning
} else if (complianceDuration > 8) {
obedienceLevel = obedienceLevels[9]; // After Being Lead by Collar or Lead
} else if (complianceDuration > 5) {
obedienceLevel = obedienceLevels[10]; // After Check or Bribe
} else if (complianceDuration > 3) {
obedienceLevel = obedienceLevels[11]; // After Multiple Checks and/or Bribes
} else if (complianceDuration > 1) {
obedienceLevel = obedienceLevels[12]; // None - Refusal
} else if (responseTime > 12) {
obedienceLevel = obedienceLevels[13]; // Refused and Ran Away
} else {
obedienceLevel = obedienceLevels[14]; // Refusing to Return
}
data.push({
date: new Date(currentDate),
complianceDuration: Math.round(complianceDuration * 10) / 10,
responseTime: Math.round(responseTime * 10) / 10,
obedienceLevel: obedienceLevel
});
// Advance date by 2-4 days randomly
const daysToAdd = Math.floor(Math.random() * 3) + 2;
currentDate.setDate(currentDate.getDate() + daysToAdd);
}
return data;
}
// Generate the training data
const trainingData = generateTrainingData();
// Create legend
function createLegend() {
const legendContainer = document.getElementById('obedienceLegend');
obedienceLevels.forEach(level => {
const legendItem = document.createElement('div');
legendItem.className = 'legend-item';
legendItem.innerHTML = `
<div class="legend-color" style="background-color: ${level.color}"></div>
<span>${level.name}</span>
`;
legendContainer.appendChild(legendItem);
});
}
// Wait for Chart.js to load and initialize
function initializeChart() {
if (typeof Chart === 'undefined') {
console.error('Chart.js not loaded');
document.querySelector('.chart-container').innerHTML = '<p style="text-align: center; color: #dc2626; padding: 50px;">Error loading Chart.js library. Please refresh the page.</p>';
return;
}
const ctx = document.getElementById('trainingChart').getContext('2d');
const chart = new Chart(ctx, {
type: 'line',
data: {
datasets: [
{
label: 'Compliance Duration (seconds)',
data: trainingData.map(d => ({
x: d.date,
y: d.complianceDuration
})),
pointBackgroundColor: trainingData.map(d => d.obedienceLevel.color),
pointBorderColor: trainingData.map(d => d.obedienceLevel.color),
backgroundColor: 'rgba(59, 130, 246, 0.1)',
borderColor: '#3b82f6',
borderWidth: 2,
pointRadius: 6,
pointHoverRadius: 8,
yAxisID: 'y',
tension: 0.1
},
{
label: 'Response Time (seconds)',
data: trainingData.map(d => ({
x: d.date,
y: d.responseTime
})),
pointBackgroundColor: trainingData.map(d => d.obedienceLevel.color),
pointBorderColor: trainingData.map(d => d.obedienceLevel.color),
backgroundColor: 'rgba(239, 68, 68, 0.1)',
borderColor: '#ef4444',
borderWidth: 2,
pointRadius: 6,
pointHoverRadius: 8,
yAxisID: 'y1',
tension: 0.1
}
]
},
options: {
responsive: true,
maintainAspectRatio: false,
interaction: {
mode: 'index',
intersect: false,
},
plugins: {
title: {
display: true,
text: 'Sit Command Training Progress Over Time',
font: {
size: 16,
weight: 'bold'
},
padding: 20
},
legend: {
display: true,
position: 'top',
labels: {
usePointStyle: true,
padding: 20
}
},
tooltip: {
callbacks: {
afterBody: function(context) {
const dataIndex = context[0].dataIndex;
const obedienceLevel = trainingData[dataIndex].obedienceLevel.name;
return `Obedience Level: ${obedienceLevel}`;
}
}
}
},
scales: {
x: {
type: 'linear',
ticks: {
callback: function(value, index) {
const date = trainingData[index]?.date;
if (date) {
return date.toLocaleDateString('en-GB', {
day: 'numeric',
month: 'short'
});
}
return value;
}
},
title: {
display: true,
text: 'Training Session',
font: {
weight: 'bold'
}
},
grid: {
color: '#e2e8f0'
}
},
y: {
type: 'linear',
display: true,
position: 'left',
title: {
display: true,
text: 'Compliance Duration (seconds)',
color: '#3b82f6',
font: {
weight: 'bold'
}
},
grid: {
color: '#f1f5f9'
},
ticks: {
color: '#3b82f6'
}
},
y1: {
type: 'linear',
display: true,
position: 'right',
title: {
display: true,
text: 'Response Time (seconds)',
color: '#ef4444',
font: {
weight: 'bold'
}
},
grid: {
drawOnChartArea: false,
},
ticks: {
color: '#ef4444'
}
}
}
}
});
}
// Create the legend
createLegend();
</script>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -48,7 +48,22 @@ export default class BasePage {
this.hookupNavigation();
this.hookupOverlays();
}
hookupLogos() {
Events.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, (event, element) => {
Utils.consoleLogIfNotProductionEnvironment('clicking logo');
this.router.navigateToHash(hashPageHome);
});
}
/*
hookupEventHandler(eventType, selector, callback) {
Events.initialiseEventHandler(selector, flagInitialised, (element) => {
element.addEventListener(eventType, (event) => {
event.stopPropagation();
callback(event, element);
});
});
}
*/
hookupNavigation() {
Events.hookupEventHandler("click", idButtonHamburger, (event, element) => {
let overlayHamburger = document.querySelector(idOverlayHamburger);
@@ -79,14 +94,7 @@ export default class BasePage {
this.hookupButtonsNavDogButtonIcons();
this.hookupButtonsNavDogCommandButtonLinks();
this.hookupButtonsNavDogAssessments();
}
hookupEventHandler(eventType, selector, callback) {
Events.initialiseEventHandler(selector, flagInitialised, (element) => {
element.addEventListener(eventType, (event) => {
event.stopPropagation();
callback(event, element);
});
});
this.hookupButtonsNavDogCalendarEntries();
}
hookupButtonsNavHome() {
this.hookupButtonsNav('.' + flagNavHome, hashPageHome);
@@ -154,12 +162,8 @@ export default class BasePage {
hookupButtonsNavDogAssessments() {
this.hookupButtonsNav('.' + flagNavDogAssessments, hashPageDogAssessments);
}
hookupLogos() {
Events.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, (event, element) => {
Utils.consoleLogIfNotProductionEnvironment('clicking logo');
this.router.navigateToHash(hashPageHome);
});
hookupButtonsNavDogCalendarEntries() {
this.hookupButtonsNav('.' + flagNavDogCalendarEntries, hashPageDogCalendarEntries);
}
hookupOverlays() {

View File

@@ -0,0 +1,100 @@
import API from "../../api.js";
import BusinessObjects from "../../lib/business_objects/business_objects.js";
import DOM from "../../dom.js";
import Events from "../../lib/events.js";
import TableBasePage from "../base_table.js";
import Utils from "../../lib/utils.js";
import Validation from "../../lib/validation.js";
import DogTableMixinPage from "./mixin_table.js";
export default class PageDogCalendarEntries extends TableBasePage {
static hash = hashPageDogCalendarEntries;
static attrIdRowObject = attrIdCalendarEntry;
callSaveTableContent = API.saveCalendarEntries;
constructor(router) {
super(router);
this.dogMixin = new DogTableMixinPage(this);
}
initialize() {
this.sharedInitialize();
}
hookupFilters() {
this.sharedHookupFilters();
// this.hookupFilterCalendarEntryType();
this.hookupFilterActive();
}
/*
hookupFilterCalendarEntryType() {
let filterSelector = idFormFilters + ' #' + attrIdCalendarEntryType;
let filterCalendarEntryTypeOld = document.querySelector(filterSelector);
filterCalendarEntryTypeOld.removeAttribute('id');
let parentDiv = filterCalendarEntryTypeOld.parentElement;
let isChecked = (DOM.getElementAttributeValuePrevious(parentDiv) == "True");
let filterCalendarEntryTypeNew = document.querySelector(idFormFilters + ' div.' + flagCalendarEntryTypeOnly + '.' + flagContainerInput + ' svg.' + flagCalendarEntryTypeOnly);
filterCalendarEntryTypeNew.setAttribute('id', flagCalendarEntryTypeOnly);
if (isChecked) filterCalendarEntryTypeNew.classList.add(flagIsChecked);
Events.hookupEventHandler("click", filterSelector, (event, filterCalendarEntryType) => {
Utils.consoleLogIfNotProductionEnvironment({ filterCalendarEntryType });
Utils.consoleLogIfNotProductionEnvironment({ [filterCalendarEntryType.tagName]: filterCalendarEntryType.tagName });
let svgElement = (filterCalendarEntryType.tagName.toUpperCase() == 'SVG') ? filterCalendarEntryType : filterCalendarEntryType.parentElement;
let wasChecked = svgElement.classList.contains(flagIsChecked);
if (wasChecked) {
svgElement.classList.remove(flagIsChecked);
}
else {
svgElement.classList.add(flagIsChecked);
}
return this.handleChangeFilter(event, filterCalendarEntryType);
});
let filter = document.querySelector(filterSelector);
let filterValuePrevious = DOM.getElementValueCurrent(filter);
filter.setAttribute(attrValueCurrent, filterValuePrevious);
filter.setAttribute(attrValuePrevious, filterValuePrevious);
}
*/
loadRowTable(rowJson) {
if (rowJson == null) return;
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);
let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);
console.log("inputCode");
console.log(inputCode);
let jsonRow = {};
jsonRow[attrIdCalendarEntry] = row.getAttribute(attrIdCalendarEntry);
jsonRow[flagCode] = DOM.getElementAttributeValueCurrent(inputCode);
jsonRow[flagName] = DOM.getElementAttributeValueCurrent(inputName);
jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);
return jsonRow;
}
initialiseRowNew(tbody, row) {
}
postInitialiseRowNewCallback(tbody) {
// let newRows = tbody.querySelectorAll('tr.' + flagRowNew);
}
hookupTableMain() {
super.hookupTableMain();
this.hookupFieldsCodeTable();
this.hookupFieldsNameTable();
this.hookupFieldsActive();
}
leave() {
super.leave();
}
}

View File

@@ -15,6 +15,7 @@ import PageDogButtonIcons from './pages/dog/button_icons.js';
import PageDogCommandButtonLinks from './pages/dog/command_button_links.js';
import PageDogAssessment from './pages/dog/assessment.js';
import PageDogAssessments from './pages/dog/assessments.js';
import PageDogCalendarEntries from './pages/dog/calendar_entries.js'
// Legal
import PageAccessibilityReport from './pages/legal/accessibility_report.js';
import PageAccessibilityStatement from './pages/legal/accessibility_statement.js';
@@ -50,6 +51,7 @@ export default class Router {
this.pages[hashPageDogCommandButtonLinks] = { name: 'PageDogCommandButtonLinks', module: PageDogCommandButtonLinks };
this.pages[hashPageDogAssessment] = { name: 'PageDogAssessment', module: PageDogAssessment };
this.pages[hashPageDogAssessments] = { name: 'PageDogAssessments', module: PageDogAssessments };
this.pages[hashPageDogCalendarEntries] = { name: 'PageDogCalendarEntries', module: PageDogCalendarEntries };
// Legal
this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', module: PageAccessibilityStatement };
this.pages[hashPageDataRetentionSchedule] = { name: 'PageDataRetentionSchedule', module: PageRetentionSchedule };
@@ -76,6 +78,7 @@ export default class Router {
this.routes[hashPageDogCommandButtonLinks] = (isPopState = false) => this.navigateToHash(hashPageDogCommandButtonLinks, isPopState);
this.routes[hashPageDogAssessment] = (isPopState = false) => this.navigateToHash(hashPageDogAssessment, isPopState);
this.routes[hashPageDogAssessments] = (isPopState = false) => this.navigateToHash(hashPageDogAssessments, isPopState);
this.routes[hashPageDogCalendarEntries] = (isPopState = false) => this.navigateToHash(hashPageDogCalendarEntries, isPopState);
// Legal
this.routes[hashPageAccessibilityStatement] = (isPopState = false) => this.navigateToHash(hashPageAccessibilityStatement, isPopState);
this.routes[hashPageDataRetentionSchedule] = (isPopState = false) => this.navigateToHash(hashPageDataRetentionSchedule, isPopState);

View File

@@ -0,0 +1,72 @@
{% if is_blank_row %}
<tr class="{{ model.FLAG_ROW_NEW }} {{ model.FLAG_CALENDAR_ENTRY }}" {{ model.ATTR_ID_CALENDAR_ENTRY }}>
<td class="{{ model.FLAG_DATE_FROM }} {{ model.FLAG_DATE_TO }} {{ model.FLAG_DATE_PREVIEW }}">
<div class="{{ model.FLAG_DATE_FROM }}"></div>
{#
<div>-</div>
<div class="{{ model.FLAG_DATE_TO }}"></div>
#}
</td>
<td class="{{ model.FLAG_NAME }}">
<input type="text"
class="{{ model.FLAG_NAME }}"
{{ model.ATTR_VALUE_CURRENT }} {{ model.ATTR_VALUE_PREVIOUS }} />
</td>
<td class="{{ model.FLAG_IS_CALENDAR_ENTRY_TYPE_BILL }}">
<input type="checkbox"
class="{{ model.FLAG_IS_CALENDAR_ENTRY_TYPE_BILL }}"
{{ model.ATTR_VALUE_CURRENT }}="true" {{ model.ATTR_VALUE_PREVIOUS }}="true"
checked />
</td>
<td class="{{ model.FLAG_PRICE }}">
<input type="number" min="0" step="0.01"
class="{{ model.FLAG_PRICE }}"
{{ model.ATTR_VALUE_CURRENT }}="0" {{ model.ATTR_VALUE_PREVIOUS }}="0"
value="0" />
</td>
{#
{% set active = True %}
{% include 'components/dog/_td_active.html' %}
#}
</tr>
{% else %}
<tr class="{{ model.FLAG_CALENDAR_ENTRY }}" {{ model.ATTR_ID_CALENDAR_ENTRY }}="{{ calendar_entry.id_calendar_entry }}">
<td class="{{ model.FLAG_DATE_FROM }} {{ model.FLAG_DATE_TO }} {{ model.FLAG_DATE_PREVIEW }}">
<div class="{{ model.FLAG_DATE_FROM }}">{{ model.format_datetime_text(calendar_entry.start_on) }}</div>
{#
<div>-</div>
<div class="{{ model.FLAG_DATE_TO }}">{{ model.format_datetime_text(calendar_entry.start_on) }}</div>
#}
</td>
<td class="{{ model.FLAG_NAME }}">
<input type="text"
class="{{ model.FLAG_NAME }}"
{{ model.ATTR_VALUE_CURRENT }}="{{ model.format_null_string_as_blank(calendar_entry.name)|escape }}"
{{ model.ATTR_VALUE_PREVIOUS }}="{{ model.format_null_string_as_blank(calendar_entry.name)|escape }}"
value="{{ model.format_null_string_as_blank(calendar_entry.name) }}" />
</td>
<td class="{{ model.FLAG_IS_CALENDAR_ENTRY_TYPE_BILL }}">
<input type="checkbox"
class="{{ model.FLAG_IS_CALENDAR_ENTRY_TYPE_BILL }}"
{{ model.ATTR_VALUE_CURRENT }}="{{ calendar_entry.is_bill_calendar_entry_type | lower }}"
{{ model.ATTR_VALUE_PREVIOUS }}="{{ calendar_entry.is_bill_calendar_entry_type | lower }}"
{% if calendar_entry.is_bill_calendar_entry_type %}checked{% endif %} />
</td>
<td class="{{ model.FLAG_PRICE }}">
{#
<input type="number" min="0" step="0.01"
class="{{ model.FLAG_PRICE }}"
{{ model.ATTR_VALUE_CURRENT }}="{{ calendar_entry.price }}"
{{ model.ATTR_VALUE_PREVIOUS }}="{{ calendar_entry.price }}"
value="{{ calendar_entry.price }}" />
#}
<div class="{{ model.FLAG_PRICE }}">£{{ calendar_entry.price }}</div>
</td>
{#
{% set active = calendar_entry.active %}
{% include 'components/dog/_td_active.html' %}
#}
</tr>
{% endif %}

View File

@@ -1,15 +0,0 @@
{% if block_id == 'block1' %}
<div class="common-block" id="block1">
<h1>Feckin common block boi</h1>
</div>
{% elif block_id == 'checkout' %}
<!-- Variables from Model_View_Store + model-->
<script>
var idOverlayInfoBilling = "#{{ model.ID_OVERLAY_INFO_BILLING }}";
var idOverlayInfoDelivery = "#{{ model.ID_OVERLAY_INFO_DELIVERY }}";
var idContainerInfoBilling = "#{{ model.ID_CONTAINER_INFO_BILLING }}";
var idContainerInfoDelivery = "#{{ model.ID_CONTAINER_INFO_DELIVERY }}";
var keyIdCheckout = "{{ model.KEY_ID_CHECKOUT }}";
var keyInfoBilling = "{{ model.KEY_INFO_BILLING }}";
</script>
{% endif %}

View File

@@ -0,0 +1,164 @@
<script>
var attrTextCollapsed = "{{ model.ATTR_TEXT_COLLAPSED }}";
var attrTextExpanded = "{{ model.ATTR_TEXT_EXPANDED }}";
var attrValueCurrent = "{{ model.ATTR_VALUE_CURRENT }}";
var attrValuePrevious = "{{ model.ATTR_VALUE_PREVIOUS }}";
var colourAccent = "{{ model.COLOUR_ACCENT }}";
var colourError = "{{ model.COLOUR_ERROR }}";
var colourPageBackground = "{{ model.COLOUR_PAGE_BACKGROUND }}";
var colourPageBackground1 = "{{ model.COLOUR_PAGE_BACKGROUND_1 }}";
var colourPageBackground2 = "{{ model.COLOUR_PAGE_BACKGROUND_2 }}";
var colourPrimary = "{{ model.COLOUR_PRIMARY }}";
var colourSecondary = "{{ model.COLOUR_SECONDARY }}";
var colourText = "{{ model.COLOUR_TEXT }}";
var colourTextBackground = "{{ model.COLOUR_TEXT_BACKGROUND }}";
var colourTextLinkUnvisited = "{{ model.COLOUR_TEXT_LINK_UNVISITED }}";
var colourTextLinkVisited = "{{ model.COLOUR_TEXT_LINK_VISITED }}";
var environment = {
"name": "{{ model.app.app_config.FLASK_ENV }}",
"is_production": "{{ model.app.app_config.is_production | lower }}",
"is_development": "{{ model.app.app_config.is_development | lower }}",
};
var flagAccessLevel = "{{ model.FLAG_ACCESS_LEVEL }}";
var flagAccessLevelRequired = "{{ model.FLAG_ACCESS_LEVEL_REQUIRED }}";
var flagActive = "{{ model.FLAG_ACTIVE }}";
var flagActiveOnly = "{{ model.FLAG_ACTIVE_ONLY }}";
var flagAdd = "{{ model.FLAG_ADD }}";
var flagButton = "{{ model.FLAG_BUTTON }}";
var flagButtonPrimary = "{{ model.FLAG_BUTTON_PRIMARY }}";
var flagCallback = "{{ model.FLAG_CALLBACK }}";
var flagCancel = "{{ model.FLAG_CANCEL }}";
var flagCaptcha = "{{ model.FLAG_CAPTCHA }}";
var flagCard = "{{ model.FLAG_CARD }}";
var flagCheckbox = "{{ model.FLAG_CHECKBOX }}";
var flagCloseTemporaryElement = "{{ model.FLAG_CLOSE_TEMPORARY_ELEMENT }}";
var flagCode = "{{ model.FLAG_CODE }}";
var flagCollapsible = "{{ model.FLAG_COLLAPSIBLE }}";
var flagColumn = "{{ model.FLAG_COLUMN }}";
var flagComment = "{{ model.FLAG_COMMENT }}";
var flagContainer = "{{ model.FLAG_CONTAINER }}";
var flagContainerInput = "{{ model.FLAG_CONTAINER_INPUT }}";
var flagCsrfToken = "{{ model.FLAG_CSRF_TOKEN }}";
var flagDdlPreview = "{{ model.FLAG_DDL_PREVIEW }}";
var flagDelete = "{{ model.FLAG_DELETE }}";
var flagDescription = "{{ model.FLAG_DESCRIPTION }}";
var flagDetail = "{{ model.FLAG_DETAIL }}";
var flagDialog = "{{ model.FLAG_DIALOG }}";
var flagDirty = "{{ model.FLAG_DIRTY }}";
var flagDisplayOrder = "{{ model.FLAG_DISPLAY_ORDER }}";
var flagDragging = "dragging";
var flagDragOver = "drag-over";
var flagEdit = "{{ model.FLAG_EDIT }}";
var flagEmail = "{{ model.FLAG_EMAIL }}";
var flagError = "{{ model.FLAG_ERROR }}";
var flagExpanded = "{{ model.FLAG_EXPANDED }}";
var flagFailure = "{{ model.FLAG_FAILURE }}";
var flagFax = "{{ model.FLAG_FAX }}";
var flagFilter = "{{ model.FLAG_FILTER }}";
var flagForm = "{{ model.FLAG_FORM }}";
var flagFormFilters = "{{ model.FLAG_FORM_FILTERS }}";
var flagIcon = "{{ model.FLAG_ICON }}";
var flagImageLogo = "{{ model.FLAG_IMAGE_LOGO }}";
var flagInitialised = "{{ model.FLAG_INITIALISED }}";
var flagIsChecked = "{{ model.FLAG_IS_CHECKED }}";
var flagIsCollapsed = "{{ model.FLAG_IS_COLLAPSED }}";
var flagLeftHandStub = "{{ model.FLAG_LEFT_HAND_STUB }}";
var flagLogo = "{{ model.FLAG_LOGO }}";
var flagMessage = "{{ model.FLAG_MESSAGE }}";
var flagModal = "{{ model.FLAG_MODAL }}";
var flagMove = "move";
var flagName = "{{ model.FLAG_NAME }}";
var flagNameAttrOptionText = "{{ model.FLAG_NAME_ATTR_OPTION_TEXT}}";
var flagNameAttrOptionValue = "{{ model.FLAG_NAME_ATTR_OPTION_VALUE }}";
var flagNamePlural = "{{ model.FLAG_NAME_PLURAL }}";
var flagNavAdminHome = "{{ model.FLAG_NAV_ADMIN_HOME }}";
var flagNavContact = "{{ model.FLAG_NAV_CONTACT }}";
var flagNavHome = "{{ model.FLAG_NAV_HOME }}";
var flagNavDogAssessments = "{{ model.FLAG_NAV_DOG_ASSESSMENTS }}";
var flagNavDogButtonIcons = "{{ model.FLAG_NAV_DOG_BUTTON_ICONS }}";
var flagNavDogButtonShapes = "{{ model.FLAG_NAV_DOG_BUTTON_SHAPES }}";
var flagNavDogCalendarEntries = "{{ model.FLAG_NAV_DOG_CALENDAR_ENTRIES }}";
var flagNavDogColour = "{{ model.FLAG_NAV_DOG_COLOUR }}";
var flagNavDogCommandButtonLinks = "{{ model.FLAG_NAV_DOG_COMMAND_BUTTON_LINKS }}";
var flagNavDogCommandCategories = "{{ model.FLAG_NAV_DOG_COMMAND_CATEGORIES }}";
var flagNavDogCommands = "{{ model.FLAG_NAV_DOG_COMMANDS }}";
var flagNavDogDogs = "{{ model.FLAG_NAV_DOG_DOGS }}";
var flagNavDogDogCommandLinks = "{{ model.FLAG_NAV_DOG_DOG_COMMAND_LINKS }}";
var flagNavDogHome = "{{ model.FLAG_NAV_DOG_HOME }}";
var flagNavDogLocations = "{{ model.FLAG_NAV_DOG_LOCATIONS }}";
var flagNavUserAccount = "{{ model.FLAG_NAV_USER_ACCOUNT }}";
var flagNavUserAdmin = "{{ model.FLAG_NAV_USER_ADMIN }}";
var flagNavUserLogin = "{{ model.FLAG_NAV_USER_LOGIN }}";
var flagNavUserLogout = "{{ model.FLAG_NAV_USER_LOGOUT }}";
var flagNotes = "{{ model.FLAG_NOTES }}";
var flagOverlay = "{{ model.FLAG_OVERLAY }}";
var flagOverlayClose = "{{ model.FLAG_OVERLAY_CLOSE }}";
var flagPageBody = "{{ model.FLAG_PAGE_BODY }}";
var flagPhoneNumber = "{{ model.FLAG_PHONE_NUMBER }}";
var flagQuantity = "{{ model.FLAG_QUANTITY }}";
var flagRightHandSide = "{{ model.FLAG_RIGHT_HAND_SIDE }}";
var flagRow = "{{ model.FLAG_ROW }}";
var flagRowNew = "{{ model.FLAG_ROW_NEW }}";
var flagRows = "{{ model.FLAG_ROWS }}";
var flagSave = "{{ model.FLAG_SAVE }}";
var flagScrollable = "{{ model.FLAG_SCROLLABLE }}";
var flagSearch = "{{ model.FLAG_SEARCH }}";
var flagSlider = "{{ model.FLAG_SLIDER }}";
var flagStatus = "{{ model.FLAG_STATUS }}";
var flagSubmit = "{{ model.FLAG_SUBMIT }}";
var flagSubmitted = "{{ model.FLAG_SUBMITTED }}";
var flagSuccess = "{{ model.FLAG_SUCCESS }}";
var flagTableMain = "{{ model.FLAG_TABLE_MAIN }}";
var flagTemporaryElement = "{{ model.FLAG_TEMPORARY_ELEMENT }}";
var flagUser = "{{ model.FLAG_USER }}";
var flagWebsite = "{{ model.FLAG_WEBSITE }}";
var hashGetALTCHAChallenge = "{{ model.HASH_ALTCHA_CREATE_CHALLENGE }}";
var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}";
var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}";
var hashPageAdminHome = "{{ model.HASH_PAGE_ADMIN_HOME }}";
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";
var hashPageDogAssessment = "{{ model.HASH_PAGE_DOG_ASSESSMENT }}";
var hashPageDogAssessments = "{{ model.HASH_PAGE_DOG_ASSESSMENTS }}";
var hashPageDogButtonIcons = "{{ model.HASH_PAGE_DOG_BUTTON_ICONS }}";
var hashPageDogButtonShapes = "{{ model.HASH_PAGE_DOG_BUTTON_SHAPES }}";
var hashPageDogCalendarEntries = "{{ model.HASH_PAGE_DOG_CALENDAR_ENTRIES }}";
var hashPageDogColours = "{{ model.HASH_PAGE_DOG_COLOURS }}";
var hashPageDogCommandButtonLinks = "{{ model.HASH_PAGE_DOG_COMMAND_BUTTON_LINKS }}";
var hashPageDogCommandCategories = "{{ model.HASH_PAGE_DOG_COMMAND_CATEGORIES }}";
var hashPageDogCommands = "{{ model.HASH_PAGE_DOG_COMMANDS }}";
var hashPageDogDogCommandLinks = "{{ model.HASH_PAGE_DOG_DOG_COMMAND_LINKS }}";
var hashPageDogDogs = "{{ model.HASH_PAGE_DOG_DOGS }}";
var hashPageDogHome = "{{ model.HASH_PAGE_DOG_HOME }}";
var hashPageDogLocations = "{{ model.HASH_PAGE_DOG_LOCATIONS }}";
var hashPageErrorNoPermission = "{{ model.HASH_PAGE_ERROR_NO_PERMISSION }}";
var hashPageHome = "{{ model.HASH_PAGE_HOME }}";
var hashPageLicense = "{{ model.HASH_PAGE_LICENSE }}";
var hashPagePrivacyPolicy = "{{ model.HASH_PAGE_PRIVACY_POLICY }}";
var hashPageUserAccount = "{{ model.HASH_PAGE_USER_ACCOUNT }}";
var hashPageUserAdmin = "{{ model.HASH_PAGE_USER_ADMIN }}";
var hashPageUserLogin = "{{ model.HASH_PAGE_USER_LOGIN }}";
var hashPageUserLogout = "{{ model.HASH_PAGE_USER_LOGOUT }}";
var idButtonApplyFilters = "#{{ model.ID_BUTTON_APPLY_FILTERS }}";
var idButtonHamburger = "#{{ model.ID_BUTTON_HAMBURGER }}";
var idButtonCancel = "#{{ model.ID_BUTTON_CANCEL }}";
var idButtonSave = "#{{ model.ID_BUTTON_SAVE }}";
var idContainerTemplateElements = "#{{ model.ID_CONTAINER_TEMPLATE_ELEMENTS }}";
var idCSRFToken = "#{{ model.ID_CSRF_TOKEN }}";
var idFormFilters = "#{{ model.ID_FORM_FILTERS }}";
var idLabelError = "#{{ model.ID_LABEL_ERROR }}";
var idOverlayConfirm = "#{{ model.ID_OVERLAY_CONFIRM }}";
var idOverlayError = "#{{ model.ID_OVERLAY_ERROR }}";
var idOverlayHamburger = "#{{ model.ID_OVERLAY_HAMBURGER }}";
var idPageBody = "#{{ model.ID_PAGE_BODY }}";
var idTableMain = "#{{ model.ID_TABLE_MAIN }}";
var idTextareaConfirm = "#{{ model.ID_TEXTAREA_CONFIRM }}";
var isUserLoggedIn = "{{ model.output_bool(model.IS_USER_LOGGED_IN) }}";
var _pathHost = "{{ model.get_url_host() }}";
var _rowBlank = null;
var titlePageCurrent = "{{ model.title }}";
var _verbose = ("{{ model.app.app_config.DEBUG }}" == "True");
</script>

View File

@@ -0,0 +1,64 @@
<script>
var attrIdAssessment = "{{ model.ATTR_ID_ASSESSMENT }}";
var attrIdAssessmentCommandModalityLink = "{{ model.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK }}";
var attrIdAssessmentResponse = "{{ model.ATTR_ID_ASSESSMENT_RESPONSE }}";
var attrIdAccessLevel = "{{ model.ATTR_ID_ACCESS_LEVEL }}";
var attrIdBribe = "{{ model.ATTR_ID_BRIBE }}";
var attrIdButtonColour = "{{ model.ATTR_ID_BUTTON_COLOUR }}";
var attrIdButtonIcon = "{{ model.ATTR_ID_BUTTON_ICON }}";
var attrIdButtonShape = "{{ model.ATTR_ID_BUTTON_SHAPE }}";
var attrIdCalendarEntry = "{{ model.ATTR_ID_CALENDAR_ENTRY }}";
var attrIdCalendarEntryType = "{{ model.ATTR_ID_CALENDAR_ENTRY_TYPE }}";
var attrIdColour = "{{ model.ATTR_ID_COLOUR }}";
var attrIdCommand = "{{ model.ATTR_ID_COMMAND }}";
var attrIdCommandButtonLink = "{{ model.ATTR_ID_COMMAND_BUTTON_LINK }}";
var attrIdCommandCategory = "{{ model.ATTR_ID_COMMAND_CATEGORY }}";
var attrIdCommandModality = "{{ model.ATTR_ID_COMMAND_MODALITY }}";
var attrIdCurrency = "{{ model.ATTR_ID_CURRENCY }}";
var attrIdDistraction = "{{ model.ATTR_ID_DISTRACTION }}";
var attrIdDistractionIntensityLevel = "{{ model.ATTR_ID_DISTRACTION_INTENSITY_LEVEL }}";
var attrIdDistractionType = "{{ model.ATTR_ID_DISTRACTION_TYPE }}";
var attrIdDog = "{{ model.ATTR_ID_DOG }}";
var attrIdDogCommandLink = "{{ model.ATTR_ID_DOG_COMMAND_LINK }}";
var attrIdLightingLevel = "{{ model.ATTR_ID_LIGHTING_LEVEL }}";
var attrIdLocation = "{{ model.ATTR_ID_LOCATION }}";
var attrIdObedienceLevel = "{{ model.ATTR_ID_OBEDIENCE_LEVEL }}";
var attrIdResponseQualityMetric = "{{ model.ATTR_ID_RESPONSE_QUALITY_METRIC }}";
var attrIdWeather = "{{ model.ATTR_ID_WEATHER }}";
var flagAssessment = "{{ model.FLAG_ASSESSMENT }}";
var flagAssessmentCommandModalityLink = "{{ model.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK }}";
var flagAssessmentResponse = "{{ model.FLAG_ASSESSMENT_RESPONSE }}";
var flagBribe = "{{ model.FLAG_BRIBE }}";
var flagButtonIcon = "{{ model.FLAG_BUTTON_ICON }}";
var flagButtonShape = "{{ model.FLAG_BUTTON_SHAPE }}";
var flagCalendarEntry = "{{ model.FLAG_CALENDAR_ENTRY }}";
var flagCalendarEntryType = "{{ model.FLAG_CALENDAR_ENTRY_TYPE }}";
var flagColour = "{{ model.FLAG_COLOUR }}";
var flagCommand = "{{ model.FLAG_COMMAND }}";
var flagCommandButtonLink = "{{ model.FLAG_COMMAND_BUTTON_LINK }}";
var flagCommandCategory = "{{ model.FLAG_COMMAND_CATEGORY }}";
var flagCommandModality = "{{ model.FLAG_COMMAND_MODALITY }}";
var flagCurrency = "{{ model.FLAG_CURRENCY }}";
var flagDistraction = "{{ model.FLAG_DISTRACTION }}";
var flagDistractionIntensityLevel = "{{ model.FLAG_DISTRACTION_INTENSITY_LEVEL }}";
var flagDistractionType = "{{ model.FLAG_DISTRACTION_TYPE }}";
var flagDog = "{{ model.FLAG_DOG }}";
var flagDogDogCommandLink = "{{ model.FLAG_DOG_DOG_COMMAND_LINK }}";
var flagLightingLevel = "{{ model.FLAG_LIGHTING_LEVEL }}";
var flagLocation = "{{ model.FLAG_LOCATION }}";
var flagLocationParent = "{{ model.FLAG_LOCATION_PARENT }}";
var flagObedienceLevel = "{{ model.FLAG_OBEDIENCE_LEVEL }}";
var flagResponseQualityMetric = "{{ model.FLAG_RESPONSE_QUALITY_METRIC }}";
var flagWeather = "{{ model.FLAG_WEATHER }}";
{# var hashSaveDogAssessment = "{{ model.HASH_SAVE_DOG_ASSESSMENT }}"; #}
var hashSaveDogAssessmentDistractionAndResponse = "{{ model.HASH_SAVE_DOG_ASSESSMENT_DISTRACTION_AND_RESPONSE }}";
var hashSaveDogButtonIcon = "{{ model.HASH_SAVE_DOG_BUTTON_ICON }}";
var hashSaveDogButtonShape = "{{ model.HASH_SAVE_DOG_BUTTON_SHAPE }}";
var hashSaveDogColour = "{{ model.HASH_SAVE_DOG_COLOUR }}";
var hashSaveDogCommand = "{{ model.HASH_SAVE_DOG_COMMAND }}";
var hashSaveDogCommandButtonLink = "{{ model.HASH_SAVE_DOG_COMMAND_BUTTON_LINK }}";
var hashSaveDogCommandCategory = "{{ model.HASH_SAVE_DOG_COMMAND_CATEGORY }}";
var hashSaveDogDogCommandLink = "{{ model.HASH_SAVE_DOG_DOG_COMMAND_LINK }}";
var hashSaveDogLocation = "{{ model.HASH_SAVE_DOG_LOCATION }}";
</script>

View File

@@ -0,0 +1,9 @@
<script>
var flagAddress = "{{ model.FLAG_ADDRESS }}";
var flagAddressLine1 = "{{ model.FLAG_ADDRESS_LINE_1 }}";
var flagAddressLine2 = "{{ model.FLAG_ADDRESS_LINE_2 }}";
var flagCity = "{{ model.FLAG_CITY }}";
var flagCounty = "{{ model.FLAG_COUNTY }}";
var flagPostcode = "{{ model.FLAG_POSTCODE }}";
</script>

View File

@@ -13,7 +13,7 @@
"@type": "ProfessionalService",
"name": "{{ model.NAME_COMPANY_SHORT }}",
"url": "{{ model.get_url_host() }}",
"logo": "{{ model.get_url_host() }}{{ url_for('static', filename='images/Logo.png') }}",
"logo": "{{ model.get_url_host() }}{{ url_for('static', filename='images/fetch-metrics-logo-LQ.webp') }}",
"description": "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.",
"address": {
"@type": "PostalAddress",
@@ -35,358 +35,6 @@
<meta name="yandex-verification" content="4693a824cfda082a" />
<meta id="{{ model.ID_CSRF_TOKEN }}" name="{{ model.FLAG_CSRF_TOKEN }}" content="{{ csrf_token() }}" />
<script>
{#
var attrIdAccessLevel = "{{ model.ATTR_ID_ACCESS_LEVEL }}";
var attrIdCurrency = "{{ model.ATTR_ID_CURRENCY }}";
var attrIdAddress = "{{ model.ATTR_ID_ADDRESS }}";
var attrIdPlant = "{{ model.ATTR_ID_PLANT }}";
var attrIdRegion = "{{ model.ATTR_ID_REGION }}";
var attrIdStorageLocation = "{{ model.ATTR_ID_STORAGE_LOCATION }}";
var attrTextCollapsed = "{{ model.ATTR_TEXT_COLLAPSED }}";
var attrTextExpanded = "{{ model.ATTR_TEXT_EXPANDED }}";
var attrValueCurrent = "{{ model.ATTR_VALUE_CURRENT }}";
var attrValuePrevious = "{{ model.ATTR_VALUE_PREVIOUS }}";
var attrValueNew = "{{ model.ATTR_VALUE_NEW }}";
var environment = {
"name": "{{ model.app.app_config.FLASK_ENV }}",
"is_production": "{{ model.app.app_config.is_production }}",
"is_development": "{{ model.app.app_config.is_development }}",
};
var flagAccessLevel = "{{ model.FLAG_ACCESS_LEVEL }}";
var flagAccessLevelRequired = "{{ model.FLAG_ACCESS_LEVEL_REQUIRED }}";
var flagActive = "{{ model.FLAG_ACTIVE }}";
var flagAdd = "{{ model.FLAG_ADD }}";
var flagAddress = "{{ model.FLAG_ADDRESS }}";
var flagAddressLine1 = "{{ model.FLAG_ADDRESS_LINE_1 }}";
var flagAddressLine2 = "{{ model.FLAG_ADDRESS_LINE_2 }}";
var flagButton = "{{ model.FLAG_BUTTON }}";
var flagButtonPrimary = "{{ model.FLAG_BUTTON_PRIMARY }}";
var flagCallback = "{{ model.FLAG_CALLBACK }}";
var flagCancel = "{{ model.FLAG_CANCEL }}";
var flagCard = "{{ model.FLAG_CARD }}";
var flagCity = "{{ model.FLAG_CITY }}";
var flagCloseTemporaryElement = "{{ model.FLAG_CLOSE_TEMPORARY_ELEMENT }}";
var flagCode = "{{ model.FLAG_CODE }}";
var flagCollapsed = "{{ model.FLAG_COLLAPSED }}";
var flagCollapsible = "{{ model.FLAG_COLLAPSIBLE }}";
var flagColumn = "{{ model.FLAG_COLUMN }}";
var flagComment = "{{ model.FLAG_COMMENT }}";
// var flagContactUs = "{{ model.FLAG_CONTACT_US }}";
var flagContainer = "{{ model.FLAG_CONTAINER }}";
var flagContainerCheckbox = "{{ model.FLAG_CONTAINER_CHECKBOX }}";
var flagContainerInput = "{{ model.FLAG_CONTAINER_INPUT }}";
var flagCounty = "{{ model.FLAG_COUNTY }}";
var flagCsrfToken = "{{ model.FLAG_CSRF_TOKEN }}";
var flagCurrency = "{{ model.FLAG_CURRENCY }}";
var flagDelete = "{{ model.FLAG_DELETE }}";
var flagDescription = "{{ model.FLAG_DESCRIPTION }}";
var flagDetail = "{{ model.FLAG_DETAIL }}";
var flagDialog = "{{ model.FLAG_DIALOG }}";
var flagDirty = "{{ model.FLAG_DIRTY }}";
var flagDisplayOrder = "{{ model.FLAG_DISPLAY_ORDER }}";
var flagDragging = "dragging";
var flagDragOver = "drag-over";
var flagEdit = "{{ model.FLAG_EDIT }}";
var flagEmail = "{{ model.FLAG_EMAIL }}";
var flagError = "{{ model.FLAG_ERROR }}";
var flagExpanded = "{{ model.FLAG_EXPANDED }}";
var flagFailure = "{{ model.FLAG_FAILURE }}";
var flagFax = "{{ model.FLAG_FAX }}";
var flagFilter = "{{ model.FLAG_FILTER }}";
var flagForm = "{{ model.FLAG_FORM }}";
var flagFormFilters = "{{ model.FLAG_FORM_FILTERS }}";
var flagImageLogo = "{{ model.FLAG_IMAGE_LOGO }}";
var flagInitialised = "{{ model.FLAG_INITIALISED }}";
// var flagItems = "{{ model.FLAG_ITEMS }}";
// var flagKeyPrimary = "{{ model.FLAG_KEY_PRIMARY }}";
var flagLeftHandStub = "{{ model.FLAG_LEFT_HAND_STUB }}";
var flagLogo = "{{ model.FLAG_LOGO }}";
var flagMessage = "{{ model.FLAG_MESSAGE }}";
var flagModal = "{{ model.FLAG_MODAL }}";
var flagMove = "move";
var flagName = "{{ model.FLAG_NAME }}";
var flagNameAttrOptionText = "{{ model.FLAG_NAME_ATTR_OPTION_TEXT}}";
var flagNameAttrOptionValue = "{{ model.FLAG_NAME_ATTR_OPTION_VALUE }}";
var flagNamePlural = "{{ model.FLAG_NAME_PLURAL }}";
var flagNavAdminHome = "{{ model.FLAG_NAV_ADMIN_HOME }}";
var flagNavContact = "{{ model.FLAG_NAV_CONTACT }}";
var flagNavHome = "{{ model.FLAG_NAV_HOME }}";
var flagNavServices = "{{ model.FLAG_NAV_SERVICES }}";
var flagNavUserAccount = "{{ model.FLAG_NAV_USER_ACCOUNT }}";
var flagNavUserAdmin = "{{ model.FLAG_NAV_USER_ADMIN }}";
var flagNavUserLogin = "{{ model.FLAG_NAV_USER_LOGIN }}";
var flagNavUserLogout = "{{ model.FLAG_NAV_USER_LOGOUT }}";
var flagOverlay = "{{ model.FLAG_OVERLAY }}";
var flagOverlayClose = "{{ model.FLAG_OVERLAY_CLOSE }}";
var flagPageBody = "{{ model.FLAG_PAGE_BODY }}";
var flagPhoneNumber = "{{ model.FLAG_PHONE_NUMBER }}";
var flagPostcode = "{{ model.FLAG_POSTCODE }}";
var flagCaptcha = "{{ model.FLAG_CAPTCHA }}";
var flagRightHandSide = "{{ model.FLAG_RIGHT_HAND_SIDE }}";
var flagRow = "{{ model.FLAG_ROW }}";
var flagRowNew = "{{ model.FLAG_ROW_NEW }}";
var flagRows = "{{ model.FLAG_ROWS }}";
var flagSave = "{{ model.FLAG_SAVE }}";
var flagScrollable = "{{ model.FLAG_SCROLLABLE }}";
var flagSlider = "{{ model.FLAG_SLIDER }}";
var flagStatus = "{{ model.FLAG_STATUS }}";
var flagSubmit = "{{ model.FLAG_SUBMIT }}";
var flagSubmitted = "{{ model.FLAG_SUBMITTED }}";
var flagSuccess = "{{ model.FLAG_SUCCESS }}";
var flagTemporaryElement = "{{ model.FLAG_TEMPORARY_ELEMENT }}";
var flagUser = "{{ model.FLAG_USER }}";
var flagWebsite = "{{ model.FLAG_WEBSITE }}";
var hashGetALTCHAChallenge = "{{ model.HASH_ALTCHA_CREATE_CHALLENGE }}";
var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}";
var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}";
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";
var hashPageErrorNoPermission = "{{ model.HASH_PAGE_ERROR_NO_PERMISSION }}";
var hashPageHome = "{{ model.HASH_PAGE_HOME }}";
var hashPageLicense = "{{ model.HASH_PAGE_LICENSE }}";
var hashPagePrivacyPolicy = "{{ model.HASH_PAGE_PRIVACY_POLICY }}";
var idButtonApplyFilters = "#{{ model.ID_BUTTON_APPLY_FILTERS }}";
var idButtonHamburger = "#{{ model.ID_BUTTON_HAMBURGER }}";
var idCSRFToken = "#{{ model.ID_CSRF_TOKEN }}";
var idFormFilters = "#{{ model.ID_FORM_FILTERS }}";
var idLabelError = "#{{ model.ID_LABEL_ERROR }}";
var idOverlayConfirm = "#{{ model.ID_OVERLAY_CONFIRM }}";
var idOverlayError = "#{{ model.ID_OVERLAY_ERROR }}";
var idOverlayHamburger = "#{{ model.ID_OVERLAY_HAMBURGER }}";
var idPageBody = "#{{ model.ID_PAGE_BODY }}";
var idTableMain = "#{{ model.ID_TABLE_MAIN }}";
var idTextareaConfirm = "#{{ model.ID_TEXTAREA_CONFIRM }}";
var isUserLoggedIn = "{{ model.output_bool(model.IS_USER_LOGGED_IN) }}";
var _pathHost = "{{ model.get_url_host() }}";
var _rowBlank = null;
var titlePageCurrent = "{{ model.title }}";
var _verbose = ("{{ model.app.app_config.DEBUG }}" == "True");
#}
var attrIdAssessment = "{{ model.ATTR_ID_ASSESSMENT }}";
var attrIdAssessmentCommandModalityLink = "{{ model.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK }}";
var attrIdAssessmentResponse = "{{ model.ATTR_ID_ASSESSMENT_RESPONSE }}";
var attrIdAccessLevel = "{{ model.ATTR_ID_ACCESS_LEVEL }}";
var attrIdBribe = "{{ model.ATTR_ID_BRIBE }}";
var attrIdButtonColour = "{{ model.ATTR_ID_BUTTON_COLOUR }}";
var attrIdButtonIcon = "{{ model.ATTR_ID_BUTTON_ICON }}";
var attrIdButtonShape = "{{ model.ATTR_ID_BUTTON_SHAPE }}";
var attrIdColour = "{{ model.ATTR_ID_COLOUR }}";
var attrIdCommand = "{{ model.ATTR_ID_COMMAND }}";
var attrIdCommandButtonLink = "{{ model.ATTR_ID_COMMAND_BUTTON_LINK }}";
var attrIdCommandCategory = "{{ model.ATTR_ID_COMMAND_CATEGORY }}";
var attrIdCommandModality = "{{ model.ATTR_ID_COMMAND_MODALITY }}";
var attrIdCurrency = "{{ model.ATTR_ID_CURRENCY }}";
var attrIdDistraction = "{{ model.ATTR_ID_DISTRACTION }}";
var attrIdDistractionIntensityLevel = "{{ model.ATTR_ID_DISTRACTION_INTENSITY_LEVEL }}";
var attrIdDistractionType = "{{ model.ATTR_ID_DISTRACTION_TYPE }}";
var attrIdDog = "{{ model.ATTR_ID_DOG }}";
var attrIdDogCommandLink = "{{ model.ATTR_ID_DOG_COMMAND_LINK }}";
var attrIdLightingLevel = "{{ model.ATTR_ID_LIGHTING_LEVEL }}";
var attrIdLocation = "{{ model.ATTR_ID_LOCATION }}";
var attrIdObedienceLevel = "{{ model.ATTR_ID_OBEDIENCE_LEVEL }}";
var attrIdResponseQualityMetric = "{{ model.ATTR_ID_RESPONSE_QUALITY_METRIC }}";
var attrIdWeather = "{{ model.ATTR_ID_WEATHER }}";
var attrTextCollapsed = "{{ model.ATTR_TEXT_COLLAPSED }}";
var attrTextExpanded = "{{ model.ATTR_TEXT_EXPANDED }}";
var attrValueCurrent = "{{ model.ATTR_VALUE_CURRENT }}";
var attrValuePrevious = "{{ model.ATTR_VALUE_PREVIOUS }}";
var attrValueNew = "{{ model.ATTR_VALUE_NEW }}";
var colourAccent = "{{ model.COLOUR_ACCENT }}";
var colourError = "{{ model.COLOUR_ERROR }}";
var colourPageBackground = "{{ model.COLOUR_PAGE_BACKGROUND }}";
var colourPageBackground1 = "{{ model.COLOUR_PAGE_BACKGROUND_1 }}";
var colourPageBackground2 = "{{ model.COLOUR_PAGE_BACKGROUND_2 }}";
var colourPrimary = "{{ model.COLOUR_PRIMARY }}";
var colourSecondary = "{{ model.COLOUR_SECONDARY }}";
var colourText = "{{ model.COLOUR_TEXT }}";
var colourTextBackground = "{{ model.COLOUR_TEXT_BACKGROUND }}";
var colourTextLinkUnvisited = "{{ model.COLOUR_TEXT_LINK_UNVISITED }}";
var colourTextLinkVisited = "{{ model.COLOUR_TEXT_LINK_VISITED }}";
var environment = {
"name": "{{ model.app.app_config.FLASK_ENV }}",
"is_production": "{{ model.app.app_config.is_production | lower }}",
"is_development": "{{ model.app.app_config.is_development | lower }}",
};
var flagAccessLevel = "{{ model.FLAG_ACCESS_LEVEL }}";
var flagAccessLevelRequired = "{{ model.FLAG_ACCESS_LEVEL_REQUIRED }}";
var flagActive = "{{ model.FLAG_ACTIVE }}";
var flagActiveOnly = "{{ model.FLAG_ACTIVE_ONLY }}";
var flagAdd = "{{ model.FLAG_ADD }}";
var flagAddress = "{{ model.FLAG_ADDRESS }}";
var flagAddressLine1 = "{{ model.FLAG_ADDRESS_LINE_1 }}";
var flagAddressLine2 = "{{ model.FLAG_ADDRESS_LINE_2 }}";
var flagAssessment = "{{ model.FLAG_ASSESSMENT }}";
var flagAssessmentCommandModalityLink = "{{ model.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK }}";
var flagAssessmentResponse = "{{ model.FLAG_ASSESSMENT_RESPONSE }}";
var flagBribe = "{{ model.FLAG_BRIBE }}";
var flagButton = "{{ model.FLAG_BUTTON }}";
var flagButtonIcon = "{{ model.FLAG_BUTTON_ICON }}";
var flagButtonShape = "{{ model.FLAG_BUTTON_SHAPE }}";
var flagButtonPrimary = "{{ model.FLAG_BUTTON_PRIMARY }}";
var flagCallback = "{{ model.FLAG_CALLBACK }}";
var flagCancel = "{{ model.FLAG_CANCEL }}";
var flagCaptcha = "{{ model.FLAG_CAPTCHA }}";
var flagCard = "{{ model.FLAG_CARD }}";
var flagCheckbox = "{{ model.FLAG_CHECKBOX }}";
var flagCity = "{{ model.FLAG_CITY }}";
var flagCloseTemporaryElement = "{{ model.FLAG_CLOSE_TEMPORARY_ELEMENT }}";
var flagCode = "{{ model.FLAG_CODE }}";
var flagCollapsible = "{{ model.FLAG_COLLAPSIBLE }}";
var flagColour = "{{ model.FLAG_COLOUR }}";
var flagColumn = "{{ model.FLAG_COLUMN }}";
var flagCommand = "{{ model.FLAG_COMMAND }}";
var flagCommandButtonLink = "{{ model.FLAG_COMMAND_BUTTON_LINK }}";
var flagCommandCategory = "{{ model.FLAG_COMMAND_CATEGORY }}";
var flagComment = "{{ model.FLAG_COMMENT }}";
var flagContainer = "{{ model.FLAG_CONTAINER }}";
var flagContainerInput = "{{ model.FLAG_CONTAINER_INPUT }}";
var flagCounty = "{{ model.FLAG_COUNTY }}";
var flagCsrfToken = "{{ model.FLAG_CSRF_TOKEN }}";
var flagCurrency = "{{ model.FLAG_CURRENCY }}";
var flagDdlPreview = "{{ model.FLAG_DDL_PREVIEW }}";
var flagDelete = "{{ model.FLAG_DELETE }}";
var flagDescription = "{{ model.FLAG_DESCRIPTION }}";
var flagDetail = "{{ model.FLAG_DETAIL }}";
var flagDialog = "{{ model.FLAG_DIALOG }}";
var flagDirty = "{{ model.FLAG_DIRTY }}";
var flagDisplayOrder = "{{ model.FLAG_DISPLAY_ORDER }}";
var flagDistraction = "{{ model.FLAG_DISTRACTION }}";
var flagDistractionIntensityLevel = "{{ model.FLAG_DISTRACTION_INTENSITY_LEVEL }}";
var flagDistractionType = "{{ model.FLAG_DISTRACTION_TYPE }}";
var flagDog = "{{ model.FLAG_DOG }}";
var flagDogDogCommandLink = "{{ model.FLAG_DOG_DOG_COMMAND_LINK }}";
var flagDragging = "dragging";
var flagDragOver = "drag-over";
var flagEdit = "{{ model.FLAG_EDIT }}";
var flagEmail = "{{ model.FLAG_EMAIL }}";
var flagError = "{{ model.FLAG_ERROR }}";
var flagExpanded = "{{ model.FLAG_EXPANDED }}";
var flagFailure = "{{ model.FLAG_FAILURE }}";
var flagFax = "{{ model.FLAG_FAX }}";
var flagFilter = "{{ model.FLAG_FILTER }}";
var flagForm = "{{ model.FLAG_FORM }}";
var flagFormFilters = "{{ model.FLAG_FORM_FILTERS }}";
var flagIcon = "{{ model.FLAG_ICON }}";
var flagImageLogo = "{{ model.FLAG_IMAGE_LOGO }}";
var flagInitialised = "{{ model.FLAG_INITIALISED }}";
var flagIsChecked = "{{ model.FLAG_IS_CHECKED }}";
var flagIsCollapsed = "{{ model.FLAG_IS_COLLAPSED }}";
var flagLeftHandStub = "{{ model.FLAG_LEFT_HAND_STUB }}";
var flagLightingLevel = "{{ model.FLAG_LIGHTING_LEVEL }}";
var flagLocation = "{{ model.FLAG_LOCATION }}";
var flagLocationParent = "{{ model.FLAG_LOCATION_PARENT }}";
var flagLogo = "{{ model.FLAG_LOGO }}";
var flagMessage = "{{ model.FLAG_MESSAGE }}";
var flagModal = "{{ model.FLAG_MODAL }}";
var flagMove = "move";
var flagName = "{{ model.FLAG_NAME }}";
var flagNameAttrOptionText = "{{ model.FLAG_NAME_ATTR_OPTION_TEXT}}";
var flagNameAttrOptionValue = "{{ model.FLAG_NAME_ATTR_OPTION_VALUE }}";
var flagNamePlural = "{{ model.FLAG_NAME_PLURAL }}";
var flagNavAdminHome = "{{ model.FLAG_NAV_ADMIN_HOME }}";
var flagNavContact = "{{ model.FLAG_NAV_CONTACT }}";
var flagNavHome = "{{ model.FLAG_NAV_HOME }}";
var flagNavDogAssessments = "{{ model.FLAG_NAV_DOG_ASSESSMENTS }}";
var flagNavDogButtonIcons = "{{ model.FLAG_NAV_DOG_BUTTON_ICONS }}";
var flagNavDogButtonShapes = "{{ model.FLAG_NAV_DOG_BUTTON_SHAPES }}";
var flagNavDogColour = "{{ model.FLAG_NAV_DOG_COLOUR }}";
var flagNavDogCommandButtonLinks = "{{ model.FLAG_NAV_DOG_COMMAND_BUTTON_LINKS }}";
var flagNavDogCommandCategories = "{{ model.FLAG_NAV_DOG_COMMAND_CATEGORIES }}";
var flagNavDogCommands = "{{ model.FLAG_NAV_DOG_COMMANDS }}";
var flagNavDogDogs = "{{ model.FLAG_NAV_DOG_DOGS }}";
var flagNavDogDogCommandLinks = "{{ model.FLAG_NAV_DOG_DOG_COMMAND_LINKS }}";
var flagNavDogHome = "{{ model.FLAG_NAV_DOG_HOME }}";
var flagNavDogLocations = "{{ model.FLAG_NAV_DOG_LOCATIONS }}";
var flagNavUserAccount = "{{ model.FLAG_NAV_USER_ACCOUNT }}";
var flagNavUserAdmin = "{{ model.FLAG_NAV_USER_ADMIN }}";
var flagNavUserLogin = "{{ model.FLAG_NAV_USER_LOGIN }}";
var flagNavUserLogout = "{{ model.FLAG_NAV_USER_LOGOUT }}";
var flagNotes = "{{ model.FLAG_NOTES }}";
var flagObedienceLevel = "{{ model.FLAG_OBEDIENCE_LEVEL }}";
var flagOverlay = "{{ model.FLAG_OVERLAY }}";
var flagOverlayClose = "{{ model.FLAG_OVERLAY_CLOSE }}";
var flagPageBody = "{{ model.FLAG_PAGE_BODY }}";
var flagPhoneNumber = "{{ model.FLAG_PHONE_NUMBER }}";
var flagPostcode = "{{ model.FLAG_POSTCODE }}";
var flagQuantity = "{{ model.FLAG_QUANTITY }}";
var flagResponseQualityMetric = "{{ model.FLAG_RESPONSE_QUALITY_METRIC }}";
var flagRightHandSide = "{{ model.FLAG_RIGHT_HAND_SIDE }}";
var flagRow = "{{ model.FLAG_ROW }}";
var flagRowNew = "{{ model.FLAG_ROW_NEW }}";
var flagRows = "{{ model.FLAG_ROWS }}";
var flagSave = "{{ model.FLAG_SAVE }}";
var flagScrollable = "{{ model.FLAG_SCROLLABLE }}";
var flagSearch = "{{ model.FLAG_SEARCH }}";
var flagSlider = "{{ model.FLAG_SLIDER }}";
var flagStatus = "{{ model.FLAG_STATUS }}";
var flagSubmit = "{{ model.FLAG_SUBMIT }}";
var flagSubmitted = "{{ model.FLAG_SUBMITTED }}";
var flagSuccess = "{{ model.FLAG_SUCCESS }}";
var flagTableMain = "{{ model.FLAG_TABLE_MAIN }}";
var flagTemporaryElement = "{{ model.FLAG_TEMPORARY_ELEMENT }}";
var flagUser = "{{ model.FLAG_USER }}";
var flagWeather = "{{ model.FLAG_WEATHER }}";
var flagWebsite = "{{ model.FLAG_WEBSITE }}";
var hashGetALTCHAChallenge = "{{ model.HASH_ALTCHA_CREATE_CHALLENGE }}";
var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}";
var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}";
var hashPageAdminHome = "{{ model.HASH_PAGE_ADMIN_HOME }}";
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";
var hashPageDogAssessment = "{{ model.HASH_PAGE_DOG_ASSESSMENT }}";
var hashPageDogAssessments = "{{ model.HASH_PAGE_DOG_ASSESSMENTS }}";
var hashPageDogButtonIcons = "{{ model.HASH_PAGE_DOG_BUTTON_ICONS }}";
var hashPageDogButtonShapes = "{{ model.HASH_PAGE_DOG_BUTTON_SHAPES }}";
var hashPageDogColours = "{{ model.HASH_PAGE_DOG_COLOURS }}";
var hashPageDogCommandButtonLinks = "{{ model.HASH_PAGE_DOG_COMMAND_BUTTON_LINKS }}";
var hashPageDogCommandCategories = "{{ model.HASH_PAGE_DOG_COMMAND_CATEGORIES }}";
var hashPageDogCommands = "{{ model.HASH_PAGE_DOG_COMMANDS }}";
var hashPageDogDogCommandLinks = "{{ model.HASH_PAGE_DOG_DOG_COMMAND_LINKS }}";
var hashPageDogDogs = "{{ model.HASH_PAGE_DOG_DOGS }}";
var hashPageDogHome = "{{ model.HASH_PAGE_DOG_HOME }}";
var hashPageDogLocations = "{{ model.HASH_PAGE_DOG_LOCATIONS }}";
var hashPageErrorNoPermission = "{{ model.HASH_PAGE_ERROR_NO_PERMISSION }}";
var hashPageHome = "{{ model.HASH_PAGE_HOME }}";
var hashPageLicense = "{{ model.HASH_PAGE_LICENSE }}";
var hashPagePrivacyPolicy = "{{ model.HASH_PAGE_PRIVACY_POLICY }}";
var hashPageUserAccount = "{{ model.HASH_PAGE_USER_ACCOUNT }}";
var hashPageUserAdmin = "{{ model.HASH_PAGE_USER_ADMIN }}";
var hashPageUserLogin = "{{ model.HASH_PAGE_USER_LOGIN }}";
var hashPageUserLogout = "{{ model.HASH_PAGE_USER_LOGOUT }}";
{# var hashSaveDogAssessment = "{{ model.HASH_SAVE_DOG_ASSESSMENT }}"; #}
var hashSaveDogAssessmentDistractionAndResponse = "{{ model.HASH_SAVE_DOG_ASSESSMENT_DISTRACTION_AND_RESPONSE }}";
var hashSaveDogButtonIcon = "{{ model.HASH_SAVE_DOG_BUTTON_ICON }}";
var hashSaveDogButtonShape = "{{ model.HASH_SAVE_DOG_BUTTON_SHAPE }}";
var hashSaveDogColour = "{{ model.HASH_SAVE_DOG_COLOUR }}";
var hashSaveDogCommand = "{{ model.HASH_SAVE_DOG_COMMAND }}";
var hashSaveDogCommandButtonLink = "{{ model.HASH_SAVE_DOG_COMMAND_BUTTON_LINK }}";
var hashSaveDogCommandCategory = "{{ model.HASH_SAVE_DOG_COMMAND_CATEGORY }}";
var hashSaveDogDogCommandLink = "{{ model.HASH_SAVE_DOG_DOG_COMMAND_LINK }}";
var hashSaveDogLocation = "{{ model.HASH_SAVE_DOG_LOCATION }}";
var idButtonApplyFilters = "#{{ model.ID_BUTTON_APPLY_FILTERS }}";
var idButtonHamburger = "#{{ model.ID_BUTTON_HAMBURGER }}";
var idButtonCancel = "#{{ model.ID_BUTTON_CANCEL }}";
var idButtonSave = "#{{ model.ID_BUTTON_SAVE }}";
var idContainerTemplateElements = "#{{ model.ID_CONTAINER_TEMPLATE_ELEMENTS }}";
var idCSRFToken = "#{{ model.ID_CSRF_TOKEN }}";
var idFormFilters = "#{{ model.ID_FORM_FILTERS }}";
var idLabelError = "#{{ model.ID_LABEL_ERROR }}";
var idOverlayConfirm = "#{{ model.ID_OVERLAY_CONFIRM }}";
var idOverlayError = "#{{ model.ID_OVERLAY_ERROR }}";
var idOverlayHamburger = "#{{ model.ID_OVERLAY_HAMBURGER }}";
var idPageBody = "#{{ model.ID_PAGE_BODY }}";
var idTableMain = "#{{ model.ID_TABLE_MAIN }}";
var idTextareaConfirm = "#{{ model.ID_TEXTAREA_CONFIRM }}";
var isUserLoggedIn = "{{ model.output_bool(model.IS_USER_LOGGED_IN) }}";
var _pathHost = "{{ model.get_url_host() }}";
var _rowBlank = null;
var titlePageCurrent = "{{ model.title }}";
var _verbose = ("{{ model.app.app_config.DEBUG }}" == "True");
</script>
<link rel="preload" as="style" href="{{ url_for('static', filename='dist/css/main.bundle.css') }}" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="{{ url_for('static', filename='dist/css/main.bundle.css') }}"></noscript>
@@ -474,7 +122,8 @@
</div>
</div>
</footer>
{% include 'layouts/_shared.html' %}
<script src="{{ url_for('static', filename='dist/js/main.bundle.js') }}"></script>
</body>
</html>

View File

@@ -13,7 +13,7 @@
"@type": "ProfessionalService",
"name": "Dog Training",
"url": "{{ model.get_url_host() }}",
"logo": "{{ model.get_url_host() }}{{ url_for('static', filename='images/Wisp_LQ.webp') }}",
"logo": "{{ model.get_url_host() }}{{ url_for('static', filename='images/fetch-metrics-logo-LQ.webp') }}",
"description": "Fetch Metrics - Professional dog training management software for UK trainers. Manage clients, track training sessions, monitor progress, and engage dog owners with our comprehensive SaaS platform. Starting from £15/month.",
"address": {
"@type": "PostalAddress",
@@ -37,230 +37,6 @@
<meta name="yandex-verification" content="f3c1a9bc28976419" /> <!-- fetchmetrics.co.uk -->
<meta id="{{ model.ID_CSRF_TOKEN }}" name="{{ model.FLAG_CSRF_TOKEN }}" content="{{ csrf_token() }}" />
<script>
var attrIdAssessment = "{{ model.ATTR_ID_ASSESSMENT }}";
var attrIdAssessmentCommandModalityLink = "{{ model.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK }}";
var attrIdAssessmentResponse = "{{ model.ATTR_ID_ASSESSMENT_RESPONSE }}";
var attrIdAccessLevel = "{{ model.ATTR_ID_ACCESS_LEVEL }}";
var attrIdBribe = "{{ model.ATTR_ID_BRIBE }}";
var attrIdButtonColour = "{{ model.ATTR_ID_BUTTON_COLOUR }}";
var attrIdButtonIcon = "{{ model.ATTR_ID_BUTTON_ICON }}";
var attrIdButtonShape = "{{ model.ATTR_ID_BUTTON_SHAPE }}";
var attrIdColour = "{{ model.ATTR_ID_COLOUR }}";
var attrIdCommand = "{{ model.ATTR_ID_COMMAND }}";
var attrIdCommandButtonLink = "{{ model.ATTR_ID_COMMAND_BUTTON_LINK }}";
var attrIdCommandCategory = "{{ model.ATTR_ID_COMMAND_CATEGORY }}";
var attrIdCommandModality = "{{ model.ATTR_ID_COMMAND_MODALITY }}";
var attrIdCurrency = "{{ model.ATTR_ID_CURRENCY }}";
var attrIdDistraction = "{{ model.ATTR_ID_DISTRACTION }}";
var attrIdDistractionIntensityLevel = "{{ model.ATTR_ID_DISTRACTION_INTENSITY_LEVEL }}";
var attrIdDistractionType = "{{ model.ATTR_ID_DISTRACTION_TYPE }}";
var attrIdDog = "{{ model.ATTR_ID_DOG }}";
var attrIdDogCommandLink = "{{ model.ATTR_ID_DOG_COMMAND_LINK }}";
var attrIdLightingLevel = "{{ model.ATTR_ID_LIGHTING_LEVEL }}";
var attrIdLocation = "{{ model.ATTR_ID_LOCATION }}";
var attrIdObedienceLevel = "{{ model.ATTR_ID_OBEDIENCE_LEVEL }}";
var attrIdResponseQualityMetric = "{{ model.ATTR_ID_RESPONSE_QUALITY_METRIC }}";
var attrIdWeather = "{{ model.ATTR_ID_WEATHER }}";
var attrTextCollapsed = "{{ model.ATTR_TEXT_COLLAPSED }}";
var attrTextExpanded = "{{ model.ATTR_TEXT_EXPANDED }}";
var attrValueCurrent = "{{ model.ATTR_VALUE_CURRENT }}";
var attrValuePrevious = "{{ model.ATTR_VALUE_PREVIOUS }}";
var attrValueNew = "{{ model.ATTR_VALUE_NEW }}";
var colourAccent = "{{ model.COLOUR_ACCENT }}";
var colourError = "{{ model.COLOUR_ERROR }}";
var colourPageBackground = "{{ model.COLOUR_PAGE_BACKGROUND }}";
var colourPageBackground1 = "{{ model.COLOUR_PAGE_BACKGROUND_1 }}";
var colourPageBackground2 = "{{ model.COLOUR_PAGE_BACKGROUND_2 }}";
var colourPrimary = "{{ model.COLOUR_PRIMARY }}";
var colourSecondary = "{{ model.COLOUR_SECONDARY }}";
var colourText = "{{ model.COLOUR_TEXT }}";
var colourTextBackground = "{{ model.COLOUR_TEXT_BACKGROUND }}";
var colourTextLinkUnvisited = "{{ model.COLOUR_TEXT_LINK_UNVISITED }}";
var colourTextLinkVisited = "{{ model.COLOUR_TEXT_LINK_VISITED }}";
var environment = {
"name": "{{ model.app.app_config.FLASK_ENV }}",
"is_production": "{{ model.app.app_config.is_production | lower }}",
"is_development": "{{ model.app.app_config.is_development | lower }}",
};
var flagAccessLevel = "{{ model.FLAG_ACCESS_LEVEL }}";
var flagAccessLevelRequired = "{{ model.FLAG_ACCESS_LEVEL_REQUIRED }}";
var flagActive = "{{ model.FLAG_ACTIVE }}";
var flagActiveOnly = "{{ model.FLAG_ACTIVE_ONLY }}";
var flagAdd = "{{ model.FLAG_ADD }}";
var flagAddress = "{{ model.FLAG_ADDRESS }}";
var flagAddressLine1 = "{{ model.FLAG_ADDRESS_LINE_1 }}";
var flagAddressLine2 = "{{ model.FLAG_ADDRESS_LINE_2 }}";
var flagAssessment = "{{ model.FLAG_ASSESSMENT }}";
var flagAssessmentCommandModalityLink = "{{ model.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK }}";
var flagAssessmentResponse = "{{ model.FLAG_ASSESSMENT_RESPONSE }}";
var flagBribe = "{{ model.FLAG_BRIBE }}";
var flagButton = "{{ model.FLAG_BUTTON }}";
var flagButtonIcon = "{{ model.FLAG_BUTTON_ICON }}";
var flagButtonShape = "{{ model.FLAG_BUTTON_SHAPE }}";
var flagButtonPrimary = "{{ model.FLAG_BUTTON_PRIMARY }}";
var flagCallback = "{{ model.FLAG_CALLBACK }}";
var flagCancel = "{{ model.FLAG_CANCEL }}";
var flagCaptcha = "{{ model.FLAG_CAPTCHA }}";
var flagCard = "{{ model.FLAG_CARD }}";
var flagCheckbox = "{{ model.FLAG_CHECKBOX }}";
var flagCity = "{{ model.FLAG_CITY }}";
var flagCloseTemporaryElement = "{{ model.FLAG_CLOSE_TEMPORARY_ELEMENT }}";
var flagCode = "{{ model.FLAG_CODE }}";
var flagCollapsible = "{{ model.FLAG_COLLAPSIBLE }}";
var flagColour = "{{ model.FLAG_COLOUR }}";
var flagColumn = "{{ model.FLAG_COLUMN }}";
var flagCommand = "{{ model.FLAG_COMMAND }}";
var flagCommandButtonLink = "{{ model.FLAG_COMMAND_BUTTON_LINK }}";
var flagCommandCategory = "{{ model.FLAG_COMMAND_CATEGORY }}";
var flagComment = "{{ model.FLAG_COMMENT }}";
var flagContainer = "{{ model.FLAG_CONTAINER }}";
var flagContainerInput = "{{ model.FLAG_CONTAINER_INPUT }}";
var flagCounty = "{{ model.FLAG_COUNTY }}";
var flagCsrfToken = "{{ model.FLAG_CSRF_TOKEN }}";
var flagCurrency = "{{ model.FLAG_CURRENCY }}";
var flagDdlPreview = "{{ model.FLAG_DDL_PREVIEW }}";
var flagDelete = "{{ model.FLAG_DELETE }}";
var flagDescription = "{{ model.FLAG_DESCRIPTION }}";
var flagDetail = "{{ model.FLAG_DETAIL }}";
var flagDialog = "{{ model.FLAG_DIALOG }}";
var flagDirty = "{{ model.FLAG_DIRTY }}";
var flagDisplayOrder = "{{ model.FLAG_DISPLAY_ORDER }}";
var flagDistraction = "{{ model.FLAG_DISTRACTION }}";
var flagDistractionIntensityLevel = "{{ model.FLAG_DISTRACTION_INTENSITY_LEVEL }}";
var flagDistractionType = "{{ model.FLAG_DISTRACTION_TYPE }}";
var flagDog = "{{ model.FLAG_DOG }}";
var flagDogDogCommandLink = "{{ model.FLAG_DOG_DOG_COMMAND_LINK }}";
var flagDragging = "dragging";
var flagDragOver = "drag-over";
var flagEdit = "{{ model.FLAG_EDIT }}";
var flagEmail = "{{ model.FLAG_EMAIL }}";
var flagError = "{{ model.FLAG_ERROR }}";
var flagExpanded = "{{ model.FLAG_EXPANDED }}";
var flagFailure = "{{ model.FLAG_FAILURE }}";
var flagFax = "{{ model.FLAG_FAX }}";
var flagFilter = "{{ model.FLAG_FILTER }}";
var flagForm = "{{ model.FLAG_FORM }}";
var flagFormFilters = "{{ model.FLAG_FORM_FILTERS }}";
var flagIcon = "{{ model.FLAG_ICON }}";
var flagImageLogo = "{{ model.FLAG_IMAGE_LOGO }}";
var flagInitialised = "{{ model.FLAG_INITIALISED }}";
var flagIsChecked = "{{ model.FLAG_IS_CHECKED }}";
var flagIsCollapsed = "{{ model.FLAG_IS_COLLAPSED }}";
var flagLeftHandStub = "{{ model.FLAG_LEFT_HAND_STUB }}";
var flagLightingLevel = "{{ model.FLAG_LIGHTING_LEVEL }}";
var flagLocation = "{{ model.FLAG_LOCATION }}";
var flagLocationParent = "{{ model.FLAG_LOCATION_PARENT }}";
var flagLogo = "{{ model.FLAG_LOGO }}";
var flagMessage = "{{ model.FLAG_MESSAGE }}";
var flagModal = "{{ model.FLAG_MODAL }}";
var flagMove = "move";
var flagName = "{{ model.FLAG_NAME }}";
var flagNameAttrOptionText = "{{ model.FLAG_NAME_ATTR_OPTION_TEXT}}";
var flagNameAttrOptionValue = "{{ model.FLAG_NAME_ATTR_OPTION_VALUE }}";
var flagNamePlural = "{{ model.FLAG_NAME_PLURAL }}";
var flagNavAdminHome = "{{ model.FLAG_NAV_ADMIN_HOME }}";
var flagNavContact = "{{ model.FLAG_NAV_CONTACT }}";
var flagNavHome = "{{ model.FLAG_NAV_HOME }}";
var flagNavDogAssessments = "{{ model.FLAG_NAV_DOG_ASSESSMENTS }}";
var flagNavDogButtonIcons = "{{ model.FLAG_NAV_DOG_BUTTON_ICONS }}";
var flagNavDogButtonShapes = "{{ model.FLAG_NAV_DOG_BUTTON_SHAPES }}";
var flagNavDogColour = "{{ model.FLAG_NAV_DOG_COLOUR }}";
var flagNavDogCommandButtonLinks = "{{ model.FLAG_NAV_DOG_COMMAND_BUTTON_LINKS }}";
var flagNavDogCommandCategories = "{{ model.FLAG_NAV_DOG_COMMAND_CATEGORIES }}";
var flagNavDogCommands = "{{ model.FLAG_NAV_DOG_COMMANDS }}";
var flagNavDogDogs = "{{ model.FLAG_NAV_DOG_DOGS }}";
var flagNavDogDogCommandLinks = "{{ model.FLAG_NAV_DOG_DOG_COMMAND_LINKS }}";
var flagNavDogHome = "{{ model.FLAG_NAV_DOG_HOME }}";
var flagNavDogLocations = "{{ model.FLAG_NAV_DOG_LOCATIONS }}";
var flagNavUserAccount = "{{ model.FLAG_NAV_USER_ACCOUNT }}";
var flagNavUserAdmin = "{{ model.FLAG_NAV_USER_ADMIN }}";
var flagNavUserLogin = "{{ model.FLAG_NAV_USER_LOGIN }}";
var flagNavUserLogout = "{{ model.FLAG_NAV_USER_LOGOUT }}";
var flagNotes = "{{ model.FLAG_NOTES }}";
var flagObedienceLevel = "{{ model.FLAG_OBEDIENCE_LEVEL }}";
var flagOverlay = "{{ model.FLAG_OVERLAY }}";
var flagOverlayClose = "{{ model.FLAG_OVERLAY_CLOSE }}";
var flagPageBody = "{{ model.FLAG_PAGE_BODY }}";
var flagPhoneNumber = "{{ model.FLAG_PHONE_NUMBER }}";
var flagPostcode = "{{ model.FLAG_POSTCODE }}";
var flagQuantity = "{{ model.FLAG_QUANTITY }}";
var flagResponseQualityMetric = "{{ model.FLAG_RESPONSE_QUALITY_METRIC }}";
var flagRightHandSide = "{{ model.FLAG_RIGHT_HAND_SIDE }}";
var flagRow = "{{ model.FLAG_ROW }}";
var flagRowNew = "{{ model.FLAG_ROW_NEW }}";
var flagRows = "{{ model.FLAG_ROWS }}";
var flagSave = "{{ model.FLAG_SAVE }}";
var flagScrollable = "{{ model.FLAG_SCROLLABLE }}";
var flagSearch = "{{ model.FLAG_SEARCH }}";
var flagSlider = "{{ model.FLAG_SLIDER }}";
var flagStatus = "{{ model.FLAG_STATUS }}";
var flagSubmit = "{{ model.FLAG_SUBMIT }}";
var flagSubmitted = "{{ model.FLAG_SUBMITTED }}";
var flagSuccess = "{{ model.FLAG_SUCCESS }}";
var flagTableMain = "{{ model.FLAG_TABLE_MAIN }}";
var flagTemporaryElement = "{{ model.FLAG_TEMPORARY_ELEMENT }}";
var flagUser = "{{ model.FLAG_USER }}";
var flagWeather = "{{ model.FLAG_WEATHER }}";
var flagWebsite = "{{ model.FLAG_WEBSITE }}";
var hashGetALTCHAChallenge = "{{ model.HASH_ALTCHA_CREATE_CHALLENGE }}";
var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}";
var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}";
var hashPageAdminHome = "{{ model.HASH_PAGE_ADMIN_HOME }}";
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";
var hashPageDogAssessment = "{{ model.HASH_PAGE_DOG_ASSESSMENT }}";
var hashPageDogAssessments = "{{ model.HASH_PAGE_DOG_ASSESSMENTS }}";
var hashPageDogButtonIcons = "{{ model.HASH_PAGE_DOG_BUTTON_ICONS }}";
var hashPageDogButtonShapes = "{{ model.HASH_PAGE_DOG_BUTTON_SHAPES }}";
var hashPageDogColours = "{{ model.HASH_PAGE_DOG_COLOURS }}";
var hashPageDogCommandButtonLinks = "{{ model.HASH_PAGE_DOG_COMMAND_BUTTON_LINKS }}";
var hashPageDogCommandCategories = "{{ model.HASH_PAGE_DOG_COMMAND_CATEGORIES }}";
var hashPageDogCommands = "{{ model.HASH_PAGE_DOG_COMMANDS }}";
var hashPageDogDogCommandLinks = "{{ model.HASH_PAGE_DOG_DOG_COMMAND_LINKS }}";
var hashPageDogDogs = "{{ model.HASH_PAGE_DOG_DOGS }}";
var hashPageDogHome = "{{ model.HASH_PAGE_DOG_HOME }}";
var hashPageDogLocations = "{{ model.HASH_PAGE_DOG_LOCATIONS }}";
var hashPageErrorNoPermission = "{{ model.HASH_PAGE_ERROR_NO_PERMISSION }}";
var hashPageHome = "{{ model.HASH_PAGE_HOME }}";
var hashPageLicense = "{{ model.HASH_PAGE_LICENSE }}";
var hashPagePrivacyPolicy = "{{ model.HASH_PAGE_PRIVACY_POLICY }}";
var hashPageUserAccount = "{{ model.HASH_PAGE_USER_ACCOUNT }}";
var hashPageUserAdmin = "{{ model.HASH_PAGE_USER_ADMIN }}";
var hashPageUserLogin = "{{ model.HASH_PAGE_USER_LOGIN }}";
var hashPageUserLogout = "{{ model.HASH_PAGE_USER_LOGOUT }}";
{# var hashSaveDogAssessment = "{{ model.HASH_SAVE_DOG_ASSESSMENT }}"; #}
var hashSaveDogAssessmentDistractionAndResponse = "{{ model.HASH_SAVE_DOG_ASSESSMENT_DISTRACTION_AND_RESPONSE }}";
var hashSaveDogButtonIcon = "{{ model.HASH_SAVE_DOG_BUTTON_ICON }}";
var hashSaveDogButtonShape = "{{ model.HASH_SAVE_DOG_BUTTON_SHAPE }}";
var hashSaveDogColour = "{{ model.HASH_SAVE_DOG_COLOUR }}";
var hashSaveDogCommand = "{{ model.HASH_SAVE_DOG_COMMAND }}";
var hashSaveDogCommandButtonLink = "{{ model.HASH_SAVE_DOG_COMMAND_BUTTON_LINK }}";
var hashSaveDogCommandCategory = "{{ model.HASH_SAVE_DOG_COMMAND_CATEGORY }}";
var hashSaveDogDogCommandLink = "{{ model.HASH_SAVE_DOG_DOG_COMMAND_LINK }}";
var hashSaveDogLocation = "{{ model.HASH_SAVE_DOG_LOCATION }}";
var idButtonApplyFilters = "#{{ model.ID_BUTTON_APPLY_FILTERS }}";
var idButtonHamburger = "#{{ model.ID_BUTTON_HAMBURGER }}";
var idButtonCancel = "#{{ model.ID_BUTTON_CANCEL }}";
var idButtonSave = "#{{ model.ID_BUTTON_SAVE }}";
var idContainerTemplateElements = "#{{ model.ID_CONTAINER_TEMPLATE_ELEMENTS }}";
var idCSRFToken = "#{{ model.ID_CSRF_TOKEN }}";
var idFormFilters = "#{{ model.ID_FORM_FILTERS }}";
var idLabelError = "#{{ model.ID_LABEL_ERROR }}";
var idOverlayConfirm = "#{{ model.ID_OVERLAY_CONFIRM }}";
var idOverlayError = "#{{ model.ID_OVERLAY_ERROR }}";
var idOverlayHamburger = "#{{ model.ID_OVERLAY_HAMBURGER }}";
var idPageBody = "#{{ model.ID_PAGE_BODY }}";
var idTableMain = "#{{ model.ID_TABLE_MAIN }}";
var idTextareaConfirm = "#{{ model.ID_TEXTAREA_CONFIRM }}";
var isUserLoggedIn = "{{ model.output_bool(model.IS_USER_LOGGED_IN) }}";
var _pathHost = "{{ model.get_url_host() }}";
var _rowBlank = null;
var titlePageCurrent = "{{ model.title }}";
var _verbose = ("{{ model.app.app_config.DEBUG }}" == "True");
</script>
<link rel="preload" as="style" href="{{ url_for('static', filename='dist/css/main.bundle.css') }}" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="{{ url_for('static', filename='dist/css/main.bundle.css') }}"></noscript>
@@ -281,11 +57,11 @@
</header>
-->
<div class="topnav">
<div class="{{ model.FLAG_CONTAINER }} header-logo"> <!-- style="width: 18vw; min-width: 18vw; max-width: 20vw;" -->
<img class="header-logo" src="{{ url_for('static', filename='images/fetch-metrics-logo-LQ.webp') }}" alt="Fetch Metrics logo" aria-label="Fetch Metrics logo" tabindex="0"> <!-- 'images/Wisp_LQ.webp' -->
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_LOGO }}"> <!-- style="width: 18vw; min-width: 18vw; max-width: 20vw;" -->
<img class="{{ model.FLAG_LOGO }}" src="{{ url_for('static', filename='images/fetch-metrics-logo-and-company-name-radial-0.5-link-visited-LQ.webp') }}" alt="Fetch Metrics logo" aria-label="Fetch Metrics logo" tabindex="0"> <!-- 'images/Wisp_LQ.webp' -->
</div>
<div class="{{ model.FLAG_CONTAINER }} company-name"> <!-- style="width: 75vw; min-width: 65vw; max-width: 80vw;" -->
<h1 class="company-name">{{ model.NAME_COMPANY_SHORT }} - {{ model.title }}</h1>
<h1 class="company-name">{{ model.title }}</h1> {# {{ model.NAME_COMPANY_SHORT }} - #}
</div>
{#
<div class="{{ model.FLAG_CONTAINER }}"> <!-- style="width: 7vw; min-width: 7vw; max-width: 15vw; justify-content: flex-end; " padding-left: 25%; -->
@@ -331,14 +107,16 @@
<!-- Footer -->
<div class="footer">
<h4>Copyright &copy; {{ model.NAME_COMPANY }}. <a href="{{ url_for('routes_legal.license') }}" alt="License" aria-label="License">All rights reserved.</a></h4>
<h5>Company number 13587499</h5>
<h4>Copyright &copy; {{ model.NAME_COMPANY }}. <a href="{{ url_for('routes_legal.license') }}" alt="License" aria-label="License">All rights reserved.</a> Company number 13587499</h4>
{# <h5>Company number 13587499</h5> #}
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><p><a href="{{ url_for('routes_legal.accessibility_statement') }}" alt="Accessibility statement" aria-label="Accessibility statement">Accessibility statement</a></p></div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"><p><a href="{{ url_for('routes_legal.privacy_policy') }}" alt="Privacy notice" aria-label="Privacy notice">Privacy notice</a></p></div>
</div>
</div>
{% include 'layouts/_shared.html' %}
{% include 'layouts/_shared_dog.html' %}
<script src="{{ url_for('static', filename='dist/js/main.bundle.js') }}"></script>
</body>
</html>

View File

@@ -1,20 +0,0 @@
<!-- v2a -->
{% extends 'layouts/layout.html' %}
{% block page_body %}
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_home.bundle.css') }}">
<div class="home-hero">
<h2 class="home-hero-title">Dog Training!</h2>
{% if not model.user.get_is_logged_in() %}
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<a class="{{ model.FLAG_NAV_USER_LOGIN }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Login</a>
</div>
{% elif True or model.user.can_admin_dog %}
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<a class="{{ model.FLAG_NAV_DOG_HOME }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Dog Home</a>
</div>
{% endif %}
</div>
{% endblock %}

View File

@@ -2,6 +2,7 @@
{% block page_head %}
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_contact.bundle.css') }}">
{% include 'layouts/_shared_project_hub.html' %}
{% endblock %}
{% block page_nav_links %}

View File

@@ -2,6 +2,7 @@
{% block page_head %}
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_contact.bundle.css') }}">
{% include 'layouts/_shared_project_hub.html' %}
{% endblock %}
{% block page_nav_links %}

View File

@@ -8,33 +8,35 @@
{% endblock %}
{% block page_nav_links %}
<a href="#{{ model.FLAG_BENEFITS }}">Benefits</a>
<a href="#{{ model.FLAG_PROBLEM }}">Problem</a>
<a href="#{{ model.FLAG_SOLUTION }}">Solution</a>
<a href="#{{ model.FLAG_EARLY_ACCESS }}">Early Access</a>
<!-- <a href="#{{ model.FLAG_SOCIAL_PROOF }}">Social Proof</a>
<a href="#{{ model.FLAG_FEATURES }}">Features</a>
<a href="#{{ model.FLAG_FAQ }}">FAQs</a> -->
<a href="#{{ model.FLAG_PROBLEM }}">Problem</a>
<a href="#{{ model.FLAG_BENEFITS }}">Benefits</a>
<a href="#{{ model.FLAG_SOLUTION }}">Solution</a>
<a href="#{{ model.FLAG_SOCIAL_PROOF }}">Social Proof</a>
<a href="#{{ model.FLAG_TESTIMONIAL }}">Testimonial</a>
<a href="#{{ model.FLAG_EARLY_ACCESS }}">Early Access</a>
<!-- <a href="#{{ model.FLAG_FEATURES }}">Features</a>
<a href="#{{ model.FLAG_FAQ }}">FAQs</a> -->
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Contact Us</a>
{% endblock %}
{% block page_body %}
<section class="hero">
<div class="container">
<div class="{{ model.FLAG_CONTAINER }}">
<div class="hero-content" data-aos="fade-up">
<h1>Transform Your Dog Training Business with Smart Progress Tracking</h1>
<p>The first UK-built platform designed specifically for professional dog trainers. Track progress, measure success, and keep clients engaged like never before.</p>
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">NOW AVAILABLE</a>
<h1>Finally, Professional Software Built for Dog Trainers</h1>
<p>Stop losing track of client progress and spending hours on admin. Fetch Metrics helps you track every command, demonstrate real results, and keep clients engaged.</p>
<!-- <a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Get Early Access</a>
<p>Join forward-thinking trainers across the UK who are revolutionising how they manage their business.</p> -->
<!-- <a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Watch 2-Minute Demo</a> -->
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Join the Waitlist</a>
</div>
</div>
</section>
<!--
<section id="{{ model.FLAG_BENEFITS }}" class="{{ model.FLAG_BENEFITS }}">
<div class="container">
<h2 class="section-title text-center">Finally, Software That Understands Dog Training</h2> <!-- Finally, A System That Speaks Your Language -->
<h2 class="section-title text-center">Finally, Software That Understands Dog Training</h2> < !-- Finally, A System That Speaks Your Language -- >
<p class="section-subtitle text-center">Running a successful dog training business shouldn't mean drowning in paperwork or losing track of client progress. Fetch Metrics brings clarity to every session, ensuring both you and your clients stay perfectly synchronized.</p>
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_BENEFITS }}">
@@ -47,44 +49,119 @@
</div>
</div>
</section>
-->
<section id="{{ model.FLAG_PROBLEM }}" class="{{ model.FLAG_PROBLEM }}">
<div class="container">
<h2 class="section-title text-center">Sound Familiar?</h2>
<div class="{{ model.FLAG_CONTAINER }}">
<h2 class="section-title text-center">Tired of This Daily Struggle?</h2>
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_PROBLEM }}">
<p class="section-subtitle text-center">Pain Points:</p>
<ul>
<li>Spending hours on admin instead of training</li>
<li>Clients forgetting commands between sessions</li>
<li>No clear way to show progress over time</li>
<li>Different trainers or pets using different signals</li>
<li>Lost notes and forgotten homework</li>
<li><strong>😤 Endless paperwork</strong> - Spending more time on admin than actual training</li>
<li><strong>😤 Lost progress tracking</strong> - No clear way to show clients how their dog is improving</li>
<li><strong>😤 Inconsistent training</strong> - Different commands and signals across sessions</li>
<li><strong>😤 Client frustration</strong> - Owners forgetting what was covered last week</li>
<li><strong>😤 No professional reports</strong> - Struggling to justify your rates with hard data</li>
</ul>
<!--
<p>You became a dog trainer to work with animals and help families - not to be a data entry clerk. Yet successful trainers tell us they spend more time on administration than actual training.</p>
-->
<p>Fetch Metrics solves these challenges with purpose-built tools that streamline your workflow and enhance client results. Spend less time on paperwork and more time doing what you love.</p>
<p><strong>You became a dog trainer to work with animals, not spreadsheets.</strong></p>
</div>
</div>
</section>
<section id="{{ model.FLAG_BENEFITS }}" class="{{ model.FLAG_BENEFITS }}">
<div class="{{ model.FLAG_CONTAINER }}">
<h2 class="section-title text-center">What If You Could...</h2>
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_BENEFITS }}">
<div class="{{ model.FLAG_CONTAINER }}">
<h3>📊 Track Real Progress</h3>
<p>Document every breakthrough with detailed performance tracking. See exactly how each command improves over time with response rates, latency, and compliance scores.</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h3>🎯 Keep Everyone Consistent</h3>
<p>Standardised commands and signals across all trainers. No more confusion - everyone uses the same approach for faster results.</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h3>📈 Generate Professional Reports</h3>
<p>Show clients stunning progress charts and radar diagrams. Prove your value with data that demonstrates real improvement.</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h3>⏰ Save Hours Weekly</h3>
<p>Streamlined session notes, automated progress tracking, and instant report generation. Spend time training, not on paperwork.</p>
</div>
</div>
</div>
</section>
<section id="{{ model.FLAG_SOLUTION }}" class="{{ model.FLAG_SOLUTION }}">
<div class="container">
<h2 class="section-title text-center">Simple to Start, Powerful in Practice</h2>
<div class="{{ model.FLAG_CONTAINER }}">
<h2 class="section-title text-center">See It In Action</h2>
<p class="section-subtitle text-center">This isn't vaporware - we've built a working system that professional trainers are already using:</p>
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_SOLUTION }}">
<ul>
<li><strong>1. Set Up Your Business:</strong> Add your trainers, create client profiles, and customise your training programmes in minutes.</li>
<li><strong>2. Track Every Session:</strong> Record progress, document breakthroughs, and maintain consistency across all trainers and clients.</li>
<li><strong>3. Engage Your Clients:</strong> Give owners access to their dog's journey, including command reminders and homework assignments.</li>
<li><strong>4. Showcase Success:</strong> Generate professional reports that demonstrate progress and justify your expertise.</li>
</ul>
<div class="{{ model.FLAG_CONTAINER }}">
<h3>📝 Command Management</h3>
<p>Customise commands, categories, and signals for your training style</p>
<div class="project-thumbnail">
<img src="{{ url_for('static', filename='images/fetch-metrics-page-commands.webp') }}" alt="Command Management" aria-label="Command Management">
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h3>📊 Assessment Tracking</h3>
<p>Record distractions, environments, response times, and success rates</p>
<div class="project-thumbnail">
<img src="{{ url_for('static', filename='images/fetch-metrics-page-assessment.webp') }}" alt="Assessment Tracking" aria-label="Assessment Tracking">
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h3>🎯 Progress Visualisation</h3>
<p>Radar charts showing command mastery and improvement over time</p>
<div class="project-thumbnail">
<img src="{{ url_for('static', filename='images/fetch-metrics-report-radar-command-mastery.webp') }}" alt="Progress Visualisation" aria-label="Progress Visualisation">
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h3>📈 Performance Analytics</h3>
<p>Line charts tracking response latency and compliance duration</p>
<div class="project-thumbnail">
<img src="{{ url_for('static', filename='images/fetch-metrics-report-line-command-progress.webp') }}" alt="Performance Analytics" aria-label="Performance Analytics">
</div>
</div>
</div>
</div>
</section>
<section id="{{ model.FLAG_SOCIAL_PROOF }}" class="{{ model.FLAG_SOCIAL_PROOF }}">
<div class="{{ model.FLAG_CONTAINER }}">
<h2 class="section-title text-center">Built for UK Trainers, By UK Trainers</h2>
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_SOCIAL_PROOF }}">
<div class="{{ model.FLAG_CONTAINER }}">
<div class="section-title">500+</div>
<div class="section-subtitle">Dogs Tracked</div>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<div class="section-title">15+</div>
<div class="section-subtitle">Active Trainers</div>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<div class="section-title">6hrs</div>
<div class="section-subtitle">Saved Per Week</div>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<div class="section-title">40%</div>
<div class="section-subtitle">Progress Improvement</div>
</div>
</div>
</div>
</section>
<section id="{{ model.FLAG_TESTIMONIAL }}" class="{{ model.FLAG_TESTIMONIAL }}">
<div class="{{ model.FLAG_CONTAINER }}">
<p class="text-center">"I've been tracking commands in spreadsheets for years. This is exactly what I needed - finally, someone who understands what trainers actually do day-to-day."</p>
<h2 class="section-subtitle text-center">- Sarah M., Certified Dog Behaviourist, Manchester</h2>
</div>
</section>
<!--
<section id="{{ model.FLAG_EARLY_ACCESS }}" class="{{ model.FLAG_EARLY_ACCESS }}">
<div class="container">
<div class="{{ model.FLAG_CONTAINER }}">
<h2 class="section-title text-center">Be Among the First</h2>
<p class="section-subtitle text-center">We're putting the finishing touches on something special. Join our early access list to:</p>
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_EARLY_ACCESS }}">
@@ -99,41 +176,9 @@
</div>
</section>
<!--
<section id="{{ model.FLAG_FEATURES }}" class="{{ model.FLAG_FEATURES }}">
<div class="container">
<h2 class="section-title text-center">Everything You Need, Nothing You Don't</h2>
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_FEATURES }}">
< !--
<ul>
<li>✓ Detailed command performance tracking</li>
<li>✓ Multi-level skill progression monitoring</li>
<li>✓ Professional progress report generation</li>
<li>✓ Client and dog profile management</li>
<li>✓ Session planning and note-taking</li>
<li>✓ Mobile-friendly for field use</li>
<li>✓ Secure cloud-based storage</li>
<li>✓ GDPR compliant</li>
</ul>
-- >
<ul>
<li>✓ Comprehensive progress tracking for individual commands</li>
<li>✓ Unified command library for team consistency</li>
<li>✓ Client portal for owner engagement</li>
<li>✓ Session scheduling and reminders</li>
<li>✓ Professional progress reporting</li>
<li>✓ Mobile-friendly for field use</li>
<li>✓ Secure photo and video storage</li>
<li>✓ Multi-trainer support with permissions</li>
</ul>
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Reserve Your Spot Now</a>
<p>And this is just the beginning. We're constantly adding features based on feedback from trainers like you.</p>
</div>
</div>
</section>
<section id="{{ model.FLAG_BENEFITS }}" class="{{ model.FLAG_BENEFITS }}">
<div class="container">
<div class="{{ model.FLAG_CONTAINER }}">
<h2 class="section-title text-center">More Than Just Software - It's Your Training Partner</h2>
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_BENEFITS }}">
<p class="section-subtitle text-center">For Your Business:</p>
@@ -157,27 +202,10 @@
</div>
</div>
</section>
<section id="{{ model.FLAG_SOCIAL_PROOF }}" class="{{ model.FLAG_SOCIAL_PROOF }}">
<div class="container">
<h2 class="section-title text-center">Built for UK Trainers, By UK Trainers</h2>
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_SOCIAL_PROOF }}">
<p>We understand the unique challenges of running a dog training business in the UK. That's why we've created the first platform designed specifically for our market.</p>
<p class="section-subtitle text-center">Stats:</p>
<ul>
<li>✓ 30+ Professional Trainers in Beta</li>
<li>✓ 500+ Dogs Successfully Tracked</li>
<li>✓ 10 Hours Saved Per Week (Average)</li>
<li>✓ 40% Increase in Client Retention</li>
</ul>
</div>
</div>
</section>
-->
<!--
<section class="{{ model.FLAG_CTA_1 }}">
<div class="container">
<div class="{{ model.FLAG_CONTAINER }}">
<h2 class="section-title">Ready to Revolutionise Your Training Business?</h2>
<p class="section-subtitle text-center">Join the waitlist for early access to the UK's most comprehensive dog training management platform.</p>
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Get Early Access Today</a>
@@ -186,7 +214,7 @@
</section>
<section id="{{ model.FLAG_PRICING }}" class="{{ model.FLAG_PRICING }}">
<div class="container">
<div class="{{ model.FLAG_CONTAINER }}">
<h2 class="section-title">Pricing That Grows With You</h2>
<p class="section-subtitle text-center">Whether you're an independent trainer or managing a team, we have a plan that fits. All plans include our core features with no hidden fees.</p>
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Get Early Access Today</a>
@@ -195,7 +223,7 @@
</section>
<section id="{{ model.FLAG_FAQ }}" class="{{ model.FLAG_FAQ }}">
<div class="container">
<div class="{{ model.FLAG_CONTAINER }}">
<h2 class="section-title text-center">FAQs</h2>
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_FAQ }}">
<ul>
@@ -210,10 +238,40 @@
-->
<section class="{{ model.FLAG_CTA_2 }}">
<div class="container">
<h2 class="section-title">Built for UK Trainers, by UK Trainers</h2>
<p class="section-subtitle text-center">Fetch Metrics isn't another generic business tool trying to fit your needs. We're building this specifically for the unique requirements of professional dog training in the UK.</p>
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Questions?</a>
<div class="{{ model.FLAG_CONTAINER }}">
<h2 class="section-title">Get Started Today - Alpha Access Available</h2>
<p class="section-subtitle text-center">We're ready for serious trainers to start using Fetch Metrics right now. Since we're still adding features based on user feedback, we're offering incredible early access terms:</p>
<div class="{{ model.FLAG_CARD }}">
<div class="{{ model.FLAG_CONTAINER }}">
<h4>🆓 Free During Alpha</h4>
<p>Complete access to all features while we perfect the platform together</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h4>💰 50% Off for Life</h4>
<p>Lock in permanent founder pricing when we officially launch</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h4>🎨 Shape the Product</h4>
<p>Your feedback directly influences new features and improvements</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<h4>🚀 First Access</h4>
<p>Be first to try everything new as we add it</p>
</div>
</div>
<div class="urgency">
<p><strong>Limited to 20 trainers</strong> - We want to provide excellent support and meaningful collaboration with each Alpha user.</p>
</div>
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Apply for Alpha Access</a>
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Book a Demo Call</a>
<p>
Questions? Email us at {{ model.get_mail_contact_public() }}<br>
Response time: Under 24 hours
</p>
</div>
</section>

View File

@@ -211,8 +211,6 @@
{% include 'components/common/buttons/_icon_add.html' %}
</div>
<script src="{{ url_for('routes_dog.scripts_section_dog') }}"></script>
<script>
var assessments = {{ model.convert_list_objects_to_dict_json_by_attribute_key_default(model.assessments) | tojson | safe }};
var assessment = assessments[{{ assessment.id_assessment }}];

View File

@@ -99,8 +99,6 @@
{% include 'components/common/buttons/_icon_add.html' %}
</div>
<script src="{{ url_for('routes_dog.scripts_section_dog') }}"></script>
<script>
var assessments = {{ model.convert_list_objects_to_dict_json_by_attribute_key_default(model.assessments) | tojson | safe }};
var filterLightingLevels = {{ model.convert_list_objects_to_dict_json_by_attribute_key_default(model.filter_lighting_levels) | tojson | safe }};

View File

@@ -66,8 +66,6 @@
{% include 'components/common/buttons/_icon_add.html' %}
</div>
<script src="{{ url_for('routes_dog.scripts_section_dog') }}"></script>
<script>
var button_icons = {{ model.convert_list_objects_to_dict_json_by_attribute_key_default(model.button_icons) | tojson | safe }};
</script>

View File

@@ -0,0 +1,87 @@
{% extends 'layouts/layout_dog.html' %}
{% block page_body %}
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/dog_calendar_entries.bundle.css') }}">
<form id="{{ model.ID_FORM_FILTERS }}" class="{{ model.FLAG_FILTER }} {{ model.FLAG_ROW }} {{ model.FLAG_CARD }}">
{{ model.form_filters.hidden_tag() }}
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<div class="{{ model.FLAG_CONTAINER_INPUT }} {{ model.FLAG_COLUMN }} {{ model.FLAG_FILTER }} {{ model.FLAG_SEARCH }}">
{{ model.form_filters.search.label }}
{{ model.form_filters.search() }}
{% for error in model.form_filters.search.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
{#
<div class="{{ model.FLAG_CONTAINER_INPUT }} {{ model.FLAG_COLUMN }} {{ model.FLAG_FILTER }} {{ model.ATTR_ID_CALENDAR_ENTRY_TYPE }}" {{ model.ATTR_VALUE_PREVIOUS }}="{{ model.form_filters.id_calendar_entry_type.data }}">
{{ model.form_filters.id_calendar_entry_type.label }}
{{ model.form_filters.id_calendar_entry_type() }}
{% for error in model.form_filters.id_calendar_entry_type.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
{% set class_name = model.FLAG_FILTER + ' ' + model.ATTR_ID_CALENDAR_ENTRY_TYPE + ' ' + model.FLAG_CHECKBOX %}
{% include 'components/common/buttons/_icon_checkbox.html' %}
</div>
#}
<div class="{{ model.FLAG_CONTAINER_INPUT }} {{ model.FLAG_COLUMN }} {{ model.FLAG_FILTER }} {{ model.FLAG_ACTIVE_ONLY }}" {{ model.ATTR_VALUE_PREVIOUS }}="{{ model.form_filters.active_only.data }}">
{{ model.form_filters.active_only.label }}
{{ model.form_filters.active_only() }}
{% for error in model.form_filters.active_only.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
{% set class_name = model.FLAG_FILTER + ' ' + model.FLAG_ACTIVE_ONLY + ' ' + model.FLAG_CHECKBOX %}
{% include 'components/common/buttons/_icon_checkbox.html' %}
</div>
</div>
</div>
{% set block_id = 'buttons_table_default' %}
{% include 'components/common/buttons/_buttons_save_cancel.html' %}
</form>
<table id="{{ model.ID_TABLE_MAIN }}" class="{{ model.FLAG_TABLE_MAIN }} {{ model.FLAG_ROW }} {{ model.FLAG_CARD }} {{ model.FLAG_CALENDAR_ENTRY }}">
<thead>
<tr class="{{ model.FLAG_CALENDAR_ENTRY }}">
<th class="{{ model.FLAG_DATE_FROM }} {{ model.FLAG_DATE_TO }} {{ model.FLAG_DATE_PREVIEW }}">Date</th>
<th class="{{ model.FLAG_NAME }}">Name</th>
<th class="{{ model.FLAG_IS_CALENDAR_ENTRY_TYPE_BILL }}">Bill?</th>
<th class="{{ model.FLAG_PRICE }}">Value</th>
{#
<th class="{{ model.FLAG_ACTIVE }}">
{% set class_name = model.FLAG_ACTIVE %}
{% set attribute_text = '' %}
{% include 'components/common/buttons/_icon_add.html' %}
</th>
#}
</tr>
</thead>
<tbody>
{% set is_blank_row = False %}
{% for calendar_entry in model.calendar_entries %}
{% include 'components/dog/_row_calendar_entry.html' %}
{% endfor %}
{% set is_blank_row = True %}
{% include 'components/dog/_row_calendar_entry.html' %}
</tbody>
</table>
{% include 'components/common/temporary/_overlay_confirm.html' %}
{% include 'components/common/temporary/_overlay_error.html' %}
<div id="{{ model.ID_CONTAINER_TEMPLATE_ELEMENTS }}">
<!-- Active column -->
<!-- Delete -->
{% set class_name = '' %}
{% include 'components/common/buttons/_icon_trash.html' %}
<!-- Undelete -->
{% set class_name = model.FLAG_ACTIVE %}
{% set attribute_text = '' %}
{% include 'components/common/buttons/_icon_add.html' %}
</div>
<script>
var calendar_entrys = {{ model.convert_list_objects_to_dict_json_by_attribute_key_default(model.calendar_entrys) | tojson | safe }};
</script>
{% endblock %}

View File

@@ -112,8 +112,6 @@
{% include 'components/common/buttons/_icon_add.html' %}
</div>
<script src="{{ url_for('routes_dog.scripts_section_dog') }}"></script>
<script>
{#
var commandButtonLinks = {{ model.convert_list_objects_to_dict_json_by_attribute_key_default(model.command_button_links) | tojson | safe }};

View File

@@ -68,8 +68,6 @@
{% include 'components/common/buttons/_icon_add.html' %}
</div>
<script src="{{ url_for('routes_dog.scripts_section_dog') }}"></script>
<script>
</script>
{% endblock %}

View File

@@ -76,8 +76,6 @@
{% include 'components/common/buttons/_icon_add.html' %}
</div>
<script src="{{ url_for('routes_dog.scripts_section_dog') }}"></script>
<script>
{#
var dogCommandLinks = {{ model.convert_list_objects_to_dict_json_by_attribute_key_default(model.dog_command_links) | tojson | safe }};

View File

@@ -90,8 +90,6 @@
{% include 'components/common/buttons/_icon_add.html' %}
</div>
<script src="{{ url_for('routes_dog.scripts_section_dog') }}"></script>
<script>
{#
var dogCommandLinks = {{ model.convert_list_objects_to_dict_json_by_attribute_key_default(model.dog_command_links) | tojson | safe }};

View File

@@ -7,47 +7,56 @@
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_ROW }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<h2>Dog</h2>
{#
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_DOGS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Dogs</button>
</div>
#}
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_COMMAND_CATEGORIES }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Command Categories</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_COMMANDS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Commands</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_DOG_COMMAND_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Dog Command Links</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_LOCATIONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Locations</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_BUTTON_ICONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Button Icons</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_COMMAND_BUTTON_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Command Button Links</button>
</div>
<h2 class="home-hero-title">Dog Training!</h2>
{% if not model.user.get_is_logged_in() %}
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<a class="{{ model.FLAG_NAV_USER_LOGIN }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Login</a>
</div>
{% elif True or model.user.can_admin_dog %}
{#
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_DOGS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Dogs</button>
</div>
#}
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_COMMAND_CATEGORIES }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Command Categories</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_COMMANDS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Commands</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_DOG_COMMAND_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Dog Command Links</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_LOCATIONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Locations</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_BUTTON_ICONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Button Icons</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_COMMAND_BUTTON_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Command Button Links</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENTS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessments</button>
</div>
{#
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_DISTRACTIONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Distractions</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENT_COMMAND_MODALITY_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessment Command Modality Links</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENT_RESPONSES }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessment Responses</button>
</div>
#}
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENTS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessments</button>
</div>
{#
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_DISTRACTIONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Distractions</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENT_COMMAND_MODALITY_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessment Command Modality Links</button>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENT_RESPONSES }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessment Responses</button>
</div>
#}
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<button class="{{ model.FLAG_NAV_DOG_CALENDAR_ENTRIES }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Overdue Bills</button>
</div>
{% endif %}
</div>
</div>
{% endblock %}

View File

@@ -66,8 +66,6 @@
{% include 'components/common/buttons/_icon_add.html' %}
</div>
<script src="{{ url_for('routes_dog.scripts_section_dog') }}"></script>
<script>
var locations = {{ model.convert_list_objects_to_dict_json_by_attribute_key_default(model.locations) | tojson | safe }};
</script>

View File

@@ -25,10 +25,12 @@ Features:
- Add Is_Default field to all Lookup tables
- Response Quality Metric - add field bigger value measured is better?
- Permissions
- Assessment completed/started on date for when used as homework
Fix:
- formFilters - centre columns on flex
- Location save and UI logic for tree structure
- Dogs missing from Assessments table?
- Add filter by unit measurement on Response Quality Metric
- Add filter by unit measurement on Response Quality Metric
- DB field id_user_created_by must not be null

View File

@@ -105,6 +105,10 @@ module.exports = {
path.resolve(__dirname, 'static/css/sections/dog.css'),
path.resolve(__dirname, 'static/css/pages/dog/assessment.css')
],
dog_calendar_entries: [
path.resolve(__dirname, 'static/css/sections/dog.css'),
path.resolve(__dirname, 'static/css/pages/dog/calendar_entries.css')
],
},
output: {
filename: 'js/[name].bundle.js',