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:
2
app.py
2
app.py
@@ -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)
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
255
business_objects/dog/calendar_entry.py
Normal file
255
business_objects/dog/calendar_entry.py
Normal 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
|
||||
}
|
||||
"""
|
||||
98
business_objects/dog/calendar_entry_type.py
Normal file
98
business_objects/dog/calendar_entry_type.py
Normal 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
|
||||
"""
|
||||
@@ -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]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
99
controllers/dog/calendar_entry.py
Normal file
99
controllers/dog/calendar_entry.py
Normal 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}'
|
||||
})
|
||||
"""
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -40,9 +40,11 @@ from altcha import ChallengeOptions, create_challenge, verify_solution
|
||||
routes_dog = Blueprint('routes_dog', __name__)
|
||||
|
||||
|
||||
"""
|
||||
@routes_dog.route(Model_View_Dog_Base.HASH_GET_DOG_SCRIPTS_SHARED, methods=['GET'])
|
||||
def scripts_section_dog():
|
||||
hash_page_current = request.args.get('hash_page_current', default = Model_View_Dog_Base.HASH_GET_DOG_SCRIPTS_SHARED, type = str)
|
||||
model = Model_View_Dog_Base(hash_page_current=hash_page_current)
|
||||
template = render_template('js/sections/dog.js', model = model)
|
||||
return Response(template, mimetype='application/javascript')
|
||||
return Response(template, mimetype='application/javascript')
|
||||
"""
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
61
forms/dog/calendar_entry.py
Normal file
61
forms/dog/calendar_entry.py
Normal 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
|
||||
}
|
||||
@@ -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):
|
||||
|
||||
96
models/model_view_dog_calendar_entry.py
Normal file
96
models/model_view_dog_calendar_entry.py
Normal 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
|
||||
]
|
||||
264
static/MySQL/90050_create_and_view_radar_diagram.sql
Normal file
264
static/MySQL/90050_create_and_view_radar_diagram.sql
Normal 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
|
||||
;
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
40
static/css/pages/dog/calendar_entries.css
Normal file
40
static/css/pages/dog/calendar_entries.css
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
83
static/dist/css/core_home.bundle.css
vendored
83
static/dist/css/core_home.bundle.css
vendored
@@ -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 {
|
||||
|
||||
2
static/dist/css/core_home.bundle.css.map
vendored
2
static/dist/css/core_home.bundle.css.map
vendored
File diff suppressed because one or more lines are too long
2
static/dist/css/dog_assessment.bundle.css
vendored
2
static/dist/css/dog_assessment.bundle.css
vendored
@@ -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
2
static/dist/css/dog_assessments.bundle.css
vendored
2
static/dist/css/dog_assessments.bundle.css
vendored
@@ -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;
|
||||
|
||||
@@ -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":""}
|
||||
2
static/dist/css/dog_button_icons.bundle.css
vendored
2
static/dist/css/dog_button_icons.bundle.css
vendored
@@ -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;
|
||||
|
||||
@@ -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":""}
|
||||
118
static/dist/css/dog_calendar_entries.bundle.css
vendored
Normal file
118
static/dist/css/dog_calendar_entries.bundle.css
vendored
Normal 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*/
|
||||
1
static/dist/css/dog_calendar_entries.bundle.css.map
vendored
Normal file
1
static/dist/css/dog_calendar_entries.bundle.css.map
vendored
Normal 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":""}
|
||||
@@ -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;
|
||||
|
||||
@@ -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":""}
|
||||
@@ -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;
|
||||
|
||||
@@ -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":""}
|
||||
2
static/dist/css/dog_commands.bundle.css
vendored
2
static/dist/css/dog_commands.bundle.css
vendored
@@ -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;
|
||||
|
||||
2
static/dist/css/dog_commands.bundle.css.map
vendored
2
static/dist/css/dog_commands.bundle.css.map
vendored
@@ -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":""}
|
||||
@@ -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;
|
||||
|
||||
@@ -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":""}
|
||||
2
static/dist/css/dog_dogs.bundle.css
vendored
2
static/dist/css/dog_dogs.bundle.css
vendored
@@ -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;
|
||||
|
||||
2
static/dist/css/dog_dogs.bundle.css.map
vendored
2
static/dist/css/dog_dogs.bundle.css.map
vendored
@@ -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":""}
|
||||
2
static/dist/css/dog_home.bundle.css
vendored
2
static/dist/css/dog_home.bundle.css
vendored
@@ -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;
|
||||
|
||||
2
static/dist/css/dog_home.bundle.css.map
vendored
2
static/dist/css/dog_home.bundle.css.map
vendored
@@ -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":""}
|
||||
2
static/dist/css/dog_locations.bundle.css
vendored
2
static/dist/css/dog_locations.bundle.css
vendored
@@ -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;
|
||||
|
||||
2
static/dist/css/dog_locations.bundle.css.map
vendored
2
static/dist/css/dog_locations.bundle.css.map
vendored
@@ -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":""}
|
||||
19
static/dist/css/main.bundle.css
vendored
19
static/dist/css/main.bundle.css
vendored
@@ -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;
|
||||
}
|
||||
|
||||
2
static/dist/css/main.bundle.css.map
vendored
2
static/dist/css/main.bundle.css.map
vendored
File diff suppressed because one or more lines are too long
17
static/dist/js/dog_calendar_entries.bundle.js
vendored
Normal file
17
static/dist/js/dog_calendar_entries.bundle.js
vendored
Normal 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
|
||||
1
static/dist/js/dog_calendar_entries.bundle.js.map
vendored
Normal file
1
static/dist/js/dog_calendar_entries.bundle.js.map
vendored
Normal 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":""}
|
||||
187
static/dist/js/main.bundle.js
vendored
187
static/dist/js/main.bundle.js
vendored
@@ -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;
|
||||
|
||||
2
static/dist/js/main.bundle.js.map
vendored
2
static/dist/js/main.bundle.js.map
vendored
File diff suppressed because one or more lines are too long
423
static/docs/dog_training_progress_chart.html
Normal file
423
static/docs/dog_training_progress_chart.html
Normal 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>
|
||||
BIN
static/images/fetch-metrics-page-assessment.webp
Normal file
BIN
static/images/fetch-metrics-page-assessment.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 57 KiB |
BIN
static/images/fetch-metrics-page-assessment.xcf
Normal file
BIN
static/images/fetch-metrics-page-assessment.xcf
Normal file
Binary file not shown.
BIN
static/images/fetch-metrics-page-calendar-entries.jpg
Normal file
BIN
static/images/fetch-metrics-page-calendar-entries.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 928 KiB |
BIN
static/images/fetch-metrics-page-calendar-entries.webp
Normal file
BIN
static/images/fetch-metrics-page-calendar-entries.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
BIN
static/images/fetch-metrics-page-calendar-entries.xcf
Normal file
BIN
static/images/fetch-metrics-page-calendar-entries.xcf
Normal file
Binary file not shown.
BIN
static/images/fetch-metrics-page-commands.webp
Normal file
BIN
static/images/fetch-metrics-page-commands.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
BIN
static/images/fetch-metrics-page-commands.xcf
Normal file
BIN
static/images/fetch-metrics-page-commands.xcf
Normal file
Binary file not shown.
BIN
static/images/fetch-metrics-report-line-command-progress.webp
Normal file
BIN
static/images/fetch-metrics-report-line-command-progress.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 36 KiB |
BIN
static/images/fetch-metrics-report-line-command-progress.xcf
Normal file
BIN
static/images/fetch-metrics-report-line-command-progress.xcf
Normal file
Binary file not shown.
BIN
static/images/fetch-metrics-report-radar-command-mastery.webp
Normal file
BIN
static/images/fetch-metrics-report-radar-command-mastery.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
BIN
static/images/fetch-metrics-report-radar-command-mastery.xcf
Normal file
BIN
static/images/fetch-metrics-report-radar-command-mastery.xcf
Normal file
Binary file not shown.
@@ -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() {
|
||||
|
||||
100
static/js/pages/dog/calendar_entries.js
Normal file
100
static/js/pages/dog/calendar_entries.js
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
72
templates/components/dog/_row_calendar_entry.html
Normal file
72
templates/components/dog/_row_calendar_entry.html
Normal 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 %}
|
||||
|
||||
@@ -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 %}
|
||||
164
templates/layouts/_shared.html
Normal file
164
templates/layouts/_shared.html
Normal 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>
|
||||
64
templates/layouts/_shared_dog.html
Normal file
64
templates/layouts/_shared_dog.html
Normal 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>
|
||||
9
templates/layouts/_shared_project_hub.html
Normal file
9
templates/layouts/_shared_project_hub.html
Normal 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>
|
||||
@@ -13,7 +13,7 @@
|
||||
"@type": "ProfessionalService",
|
||||
"name": "{{ model.NAME_COMPANY_SHORT }}",
|
||||
"url": "{{ model.get_url_host() }}",
|
||||
"logo": "{{ model.get_url_host() }}{{ url_for('static', filename='images/Logo.png') }}",
|
||||
"logo": "{{ model.get_url_host() }}{{ url_for('static', filename='images/fetch-metrics-logo-LQ.webp') }}",
|
||||
"description": "Explore our wide range of software engineering services. We specialize in various tech stacks including MySQL, Python, Microsoft SQL Server, C#, Firebase, Node.js, Java, HTML5, React, CSS3, Flask, JavaScript, MVC, and REST.",
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
@@ -35,358 +35,6 @@
|
||||
<meta name="yandex-verification" content="4693a824cfda082a" />
|
||||
<meta id="{{ model.ID_CSRF_TOKEN }}" name="{{ model.FLAG_CSRF_TOKEN }}" content="{{ csrf_token() }}" />
|
||||
|
||||
<script>
|
||||
{#
|
||||
var attrIdAccessLevel = "{{ model.ATTR_ID_ACCESS_LEVEL }}";
|
||||
var attrIdCurrency = "{{ model.ATTR_ID_CURRENCY }}";
|
||||
var attrIdAddress = "{{ model.ATTR_ID_ADDRESS }}";
|
||||
var attrIdPlant = "{{ model.ATTR_ID_PLANT }}";
|
||||
var attrIdRegion = "{{ model.ATTR_ID_REGION }}";
|
||||
var attrIdStorageLocation = "{{ model.ATTR_ID_STORAGE_LOCATION }}";
|
||||
var attrTextCollapsed = "{{ model.ATTR_TEXT_COLLAPSED }}";
|
||||
var attrTextExpanded = "{{ model.ATTR_TEXT_EXPANDED }}";
|
||||
var attrValueCurrent = "{{ model.ATTR_VALUE_CURRENT }}";
|
||||
var attrValuePrevious = "{{ model.ATTR_VALUE_PREVIOUS }}";
|
||||
var attrValueNew = "{{ model.ATTR_VALUE_NEW }}";
|
||||
var environment = {
|
||||
"name": "{{ model.app.app_config.FLASK_ENV }}",
|
||||
"is_production": "{{ model.app.app_config.is_production }}",
|
||||
"is_development": "{{ model.app.app_config.is_development }}",
|
||||
};
|
||||
var flagAccessLevel = "{{ model.FLAG_ACCESS_LEVEL }}";
|
||||
var flagAccessLevelRequired = "{{ model.FLAG_ACCESS_LEVEL_REQUIRED }}";
|
||||
var flagActive = "{{ model.FLAG_ACTIVE }}";
|
||||
var flagAdd = "{{ model.FLAG_ADD }}";
|
||||
var flagAddress = "{{ model.FLAG_ADDRESS }}";
|
||||
var flagAddressLine1 = "{{ model.FLAG_ADDRESS_LINE_1 }}";
|
||||
var flagAddressLine2 = "{{ model.FLAG_ADDRESS_LINE_2 }}";
|
||||
var flagButton = "{{ model.FLAG_BUTTON }}";
|
||||
var flagButtonPrimary = "{{ model.FLAG_BUTTON_PRIMARY }}";
|
||||
var flagCallback = "{{ model.FLAG_CALLBACK }}";
|
||||
var flagCancel = "{{ model.FLAG_CANCEL }}";
|
||||
var flagCard = "{{ model.FLAG_CARD }}";
|
||||
var flagCity = "{{ model.FLAG_CITY }}";
|
||||
var flagCloseTemporaryElement = "{{ model.FLAG_CLOSE_TEMPORARY_ELEMENT }}";
|
||||
var flagCode = "{{ model.FLAG_CODE }}";
|
||||
var flagCollapsed = "{{ model.FLAG_COLLAPSED }}";
|
||||
var flagCollapsible = "{{ model.FLAG_COLLAPSIBLE }}";
|
||||
var flagColumn = "{{ model.FLAG_COLUMN }}";
|
||||
var flagComment = "{{ model.FLAG_COMMENT }}";
|
||||
// var flagContactUs = "{{ model.FLAG_CONTACT_US }}";
|
||||
var flagContainer = "{{ model.FLAG_CONTAINER }}";
|
||||
var flagContainerCheckbox = "{{ model.FLAG_CONTAINER_CHECKBOX }}";
|
||||
var flagContainerInput = "{{ model.FLAG_CONTAINER_INPUT }}";
|
||||
var flagCounty = "{{ model.FLAG_COUNTY }}";
|
||||
var flagCsrfToken = "{{ model.FLAG_CSRF_TOKEN }}";
|
||||
var flagCurrency = "{{ model.FLAG_CURRENCY }}";
|
||||
var flagDelete = "{{ model.FLAG_DELETE }}";
|
||||
var flagDescription = "{{ model.FLAG_DESCRIPTION }}";
|
||||
var flagDetail = "{{ model.FLAG_DETAIL }}";
|
||||
var flagDialog = "{{ model.FLAG_DIALOG }}";
|
||||
var flagDirty = "{{ model.FLAG_DIRTY }}";
|
||||
var flagDisplayOrder = "{{ model.FLAG_DISPLAY_ORDER }}";
|
||||
var flagDragging = "dragging";
|
||||
var flagDragOver = "drag-over";
|
||||
var flagEdit = "{{ model.FLAG_EDIT }}";
|
||||
var flagEmail = "{{ model.FLAG_EMAIL }}";
|
||||
var flagError = "{{ model.FLAG_ERROR }}";
|
||||
var flagExpanded = "{{ model.FLAG_EXPANDED }}";
|
||||
var flagFailure = "{{ model.FLAG_FAILURE }}";
|
||||
var flagFax = "{{ model.FLAG_FAX }}";
|
||||
var flagFilter = "{{ model.FLAG_FILTER }}";
|
||||
var flagForm = "{{ model.FLAG_FORM }}";
|
||||
var flagFormFilters = "{{ model.FLAG_FORM_FILTERS }}";
|
||||
var flagImageLogo = "{{ model.FLAG_IMAGE_LOGO }}";
|
||||
var flagInitialised = "{{ model.FLAG_INITIALISED }}";
|
||||
// var flagItems = "{{ model.FLAG_ITEMS }}";
|
||||
// var flagKeyPrimary = "{{ model.FLAG_KEY_PRIMARY }}";
|
||||
var flagLeftHandStub = "{{ model.FLAG_LEFT_HAND_STUB }}";
|
||||
var flagLogo = "{{ model.FLAG_LOGO }}";
|
||||
var flagMessage = "{{ model.FLAG_MESSAGE }}";
|
||||
var flagModal = "{{ model.FLAG_MODAL }}";
|
||||
var flagMove = "move";
|
||||
var flagName = "{{ model.FLAG_NAME }}";
|
||||
var flagNameAttrOptionText = "{{ model.FLAG_NAME_ATTR_OPTION_TEXT}}";
|
||||
var flagNameAttrOptionValue = "{{ model.FLAG_NAME_ATTR_OPTION_VALUE }}";
|
||||
var flagNamePlural = "{{ model.FLAG_NAME_PLURAL }}";
|
||||
var flagNavAdminHome = "{{ model.FLAG_NAV_ADMIN_HOME }}";
|
||||
var flagNavContact = "{{ model.FLAG_NAV_CONTACT }}";
|
||||
var flagNavHome = "{{ model.FLAG_NAV_HOME }}";
|
||||
var flagNavServices = "{{ model.FLAG_NAV_SERVICES }}";
|
||||
var flagNavUserAccount = "{{ model.FLAG_NAV_USER_ACCOUNT }}";
|
||||
var flagNavUserAdmin = "{{ model.FLAG_NAV_USER_ADMIN }}";
|
||||
var flagNavUserLogin = "{{ model.FLAG_NAV_USER_LOGIN }}";
|
||||
var flagNavUserLogout = "{{ model.FLAG_NAV_USER_LOGOUT }}";
|
||||
var flagOverlay = "{{ model.FLAG_OVERLAY }}";
|
||||
var flagOverlayClose = "{{ model.FLAG_OVERLAY_CLOSE }}";
|
||||
var flagPageBody = "{{ model.FLAG_PAGE_BODY }}";
|
||||
var flagPhoneNumber = "{{ model.FLAG_PHONE_NUMBER }}";
|
||||
var flagPostcode = "{{ model.FLAG_POSTCODE }}";
|
||||
var flagCaptcha = "{{ model.FLAG_CAPTCHA }}";
|
||||
var flagRightHandSide = "{{ model.FLAG_RIGHT_HAND_SIDE }}";
|
||||
var flagRow = "{{ model.FLAG_ROW }}";
|
||||
var flagRowNew = "{{ model.FLAG_ROW_NEW }}";
|
||||
var flagRows = "{{ model.FLAG_ROWS }}";
|
||||
var flagSave = "{{ model.FLAG_SAVE }}";
|
||||
var flagScrollable = "{{ model.FLAG_SCROLLABLE }}";
|
||||
var flagSlider = "{{ model.FLAG_SLIDER }}";
|
||||
var flagStatus = "{{ model.FLAG_STATUS }}";
|
||||
var flagSubmit = "{{ model.FLAG_SUBMIT }}";
|
||||
var flagSubmitted = "{{ model.FLAG_SUBMITTED }}";
|
||||
var flagSuccess = "{{ model.FLAG_SUCCESS }}";
|
||||
var flagTemporaryElement = "{{ model.FLAG_TEMPORARY_ELEMENT }}";
|
||||
var flagUser = "{{ model.FLAG_USER }}";
|
||||
var flagWebsite = "{{ model.FLAG_WEBSITE }}";
|
||||
var hashGetALTCHAChallenge = "{{ model.HASH_ALTCHA_CREATE_CHALLENGE }}";
|
||||
var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}";
|
||||
var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}";
|
||||
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
|
||||
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
|
||||
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";
|
||||
var hashPageErrorNoPermission = "{{ model.HASH_PAGE_ERROR_NO_PERMISSION }}";
|
||||
var hashPageHome = "{{ model.HASH_PAGE_HOME }}";
|
||||
var hashPageLicense = "{{ model.HASH_PAGE_LICENSE }}";
|
||||
var hashPagePrivacyPolicy = "{{ model.HASH_PAGE_PRIVACY_POLICY }}";
|
||||
var idButtonApplyFilters = "#{{ model.ID_BUTTON_APPLY_FILTERS }}";
|
||||
var idButtonHamburger = "#{{ model.ID_BUTTON_HAMBURGER }}";
|
||||
var idCSRFToken = "#{{ model.ID_CSRF_TOKEN }}";
|
||||
var idFormFilters = "#{{ model.ID_FORM_FILTERS }}";
|
||||
var idLabelError = "#{{ model.ID_LABEL_ERROR }}";
|
||||
var idOverlayConfirm = "#{{ model.ID_OVERLAY_CONFIRM }}";
|
||||
var idOverlayError = "#{{ model.ID_OVERLAY_ERROR }}";
|
||||
var idOverlayHamburger = "#{{ model.ID_OVERLAY_HAMBURGER }}";
|
||||
var idPageBody = "#{{ model.ID_PAGE_BODY }}";
|
||||
var idTableMain = "#{{ model.ID_TABLE_MAIN }}";
|
||||
var idTextareaConfirm = "#{{ model.ID_TEXTAREA_CONFIRM }}";
|
||||
var isUserLoggedIn = "{{ model.output_bool(model.IS_USER_LOGGED_IN) }}";
|
||||
var _pathHost = "{{ model.get_url_host() }}";
|
||||
var _rowBlank = null;
|
||||
var titlePageCurrent = "{{ model.title }}";
|
||||
var _verbose = ("{{ model.app.app_config.DEBUG }}" == "True");
|
||||
#}
|
||||
var attrIdAssessment = "{{ model.ATTR_ID_ASSESSMENT }}";
|
||||
var attrIdAssessmentCommandModalityLink = "{{ model.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK }}";
|
||||
var attrIdAssessmentResponse = "{{ model.ATTR_ID_ASSESSMENT_RESPONSE }}";
|
||||
var attrIdAccessLevel = "{{ model.ATTR_ID_ACCESS_LEVEL }}";
|
||||
var attrIdBribe = "{{ model.ATTR_ID_BRIBE }}";
|
||||
var attrIdButtonColour = "{{ model.ATTR_ID_BUTTON_COLOUR }}";
|
||||
var attrIdButtonIcon = "{{ model.ATTR_ID_BUTTON_ICON }}";
|
||||
var attrIdButtonShape = "{{ model.ATTR_ID_BUTTON_SHAPE }}";
|
||||
var attrIdColour = "{{ model.ATTR_ID_COLOUR }}";
|
||||
var attrIdCommand = "{{ model.ATTR_ID_COMMAND }}";
|
||||
var attrIdCommandButtonLink = "{{ model.ATTR_ID_COMMAND_BUTTON_LINK }}";
|
||||
var attrIdCommandCategory = "{{ model.ATTR_ID_COMMAND_CATEGORY }}";
|
||||
var attrIdCommandModality = "{{ model.ATTR_ID_COMMAND_MODALITY }}";
|
||||
var attrIdCurrency = "{{ model.ATTR_ID_CURRENCY }}";
|
||||
var attrIdDistraction = "{{ model.ATTR_ID_DISTRACTION }}";
|
||||
var attrIdDistractionIntensityLevel = "{{ model.ATTR_ID_DISTRACTION_INTENSITY_LEVEL }}";
|
||||
var attrIdDistractionType = "{{ model.ATTR_ID_DISTRACTION_TYPE }}";
|
||||
var attrIdDog = "{{ model.ATTR_ID_DOG }}";
|
||||
var attrIdDogCommandLink = "{{ model.ATTR_ID_DOG_COMMAND_LINK }}";
|
||||
var attrIdLightingLevel = "{{ model.ATTR_ID_LIGHTING_LEVEL }}";
|
||||
var attrIdLocation = "{{ model.ATTR_ID_LOCATION }}";
|
||||
var attrIdObedienceLevel = "{{ model.ATTR_ID_OBEDIENCE_LEVEL }}";
|
||||
var attrIdResponseQualityMetric = "{{ model.ATTR_ID_RESPONSE_QUALITY_METRIC }}";
|
||||
var attrIdWeather = "{{ model.ATTR_ID_WEATHER }}";
|
||||
var attrTextCollapsed = "{{ model.ATTR_TEXT_COLLAPSED }}";
|
||||
var attrTextExpanded = "{{ model.ATTR_TEXT_EXPANDED }}";
|
||||
var attrValueCurrent = "{{ model.ATTR_VALUE_CURRENT }}";
|
||||
var attrValuePrevious = "{{ model.ATTR_VALUE_PREVIOUS }}";
|
||||
var attrValueNew = "{{ model.ATTR_VALUE_NEW }}";
|
||||
var colourAccent = "{{ model.COLOUR_ACCENT }}";
|
||||
var colourError = "{{ model.COLOUR_ERROR }}";
|
||||
var colourPageBackground = "{{ model.COLOUR_PAGE_BACKGROUND }}";
|
||||
var colourPageBackground1 = "{{ model.COLOUR_PAGE_BACKGROUND_1 }}";
|
||||
var colourPageBackground2 = "{{ model.COLOUR_PAGE_BACKGROUND_2 }}";
|
||||
var colourPrimary = "{{ model.COLOUR_PRIMARY }}";
|
||||
var colourSecondary = "{{ model.COLOUR_SECONDARY }}";
|
||||
var colourText = "{{ model.COLOUR_TEXT }}";
|
||||
var colourTextBackground = "{{ model.COLOUR_TEXT_BACKGROUND }}";
|
||||
var colourTextLinkUnvisited = "{{ model.COLOUR_TEXT_LINK_UNVISITED }}";
|
||||
var colourTextLinkVisited = "{{ model.COLOUR_TEXT_LINK_VISITED }}";
|
||||
var environment = {
|
||||
"name": "{{ model.app.app_config.FLASK_ENV }}",
|
||||
"is_production": "{{ model.app.app_config.is_production | lower }}",
|
||||
"is_development": "{{ model.app.app_config.is_development | lower }}",
|
||||
};
|
||||
var flagAccessLevel = "{{ model.FLAG_ACCESS_LEVEL }}";
|
||||
var flagAccessLevelRequired = "{{ model.FLAG_ACCESS_LEVEL_REQUIRED }}";
|
||||
var flagActive = "{{ model.FLAG_ACTIVE }}";
|
||||
var flagActiveOnly = "{{ model.FLAG_ACTIVE_ONLY }}";
|
||||
var flagAdd = "{{ model.FLAG_ADD }}";
|
||||
var flagAddress = "{{ model.FLAG_ADDRESS }}";
|
||||
var flagAddressLine1 = "{{ model.FLAG_ADDRESS_LINE_1 }}";
|
||||
var flagAddressLine2 = "{{ model.FLAG_ADDRESS_LINE_2 }}";
|
||||
var flagAssessment = "{{ model.FLAG_ASSESSMENT }}";
|
||||
var flagAssessmentCommandModalityLink = "{{ model.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK }}";
|
||||
var flagAssessmentResponse = "{{ model.FLAG_ASSESSMENT_RESPONSE }}";
|
||||
var flagBribe = "{{ model.FLAG_BRIBE }}";
|
||||
var flagButton = "{{ model.FLAG_BUTTON }}";
|
||||
var flagButtonIcon = "{{ model.FLAG_BUTTON_ICON }}";
|
||||
var flagButtonShape = "{{ model.FLAG_BUTTON_SHAPE }}";
|
||||
var flagButtonPrimary = "{{ model.FLAG_BUTTON_PRIMARY }}";
|
||||
var flagCallback = "{{ model.FLAG_CALLBACK }}";
|
||||
var flagCancel = "{{ model.FLAG_CANCEL }}";
|
||||
var flagCaptcha = "{{ model.FLAG_CAPTCHA }}";
|
||||
var flagCard = "{{ model.FLAG_CARD }}";
|
||||
var flagCheckbox = "{{ model.FLAG_CHECKBOX }}";
|
||||
var flagCity = "{{ model.FLAG_CITY }}";
|
||||
var flagCloseTemporaryElement = "{{ model.FLAG_CLOSE_TEMPORARY_ELEMENT }}";
|
||||
var flagCode = "{{ model.FLAG_CODE }}";
|
||||
var flagCollapsible = "{{ model.FLAG_COLLAPSIBLE }}";
|
||||
var flagColour = "{{ model.FLAG_COLOUR }}";
|
||||
var flagColumn = "{{ model.FLAG_COLUMN }}";
|
||||
var flagCommand = "{{ model.FLAG_COMMAND }}";
|
||||
var flagCommandButtonLink = "{{ model.FLAG_COMMAND_BUTTON_LINK }}";
|
||||
var flagCommandCategory = "{{ model.FLAG_COMMAND_CATEGORY }}";
|
||||
var flagComment = "{{ model.FLAG_COMMENT }}";
|
||||
var flagContainer = "{{ model.FLAG_CONTAINER }}";
|
||||
var flagContainerInput = "{{ model.FLAG_CONTAINER_INPUT }}";
|
||||
var flagCounty = "{{ model.FLAG_COUNTY }}";
|
||||
var flagCsrfToken = "{{ model.FLAG_CSRF_TOKEN }}";
|
||||
var flagCurrency = "{{ model.FLAG_CURRENCY }}";
|
||||
var flagDdlPreview = "{{ model.FLAG_DDL_PREVIEW }}";
|
||||
var flagDelete = "{{ model.FLAG_DELETE }}";
|
||||
var flagDescription = "{{ model.FLAG_DESCRIPTION }}";
|
||||
var flagDetail = "{{ model.FLAG_DETAIL }}";
|
||||
var flagDialog = "{{ model.FLAG_DIALOG }}";
|
||||
var flagDirty = "{{ model.FLAG_DIRTY }}";
|
||||
var flagDisplayOrder = "{{ model.FLAG_DISPLAY_ORDER }}";
|
||||
var flagDistraction = "{{ model.FLAG_DISTRACTION }}";
|
||||
var flagDistractionIntensityLevel = "{{ model.FLAG_DISTRACTION_INTENSITY_LEVEL }}";
|
||||
var flagDistractionType = "{{ model.FLAG_DISTRACTION_TYPE }}";
|
||||
var flagDog = "{{ model.FLAG_DOG }}";
|
||||
var flagDogDogCommandLink = "{{ model.FLAG_DOG_DOG_COMMAND_LINK }}";
|
||||
var flagDragging = "dragging";
|
||||
var flagDragOver = "drag-over";
|
||||
var flagEdit = "{{ model.FLAG_EDIT }}";
|
||||
var flagEmail = "{{ model.FLAG_EMAIL }}";
|
||||
var flagError = "{{ model.FLAG_ERROR }}";
|
||||
var flagExpanded = "{{ model.FLAG_EXPANDED }}";
|
||||
var flagFailure = "{{ model.FLAG_FAILURE }}";
|
||||
var flagFax = "{{ model.FLAG_FAX }}";
|
||||
var flagFilter = "{{ model.FLAG_FILTER }}";
|
||||
var flagForm = "{{ model.FLAG_FORM }}";
|
||||
var flagFormFilters = "{{ model.FLAG_FORM_FILTERS }}";
|
||||
var flagIcon = "{{ model.FLAG_ICON }}";
|
||||
var flagImageLogo = "{{ model.FLAG_IMAGE_LOGO }}";
|
||||
var flagInitialised = "{{ model.FLAG_INITIALISED }}";
|
||||
var flagIsChecked = "{{ model.FLAG_IS_CHECKED }}";
|
||||
var flagIsCollapsed = "{{ model.FLAG_IS_COLLAPSED }}";
|
||||
var flagLeftHandStub = "{{ model.FLAG_LEFT_HAND_STUB }}";
|
||||
var flagLightingLevel = "{{ model.FLAG_LIGHTING_LEVEL }}";
|
||||
var flagLocation = "{{ model.FLAG_LOCATION }}";
|
||||
var flagLocationParent = "{{ model.FLAG_LOCATION_PARENT }}";
|
||||
var flagLogo = "{{ model.FLAG_LOGO }}";
|
||||
var flagMessage = "{{ model.FLAG_MESSAGE }}";
|
||||
var flagModal = "{{ model.FLAG_MODAL }}";
|
||||
var flagMove = "move";
|
||||
var flagName = "{{ model.FLAG_NAME }}";
|
||||
var flagNameAttrOptionText = "{{ model.FLAG_NAME_ATTR_OPTION_TEXT}}";
|
||||
var flagNameAttrOptionValue = "{{ model.FLAG_NAME_ATTR_OPTION_VALUE }}";
|
||||
var flagNamePlural = "{{ model.FLAG_NAME_PLURAL }}";
|
||||
var flagNavAdminHome = "{{ model.FLAG_NAV_ADMIN_HOME }}";
|
||||
var flagNavContact = "{{ model.FLAG_NAV_CONTACT }}";
|
||||
var flagNavHome = "{{ model.FLAG_NAV_HOME }}";
|
||||
var flagNavDogAssessments = "{{ model.FLAG_NAV_DOG_ASSESSMENTS }}";
|
||||
var flagNavDogButtonIcons = "{{ model.FLAG_NAV_DOG_BUTTON_ICONS }}";
|
||||
var flagNavDogButtonShapes = "{{ model.FLAG_NAV_DOG_BUTTON_SHAPES }}";
|
||||
var flagNavDogColour = "{{ model.FLAG_NAV_DOG_COLOUR }}";
|
||||
var flagNavDogCommandButtonLinks = "{{ model.FLAG_NAV_DOG_COMMAND_BUTTON_LINKS }}";
|
||||
var flagNavDogCommandCategories = "{{ model.FLAG_NAV_DOG_COMMAND_CATEGORIES }}";
|
||||
var flagNavDogCommands = "{{ model.FLAG_NAV_DOG_COMMANDS }}";
|
||||
var flagNavDogDogs = "{{ model.FLAG_NAV_DOG_DOGS }}";
|
||||
var flagNavDogDogCommandLinks = "{{ model.FLAG_NAV_DOG_DOG_COMMAND_LINKS }}";
|
||||
var flagNavDogHome = "{{ model.FLAG_NAV_DOG_HOME }}";
|
||||
var flagNavDogLocations = "{{ model.FLAG_NAV_DOG_LOCATIONS }}";
|
||||
var flagNavUserAccount = "{{ model.FLAG_NAV_USER_ACCOUNT }}";
|
||||
var flagNavUserAdmin = "{{ model.FLAG_NAV_USER_ADMIN }}";
|
||||
var flagNavUserLogin = "{{ model.FLAG_NAV_USER_LOGIN }}";
|
||||
var flagNavUserLogout = "{{ model.FLAG_NAV_USER_LOGOUT }}";
|
||||
var flagNotes = "{{ model.FLAG_NOTES }}";
|
||||
var flagObedienceLevel = "{{ model.FLAG_OBEDIENCE_LEVEL }}";
|
||||
var flagOverlay = "{{ model.FLAG_OVERLAY }}";
|
||||
var flagOverlayClose = "{{ model.FLAG_OVERLAY_CLOSE }}";
|
||||
var flagPageBody = "{{ model.FLAG_PAGE_BODY }}";
|
||||
var flagPhoneNumber = "{{ model.FLAG_PHONE_NUMBER }}";
|
||||
var flagPostcode = "{{ model.FLAG_POSTCODE }}";
|
||||
var flagQuantity = "{{ model.FLAG_QUANTITY }}";
|
||||
var flagResponseQualityMetric = "{{ model.FLAG_RESPONSE_QUALITY_METRIC }}";
|
||||
var flagRightHandSide = "{{ model.FLAG_RIGHT_HAND_SIDE }}";
|
||||
var flagRow = "{{ model.FLAG_ROW }}";
|
||||
var flagRowNew = "{{ model.FLAG_ROW_NEW }}";
|
||||
var flagRows = "{{ model.FLAG_ROWS }}";
|
||||
var flagSave = "{{ model.FLAG_SAVE }}";
|
||||
var flagScrollable = "{{ model.FLAG_SCROLLABLE }}";
|
||||
var flagSearch = "{{ model.FLAG_SEARCH }}";
|
||||
var flagSlider = "{{ model.FLAG_SLIDER }}";
|
||||
var flagStatus = "{{ model.FLAG_STATUS }}";
|
||||
var flagSubmit = "{{ model.FLAG_SUBMIT }}";
|
||||
var flagSubmitted = "{{ model.FLAG_SUBMITTED }}";
|
||||
var flagSuccess = "{{ model.FLAG_SUCCESS }}";
|
||||
var flagTableMain = "{{ model.FLAG_TABLE_MAIN }}";
|
||||
var flagTemporaryElement = "{{ model.FLAG_TEMPORARY_ELEMENT }}";
|
||||
var flagUser = "{{ model.FLAG_USER }}";
|
||||
var flagWeather = "{{ model.FLAG_WEATHER }}";
|
||||
var flagWebsite = "{{ model.FLAG_WEBSITE }}";
|
||||
var hashGetALTCHAChallenge = "{{ model.HASH_ALTCHA_CREATE_CHALLENGE }}";
|
||||
var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}";
|
||||
var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}";
|
||||
var hashPageAdminHome = "{{ model.HASH_PAGE_ADMIN_HOME }}";
|
||||
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
|
||||
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
|
||||
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";
|
||||
var hashPageDogAssessment = "{{ model.HASH_PAGE_DOG_ASSESSMENT }}";
|
||||
var hashPageDogAssessments = "{{ model.HASH_PAGE_DOG_ASSESSMENTS }}";
|
||||
var hashPageDogButtonIcons = "{{ model.HASH_PAGE_DOG_BUTTON_ICONS }}";
|
||||
var hashPageDogButtonShapes = "{{ model.HASH_PAGE_DOG_BUTTON_SHAPES }}";
|
||||
var hashPageDogColours = "{{ model.HASH_PAGE_DOG_COLOURS }}";
|
||||
var hashPageDogCommandButtonLinks = "{{ model.HASH_PAGE_DOG_COMMAND_BUTTON_LINKS }}";
|
||||
var hashPageDogCommandCategories = "{{ model.HASH_PAGE_DOG_COMMAND_CATEGORIES }}";
|
||||
var hashPageDogCommands = "{{ model.HASH_PAGE_DOG_COMMANDS }}";
|
||||
var hashPageDogDogCommandLinks = "{{ model.HASH_PAGE_DOG_DOG_COMMAND_LINKS }}";
|
||||
var hashPageDogDogs = "{{ model.HASH_PAGE_DOG_DOGS }}";
|
||||
var hashPageDogHome = "{{ model.HASH_PAGE_DOG_HOME }}";
|
||||
var hashPageDogLocations = "{{ model.HASH_PAGE_DOG_LOCATIONS }}";
|
||||
var hashPageErrorNoPermission = "{{ model.HASH_PAGE_ERROR_NO_PERMISSION }}";
|
||||
var hashPageHome = "{{ model.HASH_PAGE_HOME }}";
|
||||
var hashPageLicense = "{{ model.HASH_PAGE_LICENSE }}";
|
||||
var hashPagePrivacyPolicy = "{{ model.HASH_PAGE_PRIVACY_POLICY }}";
|
||||
var hashPageUserAccount = "{{ model.HASH_PAGE_USER_ACCOUNT }}";
|
||||
var hashPageUserAdmin = "{{ model.HASH_PAGE_USER_ADMIN }}";
|
||||
var hashPageUserLogin = "{{ model.HASH_PAGE_USER_LOGIN }}";
|
||||
var hashPageUserLogout = "{{ model.HASH_PAGE_USER_LOGOUT }}";
|
||||
{# var hashSaveDogAssessment = "{{ model.HASH_SAVE_DOG_ASSESSMENT }}"; #}
|
||||
var hashSaveDogAssessmentDistractionAndResponse = "{{ model.HASH_SAVE_DOG_ASSESSMENT_DISTRACTION_AND_RESPONSE }}";
|
||||
var hashSaveDogButtonIcon = "{{ model.HASH_SAVE_DOG_BUTTON_ICON }}";
|
||||
var hashSaveDogButtonShape = "{{ model.HASH_SAVE_DOG_BUTTON_SHAPE }}";
|
||||
var hashSaveDogColour = "{{ model.HASH_SAVE_DOG_COLOUR }}";
|
||||
var hashSaveDogCommand = "{{ model.HASH_SAVE_DOG_COMMAND }}";
|
||||
var hashSaveDogCommandButtonLink = "{{ model.HASH_SAVE_DOG_COMMAND_BUTTON_LINK }}";
|
||||
var hashSaveDogCommandCategory = "{{ model.HASH_SAVE_DOG_COMMAND_CATEGORY }}";
|
||||
var hashSaveDogDogCommandLink = "{{ model.HASH_SAVE_DOG_DOG_COMMAND_LINK }}";
|
||||
var hashSaveDogLocation = "{{ model.HASH_SAVE_DOG_LOCATION }}";
|
||||
var idButtonApplyFilters = "#{{ model.ID_BUTTON_APPLY_FILTERS }}";
|
||||
var idButtonHamburger = "#{{ model.ID_BUTTON_HAMBURGER }}";
|
||||
var idButtonCancel = "#{{ model.ID_BUTTON_CANCEL }}";
|
||||
var idButtonSave = "#{{ model.ID_BUTTON_SAVE }}";
|
||||
var idContainerTemplateElements = "#{{ model.ID_CONTAINER_TEMPLATE_ELEMENTS }}";
|
||||
var idCSRFToken = "#{{ model.ID_CSRF_TOKEN }}";
|
||||
var idFormFilters = "#{{ model.ID_FORM_FILTERS }}";
|
||||
var idLabelError = "#{{ model.ID_LABEL_ERROR }}";
|
||||
var idOverlayConfirm = "#{{ model.ID_OVERLAY_CONFIRM }}";
|
||||
var idOverlayError = "#{{ model.ID_OVERLAY_ERROR }}";
|
||||
var idOverlayHamburger = "#{{ model.ID_OVERLAY_HAMBURGER }}";
|
||||
var idPageBody = "#{{ model.ID_PAGE_BODY }}";
|
||||
var idTableMain = "#{{ model.ID_TABLE_MAIN }}";
|
||||
var idTextareaConfirm = "#{{ model.ID_TEXTAREA_CONFIRM }}";
|
||||
var isUserLoggedIn = "{{ model.output_bool(model.IS_USER_LOGGED_IN) }}";
|
||||
var _pathHost = "{{ model.get_url_host() }}";
|
||||
var _rowBlank = null;
|
||||
var titlePageCurrent = "{{ model.title }}";
|
||||
var _verbose = ("{{ model.app.app_config.DEBUG }}" == "True");
|
||||
</script>
|
||||
|
||||
|
||||
<link rel="preload" as="style" href="{{ url_for('static', filename='dist/css/main.bundle.css') }}" onload="this.onload=null;this.rel='stylesheet'">
|
||||
<noscript><link rel="stylesheet" href="{{ url_for('static', filename='dist/css/main.bundle.css') }}"></noscript>
|
||||
@@ -474,7 +122,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
|
||||
{% include 'layouts/_shared.html' %}
|
||||
<script src="{{ url_for('static', filename='dist/js/main.bundle.js') }}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -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 © {{ 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 © {{ 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>
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -8,33 +8,35 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block page_nav_links %}
|
||||
<a href="#{{ model.FLAG_BENEFITS }}">Benefits</a>
|
||||
<a href="#{{ model.FLAG_PROBLEM }}">Problem</a>
|
||||
<a href="#{{ model.FLAG_SOLUTION }}">Solution</a>
|
||||
<a href="#{{ model.FLAG_EARLY_ACCESS }}">Early Access</a>
|
||||
<!-- <a href="#{{ model.FLAG_SOCIAL_PROOF }}">Social Proof</a>
|
||||
<a href="#{{ model.FLAG_FEATURES }}">Features</a>
|
||||
<a href="#{{ model.FLAG_FAQ }}">FAQs</a> -->
|
||||
<a href="#{{ model.FLAG_PROBLEM }}">Problem</a>
|
||||
<a href="#{{ model.FLAG_BENEFITS }}">Benefits</a>
|
||||
<a href="#{{ model.FLAG_SOLUTION }}">Solution</a>
|
||||
<a href="#{{ model.FLAG_SOCIAL_PROOF }}">Social Proof</a>
|
||||
<a href="#{{ model.FLAG_TESTIMONIAL }}">Testimonial</a>
|
||||
<a href="#{{ model.FLAG_EARLY_ACCESS }}">Early Access</a>
|
||||
<!-- <a href="#{{ model.FLAG_FEATURES }}">Features</a>
|
||||
<a href="#{{ model.FLAG_FAQ }}">FAQs</a> -->
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Contact Us</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block page_body %}
|
||||
<section class="hero">
|
||||
<div class="container">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<div class="hero-content" data-aos="fade-up">
|
||||
<h1>Transform Your Dog Training Business with Smart Progress Tracking</h1>
|
||||
<p>The first UK-built platform designed specifically for professional dog trainers. Track progress, measure success, and keep clients engaged like never before.</p>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">NOW AVAILABLE</a>
|
||||
<h1>Finally, Professional Software Built for Dog Trainers</h1>
|
||||
<p>Stop losing track of client progress and spending hours on admin. Fetch Metrics helps you track every command, demonstrate real results, and keep clients engaged.</p>
|
||||
<!-- <a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Get Early Access</a>
|
||||
<p>Join forward-thinking trainers across the UK who are revolutionising how they manage their business.</p> -->
|
||||
<!-- <a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Watch 2-Minute Demo</a> -->
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Join the Waitlist</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!--
|
||||
<section id="{{ model.FLAG_BENEFITS }}" class="{{ model.FLAG_BENEFITS }}">
|
||||
<div class="container">
|
||||
<h2 class="section-title text-center">Finally, Software That Understands Dog Training</h2> <!-- Finally, A System That Speaks Your Language -->
|
||||
<h2 class="section-title text-center">Finally, Software That Understands Dog Training</h2> < !-- Finally, A System That Speaks Your Language -- >
|
||||
<p class="section-subtitle text-center">Running a successful dog training business shouldn't mean drowning in paperwork or losing track of client progress. Fetch Metrics brings clarity to every session, ensuring both you and your clients stay perfectly synchronized.</p>
|
||||
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_BENEFITS }}">
|
||||
@@ -47,44 +49,119 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
-->
|
||||
<section id="{{ model.FLAG_PROBLEM }}" class="{{ model.FLAG_PROBLEM }}">
|
||||
<div class="container">
|
||||
<h2 class="section-title text-center">Sound Familiar?</h2>
|
||||
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h2 class="section-title text-center">Tired of This Daily Struggle?</h2>
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_PROBLEM }}">
|
||||
<p class="section-subtitle text-center">Pain Points:</p>
|
||||
<ul>
|
||||
<li>Spending hours on admin instead of training</li>
|
||||
<li>Clients forgetting commands between sessions</li>
|
||||
<li>No clear way to show progress over time</li>
|
||||
<li>Different trainers or pets using different signals</li>
|
||||
<li>Lost notes and forgotten homework</li>
|
||||
<li><strong>😤 Endless paperwork</strong> - Spending more time on admin than actual training</li>
|
||||
<li><strong>😤 Lost progress tracking</strong> - No clear way to show clients how their dog is improving</li>
|
||||
<li><strong>😤 Inconsistent training</strong> - Different commands and signals across sessions</li>
|
||||
<li><strong>😤 Client frustration</strong> - Owners forgetting what was covered last week</li>
|
||||
<li><strong>😤 No professional reports</strong> - Struggling to justify your rates with hard data</li>
|
||||
</ul>
|
||||
<!--
|
||||
<p>You became a dog trainer to work with animals and help families - not to be a data entry clerk. Yet successful trainers tell us they spend more time on administration than actual training.</p>
|
||||
-->
|
||||
<p>Fetch Metrics solves these challenges with purpose-built tools that streamline your workflow and enhance client results. Spend less time on paperwork and more time doing what you love.</p>
|
||||
<p><strong>You became a dog trainer to work with animals, not spreadsheets.</strong></p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="{{ model.FLAG_BENEFITS }}" class="{{ model.FLAG_BENEFITS }}">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h2 class="section-title text-center">What If You Could...</h2>
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_BENEFITS }}">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h3>📊 Track Real Progress</h3>
|
||||
<p>Document every breakthrough with detailed performance tracking. See exactly how each command improves over time with response rates, latency, and compliance scores.</p>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h3>🎯 Keep Everyone Consistent</h3>
|
||||
<p>Standardised commands and signals across all trainers. No more confusion - everyone uses the same approach for faster results.</p>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h3>📈 Generate Professional Reports</h3>
|
||||
<p>Show clients stunning progress charts and radar diagrams. Prove your value with data that demonstrates real improvement.</p>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h3>⏰ Save Hours Weekly</h3>
|
||||
<p>Streamlined session notes, automated progress tracking, and instant report generation. Spend time training, not on paperwork.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="{{ model.FLAG_SOLUTION }}" class="{{ model.FLAG_SOLUTION }}">
|
||||
<div class="container">
|
||||
<h2 class="section-title text-center">Simple to Start, Powerful in Practice</h2>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h2 class="section-title text-center">See It In Action</h2>
|
||||
<p class="section-subtitle text-center">This isn't vaporware - we've built a working system that professional trainers are already using:</p>
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_SOLUTION }}">
|
||||
<ul>
|
||||
<li><strong>1. Set Up Your Business:</strong> Add your trainers, create client profiles, and customise your training programmes in minutes.</li>
|
||||
<li><strong>2. Track Every Session:</strong> Record progress, document breakthroughs, and maintain consistency across all trainers and clients.</li>
|
||||
<li><strong>3. Engage Your Clients:</strong> Give owners access to their dog's journey, including command reminders and homework assignments.</li>
|
||||
<li><strong>4. Showcase Success:</strong> Generate professional reports that demonstrate progress and justify your expertise.</li>
|
||||
</ul>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h3>📝 Command Management</h3>
|
||||
<p>Customise commands, categories, and signals for your training style</p>
|
||||
<div class="project-thumbnail">
|
||||
<img src="{{ url_for('static', filename='images/fetch-metrics-page-commands.webp') }}" alt="Command Management" aria-label="Command Management">
|
||||
</div>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h3>📊 Assessment Tracking</h3>
|
||||
<p>Record distractions, environments, response times, and success rates</p>
|
||||
<div class="project-thumbnail">
|
||||
<img src="{{ url_for('static', filename='images/fetch-metrics-page-assessment.webp') }}" alt="Assessment Tracking" aria-label="Assessment Tracking">
|
||||
</div>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h3>🎯 Progress Visualisation</h3>
|
||||
<p>Radar charts showing command mastery and improvement over time</p>
|
||||
<div class="project-thumbnail">
|
||||
<img src="{{ url_for('static', filename='images/fetch-metrics-report-radar-command-mastery.webp') }}" alt="Progress Visualisation" aria-label="Progress Visualisation">
|
||||
</div>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h3>📈 Performance Analytics</h3>
|
||||
<p>Line charts tracking response latency and compliance duration</p>
|
||||
<div class="project-thumbnail">
|
||||
<img src="{{ url_for('static', filename='images/fetch-metrics-report-line-command-progress.webp') }}" alt="Performance Analytics" aria-label="Performance Analytics">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="{{ model.FLAG_SOCIAL_PROOF }}" class="{{ model.FLAG_SOCIAL_PROOF }}">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h2 class="section-title text-center">Built for UK Trainers, By UK Trainers</h2>
|
||||
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_SOCIAL_PROOF }}">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<div class="section-title">500+</div>
|
||||
<div class="section-subtitle">Dogs Tracked</div>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<div class="section-title">15+</div>
|
||||
<div class="section-subtitle">Active Trainers</div>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<div class="section-title">6hrs</div>
|
||||
<div class="section-subtitle">Saved Per Week</div>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<div class="section-title">40%</div>
|
||||
<div class="section-subtitle">Progress Improvement</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="{{ model.FLAG_TESTIMONIAL }}" class="{{ model.FLAG_TESTIMONIAL }}">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<p class="text-center">"I've been tracking commands in spreadsheets for years. This is exactly what I needed - finally, someone who understands what trainers actually do day-to-day."</p>
|
||||
<h2 class="section-subtitle text-center">- Sarah M., Certified Dog Behaviourist, Manchester</h2>
|
||||
</div>
|
||||
</section>
|
||||
<!--
|
||||
|
||||
<section id="{{ model.FLAG_EARLY_ACCESS }}" class="{{ model.FLAG_EARLY_ACCESS }}">
|
||||
<div class="container">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h2 class="section-title text-center">Be Among the First</h2>
|
||||
<p class="section-subtitle text-center">We're putting the finishing touches on something special. Join our early access list to:</p>
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_EARLY_ACCESS }}">
|
||||
@@ -99,41 +176,9 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!--
|
||||
<section id="{{ model.FLAG_FEATURES }}" class="{{ model.FLAG_FEATURES }}">
|
||||
<div class="container">
|
||||
<h2 class="section-title text-center">Everything You Need, Nothing You Don't</h2>
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_FEATURES }}">
|
||||
< !--
|
||||
<ul>
|
||||
<li>✓ Detailed command performance tracking</li>
|
||||
<li>✓ Multi-level skill progression monitoring</li>
|
||||
<li>✓ Professional progress report generation</li>
|
||||
<li>✓ Client and dog profile management</li>
|
||||
<li>✓ Session planning and note-taking</li>
|
||||
<li>✓ Mobile-friendly for field use</li>
|
||||
<li>✓ Secure cloud-based storage</li>
|
||||
<li>✓ GDPR compliant</li>
|
||||
</ul>
|
||||
-- >
|
||||
<ul>
|
||||
<li>✓ Comprehensive progress tracking for individual commands</li>
|
||||
<li>✓ Unified command library for team consistency</li>
|
||||
<li>✓ Client portal for owner engagement</li>
|
||||
<li>✓ Session scheduling and reminders</li>
|
||||
<li>✓ Professional progress reporting</li>
|
||||
<li>✓ Mobile-friendly for field use</li>
|
||||
<li>✓ Secure photo and video storage</li>
|
||||
<li>✓ Multi-trainer support with permissions</li>
|
||||
</ul>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Reserve Your Spot Now</a>
|
||||
<p>And this is just the beginning. We're constantly adding features based on feedback from trainers like you.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="{{ model.FLAG_BENEFITS }}" class="{{ model.FLAG_BENEFITS }}">
|
||||
<div class="container">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h2 class="section-title text-center">More Than Just Software - It's Your Training Partner</h2>
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_BENEFITS }}">
|
||||
<p class="section-subtitle text-center">For Your Business:</p>
|
||||
@@ -157,27 +202,10 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="{{ model.FLAG_SOCIAL_PROOF }}" class="{{ model.FLAG_SOCIAL_PROOF }}">
|
||||
<div class="container">
|
||||
<h2 class="section-title text-center">Built for UK Trainers, By UK Trainers</h2>
|
||||
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_SOCIAL_PROOF }}">
|
||||
<p>We understand the unique challenges of running a dog training business in the UK. That's why we've created the first platform designed specifically for our market.</p>
|
||||
<p class="section-subtitle text-center">Stats:</p>
|
||||
<ul>
|
||||
<li>✓ 30+ Professional Trainers in Beta</li>
|
||||
<li>✓ 500+ Dogs Successfully Tracked</li>
|
||||
<li>✓ 10 Hours Saved Per Week (Average)</li>
|
||||
<li>✓ 40% Increase in Client Retention</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
-->
|
||||
<!--
|
||||
<section class="{{ model.FLAG_CTA_1 }}">
|
||||
<div class="container">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h2 class="section-title">Ready to Revolutionise Your Training Business?</h2>
|
||||
<p class="section-subtitle text-center">Join the waitlist for early access to the UK's most comprehensive dog training management platform.</p>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Get Early Access Today</a>
|
||||
@@ -186,7 +214,7 @@
|
||||
</section>
|
||||
|
||||
<section id="{{ model.FLAG_PRICING }}" class="{{ model.FLAG_PRICING }}">
|
||||
<div class="container">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h2 class="section-title">Pricing That Grows With You</h2>
|
||||
<p class="section-subtitle text-center">Whether you're an independent trainer or managing a team, we have a plan that fits. All plans include our core features with no hidden fees.</p>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Get Early Access Today</a>
|
||||
@@ -195,7 +223,7 @@
|
||||
</section>
|
||||
|
||||
<section id="{{ model.FLAG_FAQ }}" class="{{ model.FLAG_FAQ }}">
|
||||
<div class="container">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h2 class="section-title text-center">FAQs</h2>
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_FAQ }}">
|
||||
<ul>
|
||||
@@ -210,10 +238,40 @@
|
||||
-->
|
||||
|
||||
<section class="{{ model.FLAG_CTA_2 }}">
|
||||
<div class="container">
|
||||
<h2 class="section-title">Built for UK Trainers, by UK Trainers</h2>
|
||||
<p class="section-subtitle text-center">Fetch Metrics isn't another generic business tool trying to fit your needs. We're building this specifically for the unique requirements of professional dog training in the UK.</p>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Questions?</a>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h2 class="section-title">Get Started Today - Alpha Access Available</h2>
|
||||
<p class="section-subtitle text-center">We're ready for serious trainers to start using Fetch Metrics right now. Since we're still adding features based on user feedback, we're offering incredible early access terms:</p>
|
||||
|
||||
<div class="{{ model.FLAG_CARD }}">
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h4>🆓 Free During Alpha</h4>
|
||||
<p>Complete access to all features while we perfect the platform together</p>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h4>💰 50% Off for Life</h4>
|
||||
<p>Lock in permanent founder pricing when we officially launch</p>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h4>🎨 Shape the Product</h4>
|
||||
<p>Your feedback directly influences new features and improvements</p>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }}">
|
||||
<h4>🚀 First Access</h4>
|
||||
<p>Be first to try everything new as we add it</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="urgency">
|
||||
<p><strong>Limited to 20 trainers</strong> - We want to provide excellent support and meaningful collaboration with each Alpha user.</p>
|
||||
</div>
|
||||
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Apply for Alpha Access</a>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Book a Demo Call</a>
|
||||
|
||||
<p>
|
||||
Questions? Email us at {{ model.get_mail_contact_public() }}<br>
|
||||
Response time: Under 24 hours
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -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 }}];
|
||||
|
||||
@@ -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 }};
|
||||
|
||||
@@ -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>
|
||||
|
||||
87
templates/pages/dog/_calendar_entries.html
Normal file
87
templates/pages/dog/_calendar_entries.html
Normal 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 %}
|
||||
@@ -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 }};
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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 }};
|
||||
|
||||
@@ -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 }};
|
||||
|
||||
@@ -7,47 +7,56 @@
|
||||
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_ROW }}">
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
|
||||
<h2>Dog</h2>
|
||||
{#
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_DOGS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Dogs</button>
|
||||
</div>
|
||||
#}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_COMMAND_CATEGORIES }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Command Categories</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_COMMANDS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Commands</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_DOG_COMMAND_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Dog Command Links</button>
|
||||
</div>
|
||||
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_LOCATIONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Locations</button>
|
||||
</div>
|
||||
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_BUTTON_ICONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Button Icons</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_COMMAND_BUTTON_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Command Button Links</button>
|
||||
</div>
|
||||
<h2 class="home-hero-title">Dog Training!</h2>
|
||||
{% if not model.user.get_is_logged_in() %}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_USER_LOGIN }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Login</a>
|
||||
</div>
|
||||
{% elif True or model.user.can_admin_dog %}
|
||||
{#
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_DOGS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Dogs</button>
|
||||
</div>
|
||||
#}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_COMMAND_CATEGORIES }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Command Categories</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_COMMANDS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Commands</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_DOG_COMMAND_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Dog Command Links</button>
|
||||
</div>
|
||||
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_LOCATIONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Locations</button>
|
||||
</div>
|
||||
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_BUTTON_ICONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Button Icons</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_COMMAND_BUTTON_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Command Button Links</button>
|
||||
</div>
|
||||
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENTS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessments</button>
|
||||
</div>
|
||||
{#
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_DISTRACTIONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Distractions</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENT_COMMAND_MODALITY_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessment Command Modality Links</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENT_RESPONSES }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessment Responses</button>
|
||||
</div>
|
||||
#}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENTS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessments</button>
|
||||
</div>
|
||||
{#
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_DISTRACTIONS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Distractions</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENT_COMMAND_MODALITY_LINKS }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessment Command Modality Links</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_ASSESSMENT_RESPONSES }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Assessment Responses</button>
|
||||
</div>
|
||||
#}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_DOG_CALENDAR_ENTRIES }} {{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Overdue Bills</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -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>
|
||||
|
||||
4
todo.txt
4
todo.txt
@@ -25,10 +25,12 @@ Features:
|
||||
- Add Is_Default field to all Lookup tables
|
||||
- Response Quality Metric - add field bigger value measured is better?
|
||||
- Permissions
|
||||
- Assessment completed/started on date for when used as homework
|
||||
|
||||
|
||||
Fix:
|
||||
- formFilters - centre columns on flex
|
||||
- Location save and UI logic for tree structure
|
||||
- Dogs missing from Assessments table?
|
||||
- Add filter by unit measurement on Response Quality Metric
|
||||
- Add filter by unit measurement on Response Quality Metric
|
||||
- DB field id_user_created_by must not be null
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user