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')
"""

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>
@@ -475,6 +123,7 @@
</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,30 +8,32 @@
{% endblock %}
{% block page_nav_links %}
<a href="#{{ model.FLAG_BENEFITS }}">Benefits</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_SOCIAL_PROOF }}">Social Proof</a>
<a href="#{{ model.FLAG_FEATURES }}">Features</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 -- >
@@ -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_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>
</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>
<section id="{{ model.FLAG_PROBLEM }}" class="{{ model.FLAG_PROBLEM }}">
<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 }}">
<ul>
<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><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,7 +7,12 @@
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_ROW }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<h2>Dog</h2>
<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>
@@ -48,6 +53,10 @@
<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,6 +25,7 @@ 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:
@@ -32,3 +33,4 @@ Fix:
- Location save and UI logic for tree structure
- Dogs missing from Assessments table?
- 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',