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