From fad5336cc4af652edbc6106f10dbe54b4cd47908 Mon Sep 17 00:00:00 2001 From: Teddy Middleton-Smith Date: Thu, 24 Jul 2025 16:48:18 +0100 Subject: [PATCH] Feat(SQL, UI): 1. Calc and Get Many Stored Procedures created for Weather, Lighting Level, Assessment, Distraction Type, Distraction Intensity Level, Distraction, Bribe, Assessment Command Modality Link, Response Quality Metric, Obedience Level, and Assessment Response. \n 2. Assessments and Assessment pages created with data loading and hooked up, but not saving. --- app.py | 2 + business_objects/base.py | 1 + business_objects/dog/assessment.py | 357 ++++++ .../dog/assessment_command_modality_link.py | 513 ++++++++ business_objects/dog/assessment_response.py | 516 ++++++++ business_objects/dog/bribe.py | 190 +++ business_objects/dog/command.py | 10 + business_objects/dog/command_category.py | 13 +- business_objects/dog/command_modality.py | 190 +++ business_objects/dog/distraction.py | 655 ++++++++++ .../dog/distraction_intensity_level.py | 217 ++++ business_objects/dog/distraction_type.py | 181 +++ business_objects/dog/lighting_level.py | 180 +++ business_objects/dog/location.py | 9 + business_objects/dog/obedience_level.py | 93 +- .../dog/response_quality_metric.py | 202 +++ business_objects/dog/unit_measurement.py | 224 ++++ business_objects/dog/user.py | 42 +- business_objects/dog/weather.py | 180 +++ business_objects/file_type.py | 4 +- controllers/dog/assessment.py | 118 ++ datastores/datastore_dog.py | 470 ++++++- datastores/datastore_user.py | 2 +- forms/dog/assessment.py | 151 +++ models/model_view_accessibility_report.py | 4 +- models/model_view_accessibility_statement.py | 4 +- models/model_view_base.py | 50 +- models/model_view_dog_assessment.py | 205 +++ models/model_view_dog_base.py | 17 +- models/model_view_dog_button_icon.py | 13 +- models/model_view_dog_command.py | 13 +- models/model_view_dog_command_button_link.py | 5 +- models/model_view_dog_command_category.py | 12 +- models/model_view_dog_dog_command_link.py | 5 +- models/model_view_dog_location.py | 12 +- models/model_view_home.py | 4 +- models/model_view_license.py | 4 +- models/model_view_privacy_policy.py | 4 +- models/model_view_retention_schedule.py | 4 +- models/model_view_user.py | 4 +- static/MySQL/00000_combined.sql | 402 +++++- .../MySQL/10700_tbl_DOG_Unit_Measurement.sql | 4 +- .../MySQL/11322_tbl_DOG_Distraction_Temp.sql | 3 + ...11342_tbl_DOG_Assessment_Response_Temp.sql | 3 + .../MySQL/71304_p_dog_calc_lighting_level.sql | 8 +- .../71304_p_dog_get_many_lighting_level.sql | 8 +- .../MySQL/71308_p_dog_get_many_assessment.sql | 4 + .../MySQL/71310_p_dog_save_dog_assessment.sql | 693 ++++++++++ static/MySQL/71320_p_dog_calc_distraction.sql | 123 +- .../71320_p_dog_get_many_distraction.sql | 27 + ..._calc_assessment_command_modality_link.sql | 8 +- ..._many_assessment_command_modality_link.sql | 9 +- ...p_dog_get_many_response_quality_metric.sql | 158 +-- .../71336_p_dog_calc_obedience_level.sql | 8 +- .../71336_p_dog_get_many_obedience_level.sql | 8 +- .../71340_p_dog_calc_assessment_response.sql | 1051 +++++++++++++--- ...0_p_dog_clear_calc_assessment_response.sql | 14 +- ...340_p_dog_get_many_assessment_response.sql | 499 ++++++-- static/css/layouts/table-main.css | 74 +- static/css/pages/dog/assessment.css | 66 + static/css/pages/dog/assessments.css | 90 -- static/css/pages/dog/command_button_links.css | 4 +- static/css/pages/dog/command_categories.css | 10 +- static/css/pages/dog/commands.css | 2 +- static/css/pages/dog/dog_command_links.css | 2 +- static/css/pages/dog/dogs.css | 48 - static/dist/css/dog_assessment.bundle.css | 124 ++ static/dist/css/dog_assessment.bundle.css.map | 1 + static/dist/css/dog_assessments.bundle.css | 59 + .../dist/css/dog_assessments.bundle.css.map | 1 + .../css/dog_command_button_links.bundle.css | 4 +- .../dog_command_button_links.bundle.css.map | 2 +- .../css/dog_command_categories.bundle.css | 10 +- .../css/dog_command_categories.bundle.css.map | 2 +- static/dist/css/dog_commands.bundle.css | 2 +- static/dist/css/dog_commands.bundle.css.map | 2 +- .../dist/css/dog_dog_command_links.bundle.css | 2 +- .../css/dog_dog_command_links.bundle.css.map | 2 +- static/dist/css/dog_dogs.bundle.css | 48 - static/dist/css/dog_dogs.bundle.css.map | 2 +- static/dist/css/main.bundle.css | 74 +- static/dist/css/main.bundle.css.map | 2 +- static/dist/js/dog_assessment.bundle.js | 17 + static/dist/js/dog_assessment.bundle.js.map | 1 + static/dist/js/dog_assessments.bundle.js | 17 + static/dist/js/dog_assessments.bundle.js.map | 1 + static/dist/js/dog_dogs.bundle.js.map | 2 +- static/dist/js/main.bundle.js | 1116 ++++++++++++++--- static/dist/js/main.bundle.js.map | 2 +- .../lib/business_objects/business_objects.js | 2 +- static/js/lib/events.js | 8 + static/js/pages/base.js | 27 +- static/js/pages/base_table.js | 158 +-- static/js/pages/dog/assessment.js | 603 +++++++++ static/js/pages/dog/assessments.js | 169 +++ static/js/pages/dog/command_button_links.js | 13 +- static/js/pages/dog/dog_command_links.js | 2 +- static/js/pages/dog/locations.js | 2 +- static/js/pages/dog/mixin_table.js | 7 + static/js/router.js | 6 + .../common/buttons/_buttons_save_cancel.html | 46 +- .../components/common/buttons/_icon_add.html | 1 + .../common/buttons/_icon_trash.html | 1 + .../components/dog/_preview_DDL_bribe.html | 5 + .../dog/_preview_DDL_button_shape.html | 4 +- .../components/dog/_preview_DDL_colour.html | 4 +- .../components/dog/_preview_DDL_command.html | 4 +- .../dog/_preview_DDL_command_category.html | 4 +- .../dog/_preview_DDL_command_modality.html | 5 + ...eview_DDL_distraction_intensity_level.html | 7 + .../dog/_preview_DDL_distraction_type.html | 5 + .../components/dog/_preview_DDL_dog.html | 4 +- .../components/dog/_preview_DDL_image.html | 4 +- .../dog/_preview_DDL_lighting_level.html | 5 + .../components/dog/_preview_DDL_user.html | 7 + .../components/dog/_preview_DDL_weather.html | 5 + .../_preview_table_assessment_response.html | 11 + templates/components/dog/_row_assessment.html | 63 + ..._row_assessment_command_modality_link.html | 137 ++ .../components/dog/_row_button_icon.html | 3 +- templates/components/dog/_row_command.html | 17 +- .../dog/_row_command_button_link.html | 10 +- .../components/dog/_row_distraction.html | 93 ++ .../components/dog/_row_dog_command_link.html | 21 +- templates/components/dog/_td_notes.html | 17 + templates/layouts/layout.html | 31 +- templates/pages/dog/_assessment.html | 196 +++ templates/pages/dog/_assessments.html | 113 ++ templates/pages/dog/_button_icons.html | 2 +- .../pages/dog/_command_button_links.html | 2 +- templates/pages/dog/_command_categories.html | 2 +- templates/pages/dog/_commands.html | 2 +- templates/pages/dog/_dog_command_links.html | 2 +- templates/pages/dog/_home.html | 15 + templates/pages/dog/_locations.html | 2 +- todo.txt | 4 + webpack.config.js | 8 + 137 files changed, 10442 insertions(+), 1116 deletions(-) create mode 100644 business_objects/dog/assessment.py create mode 100644 business_objects/dog/assessment_command_modality_link.py create mode 100644 business_objects/dog/assessment_response.py create mode 100644 business_objects/dog/bribe.py create mode 100644 business_objects/dog/command_modality.py create mode 100644 business_objects/dog/distraction.py create mode 100644 business_objects/dog/distraction_intensity_level.py create mode 100644 business_objects/dog/distraction_type.py create mode 100644 business_objects/dog/lighting_level.py create mode 100644 business_objects/dog/response_quality_metric.py create mode 100644 business_objects/dog/unit_measurement.py create mode 100644 business_objects/dog/weather.py create mode 100644 controllers/dog/assessment.py create mode 100644 forms/dog/assessment.py create mode 100644 models/model_view_dog_assessment.py create mode 100644 static/MySQL/71310_p_dog_save_dog_assessment.sql create mode 100644 static/css/pages/dog/assessment.css create mode 100644 static/dist/css/dog_assessment.bundle.css create mode 100644 static/dist/css/dog_assessment.bundle.css.map create mode 100644 static/dist/css/dog_assessments.bundle.css create mode 100644 static/dist/css/dog_assessments.bundle.css.map create mode 100644 static/dist/js/dog_assessment.bundle.js create mode 100644 static/dist/js/dog_assessment.bundle.js.map create mode 100644 static/dist/js/dog_assessments.bundle.js create mode 100644 static/dist/js/dog_assessments.bundle.js.map create mode 100644 static/js/pages/dog/assessment.js create mode 100644 static/js/pages/dog/assessments.js create mode 100644 templates/components/dog/_preview_DDL_bribe.html create mode 100644 templates/components/dog/_preview_DDL_command_modality.html create mode 100644 templates/components/dog/_preview_DDL_distraction_intensity_level.html create mode 100644 templates/components/dog/_preview_DDL_distraction_type.html create mode 100644 templates/components/dog/_preview_DDL_lighting_level.html create mode 100644 templates/components/dog/_preview_DDL_user.html create mode 100644 templates/components/dog/_preview_DDL_weather.html create mode 100644 templates/components/dog/_preview_table_assessment_response.html create mode 100644 templates/components/dog/_row_assessment.html create mode 100644 templates/components/dog/_row_assessment_command_modality_link.html create mode 100644 templates/components/dog/_row_distraction.html create mode 100644 templates/components/dog/_td_notes.html create mode 100644 templates/pages/dog/_assessment.html create mode 100644 templates/pages/dog/_assessments.html diff --git a/app.py b/app.py index df38459..640f555 100644 --- a/app.py +++ b/app.py @@ -17,6 +17,7 @@ Initializes the Flask application, sets the configuration based on the environme # IMPORTS # internal 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.command import routes_dog_command from controllers.dog.command_button_link import routes_dog_command_button_link @@ -125,6 +126,7 @@ app.register_blueprint(routes_dog_home) 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_legal) app.register_blueprint(routes_user) diff --git a/business_objects/base.py b/business_objects/base.py index 3371469..c1ffa5b 100644 --- a/business_objects/base.py +++ b/business_objects/base.py @@ -62,6 +62,7 @@ class Base(): FLAG_PHONE_NUMBER: ClassVar[str] = 'phone_number' FLAG_POSTCODE: ClassVar[str] = 'postcode' FLAG_PRIORITY: ClassVar[str] = 'priority' + FLAG_QUANTITY: ClassVar[str] = 'quantity' FLAG_REGION: ClassVar[str] = 'region' FLAG_ROWS: ClassVar[str] = 'rows' FLAG_SEARCH: ClassVar[str] = 'search' diff --git a/business_objects/dog/assessment.py b/business_objects/dog/assessment.py new file mode 100644 index 0000000..1b86278 --- /dev/null +++ b/business_objects/dog/assessment.py @@ -0,0 +1,357 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Assessment Business Object +""" + +# internal +from business_objects.base import Base +from business_objects.dog.command import Command +# from business_objects.dog.command_category import Command_Category +from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base +from business_objects.dog.dog import Dog +from business_objects.dog.lighting_level import Lighting_Level +from business_objects.dog.location import Location +from business_objects.dog.obedience_level import Obedience_Level +from business_objects.dog.weather import Weather +from business_objects.dog.user import User +from extensions import db +from forms.dog.assessment import Filters_Assessment +from helpers.helper_app import Helper_App +import lib.argument_validation as av +# external +from dataclasses import dataclass +from typing import ClassVar, Optional + + +class Assessment(SQLAlchemy_ABC, Base): + ATTR_ID_ASSESSMENT: ClassVar[str] = Filters_Assessment.ATTR_ID_ASSESSMENT + FLAG_ASSESSMENT: ClassVar[str] = 'assessment' + FLAG_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = 'assessment_command_modality_link' + FLAG_DISTRACTION: ClassVar[str] = 'distraction' + FLAG_TEMPERATURE_CELCIUS: ClassVar[str] = 'temperature_celcius' + FLAG_USER_HANDLER: ClassVar[str] = Filters_Assessment.FLAG_USER_HANDLER + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT + NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_ASSESSMENT + + __tablename__ = 'DOG_Assessment' + __table_args__ = { 'extend_existing': True } + + id_assessment = db.Column(db.Integer, primary_key=True) + id_weather = db.Column(db.Integer) + id_lighting_level = db.Column(db.Integer) + id_location = db.Column(db.Integer) + id_user_handler = db.Column(db.Integer) + notes = db.Column(db.Text) + temperature_celcius = db.Column(db.Numeric(5, 2)) + # difficulty_level = db.Column(db.Float) + active = db.Column(db.Boolean) + created_on = db.Column(db.DateTime) + + def __init__(self): + self.id_assessment = 0 + self.is_new = False + self.weather = None + self.lighting_level = None + self.location = None + self.user_handler = None + self.distractions = None + self.assessment_command_modality_links = None + super().__init__() + + @classmethod + def from_db_assessment(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment' + assessment = cls() + assessment.id_assessment = query_row[0] + assessment.id_weather = query_row[1] + assessment.id_lighting_level = query_row[3] + assessment.id_location = query_row[5] + assessment.id_user_handler = query_row[7] + assessment.notes = query_row[10] + assessment.temperature_celcius = query_row[11] + assessment.active = av.input_bool(query_row[12], 'active', _m) + + assessment.weather = Weather.from_db_assessment(query_row) + assessment.lighting_level = Lighting_Level.from_db_assessment(query_row) + assessment.location = Location.from_db_assessment(query_row) + assessment.user_handler = User.from_db_assessment(query_row) + return assessment + + @classmethod + def from_db_distraction(cls, query_row): + _m = f'{cls.__qualname__}.from_db_distraction' + assessment = cls() + assessment.id_assessment = query_row[1] + return assessment + @classmethod + def from_db_assessment_command_modality_link(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment_command_modality_link' + assessment = cls() + assessment.id_assessment = query_row[1] + return assessment + + @classmethod + def from_json(cls, json): + _m = f'{cls.__qualname__}.from_json' + assessment = cls() + if json is None: return assessment + # Helper_App.console_log(f'{_m}\njson: {json}') + assessment.id_assessment = json.get(Assessment.ATTR_ID_ASSESSMENT, -1) + assessment.id_weather = json[Weather.ATTR_ID_WEATHER] + assessment.id_lighting_level = json[Lighting_Level.ATTR_ID_LIGHTING_LEVEL] + assessment.id_location = json[Location.ATTR_ID_LOCATION] + assessment.user_handler = json[cls.FLAG_USER_HANDLER] + assessment.notes = json[cls.FLAG_NOTES] + assessment.temperature_celcius = json[cls.FLAG_TEMPERATURE_CELCIUS] + assessment.active = json[cls.FLAG_ACTIVE] + assessment.created_on = json.get(cls.FLAG_CREATED_ON, None) + # assessment.id_command_category = json[Command_Category.FLAG_COMMAND_CATEGORY] + # Helper_App.console_log(f'Dog Command Link: {assessment}') + return assessment + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_ASSESSMENT: self.id_assessment + , Weather.ATTR_ID_WEATHER: { Weather.ATTR_ID_WEATHER: None } if self.weather is None else self.weather.to_json() + , Lighting_Level.ATTR_ID_LIGHTING_LEVEL: { Lighting_Level.ATTR_ID_LIGHTING_LEVEL: None } if self.lighting_level is None else self.lighting_level.to_json() + , Location.ATTR_ID_LOCATION: { Location.ATTR_ID_LOCATION: None } if self.weather is None else self.weather.to_json() + , self.FLAG_USER_HANDLER: { User.ATTR_ID_USER: None } if self.user_handler is None else self.user_handler.to_json() + , self.FLAG_NOTES: self.notes + , self.FLAG_TEMPERATURE_CELCIUS: self.temperature_celcius + , self.FLAG_ACTIVE: self.active + , self.FLAG_CREATED_ON: self.created_on + + , self.FLAG_DISTRACTION: [distraction.to_json() for distraction in self.distractions] if (self.distractions is not None and len(self.distractions) > 0) else [] + , self.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK: [link.to_json() for link in self.assessment_command_modality_links] if (self.assessment_command_modality_links is not None and len(self.assessment_command_modality_links) > 0) else [] + } + # , Command_Category.FLAG_COMMAND_CATEGORY: self.id_command_category + # Helper_App.console_log(f'as_json: {as_json}') + return as_json + + def __repr__(self): + return f''' +{self.__class__.__name__}( + {self.FLAG_ASSESSMENT}: {self.id_assessment} + {Weather.FLAG_WEATHER}: {self.weather} + {Lighting_Level.FLAG_LIGHTING_LEVEL}: {self.lighting_level} + {Location.FLAG_LOCATION}: {self.location} + {self.FLAG_USER_HANDLER}: {self.user_handler} + {self.FLAG_NOTES}: {self.notes} + {self.FLAG_TEMPERATURE_CELCIUS}: {self.temperature_celcius} + {self.FLAG_ACTIVE}: {self.active} + {self.FLAG_CREATED_ON}: {self.created_on} +) + ''' +# {Command_Category.FLAG_COMMAND_CATEGORY}: {self.id_command_category} + +class Assessment_Temp(db.Model, Base): + __tablename__ = 'DOG_Assessment_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_assessment = db.Column(db.Integer) + id_weather = db.Column(db.Integer) + id_lighting_level = db.Column(db.Integer) + id_location = db.Column(db.Integer) + id_user_handler = db.Column(db.Integer) + notes = db.Column(db.Text) + temperature_celcius = db.Column(db.Numeric(5, 2)) + # difficulty_level = db.Column(db.Float) + 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_assessment(cls, assessment): + _m = 'Assessment_Temp.from_assessment' + temp = cls() + temp.id_assessment = assessment.id_assessment + temp.id_weather = assessment.id_weather + temp.id_lighting_level = assessment.id_lighting_level + temp.id_location = assessment.id_location + temp.id_user_handler = assessment.id_user_handler + temp.notes = assessment.notes + temp.temperature_celcius = assessment.temperature_celcius + temp.active = assessment.active + # temp.created_on = assessment.created_on + return temp + + +class Parameters_Assessment(Get_Many_Parameters_Base): + get_all_assessment: bool + get_inactive_assessment: bool + ids_assessment: str + notes_assessment: str + min_temperature_assessment: Optional[float] + max_temperature_assessment: Optional[float] + get_all_weather: bool + get_inactive_weather: bool + ids_weather: str + names_weather: str + get_all_lighting_level: bool + get_inactive_lighting_level: bool + ids_lighting_level: str + names_lighting_level: str + get_all_location: bool + get_inactive_location: bool + ids_location: str + names_location: str + get_all_user_handler: bool + get_inactive_user_handler: bool + ids_user_handler: str + #auth0_ids_user_handler: str + names_user_handler: str + emails_user_handler: 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_assessment = True + , get_inactive_assessment = False + , ids_assessment = '' + , notes_assessment = '' + , min_temperature_assessment = None + , max_temperature_assessment = None + , get_all_weather = True + , get_inactive_weather = False + , ids_weather = '' + , names_weather = '' + , get_all_lighting_level = True + , get_inactive_lighting_level = False + , ids_lighting_level = '' + , names_lighting_level = '' + , get_all_location = True + , get_inactive_location = False + , ids_location = '' + , names_location = '' + , get_all_user_handler = True + , get_inactive_user_handler = False + , ids_user_handler = '' + # , auth0_ids_user_handler = '' + , names_user_handler = '' + , emails_user_handler = '' + , 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_assessment = json.get('a_get_all_assessment', False) + , get_inactive_assessment = json.get('a_get_inactive_assessment', False) + , ids_assessment = json.get('a_ids_assessment', '') + , notes_assessment = json.get('a_notes_assessment', '') + , min_temperature_assessment = json.get('a_min_temperature_assessment', None) + , max_temperature_assessment = json.get('a_max_temperature_assessment', None) + , get_all_weather = json.get('a_get_all_weather', False) + , get_inactive_weather = json.get('a_get_inactive_weather', False) + , ids_weather = json.get('a_ids_weather', '') + , names_weather = json.get('a_names_weather', '') + , get_all_lighting_level = json.get('a_get_all_lighting_level', False) + , get_inactive_lighting_level = json.get('a_get_inactive_lighting_level', False) + , ids_lighting_level = json.get('a_ids_lighting_level', '') + , names_lighting_level = json.get('a_names_lighting_level', '') + , get_all_location = json.get('a_get_all_location', False) + , get_inactive_location = json.get('a_get_inactive_location', False) + , ids_location = json.get('a_ids_location', '') + , names_location = json.get('a_names_location', '') + , get_all_user_handler = json.get('a_get_all_user_handler', False) + , get_inactive_user_handler = json.get('a_get_inactive_user_handler', False) + , ids_user_handler = json.get('a_ids_user_handler', '') + # , auth0_ids_user_handler = json.get('a_ids_user_handler', '') + , names_user_handler = json.get('a_names_user_handler', '') + , emails_user_handler = json.get('a_emails_user_handler', '') + , 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_assessment(cls, form): + _m = f'{cls.__qualname__}.from_form_filters_assessment' + Helper_App.console_log(_m) + Helper_App.console_log(f'Filters: {form}') + av.val_instance(form, 'form', _m, Filters_Assessment) + has_filter_search_text = not (form.search.data == '' or form.search.data is None) + has_filter_weather = not (form.id_weather.data == '0' or form.id_weather.data == '' or form.id_weather.data is None) + has_filter_lighting_level = not (form.id_lighting_level.data == '0' or form.id_lighting_level.data == '' or form.id_lighting_level.data is None) + has_filter_location = not (form.id_location.data == '0' or form.id_location.data == '' or form.id_location.data is None) + has_filter_user_handler = not (form.id_user_handler.data == '0' or form.id_user_handler.data == '' or form.id_user_handler.data is None) + active_only = av.input_bool(form.active_only.data, "active", _m) + Helper_App.console_log(f''' +has_filter_search_text: {has_filter_search_text} +has_filter_weather: {has_filter_weather} +has_filter_lighting_level: {has_filter_lighting_level} +has_filter_location: {has_filter_location} +has_filter_user_handler: {has_filter_user_handler} +active_only: {active_only} +''') + filters = cls.get_default() + filters.get_all_assessment = True + filters.get_inactive_assessment = not active_only + filters.ids_assessment = '' + filters.get_all_weather = not has_filter_weather + filters.get_inactive_weather = not active_only + filters.ids_weather = form.id_weather.data if has_filter_weather else '' + filters.names_weather = form.search.data if has_filter_search_text else '' + filters.get_all_lighting_level = not has_filter_lighting_level + filters.get_inactive_lighting_level = not active_only + filters.ids_lighting_level = form.id_lighting_level.data if has_filter_lighting_level else '' + filters.names_lighting_level = form.search.data if has_filter_search_text else '' + filters.get_all_location = not has_filter_location + filters.get_inactive_location = not active_only + filters.ids_location = form.id_location.data if has_filter_location else '' + filters.names_location = form.search.data if has_filter_search_text else '' + filters.get_all_user_handler = not has_filter_user_handler + filters.get_inactive_user_handler = not active_only + filters.ids_user_handler = form.id_user_handler.data if has_filter_user_handler else '' + # filters.auth0_ids_user_handler = form.id_user_handler.data if has_filter_user_handler else '' + filters.names_user_handler = form.search.data if has_filter_search_text else '' + filters.emails_user_handler = form.search.data if has_filter_search_text else '' + return filters + + def to_json(self): + return { + 'a_get_all_assessment': self.get_all_assessment + , 'a_get_inactive_assessment': self.get_inactive_assessment + , 'a_ids_assessment': self.ids_assessment + , 'a_notes_assessment': self.notes_assessment + , 'a_min_temperature_assessment': self.min_temperature_assessment + , 'a_max_temperature_assessment': self.max_temperature_assessment + , 'get_all_weather': self.get_all_weather + , 'get_inactive_weather': self.get_inactive_weather + , 'ids_weather': self.ids_weather + , 'names_weather': self.names_weather + , 'get_all_lighting_level': self.get_all_lighting_level + , 'get_inactive_lighting_level': self.get_inactive_lighting_level + , 'ids_lighting_level': self.ids_lighting_level + , 'names_lighting_level': self.names_lighting_level + , 'get_all_location': self.get_all_location + , 'get_inactive_location': self.get_inactive_location + , 'ids_location': self.ids_location + , 'names_location': self.names_location + , 'get_all_user_handler': self.get_all_user_handler + , 'get_inactive_user_handler': self.get_inactive_user_handler + , 'ids_user_handler': self.ids_user_handler + #, 'auth0_ids_user_handler': self.ids_user_handler + , 'names_user_handler': self.names_user_handler + , 'emails_user_handler': self.emails_user_handler + , '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 + } diff --git a/business_objects/dog/assessment_command_modality_link.py b/business_objects/dog/assessment_command_modality_link.py new file mode 100644 index 0000000..acaa91a --- /dev/null +++ b/business_objects/dog/assessment_command_modality_link.py @@ -0,0 +1,513 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Assessment_Command_Modality_Link Command Modality Link Business Object +""" + +# internal +from business_objects.base import Base +from business_objects.dog.assessment import Assessment +from business_objects.dog.bribe import Bribe +from business_objects.dog.command import Command +# from business_objects.dog.command_category import Command_Category +from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base +from business_objects.dog.dog import Dog +from business_objects.dog.command import Command +from business_objects.dog.command_modality import Command_Modality +from business_objects.dog.obedience_level import Obedience_Level +from business_objects.dog.user import User +from extensions import db +from forms.dog.assessment import Filters_Assessment +# from forms.dog.assessment_command_modality_link import Filters_Assessment_Command_Modality_Link +from helpers.helper_app import Helper_App +import lib.argument_validation as av +# external +from dataclasses import dataclass +from typing import ClassVar, Optional + + +class Assessment_Command_Modality_Link(SQLAlchemy_ABC, Base): + ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = 'id_link' + FLAG_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = Assessment.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK + FLAG_ASSESSMENT_RESPONSE: ClassVar[str] = 'assessment_response' + FLAG_DISTANCE_FROM_HANDLER: ClassVar[str] = 'distance-from-handler' + FLAG_IS_IN_HEARING_RANGE_OF_HANDLER: ClassVar[str] = 'is-in-hearing-range-of-handler' + FLAG_IS_IN_SCENT_RANGE_OF_HANDLER: ClassVar[str] = 'is-in-scent-range-of-handler' + FLAG_IS_IN_SIGHT_OF_HANDLER: ClassVar[str] = 'is-in-sight-of-handler' + FLAG_IS_ON_LEAD: ClassVar[str] = 'is-on-lead' + FLAG_TRIAL_COUNT: ClassVar[str] = 'trial-count' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK + NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK + + __tablename__ = 'DOG_Assessment_Command_Modality_Link' + __table_args__ = { 'extend_existing': True } + + id_link = db.Column(db.Integer, primary_key=True) + id_assessment = db.Column(db.Integer) + id_command = db.Column(db.Integer) + id_command_modality = db.Column(db.Integer) + id_bribe = db.Column(db.Integer) + distance_from_handler = db.Column(db.Float) + is_in_hearing_range_of_handler = db.Column(db.Boolean) + is_in_scent_range_of_handler = db.Column(db.Boolean) + is_in_sight_of_handler = db.Column(db.Boolean) + is_on_lead = db.Column(db.Boolean) + trial_count = db.Column(db.Integer) + active = db.Column(db.Boolean) + created_on = db.Column(db.DateTime) + + def __init__(self): + self.id_link = 0 + self.is_new = False + self.assessment = None + self.command = None + self.command_modality = None + self.bribe = None + self.assessment_responses = None + super().__init__() + + @classmethod + def from_db_assessment_command_modality_link(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment_command_modality_link' + assessment_command_modality_link = cls() + assessment_command_modality_link.id_link = query_row[0] + assessment_command_modality_link.id_assessment = query_row[1] + assessment_command_modality_link.id_command = query_row[5] + assessment_command_modality_link.id_command_modality = query_row[7] + assessment_command_modality_link.id_bribe = query_row[9] + assessment_command_modality_link.distance_from_handler = query_row[11] + assessment_command_modality_link.is_in_hearing_range_of_handler = av.input_bool(query_row[12], 'is_in_hearing_range_of_handler', _m) + assessment_command_modality_link.is_in_scent_range_of_handler = av.input_bool(query_row[13], 'is_in_scent_range_of_handler', _m) + assessment_command_modality_link.is_in_sight_of_handler = av.input_bool(query_row[14], 'is_in_sight_of_handler', _m) + assessment_command_modality_link.is_on_lead = av.input_bool(query_row[15], 'is_on_lead', _m) + assessment_command_modality_link.trial_count = query_row[16] + assessment_command_modality_link.active = av.input_bool(query_row[17], 'active', _m) + + assessment_command_modality_link.assessment = Assessment.from_db_assessment_command_modality_link(query_row) + assessment_command_modality_link.command = Command.from_db_assessment_command_modality_link(query_row) + assessment_command_modality_link.command_modality = Command_Modality.from_db_assessment_command_modality_link(query_row) + assessment_command_modality_link.bribe = Bribe.from_db_assessment_command_modality_link(query_row) + return assessment_command_modality_link + + @classmethod + def from_db_assessment_response(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment_response' + assessment_command_modality_link = cls() + assessment_command_modality_link.id_link = query_row[1] + return assessment_command_modality_link + + @classmethod + def from_json(cls, json): + _m = f'{cls.__qualname__}.from_json' + assessment_command_modality_link = cls() + if json is None: return assessment_command_modality_link + # Helper_App.console_log(f'{_m}\njson: {json}') + assessment_command_modality_link.id_link = json.get(Assessment_Command_Modality_Link.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK, -1) + assessment_command_modality_link.id_assessment = json[Assessment.ATTR_ID_ASSESSMENT] + assessment_command_modality_link.id_command = json[Command.ATTR_ID_COMMAND] + assessment_command_modality_link.id_command_modality = json[Command_Modality.ATTR_ID_COMMAND_MODALITY] + assessment_command_modality_link.id_bribe = json[Bribe.ATTR_ID_BRIBE] + assessment_command_modality_link.distance_from_handler = json[cls.FLAG_DISTANCE_FROM_HANDLER] + assessment_command_modality_link.is_in_hearing_range_of_handler = json[cls.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER] + assessment_command_modality_link.is_in_scent_range_of_handler = json[cls.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER] + assessment_command_modality_link.is_in_sight_of_handler = json[cls.FLAG_IS_IN_SIGHT_OF_HANDLER] + assessment_command_modality_link.is_on_lead = json[cls.FLAG_IS_ON_LEAD] + assessment_command_modality_link.trial_count = json[cls.FLAG_TRIAL_COUNT] + assessment_command_modality_link.active = json[cls.FLAG_ACTIVE] + assessment_command_modality_link.created_on = json.get(cls.FLAG_CREATED_ON, None) + # assessment_command_modality_link.id_command_category = json[Command_Category.FLAG_COMMAND_CATEGORY] + # Helper_App.console_log(f'Dog Command Link: {assessment_command_modality_link}') + return assessment_command_modality_link + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK: self.id_link + , Assessment.ATTR_ID_ASSESSMENT: { Assessment.ATTR_ID_ASSESSMENT: None } if self.assessment is None else self.assessment.to_json() + , Command.ATTR_ID_COMMAND: { Command.ATTR_ID_COMMAND: None } if self.command is None else self.command.to_json() + , Command_Modality.ATTR_ID_COMMAND_MODALITY: { Command_Modality.ATTR_ID_COMMAND_MODALITY: None } if self.command_modality is None else self.command_modality.to_json() + , Bribe.FLAG_BRIBE: { Bribe.FLAG_BRIBE: None } if self.bribe is None else self.bribe.to_json() + , self.FLAG_DISTANCE_FROM_HANDLER: self.distance_from_handler + , self.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER: self.is_in_hearing_range_of_handler + , self.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER: self.is_in_scent_range_of_handler + , self.FLAG_IS_IN_SIGHT_OF_HANDLER: self.is_in_sight_of_handler + , self.FLAG_IS_ON_LEAD: self.is_on_lead + , self.FLAG_TRIAL_COUNT: self.trial_count + , self.FLAG_ACTIVE: self.active + , self.FLAG_CREATED_ON: self.created_on + , self.FLAG_ASSESSMENT_RESPONSE: [] if self.assessment_responses is None else [response.to_json() for response in self.assessment_responses] + } + # , Command_Category.FLAG_COMMAND_CATEGORY: self.id_command_category + # Helper_App.console_log(f'as_json: {as_json}') + return as_json + + def __repr__(self): + return f''' +{self.__class__.__name__}( + {self.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK}: {self.id_link} + {Assessment.FLAG_ASSESSMENT}: {self.assessment} + {Command.FLAG_COMMAND}: {self.command} + {Command_Modality.FLAG_COMMAND_MODALITY}: {self.command_modality} + {Bribe.FLAG_BRIBE}: {self.bribe} + {self.FLAG_DISTANCE_FROM_HANDLER}: {self.distance_from_handler} + {self.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER}: {self.is_in_hearing_range_of_handler} + {self.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER}: {self.is_in_scent_range_of_handler} + {self.FLAG_IS_IN_SIGHT_OF_HANDLER}: {self.is_in_sight_of_handler} + {self.FLAG_IS_ON_LEAD}: {self.is_on_lead} + {self.FLAG_TRIAL_COUNT}: {self.trial_count} + {self.FLAG_ACTIVE}: {self.active} + {self.FLAG_CREATED_ON}: {self.created_on} +) + ''' +# {Command_Category.FLAG_COMMAND_CATEGORY}: {self.id_command_category} + +class Assessment_Command_Modality_Link_Temp(db.Model, Base): + __tablename__ = 'DOG_Assessment_Command_Modality_Link_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_link = db.Column(db.Integer) + id_assessment = db.Column(db.Integer) + id_command = db.Column(db.Integer) + id_command_modality = db.Column(db.Integer) + id_bribe = db.Column(db.Integer) + distance_from_handler = db.Column(db.Float) + is_in_hearing_range_of_handler = db.Column(db.Boolean) + is_in_scent_range_of_handler = db.Column(db.Boolean) + is_in_sight_of_handler = db.Column(db.Boolean) + is_on_lead = db.Column(db.Boolean) + trial_count = db.Column(db.Integer) + 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_assessment_command_modality_link(cls, assessment_command_modality_link): + _m = f'{cls.__qualname__}.from_assessment_command_modality_link' + temp = cls() + temp.id_link = assessment_command_modality_link.id_link + temp.id_assessment = assessment_command_modality_link.id_assessment + temp.id_command = assessment_command_modality_link.id_command + temp.id_command_modality = assessment_command_modality_link.id_command_modality + temp.id_bribe = assessment_command_modality_link.id_bribe + temp.distance_from_handler = assessment_command_modality_link.distance_from_handler + temp.is_in_hearing_range_of_handler = assessment_command_modality_link.is_in_hearing_range_of_handler + temp.is_in_scent_range_of_handler = assessment_command_modality_link.is_in_scent_range_of_handler + temp.is_in_sight_of_handler = assessment_command_modality_link.is_in_sight_of_handler + temp.is_on_lead = assessment_command_modality_link.is_on_lead + temp.trial_count = assessment_command_modality_link.trial_count + temp.active = assessment_command_modality_link.active + # temp.created_on = assessment_command_modality_link.created_on + return temp + + +class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base): + get_all_link: bool + get_inactive_link: bool + ids_link: str + min_distance_from_handler_link: Optional[float] + max_distance_from_handler_link: Optional[float] + value_is_in_sight_of_handler_link: Optional[bool] + value_is_in_scent_range_of_handler_link: Optional[bool] + value_is_in_hearing_range_of_handler_link: Optional[bool] + value_is_on_lead_link: Optional[bool] + min_trial_count_link: Optional[float] + max_trial_count_link: Optional[float] + + get_all_assessment: bool + get_inactive_assessment: bool + ids_assessment: str + notes_assessment: str + min_temperature_assessment: Optional[float] + max_temperature_assessment: Optional[float] + get_all_weather: bool + get_inactive_weather: bool + ids_weather: str + names_weather: str + get_all_lighting_level: bool + get_inactive_lighting_level: bool + ids_lighting_level: str + names_lighting_level: str + get_all_location: bool + get_inactive_location: bool + ids_location: str + names_location: str + get_all_user_handler: bool + get_inactive_user_handler: bool + ids_user_handler: str + #auth0_ids_user_handler: str + names_user_handler: str + emails_user_handler: str + + get_all_command_category: bool + get_inactive_command_category: bool + ids_command_category: str + names_command_category: str + get_all_command: bool + get_inactive_command: bool + ids_command: str + names_command: str + hand_signal_default_descriptions_command: str + notes_command: str + + get_all_command_modality: bool + get_inactive_command_modality: bool + ids_command_modality: str + names_command_modality: str + + get_all_bribe: bool + get_inactive_bribe: bool + ids_bribe: str + names_bribe: 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_link = True + , get_inactive_link = False + , ids_link = '' + , min_distance_from_handler_link = None + , max_distance_from_handler_link = None + , value_is_in_sight_of_handler_link = None + , value_is_in_scent_range_of_handler_link = None + , value_is_in_hearing_range_of_handler_link = None + , value_is_on_lead_link = None + , min_trial_count_link = None + , max_trial_count_link = None + + , get_all_assessment = True + , get_inactive_assessment = False + , ids_assessment = '' + , notes_assessment = '' + , min_temperature_assessment = None + , max_temperature_assessment = None + , get_all_weather = True + , get_inactive_weather = False + , ids_weather = '' + , names_weather = '' + , get_all_lighting_level = True + , get_inactive_lighting_level = False + , ids_lighting_level = '' + , names_lighting_level = '' + , get_all_location = True + , get_inactive_location = False + , ids_location = '' + , names_location = '' + , get_all_user_handler = True + , get_inactive_user_handler = False + , ids_user_handler = '' + # , auth0_ids_user_handler = '' + , names_user_handler = '' + , emails_user_handler = '' + + , get_all_command_category = True + , get_inactive_command_category = False + , ids_command_category = '' + , names_command_category = '' + , get_all_command = True + , get_inactive_command = False + , ids_command = '' + , names_command = '' + , hand_signal_default_descriptions_command = '' + , notes_command = '' + + , get_all_command_modality = True + , get_inactive_command_modality = False + , ids_command_modality = '' + , names_command_modality = '' + + , get_all_bribe = True + , get_inactive_bribe = False + , ids_bribe = '' + , names_bribe = '' + + , 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_link = json.get('a_get_all_link', False) + , get_inactive_link = json.get('a_get_inactive_link', False) + , ids_link = json.get('a_ids_link', '') + , notes_assessment_command_modality_link = json.get('a_notes_assessment_command_modality_link', '') + , min_distance_from_handler_link = json.get('a_min_distance_from_handler_link', None) + , max_distance_from_handler_link = json.get('a_max_distance_from_handler_link', None) + , value_is_in_sight_of_handler_link = json.get('a_value_is_in_sight_of_handler_link', None) + , value_is_in_scent_range_of_handler_link = json.get('a_value_is_in_scent_range_of_handler_link', None) + , value_is_in_hearing_range_of_handler_link = json.get('a_value_is_in_hearing_range_of_handler_link', None) + , value_is_on_lead_link = json.get('a_value_is_on_lead_link', None) + , min_trial_count_link = json.get('a_min_trial_count_link', None) + , max_trial_count_link = json.get('a_max_trial_count_link', None) + + , get_all_assessment = json.get('a_get_all_assessment', False) + , get_inactive_assessment = json.get('a_get_inactive_assessment', False) + , ids_assessment = json.get('a_ids_assessment', '') + , notes_assessment = json.get('a_notes_assessment', '') + , min_temperature_assessment = json.get('a_min_temperature_assessment', None) + , max_temperature_assessment = json.get('a_max_temperature_assessment', None) + , get_all_weather = json.get('a_get_all_weather', False) + , get_inactive_weather = json.get('a_get_inactive_weather', False) + , ids_weather = json.get('a_ids_weather', '') + , names_weather = json.get('a_names_weather', '') + , get_all_lighting_level = json.get('a_get_all_lighting_level', False) + , get_inactive_lighting_level = json.get('a_get_inactive_lighting_level', False) + , ids_lighting_level = json.get('a_ids_lighting_level', '') + , names_lighting_level = json.get('a_names_lighting_level', '') + , get_all_location = json.get('a_get_all_location', False) + , get_inactive_location = json.get('a_get_inactive_location', False) + , ids_location = json.get('a_ids_location', '') + , names_location = json.get('a_names_location', '') + , get_all_user_handler = json.get('a_get_all_user_handler', False) + , get_inactive_user_handler = json.get('a_get_inactive_user_handler', False) + , ids_user_handler = json.get('a_ids_user_handler', '') + # , auth0_ids_user_handler = json.get('a_ids_user_handler', '') + , names_user_handler = json.get('a_names_user_handler', '') + , emails_user_handler = json.get('a_emails_user_handler', '') + + , get_all_command_category = json.get('a_get_all_command_category', False) + , get_inactive_command_category = json.get('a_get_inactive_command_category', False) + , ids_command_category = json.get('a_ids_command_category', '') + , names_command_category = json.get('a_names_command_category', '') + , get_all_command = json.get('a_get_all_command', False) + , get_inactive_command = json.get('a_get_inactive_command', False) + , ids_command = json.get('a_ids_command', '') + , names_command = json.get('a_names_command', '') + , hand_signal_default_descriptions_command = json.get('a_hand_signal_default_descriptions_command', '') + , notes_command = json.get('a_notes_command', '') + + , get_all_command_modality = json.get('a_get_all_command_modality', False) + , get_inactive_command_modality = json.get('a_get_inactive_command_modality', False) + , ids_command_modality = json.get('a_ids_command_modality', '') + , names_command_modality = json.get('a_names_command_modality', '') + + , get_all_bribe = json.get('a_get_all_bribe', False) + , get_inactive_bribe = json.get('a_get_inactive_bribe', False) + , ids_bribe = json.get('a_ids_bribe', '') + , names_bribe = json.get('a_names_bribe', '') + + , 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_assessment(cls, form): + _m = f'{cls.__qualname__}.from_form_filters_assessment' + Helper_App.console_log(_m) + Helper_App.console_log(f'Filters: {form}') + av.val_instance(form, 'form', _m, Filters_Assessment) + has_filter_search_text = not (form.search.data == '' or form.search.data is None) + has_filter_assessment = not (form.id_assessment.data == '0' or form.id_assessment.data == '' or form.id_assessment.data is None) + has_filter_command = False + has_filter_command_modality = False + has_filter_bribe = False + active_only = av.input_bool(form.active_only.data, "active", _m) + Helper_App.console_log(f''' +has_filter_search_text: {has_filter_search_text} +has_filter_assessment: {has_filter_assessment} +has_filter_command: {has_filter_command} +has_filter_command_modality: {has_filter_command_modality} +has_filter_bribe: {has_filter_bribe} +active_only: {active_only} +''') + filters = cls.get_default() + filters.get_all_link = True + filters.get_inactive_link = not active_only + filters.ids_link = '' + filters.get_all_assessment = not has_filter_assessment + filters.get_inactive_assessment = not active_only + filters.ids_assessment = form.id_assessment.data if has_filter_assessment else '' + filters.get_all_command = not has_filter_command + filters.get_inactive_command = not active_only + filters.ids_command = '' + filters.names_command = form.search.data if has_filter_search_text else '' + filters.get_all_command_modality = not has_filter_command_modality + filters.get_inactive_command_modality = not active_only + filters.ids_command_modality = '' + filters.names_command_modality = form.search.data if has_filter_search_text else '' + filters.get_all_bribe = not has_filter_bribe + filters.get_inactive_bribe = not active_only + filters.ids_bribe = '' + filters.names_bribe = form.search.data if has_filter_search_text else '' + return filters + + def to_json(self): + return { + 'a_get_all_link': self.get_all_link + , 'a_get_inactive_link': self.get_inactive_link + , 'a_ids_link': self.ids_link + , 'a_min_distance_from_handler_link': self.min_distance_from_handler_link + , 'a_max_distance_from_handler_link': self.max_distance_from_handler_link + , 'a_value_is_in_sight_of_handler_link': self.value_is_in_sight_of_handler_link + , 'a_value_is_in_scent_range_of_handler_link': self.value_is_in_scent_range_of_handler_link + , 'a_value_is_in_hearing_range_of_handler_link': self.value_is_in_hearing_range_of_handler_link + , 'a_value_is_on_lead_link': self.value_is_on_lead_link + , 'a_min_trial_count_link': self.min_trial_count_link + , 'a_max_trial_count_link': self.max_trial_count_link + + , 'a_get_all_assessment': self.get_all_assessment + , 'a_get_inactive_assessment': self.get_inactive_assessment + , 'a_ids_assessment': self.ids_assessment + , 'a_notes_assessment': self.notes_assessment + , 'a_min_temperature_assessment': self.min_temperature_assessment + , 'a_max_temperature_assessment': self.max_temperature_assessment + , 'get_all_weather': self.get_all_weather + , 'get_inactive_weather': self.get_inactive_weather + , 'ids_weather': self.ids_weather + , 'names_weather': self.names_weather + , 'get_all_lighting_level': self.get_all_lighting_level + , 'get_inactive_lighting_level': self.get_inactive_lighting_level + , 'ids_lighting_level': self.ids_lighting_level + , 'names_lighting_level': self.names_lighting_level + , 'get_all_location': self.get_all_location + , 'get_inactive_location': self.get_inactive_location + , 'ids_location': self.ids_location + , 'names_location': self.names_location + , 'get_all_user_handler': self.get_all_user_handler + , 'get_inactive_user_handler': self.get_inactive_user_handler + , 'ids_user_handler': self.ids_user_handler + #, 'auth0_ids_user_handler': self.ids_user_handler + , 'names_user_handler': self.names_user_handler + , 'emails_user_handler': self.emails_user_handler + + , 'a_get_all_command_category': self.get_all_command_category + , 'a_get_inactive_command_category': self.get_inactive_command_category + , 'a_ids_command_category': self.ids_command_category + , 'a_names_command_category': self.names_command_category + , 'a_get_all_command': self.get_all_command + , 'a_get_inactive_command': self.get_inactive_command + , 'a_ids_command': self.ids_command + , 'a_names_command': self.names_command + , 'a_hand_signal_default_descriptions_command': self.hand_signal_default_descriptions_command + , 'a_notes_command': self.notes_command + + , 'a_get_all_command_modality': self.get_all_command_modality + , 'a_get_inactive_command_modality': self.get_inactive_command_modality + , 'a_ids_command_modality': self.ids_command_modality + , 'a_names_command_modality': self.names_command_modality + + , 'a_get_all_bribe': self.get_all_bribe + , 'a_get_inactive_bribe': self.get_inactive_bribe + , 'a_ids_bribe': self.ids_bribe + , 'a_names_bribe': self.names_bribe + + , '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 + } \ No newline at end of file diff --git a/business_objects/dog/assessment_response.py b/business_objects/dog/assessment_response.py new file mode 100644 index 0000000..a4e692f --- /dev/null +++ b/business_objects/dog/assessment_response.py @@ -0,0 +1,516 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Assessment_Response Business Object +""" + +# internal +from business_objects.base import Base +from business_objects.dog.command import Command +# from business_objects.dog.command_category import Command_Category +from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base +from business_objects.dog.dog import Dog +from business_objects.dog.response_quality_metric import Response_Quality_Metric +from business_objects.dog.obedience_level import Obedience_Level +from business_objects.dog.obedience_level import Obedience_Level +from business_objects.dog.assessment_command_modality_link import Assessment_Command_Modality_Link +from business_objects.dog.user import User +from extensions import db +from forms.dog.assessment import Filters_Assessment +from helpers.helper_app import Helper_App +import lib.argument_validation as av +# external +from dataclasses import dataclass +from typing import ClassVar, Optional + + +class Assessment_Response(SQLAlchemy_ABC, Base): + ATTR_ID_ASSESSMENT_RESPONSE: ClassVar[str] = 'id_response' + FLAG_ASSESSMENT_RESPONSE: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_ASSESSMENT_RESPONSE + FLAG_VALUE_MEASURED: ClassVar[str] = 'value-measured' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT_RESPONSE + NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_ASSESSMENT_RESPONSE + + __tablename__ = 'DOG_Assessment_Response' + __table_args__ = { 'extend_existing': True } + + id_response = db.Column(db.Integer, primary_key=True) + id_assessment_command_modality_link = db.Column(db.Integer) + id_response_quality_metric = db.Column(db.Integer) + id_obedience_level = db.Column(db.Integer) + value_measured = db.Column(db.Float) + notes = db.Column(db.Text) + active = db.Column(db.Boolean) + created_on = db.Column(db.DateTime) + + def __init__(self): + self.id_response = 0 + self.is_new = False + self.assessment_command_modality_link = None + self.response_quality_metric = None + self.obedience_level = None + super().__init__() + + @classmethod + def from_db_assessment_response(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment_response' + assessment_response = cls() + assessment_response.id_response = query_row[0] + assessment_response.id_assessment_command_modality_link = query_row[1] + assessment_response.id_response_quality_metric = query_row[2] + assessment_response.id_obedience_level = query_row[3] + assessment_response.value_measured = query_row[11] + assessment_response.notes = query_row[10] + assessment_response.active = av.input_bool(query_row[12], 'active', _m) + + assessment_response.assessment_command_modality_link = Assessment_Command_Modality_Link.from_db_assessment_response(query_row) + assessment_response.response_quality_metric = Response_Quality_Metric.from_db_assessment_response(query_row) + assessment_response.obedience_level = Obedience_Level.from_db_assessment_response(query_row) + return assessment_response + + @classmethod + def from_json(cls, json): + _m = f'{cls.__qualname__}.from_json' + assessment_response = cls() + if json is None: return assessment_response + # Helper_App.console_log(f'{_m}\njson: {json}') + assessment_response.id_response = json.get(Assessment_Response.ATTR_ID_ASSESSMENT_RESPONSE, -1) + assessment_response.id_assessment_command_modality_link = json[Assessment_Command_Modality_Link.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK] + assessment_response.id_response_quality_metric = json[Response_Quality_Metric.ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC] + assessment_response.id_obedience_level = json[Obedience_Level.ATTR_ID_OBEDIENCE_LEVEL] + assessment_response.value_measured = json[cls.FLAG_VALUE_MEASURED] + assessment_response.notes = json[cls.FLAG_NOTES] + assessment_response.active = json[cls.FLAG_ACTIVE] + assessment_response.created_on = json.get(cls.FLAG_CREATED_ON, None) + # assessment_response.id_command_category = json[Command_Category.FLAG_COMMAND_CATEGORY] + # Helper_App.console_log(f'Dog Command Link: {assessment_response}') + return assessment_response + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_ASSESSMENT_RESPONSE: self.id_response + , Assessment_Command_Modality_Link.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK: { Assessment_Command_Modality_Link.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK: None } if self.assessment_command_modality_link is None else self.assessment_command_modality_link.to_json() + , Response_Quality_Metric.ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC: { Response_Quality_Metric.ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC: None } if self.response_quality_metric is None else self.response_quality_metric.to_json() + , Obedience_Level.ATTR_ID_OBEDIENCE_LEVEL: { Obedience_Level.ATTR_ID_OBEDIENCE_LEVEL: None } if self.assessment_command_modality_link is None else self.assessment_command_modality_link.to_json() + , self.FLAG_VALUE_MEASURED: self.value_measured + , self.FLAG_NOTES: self.notes + , self.FLAG_ACTIVE: self.active + , self.FLAG_CREATED_ON: self.created_on + } + # , Command_Category.FLAG_COMMAND_CATEGORY: self.id_command_category + # Helper_App.console_log(f'as_json: {as_json}') + return as_json + + def __repr__(self): + return f''' +{self.__class__.__name__}( + {self.FLAG_ASSESSMENT_RESPONSE}: {self.id_response} + {Assessment_Command_Modality_Link.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK}: {self.assessment_command_modality_link} + {Response_Quality_Metric.FLAG_RESPONSE_QUALITY_METRIC}: {self.response_quality_metric} + {Obedience_Level.FLAG_OBEDIENCE_LEVEL}: {self.obedience_level} + {self.FLAG_VALUE_MEASURED}: {self.value_measured} + {self.FLAG_NOTES}: {self.notes} + {self.FLAG_ACTIVE}: {self.active} + {self.FLAG_CREATED_ON}: {self.created_on} +) + ''' +# {Command_Category.FLAG_COMMAND_CATEGORY}: {self.id_command_category} + +class Assessment_Response_Temp(db.Model, Base): + __tablename__ = 'DOG_Assessment_Response_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_response = db.Column(db.Integer) + id_assessment_command_modality_link = db.Column(db.Integer) + id_response_quality_metric = db.Column(db.Integer) + id_obedience_level = db.Column(db.Integer) + value_measured = db.Column(db.Float) + 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_assessment_response(cls, assessment_response): + _m = 'Assessment_Response_Temp.from_assessment_response' + temp = cls() + temp.id_response = assessment_response.id_response + temp.id_assessment_command_modality_link = assessment_response.id_assessment_command_modality_link + temp.id_response_quality_metric = assessment_response.id_response_quality_metric + temp.id_obedience_level = assessment_response.id_obedience_level + temp.value_measured = assessment_response.value_measured + temp.notes = assessment_response.notes + temp.active = assessment_response.active + # temp.created_on = assessment_response.created_on + return temp + + +class Parameters_Assessment_Response(Get_Many_Parameters_Base): + get_all_assessment_response: bool + get_inactive_assessment_response: bool + ids_assessment_response: str + notes_assessment_response: str + min_value_measured_assessment_response: Optional[float] + max_value_measured_assessment_response: Optional[float] + + get_all_ACM_link: bool + get_inactive_ACM_link: bool + ids_ACM_link: str + min_distance_from_handler_ACM_link: Optional[float] + max_distance_from_handler_ACM_link: Optional[float] + value_is_in_sight_of_handler_ACM_link: Optional[bool] + value_is_in_scent_range_of_handler_ACM_link: Optional[bool] + value_is_in_hearing_range_of_handler_ACM_link: Optional[bool] + value_is_on_lead_ACM_link: Optional[bool] + min_trial_count_ACM_link: Optional[float] + max_trial_count_ACM_link: Optional[float] + get_all_assessment: bool + get_inactive_assessment: bool + ids_assessment: str + notes_assessment: str + min_temperature_assessment: Optional[float] + max_temperature_assessment: Optional[float] + get_all_weather: bool + get_inactive_weather: bool + ids_weather: str + names_weather: str + get_all_lighting_level: bool + get_inactive_lighting_level: bool + ids_lighting_level: str + names_lighting_level: str + get_all_location: bool + get_inactive_location: bool + ids_location: str + names_location: str + get_all_user_handler: bool + get_inactive_user_handler: bool + ids_user_handler: str + #auth0_ids_user_handler: str + names_user_handler: str + emails_user_handler: str + get_all_command_category: bool + get_inactive_command_category: bool + ids_command_category: str + names_command_category: str + get_all_command: bool + get_inactive_command: bool + ids_command: str + names_command: str + hand_signal_default_descriptions_command: str + notes_command: str + get_all_command_modality: bool + get_inactive_command_modality: bool + ids_command_modality: str + names_command_modality: str + get_all_bribe: bool + get_inactive_bribe: bool + ids_bribe: str + names_bribe: str + + get_all_response_quality_metric: bool + get_inactive_response_quality_metric: bool + ids_response_quality_metric: str + names_response_quality_metric: str + + get_all_obedience_level: bool + get_inactive_obedience_level: bool + ids_obedience_level: str + names_obedience_level: 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_assessment_response = True + , get_inactive_assessment_response = False + , ids_assessment_response = '' + , notes_assessment_response = '' + , min_value_measured_assessment_response = None + , max_value_measured_assessment_response = None + + , get_all_ACM_link = True + , get_inactive_ACM_link = False + , ids_ACM_link = '' + , min_distance_from_handler_ACM_link = None + , max_distance_from_handler_ACM_link = None + , value_is_in_sight_of_handler_ACM_link = None + , value_is_in_scent_range_of_handler_ACM_link = None + , value_is_in_hearing_range_of_handler_ACM_link = None + , value_is_on_lead_ACM_link = None + , min_trial_count_ACM_link = None + , max_trial_count_ACM_link = None + , get_all_assessment = True + , get_inactive_assessment = False + , ids_assessment = '' + , notes_assessment = '' + , min_temperature_assessment = None + , max_temperature_assessment = None + , get_all_weather = True + , get_inactive_weather = False + , ids_weather = '' + , names_weather = '' + , get_all_lighting_level = True + , get_inactive_lighting_level = False + , ids_lighting_level = '' + , names_lighting_level = '' + , get_all_location = True + , get_inactive_location = False + , ids_location = '' + , names_location = '' + , get_all_user_handler = True + , get_inactive_user_handler = False + , ids_user_handler = '' + # , auth0_ids_user_handler = '' + , names_user_handler = '' + , emails_user_handler = '' + , get_all_command_category = True + , get_inactive_command_category = False + , ids_command_category = '' + , names_command_category = '' + , get_all_command = True + , get_inactive_command = False + , ids_command = '' + , names_command = '' + , hand_signal_default_descriptions_command = '' + , notes_command = '' + , get_all_command_modality = True + , get_inactive_command_modality = False + , ids_command_modality = '' + , names_command_modality = '' + , get_all_bribe = True + , get_inactive_bribe = False + , ids_bribe = '' + , names_bribe = '' + + , get_all_response_quality_metric = True + , get_inactive_response_quality_metric = False + , ids_response_quality_metric = '' + , names_response_quality_metric = '' + + , get_all_obedience_level = True + , get_inactive_obedience_level = False + , ids_obedience_level = '' + , names_obedience_level = '' + + , 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_assessment_response = json.get('a_get_all_assessment_response', False) + , get_inactive_assessment_response = json.get('a_get_inactive_assessment_response', False) + , ids_assessment_response = json.get('a_ids_assessment_response', '') + , notes_assessment_response = json.get('a_notes_assessment_response', '') + , min_value_measured_assessment_response = json.get('a_min_value_measured_assessment_response', None) + , max_value_measured_assessment_response = json.get('a_max_value_measured_assessment_response', None) + + , get_all_ACM_link = json.get('a_get_all_ACM_link', False) + , get_inactive_ACM_link = json.get('a_get_inactive_ACM_link', False) + , ids_ACM_link = json.get('a_ids_ACM_link', '') + , notes_assessment_command_modality_link = json.get('a_notes_assessment_command_modality_link', '') + , min_distance_from_handler_ACM_link = json.get('a_min_distance_from_handler_ACM_link', None) + , max_distance_from_handler_ACM_link = json.get('a_max_distance_from_handler_ACM_link', None) + , value_is_in_sight_of_handler_ACM_link = json.get('a_value_is_in_sight_of_handler_ACM_link', None) + , value_is_in_scent_range_of_handler_ACM_link = json.get('a_value_is_in_scent_range_of_handler_ACM_link', None) + , value_is_in_hearing_range_of_handler_ACM_link = json.get('a_value_is_in_hearing_range_of_handler_ACM_link', None) + , value_is_on_lead_ACM_link = json.get('a_value_is_on_lead_ACM_link', None) + , min_trial_count_ACM_link = json.get('a_min_trial_count_ACM_link', None) + , max_trial_count_ACM_link = json.get('a_max_trial_count_ACM_link', None) + , get_all_assessment = json.get('a_get_all_assessment', False) + , get_inactive_assessment = json.get('a_get_inactive_assessment', False) + , ids_assessment = json.get('a_ids_assessment', '') + , notes_assessment = json.get('a_notes_assessment', '') + , min_temperature_assessment = json.get('a_min_temperature_assessment', None) + , max_temperature_assessment = json.get('a_max_temperature_assessment', None) + , get_all_weather = json.get('a_get_all_weather', False) + , get_inactive_weather = json.get('a_get_inactive_weather', False) + , ids_weather = json.get('a_ids_weather', '') + , names_weather = json.get('a_names_weather', '') + , get_all_lighting_level = json.get('a_get_all_lighting_level', False) + , get_inactive_lighting_level = json.get('a_get_inactive_lighting_level', False) + , ids_lighting_level = json.get('a_ids_lighting_level', '') + , names_lighting_level = json.get('a_names_lighting_level', '') + , get_all_location = json.get('a_get_all_location', False) + , get_inactive_location = json.get('a_get_inactive_location', False) + , ids_location = json.get('a_ids_location', '') + , names_location = json.get('a_names_location', '') + , get_all_user_handler = json.get('a_get_all_user_handler', False) + , get_inactive_user_handler = json.get('a_get_inactive_user_handler', False) + , ids_user_handler = json.get('a_ids_user_handler', '') + # , auth0_ids_user_handler = json.get('a_ids_user_handler', '') + , names_user_handler = json.get('a_names_user_handler', '') + , emails_user_handler = json.get('a_emails_user_handler', '') + , get_all_command_category = json.get('a_get_all_command_category', False) + , get_inactive_command_category = json.get('a_get_inactive_command_category', False) + , ids_command_category = json.get('a_ids_command_category', '') + , names_command_category = json.get('a_names_command_category', '') + , get_all_command = json.get('a_get_all_command', False) + , get_inactive_command = json.get('a_get_inactive_command', False) + , ids_command = json.get('a_ids_command', '') + , names_command = json.get('a_names_command', '') + , hand_signal_default_descriptions_command = json.get('a_hand_signal_default_descriptions_command', '') + , notes_command = json.get('a_notes_command', '') + , get_all_command_modality = json.get('a_get_all_command_modality', False) + , get_inactive_command_modality = json.get('a_get_inactive_command_modality', False) + , ids_command_modality = json.get('a_ids_command_modality', '') + , names_command_modality = json.get('a_names_command_modality', '') + , get_all_bribe = json.get('a_get_all_bribe', False) + , get_inactive_bribe = json.get('a_get_inactive_bribe', False) + , ids_bribe = json.get('a_ids_bribe', '') + , names_bribe = json.get('a_names_bribe', '') + + , get_all_response_quality_metric = json.get('a_get_all_response_quality_metric', False) + , get_inactive_response_quality_metric = json.get('a_get_inactive_response_quality_metric', False) + , ids_response_quality_metric = json.get('a_ids_response_quality_metric', '') + , names_response_quality_metric = json.get('a_names_response_quality_metric', '') + + , get_all_obedience_level = json.get('a_get_all_obedience_level', False) + , get_inactive_obedience_level = json.get('a_get_inactive_obedience_level', False) + , ids_obedience_level = json.get('a_ids_obedience_level', '') + , names_obedience_level = json.get('a_names_obedience_level', '') + + , 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_assessment(cls, form): + _m = f'{cls.__qualname__}.from_form_filters_assessment' + Helper_App.console_log(_m) + Helper_App.console_log(f'Filters: {form}') + av.val_instance(form, 'form', _m, Filters_Assessment) + has_filter_search_text = not (form.search.data == '' or form.search.data is None) + has_filter_assessment_command_modality_link = False + has_filter_response_quality_metric = False + has_filter_obedience_level = False + has_filter_user_handler = False + has_filter_assessment = not (form.id_assessment.data == '' or form.id_assessment.data == '0' or form.id_assessment.data is None) + active_only = av.input_bool(form.active_only.data, "active", _m) + Helper_App.console_log(f''' +has_filter_search_text: {has_filter_search_text} +has_filter_assessment_command_modality_link: {has_filter_assessment_command_modality_link} +has_filter_response_quality_metric: {has_filter_response_quality_metric} +has_filter_obedience_level: {has_filter_obedience_level} +has_filter_user_handler: {has_filter_user_handler} +active_only: {active_only} +''') + filters = cls.get_default() + filters.get_all_assessment_response = True + filters.get_inactive_assessment_response = not active_only + filters.ids_assessment_response = '' + filters.get_all_ACM_link = not has_filter_assessment_command_modality_link + filters.get_inactive_ACM_link = not active_only + filters.ids_ACM_link = '' + filters.get_all_response_quality_metric = not has_filter_response_quality_metric + filters.get_inactive_response_quality_metric = not active_only + filters.ids_response_quality_metric = '' + filters.names_response_quality_metric = form.search.data if has_filter_search_text else '' + filters.get_all_obedience_level = not has_filter_obedience_level + filters.get_inactive_obedience_level = not active_only + filters.ids_obedience_level = '' + filters.names_obedience_level = form.search.data if has_filter_search_text else '' + filters.get_all_user_handler = not has_filter_user_handler + filters.get_inactive_user_handler = not active_only + filters.ids_user_handler = '' + # filters.auth0_ids_user_handler = form.id_user_handler.data if has_filter_user_handler else '' + filters.names_user_handler = form.search.data if has_filter_search_text else '' + filters.emails_user_handler = form.search.data if has_filter_search_text else '' + + filters.ids_assessment = form.id_assessment.data if has_filter_assessment else '' + return filters + + def to_json(self): + return { + 'a_get_all_assessment_response': self.get_all_assessment_response + , 'a_get_inactive_assessment_response': self.get_inactive_assessment_response + , 'a_ids_assessment_response': self.ids_assessment_response + , 'a_notes_assessment_response': self.notes_assessment_response + , 'a_min_value_measured_assessment_response': self.min_value_measured_assessment_response + , 'a_max_value_measured_assessment_response': self.max_value_measured_assessment_response + + , 'a_get_all_ACM_link': self.get_all_ACM_link + , 'a_get_inactive_ACM_link': self.get_inactive_ACM_link + , 'a_ids_ACM_link': self.ids_ACM_link + , 'a_min_distance_from_handler_ACM_link': self.min_distance_from_handler_ACM_link + , 'a_max_distance_from_handler_ACM_link': self.max_distance_from_handler_ACM_link + , 'a_value_is_in_sight_of_handler_ACM_link': self.value_is_in_sight_of_handler_ACM_link + , 'a_value_is_in_scent_range_of_handler_ACM_link': self.value_is_in_scent_range_of_handler_ACM_link + , 'a_value_is_in_hearing_range_of_handler_ACM_link': self.value_is_in_hearing_range_of_handler_ACM_link + , 'a_value_is_on_lead_ACM_link': self.value_is_on_lead_ACM_link + , 'a_min_trial_count_ACM_link': self.min_trial_count_ACM_link + , 'a_max_trial_count_ACM_link': self.max_trial_count_ACM_link + , 'a_get_all_assessment': self.get_all_assessment + , 'a_get_inactive_assessment': self.get_inactive_assessment + , 'a_ids_assessment': self.ids_assessment + , 'a_notes_assessment': self.notes_assessment + , 'a_min_temperature_assessment': self.min_temperature_assessment + , 'a_max_temperature_assessment': self.max_temperature_assessment + , 'get_all_weather': self.get_all_weather + , 'get_inactive_weather': self.get_inactive_weather + , 'ids_weather': self.ids_weather + , 'names_weather': self.names_weather + , 'get_all_lighting_level': self.get_all_lighting_level + , 'get_inactive_lighting_level': self.get_inactive_lighting_level + , 'ids_lighting_level': self.ids_lighting_level + , 'names_lighting_level': self.names_lighting_level + , 'get_all_location': self.get_all_location + , 'get_inactive_location': self.get_inactive_location + , 'ids_location': self.ids_location + , 'names_location': self.names_location + , 'get_all_user_handler': self.get_all_user_handler + , 'get_inactive_user_handler': self.get_inactive_user_handler + , 'ids_user_handler': self.ids_user_handler + #, 'auth0_ids_user_handler': self.ids_user_handler + , 'names_user_handler': self.names_user_handler + , 'emails_user_handler': self.emails_user_handler + , 'a_get_all_command_category': self.get_all_command_category + , 'a_get_inactive_command_category': self.get_inactive_command_category + , 'a_ids_command_category': self.ids_command_category + , 'a_names_command_category': self.names_command_category + , 'a_get_all_command': self.get_all_command + , 'a_get_inactive_command': self.get_inactive_command + , 'a_ids_command': self.ids_command + , 'a_names_command': self.names_command + , 'a_hand_signal_default_descriptions_command': self.hand_signal_default_descriptions_command + , 'a_notes_command': self.notes_command + , 'a_get_all_command_modality': self.get_all_command_modality + , 'a_get_inactive_command_modality': self.get_inactive_command_modality + , 'a_ids_command_modality': self.ids_command_modality + , 'a_names_command_modality': self.names_command_modality + , 'a_get_all_bribe': self.get_all_bribe + , 'a_get_inactive_bribe': self.get_inactive_bribe + , 'a_ids_bribe': self.ids_bribe + , 'a_names_bribe': self.names_bribe + + , 'a_get_all_response_quality_metric': self.get_all_response_quality_metric + , 'a_get_inactive_response_quality_metric': self.get_inactive_response_quality_metric + , 'a_ids_response_quality_metric': self.ids_response_quality_metric + , 'a_names_response_quality_metric': self.names_response_quality_metric + + , 'a_get_all_obedience_level': self.get_all_obedience_level + , 'a_get_inactive_obedience_level': self.get_inactive_obedience_level + , 'a_ids_obedience_level': self.ids_obedience_level + , 'a_names_obedience_level': self.names_obedience_level + + , '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 + } diff --git a/business_objects/dog/bribe.py b/business_objects/dog/bribe.py new file mode 100644 index 0000000..d356f04 --- /dev/null +++ b/business_objects/dog/bribe.py @@ -0,0 +1,190 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Bribe Business Object +""" + +# internal +from business_objects.base import Base +from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base +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 Bribe(SQLAlchemy_ABC, Base): + ATTR_ID_BRIBE: ClassVar[str] = 'id_bribe' + FLAG_BRIBE: ClassVar[str] = 'bribe' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_BRIBE + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME + + __tablename__ = 'DOG_Bribe' + __table_args__ = { 'extend_existing': True } + + id_bribe = 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_bribe = 0 + self.is_new = False + super().__init__() + + @classmethod + def from_db_bribe(cls, query_row): + _m = f'{cls.__qualname__}.from_db_bribe' + category = cls() + category.id_bribe = query_row[0] + category.code = query_row[1] + category.name = query_row[2] + category.active = av.input_bool(query_row[3], 'active', _m) + # command.created_on = query_row[7] + return category + + @classmethod + def from_db_distraction(cls, query_row): + _m = f'{cls.__qualname__}.from_db_distraction' + level = cls() + level.id_bribe = query_row[2] + level.name = query_row[3] + level.active = True + return level + + @classmethod + def from_db_assessment_command_modality_link(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment_command_modality_link' + level = cls() + level.id_bribe = query_row[9] + level.name = query_row[10] + level.active = True + return level + + @classmethod + def from_json(cls, json): + _m = 'Bribe.from_json' + bribe = cls() + if json is None: return Bribe + # Helper_App.console_log(f'{_m}\njson: {json}') + bribe.id_bribe = json.get(cls.ATTR_ID_BRIBE, -1) + bribe.name = json[cls.FLAG_NAME] + bribe.code = json.get(cls.FLAG_CODE, bribe.name.upper().replace(" ", "_")) + bribe.active = json[cls.FLAG_ACTIVE] + # Helper_App.console_log(f'Bribe: {bribe}') + return bribe + + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_BRIBE: self.id_bribe + , 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_BRIBE}: {self.id_bribe} + {self.FLAG_CODE}: {self.code} + {self.FLAG_NAME}: {self.name} + {self.FLAG_ACTIVE}: {self.active} +) + ''' + + +class Bribe_Temp(db.Model, Base): + __tablename__ = 'DOG_Bribe_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_bribe = 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_bribe(cls, bribe): + _m = 'Bribe_Temp.from_Bribe' + temp = cls() + temp.id_bribe = bribe.id_bribe + temp.code = bribe.code + temp.name = bribe.name + temp.active = bribe.active + return temp + + +class Parameters_Bribe(Get_Many_Parameters_Base): + get_all_bribe: bool + get_inactive_bribe: bool + ids_bribe: str + names_bribe: 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_bribe = True + , get_inactive_bribe = False + , ids_bribe = '' + , names_bribe = '' + , 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_bribe = json.get('a_get_all_bribe', False) + , get_inactive_bribe = json.get('a_get_inactive_bribe', False) + , ids_bribe = json.get('a_ids_bribe', '') + , names_bribe = json.get('a_names_bribe', '') + , 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_bribe(cls, form): + av.val_instance(form, 'form', 'Parameters_Bribe.from_form_filters_bribe', Filters_Bribe) + 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_Bribe.from_form_filters_bribe") + filters = cls.get_default() + filters.get_all_bribe = True + filters.get_inactive_bribe = not active_only + filters.ids_bribe = '' + filters.names_bribe = form.search.data if has_filter_search_text else '' + filters.notes_bribe = form.search.data if has_filter_search_text else '' + return filters + """ + + def to_json(self): + return { + 'a_get_all_bribe': self.get_all_bribe + , 'a_get_inactive_bribe': self.get_inactive_bribe + , 'a_ids_bribe': self.ids_bribe + , 'a_names_bribe': self.names_bribe + , '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 + } diff --git a/business_objects/dog/command.py b/business_objects/dog/command.py index bd48857..958d386 100644 --- a/business_objects/dog/command.py +++ b/business_objects/dog/command.py @@ -90,6 +90,16 @@ class Command(SQLAlchemy_ABC, Base): command.command_category = Command_Category.from_db_command_button_link(query_row) return command + @classmethod + def from_db_assessment_command_modality_link(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment_command_modality_link' + command = cls() + command.id_command = query_row[5] + command.name = query_row[6] + command.active = True + command.command_category = Command_Category.from_db_assessment_command_modality_link(query_row) + return command + @classmethod def from_json(cls, json): _m = f'{cls.__qualname__}.from_json' diff --git a/business_objects/dog/command_category.py b/business_objects/dog/command_category.py index 53ace3a..0166a78 100644 --- a/business_objects/dog/command_category.py +++ b/business_objects/dog/command_category.py @@ -66,6 +66,15 @@ class Command_Category(SQLAlchemy_ABC, Base): level.name = query_row[2] level.active = True return level + + @classmethod + def from_db_assessment_command_modality_link(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment_command_modality_link' + level = cls() + level.id_command_category = query_row[3] + level.name = query_row[4] + level.active = True + return level @classmethod def from_json(cls, json): @@ -108,7 +117,7 @@ class Command_Category_Temp(db.Model, Base): __table_args__ = { 'extend_existing': True } id_temp = db.Column(db.Integer, primary_key=True) id_command_category = db.Column(db.Integer) - # code = db.Column(db.String(250)) + code = db.Column(db.String(250)) name = db.Column(db.String(250)) active = db.Column(db.Boolean) guid: str = db.Column(db.String(36)) @@ -121,7 +130,7 @@ class Command_Category_Temp(db.Model, Base): _m = 'Command_Category_Temp.from_Command_Category' temp = cls() temp.id_command_category = command_category.id_command_category - # temp.code = command_category.code + temp.code = command_category.code temp.name = command_category.name temp.active = command_category.active return temp \ No newline at end of file diff --git a/business_objects/dog/command_modality.py b/business_objects/dog/command_modality.py new file mode 100644 index 0000000..03366a6 --- /dev/null +++ b/business_objects/dog/command_modality.py @@ -0,0 +1,190 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Command Modality Business Object +""" + +# internal +from business_objects.base import Base +from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base +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 Command_Modality(SQLAlchemy_ABC, Base): + ATTR_ID_COMMAND_MODALITY: ClassVar[str] = 'id_command_modality' + FLAG_COMMAND_MODALITY: ClassVar[str] = 'command-modality' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_COMMAND_MODALITY + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME + + __tablename__ = 'DOG_Command_Modality' + __table_args__ = { 'extend_existing': True } + + id_command_modality = 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_command_modality = 0 + self.is_new = False + super().__init__() + + @classmethod + def from_db_command_modality(cls, query_row): + _m = f'{cls.__qualname__}.from_db_command_modality' + category = cls() + category.id_command_modality = query_row[0] + category.code = query_row[1] + category.name = query_row[2] + category.active = av.input_bool(query_row[3], 'active', _m) + # command.created_on = query_row[7] + return category + + @classmethod + def from_db_distraction(cls, query_row): + _m = f'{cls.__qualname__}.from_db_distraction' + level = cls() + level.id_command_modality = query_row[2] + level.name = query_row[3] + level.active = True + return level + + @classmethod + def from_db_assessment_command_modality_link(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment_command_modality_link' + level = cls() + level.id_command_modality = query_row[7] + level.name = query_row[8] + level.active = True + return level + + @classmethod + def from_json(cls, json): + _m = 'Command_Modality.from_json' + command_modality = cls() + if json is None: return Command_Modality + # Helper_App.console_log(f'{_m}\njson: {json}') + command_modality.id_command_modality = json.get(cls.ATTR_ID_COMMAND_MODALITY, -1) + command_modality.name = json[cls.FLAG_NAME] + command_modality.code = json.get(cls.FLAG_CODE, command_modality.name.upper().replace(" ", "_")) + command_modality.active = json[cls.FLAG_ACTIVE] + # Helper_App.console_log(f'Command_Modality: {command_modality}') + return command_modality + + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_COMMAND_MODALITY: self.id_command_modality + , 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_COMMAND_MODALITY}: {self.id_command_modality} + {self.FLAG_CODE}: {self.code} + {self.FLAG_NAME}: {self.name} + {self.FLAG_ACTIVE}: {self.active} +) + ''' + + +class Command_Modality_Temp(db.Model, Base): + __tablename__ = 'DOG_Command_Modality_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_command_modality = 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_command_modality(cls, command_modality): + _m = 'Command_Modality_Temp.from_Command_Modality' + temp = cls() + temp.id_command_modality = command_modality.id_command_modality + temp.code = command_modality.code + temp.name = command_modality.name + temp.active = command_modality.active + return temp + + +class Parameters_Command_Modality(Get_Many_Parameters_Base): + get_all_command_modality: bool + get_inactive_command_modality: bool + ids_command_modality: str + names_command_modality: 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_command_modality = True + , get_inactive_command_modality = False + , ids_command_modality = '' + , names_command_modality = '' + , 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_command_modality = json.get('a_get_all_command_modality', False) + , get_inactive_command_modality = json.get('a_get_inactive_command_modality', False) + , ids_command_modality = json.get('a_ids_command_modality', '') + , names_command_modality = json.get('a_names_command_modality', '') + , 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_command_modality(cls, form): + av.val_instance(form, 'form', 'Parameters_Command_Modality.from_form_filters_command_modality', Filters_Command_Modality) + 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_Command_Modality.from_form_filters_command_modality") + filters = cls.get_default() + filters.get_all_command_modality = True + filters.get_inactive_command_modality = not active_only + filters.ids_command_modality = '' + filters.names_command_modality = form.search.data if has_filter_search_text else '' + filters.notes_command_modality = form.search.data if has_filter_search_text else '' + return filters + """ + + def to_json(self): + return { + 'a_get_all_command_modality': self.get_all_command_modality + , 'a_get_inactive_command_modality': self.get_inactive_command_modality + , 'a_ids_command_modality': self.ids_command_modality + , 'a_names_command_modality': self.names_command_modality + , '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 + } diff --git a/business_objects/dog/distraction.py b/business_objects/dog/distraction.py new file mode 100644 index 0000000..5b639af --- /dev/null +++ b/business_objects/dog/distraction.py @@ -0,0 +1,655 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Distraction 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.assessment import Assessment +from business_objects.dog.command import Command +# from business_objects.dog.command_category import Command_Category +from business_objects.dog.distraction_intensity_level import Distraction_Intensity_Level +from business_objects.dog.distraction_type import Distraction_Type +from business_objects.dog.dog import Dog +from extensions import db +from forms.dog.assessment import Filters_Assessment +# from forms.dog.distraction import Filters_Distraction +from helpers.helper_app import Helper_App +import lib.argument_validation as av +# external +from dataclasses import dataclass +from typing import ClassVar, Optional + + +class Distraction(SQLAlchemy_ABC, Base): + ATTR_ID_DISTRACTION: ClassVar[str] = 'id_distraction' + FLAG_DISTRACTION: ClassVar[str] = Assessment.FLAG_DISTRACTION + FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL: ClassVar[str] = f'{Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL}-emotional' + FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT: ClassVar[str] = f'{Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL}-scent' + FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT: ClassVar[str] = f'{Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL}-sight' + FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND: ClassVar[str] = f'{Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL}-sound' + FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH: ClassVar[str] = f'{Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL}-touch' + FLAG_PROXIMITY_METRES: ClassVar[str] = 'proximity-metres' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_DISTRACTION + NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_DISTRACTION + + __tablename__ = 'DOG_Distraction' + __table_args__ = { 'extend_existing': True } + + id_distraction = db.Column(db.Integer, primary_key=True) + id_assessment = db.Column(db.Integer) + id_distraction_type = db.Column(db.Integer) + id_intensity_level_emotional = db.Column(db.Integer) + id_intensity_level_scent = db.Column(db.Integer) + id_intensity_level_sight = db.Column(db.Integer) + id_intensity_level_sound = db.Column(db.Integer) + id_intensity_level_touch = db.Column(db.Integer) + quantity = db.Column(db.Integer) + proximity_metres = db.Column(db.Float) + notes = db.Column(db.Text) + active = db.Column(db.Boolean) + created_on = db.Column(db.DateTime) + + def __init__(self): + self.id_distraction = 0 + self.is_new = False + self.assessment = None + self.distraction_type = None + self.intensity_level_emotional = None + self.intensity_level_scent = None + self.intensity_level_sight = None + self.intensity_level_sound = None + self.intensity_level_touch = None + super().__init__() + + @classmethod + def from_db_distraction(cls, query_row): + _m = 'Distraction.from_db_distraction' + distraction = cls() + distraction.id_distraction = query_row[0] + distraction.id_assessment = query_row[1] + distraction.id_distraction_type = query_row[2] + #distraction.id_command_category = query_row[3] + distraction.id_intensity_level_emotional = query_row[4] + distraction.id_intensity_level_scent = query_row[6] + distraction.id_intensity_level_sight = query_row[8] + distraction.id_intensity_level_sound = query_row[10] + distraction.id_intensity_level_touch = query_row[12] + distraction.quantity = query_row[14] + distraction.proximity_metres = query_row[15] + distraction.notes = query_row[16] + distraction.active = av.input_bool(query_row[17], 'active', _m) + # distraction.created_on = query_row[7] + distraction.assessment = Assessment.from_db_distraction(query_row) + distraction.distraction_type = Distraction_Type.from_db_distraction(query_row) + distraction.intensity_level_emotional = Distraction_Intensity_Level.from_db_distraction_emotional(query_row) + distraction.intensity_level_scent = Distraction_Intensity_Level.from_db_distraction_scent(query_row) + distraction.intensity_level_sight = Distraction_Intensity_Level.from_db_distraction_sight(query_row) + distraction.intensity_level_sound = Distraction_Intensity_Level.from_db_distraction_sound(query_row) + distraction.intensity_level_touch = Distraction_Intensity_Level.from_db_distraction_touch(query_row) + return distraction + + @classmethod + def from_json(cls, json): + _m = 'Distraction.from_json' + distraction = cls() + if json is None: return distraction + # Helper_App.console_log(f'{_m}\njson: {json}') + distraction.id_distraction = json.get(cls.ATTR_ID_DISTRACTION, -1) + distraction.id_assessment = json[Assessment.ATTR_ID_ASSESSMENT] + distraction.id_distraction_type = json[Distraction_Type.ATTR_ID_DISTRACTION_TYPE] + distraction.id_intensity_level_emotional = json[cls.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL] + distraction.id_intensity_level_scent = json[cls.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT] + distraction.id_intensity_level_sight = json[cls.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT] + distraction.id_intensity_level_sound = json[cls.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND] + distraction.id_intensity_level_touch = json[cls.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH] + distraction.quantity = json[cls.FLAG_QUANTITY] + distraction.proximity_metres = json[cls.FLAG_PROXIMITY_METRES] + distraction.notes = json[cls.FLAG_NOTES] + distraction.active = json[cls.FLAG_ACTIVE] + distraction.created_on = json.get(cls.FLAG_CREATED_ON, None) + # distraction.id_command_category = json[Command_Category.FLAG_COMMAND_CATEGORY] + # Helper_App.console_log(f'Dog Command Link: {distraction}') + return distraction + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_DISTRACTION: self.id_distraction + , Assessment.ATTR_ID_ASSESSMENT: { Assessment.ATTR_ID_ASSESSMENT: None } if self.assessment is None else self.assessment.to_json() + , Distraction_Type.ATTR_ID_DISTRACTION_TYPE: { Distraction_Type.ATTR_ID_DISTRACTION_TYPE: None } if self.distraction_type is None else self.distraction_type.to_json() + , self.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL: { self.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL: None } if self.intensity_level_emotional is None else self.intensity_level_emotional.to_json() + , self.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT: { self.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT: None } if self.intensity_level_scent is None else self.intensity_level_scent.to_json() + , self.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT: { self.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT: None } if self.intensity_level_sight is None else self.intensity_level_sight.to_json() + , self.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND: { self.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND: None } if self.intensity_level_sound is None else self.intensity_level_sound.to_json() + , self.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH: { self.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH: None } if self.intensity_level_touch is None else self.intensity_level_touch.to_json() + , self.FLAG_QUANTITY: self.quantity + , self.FLAG_PROXIMITY_METRES: self.proximity_metres + , self.FLAG_NOTES: self.notes + , self.FLAG_ACTIVE: self.active + , self.FLAG_CREATED_ON: self.created_on + } + # , Command_Category.FLAG_COMMAND_CATEGORY: self.id_command_category + # Helper_App.console_log(f'as_json: {as_json}') + return as_json + + def __repr__(self): + return f''' +{self.__class__.__name__}( + {self.FLAG_DISTRACTION}: {self.id_distraction} + {Assessment.ATTR_ID_ASSESSMENT}: {self.id_assessment} + {Distraction_Type.ATTR_ID_DISTRACTION_TYPE}: {self.id_distraction_type} + {self.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL}: {self.intensity_level_emotional} + {self.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT}: {self.intensity_level_scent} + {self.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT}: {self.intensity_level_sight} + {self.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND}: {self.intensity_level_sound} + {self.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH}: {self.intensity_level_touch} + {self.FLAG_QUANTITY}: {self.quantity} + {self.FLAG_PROXIMITY_METRES}: {self.proximity_metres} + {self.FLAG_NOTES}: {self.notes} + {self.FLAG_ACTIVE}: {self.active} + {self.FLAG_CREATED_ON}: {self.created_on} +) + ''' +# {Command_Category.FLAG_COMMAND_CATEGORY}: {self.id_command_category} + +class Distraction_Temp(db.Model, Base): + __tablename__ = 'DOG_Distraction_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_distraction = db.Column(db.Integer) + id_assessment = db.Column(db.Integer) + id_distraction_type = db.Column(db.Integer) + id_intensity_level_emotional = db.Column(db.Integer) + id_intensity_level_scent = db.Column(db.Integer) + id_intensity_level_sight = db.Column(db.Integer) + id_intensity_level_sound = db.Column(db.Integer) + id_intensity_level_touch = db.Column(db.Integer) + quantity = db.Column(db.Integer) + proximity_metres = db.Column(db.Float) + 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_distraction(cls, distraction): + _m = 'Distraction_Temp.from_distraction' + temp = cls() + temp.id_distraction = distraction.id_distraction + temp.id_assessment = distraction.id_assessment + temp.id_distraction_type = distraction.id_distraction_type + temp.id_intensity_level_emotional = distraction.id_intensity_level_emotional + temp.id_intensity_level_scent = distraction.id_intensity_level_scent + temp.id_intensity_level_sight = distraction.id_intensity_level_sight + temp.id_intensity_level_sound = distraction.id_intensity_level_sound + temp.id_intensity_level_touch = distraction.id_intensity_level_touch + temp.quantity = distraction.quantity + temp.proximity_metres = distraction.proximity_metres + temp.notes = distraction.notes + temp.active = distraction.active + # temp.created_on = distraction.created_on + return temp + + +class Parameters_Distraction(Get_Many_Parameters_Base): + get_all_distraction: bool + get_inactive_distraction: bool + ids_distraction: str + notes_distraction: str + min_quantity_distraction: Optional[int] + max_quantity_distraction: Optional[int] + min_proximity_metres_distraction: Optional[float] + max_proximity_metres_distraction: Optional[float] + + get_all_distraction_type: bool + get_inactive_distraction_type: bool + ids_distraction_type: str + names_distraction_type: str + + get_all_distraction_intensity_level_emotional: bool + get_inactive_distraction_intensity_level_emotional: bool + ids_distraction_intensity_level_emotional: str + names_distraction_intensity_level_emotional: str + + get_all_distraction_intensity_level_scent: bool + get_inactive_distraction_intensity_level_scent: bool + ids_distraction_intensity_level_scent: str + names_distraction_intensity_level_scent: str + + get_all_distraction_intensity_level_sight: bool + get_inactive_distraction_intensity_level_sight: bool + ids_distraction_intensity_level_sight: str + names_distraction_intensity_level_sight: str + + get_all_distraction_intensity_level_sound: bool + get_inactive_distraction_intensity_level_sound: bool + ids_distraction_intensity_level_sound: str + names_distraction_intensity_level_sound: str + + get_all_distraction_intensity_level_touch: bool + get_inactive_distraction_intensity_level_touch: bool + ids_distraction_intensity_level_touch: str + names_distraction_intensity_level_touch: str + + get_all_assessment: bool + get_inactive_assessment: bool + ids_assessment: str + notes_assessment: str + min_temperature_assessment: Optional[float] + max_temperature_assessment: Optional[float] + get_all_weather: bool + get_inactive_weather: bool + ids_weather: str + names_weather: str + get_all_lighting_level: bool + get_inactive_lighting_level: bool + ids_lighting_level: str + names_lighting_level: str + get_all_location: bool + get_inactive_location: bool + ids_location: str + names_location: str + get_all_user_handler: bool + get_inactive_user_handler: bool + ids_user_handler: str + #auth0_ids_user_handler: str + names_user_handler: str + emails_user_handler: 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_distraction = True + , get_inactive_distraction = False + , ids_distraction = '' + , notes_distraction = '' + , min_quantity_distraction = None + , max_quantity_distraction = None + , min_proximity_metres_distraction = None + , max_proximity_metres_distraction = None + + , get_all_distraction_type = True + , get_inactive_distraction_type = False + , ids_distraction_type = '' + , names_distraction_type = '' + + , get_all_distraction_intensity_level_emotional = True + , get_inactive_distraction_intensity_level_emotional = False + , ids_distraction_intensity_level_emotional = '' + , names_distraction_intensity_level_emotional = '' + + , get_all_distraction_intensity_level_scent = True + , get_inactive_distraction_intensity_level_scent = False + , ids_distraction_intensity_level_scent = '' + , names_distraction_intensity_level_scent = '' + + , get_all_distraction_intensity_level_sight = True + , get_inactive_distraction_intensity_level_sight = False + , ids_distraction_intensity_level_sight = '' + , names_distraction_intensity_level_sight = '' + + , get_all_distraction_intensity_level_sound = True + , get_inactive_distraction_intensity_level_sound = False + , ids_distraction_intensity_level_sound = '' + , names_distraction_intensity_level_sound = '' + + , get_all_distraction_intensity_level_touch = True + , get_inactive_distraction_intensity_level_touch = False + , ids_distraction_intensity_level_touch = '' + , names_distraction_intensity_level_touch = '' + + , get_all_assessment = True + , get_inactive_assessment = False + , ids_assessment = '' + , notes_assessment = '' + , min_temperature_assessment = None + , max_temperature_assessment = None + , get_all_weather = True + , get_inactive_weather = False + , ids_weather = '' + , names_weather = '' + , get_all_lighting_level = True + , get_inactive_lighting_level = False + , ids_lighting_level = '' + , names_lighting_level = '' + , get_all_location = True + , get_inactive_location = False + , ids_location = '' + , names_location = '' + , get_all_user_handler = True + , get_inactive_user_handler = False + , ids_user_handler = '' + # , auth0_ids_user_handler = '' + , names_user_handler = '' + , emails_user_handler = '' + + , 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_distraction = json.get('a_get_all_distraction', False) + , get_inactive_distraction = json.get('a_get_inactive_distraction', False) + , ids_distraction = json.get('a_ids_distraction', '') + , notes_distraction = json.get('a_notes_distraction', '') + , min_quantity_distraction = json.get('a_min_quantity_distraction', None) + , max_quantity_distraction = json.get('a_max_quantity_distraction', None) + , min_proximity_metres_distraction = json.get('a_min_proximity_metres_distraction', None) + , max_proximity_metres_distraction = json.get('a_max_proximity_metres_distraction', None) + + , get_all_distraction_type = json.get('a_get_all_distraction_type', False) + , get_inactive_distraction_type = json.get('a_get_inactive_distraction_type', False) + , ids_distraction_type = json.get('a_ids_distraction_type', '') + , names_distraction_type = json.get('a_names_distraction_type', '') + + , get_all_distraction_intensity_level_emotional = json.get('a_get_all_distraction_intensity_level_emotional', False) + , get_inactive_distraction_intensity_level_emotional = json.get('a_get_inactive_distraction_intensity_level_emotional', False) + , ids_distraction_intensity_level_emotional = json.get('a_ids_distraction_intensity_level_emotional', '') + , names_distraction_intensity_level_emotional = json.get('a_names_distraction_intensity_level_emotional', '') + + , get_all_distraction_intensity_level_scent = json.get('a_get_all_distraction_intensity_level_scent', False) + , get_inactive_distraction_intensity_level_scent = json.get('a_get_inactive_distraction_intensity_level_scent', False) + , ids_distraction_intensity_level_scent = json.get('a_ids_distraction_intensity_level_scent', '') + , names_distraction_intensity_level_scent = json.get('a_names_distraction_intensity_level_scent', '') + + , get_all_distraction_intensity_level_sight = json.get('a_get_all_distraction_intensity_level_sight', False) + , get_inactive_distraction_intensity_level_sight = json.get('a_get_inactive_distraction_intensity_level_sight', False) + , ids_distraction_intensity_level_sight = json.get('a_ids_distraction_intensity_level_sight', '') + , names_distraction_intensity_level_sight = json.get('a_names_distraction_intensity_level_sight', '') + + , get_all_distraction_intensity_level_sound = json.get('a_get_all_distraction_intensity_level_sound', False) + , get_inactive_distraction_intensity_level_sound = json.get('a_get_inactive_distraction_intensity_level_sound', False) + , ids_distraction_intensity_level_sound = json.get('a_ids_distraction_intensity_level_sound', '') + , names_distraction_intensity_level_sound = json.get('a_names_distraction_intensity_level_sound', '') + + , get_all_distraction_intensity_level_touch = json.get('a_get_all_distraction_intensity_level_touch', False) + , get_inactive_distraction_intensity_level_touch = json.get('a_get_inactive_distraction_intensity_level_touch', False) + , ids_distraction_intensity_level_touch = json.get('a_ids_distraction_intensity_level_touch', '') + , names_distraction_intensity_level_touch = json.get('a_names_distraction_intensity_level_touch', '') + + , get_all_assessment = json.get('a_get_all_assessment', False) + , get_inactive_assessment = json.get('a_get_inactive_assessment', False) + , ids_assessment = json.get('a_ids_assessment', '') + , notes_assessment = json.get('a_notes_assessment', '') + , min_temperature_assessment = json.get('a_min_temperature_assessment', None) + , max_temperature_assessment = json.get('a_max_temperature_assessment', None) + , get_all_weather = json.get('a_get_all_weather', False) + , get_inactive_weather = json.get('a_get_inactive_weather', False) + , ids_weather = json.get('a_ids_weather', '') + , names_weather = json.get('a_names_weather', '') + , get_all_lighting_level = json.get('a_get_all_lighting_level', False) + , get_inactive_lighting_level = json.get('a_get_inactive_lighting_level', False) + , ids_lighting_level = json.get('a_ids_lighting_level', '') + , names_lighting_level = json.get('a_names_lighting_level', '') + , get_all_location = json.get('a_get_all_location', False) + , get_inactive_location = json.get('a_get_inactive_location', False) + , ids_location = json.get('a_ids_location', '') + , names_location = json.get('a_names_location', '') + , get_all_user_handler = json.get('a_get_all_user_handler', False) + , get_inactive_user_handler = json.get('a_get_inactive_user_handler', False) + , ids_user_handler = json.get('a_ids_user_handler', '') + # , auth0_ids_user_handler = json.get('a_ids_user_handler', '') + , names_user_handler = json.get('a_names_user_handler', '') + , emails_user_handler = json.get('a_emails_user_handler', '') + + , 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_distraction(cls, form): + _m = f'{cls.__qualname__}.from_form_filters_distraction' + Helper_App.console_log(_m) + Helper_App.console_log(f'Filters: {form}') + av.val_instance(form, 'form', _m, Filters_Distraction) + has_filter_search_text = not (form.search.data == '' or form.search.data is None) + has_filter_distraction_type = not (form.id_distraction_type.data == '0' or form.id_distraction_type.data == '' or form.id_distraction_type.data is None) + has_filter_intensity_level_emotional = not (form.id_intensity_level_emotional.data == '0' or form.id_intensity_level_emotional.data == '' or form.id_intensity_level_emotional.data is None) + has_filter_intensity_level_scent = not (form.id_intensity_level_scent.data == '0' or form.id_intensity_level_scent.data == '' or form.id_intensity_level_scent.data is None) + has_filter_intensity_level_sight = not (form.id_intensity_level_sight.data == '0' or form.id_intensity_level_sight.data == '' or form.id_intensity_level_sight.data is None) + has_filter_intensity_level_sound = not (form.id_intensity_level_sound.data == '0' or form.id_intensity_level_sound.data == '' or form.id_intensity_level_sound.data is None) + has_filter_intensity_level_touch = not (form.id_intensity_level_touch.data == '0' or form.id_intensity_level_touch.data == '' or form.id_intensity_level_touch.data is None) + + has_filter_assessment = not (form.id_assessment.data == '0' or form.id_assessment.data == '' or form.id_assessment.data is None) + has_filter_weather = not (form.id_weather.data == '0' or form.id_weather.data == '' or form.id_weather.data is None) + has_filter_lighting_level = not (form.id_lighting_level.data == '0' or form.id_lighting_level.data == '' or form.id_lighting_level.data is None) + has_filter_location = not (form.id_location.data == '0' or form.id_location.data == '' or form.id_location.data is None) + has_filter_user_handler = not (form.id_user_handler.data == '0' or form.id_user_handler.data == '' or form.id_user_handler.data is None) + active_only = av.input_bool(form.active_only.data, "active", _m) + Helper_App.console_log(f''' +has_filter_search_text: {has_filter_search_text} +has_filter_distraction_type: {has_filter_distraction_type} +has_filter_intensity_level_emotional: {has_filter_intensity_level_emotional} +has_filter_intensity_level_scent: {has_filter_intensity_level_scent} +has_filter_intensity_level_sight: {has_filter_intensity_level_sight} +has_filter_intensity_level_sound: {has_filter_intensity_level_sound} +has_filter_intensity_level_touch: {has_filter_intensity_level_touch} +has_filter_assessment: {has_filter_assessment} +has_filter_weather: {has_filter_weather} +has_filter_lighting_level: {has_filter_lighting_level} +has_filter_location: {has_filter_location} +has_filter_user_handler: {has_filter_user_handler} +active_only: {active_only} +''') + filters = cls.get_default() + filters.get_all_distraction = True + filters.get_inactive_distraction = not active_only + filters.ids_distraction = '' + filters.notes_distraction = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_type = True + filters.get_inactive_distraction_type = not active_only + filters.ids_distraction_type = form.id_distraction_type.data if has_filter_distraction_type else '' + filters.names_distraction_type = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_intensity_level_emotional = True + filters.get_inactive_distraction_intensity_level_emotional = not active_only + filters.ids_distraction_intensity_level_emotional = form.id_intensity_level_emotional.data if has_filter_intensity_level_emotional else '' + filters.names_distraction_intensity_level_emotional = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_intensity_level_scent = True + filters.get_inactive_distraction_intensity_level_scent = not active_only + filters.ids_distraction_intensity_level_scent = form.id_intensity_level_scent.data if has_filter_intensity_level_scent else '' + filters.names_distraction_intensity_level_scent = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_intensity_level_sight = True + filters.get_inactive_distraction_intensity_level_sight = not active_only + filters.ids_distraction_intensity_level_sight = form.id_intensity_level_sight.data if has_filter_intensity_level_sight else '' + filters.names_distraction_intensity_level_sight = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_intensity_level_sound = True + filters.get_inactive_distraction_intensity_level_sound = not active_only + filters.ids_distraction_intensity_level_sound = form.id_intensity_level_sound.data if has_filter_intensity_level_sound else '' + filters.names_distraction_intensity_level_sound = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_intensity_level_touch = True + filters.get_inactive_distraction_intensity_level_touch = not active_only + filters.ids_distraction_intensity_level_touch = form.id_intensity_level_touch.data if has_filter_intensity_level_touch else '' + filters.names_distraction_intensity_level_touch = form.search.data if has_filter_search_text else '' + + filters.get_all_assessment = True + filters.get_inactive_assessment = not active_only + filters.ids_assessment = form.id_assessment.data if has_filter_assessment else '' + filters.get_all_weather = not has_filter_weather + filters.get_inactive_weather = not active_only + filters.ids_weather = form.id_weather.data if has_filter_weather else '' + filters.names_weather = form.search.data if has_filter_search_text else '' + filters.get_all_lighting_level = not has_filter_lighting_level + filters.get_inactive_lighting_level = not active_only + filters.ids_lighting_level = form.id_lighting_level.data if has_filter_lighting_level else '' + filters.names_lighting_level = form.search.data if has_filter_search_text else '' + filters.get_all_location = not has_filter_location + filters.get_inactive_location = not active_only + filters.ids_location = form.id_location.data if has_filter_location else '' + filters.names_location = form.search.data if has_filter_search_text else '' + filters.get_all_user_handler = not has_filter_user_handler + filters.get_inactive_user_handler = not active_only + filters.ids_user_handler = form.id_user_handler.data if has_filter_user_handler else '' + # filters.auth0_ids_user_handler = form.id_user_handler.data if has_filter_user_handler else '' + filters.names_user_handler = form.search.data if has_filter_search_text else '' + filters.emails_user_handler = form.search.data if has_filter_search_text else '' + + return filters + """ + + @classmethod + def from_form_filters_assessment(cls, form): + _m = f'{cls.__qualname__}.from_form_filters_assessment' + Helper_App.console_log(_m) + Helper_App.console_log(f'Filters: {form}') + av.val_instance(form, 'form', _m, Filters_Assessment) + has_filter_search_text = not (form.search.data == '' or form.search.data is None) + has_filter_distraction_type = False + has_filter_intensity_level_emotional = False + has_filter_intensity_level_scent = False + has_filter_intensity_level_sight = False + has_filter_intensity_level_sound = False + has_filter_intensity_level_touch = False + + has_filter_assessment = not (form.id_assessment.data == '0' or form.id_assessment.data == '' or form.id_assessment.data is None) + active_only = av.input_bool(form.active_only.data, "active", _m) + Helper_App.console_log(f''' +has_filter_search_text: {has_filter_search_text} +has_filter_distraction_type: {has_filter_distraction_type} +has_filter_intensity_level_emotional: {has_filter_intensity_level_emotional} +has_filter_intensity_level_scent: {has_filter_intensity_level_scent} +has_filter_intensity_level_sight: {has_filter_intensity_level_sight} +has_filter_intensity_level_sound: {has_filter_intensity_level_sound} +has_filter_intensity_level_touch: {has_filter_intensity_level_touch} +has_filter_assessment: {has_filter_assessment} +active_only: {active_only} +''') + filters = cls.get_default() + filters.get_all_distraction = True + filters.get_inactive_distraction = not active_only + filters.ids_distraction = '' + filters.notes_distraction = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_type = True + filters.get_inactive_distraction_type = not active_only + filters.ids_distraction_type = '' + filters.names_distraction_type = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_intensity_level_emotional = True + filters.get_inactive_distraction_intensity_level_emotional = not active_only + filters.ids_distraction_intensity_level_emotional = '' + filters.names_distraction_intensity_level_emotional = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_intensity_level_scent = True + filters.get_inactive_distraction_intensity_level_scent = not active_only + filters.ids_distraction_intensity_level_scent = '' + filters.names_distraction_intensity_level_scent = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_intensity_level_sight = True + filters.get_inactive_distraction_intensity_level_sight = not active_only + filters.ids_distraction_intensity_level_sight = '' + filters.names_distraction_intensity_level_sight = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_intensity_level_sound = True + filters.get_inactive_distraction_intensity_level_sound = not active_only + filters.ids_distraction_intensity_level_sound = '' + filters.names_distraction_intensity_level_sound = form.search.data if has_filter_search_text else '' + + filters.get_all_distraction_intensity_level_touch = True + filters.get_inactive_distraction_intensity_level_touch = not active_only + filters.ids_distraction_intensity_level_touch = '' + filters.names_distraction_intensity_level_touch = form.search.data if has_filter_search_text else '' + + filters.get_all_assessment = True + filters.get_inactive_assessment = not active_only + filters.ids_assessment = form.id_assessment.data if has_filter_assessment else '' + + return filters + + def to_json(self): + return { + 'a_get_all_distraction': self.get_all_distraction + , 'a_get_inactive_distraction': self.get_inactive_distraction + , 'a_ids_distraction': self.ids_distraction + , 'a_notes_distraction': self.notes_distraction + , 'a_min_quantity_distraction': self.min_quantity_distraction + , 'a_max_quantity_distraction': self.max_quantity_distraction + , 'a_min_proximity_metres_distraction': self.min_proximity_metres_distraction + , 'a_max_proximity_metres_distraction': self.max_proximity_metres_distraction + + , 'a_get_all_distraction_type': self.get_all_distraction_type + , 'a_get_inactive_distraction_type': self.get_inactive_distraction_type + , 'a_ids_distraction_type': self.ids_distraction_type + , 'a_names_distraction_type': self.names_distraction_type + + , 'a_get_all_distraction_intensity_level_emotional': self.get_all_distraction_intensity_level_emotional + , 'a_get_inactive_distraction_intensity_level_emotional': self.get_inactive_distraction_intensity_level_emotional + , 'a_ids_distraction_intensity_level_emotional': self.ids_distraction_intensity_level_emotional + , 'a_names_distraction_intensity_level_emotional': self.names_distraction_intensity_level_emotional + + , 'a_get_all_distraction_intensity_level_scent': self.get_all_distraction_intensity_level_scent + , 'a_get_inactive_distraction_intensity_level_scent': self.get_inactive_distraction_intensity_level_scent + , 'a_ids_distraction_intensity_level_scent': self.ids_distraction_intensity_level_scent + , 'a_names_distraction_intensity_level_scent': self.names_distraction_intensity_level_scent + + , 'a_get_all_distraction_intensity_level_sight': self.get_all_distraction_intensity_level_sight + , 'a_get_inactive_distraction_intensity_level_sight': self.get_inactive_distraction_intensity_level_sight + , 'a_ids_distraction_intensity_level_sight': self.ids_distraction_intensity_level_sight + , 'a_names_distraction_intensity_level_sight': self.names_distraction_intensity_level_sight + + , 'a_get_all_distraction_intensity_level_sound': self.get_all_distraction_intensity_level_sound + , 'a_get_inactive_distraction_intensity_level_sound': self.get_inactive_distraction_intensity_level_sound + , 'a_ids_distraction_intensity_level_sound': self.ids_distraction_intensity_level_sound + , 'a_names_distraction_intensity_level_sound': self.names_distraction_intensity_level_sound + + , 'a_get_all_distraction_intensity_level_touch': self.get_all_distraction_intensity_level_touch + , 'a_get_inactive_distraction_intensity_level_touch': self.get_inactive_distraction_intensity_level_touch + , 'a_ids_distraction_intensity_level_touch': self.ids_distraction_intensity_level_touch + , 'a_names_distraction_intensity_level_touch': self.names_distraction_intensity_level_touch + + , 'a_get_all_assessment': self.get_all_assessment + , 'a_get_inactive_assessment': self.get_inactive_assessment + , 'a_ids_assessment': self.ids_assessment + , 'a_notes_assessment': self.notes_assessment + , 'a_min_temperature_assessment': self.min_temperature_assessment + , 'a_max_temperature_assessment': self.max_temperature_assessment + , 'get_all_weather': self.get_all_weather + , 'get_inactive_weather': self.get_inactive_weather + , 'ids_weather': self.ids_weather + , 'names_weather': self.names_weather + , 'get_all_lighting_level': self.get_all_lighting_level + , 'get_inactive_lighting_level': self.get_inactive_lighting_level + , 'ids_lighting_level': self.ids_lighting_level + , 'names_lighting_level': self.names_lighting_level + , 'get_all_location': self.get_all_location + , 'get_inactive_location': self.get_inactive_location + , 'ids_location': self.ids_location + , 'names_location': self.names_location + , 'get_all_user_handler': self.get_all_user_handler + , 'get_inactive_user_handler': self.get_inactive_user_handler + , 'ids_user_handler': self.ids_user_handler + #, 'auth0_ids_user_handler': self.ids_user_handler + , 'names_user_handler': self.names_user_handler + , 'emails_user_handler': self.emails_user_handler + + , '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 + } diff --git a/business_objects/dog/distraction_intensity_level.py b/business_objects/dog/distraction_intensity_level.py new file mode 100644 index 0000000..5ac5e51 --- /dev/null +++ b/business_objects/dog/distraction_intensity_level.py @@ -0,0 +1,217 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Distraction Intensity Level Business Object +""" + +# internal +from business_objects.base import Base +from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base +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 Distraction_Intensity_Level(SQLAlchemy_ABC, Base): + ATTR_ID_DISTRACTION_INTENSITY_LEVEL: ClassVar[str] = 'id_intensity_level' + FLAG_DISTRACTION_INTENSITY_LEVEL: ClassVar[str] = 'distraction-intensity-level' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_DISTRACTION_INTENSITY_LEVEL + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME + + __tablename__ = 'DOG_Distraction_Intensity_Level' + __table_args__ = { 'extend_existing': True } + + id_intensity_level = 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_intensity_level = 0 + self.is_new = False + super().__init__() + + @classmethod + def from_db_distraction_intensity_level(cls, query_row): + _m = f'{cls.__qualname__}.from_db_distraction_intensity_level' + category = cls() + category.id_intensity_level = query_row[0] + category.code = query_row[1] + category.name = query_row[2] + category.active = av.input_bool(query_row[3], 'active', _m) + # command.created_on = query_row[7] + return category + + @classmethod + def from_db_distraction_emotional(cls, query_row): + _m = f'{cls.__qualname__}.from_db_distraction_emotional' + level = cls() + level.id_intensity_level = query_row[4] + level.name = query_row[5] + level.active = True + return level + + @classmethod + def from_db_distraction_scent(cls, query_row): + _m = f'{cls.__qualname__}.from_db_distraction_scent' + level = cls() + level.id_intensity_level = query_row[6] + level.name = query_row[7] + level.active = True + return level + + @classmethod + def from_db_distraction_sight(cls, query_row): + _m = f'{cls.__qualname__}.from_db_distraction_sight' + level = cls() + level.id_intensity_level = query_row[8] + level.name = query_row[9] + level.active = True + return level + + @classmethod + def from_db_distraction_sound(cls, query_row): + _m = f'{cls.__qualname__}.from_db_distraction_sound' + level = cls() + level.id_intensity_level = query_row[10] + level.name = query_row[11] + level.active = True + return level + + @classmethod + def from_db_distraction_touch(cls, query_row): + _m = f'{cls.__qualname__}.from_db_distraction_touch' + level = cls() + level.id_intensity_level = query_row[12] + level.name = query_row[13] + level.active = True + return level + + @classmethod + def from_json(cls, json): + _m = 'Distraction_Intensity_Level.from_json' + distraction_intensity_level = cls() + if json is None: return Distraction_Intensity_Level + # Helper_App.console_log(f'{_m}\njson: {json}') + distraction_intensity_level.id_intensity_level = json.get(cls.ATTR_ID_DISTRACTION_INTENSITY_LEVEL, -1) + distraction_intensity_level.name = json[cls.FLAG_NAME] + distraction_intensity_level.code = json.get(cls.FLAG_CODE, distraction_intensity_level.name.upper().replace(" ", "_")) + distraction_intensity_level.active = json[cls.FLAG_ACTIVE] + # Helper_App.console_log(f'Distraction_Intensity_Level: {distraction_intensity_level}') + return distraction_intensity_level + + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_DISTRACTION_INTENSITY_LEVEL: self.id_intensity_level + , 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_DISTRACTION_INTENSITY_LEVEL}: {self.id_intensity_level} + {self.FLAG_CODE}: {self.code} + {self.FLAG_NAME}: {self.name} + {self.FLAG_ACTIVE}: {self.active} +) + ''' + + +class Distraction_Intensity_Level_Temp(db.Model, Base): + __tablename__ = 'DOG_Distraction_Intensity_Level_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_intensity_level = 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_distraction_intensity_level(cls, distraction_intensity_level): + _m = 'Distraction_Intensity_Level_Temp.from_Distraction_Intensity_Level' + temp = cls() + temp.id_intensity_level = distraction_intensity_level.id_intensity_level + temp.code = distraction_intensity_level.code + temp.name = distraction_intensity_level.name + temp.active = distraction_intensity_level.active + return temp + + +class Parameters_Distraction_Intensity_Level(Get_Many_Parameters_Base): + get_all_distraction_intensity_level: bool + get_inactive_distraction_intensity_level: bool + ids_distraction_intensity_level: str + names_distraction_intensity_level: 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_distraction_intensity_level = True + , get_inactive_distraction_intensity_level = False + , ids_distraction_intensity_level = '' + , names_distraction_intensity_level = '' + , 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_distraction_intensity_level = json.get('a_get_all_distraction_intensity_level', False) + , get_inactive_distraction_intensity_level = json.get('a_get_inactive_distraction_intensity_level', False) + , ids_distraction_intensity_level = json.get('a_ids_distraction_intensity_level', '') + , names_distraction_intensity_level = json.get('a_names_distraction_intensity_level', '') + , 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_distraction_intensity_level(cls, form): + av.val_instance(form, 'form', 'Parameters_Distraction_Intensity_Level.from_form_filters_distraction_intensity_level', Filters_Distraction_Intensity_Level) + 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_Distraction_Intensity_Level.from_form_filters_distraction_intensity_level") + filters = cls.get_default() + filters.get_all_distraction_intensity_level = True + filters.get_inactive_distraction_intensity_level = not active_only + filters.ids_distraction_intensity_level = '' + filters.names_distraction_intensity_level = form.search.data if has_filter_search_text else '' + filters.notes_distraction_intensity_level = form.search.data if has_filter_search_text else '' + return filters + """ + + def to_json(self): + return { + 'a_get_all_distraction_intensity_level': self.get_all_distraction_intensity_level + , 'a_get_inactive_distraction_intensity_level': self.get_inactive_distraction_intensity_level + , 'a_ids_distraction_intensity_level': self.ids_distraction_intensity_level + , 'a_names_distraction_intensity_level': self.names_distraction_intensity_level + , '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 + } diff --git a/business_objects/dog/distraction_type.py b/business_objects/dog/distraction_type.py new file mode 100644 index 0000000..d41aa1c --- /dev/null +++ b/business_objects/dog/distraction_type.py @@ -0,0 +1,181 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Distraction Type Business Object +""" + +# internal +from business_objects.base import Base +from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base +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 Distraction_Type(SQLAlchemy_ABC, Base): + ATTR_ID_DISTRACTION_TYPE: ClassVar[str] = 'id_distraction_type' + FLAG_DISTRACTION_TYPE: ClassVar[str] = 'distraction-type' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_DISTRACTION_TYPE + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME + + __tablename__ = 'DOG_Distraction_Type' + __table_args__ = { 'extend_existing': True } + + id_distraction_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_distraction_type = 0 + self.is_new = False + super().__init__() + + @classmethod + def from_db_distraction_type(cls, query_row): + _m = f'{cls.__qualname__}.from_db_distraction_type' + category = cls() + category.id_distraction_type = query_row[0] + category.code = query_row[1] + category.name = query_row[2] + category.active = av.input_bool(query_row[3], 'active', _m) + # command.created_on = query_row[7] + return category + + @classmethod + def from_db_distraction(cls, query_row): + _m = f'{cls.__qualname__}.from_db_distraction' + level = cls() + level.id_distraction_type = query_row[2] + level.name = query_row[3] + level.active = True + return level + + @classmethod + def from_json(cls, json): + _m = 'Distraction_Type.from_json' + distraction_type = cls() + if json is None: return Distraction_Type + # Helper_App.console_log(f'{_m}\njson: {json}') + distraction_type.id_distraction_type = json.get(cls.ATTR_ID_DISTRACTION_TYPE, -1) + distraction_type.name = json[cls.FLAG_NAME] + distraction_type.code = json.get(cls.FLAG_CODE, distraction_type.name.upper().replace(" ", "_")) + distraction_type.active = json[cls.FLAG_ACTIVE] + # Helper_App.console_log(f'Distraction_Type: {distraction_type}') + return distraction_type + + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_DISTRACTION_TYPE: self.id_distraction_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_DISTRACTION_TYPE}: {self.id_distraction_type} + {self.FLAG_CODE}: {self.code} + {self.FLAG_NAME}: {self.name} + {self.FLAG_ACTIVE}: {self.active} +) + ''' + + +class Distraction_Type_Temp(db.Model, Base): + __tablename__ = 'DOG_Distraction_Type_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_distraction_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_distraction_type(cls, distraction_type): + _m = 'Distraction_Type_Temp.from_Distraction_Type' + temp = cls() + temp.id_distraction_type = distraction_type.id_distraction_type + temp.code = distraction_type.code + temp.name = distraction_type.name + temp.active = distraction_type.active + return temp + + +class Parameters_Distraction_Type(Get_Many_Parameters_Base): + get_all_distraction_type: bool + get_inactive_distraction_type: bool + ids_distraction_type: str + names_distraction_type: 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_distraction_type = True + , get_inactive_distraction_type = False + , ids_distraction_type = '' + , names_distraction_type = '' + , 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_distraction_type = json.get('a_get_all_distraction_type', False) + , get_inactive_distraction_type = json.get('a_get_inactive_distraction_type', False) + , ids_distraction_type = json.get('a_ids_distraction_type', '') + , names_distraction_type = json.get('a_names_distraction_type', '') + , 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_distraction_type(cls, form): + av.val_instance(form, 'form', 'Parameters_Distraction_Type.from_form_filters_distraction_type', Filters_Distraction_Type) + 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_Distraction_Type.from_form_filters_distraction_type") + filters = cls.get_default() + filters.get_all_distraction_type = True + filters.get_inactive_distraction_type = not active_only + filters.ids_distraction_type = '' + filters.names_distraction_type = form.search.data if has_filter_search_text else '' + filters.notes_distraction_type = form.search.data if has_filter_search_text else '' + return filters + """ + + def to_json(self): + return { + 'a_get_all_distraction_type': self.get_all_distraction_type + , 'a_get_inactive_distraction_type': self.get_inactive_distraction_type + , 'a_ids_distraction_type': self.ids_distraction_type + , 'a_names_distraction_type': self.names_distraction_type + , '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 + } diff --git a/business_objects/dog/lighting_level.py b/business_objects/dog/lighting_level.py new file mode 100644 index 0000000..acad87f --- /dev/null +++ b/business_objects/dog/lighting_level.py @@ -0,0 +1,180 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Button Shape 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.image import Image +import lib.argument_validation as av +from extensions import db +# from forms.dog.lighting_level import Filters_Lighting_Level +from helpers.helper_app import Helper_App +# external +from dataclasses import dataclass +from typing import ClassVar + + +class Lighting_Level(SQLAlchemy_ABC, Base): + ATTR_ID_LIGHTING_LEVEL: ClassVar[str] = 'id_lighting_level' + FLAG_LIGHTING_LEVEL: ClassVar[str] = 'lighting_level' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_LIGHTING_LEVEL + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME + + __tablename__ = 'DOG_Lighting_Level' + __table_args__ = { 'extend_existing': True } + + id_lighting_level = db.Column(db.Integer, primary_key=True) + code = db.Column(db.String(250)) + name = db.Column(db.String(250)) + active = db.Column(db.Boolean) + created_on = db.Column(db.DateTime) + + def __init__(self): + self.id_lighting_level = 0 + self.is_new = False + super().__init__() + + @classmethod + def from_db_lighting_level(cls, query_row): + _m = f'{cls.__qualname__}.from_db_lighting_level' + lighting_level = cls() + lighting_level.id_lighting_level = query_row[0] + lighting_level.code = query_row[1] + lighting_level.name = query_row[2] + lighting_level.active = av.input_bool(query_row[3], 'active', _m) + return lighting_level + + @classmethod + def from_db_assessment(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment' + lighting_level = cls() + lighting_level.id_lighting_level = query_row[3] + lighting_level.name = query_row[4] + lighting_level.active = True + return lighting_level + + @classmethod + def from_json(cls, json): + _m = f'{cls.__qualname__}.from_json' + lighting_level = cls() + if json is None: return lighting_level + # Helper_App.console_log(f'{_m}\njson: {json}') + lighting_level.id_lighting_level = json.get(Lighting_Level.ATTR_ID_LIGHTING_LEVEL, -1) + lighting_level.name = json[cls.FLAG_NAME] + lighting_level.code = json.get(cls.FLAG_CODE, lighting_level.name.upper().replace(" ", "_")) + lighting_level.active = json[cls.FLAG_ACTIVE] + lighting_level.created_on = json.get(cls.FLAG_CREATED_ON, None) + # Helper_App.console_log(f'Lighting_Level: {lighting_level}') + return lighting_level + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_LIGHTING_LEVEL: self.id_lighting_level + , self.FLAG_CODE: self.code + , self.FLAG_NAME: self.name + , self.FLAG_ACTIVE: self.active + , self.FLAG_CREATED_ON: self.created_on + } + # Helper_App.console_log(f'as_json: {as_json}') + return as_json + + def __repr__(self): + return f''' +{self.__class__.__name__}( + {self.FLAG_LIGHTING_LEVEL}: {self.id_lighting_level} + {self.FLAG_CODE}: {self.code} + {self.FLAG_NAME}: {self.name} + {self.FLAG_ACTIVE}: {self.active} + {self.FLAG_CREATED_ON}: {self.created_on} +) + ''' + +class Lighting_Level_Temp(db.Model, Base): + __tablename__ = 'DOG_Lighting_Level_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_lighting_level = db.Column(db.Integer) + code = db.Column(db.String(250)) + name = db.Column(db.String(250)) + 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_lighting_level(cls, lighting_level): + _m = 'Lighting_Level_Temp.from_lighting_level' + temp = cls() + temp.id_lighting_level = lighting_level.id_lighting_level + temp.code = lighting_level.code + temp.name = lighting_level.name + temp.active = lighting_level.active + # temp.created_on = lighting_level.created_on + return temp + + def __repr__(self): + return f''' +{self.__class__.__name__}( + {Lighting_Level.FLAG_LIGHTING_LEVEL}: {self.id_lighting_level} + {self.FLAG_CODE}: {self.code} + {self.FLAG_NAME}: {self.name} + {self.FLAG_ACTIVE}: {self.active} +) + ''' + +class Parameters_Lighting_Level(Get_Many_Parameters_Base): + get_all_lighting_level: bool + get_inactive_lighting_level: bool + ids_lighting_level: str + names_lighting_level: 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_lighting_level = True + , get_inactive_lighting_level = False + , ids_lighting_level = '' + , names_lighting_level = '' + , 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_lighting_level = json.get('a_get_all_lighting_level', False) + , get_inactive_lighting_level = json.get('a_get_inactive_lighting_level', False) + , ids_lighting_level = json.get('a_ids_lighting_level', '') + , names_lighting_level = json.get('a_names_lighting_level', '') + , 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) + ) + + def to_json(self): + return { + 'a_get_all_lighting_level': self.get_all_lighting_level + , 'a_get_inactive_lighting_level': self.get_inactive_lighting_level + , 'a_ids_lighting_level': self.ids_lighting_level + , 'a_names_lighting_level': self.names_lighting_level + , '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 + } diff --git a/business_objects/dog/location.py b/business_objects/dog/location.py index 67cd389..e4180f8 100644 --- a/business_objects/dog/location.py +++ b/business_objects/dog/location.py @@ -65,6 +65,15 @@ class Location(SQLAlchemy_ABC, Base): location.name = query_row[15] location.active = True return location + + @classmethod + def from_db_assessment(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment' + location = cls() + location.id_location = query_row[5] + location.name = query_row[6] + location.active = True + return location @classmethod def from_json(cls, json): diff --git a/business_objects/dog/obedience_level.py b/business_objects/dog/obedience_level.py index 5e70ae9..1985466 100644 --- a/business_objects/dog/obedience_level.py +++ b/business_objects/dog/obedience_level.py @@ -9,7 +9,7 @@ Feature: Obedience Level Business Object # internal from business_objects.base import Base -from business_objects.db_base import SQLAlchemy_ABC +from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base import lib.argument_validation as av from extensions import db from helpers.helper_app import Helper_App @@ -21,7 +21,7 @@ from typing import ClassVar class Obedience_Level(SQLAlchemy_ABC, Base): ATTR_ID_OBEDIENCE_LEVEL: ClassVar[str] = "id_obedience_level" FLAG_OBEDIENCE_LEVEL: ClassVar[str] = 'obedience-level' - NAME_ATTR_OPTION_VALUE: ClassVar[str] = FLAG_OBEDIENCE_LEVEL + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_OBEDIENCE_LEVEL NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME __tablename__ = 'DOG_Obedience_Level' @@ -36,17 +36,26 @@ class Obedience_Level(SQLAlchemy_ABC, Base): self.id_obedience_level = 0 self.is_new = False super().__init__() - """ + @classmethod - def from_db_dog_command_link(cls, query_row): - _m = f'{cls.__qualname__}.from_db_dog_command_link' + def from_db_obedience_level(cls, query_row): + _m = f'{cls.__qualname__}.from_db_obedience_level' level = cls() - level.id_obedience_level = query_row[5] - level.code = query_row[6] - level.name = query_row[7] + level.id_obedience_level = query_row[0] + level.code = query_row[1] + level.name = query_row[2] + level.active = av.input_bool(query_row[3], "active", _m) + return level + + @classmethod + def from_db_assessment_response(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment_response' + level = cls() + level.id_obedience_level = query_row[4] + level.name = query_row[5] level.active = True return level - """ + @classmethod def from_json(cls, json): _m = f'{cls.__qualname__}.from_json' @@ -104,4 +113,68 @@ class Obedience_Level_Temp(db.Model, Base): temp.code = obedience_level.code temp.name = obedience_level.name temp.active = obedience_level.active - return temp \ No newline at end of file + return temp + + +class Parameters_Obedience_Level(Get_Many_Parameters_Base): + get_all_obedience_level: bool + get_inactive_obedience_level: bool + ids_obedience_level: str + names_obedience_level: 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_obedience_level = True + , get_inactive_obedience_level = False + , ids_obedience_level = '' + , names_obedience_level = '' + , 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_obedience_level = json.get('a_get_all_obedience_level', False) + , get_inactive_obedience_level = json.get('a_get_inactive_obedience_level', False) + , ids_obedience_level = json.get('a_ids_obedience_level', '') + , names_obedience_level = json.get('a_names_obedience_level', '') + , 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_obedience_level(cls, form): + av.val_instance(form, 'form', 'Parameters_Obedience_Level.from_form_filters_obedience_level', Filters_Obedience_Level) + 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_Obedience_Level.from_form_filters_obedience_level") + filters = cls.get_default() + filters.get_all_obedience_level = True + filters.get_inactive_obedience_level = not active_only + filters.ids_obedience_level = '' + filters.names_obedience_level = form.search.data if has_filter_search_text else '' + filters.notes_obedience_level = form.search.data if has_filter_search_text else '' + return filters + """ + + def to_json(self): + return { + 'a_get_all_obedience_level': self.get_all_obedience_level + , 'a_get_inactive_obedience_level': self.get_inactive_obedience_level + , 'a_ids_obedience_level': self.ids_obedience_level + , 'a_names_obedience_level': self.names_obedience_level + , '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 + } diff --git a/business_objects/dog/response_quality_metric.py b/business_objects/dog/response_quality_metric.py new file mode 100644 index 0000000..096b6e5 --- /dev/null +++ b/business_objects/dog/response_quality_metric.py @@ -0,0 +1,202 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Response Quality Metric 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.unit_measurement import Unit_Measurement +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 Response_Quality_Metric(SQLAlchemy_ABC, Base): + ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC: ClassVar[str] = 'id_response_quality_metric' + FLAG_RESPONSE_QUALITY_METRIC: ClassVar[str] = 'response-quality-metric' + FLAG_VALUE_MIN: ClassVar[str] = 'value-min' + FLAG_VALUE_MAX: ClassVar[str] = 'value-max' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME + + __tablename__ = 'DOG_Response_Quality_Metric' + __table_args__ = { 'extend_existing': True } + + id_response_quality_metric = db.Column(db.Integer, primary_key=True) + id_unit_measurement = db.Column(db.Integer) + code = db.Column(db.String(250)) + name = db.Column(db.String(250)) + value_min = db.Column(db.Float) + value_max = db.Column(db.Float) + active = db.Column(db.Boolean) + + def __init__(self): + self.id_response_quality_metric = 0 + self.is_new = False + self.unit_measurement = None + super().__init__() + + @classmethod + def from_db_response_quality_metric(cls, query_row): + _m = f'{cls.__qualname__}.from_db_response_quality_metric' + response = cls() + response.id_response_quality_metric = query_row[0] + response.id_unit_measurement = query_row[1] + response.code = query_row[5] + response.name = query_row[6] + response.value_min = query_row[7] + response.value_max = query_row[8] + response.active = av.input_bool(query_row[9], 'active', _m) + response.unit_measurement = Unit_Measurement.from_db_response_quality_metric(query_row) + return response + + @classmethod + def from_db_assessment_response(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment_response' + level = cls() + level.id_response_quality_metric = query_row[2] + level.name = query_row[3] + level.active = True + return level + + @classmethod + def from_json(cls, json): + _m = 'Response_Quality_Metric.from_json' + response_quality_metric = cls() + if json is None: return Response_Quality_Metric + # Helper_App.console_log(f'{_m}\njson: {json}') + response_quality_metric.id_response_quality_metric = json.get(cls.ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC, -1) + response_quality_metric.name = json[cls.FLAG_NAME] + response_quality_metric.code = json.get(cls.FLAG_CODE, response_quality_metric.name.upper().replace(" ", "_")) + response_quality_metric.value_min = json[cls.FLAG_VALUE_MIN] + response_quality_metric.value_max = json[cls.FLAG_VALUE_MAX] + response_quality_metric.active = json[cls.FLAG_ACTIVE] + # Helper_App.console_log(f'Response_Quality_Metric: {response_quality_metric}') + return response_quality_metric + + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC: self.id_response_quality_metric + , self.FLAG_CODE: self.code + , self.FLAG_NAME: f'{self.name} ({self.unit_measurement.symbol})' + , self.FLAG_VALUE_MIN: self.value_min + , self.FLAG_VALUE_MAX: self.value_max + , self.FLAG_ACTIVE: self.active + , Unit_Measurement.FLAG_UNIT_MEASUREMENT: None if self.unit_measurement is None else self.unit_measurement.to_json() + } + # Helper_App.console_log(f'as_json: {as_json}') + return as_json + + def __repr__(self): + return f''' +{self.__class__.__name__}( + {self.FLAG_RESPONSE_QUALITY_METRIC}: {self.id_response_quality_metric} + {self.FLAG_CODE}: {self.code} + {self.FLAG_NAME}: {self.name} + {self.FLAG_VALUE_MIN}: {self.value_min} + {self.FLAG_VALUE_MAX}: {self.value_max} + {self.FLAG_ACTIVE}: {self.active} +) + ''' + + +class Response_Quality_Metric_Temp(db.Model, Base): + __tablename__ = 'DOG_Response_Quality_Metric_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_response_quality_metric = db.Column(db.Integer) + code = db.Column(db.String(250)) + name = db.Column(db.String(250)) + value_min = db.Column(db.Float) + value_max = db.Column(db.Float) + active = db.Column(db.Boolean) + guid: str = db.Column(db.String(36)) + + def __init__(self): + super().__init__() + + @classmethod + def from_response_quality_metric(cls, response_quality_metric): + _m = 'Response_Quality_Metric_Temp.from_Response_Quality_Metric' + temp = cls() + temp.id_response_quality_metric = response_quality_metric.id_response_quality_metric + temp.code = response_quality_metric.code + temp.name = response_quality_metric.name + temp.value_min = response_quality_metric.value_min + temp.value_max = response_quality_metric.value_max + temp.active = response_quality_metric.active + return temp + + +class Parameters_Response_Quality_Metric(Get_Many_Parameters_Base): + get_all_response_quality_metric: bool + get_inactive_response_quality_metric: bool + ids_response_quality_metric: str + names_response_quality_metric: 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_response_quality_metric = True + , get_inactive_response_quality_metric = False + , ids_response_quality_metric = '' + , names_response_quality_metric = '' + , 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_response_quality_metric = json.get('a_get_all_response_quality_metric', False) + , get_inactive_response_quality_metric = json.get('a_get_inactive_response_quality_metric', False) + , ids_response_quality_metric = json.get('a_ids_response_quality_metric', '') + , names_response_quality_metric = json.get('a_names_response_quality_metric', '') + , 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_response_quality_metric(cls, form): + av.val_instance(form, 'form', 'Parameters_Response_Quality_Metric.from_form_filters_response_quality_metric', Filters_Response_Quality_Metric) + 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_Response_Quality_Metric.from_form_filters_response_quality_metric") + filters = cls.get_default() + filters.get_all_response_quality_metric = True + filters.get_inactive_response_quality_metric = not active_only + filters.ids_response_quality_metric = '' + filters.names_response_quality_metric = form.search.data if has_filter_search_text else '' + filters.notes_response_quality_metric = form.search.data if has_filter_search_text else '' + return filters + """ + + def to_json(self): + return { + 'a_get_all_response_quality_metric': self.get_all_response_quality_metric + , 'a_get_inactive_response_quality_metric': self.get_inactive_response_quality_metric + , 'a_ids_response_quality_metric': self.ids_response_quality_metric + , 'a_names_response_quality_metric': self.names_response_quality_metric + , '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 + } diff --git a/business_objects/dog/unit_measurement.py b/business_objects/dog/unit_measurement.py new file mode 100644 index 0000000..3af9875 --- /dev/null +++ b/business_objects/dog/unit_measurement.py @@ -0,0 +1,224 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Unit Measurement Business Object +""" + +# internal +from business_objects.base import Base +from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base +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 Unit_Measurement(SQLAlchemy_ABC, Base): + ATTR_ID_UNIT_MEASUREMENT: ClassVar[str] = "id_unit_measurement" + FLAG_IS_BASE_UNIT: ClassVar[str] = "is-base-unit" + FLAG_IS_UNIT_OF_DISTANCE: ClassVar[str] = "is-unit-of-distance" + FLAG_IS_UNIT_OF_MASS: ClassVar[str] = "is-unit-of-mass" + FLAG_IS_UNIT_OF_TIME: ClassVar[str] = "is-unit-of-time" + FLAG_IS_UNIT_OF_VOLUME: ClassVar[str] = "is-unit-of-volume" + FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX: ClassVar[str] = "symbol-is-suffix-not-prefix" + FLAG_UNIT_MEASUREMENT: ClassVar[str] = 'unit-measurement' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = FLAG_UNIT_MEASUREMENT + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_SYMBOL + + __tablename__ = 'DOG_Unit_Measurement' + __table_args__ = { 'extend_existing': True } + + id_unit_measurement = db.Column(db.Integer, primary_key=True) + name_singular = db.Column(db.String(250)) + name_plural = db.Column(db.String(250)) + symbol = db.Column(db.String(50)) + symbol_is_suffix_not_prefix = db.Column(db.Boolean) + is_base_unit = db.Column(db.Boolean) + is_unit_of_distance = db.Column(db.Boolean) + is_unit_of_mass = db.Column(db.Boolean) + is_unit_of_time = db.Column(db.Boolean) + is_unit_of_volume = db.Column(db.Boolean) + active = db.Column(db.Boolean) + + def __init__(self): + self.id_unit_measurement = 0 + self.is_new = False + super().__init__() + + @classmethod + def from_db_unit_measurement(cls, query_row): + _m = f'{cls.__qualname__}.from_db_unit_measurement' + level = cls() + level.id_unit_measurement = query_row[0] + level.name_singular = query_row[1] + level.name_plural = query_row[2] + level.symbol = query_row[3] + level.symbol_is_suffix_not_prefix = query_row[4] + level.is_base_unit = query_row[5] + level.is_unit_of_distance = query_row[6] + level.is_unit_of_mass = query_row[7] + level.is_unit_of_time = query_row[8] + level.is_unit_of_volume = query_row[9] + level.active = True + return level + + @classmethod + def from_db_response_quality_metric(cls, query_row): + _m = f'{cls.__qualname__}.from_db_response_quality_metric' + level = cls() + level.id_unit_measurement = query_row[1] + level.name_singular = query_row[2] + level.name_plural = query_row[3] + level.symbol = query_row[4] + level.active = True + return level + + @classmethod + def from_json(cls, json): + _m = f'{cls.__qualname__}.from_json' + unit_measurement = cls() + if json is None: return Unit_Measurement + Helper_App.console_log(f'{_m}\njson: {json}') + unit_measurement.id_unit_measurement = json.get(Unit_Measurement.ATTR_ID_UNIT_MEASUREMENT, -1) + unit_measurement.name_singular = json[cls.FLAG_NAME_SINGULAR] + unit_measurement.name_plural = json[cls.FLAG_NAME_PLURAL] + unit_measurement.symbol = json[cls.FLAG_SYMBOL] + unit_measurement.symbol_is_suffix_not_prefix = json[cls.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX] + unit_measurement.is_base_unit = json[cls.FLAG_IS_BASE_UNIT] + unit_measurement.is_unit_of_distance = json[cls.FLAG_IS_UNIT_OF_DISTANCE] + unit_measurement.is_unit_of_mass = json[cls.FLAG_IS_UNIT_OF_MASS] + unit_measurement.is_unit_of_time = json[cls.FLAG_IS_UNIT_OF_TIME] + unit_measurement.is_unit_of_volume = json[cls.FLAG_IS_UNIT_OF_VOLUME] + unit_measurement.active = json[cls.FLAG_ACTIVE] + Helper_App.console_log(f'Unit_Measurement: {unit_measurement}') + return unit_measurement + + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_UNIT_MEASUREMENT: self.id_unit_measurement + , self.FLAG_NAME_SINGULAR: self.name_singular + , self.FLAG_NAME_PLURAL: self.name_plural + , self.FLAG_SYMBOL: self.symbol + , self.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX: self.symbol_is_suffix_not_prefix + , self.FLAG_IS_BASE_UNIT: self.is_base_unit + , self.FLAG_IS_UNIT_OF_DISTANCE: self.is_unit_of_distance + , self.FLAG_IS_UNIT_OF_MASS: self.is_unit_of_mass + , self.FLAG_IS_UNIT_OF_TIME: self.is_unit_of_time + , self.FLAG_IS_UNIT_OF_VOLUME: self.is_unit_of_volume + , 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_UNIT_MEASUREMENT}: {self.id_unit_measurement} + {self.FLAG_NAME_SINGULAR}: {self.name_singular} + {self.FLAG_NAME_PLURAL}: {self.name_plural} + {self.FLAG_SYMBOL}: {self.symbol} + {self.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX}: {self.symbol_is_suffix_not_prefix} + {self.FLAG_IS_BASE_UNIT}: {self.is_base_unit} + {self.FLAG_IS_UNIT_OF_DISTANCE}: {self.is_unit_of_distance} + {self.FLAG_IS_UNIT_OF_MASS}: {self.is_unit_of_mass} + {self.FLAG_IS_UNIT_OF_TIME}: {self.is_unit_of_time} + {self.FLAG_IS_UNIT_OF_VOLUME}: {self.is_unit_of_volume} + {self.FLAG_ACTIVE}: {self.active} +) + ''' + + +class Unit_Measurement_Temp(db.Model, Base): + __tablename__ = 'DOG_Unit_Measurement_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_unit_measurement = 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_unit_measurement(cls, unit_measurement): + _m = 'Unit_Measurement_Temp.from_Unit_Measurement' + temp = cls() + temp.id_unit_measurement = unit_measurement.id_unit_measurement + temp.code = unit_measurement.code + temp.name = unit_measurement.name + temp.active = unit_measurement.active + return temp + +""" +class Parameters_Unit_Measurement(Get_Many_Parameters_Base): + get_all_unit_measurement: bool + get_inactive_unit_measurement: bool + ids_unit_measurement: str + names_unit_measurement: 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_unit_measurement = True + , get_inactive_unit_measurement = False + , ids_unit_measurement = '' + , names_unit_measurement = '' + , 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_unit_measurement = json.get('a_get_all_unit_measurement', False) + , get_inactive_unit_measurement = json.get('a_get_inactive_unit_measurement', False) + , ids_unit_measurement = json.get('a_ids_unit_measurement', '') + , names_unit_measurement = json.get('a_names_unit_measurement', '') + , 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_unit_measurement(cls, form): + av.val_instance(form, 'form', 'Parameters_Unit_Measurement.from_form_filters_unit_measurement', Filters_Unit_Measurement) + 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_Unit_Measurement.from_form_filters_unit_measurement") + filters = cls.get_default() + filters.get_all_unit_measurement = True + filters.get_inactive_unit_measurement = not active_only + filters.ids_unit_measurement = '' + filters.names_unit_measurement = form.search.data if has_filter_search_text else '' + filters.notes_unit_measurement = form.search.data if has_filter_search_text else '' + return filters + "" " + + def to_json(self): + return { + 'a_get_all_unit_measurement': self.get_all_unit_measurement + , 'a_get_inactive_unit_measurement': self.get_inactive_unit_measurement + , 'a_ids_unit_measurement': self.ids_unit_measurement + , 'a_names_unit_measurement': self.names_unit_measurement + , '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 + } +""" \ No newline at end of file diff --git a/business_objects/dog/user.py b/business_objects/dog/user.py index eba19a3..f4397d3 100644 --- a/business_objects/dog/user.py +++ b/business_objects/dog/user.py @@ -21,7 +21,7 @@ from typing import ClassVar, Optional class User(SQLAlchemy_ABC, Base): NAME_ATTR_OPTION_VALUE: ClassVar[str] = Base.ATTR_ID_USER - NAME_ATTR_OPTION_TEXT: ClassVar[str] = 'email' + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME __tablename__ = 'DOG_User' __table_args__ = { 'extend_existing': True } @@ -41,10 +41,11 @@ class User(SQLAlchemy_ABC, Base): self.can_admin_dog = False self.can_admin_user = False super().__init__() - - def from_DB_user(query_row): - _m = 'User.from_DB_user' - user = User() + + @classmethod + def from_db_user(cls, query_row): + _m = f'{cls.__qualname__}.from_db_user' + user = cls() user.id_user = query_row[0] user.id_user_auth0 = query_row[1] user.firstname = query_row[2] @@ -56,6 +57,15 @@ class User(SQLAlchemy_ABC, Base): user.can_admin_user = av.input_bool(query_row[8], 'can_admin_user', _m) # user.is_new = av.input_bool(query_row[9], 'is_new', _m) return user + + @classmethod + def from_db_assessment(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment' + user = cls() + user.id_user = query_row[7] + user.firstname = query_row[8] + user.surname = query_row[9] + return user @staticmethod def from_json(json): @@ -98,14 +108,15 @@ class User(SQLAlchemy_ABC, Base): def to_json(self): as_json = { - **self.get_shared_json_attributes(self), - 'id_user': self.id_user, - 'id_user_auth0': self.id_user_auth0, - 'firstname': self.firstname, - 'surname': self.surname, - 'email': self.email, - 'is_email_verified': self.is_email_verified, - 'is_super_user': self.is_super_user + **self.get_shared_json_attributes(self) + , 'id_user': self.id_user + , 'id_user_auth0': self.id_user_auth0 + , 'firstname': self.firstname + , 'surname': self.surname + , self.FLAG_NAME: self.get_name() + , 'email': self.email + , 'is_email_verified': self.is_email_verified + , 'is_super_user': self.is_super_user } Helper_App.console_log(f'as_json: {as_json}') return as_json @@ -123,6 +134,9 @@ class User(SQLAlchemy_ABC, Base): def get_is_logged_in(self): return (self.id_user > 0 and self.id_user != Base.ID_USER_GUEST) + + def get_name(self): + return f'{self.firstname} {self.surname}' class User_Temp(db.Model, Base): __tablename__ = 'DOG_User_Temp' @@ -238,7 +252,7 @@ class User_Permission_Evaluation(db.Model): can_edit = db.Column(db.Boolean) can_admin = db.Column(db.Boolean) - def from_DB_user_eval(query_row): + def from_db_user_eval(query_row): user_permission_evaluation = User_Permission_Evaluation() user_permission_evaluation.id_evaluation = query_row[0] user_permission_evaluation.guid = query_row[1] diff --git a/business_objects/dog/weather.py b/business_objects/dog/weather.py new file mode 100644 index 0000000..4c11693 --- /dev/null +++ b/business_objects/dog/weather.py @@ -0,0 +1,180 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Button Shape 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.image import Image +import lib.argument_validation as av +from extensions import db +# from forms.dog.weather import Filters_Weather +from helpers.helper_app import Helper_App +# external +from dataclasses import dataclass +from typing import ClassVar + + +class Weather(SQLAlchemy_ABC, Base): + ATTR_ID_WEATHER: ClassVar[str] = 'id_weather' + FLAG_WEATHER: ClassVar[str] = 'weather' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_WEATHER + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME + + __tablename__ = 'DOG_Weather' + __table_args__ = { 'extend_existing': True } + + id_weather = db.Column(db.Integer, primary_key=True) + code = db.Column(db.String(250)) + name = db.Column(db.String(250)) + active = db.Column(db.Boolean) + created_on = db.Column(db.DateTime) + + def __init__(self): + self.id_weather = 0 + self.is_new = False + super().__init__() + + @classmethod + def from_db_weather(cls, query_row): + _m = f'{cls.__qualname__}.from_db_weather' + weather = cls() + weather.id_weather = query_row[0] + weather.code = query_row[1] + weather.name = query_row[2] + weather.active = av.input_bool(query_row[3], 'active', _m) + return weather + + @classmethod + def from_db_assessment(cls, query_row): + _m = f'{cls.__qualname__}.from_db_assessment' + weather = cls() + weather.id_weather = query_row[1] + weather.name = query_row[2] + weather.active = True + return weather + + @classmethod + def from_json(cls, json): + _m = f'{cls.__qualname__}.from_json' + weather = cls() + if json is None: return weather + # Helper_App.console_log(f'{_m}\njson: {json}') + weather.id_weather = json.get(Weather.ATTR_ID_WEATHER, -1) + weather.name = json[cls.FLAG_NAME] + weather.code = json.get(cls.FLAG_CODE, weather.name.upper().replace(" ", "_")) + weather.active = json[cls.FLAG_ACTIVE] + weather.created_on = json.get(cls.FLAG_CREATED_ON, None) + # Helper_App.console_log(f'Weather: {weather}') + return weather + + def to_json(self): + as_json = { + **self.get_shared_json_attributes(self) + , self.ATTR_ID_WEATHER: self.id_weather + , self.FLAG_CODE: self.code + , self.FLAG_NAME: self.name + , self.FLAG_ACTIVE: self.active + , self.FLAG_CREATED_ON: self.created_on + } + # Helper_App.console_log(f'as_json: {as_json}') + return as_json + + def __repr__(self): + return f''' +{self.__class__.__name__}( + {self.FLAG_WEATHER}: {self.id_weather} + {self.FLAG_CODE}: {self.code} + {self.FLAG_NAME}: {self.name} + {self.FLAG_ACTIVE}: {self.active} + {self.FLAG_CREATED_ON}: {self.created_on} +) + ''' + +class Weather_Temp(db.Model, Base): + __tablename__ = 'DOG_Weather_Temp' + __table_args__ = { 'extend_existing': True } + id_temp = db.Column(db.Integer, primary_key=True) + id_weather = db.Column(db.Integer) + code = db.Column(db.String(250)) + name = db.Column(db.String(250)) + 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_weather(cls, weather): + _m = 'Weather_Temp.from_weather' + temp = cls() + temp.id_weather = weather.id_weather + temp.code = weather.code + temp.name = weather.name + temp.active = weather.active + # temp.created_on = weather.created_on + return temp + + def __repr__(self): + return f''' +{self.__class__.__name__}( + {Weather.FLAG_WEATHER}: {self.id_weather} + {self.FLAG_CODE}: {self.code} + {self.FLAG_NAME}: {self.name} + {self.FLAG_ACTIVE}: {self.active} +) + ''' + +class Parameters_Weather(Get_Many_Parameters_Base): + get_all_weather: bool + get_inactive_weather: bool + ids_weather: str + names_weather: 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_weather = True + , get_inactive_weather = False + , ids_weather = '' + , names_weather = '' + , 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_weather = json.get('a_get_all_weather', False) + , get_inactive_weather = json.get('a_get_inactive_weather', False) + , ids_weather = json.get('a_ids_weather', '') + , names_weather = json.get('a_names_weather', '') + , 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) + ) + + def to_json(self): + return { + 'a_get_all_weather': self.get_all_weather + , 'a_get_inactive_weather': self.get_inactive_weather + , 'a_ids_weather': self.ids_weather + , 'a_names_weather': self.names_weather + , '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 + } diff --git a/business_objects/file_type.py b/business_objects/file_type.py index 49082f4..a4d41b7 100644 --- a/business_objects/file_type.py +++ b/business_objects/file_type.py @@ -95,7 +95,7 @@ class File_Type_Temp(db.Model, Base): __table_args__ = { 'extend_existing': True } id_temp = db.Column(db.Integer, primary_key=True) id_file_type = db.Column(db.Integer) - # code = db.Column(db.String(250)) + code = db.Column(db.String(250)) name = db.Column(db.String(250)) is_image = db.Column(db.Boolean) active = db.Column(db.Boolean) @@ -109,7 +109,7 @@ class File_Type_Temp(db.Model, Base): _m = 'File_Type_Temp.from_File_Type' temp = cls() temp.id_file_type = file_type.id_file_type - # temp.code = file_type.code + temp.code = file_type.code temp.name = file_type.name temp.is_image = file_type.is_image temp.active = file_type.active diff --git a/controllers/dog/assessment.py b/controllers/dog/assessment.py new file mode 100644 index 0000000..b843bc5 --- /dev/null +++ b/controllers/dog/assessment.py @@ -0,0 +1,118 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: App Routing +Feature: Dog - Assessment Routes + +Description: +Dog Assessments Page Controller. +""" + +# IMPORTS +# internal +from business_objects.api import API +from business_objects.dog.command import Command +from business_objects.dog.assessment import Assessment +from datastores.datastore_dog import DataStore_Dog +from forms.dog.assessment import Filters_Assessment +from helpers.helper_app import Helper_App +from models.model_view_dog_assessment import Model_View_Dog_Assessment +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_assessment = Blueprint('routes_dog_assessment', __name__) + + +@routes_dog_assessment.route(Model_View_Dog_Assessment.HASH_PAGE_DOG_ASSESSMENTS, methods=['GET']) +def assessments(): + Helper_App.console_log('assessments') + Helper_App.console_log(f'request_args: {request.args}') + try: + form_filters = Filters_Assessment.from_json(request.args) + except Exception as e: + Helper_App.console_log(f'Error: {e}') + form_filters = Filters_Assessment() + 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')) + Helper_App.console_log(f'form_filters={form_filters}') + return render_template('pages/dog/_assessments.html', model = model) + +@routes_dog_assessment.route(Model_View_Dog_Assessment.HASH_SAVE_DOG_ASSESSMENT, methods=['POST']) +def save_assessment(): + data = Helper_App.get_request_data(request) + try: + form_filters = Filters_Assessment.from_json(data[Model_View_Dog_Assessment.FLAG_FORM_FILTERS]) + if not form_filters.validate_on_submit(): + return jsonify({ + Model_View_Dog_Assessment.FLAG_STATUS: Model_View_Dog_Assessment.FLAG_FAILURE, + Model_View_Dog_Assessment.FLAG_MESSAGE: f'Filters form invalid.\n{form_filters.errors}' + }) + model_return = Model_View_Dog_Assessment(form_filters_old=form_filters) + if not model_return.is_user_logged_in: + raise Exception('User not logged in') + + assessments = data[Model_View_Dog_Assessment.FLAG_ASSESSMENT] + if len(assessments) == 0: + return jsonify({ + Model_View_Dog_Assessment.FLAG_STATUS: Model_View_Dog_Assessment.FLAG_FAILURE, + Model_View_Dog_Assessment.FLAG_MESSAGE: f'No assessments.' + }) + objs_assessment = [] + for assessment in assessments: + objs_assessment.append(Assessment.from_json(assessment)) + Helper_App.console_log(f'objs_assessment={objs_assessment}') + errors = DataStore_Dog.save_assessments(data.get('comment', 'No comment'), objs_assessment) + + if (len(errors) > 0): + return jsonify({ + Model_View_Dog_Assessment.FLAG_STATUS: Model_View_Dog_Assessment.FLAG_FAILURE, + Model_View_Dog_Assessment.FLAG_MESSAGE: f'Error saving assessments.\n{model_return.convert_list_objects_to_json(errors)}' + }) + return jsonify({ + Model_View_Dog_Assessment.FLAG_STATUS: Model_View_Dog_Assessment.FLAG_SUCCESS, + Model_View_Dog_Assessment.FLAG_DATA: Model_View_Dog_Assessment.convert_list_objects_to_json(model_return.assessments) + }) + except Exception as e: + return jsonify({ + Model_View_Dog_Assessment.FLAG_STATUS: Model_View_Dog_Assessment.FLAG_FAILURE, + Model_View_Dog_Assessment.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' + }) + +@routes_dog_assessment.route(Model_View_Dog_Assessment.HASH_PAGE_DOG_ASSESSMENT, methods=['GET']) +def assessment(): + Helper_App.console_log('assessment:') + Helper_App.console_log(f'request_args: {request.args}') + try: + form_filters = Filters_Assessment.from_json(request.args) + except Exception as e: + Helper_App.console_log(f'Error: {e}') + form_filters = Filters_Assessment() + Helper_App.console_log(f'form_filters={form_filters}') + id_assessment = request.args.get(Model_View_Dog_Assessment.ATTR_ID_ASSESSMENT, None) + model = Model_View_Dog_Assessment(form_filters_old = form_filters, id_assessment = id_assessment, hash_page_current = Model_View_Dog_Assessment.HASH_PAGE_DOG_ASSESSMENT) + model._title = 'Assessment' + if model.assessments is None or len(model.assessments) == 0: + return assessments() + if not model.is_user_logged_in: + return redirect(url_for('routes_core_home.home')) + Helper_App.console_log(f'form_filters={form_filters}') + return render_template('pages/dog/_assessment.html', model = model) diff --git a/datastores/datastore_dog.py b/datastores/datastore_dog.py index ac6df48..d6dd5c2 100644 --- a/datastores/datastore_dog.py +++ b/datastores/datastore_dog.py @@ -13,16 +13,27 @@ Datastore for Users # internal # from routes import bp_home import lib.argument_validation as av +from business_objects.dog.assessment import Assessment, Assessment_Temp +from business_objects.dog.assessment_command_modality_link import Assessment_Command_Modality_Link, Assessment_Command_Modality_Link_Temp +from business_objects.dog.assessment_response import Assessment_Response, Assessment_Response_Temp +from business_objects.dog.bribe import Bribe, Bribe_Temp from business_objects.dog.button_icon import Button_Icon, Button_Icon_Temp from business_objects.dog.button_shape import Button_Shape, Button_Shape_Temp from business_objects.dog.colour import Colour, Colour_Temp from business_objects.dog.command import Command, Command_Temp from business_objects.dog.command_button_link import Command_Button_Link, Command_Button_Link_Temp from business_objects.dog.command_category import Command_Category, Command_Category_Temp +from business_objects.dog.command_modality import Command_Modality, Command_Modality_Temp +from business_objects.dog.distraction import Distraction, Distraction_Temp +from business_objects.dog.distraction_intensity_level import Distraction_Intensity_Level, Distraction_Intensity_Level_Temp +from business_objects.dog.distraction_type import Distraction_Type, Distraction_Type_Temp from business_objects.dog.dog import Dog from business_objects.dog.dog_command_link import Dog_Command_Link, Dog_Command_Link_Temp -from business_objects.dog.command_button_link import Command_Button_Link, Command_Button_Link_Temp +from business_objects.dog.lighting_level import Lighting_Level, Lighting_Level_Temp from business_objects.dog.location import Location, Location_Temp +from business_objects.dog.obedience_level import Obedience_Level, Obedience_Level_Temp +from business_objects.dog.response_quality_metric import Response_Quality_Metric, Response_Quality_Metric_Temp +from business_objects.dog.weather import Weather, Weather_Temp from business_objects.sql_error import SQL_Error from datastores.datastore_base import DataStore_Base from helpers.helper_app import Helper_App @@ -632,3 +643,460 @@ class DataStore_Dog(DataStore_Base): cls.db_cursor_clear(cursor) return errors + + + @classmethod + def get_many_assessment(cls, filters_assessment): + _m = f'{cls.__qualname__}.get_many_assessment' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_assessment.to_json() + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_assessment', argument_dict) + cursor = result.cursor + + # Assessments + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw assessments: {result_set_1}') + assessments = [] + assessment_indexes = {} + for row in result_set_1: + new_assessment = Assessment.from_db_assessment(row) + assessment_indexes[new_assessment.id_assessment] = len(assessments) + assessments.append(new_assessment) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return assessments, errors + + + @classmethod + def get_many_weather(cls, filters_weather): + _m = f'{cls.__qualname__}.get_many_weather' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_weather.to_json() + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_weather', argument_dict) + cursor = result.cursor + + # Weathers + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw weathers: {result_set_1}') + weathers = [] + weather_indexes = {} + for row in result_set_1: + new_weather = Weather.from_db_weather(row) + weather_indexes[new_weather.id_weather] = len(weathers) + weathers.append(new_weather) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return weathers, errors + + + @classmethod + def get_many_lighting_level(cls, filters_lighting_level): + _m = f'{cls.__qualname__}.get_many_lighting_level' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_lighting_level.to_json() + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_lighting_level', argument_dict) + cursor = result.cursor + + # Lighting_Levels + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw lighting_levels: {result_set_1}') + lighting_levels = [] + lighting_level_indexes = {} + for row in result_set_1: + new_lighting_level = Lighting_Level.from_db_lighting_level(row) + lighting_level_indexes[new_lighting_level.id_lighting_level] = len(lighting_levels) + lighting_levels.append(new_lighting_level) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return lighting_levels, errors + + + @classmethod + def get_many_distraction_type(cls, filters_distraction_type): + _m = f'{cls.__qualname__}.get_many_distraction_type' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_distraction_type.to_json() + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_distraction_type', argument_dict) + cursor = result.cursor + + # Distraction_Types + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw distraction_types: {result_set_1}') + distraction_types = [] + distraction_type_indexes = {} + for row in result_set_1: + new_distraction_type = Distraction_Type.from_db_distraction_type(row) + distraction_type_indexes[new_distraction_type.id_distraction_type] = len(distraction_types) + distraction_types.append(new_distraction_type) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return distraction_types, errors + + + @classmethod + def get_many_distraction_intensity_level(cls, filters_distraction_intensity_level): + _m = f'{cls.__qualname__}.get_many_distraction_intensity_level' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_distraction_intensity_level.to_json() + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_distraction_intensity_level', argument_dict) + cursor = result.cursor + + # Distraction_Intensity_Levels + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw distraction_intensity_levels: {result_set_1}') + distraction_intensity_levels = [] + distraction_intensity_level_indexes = {} + for row in result_set_1: + new_distraction_intensity_level = Distraction_Intensity_Level.from_db_distraction_intensity_level(row) + distraction_intensity_level_indexes[new_distraction_intensity_level.id_intensity_level] = len(distraction_intensity_levels) + distraction_intensity_levels.append(new_distraction_intensity_level) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return distraction_intensity_levels, errors + + + @classmethod + def get_many_distraction(cls, filters_distraction): + _m = f'{cls.__qualname__}.get_many_distraction' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_distraction.to_json() + , 'a_show_errors': 1 + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_distraction', argument_dict) + cursor = result.cursor + + # Distractions + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw distractions: {result_set_1}') + distractions = [] + distraction_indexes = {} + for row in result_set_1: + new_distraction = Distraction.from_db_distraction(row) + distraction_indexes[new_distraction.id_distraction] = len(distractions) + distractions.append(new_distraction) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return distractions, errors + + + @classmethod + def get_many_command_modality(cls, filters_command_modality): + _m = f'{cls.__qualname__}.get_many_command_modality' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_command_modality.to_json() + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_command_modality', argument_dict) + cursor = result.cursor + + # Command_Modalities + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw command_modalities: {result_set_1}') + command_modalities = [] + command_modality_indexes = {} + for row in result_set_1: + new_command_modality = Command_Modality.from_db_command_modality(row) + command_modality_indexes[new_command_modality.id_command_modality] = len(command_modalities) + command_modalities.append(new_command_modality) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return command_modalities, errors + + + @classmethod + def get_many_bribe(cls, filters_bribe): + _m = f'{cls.__qualname__}.get_many_bribe' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_bribe.to_json() + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_bribe', argument_dict) + cursor = result.cursor + + # Bribes + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw bribes: {result_set_1}') + bribes = [] + bribe_indexes = {} + for row in result_set_1: + new_bribe = Bribe.from_db_bribe(row) + bribe_indexes[new_bribe.id_bribe] = len(bribes) + bribes.append(new_bribe) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return bribes, errors + + + @classmethod + def get_many_assessment_command_modality_link(cls, filters_assessment_command_modality_link): + _m = f'{cls.__qualname__}.get_many_assessment_command_modality_link' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_assessment_command_modality_link.to_json() + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_assessment_command_modality_link', argument_dict) + cursor = result.cursor + + # Assessment_Command_Modality_Links + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw assessment_command_modality_links: {result_set_1}') + assessment_command_modality_links = [] + assessment_command_modality_link_indexes = {} + for row in result_set_1: + new_assessment_command_modality_link = Assessment_Command_Modality_Link.from_db_assessment_command_modality_link(row) + assessment_command_modality_link_indexes[new_assessment_command_modality_link.id_link] = len(assessment_command_modality_links) + assessment_command_modality_links.append(new_assessment_command_modality_link) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return assessment_command_modality_links, errors + + + @classmethod + def get_many_response_quality_metric(cls, filters_response_quality_metric): + _m = f'{cls.__qualname__}.get_many_response_quality_metric' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_response_quality_metric.to_json() + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_response_quality_metric', argument_dict) + cursor = result.cursor + + # Command_Modalities + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw command_modalities: {result_set_1}') + command_modalities = [] + response_quality_metric_indexes = {} + for row in result_set_1: + new_response_quality_metric = Response_Quality_Metric.from_db_response_quality_metric(row) + response_quality_metric_indexes[new_response_quality_metric.id_response_quality_metric] = len(command_modalities) + command_modalities.append(new_response_quality_metric) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return command_modalities, errors + + + @classmethod + def get_many_obedience_level(cls, filters_obedience_level): + _m = f'{cls.__qualname__}.get_many_obedience_level' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_obedience_level.to_json() + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_obedience_level', argument_dict) + cursor = result.cursor + + # Command_Modalities + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw command_modalities: {result_set_1}') + command_modalities = [] + obedience_level_indexes = {} + for row in result_set_1: + new_obedience_level = Obedience_Level.from_db_obedience_level(row) + obedience_level_indexes[new_obedience_level.id_obedience_level] = len(command_modalities) + command_modalities.append(new_obedience_level) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return command_modalities, errors + + + @classmethod + def get_many_assessment_response(cls, filters_assessment_response): + _m = f'{cls.__qualname__}.get_many_assessment_response' + user = cls.get_user_session() + argument_dict = { + 'a_id_user': user.id_user + , **filters_assessment_response.to_json() + , 'a_debug': 0 + } + Helper_App.console_log(f'argument_dict: {argument_dict}') + result = cls.db_procedure_execute('p_dog_get_many_assessment_response', argument_dict) + cursor = result.cursor + + # Assessment_Responses + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw assessment_responses: {result_set_1}') + assessment_responses = [] + assessment_response_indexes = {} + for row in result_set_1: + new_assessment_response = Assessment_Response.from_db_assessment_response(row) + assessment_response_indexes[new_assessment_response.id_response] = len(assessment_responses) + assessment_responses.append(new_assessment_response) + + # Errors + cursor.nextset() + result_set_e = cursor.fetchall() + Helper_App.console_log(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_db_record(row) for row in result_set_e] + for error in errors: + Helper_App.console_log(f"Error [{error.code}]: {error.msg}") + + cls.db_cursor_clear(cursor) + + return assessment_responses, errors diff --git a/datastores/datastore_user.py b/datastores/datastore_user.py index 25e1d93..30adda2 100644 --- a/datastores/datastore_user.py +++ b/datastores/datastore_user.py @@ -96,7 +96,7 @@ class DataStore_User(DataStore_Base): if len(result_set) > 0: for row in result_set: Helper_App.console_log(f'row: {row}') - user = User.from_DB_user(row) + user = User.from_db_user(row) users.append(user) Helper_App.console_log(f'user {str(type(user))}: {user}') diff --git a/forms/dog/assessment.py b/forms/dog/assessment.py new file mode 100644 index 0000000..3f6a1eb --- /dev/null +++ b/forms/dog/assessment.py @@ -0,0 +1,151 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Backend +Feature: Assessment Form + +Description: +Defines Flask-WTF form for handling user input on Assessments page. +""" + +# IMPORTS +# internal +from business_objects.base import Base +""" +from business_objects.dog.distraction_intensity_level import Distraction_Intensity_Level +from business_objects.dog.distraction_type import Distraction_Type +from business_objects.dog.command import Lighting_Level +from business_objects.dog.command_category import Lighting_Level +from business_objects.dog.lighting_level import Lighting_Level +from business_objects.dog.lighting_level import Lighting_Level +""" +from business_objects.dog.lighting_level import Lighting_Level +from business_objects.dog.location import Location +from business_objects.dog.weather import Weather +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 +from typing import ClassVar + +class Filters_Assessment(Form_Base): + ATTR_ID_ASSESSMENT: ClassVar[str] = 'id_assessment' + FLAG_USER_HANDLER: ClassVar[str] = 'id_user_handler' + + search = StringField( + 'Search' + ) + id_assessment = SelectField( + 'Assessment' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_weather = SelectField( + 'Weather' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_lighting_level = SelectField( + 'Lighting Level' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_location = SelectField( + 'Location' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_user_handler = SelectField( + 'Handler' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + """ + id_distraction_type = SelectField( + 'Distraction Type' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_intensity_level_emotional = SelectField( + 'Intensity Level Emotional' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_intensity_level_scent = SelectField( + 'Intensity Level Scent' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_intensity_level_sight = SelectField( + 'Intensity Level Sight' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_intensity_level_sound = SelectField( + 'Intensity Level Sound' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_intensity_level_touch = SelectField( + 'Intensity Level Touch' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_command_category = SelectField( + 'Command Category' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_command = SelectField( + 'Command' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_command_modality = SelectField( + 'Command Modality' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) + id_bribe = SelectField( + 'Bribe' + , 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_assessment.data = json[cls.ATTR_ID_ASSESSMENT] + filters.id_weather.data = json[Weather.ATTR_ID_WEATHER] + filters.id_lighting_level.data = json[Lighting_Level.ATTR_ID_LIGHTING_LEVEL] + filters.id_location.data = json[Location.ATTR_ID_LOCATION] + filters.id_user_handler.data = json[cls.FLAG_USER_HANDLER] + # filters.id_distraction_type = json[Distraction_Type.ATTR_ID_DISTRACTION_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 + } diff --git a/models/model_view_accessibility_report.py b/models/model_view_accessibility_report.py index 1faf5d8..3f50e7f 100644 --- a/models/model_view_accessibility_report.py +++ b/models/model_view_accessibility_report.py @@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base # external class Model_View_Accessibility_Report(Model_View_Base): - @property - def title(self): - return 'Accessibility Report' def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_ACCESSIBILITY_REPORT): super().__init__(hash_page_current=hash_page_current) + self._title = 'Accessibility Report' \ No newline at end of file diff --git a/models/model_view_accessibility_statement.py b/models/model_view_accessibility_statement.py index 2ffcb79..d5df88e 100644 --- a/models/model_view_accessibility_statement.py +++ b/models/model_view_accessibility_statement.py @@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base # external class Model_View_Accessibility_Statement(Model_View_Base): - @property - def title(self): - return 'Accessibility Statement' def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_ACCESSIBILITY_STATEMENT): super().__init__(hash_page_current=hash_page_current) + self._title = 'Accessibility Statement' \ No newline at end of file diff --git a/models/model_view_base.py b/models/model_view_base.py index 14b7c1f..9019e7b 100644 --- a/models/model_view_base.py +++ b/models/model_view_base.py @@ -19,17 +19,29 @@ Base data model for views # from routes import bp_home from business_objects.base import Base from business_objects.file_type import File_Type +from business_objects.dog.assessment import Assessment +from business_objects.dog.assessment_command_modality_link import Assessment_Command_Modality_Link +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.colour import Colour from business_objects.dog.command import Command from business_objects.dog.command_button_link import Command_Button_Link from business_objects.dog.command_category import Command_Category +from business_objects.dog.command_modality import Command_Modality +from business_objects.dog.distraction import Distraction +from business_objects.dog.distraction_intensity_level import Distraction_Intensity_Level +from business_objects.dog.distraction_type import Distraction_Type from business_objects.dog.dog import Dog from business_objects.dog.dog_command_link import Dog_Command_Link from business_objects.dog.image import Image +from business_objects.dog.lighting_level import Lighting_Level from business_objects.dog.location import Location +from business_objects.dog.obedience_level import Obedience_Level +from business_objects.dog.response_quality_metric import Response_Quality_Metric from business_objects.dog.user import User +from business_objects.dog.weather import Weather from datastores.datastore_base import DataStore_Base from datastores.datastore_dog import DataStore_Dog from datastores.datastore_user import DataStore_User @@ -44,17 +56,27 @@ from typing import ClassVar class Model_View_Base(BaseModel, ABC): + ATTR_ID_ASSESSMENT: ClassVar[str] = Assessment.ATTR_ID_ASSESSMENT + ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = Assessment_Command_Modality_Link.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK + ATTR_ID_ASSESSMENT_RESPONSE: ClassVar[str] = Assessment_Response.ATTR_ID_ASSESSMENT_RESPONSE + 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_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 ATTR_ID_COMMAND_CATEGORY: ClassVar[str] = Command_Category.ATTR_ID_COMMAND_CATEGORY + ATTR_ID_COMMAND_MODALITY: ClassVar[str] = Command_Modality.ATTR_ID_COMMAND_MODALITY + ATTR_ID_DISTRACTION: ClassVar[str] = Distraction.ATTR_ID_DISTRACTION + ATTR_ID_DISTRACTION_INTENSITY_LEVEL: ClassVar[str] = Distraction_Intensity_Level.ATTR_ID_DISTRACTION_INTENSITY_LEVEL + ATTR_ID_DISTRACTION_TYPE: ClassVar[str] = Distraction_Type.ATTR_ID_DISTRACTION_TYPE ATTR_ID_DOG: ClassVar[str] = Dog.ATTR_ID_DOG ATTR_ID_DOG_COMMAND_LINK: ClassVar[str] = Dog_Command_Link.ATTR_ID_DOG_COMMAND_LINK ATTR_ID_FILE_TYPE: ClassVar[str] = File_Type.ATTR_ID_FILE_TYPE ATTR_ID_IMAGE: ClassVar[str] = Image.ATTR_ID_IMAGE + ATTR_ID_LIGHTING_LEVEL: ClassVar[str] = Lighting_Level.ATTR_ID_LIGHTING_LEVEL ATTR_ID_LOCATION: ClassVar[str] = Location.ATTR_ID_LOCATION + ATTR_ID_WEATHER: ClassVar[str] = Weather.ATTR_ID_WEATHER ATTR_TEXT_COLLAPSED: ClassVar[str] = 'textCollapsed' ATTR_TEXT_EXPANDED: ClassVar[str] = 'textExpanded' ATTR_VALUE_CURRENT: ClassVar[str] = 'current-value' @@ -87,8 +109,12 @@ class Model_View_Base(BaseModel, ABC): FLAG_ACTIVE_ONLY: ClassVar[str] = Base.FLAG_ACTIVE_ONLY FLAG_ADD: ClassVar[str] = 'add' # FLAG_ADD_DELETE: ClassVar[str] = 'add-delete' + FLAG_ASSESSMENT: ClassVar[str] = Assessment.FLAG_ASSESSMENT + FLAG_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK + FLAG_ASSESSMENT_RESPONSE: ClassVar[str] = Assessment_Response.FLAG_ASSESSMENT_RESPONSE FLAG_BOOL_FALSE: ClassVar[str] = 'false' FLAG_BOOL_TRUE: ClassVar[str] = 'true' + FLAG_BRIBE: ClassVar[str] = Bribe.FLAG_BRIBE FLAG_BUTTON: ClassVar[str] = 'button' FLAG_BUTTON_ICON: ClassVar[str] = Button_Icon.FLAG_BUTTON_ICON FLAG_BUTTON_LIGHT: ClassVar[str] = 'button-light' @@ -106,6 +132,7 @@ class Model_View_Base(BaseModel, ABC): FLAG_COMMAND: ClassVar[str] = Command.FLAG_COMMAND FLAG_COMMAND_BUTTON_LINK: ClassVar[str] = Command_Button_Link.FLAG_COMMAND_BUTTON_LINK FLAG_COMMAND_CATEGORY: ClassVar[str] = Command_Category.FLAG_COMMAND_CATEGORY + FLAG_COMMAND_MODALITY: ClassVar[str] = Command_Modality.FLAG_COMMAND_MODALITY FLAG_COLUMN: ClassVar[str] = 'column' FLAG_COMMENT: ClassVar[str] = 'comment' FLAG_CONTAINER: ClassVar[str] = 'container' @@ -118,6 +145,9 @@ class Model_View_Base(BaseModel, ABC): FLAG_DDL_PREVIEW: ClassVar[str] = "ddl-preview" FLAG_DELETE: ClassVar[str] = 'delete' FLAG_DESCRIPTION: ClassVar[str] = Base.FLAG_DESCRIPTION + FLAG_DISTRACTION: ClassVar[str] = Distraction.FLAG_DISTRACTION + FLAG_DISTRACTION_INTENSITY_LEVEL: ClassVar[str] = Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL + FLAG_DISTRACTION_TYPE: ClassVar[str] = Distraction_Type.FLAG_DISTRACTION_TYPE FLAG_DETAIL: ClassVar[str] = 'detail' FLAG_DIALOG: ClassVar[str] = 'dialog' FLAG_DIRTY: ClassVar[str] = 'dirty' @@ -139,6 +169,7 @@ class Model_View_Base(BaseModel, ABC): FLAG_IS_CHECKED: ClassVar[str] = 'is_checked' FLAG_IS_COLLAPSED: ClassVar[str] = 'is_collapsed' FLAG_LEFT_HAND_STUB: ClassVar[str] = 'lhs' + FLAG_LIGHTING_LEVEL: ClassVar[str] = Lighting_Level.FLAG_LIGHTING_LEVEL FLAG_LOCATION: ClassVar[str] = Location.FLAG_LOCATION FLAG_LOCATION_PARENT: ClassVar[str] = Location.FLAG_LOCATION_PARENT FLAG_LOGO: ClassVar[str] = 'logo' @@ -151,6 +182,8 @@ class Model_View_Base(BaseModel, ABC): # FLAG_NAME_SINGULAR: ClassVar[str] = Base.FLAG_NAME_SINGULAR FLAG_NAV_ADMIN_HOME: ClassVar[str] = 'navAdminHome' FLAG_NAV_CONTACT: ClassVar[str] = 'navContact' + 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_COLOURS: ClassVar[str] = 'navDogColours' FLAG_NAV_DOG_COMMAND_BUTTON_LINKS: ClassVar[str] = 'navDogCommandButtonLinks' @@ -166,8 +199,11 @@ class Model_View_Base(BaseModel, ABC): FLAG_NAV_USER_LOGIN: ClassVar[str] = 'navUserLogin' FLAG_NAV_USER_LOGOUT: ClassVar[str] = 'navUserLogout' FLAG_NOTES: ClassVar[str] = "notes" + FLAG_OBEDIENCE_LEVEL: ClassVar[str] = Obedience_Level.FLAG_OBEDIENCE_LEVEL FLAG_OVERLAY: ClassVar[str] = 'overlay' FLAG_PAGE_BODY: ClassVar[str] = 'page-body' + FLAG_QUANTITY: ClassVar[str] = 'quantity' + FLAG_RESPONSE_QUALITY_METRIC: ClassVar[str] = Response_Quality_Metric.FLAG_RESPONSE_QUALITY_METRIC FLAG_RIGHT_HAND_SIDE: ClassVar[str] = 'rhs' FLAG_ROW: ClassVar[str] = 'row' FLAG_ROW_NEW: ClassVar[str] = 'row-new' @@ -179,8 +215,10 @@ class Model_View_Base(BaseModel, ABC): FLAG_STATUS: ClassVar[str] = 'status' FLAG_SUBMIT: ClassVar[str] = 'submit' FLAG_SUCCESS: ClassVar[str] = 'success' + FLAG_TABLE_MAIN: ClassVar[str] = 'table-main' FLAG_TEMPORARY_ELEMENT: ClassVar[str] = 'temporary-element' FLAG_USER: ClassVar[str] = User.FLAG_USER + FLAG_WEATHER: ClassVar[str] = Weather.FLAG_WEATHER FLAG_WEBSITE: ClassVar[str] = Base.FLAG_WEBSITE HASH_GET_ALTCHA_CHALLENGE: ClassVar[str] = '/altcha/create-challenge' HASH_GET_DOG_SCRIPTS_SHARED: ClassVar[str] = '/dog/scripts-shared' @@ -190,6 +228,8 @@ class Model_View_Base(BaseModel, ABC): HASH_PAGE_CONTACT: ClassVar[str] = '/contact' HASH_PAGE_CONTACT_SUCCESS: ClassVar[str] = '/contact-success' HASH_PAGE_DATA_RETENTION_SCHEDULE: ClassVar[str] = '/retention-schedule' + 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_COMMAND_BUTTON_LINKS: ClassVar[str] = '/dog/command-button-links' HASH_PAGE_DOG_COMMAND_CATEGORIES: ClassVar[str] = '/dog/command-categories' @@ -205,6 +245,7 @@ class Model_View_Base(BaseModel, ABC): HASH_PAGE_USER_ACCOUNT: ClassVar[str] = '/user' HASH_PAGE_USER_LOGIN: ClassVar[str] = '/login' HASH_PAGE_USER_LOGOUT: ClassVar[str] = '/logout' + HASH_SAVE_DOG_ASSESSMENT: ClassVar[str] = '/dog/save-assessment' HASH_SAVE_DOG_BUTTON_ICON: ClassVar[str] = '/dog/save-button-icon' HASH_SAVE_DOG_COLOUR: ClassVar[str] = '/dog/save-colour' HASH_SAVE_DOG_COMMAND: ClassVar[str] = '/dog/save-command' @@ -234,6 +275,7 @@ class Model_View_Base(BaseModel, ABC): URL_GITHUB: ClassVar[str] = 'https://github.com/Teddy-1024' URL_LINKEDIN: ClassVar[str] = 'https://uk.linkedin.com/in/teddyms' + _title: str hash_page_current: str app: Flask = None session: None = None @@ -245,10 +287,12 @@ class Model_View_Base(BaseModel, ABC): model_config = ConfigDict(arbitrary_types_allowed=True) @property - @abstractmethod + # @abstractmethod def title(self): - pass - + if self._title is None: + raise NotImplementedError("Model Title required.") + return self._title + def __init__(self, hash_page_current, **kwargs): BaseModel.__init__(self, hash_page_current=hash_page_current, **kwargs) self.app = current_app diff --git a/models/model_view_dog_assessment.py b/models/model_view_dog_assessment.py new file mode 100644 index 0000000..1d84120 --- /dev/null +++ b/models/model_view_dog_assessment.py @@ -0,0 +1,205 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: View Models +Feature: Dog Assessments View Model + +Description: +Data model for dog assessments view +""" + +# internal +from business_objects.dog.assessment import Assessment, Parameters_Assessment +from business_objects.dog.assessment_command_modality_link import Assessment_Command_Modality_Link, Parameters_Assessment_Command_Modality_Link +from business_objects.dog.assessment_response import Assessment_Response, Parameters_Assessment_Response +from business_objects.dog.bribe import Bribe, Parameters_Bribe +from business_objects.dog.command import Command, Parameters_Command +from business_objects.dog.command_category import Command_Category +from business_objects.dog.command_modality import Command_Modality, Parameters_Command_Modality +from business_objects.dog.distraction import Distraction, Parameters_Distraction +from business_objects.dog.distraction_intensity_level import Distraction_Intensity_Level, Parameters_Distraction_Intensity_Level +from business_objects.dog.distraction_type import Distraction_Type, Parameters_Distraction_Type +from business_objects.dog.lighting_level import Lighting_Level, Parameters_Lighting_Level +from business_objects.dog.location import Location, Parameters_Location +from business_objects.dog.obedience_level import Obedience_Level, Parameters_Obedience_Level +from business_objects.dog.response_quality_metric import Response_Quality_Metric, Parameters_Response_Quality_Metric +from business_objects.dog.user import User, Parameters_User +from business_objects.dog.weather import Weather, Parameters_Weather +from datastores.datastore_dog import DataStore_Dog +from datastores.datastore_user import DataStore_User +from models.model_view_dog_base import Model_View_Dog_Base +from forms.dog.assessment import Filters_Assessment +# from routes import bp_home +from helpers.helper_app import Helper_App +import lib.argument_validation as av + +# external +from pydantic import BaseModel +from typing import ClassVar, Optional +from operator import attrgetter + +class Model_View_Dog_Assessment(Model_View_Dog_Base): + FLAG_DISTANCE_FROM_HANDLER: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_DISTANCE_FROM_HANDLER + FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL: ClassVar[str] = Distraction.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL + FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT: ClassVar[str] = Distraction.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT + FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT: ClassVar[str] = Distraction.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT + FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND: ClassVar[str] = Distraction.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND + FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH: ClassVar[str] = Distraction.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH + FLAG_IS_IN_HEARING_RANGE_OF_HANDLER: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER + FLAG_IS_IN_SCENT_RANGE_OF_HANDLER: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER + FLAG_IS_IN_SIGHT_OF_HANDLER: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_IS_IN_SIGHT_OF_HANDLER + FLAG_IS_ON_LEAD: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_IS_ON_LEAD + FLAG_PROXIMITY_METRES: ClassVar[str] = Distraction.FLAG_PROXIMITY_METRES + FLAG_TEMPERATURE_CELCIUS: ClassVar[str] = Assessment.FLAG_TEMPERATURE_CELCIUS + FLAG_TRIAL_COUNT: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_TRIAL_COUNT + FLAG_USER_HANDLER: ClassVar[str] = Assessment.FLAG_USER_HANDLER + FLAG_VALUE_MEASURED: ClassVar[str] = Assessment_Response.FLAG_VALUE_MEASURED + ID_FORM_ASSESSMENT: ClassVar[str] = 'form_assessment' + ID_FORM_ASSESSMENT_COMMAND_MODALITY_LINKS: ClassVar[str] = 'form_assessment_command_modality_links' + ID_FORM_DISTRACTIONS: ClassVar[str] = 'form_distractions' + ID_TABLE_ASSESSMENT: ClassVar[str] = 'table_assessment' + ID_TABLE_ASSESSMENT_COMMAND_MODALITY_LINKS: ClassVar[str] = 'table_assessment_command_modality_links' + ID_TABLE_ASSESSMENT_RESPONSES: ClassVar[str] = 'table_assessment_responses' + ID_TABLE_DISTRACTIONS: ClassVar[str] = 'table_distractions' + filter_bribes: list = None + filter_command_categories: list = None + filter_command_modalities: list = None + filter_commands: list = None + filter_distraction_intensity_levels: list = None + filter_distraction_types: list = None + filter_lighting_levels: list = None + filter_locations: list = None + filter_obedience_levels: list = None + filter_response_quality_metrics: list = None + filter_user_handlers: list = None + filter_weathers: list = None + assessments: list = None + form_filters: Filters_Assessment = None + form_filters_old: Filters_Assessment + id_assessment: Optional[int] + + def __init__(self, form_filters_old, id_assessment = None, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_ASSESSMENTS): + _m = 'Model_View_Dog_Assessment.__init__' + Helper_App.console_log(f'{_m}\nstarting...') + super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old, id_assessment=id_assessment) + self._title = 'Assessments' + self.form_filters = form_filters_old + datastore_dog = DataStore_Dog() + datastore_user = DataStore_User() + + # Assessments + filters + parameters_filter_lighting_level = Parameters_Lighting_Level.get_default() + self.filter_lighting_levels, errors = datastore_dog.get_many_lighting_level(parameters_filter_lighting_level) + if len(self.filter_lighting_levels) > 0: + self.form_filters.id_lighting_level.choices += [(str(lighting_level.id_lighting_level), lighting_level.name) for lighting_level in self.filter_lighting_levels] + + parameters_filter_location = Parameters_Location.get_default() + self.filter_locations, errors = datastore_dog.get_many_location(parameters_filter_location) + if len(self.filter_locations) > 0: + self.form_filters.id_location.choices += [(str(location.id_location), location.name) for location in self.filter_locations] + + parameters_filter_user = Parameters_User.get_default() + parameters_filter_user.id_user = self.user.id_user + parameters_filter_user.get_all_user = True + self.filter_user_handlers, errors = datastore_user.get_many_user(parameters_filter_user) + if len(self.filter_user_handlers) > 0: + self.form_filters.id_user_handler.choices += [(str(user.id_user), user.get_name()) for user in self.filter_user_handlers] + + parameters_filter_weather = Parameters_Weather.get_default() + self.filter_weathers, errors = datastore_dog.get_many_weather(parameters_filter_weather) + if len(self.filter_weathers) > 0: + self.form_filters.id_weather.choices += [(str(weather.id_weather), weather.name) for weather in self.filter_weathers] + + Helper_App.console_log(f'Form filters: {self.form_filters}') + parameters_filter_assessment = Parameters_Assessment.from_form_filters_assessment(self.form_filters) + if self.id_assessment is not None: + parameters_filter_assessment.ids_assessment = str(self.id_assessment) + Helper_App.console_log(f'Query args: {parameters_filter_assessment}') + self.assessments, errors = datastore_dog.get_many_assessment(parameters_filter_assessment) + + # Distractions + filters + parameters_filter_distraction_type = Parameters_Distraction_Type.get_default() + self.filter_distraction_types, errors = datastore_dog.get_many_distraction_type(parameters_filter_distraction_type) + """ + if len(self.filter_distraction_types) > 0: + self.form_filters.id_distraction_type.choices += [(str(distraction_type.id_type), distraction_type.name) for distraction_type in self.filter_distraction_types] + """ + + parameters_filter_distraction_intensity_level = Parameters_Distraction_Intensity_Level.get_default() + self.filter_distraction_intensity_levels, errors = datastore_dog.get_many_distraction_intensity_level(parameters_filter_distraction_intensity_level) + """ + if len(self.filter_distraction_intensity_levels) > 0: + self.form_filters.id_intensity_level.choices += [(str(distraction_intensity_level.id_intensity_level), distraction_intensity_level.name) for distraction_intensity_level in self.filter_distraction_intensity_levels] + """ + + parameters_filter_distraction = Parameters_Distraction.from_form_filters_assessment(self.form_filters) + distractions, errors = datastore_dog.get_many_distraction(parameters_filter_distraction) + + # Assessment Command Modality Links + filters + parameters_filter_command = Parameters_Command.get_default() + self.filter_command_categories, self.filter_commands, errors = datastore_dog.get_many_command(parameters_filter_command) + """ + if len(self.filter_command_categories) > 0: + self.form_filters.id_command_category.choices += [(str(command_category.id_command_category), command_category.name) for command_category in self.filter_command_categories] + if len(self.filter_commands) > 0: + Helper_App.console_log(f'filter commands: {self.filter_commands}') + sorted_filter_commands = self.filter_commands + sorted_filter_commands.sort(key = attrgetter('name')) + Helper_App.console_log(f'sorted filter commands: {sorted_filter_commands}') + self.form_filters.id_command.choices += [(str(command.id_command), command.name) for command in sorted_filter_commands] # .sort(key = lambda command: command[1]) + """ + + parameters_filter_command_modality = Parameters_Command_Modality.get_default() + self.filter_command_modalities, errors = datastore_dog.get_many_command_modality(parameters_filter_command_modality) + """ + if len(self.filter_command_modalities) > 0: + self.form_filters.id_command_modality.choices += [(str(command_modality.id_command_modality), command_modality.name) for command_modality in self.filter_command_modalities] + """ + + parameters_filter_bribe = Parameters_Bribe.get_default() + self.filter_bribes, errors = datastore_dog.get_many_bribe(parameters_filter_bribe) + """ + if len(self.filter_bribes) > 0: + self.form_filters.id_bribe.choices += [(str(bribe.id_bribe), bribe.name) for bribe in self.filter_bribes] + """ + + parameters_filter_assessment_command_modality_link = Parameters_Assessment_Command_Modality_Link.from_form_filters_assessment(self.form_filters) + assessment_command_modality_links, errors = datastore_dog.get_many_assessment_command_modality_link(parameters_filter_assessment_command_modality_link) + + # Assessment Responses and filters + parameters_filter_response_quality_metric = Parameters_Response_Quality_Metric.get_default() + self.filter_response_quality_metrics, errors = datastore_dog.get_many_response_quality_metric(parameters_filter_response_quality_metric) + """ + if len(self.filter_response_quality_metrics) > 0: + self.form_filters.id_response_quality_metric.choices += [(str(response_quality_metric.id_response_quality_metric), response_quality_metric.name) for response_quality_metric in self.filter_response_quality_metrics] + """ + + parameters_filter_obedience_level = Parameters_Obedience_Level.get_default() + self.filter_obedience_levels, errors = datastore_dog.get_many_obedience_level(parameters_filter_obedience_level) + """ + if len(self.filter_obedience_levels) > 0: + self.form_filters.id_obedience_level.choices += [(str(obedience_level.id_obedience_level), obedience_level.name) for obedience_level in self.filter_obedience_levels] + """ + + parameters_filter_assessment_response = Parameters_Assessment_Response.from_form_filters_assessment(self.form_filters) + assessment_responses, errors = datastore_dog.get_many_assessment_response(parameters_filter_assessment_response) + + for index_link in range(len(assessment_command_modality_links)): + link = assessment_command_modality_links[index_link] + link.assessment_responses = [response for response in assessment_responses if response.id_assessment_command_modality_link == link.id_link] + assessment_command_modality_links[index_link] = link + + for index_assessment in range(len(self.assessments)): + assessment = self.assessments[index_assessment] + + assessment.distractions = [distraction for distraction in distractions if distraction.id_assessment == assessment.id_assessment] + assessment.assessment_command_modality_links = [link for link in assessment_command_modality_links if link.id_assessment == assessment.id_assessment] + + self.assessments[index_assessment] = assessment + + Helper_App.console_log(f'Final assessments: {self.assessments}') + test_assessments = Model_View_Dog_Assessment.convert_list_objects_to_dict_json_by_attribute_key_default(self.assessments) + Helper_App.console_log(f'JSON assessments: {test_assessments}') + diff --git a/models/model_view_dog_base.py b/models/model_view_dog_base.py index 9d86732..8df298a 100644 --- a/models/model_view_dog_base.py +++ b/models/model_view_dog_base.py @@ -37,23 +37,10 @@ class Model_View_Dog_Base(Model_View_Base): # HASH_GET_STORE_CUSTOMER_SALES_ORDER: ClassVar[str] = '/store/customer_sales_order_get' # HASH_GET_STORE_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = '/store/manufacturing_purchase_order_get' - - @property - def title(self): - if self.hash_page_current == Model_View_Base.HASH_PAGE_DOG_HOME: - return 'Dog Home' - raise NotImplementedError('title must be implemented in child class') - def __init__(self, hash_page_current, **kwargs): _m = 'Model_View_Dog_Base.__init__' Helper_App.console_log(f'{_m}\nstarting') super().__init__(hash_page_current=hash_page_current, **kwargs) self.is_page_dog = True - - """ - def get_many_dog(self, dog_filters): - _m = 'Model_View_Dog_Base.get_many_dog' - av.val_instance(dog_filters, 'dog_filters', _m, Parameters_Dog) - return DataStore_Dog().get_many_dog(dog_filters) - """ - + if self.hash_page_current == Model_View_Base.HASH_PAGE_DOG_HOME: + self._title = 'Dog Home' diff --git a/models/model_view_dog_button_icon.py b/models/model_view_dog_button_icon.py index 1c897cc..567ac1c 100644 --- a/models/model_view_dog_button_icon.py +++ b/models/model_view_dog_button_icon.py @@ -27,15 +27,12 @@ class Model_View_Dog_Button_Icon(Model_View_Dog_Base): button_icons: list = None form_filters: Filters_Button_Icon = None form_filters_old: Filters_Button_Icon - - @property - def title(self): - return 'Button Icon' def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_BUTTON_ICONS): _m = 'Model_View_Dog_Button_Icon.__init__' Helper_App.console_log(f'{_m}\nstarting...') super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) + self._title = 'Button Icon' self.form_filters = form_filters_old datastore = DataStore_Dog() @@ -43,11 +40,3 @@ class Model_View_Dog_Button_Icon(Model_View_Dog_Base): parameters_filter_button_icon = Parameters_Button_Icon.from_form_filters_button_icon(self.form_filters) Helper_App.console_log(f'Query args: {parameters_filter_button_icon}') self.button_icons, errors = datastore.get_many_button_icon(parameters_filter_button_icon) - - - """ - @classmethod - def save_categories(cls, comment, list_categories): - _m = f'{cls.__name__}.save_categories' - return DataStore_Store_Product_Category().save_categories(comment, list_categories) - """ \ No newline at end of file diff --git a/models/model_view_dog_command.py b/models/model_view_dog_command.py index bef10b9..a263b26 100644 --- a/models/model_view_dog_command.py +++ b/models/model_view_dog_command.py @@ -31,14 +31,11 @@ class Model_View_Dog_Command(Model_View_Dog_Base): form_filters: Filters_Command = None form_filters_old: Filters_Command - @property - def title(self): - return 'Command' - def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_COMMANDS): _m = 'Model_View_Dog_Command.__init__' Helper_App.console_log(f'{_m}\nstarting...') super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) + self._title = 'Command' self.form_filters = form_filters_old datastore = DataStore_Dog() @@ -50,11 +47,3 @@ class Model_View_Dog_Command(Model_View_Dog_Base): parameters_filter_command = Parameters_Command.from_form_filters_command(self.form_filters) Helper_App.console_log(f'Query args: {parameters_filter_command}') command_categories, self.commands, errors = datastore.get_many_command(parameters_filter_command) - - - """ - @classmethod - def save_categories(cls, comment, list_categories): - _m = f'{cls.__name__}.save_categories' - return DataStore_Store_Product_Category().save_categories(comment, list_categories) - """ \ No newline at end of file diff --git a/models/model_view_dog_command_button_link.py b/models/model_view_dog_command_button_link.py index 8b9f25b..e00444b 100644 --- a/models/model_view_dog_command_button_link.py +++ b/models/model_view_dog_command_button_link.py @@ -41,15 +41,12 @@ class Model_View_Dog_Command_Button_Link(Model_View_Dog_Base): command_button_links: list = None form_filters: Filters_Command_Button_Link = None form_filters_old: Filters_Command_Button_Link - - @property - def title(self): - return 'Command Button Link' def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_COMMAND_BUTTON_LINKS): _m = 'Model_View_Dog_Command_Button_Link.__init__' Helper_App.console_log(f'{_m}\nstarting...') super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) + self._title = 'Command Button Link' self.form_filters = form_filters_old datastore = DataStore_Dog() diff --git a/models/model_view_dog_command_category.py b/models/model_view_dog_command_category.py index 0165d97..8c26826 100644 --- a/models/model_view_dog_command_category.py +++ b/models/model_view_dog_command_category.py @@ -28,15 +28,12 @@ class Model_View_Dog_Command_Category(Model_View_Dog_Base): command_categories: list = None form_filters: Filters_Command_Category = None form_filters_old: Filters_Command_Category - - @property - def title(self): - return 'Command Category' def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_COMMAND_CATEGORIES): _m = 'Model_View_Dog_Command_Category.__init__' Helper_App.console_log(f'{_m}\nstarting...') super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) + self._title = 'Command Category' self.form_filters = form_filters_old datastore = DataStore_Dog() @@ -45,10 +42,3 @@ class Model_View_Dog_Command_Category(Model_View_Dog_Base): Helper_App.console_log(f'Query args: {parameters_filter_command}') self.command_categories, commands, errors = datastore.get_many_command(parameters_filter_command) - - """ - @classmethod - def save_categories(cls, comment, list_categories): - _m = f'{cls.__name__}.save_categories' - return DataStore_Store_Product_Category().save_categories(comment, list_categories) - """ \ No newline at end of file diff --git a/models/model_view_dog_dog_command_link.py b/models/model_view_dog_dog_command_link.py index a0ed19f..4251807 100644 --- a/models/model_view_dog_dog_command_link.py +++ b/models/model_view_dog_dog_command_link.py @@ -35,15 +35,12 @@ class Model_View_Dog_Dog_Command_Link(Model_View_Dog_Base): dog_command_links: list = None form_filters: Filters_Dog_Command_Link = None form_filters_old: Filters_Dog_Command_Link - - @property - def title(self): - return 'Dog Command Link' def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_DOG_COMMAND_LINKS): _m = 'Model_View_Dog_Dog_Command_Link.__init__' Helper_App.console_log(f'{_m}\nstarting...') super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) + self._title = 'Dog Command Link' self.form_filters = form_filters_old datastore = DataStore_Dog() parameters_filter_dog = Parameters_Dog.get_default() diff --git a/models/model_view_dog_location.py b/models/model_view_dog_location.py index da81f4b..1301cdc 100644 --- a/models/model_view_dog_location.py +++ b/models/model_view_dog_location.py @@ -27,15 +27,12 @@ class Model_View_Dog_Location(Model_View_Dog_Base): locations: list = None form_filters: Filters_Location = None form_filters_old: Filters_Location - - @property - def title(self): - return 'Location' def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_LOCATIONS): _m = 'Model_View_Dog_Location.__init__' Helper_App.console_log(f'{_m}\nstarting...') super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) + self._title = 'Location' self.form_filters = form_filters_old datastore = DataStore_Dog() @@ -44,10 +41,3 @@ class Model_View_Dog_Location(Model_View_Dog_Base): Helper_App.console_log(f'Query args: {parameters_filter_location}') self.locations, errors = datastore.get_many_location(parameters_filter_location) - - """ - @classmethod - def save_categories(cls, comment, list_categories): - _m = f'{cls.__name__}.save_categories' - return DataStore_Store_Product_Category().save_categories(comment, list_categories) - """ \ No newline at end of file diff --git a/models/model_view_home.py b/models/model_view_home.py index f7bb6e2..4533b3a 100644 --- a/models/model_view_home.py +++ b/models/model_view_home.py @@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base # external class Model_View_Home(Model_View_Base): - @property - def title(self): - return 'Home' def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_HOME): super().__init__(hash_page_current=hash_page_current) + self._title = 'Home' \ No newline at end of file diff --git a/models/model_view_license.py b/models/model_view_license.py index f891df1..5edee06 100644 --- a/models/model_view_license.py +++ b/models/model_view_license.py @@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base # external class Model_View_License(Model_View_Base): - @property - def title(self): - return 'License' def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_LICENSE): super().__init__(hash_page_current=hash_page_current) + self._title = 'License' \ No newline at end of file diff --git a/models/model_view_privacy_policy.py b/models/model_view_privacy_policy.py index 0424333..e94bbed 100644 --- a/models/model_view_privacy_policy.py +++ b/models/model_view_privacy_policy.py @@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base # external class Model_View_Privacy_Policy(Model_View_Base): - @property - def title(self): - return 'Privacy Policy' def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_PRIVACY_POLICY): super().__init__(hash_page_current=hash_page_current) + self._title = 'Privacy Policy' \ No newline at end of file diff --git a/models/model_view_retention_schedule.py b/models/model_view_retention_schedule.py index 3f28d20..9c68909 100644 --- a/models/model_view_retention_schedule.py +++ b/models/model_view_retention_schedule.py @@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base # external class Model_View_Retention_Schedule(Model_View_Base): - @property - def title(self): - return 'Retention Schedule' def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_DATA_RETENTION_SCHEDULE): super().__init__(hash_page_current=hash_page_current) + self._title = 'Retention Schedule' \ No newline at end of file diff --git a/models/model_view_user.py b/models/model_view_user.py index 43dedbc..e478554 100644 --- a/models/model_view_user.py +++ b/models/model_view_user.py @@ -26,12 +26,10 @@ class Model_View_User(Model_View_Base): currencies: list = None regions: list = None users: list = None - @property - def title(self): - return 'User' def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_USER_ACCOUNT): super().__init__(hash_page_current=hash_page_current, form_filters_old = None) + self._title = 'User' datastore_user = DataStore_User() self.currencies = datastore_user.get_many_currency() self.regions = datastore_user.get_many_region() diff --git a/static/MySQL/00000_combined.sql b/static/MySQL/00000_combined.sql index cec0451..4701dd3 100644 --- a/static/MySQL/00000_combined.sql +++ b/static/MySQL/00000_combined.sql @@ -1,15 +1,389 @@ - https://www.molly.teddy.org.uk/login_callback, http://www.molly.teddy.org.uk/login_callback -, https://molly.teddy.org.uk/login_callback, http://molly.teddy.org.uk/login_callback -, https://www.fetch-metrics.co.uk/login_callback, http://www.fetch-metrics.co.uk/login_callback -, https://fetch-metrics.co.uk/login_callback, http://fetch-metrics.co.uk/login_callback -, https://www.fetch-metrics.com/login_callback, http://www.fetch-metrics.com/login_callback -, https://fetch-metrics.com/login_callback, http://fetch-metrics.com/login_callback -, http://127.0.0.1:5000/login_callback + +USE demo; -http://www.molly.teddy.org.uk/, https://www.molly.teddy.org.uk/, -http://molly.teddy.org.uk/, https://molly.teddy.org.uk/, -http://www.molly.teddy.org.uk/logout, https://www.molly.teddy.org.uk/logout, -http://molly.teddy.org.uk/logout, https://molly.teddy.org.uk/logout, -http://www.molly.teddy.org.uk/logout_callback, https://www.molly.teddy.org.uk/logout_callback, -http://molly.teddy.org.uk/logout_callback, https://molly.teddy.org.uk/logout_callback, -http://127.0.0.1:5000/logout, http://127.0.0.1:5000/logout_callback \ No newline at end of file +DROP PROCEDURE IF EXISTS demo.p_dog_get_many_response_quality_metric; + +DELIMITER // +CREATE PROCEDURE demo.p_dog_get_many_response_quality_metric ( + IN a_id_user INT + , IN a_get_all_response_quality_metric BIT + , IN a_get_inactive_response_quality_metric BIT + , IN a_ids_response_quality_metric TEXT + , IN a_names_response_quality_metric TEXT + , IN a_require_all_id_search_filters_met BIT + , IN a_require_any_id_search_filters_met BIT + , IN a_require_all_non_id_search_filters_met BIT + , IN a_require_any_non_id_search_filters_met BIT + , IN a_debug BIT +) +BEGIN + DECLARE v_can_view BIT; + DECLARE v_code_type_error_bad_data VARCHAR(100); + DECLARE v_code_type_error_no_permission VARCHAR(100); + DECLARE v_guid BINARY(36); + DECLARE v_id_access_level_view INT; + DECLARE v_id_minimum INT; + DECLARE v_id_permission_dog_view INT; + DECLARE v_id_type_error_bad_data INT; + DECLARE v_id_type_error_no_permission INT; + DECLARE v_time_start TIMESTAMP(6); + + DECLARE exit handler for SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @sqlstate = RETURNED_SQLSTATE + , @errno = MYSQL_ERRNO + , @text = MESSAGE_TEXT + ; + + ROLLBACK; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NULL + , code VARCHAR(250) NOT NULL + , msg TEXT NOT NULL + ); + + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + MET.id_type + , @errno + , @text + FROM demo.CORE_Msg_Error_Type MET + WHERE MET.code = 'MYSQL_ERROR' + ; + + SELECT + t_ERROR.id_error + , t_ERROR.id_type + , t_ERROR.code + , ERROR_TYPE.name + , ERROR_TYPE.description + , ERROR_TYPE.is_breaking_error + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour + , t_ERROR.msg + FROM tmp_Msg_Error t_ERROR + INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; + + DROP TABLE IF EXISTS tmp_Msg_Error; + END; + + SET v_time_start := CURRENT_TIMESTAMP(6); + SET v_guid := UUID(); + SET v_code_type_error_bad_data := 'BAD_DATA'; + SET v_code_type_error_no_permission := 'NO_PERMISSION'; + SET v_id_type_error_bad_data := (SELECT ERROR_TYPE.id_type FROM demo.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_bad_data LIMIT 1); + SET v_id_type_error_no_permission := (SELECT ERROR_TYPE.id_type FROM demo.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_no_permission LIMIT 1); + SET v_id_permission_dog_view := (SELECT PERMISSION.id_permission FROM demo.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_VIEW' LIMIT 1); + SET v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM demo.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1); + + SET a_id_user := IFNULL(a_id_user, 0); + /* + SET a_get_all_response_quality_metric := IFNULL(a_get_all_response_quality_metric, 0); + SET a_get_inactive_response_quality_metric := IFNULL(a_get_inactive_response_quality_metric, 0); + SET a_ids_response_quality_metric := TRIM(IFNULL(a_ids_response_quality_metric, '')); + SET a_names_response_quality_metric := TRIM(IFNULL(a_names_response_quality_metric, '')); + SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); + SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); + SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); + SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1); + */ + SET a_debug := IFNULL(a_debug, 0); + + IF a_debug = 1 THEN + SELECT + a_id_user + , a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric + , a_ids_response_quality_metric + , a_names_response_quality_metric + , a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met + , a_debug + ; + + SELECT + v_id_type_error_bad_data + , v_id_type_error_no_permission + , v_guid + , v_id_permission_dog_view + , v_time_start + ; + END IF; + + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Response_Quality_Metric; + + CREATE TEMPORARY TABLE tmp_Response_Quality_Metric ( + id_metric INT NOT NULL + , id_unit_measurement INT + , code VARCHAR(250) + , name VARCHAR(250) + , value_min DOUBLE + , value_max DOUBLE + , active BIT + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL + ); + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NULL + , code VARCHAR(250) NOT NULL + , msg TEXT NOT NULL + ); + + -- Permissions + IF a_debug = 1 THEN + SELECT + v_guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_id_user -- ids_user + , '' -- a_auth0_ids_user + , '' -- a_names_user + , '' -- a_emails_user + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ; + END IF; + + CALL demo.p_dog_calc_user( + v_guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_id_user -- ids_user + , '' -- a_auth0_ids_user + , '' -- a_names_user + , '' -- a_emails_user + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ); + + SELECT + IFNULL(CALC_USER_T.has_access, 0) + INTO + v_can_view + FROM demo.DOG_Calc_User_Temp CALC_USER_T + WHERE CALC_USER_T.GUID = v_guid + LIMIT 1 + ; + + IF a_debug = 1 THEN + SELECT v_can_view; + SELECT COUNT(*) AS Count_Errors FROM tmp_Msg_Error t_ERROR; + SELECT * FROM tmp_Msg_Error t_ERROR; + END IF; + + IF (v_can_view = 0) THEN + DELETE t_ME + FROM tmp_Msg_Error t_ME + WHERE t_ME.id_type <> v_id_type_error_no_permission + ; + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_no_permission + , v_code_type_error_no_permission + , 'You do not have permission to view RESPONSE_QUALITY_METRIC.' + ) + ; + END IF; + + CALL demo.p_dog_clear_calc_user( + v_guid + , 0 -- a_debug + ); + + + -- Call Response_Quality_Metric Calc + IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF a_debug = 1 THEN + SELECT + v_guid -- a_guid + , a_id_user -- a_id_user + , a_get_all_response_quality_metric -- a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric -- a_get_inactive_response_quality_metric + , a_ids_response_quality_metric -- a_ids_response_quality_metric + , a_names_response_quality_metric -- a_names_response_quality_metric + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug + ; + END IF; + + CALL demo.p_dog_calc_response_quality_metric ( + v_guid -- a_guid + , a_id_user -- a_id_user + , a_get_all_response_quality_metric -- a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric -- a_get_inactive_response_quality_metric + , a_ids_response_quality_metric -- a_ids_response_quality_metric + , a_names_response_quality_metric -- a_names_response_quality_metric + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT COUNT(*) FROM demo.DOG_Response_Quality_Metric_Temp; + SELECT * FROM demo.DOG_Response_Quality_Metric_Temp; + END IF; + + INSERT INTO tmp_Response_Quality_Metric ( + id_metric + , id_unit_measurement + , code + , name + , value_min + , value_max + , active + , does_meet_id_filters + , does_meet_non_id_filters + ) + SELECT + RESPONSE_QUALITY_METRIC_T.id_metric + , RESPONSE_QUALITY_METRIC_T.id_unit_measurement + , RESPONSE_QUALITY_METRIC_T.code + , RESPONSE_QUALITY_METRIC_T.name + , RESPONSE_QUALITY_METRIC_T.value_min + , RESPONSE_QUALITY_METRIC_T.value_max + , RESPONSE_QUALITY_METRIC_T.active + + , RESPONSE_QUALITY_METRIC_T.does_meet_id_filters + , RESPONSE_QUALITY_METRIC_T.does_meet_non_id_filters + FROM demo.DOG_Response_Quality_Metric_Temp RESPONSE_QUALITY_METRIC_T + WHERE RESPONSE_QUALITY_METRIC_T.GUID = v_guid + ; + + IF a_debug = 1 THEN + SELECT COUNT(*) FROM tmp_Response_Quality_Metric; + SELECT * FROM tmp_Response_Quality_Metric; + END IF; + END IF; + + -- Filter outputs + IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF a_debug = 1 THEN + SELECT * FROM tmp_Response_Quality_Metric; + END IF; + + DELETE FROM tmp_Response_Quality_Metric; + END IF; + + + -- Outputs + -- RESPONSE_QUALITY_METRIC + SELECT + t_RESPONSE_QUALITY_METRIC.id_metric + , t_RESPONSE_QUALITY_METRIC.id_unit_measurement + , UNIT_MEASUREMENT.name_singular AS name_singular_unit_measurement + , UNIT_MEASUREMENT.name_plural AS name_plural_unit_measurement + , UNIT_MEASUREMENT.symbol AS symbol_unit_measurement + , t_RESPONSE_QUALITY_METRIC.code + , t_RESPONSE_QUALITY_METRIC.name + , t_RESPONSE_QUALITY_METRIC.value_min + , t_RESPONSE_QUALITY_METRIC.value_max + , t_RESPONSE_QUALITY_METRIC.active + + , t_RESPONSE_QUALITY_METRIC.does_meet_id_filters + , t_RESPONSE_QUALITY_METRIC.does_meet_non_id_filters + FROM tmp_Response_Quality_Metric t_RESPONSE_QUALITY_METRIC + LEFT JOIN demo.DOG_Response_Quality_Metric RESPONSE_QUALITY_METRIC ON t_RESPONSE_QUALITY_METRIC.id_metric = RESPONSE_QUALITY_METRIC.id_metric + LEFT JOIN demo.DOG_Unit_Measurement UNIT_MEASUREMENT ON t_RESPONSE_QUALITY_METRIC.id_unit_measurement = UNIT_MEASUREMENT.id_unit_measurement + ORDER BY t_RESPONSE_QUALITY_METRIC.name + ; + + -- Errors + SELECT + t_ERROR.id_error + , t_ERROR.id_type + , t_ERROR.code + , ERROR_TYPE.name + , ERROR_TYPE.description + , ERROR_TYPE.is_breaking_error + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour + , t_ERROR.msg + FROM tmp_Msg_Error t_ERROR + INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; + + IF a_debug = 1 AND v_can_view = 1 THEN + SELECT * FROM tmp_Response_Quality_Metric; + END IF; + + CALL demo.p_dog_clear_calc_response_quality_metric( + v_guid -- a_guid + , 0 -- a_debug + ); + + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Response_Quality_Metric; + + IF a_debug = 1 THEN + CALL demo.p_core_debug_timing_reporting ( v_time_start ); + END IF; +END // +DELIMITER ; + + +/* + +CALL demo.p_dog_get_many_response_quality_metric ( + 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user + , 1 -- a_get_all_response_quality_metric + , 0 -- a_get_inactive_response_quality_metric + , '' -- a_ids_response_quality_metric + , '' -- a_names_response_quality_metric + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 1 -- a_require_any_non_id_search_filters_met + , 1 -- a_debug +); + + +CALL demo.p_dog_get_many_response_quality_metric ( + 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user + , 1 -- a_get_all_response_quality_metric + , 0 -- a_get_inactive_response_quality_metric + , '' -- a_ids_response_quality_metric + , 'pat,point' -- a_names_response_quality_metric + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 1 -- a_require_any_non_id_search_filters_met + , 1 -- a_debug +); + +*/ \ No newline at end of file diff --git a/static/MySQL/10700_tbl_DOG_Unit_Measurement.sql b/static/MySQL/10700_tbl_DOG_Unit_Measurement.sql index 54253a3..6874dd3 100644 --- a/static/MySQL/10700_tbl_DOG_Unit_Measurement.sql +++ b/static/MySQL/10700_tbl_DOG_Unit_Measurement.sql @@ -12,8 +12,8 @@ WHERE CREATE TABLE IF NOT EXISTS DOG_Unit_Measurement ( id_unit_measurement INT NOT NULL AUTO_INCREMENT PRIMARY KEY - , name_singular VARCHAR(255) NOT NULL - , name_plural VARCHAR(256) NOT NULL + , name_singular VARCHAR(250) NOT NULL + , name_plural VARCHAR(250) NOT NULL , symbol VARCHAR(50) NOT NULL , symbol_is_suffix_not_prefix BIT NOT NULL DEFAULT 1 , is_base_unit BIT NOT NULL DEFAULT 0 diff --git a/static/MySQL/11322_tbl_DOG_Distraction_Temp.sql b/static/MySQL/11322_tbl_DOG_Distraction_Temp.sql index 69de7f4..8e7e289 100644 --- a/static/MySQL/11322_tbl_DOG_Distraction_Temp.sql +++ b/static/MySQL/11322_tbl_DOG_Distraction_Temp.sql @@ -1,6 +1,8 @@ USE parts; +DROP TABLE IF EXISTS parts.DOG_Distraction_Temp; + SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE @@ -14,6 +16,7 @@ CREATE TABLE IF NOT EXISTS parts.DOG_Distraction_Temp ( , id_assessment INT , id_distraction_type INT , id_intensity_level_emotional INT + , id_intensity_level_scent INT , id_intensity_level_sight INT , id_intensity_level_sound INT , id_intensity_level_touch INT diff --git a/static/MySQL/11342_tbl_DOG_Assessment_Response_Temp.sql b/static/MySQL/11342_tbl_DOG_Assessment_Response_Temp.sql index f82b748..ee6b25f 100644 --- a/static/MySQL/11342_tbl_DOG_Assessment_Response_Temp.sql +++ b/static/MySQL/11342_tbl_DOG_Assessment_Response_Temp.sql @@ -1,6 +1,8 @@ USE parts; +-- DROP TABLE IF EXISTS parts.DOG_Assessment_Response_Temp; + SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE @@ -10,6 +12,7 @@ WHERE CREATE TABLE IF NOT EXISTS parts.DOG_Assessment_Response_Temp ( id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_response INT , id_assessment_command_modality_link INT , id_response_quality_metric INT , id_obedience_level INT diff --git a/static/MySQL/71304_p_dog_calc_lighting_level.sql b/static/MySQL/71304_p_dog_calc_lighting_level.sql index 50e1110..9c4229e 100644 --- a/static/MySQL/71304_p_dog_calc_lighting_level.sql +++ b/static/MySQL/71304_p_dog_calc_lighting_level.sql @@ -68,8 +68,8 @@ BEGIN , ERROR_TYPE.name , ERROR_TYPE.description , ERROR_TYPE.is_breaking_error - , ERROR_TYPE.background_lighting_level - , ERROR_TYPE.text_lighting_level + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour , t_ERROR.msg FROM tmp_Msg_Error_Calc_Lighting_Level t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type @@ -481,8 +481,8 @@ BEGIN , ERROR_TYPE.name , ERROR_TYPE.description , ERROR_TYPE.is_breaking_error - , ERROR_TYPE.background_lighting_level - , ERROR_TYPE.text_lighting_level + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour , t_ERROR.msg FROM tmp_Msg_Error_Calc_Lighting_Level t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type diff --git a/static/MySQL/71304_p_dog_get_many_lighting_level.sql b/static/MySQL/71304_p_dog_get_many_lighting_level.sql index d57241e..935c2db 100644 --- a/static/MySQL/71304_p_dog_get_many_lighting_level.sql +++ b/static/MySQL/71304_p_dog_get_many_lighting_level.sql @@ -65,8 +65,8 @@ BEGIN , ERROR_TYPE.name , ERROR_TYPE.description , ERROR_TYPE.is_breaking_error - , ERROR_TYPE.background_lighting_level - , ERROR_TYPE.text_lighting_level + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour , t_ERROR.msg FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type @@ -317,8 +317,8 @@ BEGIN , ERROR_TYPE.name , ERROR_TYPE.description , ERROR_TYPE.is_breaking_error - , ERROR_TYPE.background_lighting_level - , ERROR_TYPE.text_lighting_level + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour , t_ERROR.msg FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type diff --git a/static/MySQL/71308_p_dog_get_many_assessment.sql b/static/MySQL/71308_p_dog_get_many_assessment.sql index cfd395c..3670609 100644 --- a/static/MySQL/71308_p_dog_get_many_assessment.sql +++ b/static/MySQL/71308_p_dog_get_many_assessment.sql @@ -163,6 +163,7 @@ BEGIN , id_user_handler INT , notes TEXT , temperature_celcius DECIMAL(5, 2) + -- , difficulty_level FLOAT , active BIT , does_meet_id_filters BIT NOT NULL , does_meet_non_id_filters BIT NOT NULL @@ -340,6 +341,7 @@ BEGIN , id_user_handler , notes , temperature_celcius + -- , difficulty_level , active , does_meet_id_filters , does_meet_non_id_filters @@ -352,6 +354,7 @@ BEGIN , ASSESSMENT_T.id_user_handler , ASSESSMENT_T.notes , ASSESSMENT_T.temperature_celcius + -- , ASSESSMENT_T.difficulty_level , ASSESSMENT_T.active , ASSESSMENT_T.does_meet_id_filters @@ -391,6 +394,7 @@ BEGIN , USER.surname AS surname_user_handler , t_ASSESSMENT.notes , t_ASSESSMENT.temperature_celcius + -- , t_ASSESSMENT.difficulty_level , t_ASSESSMENT.active , t_ASSESSMENT.does_meet_id_filters diff --git a/static/MySQL/71310_p_dog_save_dog_assessment.sql b/static/MySQL/71310_p_dog_save_dog_assessment.sql new file mode 100644 index 0000000..32ef969 --- /dev/null +++ b/static/MySQL/71310_p_dog_save_dog_assessment.sql @@ -0,0 +1,693 @@ + +USE parts; + +DROP PROCEDURE IF EXISTS parts.p_dog_save_dog_command_link; + +DELIMITER // +CREATE PROCEDURE parts.p_dog_save_dog_command_link ( + IN a_comment VARCHAR(500), + IN a_guid BINARY(36), + IN a_id_user INT, + IN a_debug BIT +) +BEGIN + DECLARE v_can_admin BIT; + DECLARE v_can_create BIT; + DECLARE v_code_type_error_bad_data VARCHAR(100); + DECLARE v_id_access_level_edit INT; + DECLARE v_id_change_set INT; + DECLARE v_id_permission_dog_new INT; + DECLARE v_id_type_error_bad_data INT; + DECLARE v_time_start TIMESTAMP(6); + + DECLARE exit handler for SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @sqlstate = RETURNED_SQLSTATE + , @errno = MYSQL_ERRNO + , @text = MESSAGE_TEXT + ; + + ROLLBACK; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NULL + , code VARCHAR(250) + , msg TEXT NOT NULL + ); + + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + MET.id_type + , @errno + , @text + FROM parts.CORE_Msg_Error_Type MET + WHERE MET.code = 'MYSQL_ERROR' + ; + + SELECT + t_ERROR.id_error + , t_ERROR.id_type + , t_ERROR.code + , ERROR_TYPE.name + , ERROR_TYPE.description + , ERROR_TYPE.is_breaking_error + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour + , t_ERROR.msg + FROM tmp_Msg_Error t_ERROR + INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; + + DROP TABLE IF EXISTS tmp_Msg_Error; + END; + + SET SESSION group_concat_max_len=15000; + + SET v_time_start := CURRENT_TIMESTAMP(6); + SET v_code_type_error_bad_data := 'BAD_DATA'; + SET v_id_type_error_bad_data := (SELECT ERROR_TYPE.id_type FROM parts.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_bad_data LIMIT 1); + SET v_id_permission_dog_new := (SELECT PERMISSION.id_permission FROM parts.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_CREATE' LIMIT 1); + SET v_id_access_level_edit := (SELECT ACCESS_LEVEL.id_access_level FROM parts.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'EDIT' LIMIT 1); + + CALL parts.p_core_validate_guid ( a_guid ); + + DROP TABLE IF EXISTS tmp_Dog_Command_Link_Copy; + DROP TABLE IF EXISTS tmp_Dog_Command_Link; + + CREATE TEMPORARY TABLE tmp_Dog_Command_Link ( + id_temp INT + , id_link INT + , id_dog INT + , id_command INT + , hand_signal_description TEXT + , notes TEXT + , active BIT + , is_new BIT + , name_error VARCHAR(250) + ); + + CREATE TEMPORARY TABLE tmp_Dog_Command_Link_Copy ( + id_temp INT + , id_link INT + , id_dog INT + , id_command INT + , hand_signal_description TEXT + , notes TEXT + , active BIT + , is_new BIT + , name_error VARCHAR(250) + ); + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NULL + , code VARCHAR(250) + , msg TEXT NOT NULL + ); + + + -- Get data from Temp table + INSERT INTO tmp_Dog_Command_Link ( + id_temp + , id_link + , id_dog + , id_command + , hand_signal_description + , notes + , active + , is_new + ) + SELECT + DOG_COMMAND_LINK_T.id_temp + , COALESCE(DOG_COMMAND_LINK.id_link, DOG_COMMAND_LINK_T.id_link) + , COALESCE( + DOG_COMMAND_LINK_T.id_dog + , DOG_COMMAND_LINK.id_dog + ) AS id_dog + , COALESCE( + DOG_COMMAND_LINK_T.id_command + , DOG_COMMAND_LINK.id_command + ) AS id_command + /* + , NULLIF( + COALESCE( + DOG_COMMAND_LINK_T.hand_signal_description + , DOG_COMMAND_LINK.hand_signal_description + ) + , '' + ) AS hand_signal_description + , NULLIF( + COALESCE( + DOG_COMMAND_LINK_T.notes + , DOG_COMMAND_LINK.notes + ) + , '' + ) AS notes + */ + , COALESCE( + DOG_COMMAND_LINK_T.hand_signal_description + , DOG_COMMAND_LINK.hand_signal_description + ) AS hand_signal_description + , COALESCE( + DOG_COMMAND_LINK_T.notes + , DOG_COMMAND_LINK.notes + ) AS notes + , COALESCE(DOG_COMMAND_LINK_T.active, 1) AS active + , CASE WHEN COALESCE(DOG_COMMAND_LINK.id_link, DOG_COMMAND_LINK_T.id_link, 0) < 1 THEN 1 ELSE 0 END AS is_new + FROM parts.DOG_Dog_Command_Link_Temp DOG_COMMAND_LINK_T + LEFT JOIN parts.DOG_Dog_Command_Link DOG_COMMAND_LINK + ON DOG_COMMAND_LINK_T.id_link = DOG_COMMAND_LINK.id_link + OR ( + DOG_COMMAND_LINK_T.id_dog = DOG_COMMAND_LINK.id_dog + AND DOG_COMMAND_LINK_T.id_command = DOG_COMMAND_LINK.id_command + AND ( + DOG_COMMAND_LINK.hand_signal_description IS NULL + OR DOG_COMMAND_LINK_T.hand_signal_description <=> DOG_COMMAND_LINK.hand_signal_description + ) + AND ( + DOG_COMMAND_LINK.notes IS NULL + OR DOG_COMMAND_LINK_T.notes <=> DOG_COMMAND_LINK.notes + ) + ) + WHERE DOG_COMMAND_LINK_T.guid = a_guid + ; + + IF a_debug = 1 THEN + SELECT 'Dog_Command_Link_Temp records'; + SELECT * FROM tmp_Dog_Command_Link; + SELECT COUNT(*) FROM tmp_Dog_Command_Link; + END IF; + + -- Error names + UPDATE tmp_Dog_Command_Link t_DOG_COMMAND_LINK + LEFT JOIN parts.DOG_Dog DOG ON t_DOG_COMMAND_LINK.id_dog = DOG.id_dog + LEFT JOIN parts.DOG_Command COMMAND ON t_DOG_COMMAND_LINK.id_command = COMMAND.id_command + SET t_DOG_COMMAND_LINK.name_error = CASE WHEN + ISNULL(DOG.id_dog) + AND ISNULL(COMMAND.id_command) + THEN COALESCE(t_DOG_COMMAND_LINK.hand_signal_description, t_DOG_COMMAND_LINK.notes, '(No Dog Command Link)') + ELSE CONCAT( + COALESCE(DOG.name, t_DOG_COMMAND_LINK.id_dog, '(No Dog)') + , ' - ' + , COALESCE(COMMAND.name, t_DOG_COMMAND_LINK.id_command, '(No Command)') + ) END + ; + + IF a_debug = 1 THEN + SELECT 'After set name_error'; + SELECT * FROM tmp_Dog_Command_Link; + SELECT COUNT(*) FROM tmp_Dog_Command_Link; + END IF; + + /* + -- Missing Dog Command Link Ids + UPDATE tmp_Dog_Command_Link t_DOG_COMMAND_LINK + LEFT JOIN parts.DOG_Dog_Command_Link DOG_COMMAND_LINK + -- ON t_DOG_COMMAND_LINK.id_link = DOG_COMMAND_LINK.id_link + ON t_DOG_COMMAND_LINK.id_dog = DOG_COMMAND_LINK.id_dog + AND t_DOG_COMMAND_LINK.id_command = DOG_COMMAND_LINK.id_command + SET + t_DOG_COMMAND_LINK.id_link = DOG_COMMAND_LINK.id_link + , t_DOG_COMMAND_LINK.is_new = 0 + WHERE + IFNULL(t_DOG_COMMAND_LINK.id_link, 0) < 1 + AND NOT ISNULL(DOG_COMMAND_LINK.id_link) + ; + + IF a_debug = 1 THEN + SELECT 'After set missing id_link'; + SELECT * FROM tmp_Dog_Command_Link; + SELECT COUNT(*) FROM tmp_Dog_Command_Link; + END IF; + */ + + -- Validation + -- Missing mandatory fields + -- id_dog + IF EXISTS ( + SELECT * + FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK + LEFT JOIN demo.DOG_Dog DOG ON t_DOG_COMMAND_LINK.id_dog = DOG.id_dog + WHERE + ISNULL(t_DOG_COMMAND_LINK.id_dog) + OR ISNULL(DOG.id_dog) + OR DOG.active = 0 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('The following Dog Command Link(s) do not have a valid Dog: ', GROUP_CONCAT(t_DOG_COMMAND_LINK.name_error SEPARATOR ', ')) AS msg + FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK + LEFT JOIN parts.DOG_Dog DOG ON t_DOG_COMMAND_LINK.id_dog = DOG.id_dog + WHERE + ISNULL(t_DOG_COMMAND_LINK.id_dog) + OR ISNULL(DOG.id_dog) + OR DOG.active = 0 + ; + END IF; + -- id_command + IF EXISTS ( + SELECT * + FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK + LEFT JOIN demo.DOG_Command COMMAND ON t_DOG_COMMAND_LINK.id_command = COMMAND.id_command + WHERE + ISNULL(t_DOG_COMMAND_LINK.id_command) + OR ISNULL(COMMAND.id_command) + OR COMMAND.active = 0 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('The following Dog Command Link(s) do not have a valid Command: ', GROUP_CONCAT(t_DOG_COMMAND_LINK.name_error SEPARATOR ', ')) AS msg + FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK + LEFT JOIN parts.DOG_Command COMMAND ON t_DOG_COMMAND_LINK.id_command = COMMAND.id_command + WHERE + ISNULL(t_DOG_COMMAND_LINK.id_command) + OR ISNULL(COMMAND.id_command) + OR COMMAND.active = 0 + ; + END IF; + + -- Duplicates + INSERT INTO tmp_Dog_Command_Link_Copy ( + id_temp + , id_link + , id_dog + , id_command + , hand_signal_description + , notes + , active + , is_new + , name_error + ) + SELECT + t_DOG_COMMAND_LINK.id_temp + , t_DOG_COMMAND_LINK.id_link + , t_DOG_COMMAND_LINK.id_dog + , t_DOG_COMMAND_LINK.id_command + , t_DOG_COMMAND_LINK.hand_signal_description + , t_DOG_COMMAND_LINK.notes + , t_DOG_COMMAND_LINK.active + , t_DOG_COMMAND_LINK.is_new + , t_DOG_COMMAND_LINK.name_error + FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK + ; + + IF a_debug = 1 THEN + SELECT COUNT(*) AS Count_Temp_Link FROM tmp_Dog_Command_Link; + SELECT COUNT(*) AS Count_Temp_Link_Copy FROM tmp_Dog_Command_Link_Copy; + + WITH + Combined_Links AS ( + SELECT + DOG_COMMAND_LINK.id_link + , DOG_COMMAND_LINK.id_dog + , DOG_COMMAND_LINK.id_command + , IFNULL( + t_DOG_COMMAND_LINK_COPY.name_error + , CONCAT( + COALESCE(DOG.name, t_DOG_COMMAND_LINK_COPY.id_dog, '(No Dog)') + , ' - ' + , COALESCE(COMMAND.name, t_DOG_COMMAND_LINK_COPY.id_command, '(No Command)') + ) + ) AS name_error + FROM parts.DOG_Dog_Command_Link DOG_COMMAND_LINK + LEFT JOIN tmp_Dog_Command_Link_Copy t_DOG_COMMAND_LINK_COPY + ON DOG_COMMAND_LINK.id_dog = t_DOG_COMMAND_LINK_COPY.id_dog + AND DOG_COMMAND_LINK.id_command = t_DOG_COMMAND_LINK_COPY.id_command + INNER JOIN parts.DOG_Dog DOG ON DOG_COMMAND_LINK.id_dog = DOG.id_dog + INNER JOIN parts.DOG_Command COMMAND ON DOG_COMMAND_LINK.id_command = COMMAND.id_command + WHERE t_DOG_COMMAND_LINK_COPY.is_new = 1 + UNION + SELECT + t_DOG_COMMAND_LINK.id_link + , t_DOG_COMMAND_LINK.id_dog + , t_DOG_COMMAND_LINK.id_command + , t_DOG_COMMAND_LINK.name_error + FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK + ) + , Duplicate_Link_Row_Numbers AS ( + SELECT + COMBINED_LINK.id_link + , COMBINED_LINK.id_dog + , COMBINED_LINK.id_command + , COMBINED_LINK.name_error + , ROW_NUMBER() OVER (PARTITION BY COMBINED_LINK.id_dog, COMBINED_LINK.id_command ORDER BY COMBINED_LINK.name_error ASC) AS index_link_as_duplicate + FROM Combined_Links COMBINED_LINK + ) + SELECT * + FROM Duplicate_Link_Row_Numbers; + END IF; + + IF EXISTS ( + WITH + Combined_Links AS ( + SELECT + DOG_COMMAND_LINK.id_link + , DOG_COMMAND_LINK.id_dog + , DOG_COMMAND_LINK.id_command + , IFNULL( + t_DOG_COMMAND_LINK_COPY.name_error + , CONCAT( + COALESCE(DOG.name, t_DOG_COMMAND_LINK_COPY.id_dog, '(No Dog)') + , ' - ' + , COALESCE(COMMAND.name, t_DOG_COMMAND_LINK_COPY.id_command, '(No Command)') + ) + ) AS name_error + FROM parts.DOG_Dog_Command_Link DOG_COMMAND_LINK + LEFT JOIN tmp_Dog_Command_Link_Copy t_DOG_COMMAND_LINK_COPY + ON DOG_COMMAND_LINK.id_dog = t_DOG_COMMAND_LINK_COPY.id_dog + AND DOG_COMMAND_LINK.id_command = t_DOG_COMMAND_LINK_COPY.id_command + INNER JOIN parts.DOG_Dog DOG ON DOG_COMMAND_LINK.id_dog = DOG.id_dog + INNER JOIN parts.DOG_Command COMMAND ON DOG_COMMAND_LINK.id_command = COMMAND.id_command + WHERE t_DOG_COMMAND_LINK_COPY.is_new = 1 + UNION + SELECT + t_DOG_COMMAND_LINK.id_link + , t_DOG_COMMAND_LINK.id_dog + , t_DOG_COMMAND_LINK.id_command + , t_DOG_COMMAND_LINK.name_error + FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK + ) + , Duplicate_Link_Row_Numbers AS ( + SELECT + COMBINED_LINK.id_link + , COMBINED_LINK.id_dog + , COMBINED_LINK.id_command + , COMBINED_LINK.name_error + , ROW_NUMBER() OVER (PARTITION BY COMBINED_LINK.id_dog, COMBINED_LINK.id_command ORDER BY COMBINED_LINK.name_error ASC) AS index_link_as_duplicate + FROM Combined_Links COMBINED_LINK + ) + SELECT * + FROM Duplicate_Link_Row_Numbers DUPLICATE_LINK + WHERE DUPLICATE_LINK.index_link_as_duplicate > 1 + GROUP BY DUPLICATE_LINK.id_dog, DUPLICATE_LINK.id_command + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + WITH + Combined_Links AS ( + SELECT + DOG_COMMAND_LINK.id_link + , DOG_COMMAND_LINK.id_dog + , DOG_COMMAND_LINK.id_command + , IFNULL( + t_DOG_COMMAND_LINK_COPY.name_error + , CONCAT( + COALESCE(DOG.name, t_DOG_COMMAND_LINK_COPY.id_dog, '(No Dog)') + , ' - ' + , COALESCE(COMMAND.name, t_DOG_COMMAND_LINK_COPY.id_command, '(No Command)') + ) + ) AS name_error + FROM parts.DOG_Dog_Command_Link DOG_COMMAND_LINK + LEFT JOIN tmp_Dog_Command_Link_Copy t_DOG_COMMAND_LINK_COPY + ON DOG_COMMAND_LINK.id_dog = t_DOG_COMMAND_LINK_COPY.id_dog + AND DOG_COMMAND_LINK.id_command = t_DOG_COMMAND_LINK_COPY.id_command + INNER JOIN parts.DOG_Dog DOG ON DOG_COMMAND_LINK.id_dog = DOG.id_dog + INNER JOIN parts.DOG_Command COMMAND ON DOG_COMMAND_LINK.id_command = COMMAND.id_command + WHERE t_DOG_COMMAND_LINK_COPY.is_new = 1 + UNION + SELECT + t_DOG_COMMAND_LINK.id_link + , t_DOG_COMMAND_LINK.id_dog + , t_DOG_COMMAND_LINK.id_command + , t_DOG_COMMAND_LINK.name_error + FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK + ) + , Duplicate_Link_Row_Numbers AS ( + SELECT + COMBINED_LINK.id_link + , COMBINED_LINK.id_dog + , COMBINED_LINK.id_command + , COMBINED_LINK.name_error + , ROW_NUMBER() OVER (PARTITION BY COMBINED_LINK.id_dog, COMBINED_LINK.id_command ORDER BY COMBINED_LINK.name_error ASC) AS index_link_as_duplicate + FROM Combined_Links COMBINED_LINK + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('Attempt to create duplicate or overwrite existing Dog Command Links on: ', GROUP_CONCAT(DUPLICATE_LINK.name_error SEPARATOR ', ')) AS msg + FROM Duplicate_Link_Row_Numbers DUPLICATE_LINK + WHERE DUPLICATE_LINK.index_link_as_duplicate > 1 + GROUP BY + DUPLICATE_LINK.id_dog + , DUPLICATE_LINK.id_command + ; + END IF; + + + -- Permissions + -- Can Create + CALL parts.p_dog_calc_user( + a_guid + , 0 -- get_all_user + , 0 -- get_inactive_user + , a_id_user -- ids_user + , '' -- a_auth0_ids_user + , '' -- a_names_user + , '' -- a_emails_user + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , v_id_permission_dog_new -- ids_permission + , v_id_access_level_edit -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ); + + SELECT + IFNULL(CU_T.has_access, 0) + INTO + v_can_create + FROM parts.DOG_Calc_User_Temp CU_T + WHERE CU_T.GUID = a_guid + LIMIT 1 + ; + + CALL parts.p_dog_clear_calc_user( + a_guid + , 0 -- a_debug + ); + + IF v_can_create = 0 THEN + DELETE t_ME + FROM tmp_Msg_Error t_ME + WHERE t_ME.id_type <> v_id_type_error_no_permission + ; + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_no_permission + , v_code_type_error_no_permission + , 'You do not have permission to edit Commands.' + ) + ; + END IF; + + IF EXISTS (SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF a_debug = 1 THEN + SELECT * from tmp_Dog_Command_Link; + END IF; + + DELETE FROM tmp_Dog_Command_Link; + END IF; + + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + START TRANSACTION; + + INSERT INTO parts.DOG_Dog_Change_Set ( + comment + , id_user_updated_last_by + , updated_last_on + ) + VALUES ( + a_comment + , a_id_user + , v_time_start + ) + ; + + SET v_id_change_set := LAST_INSERT_ID(); + + UPDATE parts.DOG_Dog_Command_Link DOG_COMMAND_LINK + INNER JOIN tmp_Dog_Command_Link t_DOG_COMMAND_LINK + ON DOG_COMMAND_LINK.id_link = t_DOG_COMMAND_LINK.id_link + AND t_DOG_COMMAND_LINK.is_new = 0 + SET + DOG_COMMAND_LINK.id_dog = t_DOG_COMMAND_LINK.id_dog + , DOG_COMMAND_LINK.id_command = t_DOG_COMMAND_LINK.id_command + , DOG_COMMAND_LINK.hand_signal_description = t_DOG_COMMAND_LINK.hand_signal_description + , DOG_COMMAND_LINK.notes = t_DOG_COMMAND_LINK.notes + , DOG_COMMAND_LINK.active = t_DOG_COMMAND_LINK.active + , DOG_COMMAND_LINK.id_change_set = v_id_change_set + ; + + INSERT INTO parts.DOG_Dog_Command_Link ( + id_dog + , id_command + , hand_signal_description + , notes + , active + , id_user_created_by + , created_on + ) + SELECT + t_DOG_COMMAND_LINK.id_dog AS id_dog + , t_DOG_COMMAND_LINK.id_command AS id_command + , t_DOG_COMMAND_LINK.hand_signal_description AS hand_signal_description + , t_DOG_COMMAND_LINK.notes AS notes + , t_DOG_COMMAND_LINK.active AS active + , a_id_user AS created_by + , v_time_start AS created_on + FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK + WHERE + t_DOG_COMMAND_LINK.is_new = 1 + AND t_DOG_COMMAND_LINK.active = 1 + ; + + COMMIT; + END IF; + + START TRANSACTION; + + DELETE FROM parts.DOG_Dog_Command_Link_Temp + WHERE GUID = a_guid + ; + + COMMIT; + + -- Errors + SELECT + t_ERROR.id_error + , t_ERROR.id_type + , t_ERROR.code + , ERROR_TYPE.name + , ERROR_TYPE.description + , ERROR_TYPE.is_breaking_error + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour + , t_ERROR.msg + FROM tmp_Msg_Error t_ERROR + INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; + + IF a_debug = 1 THEN + SELECT * FROM tmp_Dog_Command_Link; + END IF; + + DROP TEMPORARY TABLE tmp_Dog_Command_Link; + DROP TEMPORARY TABLE tmp_Msg_Error; + + IF a_debug = 1 THEN + CALL parts.p_core_debug_timing_reporting ( v_time_start ); + END IF; +END // +DELIMITER ; + + + +/* + +'ripplesipplenippletippledipplekipple' +DELETE FROM parts.DOG_Dog_Command_Link WHERE id_link > 740; +* / +delete +from parts.DOG_Dog_Command_Link_Audit +where id_link > 768 +; +delete +from parts.DOG_Dog_Command_Link +where id_link > 768 +; +delete +from parts.DOG_Dog_Command_Link_Temp +; +select + * + -- COUNT(*) +-- delete +from parts.DOG_Dog_Command_Link_Temp +; +select COUNT(*) +from parts.DOG_Dog_Command_Link_Temp +; +select + * + -- COUNT(*) +-- delete +from parts.DOG_Dog_Command_Link +; +select COUNT(*) +from parts.DOG_Dog_Command_Link +; + +INSERT INTO parts.DOG_Dog_Command_Link_Temp ( + id_link + , id_dog + , id_command + , hand_signal_description + , notes + , active + , guid +) +VALUES ( + -1 -- id_link + , 1 -- id_dog + , 1 -- id_command + , 'Test deez noots' -- hand_signal_description + , NULL -- notes + , 1 -- active + , 'ripplesipplenippletippledipplekipple' +); + +CALL parts.p_dog_save_dog_command_link ( + 'nipples' + , 'ripplesipplenippletippledipplekipple' + , 1 + , 1 +); + + +select + * + -- COUNT(*) +-- delete +from parts.DOG_Dog_Command_Link_Temp +; +select COUNT(*) +from parts.DOG_Dog_Command_Link_Temp +; +select + * + -- COUNT(*) +-- delete +from parts.DOG_Dog_Command_Link +; +select COUNT(*) +from parts.DOG_Dog_Command_Link +; + +*/ \ No newline at end of file diff --git a/static/MySQL/71320_p_dog_calc_distraction.sql b/static/MySQL/71320_p_dog_calc_distraction.sql index 81b963b..2148374 100644 --- a/static/MySQL/71320_p_dog_calc_distraction.sql +++ b/static/MySQL/71320_p_dog_calc_distraction.sql @@ -23,6 +23,10 @@ CREATE PROCEDURE parts.p_dog_calc_distraction ( , IN a_get_inactive_intensity_level_emotional BIT , IN a_ids_intensity_level_emotional TEXT , IN a_names_intensity_level_emotional TEXT + , IN a_get_all_intensity_level_scent BIT + , IN a_get_inactive_intensity_level_scent BIT + , IN a_ids_intensity_level_scent TEXT + , IN a_names_intensity_level_scent TEXT , IN a_get_all_intensity_level_sight BIT , IN a_get_inactive_intensity_level_sight BIT , IN a_ids_intensity_level_sight TEXT @@ -180,6 +184,10 @@ BEGIN , a_get_inactive_intensity_level_emotional , a_ids_intensity_level_emotional , a_names_intensity_level_emotional + , a_get_all_intensity_level_scent + , a_get_inactive_intensity_level_scent + , a_ids_intensity_level_scent + , a_names_intensity_level_scent , a_get_all_intensity_level_sight , a_get_inactive_intensity_level_sight , a_ids_intensity_level_sight @@ -239,6 +247,7 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Touch_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sound_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sight_Calc_Distraction; + DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Scent_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Emotional_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Distraction_Type_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Calc_Distraction; @@ -274,6 +283,15 @@ BEGIN , does_meet_non_id_filters BIT NOT NULL ); + CREATE TEMPORARY TABLE tmp_Intensity_Level_Scent_Calc_Distraction ( + id_intensity_level INT NOT NULL + , code VARCHAR(250) + , name VARCHAR(250) + , active BIT + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL + ); + CREATE TEMPORARY TABLE tmp_Intensity_Level_Sight_Calc_Distraction ( id_intensity_level INT NOT NULL , code VARCHAR(250) @@ -306,6 +324,7 @@ BEGIN , id_assessment INT , id_distraction_type INT , id_intensity_level_emotional INT + , id_intensity_level_scent INT , id_intensity_level_sight INT , id_intensity_level_sound INT , id_intensity_level_touch INT @@ -576,6 +595,71 @@ BEGIN ); END IF; + -- Call Calc Intensity Level Scent + IF NOT EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Distraction t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF a_debug = 1 THEN + SELECT + a_guid -- a_guid + , a_id_user -- a_id_user + , a_get_all_intensity_level_scent -- a_get_all_intensity_level_scent + , a_get_inactive_intensity_level_scent -- a_get_inactive_intensity_level_scent + , a_ids_intensity_level_scent -- a_ids_intensity_level_scent + , a_names_intensity_level_scent -- a_names_intensity_level_scent + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug + ; + END IF; + + CALL parts.p_dog_calc_distraction_intensity_level ( + a_guid -- a_guid + , a_id_user -- a_id_user + , a_get_all_intensity_level_scent -- a_get_all_intensity_level_scent + , a_get_inactive_intensity_level_scent -- a_get_inactive_intensity_level_scent + , a_ids_intensity_level_scent -- a_ids_intensity_level_scent + , a_names_intensity_level_scent -- a_names_intensity_level_scent + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug + ); + + INSERT INTO tmp_Intensity_Level_Scent_Calc_Distraction ( + id_intensity_level + , code + , name + , active + + , does_meet_id_filters + , does_meet_non_id_filters + ) + SELECT + INTENSITY_LEVEL_SCENT_T.id_intensity_level + , INTENSITY_LEVEL_SCENT_T.code + , INTENSITY_LEVEL_SCENT_T.name + , INTENSITY_LEVEL_SCENT_T.active + + , INTENSITY_LEVEL_SCENT_T.does_meet_id_filters + , INTENSITY_LEVEL_SCENT_T.does_meet_non_id_filters + FROM parts.DOG_Distraction_Intensity_Level_Temp INTENSITY_LEVEL_SCENT_T + WHERE INTENSITY_LEVEL_SCENT_T.GUID = a_guid + ; + + IF a_debug = 1 THEN + SELECT * FROM tmp_Intensity_Level_Scent_Calc_Distraction; + END IF; + + CALL parts.p_dog_clear_calc_distraction_intensity_level ( + a_guid + , 0 -- a_debug + ); + END IF; + -- Call Calc Intensity Level Sight IF NOT EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Distraction t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN @@ -889,6 +973,7 @@ BEGIN , DISTRACTION.id_assessment , DISTRACTION.id_distraction_type , DISTRACTION.id_intensity_level_emotional + , DISTRACTION.id_intensity_level_scent , DISTRACTION.id_intensity_level_sight , DISTRACTION.id_intensity_level_sound , DISTRACTION.id_intensity_level_touch @@ -979,6 +1064,7 @@ BEGIN , 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 @@ -1028,6 +1114,7 @@ BEGIN , DISTRACTION.id_assessment , DISTRACTION.id_distraction_type , DISTRACTION.id_intensity_level_emotional + , DISTRACTION.id_intensity_level_scent , DISTRACTION.id_intensity_level_sight , DISTRACTION.id_intensity_level_sound , DISTRACTION.id_intensity_level_touch @@ -1130,6 +1217,7 @@ BEGIN LEFT JOIN tmp_Assessment_Calc_Distraction t_ASSESSMENT ON t_DISTRACTION.id_assessment = t_ASSESSMENT.id_assessment LEFT JOIN tmp_Distraction_Type_Calc_Distraction t_DISTRACTION_TYPE ON t_DISTRACTION.id_distraction_type = t_DISTRACTION_TYPE.id_type LEFT JOIN tmp_Intensity_Level_Emotional_Calc_Distraction t_INTENSITY_LEVEL_EMOTIONAL ON t_DISTRACTION.id_intensity_level_emotional = t_INTENSITY_LEVEL_EMOTIONAL.id_intensity_level + LEFT JOIN tmp_Intensity_Level_Scent_Calc_Distraction t_INTENSITY_LEVEL_SCENT ON t_DISTRACTION.id_intensity_level_scent = t_INTENSITY_LEVEL_SCENT.id_intensity_level LEFT JOIN tmp_Intensity_Level_Sight_Calc_Distraction t_INTENSITY_LEVEL_SIGHT ON t_DISTRACTION.id_intensity_level_sight = t_INTENSITY_LEVEL_SIGHT.id_intensity_level LEFT JOIN tmp_Intensity_Level_Sound_Calc_Distraction t_INTENSITY_LEVEL_SOUND ON t_DISTRACTION.id_intensity_level_sound = t_INTENSITY_LEVEL_SOUND.id_intensity_level LEFT JOIN tmp_Intensity_Level_Touch_Calc_Distraction t_INTENSITY_LEVEL_TOUCH ON t_DISTRACTION.id_intensity_level_touch = t_INTENSITY_LEVEL_TOUCH.id_intensity_level @@ -1141,6 +1229,7 @@ BEGIN OR IFNULL(t_ASSESSMENT.does_meet_id_filters, 1) = 0 OR IFNULL(t_DISTRACTION_TYPE.does_meet_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_id_filters, 1) = 0 + OR IFNULL(t_INTENSITY_LEVEL_SCENT.does_meet_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_id_filters, 1) = 0 @@ -1153,6 +1242,7 @@ BEGIN OR IFNULL(t_ASSESSMENT.does_meet_non_id_filters, 1) = 0 OR IFNULL(t_DISTRACTION_TYPE.does_meet_non_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_non_id_filters, 1) = 0 + OR IFNULL(t_INTENSITY_LEVEL_SCENT.does_meet_non_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_non_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_non_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_non_id_filters, 1) = 0 @@ -1164,6 +1254,7 @@ BEGIN AND IFNULL(t_ASSESSMENT.does_meet_id_filters, 1) = 0 AND IFNULL(t_DISTRACTION_TYPE.does_meet_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_id_filters, 1) = 0 + AND IFNULL(t_INTENSITY_LEVEL_SCENT.does_meet_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_id_filters, 1) = 0 @@ -1174,6 +1265,7 @@ BEGIN AND IFNULL(t_ASSESSMENT.does_meet_non_id_filters, 1) = 0 AND IFNULL(t_DISTRACTION_TYPE.does_meet_non_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_non_id_filters, 1) = 0 + AND IFNULL(t_INTENSITY_LEVEL_SCENT.does_meet_non_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_non_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_non_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_non_id_filters, 1) = 0 @@ -1186,6 +1278,7 @@ BEGIN SELECT * FROM tmp_Assessment_Calc_Distraction; SELECT * FROM tmp_Distraction_Type_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction; + SELECT * FROM tmp_Intensity_Level_Scent_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction; @@ -1273,6 +1366,7 @@ BEGIN SELECT * FROM tmp_Assessment_Calc_Distraction; SELECT * FROM tmp_Distraction_Type_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction; + SELECT * FROM tmp_Intensity_Level_Scent_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction; @@ -1283,19 +1377,21 @@ BEGIN IF a_debug = 1 THEN SELECT * FROM tmp_Assessment_Calc_Distraction; SELECT * FROM tmp_Distraction_Type_Calc_Distraction; - SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction; - SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction; - SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction; - SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction; + SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction; + SELECT * FROM tmp_Intensity_Level_Scent_Calc_Distraction; + SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction; + SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction; + SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction; SELECT * FROM tmp_Distraction_Calc_Distraction; END IF; - DELETE FROM tmp_Assessment_Calc_Distraction; - DELETE FROM tmp_Distraction_Type_Calc_Distraction; - DELETE FROM tmp_Intensity_Level_Emotional_Calc_Distraction; - DELETE FROM tmp_Intensity_Level_Sight_Calc_Distraction; - DELETE FROM tmp_Intensity_Level_Sound_Calc_Distraction; DELETE FROM tmp_Intensity_Level_Touch_Calc_Distraction; + DELETE FROM tmp_Intensity_Level_Sound_Calc_Distraction; + DELETE FROM tmp_Intensity_Level_Sight_Calc_Distraction; + DELETE FROM tmp_Intensity_Level_Scent_Calc_Distraction; + DELETE FROM tmp_Intensity_Level_Emotional_Calc_Distraction; + DELETE FROM tmp_Distraction_Type_Calc_Distraction; + DELETE FROM tmp_Assessment_Calc_Distraction; DELETE FROM tmp_Distraction_Calc_Distraction; END IF; @@ -1312,6 +1408,7 @@ BEGIN , 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 @@ -1329,6 +1426,7 @@ BEGIN , t_DISTRACTION.id_assessment , t_DISTRACTION.id_distraction_type , t_DISTRACTION.id_intensity_level_emotional + , t_DISTRACTION.id_intensity_level_scent , t_DISTRACTION.id_intensity_level_sight , t_DISTRACTION.id_intensity_level_sound , t_DISTRACTION.id_intensity_level_touch @@ -1365,6 +1463,7 @@ BEGIN SELECT * FROM tmp_Assessment_Calc_Distraction; SELECT * FROM tmp_Distraction_Type_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction; + SELECT * FROM tmp_Intensity_Level_Scent_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction; @@ -1388,6 +1487,7 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Touch_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sound_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sight_Calc_Distraction; + DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Scent_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Emotional_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Distraction_Type_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Calc_Distraction; @@ -1423,6 +1523,11 @@ CALL parts.p_dog_calc_distraction ( , '' -- a_ids_intensity_level_emotional , '' -- a_names_intensity_level_emotional + , 1 -- a_get_all_intensity_level_scent + , 0 -- a_get_inactive_intensity_level_scent + , '' -- a_ids_intensity_level_scent + , '' -- a_names_intensity_level_scent + , 1 -- a_get_all_intensity_level_sight , 0 -- a_get_inactive_intensity_level_sight , '' -- a_ids_intensity_level_sight diff --git a/static/MySQL/71320_p_dog_get_many_distraction.sql b/static/MySQL/71320_p_dog_get_many_distraction.sql index 8b573bd..a881ee0 100644 --- a/static/MySQL/71320_p_dog_get_many_distraction.sql +++ b/static/MySQL/71320_p_dog_get_many_distraction.sql @@ -22,6 +22,10 @@ CREATE PROCEDURE parts.p_dog_get_many_distraction ( , IN a_get_inactive_intensity_level_emotional BIT , IN a_ids_intensity_level_emotional TEXT , IN a_names_intensity_level_emotional TEXT + , IN a_get_all_intensity_level_scent BIT + , IN a_get_inactive_intensity_level_scent BIT + , IN a_ids_intensity_level_scent TEXT + , IN a_names_intensity_level_scent TEXT , IN a_get_all_intensity_level_sight BIT , IN a_get_inactive_intensity_level_sight BIT , IN a_ids_intensity_level_sight TEXT @@ -159,6 +163,10 @@ BEGIN , a_get_inactive_intensity_level_emotional , a_ids_intensity_level_emotional , a_names_intensity_level_emotional + , a_get_all_intensity_level_scent + , a_get_inactive_intensity_level_scent + , a_ids_intensity_level_scent + , a_names_intensity_level_scent , a_get_all_intensity_level_sight , a_get_inactive_intensity_level_sight , a_ids_intensity_level_sight @@ -220,6 +228,7 @@ BEGIN , id_assessment INT , id_distraction_type INT , id_intensity_level_emotional INT + , id_intensity_level_scent INT , id_intensity_level_sight INT , id_intensity_level_sound INT , id_intensity_level_touch INT @@ -339,6 +348,10 @@ BEGIN , a_get_inactive_intensity_level_emotional , a_ids_intensity_level_emotional , a_names_intensity_level_emotional + , a_get_all_intensity_level_scent + , a_get_inactive_intensity_level_scent + , a_ids_intensity_level_scent + , a_names_intensity_level_scent , a_get_all_intensity_level_sight , a_get_inactive_intensity_level_sight , a_ids_intensity_level_sight @@ -403,6 +416,10 @@ BEGIN , a_get_inactive_intensity_level_emotional , a_ids_intensity_level_emotional , a_names_intensity_level_emotional + , a_get_all_intensity_level_scent + , a_get_inactive_intensity_level_scent + , a_ids_intensity_level_scent + , a_names_intensity_level_scent , a_get_all_intensity_level_sight , a_get_inactive_intensity_level_sight , a_ids_intensity_level_sight @@ -457,6 +474,7 @@ BEGIN , 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 @@ -472,6 +490,7 @@ BEGIN , DISTRACTION_T.id_assessment , DISTRACTION_T.id_distraction_type , DISTRACTION_T.id_intensity_level_emotional + , DISTRACTION_T.id_intensity_level_scent , DISTRACTION_T.id_intensity_level_sight , DISTRACTION_T.id_intensity_level_sound , DISTRACTION_T.id_intensity_level_touch @@ -511,6 +530,8 @@ BEGIN , DISTRACTION_TYPE.name AS name_distraction_type , t_DISTRACTION.id_intensity_level_emotional , INTENSITY_LEVEL_EMOTIONAL.name AS name_intensity_level_emotional + , t_DISTRACTION.id_intensity_level_scent + , INTENSITY_LEVEL_SCENT.name AS name_intensity_level_scent , t_DISTRACTION.id_intensity_level_sight , INTENSITY_LEVEL_SIGHT.name AS name_intensity_level_sight , t_DISTRACTION.id_intensity_level_sound @@ -527,6 +548,7 @@ BEGIN FROM tmp_Distraction t_DISTRACTION LEFT JOIN parts.DOG_Distraction_Type DISTRACTION_TYPE ON t_DISTRACTION.id_distraction_type = DISTRACTION_TYPE.id_type LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_EMOTIONAL ON t_DISTRACTION.id_intensity_level_emotional = INTENSITY_LEVEL_EMOTIONAL.id_intensity_level + LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_SCENT ON t_DISTRACTION.id_intensity_level_scent = INTENSITY_LEVEL_SCENT.id_intensity_level LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_SIGHT ON t_DISTRACTION.id_intensity_level_sight = INTENSITY_LEVEL_SIGHT.id_intensity_level LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_SOUND ON t_DISTRACTION.id_intensity_level_sound = INTENSITY_LEVEL_SOUND.id_intensity_level LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_TOUCH ON t_DISTRACTION.id_intensity_level_touch = INTENSITY_LEVEL_TOUCH.id_intensity_level @@ -590,6 +612,11 @@ CALL parts.p_dog_get_many_distraction ( , '' -- a_ids_intensity_level_emotional , '' -- a_names_intensity_level_emotional + , 1 -- a_get_all_intensity_level_scent + , 0 -- a_get_inactive_intensity_level_scent + , '' -- a_ids_intensity_level_scent + , '' -- a_names_intensity_level_scent + , 1 -- a_get_all_intensity_level_sight , 0 -- a_get_inactive_intensity_level_sight , '' -- a_ids_intensity_level_sight diff --git a/static/MySQL/71328_p_dog_calc_assessment_command_modality_link.sql b/static/MySQL/71328_p_dog_calc_assessment_command_modality_link.sql index b833b63..8b76c63 100644 --- a/static/MySQL/71328_p_dog_calc_assessment_command_modality_link.sql +++ b/static/MySQL/71328_p_dog_calc_assessment_command_modality_link.sql @@ -12,10 +12,10 @@ CREATE PROCEDURE parts.p_dog_calc_assessment_command_modality_link ( , IN a_ids_link TEXT , IN a_min_distance_from_handler_link FLOAT , IN a_max_distance_from_handler_link FLOAT - , IN a_value_is_in_sight_of_handler_link INT - , IN a_value_is_in_scent_range_of_handler_link INT - , IN a_value_is_in_hearing_range_of_handler_link INT - , IN a_value_is_on_lead_link INT + , IN a_value_is_in_sight_of_handler_link BIT + , IN a_value_is_in_scent_range_of_handler_link BIT + , IN a_value_is_in_hearing_range_of_handler_link BIT + , IN a_value_is_on_lead_link BIT , IN a_min_trial_count_link FLOAT , IN a_max_trial_count_link FLOAT diff --git a/static/MySQL/71328_p_dog_get_many_assessment_command_modality_link.sql b/static/MySQL/71328_p_dog_get_many_assessment_command_modality_link.sql index e2a5aaa..3ee5e7d 100644 --- a/static/MySQL/71328_p_dog_get_many_assessment_command_modality_link.sql +++ b/static/MySQL/71328_p_dog_get_many_assessment_command_modality_link.sql @@ -11,10 +11,10 @@ CREATE PROCEDURE parts.p_dog_get_many_assessment_command_modality_link ( , IN a_ids_link TEXT , IN a_min_distance_from_handler_link FLOAT , IN a_max_distance_from_handler_link FLOAT - , IN a_value_is_in_sight_of_handler_link INT - , IN a_value_is_in_scent_range_of_handler_link INT - , IN a_value_is_in_hearing_range_of_handler_link INT - , IN a_value_is_on_lead_link INT + , IN a_value_is_in_sight_of_handler_link BIT + , IN a_value_is_in_scent_range_of_handler_link BIT + , IN a_value_is_in_hearing_range_of_handler_link BIT + , IN a_value_is_on_lead_link BIT , IN a_min_trial_count_link FLOAT , IN a_max_trial_count_link FLOAT @@ -63,6 +63,7 @@ CREATE PROCEDURE parts.p_dog_get_many_assessment_command_modality_link ( , IN a_get_inactive_bribe BIT , IN a_ids_bribe TEXT , IN a_names_bribe TEXT + , IN a_require_all_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT diff --git a/static/MySQL/71332_p_dog_get_many_response_quality_metric.sql b/static/MySQL/71332_p_dog_get_many_response_quality_metric.sql index bca9209..b60d758 100644 --- a/static/MySQL/71332_p_dog_get_many_response_quality_metric.sql +++ b/static/MySQL/71332_p_dog_get_many_response_quality_metric.sql @@ -1,15 +1,15 @@ USE parts; -DROP PROCEDURE IF EXISTS parts.p_dog_get_many_colour; +DROP PROCEDURE IF EXISTS parts.p_dog_get_many_response_quality_metric; DELIMITER // -CREATE PROCEDURE parts.p_dog_get_many_colour ( +CREATE PROCEDURE parts.p_dog_get_many_response_quality_metric ( IN a_id_user INT - , IN a_get_all_colour BIT - , IN a_get_inactive_colour BIT - , IN a_ids_colour TEXT - , IN a_names_colour TEXT + , IN a_get_all_response_quality_metric BIT + , IN a_get_inactive_response_quality_metric BIT + , IN a_ids_response_quality_metric TEXT + , IN a_names_response_quality_metric TEXT , IN a_require_all_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT @@ -86,10 +86,10 @@ BEGIN SET a_id_user := IFNULL(a_id_user, 0); /* - SET a_get_all_colour := IFNULL(a_get_all_colour, 0); - SET a_get_inactive_colour := IFNULL(a_get_inactive_colour, 0); - SET a_ids_colour := TRIM(IFNULL(a_ids_colour, '')); - SET a_names_colour := TRIM(IFNULL(a_names_colour, '')); + SET a_get_all_response_quality_metric := IFNULL(a_get_all_response_quality_metric, 0); + SET a_get_inactive_response_quality_metric := IFNULL(a_get_inactive_response_quality_metric, 0); + SET a_ids_response_quality_metric := TRIM(IFNULL(a_ids_response_quality_metric, '')); + SET a_names_response_quality_metric := TRIM(IFNULL(a_names_response_quality_metric, '')); SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); @@ -100,10 +100,10 @@ BEGIN IF a_debug = 1 THEN SELECT a_id_user - , a_get_all_colour - , a_get_inactive_colour - , a_ids_colour - , a_names_colour + , a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric + , a_ids_response_quality_metric + , a_names_response_quality_metric , a_require_all_id_search_filters_met , a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met @@ -121,16 +121,18 @@ BEGIN END IF; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; - DROP TEMPORARY TABLE IF EXISTS tmp_Colour; + DROP TEMPORARY TABLE IF EXISTS tmp_Response_Quality_Metric; - CREATE TEMPORARY TABLE tmp_Colour ( - id_colour INT NOT NULL - , code VARCHAR(250) + CREATE TEMPORARY TABLE tmp_Response_Quality_Metric ( + id_metric INT NOT NULL + , id_unit_measurement INT + , code VARCHAR(250) , name VARCHAR(250) + , value_min DOUBLE + , value_max DOUBLE , active BIT - - , does_meet_id_filters BIT - , does_meet_non_id_filters BIT + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL ); CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( @@ -207,7 +209,7 @@ BEGIN VALUES ( v_id_type_error_no_permission , v_code_type_error_no_permission - , 'You do not have permission to view Colours.' + , 'You do not have permission to view RESPONSE_QUALITY_METRIC.' ) ; END IF; @@ -218,16 +220,16 @@ BEGIN ); - -- Call Colour Calc + -- Call Response_Quality_Metric Calc IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN SELECT v_guid -- a_guid , a_id_user -- a_id_user - , a_get_all_colour -- a_get_all_colour - , a_get_inactive_colour -- a_get_inactive_colour - , a_ids_colour -- a_ids_colour - , a_names_colour -- a_names_colour + , a_get_all_response_quality_metric -- a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric -- a_get_inactive_response_quality_metric + , a_ids_response_quality_metric -- a_ids_response_quality_metric + , a_names_response_quality_metric -- a_names_response_quality_metric , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met @@ -237,13 +239,13 @@ BEGIN ; END IF; - CALL parts.p_dog_calc_colour ( + CALL parts.p_dog_calc_response_quality_metric ( v_guid -- a_guid , a_id_user -- a_id_user - , a_get_all_colour -- a_get_all_colour - , a_get_inactive_colour -- a_get_inactive_colour - , a_ids_colour -- a_ids_colour - , a_names_colour -- a_names_colour + , a_get_all_response_quality_metric -- a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric -- a_get_inactive_response_quality_metric + , a_ids_response_quality_metric -- a_ids_response_quality_metric + , a_names_response_quality_metric -- a_names_response_quality_metric , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met @@ -253,60 +255,72 @@ BEGIN ); IF a_debug = 1 THEN - SELECT COUNT(*) FROM parts.DOG_Colour_Temp; - SELECT * FROM parts.DOG_Colour_Temp; + SELECT COUNT(*) FROM parts.DOG_Response_Quality_Metric_Temp; + SELECT * FROM parts.DOG_Response_Quality_Metric_Temp; END IF; - INSERT INTO tmp_Colour ( - id_colour + INSERT INTO tmp_Response_Quality_Metric ( + id_metric + , id_unit_measurement , code , name + , value_min + , value_max , active - , does_meet_id_filters , does_meet_non_id_filters ) SELECT - COLOUR_T.id_colour - , COLOUR_T.code - , COLOUR_T.name - , COLOUR_T.active + RESPONSE_QUALITY_METRIC_T.id_metric + , RESPONSE_QUALITY_METRIC_T.id_unit_measurement + , RESPONSE_QUALITY_METRIC_T.code + , RESPONSE_QUALITY_METRIC_T.name + , RESPONSE_QUALITY_METRIC_T.value_min + , RESPONSE_QUALITY_METRIC_T.value_max + , RESPONSE_QUALITY_METRIC_T.active - , COLOUR_T.does_meet_id_filters - , COLOUR_T.does_meet_non_id_filters - FROM parts.DOG_Colour_Temp COLOUR_T - WHERE COLOUR_T.GUID = v_guid + , RESPONSE_QUALITY_METRIC_T.does_meet_id_filters + , RESPONSE_QUALITY_METRIC_T.does_meet_non_id_filters + FROM parts.DOG_Response_Quality_Metric_Temp RESPONSE_QUALITY_METRIC_T + WHERE RESPONSE_QUALITY_METRIC_T.GUID = v_guid ; IF a_debug = 1 THEN - SELECT COUNT(*) FROM tmp_Colour; - SELECT * FROM tmp_Colour; + SELECT COUNT(*) FROM tmp_Response_Quality_Metric; + SELECT * FROM tmp_Response_Quality_Metric; END IF; END IF; -- Filter outputs IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN - SELECT * FROM tmp_Colour; + SELECT * FROM tmp_Response_Quality_Metric; END IF; - DELETE FROM tmp_Colour; + DELETE FROM tmp_Response_Quality_Metric; END IF; -- Outputs - -- Colours + -- RESPONSE_QUALITY_METRIC SELECT - t_COLOURS.id_colour - , t_COLOURS.code - , t_COLOURS.name - , t_COLOURS.active + t_RESPONSE_QUALITY_METRIC.id_metric + , t_RESPONSE_QUALITY_METRIC.id_unit_measurement + , UNIT_MEASUREMENT.name_singular AS name_singular_unit_measurement + , UNIT_MEASUREMENT.name_plural AS name_plural_unit_measurement + , UNIT_MEASUREMENT.symbol AS symbol_unit_measurement + , t_RESPONSE_QUALITY_METRIC.code + , t_RESPONSE_QUALITY_METRIC.name + , t_RESPONSE_QUALITY_METRIC.value_min + , t_RESPONSE_QUALITY_METRIC.value_max + , t_RESPONSE_QUALITY_METRIC.active - , t_COLOURS.does_meet_id_filters - , t_COLOURS.does_meet_non_id_filters - FROM tmp_Colour t_COLOURS - LEFT JOIN parts.DOG_Colour COLOURS ON t_COLOURS.id_colour = COLOURS.id_colour - ORDER BY t_COLOURS.name + , t_RESPONSE_QUALITY_METRIC.does_meet_id_filters + , t_RESPONSE_QUALITY_METRIC.does_meet_non_id_filters + FROM tmp_Response_Quality_Metric t_RESPONSE_QUALITY_METRIC + LEFT JOIN parts.DOG_Response_Quality_Metric RESPONSE_QUALITY_METRIC ON t_RESPONSE_QUALITY_METRIC.id_metric = RESPONSE_QUALITY_METRIC.id_metric + LEFT JOIN parts.DOG_Unit_Measurement UNIT_MEASUREMENT ON t_RESPONSE_QUALITY_METRIC.id_unit_measurement = UNIT_MEASUREMENT.id_unit_measurement + ORDER BY t_RESPONSE_QUALITY_METRIC.name ; -- Errors @@ -325,16 +339,16 @@ BEGIN ; IF a_debug = 1 AND v_can_view = 1 THEN - SELECT * FROM tmp_Colour; + SELECT * FROM tmp_Response_Quality_Metric; END IF; - CALL parts.p_dog_clear_calc_colour( + CALL parts.p_dog_clear_calc_response_quality_metric( v_guid -- a_guid , 0 -- a_debug ); DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; - DROP TEMPORARY TABLE IF EXISTS tmp_Colour; + DROP TEMPORARY TABLE IF EXISTS tmp_Response_Quality_Metric; IF a_debug = 1 THEN CALL parts.p_core_debug_timing_reporting ( v_time_start ); @@ -345,12 +359,12 @@ DELIMITER ; /* -CALL parts.p_dog_get_many_colour ( +CALL parts.p_dog_get_many_response_quality_metric ( 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user - , 1 -- a_get_all_colour - , 0 -- a_get_inactive_colour - , '' -- a_ids_colour - , '' -- a_names_colour + , 1 -- a_get_all_response_quality_metric + , 0 -- a_get_inactive_response_quality_metric + , '' -- a_ids_response_quality_metric + , '' -- a_names_response_quality_metric , 1 -- a_require_all_id_search_filters_met , 1 -- a_require_any_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met @@ -359,12 +373,12 @@ CALL parts.p_dog_get_many_colour ( ); -CALL demo.p_dog_get_many_colour ( +CALL demo.p_dog_get_many_response_quality_metric ( 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user - , 1 -- a_get_all_colour - , 0 -- a_get_inactive_colour - , '' -- a_ids_colour - , 'pat,point' -- a_names_colour + , 1 -- a_get_all_response_quality_metric + , 0 -- a_get_inactive_response_quality_metric + , '' -- a_ids_response_quality_metric + , 'pat,point' -- a_names_response_quality_metric , 1 -- a_require_all_id_search_filters_met , 1 -- a_require_any_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met diff --git a/static/MySQL/71336_p_dog_calc_obedience_level.sql b/static/MySQL/71336_p_dog_calc_obedience_level.sql index 5af637b..a33db59 100644 --- a/static/MySQL/71336_p_dog_calc_obedience_level.sql +++ b/static/MySQL/71336_p_dog_calc_obedience_level.sql @@ -68,8 +68,8 @@ BEGIN , ERROR_TYPE.name , ERROR_TYPE.description , ERROR_TYPE.is_breaking_error - , ERROR_TYPE.background_obedience_level - , ERROR_TYPE.text_obedience_level + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour , t_ERROR.msg FROM tmp_Msg_Error_Calc_Obedience_Level t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type @@ -481,8 +481,8 @@ BEGIN , ERROR_TYPE.name , ERROR_TYPE.description , ERROR_TYPE.is_breaking_error - , ERROR_TYPE.background_obedience_level - , ERROR_TYPE.text_obedience_level + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour , t_ERROR.msg FROM tmp_Msg_Error_Calc_Obedience_Level t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type diff --git a/static/MySQL/71336_p_dog_get_many_obedience_level.sql b/static/MySQL/71336_p_dog_get_many_obedience_level.sql index 1032d7b..e50d8c4 100644 --- a/static/MySQL/71336_p_dog_get_many_obedience_level.sql +++ b/static/MySQL/71336_p_dog_get_many_obedience_level.sql @@ -65,8 +65,8 @@ BEGIN , ERROR_TYPE.name , ERROR_TYPE.description , ERROR_TYPE.is_breaking_error - , ERROR_TYPE.background_obedience_level - , ERROR_TYPE.text_obedience_level + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour , t_ERROR.msg FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type @@ -317,8 +317,8 @@ BEGIN , ERROR_TYPE.name , ERROR_TYPE.description , ERROR_TYPE.is_breaking_error - , ERROR_TYPE.background_obedience_level - , ERROR_TYPE.text_obedience_level + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour , t_ERROR.msg FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type diff --git a/static/MySQL/71340_p_dog_calc_assessment_response.sql b/static/MySQL/71340_p_dog_calc_assessment_response.sql index b6db4b5..5d96f88 100644 --- a/static/MySQL/71340_p_dog_calc_assessment_response.sql +++ b/static/MySQL/71340_p_dog_calc_assessment_response.sql @@ -1,16 +1,83 @@ USE parts; -DROP PROCEDURE IF EXISTS parts.p_dog_calc_colour; +DROP PROCEDURE IF EXISTS parts.p_dog_calc_assessment_response; DELIMITER // -CREATE PROCEDURE parts.p_dog_calc_colour ( +CREATE PROCEDURE parts.p_dog_calc_assessment_response ( IN a_guid BINARY(36) , IN a_id_user INT - , IN a_get_all_colour BIT - , IN a_get_inactive_colour BIT - , IN a_ids_colour TEXT - , IN a_names_colour TEXT + , IN a_get_all_assessment_response BIT + , IN a_get_inactive_assessment_response BIT + , IN a_ids_assessment_response TEXT + , IN a_notes_assessment_response TEXT + , IN a_min_value_measured_assessment_response INT + , IN a_max_value_measured_assessment_response INT + + , IN a_get_all_ACM_link BIT + , IN a_get_inactive_ACM_link BIT + , IN a_ids_ACM_link TEXT + , IN a_min_distance_from_handler_ACM_link FLOAT + , IN a_max_distance_from_handler_ACM_link FLOAT + , IN a_value_is_in_sight_of_handler_ACM_link INT + , IN a_value_is_in_scent_range_of_handler_ACM_link INT + , IN a_value_is_in_hearing_range_of_handler_ACM_link INT + , IN a_value_is_on_lead_ACM_link INT + , IN a_min_trial_count_ACM_link FLOAT + , IN a_max_trial_count_ACM_link FLOAT + , IN a_get_all_assessment BIT + , IN a_get_inactive_assessment BIT + , IN a_ids_assessment TEXT + , IN a_notes_assessment TEXT + , IN a_min_temperature_assessment DECIMAL(5, 2) + , IN a_max_temperature_assessment DECIMAL(5, 2) + , IN a_get_all_weather BIT + , IN a_get_inactive_weather BIT + , IN a_ids_weather TEXT + , IN a_names_weather TEXT + , IN a_get_all_lighting_level BIT + , IN a_get_inactive_lighting_level BIT + , IN a_ids_lighting_level TEXT + , IN a_names_lighting_level TEXT + , IN a_get_all_location BIT + , IN a_get_inactive_location BIT + , IN a_ids_location TEXT + , IN a_names_location TEXT + , IN a_get_all_user_handler BIT + , IN a_get_inactive_user_handler BIT + , IN a_ids_user_handler TEXT + -- , IN a_auth0_ids_user_handler TEXT + , IN a_names_user_handler TEXT + , IN a_emails_user_handler TEXT + , IN a_get_all_command_category BIT + , IN a_get_inactive_command_category BIT + , IN a_ids_command_category TEXT + , IN a_names_command_category TEXT + , IN a_get_all_command BIT + , IN a_get_inactive_command BIT + , IN a_ids_command TEXT + , IN a_names_command TEXT + , IN a_hand_signal_default_descriptions_command TEXT + , IN a_notes_command TEXT + , IN a_get_all_command_modality BIT + , IN a_get_inactive_command_modality BIT + , IN a_ids_command_modality TEXT + , IN a_names_command_modality TEXT + , IN a_get_all_bribe BIT + , IN a_get_inactive_bribe BIT + , IN a_ids_bribe TEXT + , IN a_names_bribe TEXT + + , IN a_get_all_response_quality_metric BIT + , IN a_get_inactive_response_quality_metric BIT + , IN a_ids_response_quality_metric TEXT + , IN a_names_response_quality_metric TEXT + + , IN a_get_all_obedience_level BIT + , IN a_get_inactive_obedience_level BIT + , IN a_ids_obedience_level TEXT + , IN a_names_obedience_level TEXT + , IN a_require_all_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT @@ -22,8 +89,10 @@ BEGIN DECLARE v_can_view BIT; DECLARE v_code_type_error_bad_data VARCHAR(100); DECLARE v_code_type_error_no_permission VARCHAR(100); - DECLARE v_has_filter_colour_id BIT; - DECLARE v_has_filter_colour_name BIT; + DECLARE v_has_filter_assessment_response_id BIT; + DECLARE v_has_filter_assessment_response_notes BIT; + DECLARE v_has_filter_assessment_response_value_measured_min BIT; + DECLARE v_has_filter_assessment_response_value_measured_max BIT; DECLARE v_id_access_level_view INT; DECLARE v_id_minimum INT; DECLARE v_id_permission_dog_view INT; @@ -41,14 +110,14 @@ BEGIN ROLLBACK; - CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error_Calc_Colour ( + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error_Calc_Assessment_Response ( id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(250) NOT NULL , msg TEXT NOT NULL ); - INSERT INTO tmp_Msg_Error_Calc_Colour ( + INSERT INTO tmp_Msg_Error_Calc_Assessment_Response ( id_type , code , msg @@ -71,11 +140,11 @@ BEGIN , ERROR_TYPE.background_colour , ERROR_TYPE.text_colour , t_ERROR.msg - FROM tmp_Msg_Error_Calc_Colour t_ERROR + FROM tmp_Msg_Error_Calc_Assessment_Response t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type ; - DROP TABLE IF EXISTS tmp_Msg_Error_Calc_Colour; + DROP TABLE IF EXISTS tmp_Msg_Error_Calc_Assessment_Response; END; SET v_time_start := CURRENT_TIMESTAMP(6); @@ -90,10 +159,15 @@ BEGIN CALL parts.p_core_validate_guid ( a_guid ); SET a_id_user := IFNULL(a_id_user, 0); - SET a_get_all_colour := IFNULL(a_get_all_colour, 0); - SET a_get_inactive_colour := IFNULL(a_get_inactive_colour, 0); - SET a_ids_colour := TRIM(IFNULL(a_ids_colour, '')); - SET a_names_colour := TRIM(IFNULL(a_names_colour, '')); + SET a_get_all_assessment_response := IFNULL(a_get_all_assessment_response, 0); + SET a_get_inactive_assessment_response := IFNULL(a_get_inactive_assessment_response, 0); + SET a_ids_assessment_response := TRIM(IFNULL(a_ids_assessment_response, '')); + SET a_notes_assessment_response := TRIM(IFNULL(a_notes_assessment_response, '')); + /* + , IN a_min_value_measured_assessment_response INT + , IN a_max_value_measured_assessment_response INT + */ + -- Foreign key filters corected in their Calc Stored Procedures SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); @@ -105,10 +179,77 @@ BEGIN SELECT a_guid , a_id_user - , a_get_all_colour - , a_get_inactive_colour - , a_ids_colour - , a_names_colour + , a_get_all_assessment_response + , a_get_inactive_assessment_response + , a_ids_assessment_response + , a_notes_assessment_response + , a_min_value_measured_assessment_response + , a_max_value_measured_assessment_response + + , a_get_all_ACM_link + , a_get_inactive_ACM_link + , a_ids_ACM_link + , a_min_distance_from_handler_ACM_link + , a_max_distance_from_handler_ACM_link + , a_value_is_in_sight_of_handler_ACM_link + , a_value_is_in_scent_range_of_handler_ACM_link + , a_value_is_in_hearing_range_of_handler_ACM_link + , a_value_is_on_lead_ACM_link + , a_min_trial_count_ACM_link + , a_max_trial_count_ACM_link + , a_get_all_assessment + , a_get_inactive_assessment + , a_ids_assessment + , a_notes_assessment + , a_min_temperature_assessment + , a_max_temperature_assessment + , a_get_all_weather + , a_get_inactive_weather + , a_ids_weather + , a_names_weather + , a_get_all_lighting_level + , a_get_inactive_lighting_level + , a_ids_lighting_level + , a_names_lighting_level + , a_get_all_location + , a_get_inactive_location + , a_ids_location + , a_names_location + , a_get_all_user_handler + , a_get_inactive_user_handler + , a_ids_user_handler + -- , a_auth0_ids_user_handler + , a_names_user_handler + , a_emails_user_handler + , a_get_all_command_category + , a_get_inactive_command_category + , a_ids_command_category + , a_names_command_category + , a_get_all_command + , a_get_inactive_command + , a_ids_command + , a_names_command + , a_hand_signal_default_descriptions_command + , a_notes_command + , a_get_all_command_modality + , a_get_inactive_command_modality + , a_ids_command_modality + , a_names_command_modality + , a_get_all_bribe + , a_get_inactive_bribe + , a_ids_bribe + , a_names_bribe + + , a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric + , a_ids_response_quality_metric + , a_names_response_quality_metric + + , a_get_all_obedience_level + , a_get_inactive_obedience_level + , a_ids_obedience_level + , a_names_obedience_level + , a_require_all_id_search_filters_met , a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met @@ -125,46 +266,403 @@ BEGIN ; END IF; - DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name_Calc_Colour; - DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Colour; - DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Colour; - DROP TEMPORARY TABLE IF EXISTS tmp_Colour_Calc_Colour; - - CREATE TEMPORARY TABLE tmp_Colour_Calc_Colour ( - id_colour INT NOT NULL + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Notes_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Response_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Obedience_Level_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Response_Quality_Metric_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Command_Modality_Link_Calc_Assessment_Response; + + CREATE TEMPORARY TABLE tmp_Assessment_Command_Modality_Link_Calc_Assessment_Response ( + id_link INT NOT NULL + , id_assessment INT + , id_command INT + , id_command_modality INT + , id_bribe INT + , distance_from_handler FLOAT + , is_in_sight_of_handler BIT + , is_in_scent_range_of_handler BIT + , is_in_hearing_range_of_handler BIT + , is_on_lead BIT + , trial_count INT + , active BIT , does_meet_id_filters BIT NOT NULL , does_meet_non_id_filters BIT NOT NULL ); - CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error_Calc_Colour ( + CREATE TEMPORARY TABLE tmp_Response_Quality_Metric_Calc_Assessment_Response ( + id_metric INT NOT NULL + , id_unit_measurement INT + , code VARCHAR(250) + , name VARCHAR(250) + , value_min DOUBLE + , value_max DOUBLE + , active BIT + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL + ); + + CREATE TEMPORARY TABLE tmp_Obedience_Level_Calc_Assessment_Response ( + id_obedience_level INT NOT NULL + , code VARCHAR(250) + , name VARCHAR(250) + , active BIT + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL + ); + + CREATE TEMPORARY TABLE tmp_Assessment_Response_Calc_Assessment_Response ( + id_response INT NOT NULL + , id_assessment_command_modality_link INT + , id_response_quality_metric INT + , id_obedience_level INT + , value_measured DOUBLE + , notes TEXT + , active BIT + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL + ); + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error_Calc_Assessment_Response ( id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(250) NOT NULL , msg TEXT NOT NULL ); - CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id_Calc_Colour ( + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id_Calc_Assessment_Response ( substring VARCHAR(4000) NOT NULL , as_int INT NULL ); - DELETE FROM tmp_Split_Id_Calc_Colour; + DELETE FROM tmp_Split_Id_Calc_Assessment_Response; - CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Name_Calc_Colour ( + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Notes_Calc_Assessment_Response ( substring VARCHAR(4000) NOT NULL , as_int INT NULL ); - DELETE FROM tmp_Split_Name_Calc_Colour; + DELETE FROM tmp_Split_Notes_Calc_Assessment_Response; - SET v_has_filter_colour_id = CASE WHEN a_ids_colour <> '' THEN 1 ELSE 0 END; - SET v_has_filter_colour_name = CASE WHEN a_names_colour <> '' THEN 1 ELSE 0 END; + SET v_has_filter_assessment_response_id := CASE WHEN a_ids_assessment_response <> '' THEN 1 ELSE 0 END; + SET v_has_filter_assessment_response_notes := CASE WHEN a_notes_assessment_response <> '' THEN 1 ELSE 0 END; + SET v_has_filter_assessment_response_value_measured_min := NOT ISNULL(a_min_value_measured_assessment_response); + SET v_has_filter_assessment_response_value_measured_max := NOT ISNULL(a_max_value_measured_assessment_response); - -- Colours - IF v_has_filter_colour_id = 1 THEN - CALL parts.p_core_split(a_guid, a_ids_colour, ',', a_debug); + -- Call Calc Assessment Command Modality Link + IF NOT EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Assessment_Response t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF a_debug = 1 THEN + SELECT + v_guid -- a_guid + , a_id_user -- a_id_user + , a_get_all_ACM_link + , a_get_inactive_ACM_link + , a_ids_ACM_link + , a_min_distance_from_handler_ACM_link + , a_max_distance_from_handler_ACM_link + , a_value_is_in_sight_of_handler_ACM_link + , a_value_is_in_scent_range_of_handler_ACM_link + , a_value_is_in_hearing_range_of_handler_ACM_link + , a_value_is_on_lead_ACM_link + , a_min_trial_count_ACM_link + , a_max_trial_count_ACM_link + + , a_get_all_assessment + , a_get_inactive_assessment + , a_ids_assessment + , a_notes_assessment + , a_min_temperature_assessment + , a_max_temperature_assessment + , a_get_all_weather + , a_get_inactive_weather + , a_ids_weather + , a_names_weather + , a_get_all_lighting_level + , a_get_inactive_lighting_level + , a_ids_lighting_level + , a_names_lighting_level + , a_get_all_location + , a_get_inactive_location + , a_ids_location + , a_names_location + , a_get_all_user_handler + , a_get_inactive_user_handler + , a_ids_user_handler + -- , a_auth0_ids_user_handler + , a_names_user_handler + , a_emails_user_handler + + , a_get_all_command_category + , a_get_inactive_command_category + , a_ids_command_category + , a_names_command_category + , a_get_all_command + , a_get_inactive_command + , a_ids_command + , a_names_command + , a_hand_signal_default_descriptions_command + , a_notes_command + + , a_get_all_command_modality + , a_get_inactive_command_modality + , a_ids_command_modality + , a_names_command_modality + + , a_get_all_bribe + , a_get_inactive_bribe + , a_ids_bribe + , a_names_bribe + + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug + ; + END IF; + + CALL parts.p_dog_calc_assessment_command_modality_link ( + a_guid -- a_guid + , a_id_user -- a_id_user + , a_get_all_ACM_link + , a_get_inactive_ACM_link + , a_ids_ACM_link + , a_min_distance_from_handler_ACM_link + , a_max_distance_from_handler_ACM_link + , a_value_is_in_sight_of_handler_ACM_link + , a_value_is_in_scent_range_of_handler_ACM_link + , a_value_is_in_hearing_range_of_handler_ACM_link + , a_value_is_on_lead_ACM_link + , a_min_trial_count_ACM_link + , a_max_trial_count_ACM_link + + , a_get_all_assessment + , a_get_inactive_assessment + , a_ids_assessment + , a_notes_assessment + , a_min_temperature_assessment + , a_max_temperature_assessment + , a_get_all_weather + , a_get_inactive_weather + , a_ids_weather + , a_names_weather + , a_get_all_lighting_level + , a_get_inactive_lighting_level + , a_ids_lighting_level + , a_names_lighting_level + , a_get_all_location + , a_get_inactive_location + , a_ids_location + , a_names_location + , a_get_all_user_handler + , a_get_inactive_user_handler + , a_ids_user_handler + -- , a_auth0_ids_user_handler + , a_names_user_handler + , a_emails_user_handler + + , a_get_all_command_category + , a_get_inactive_command_category + , a_ids_command_category + , a_names_command_category + , a_get_all_command + , a_get_inactive_command + , a_ids_command + , a_names_command + , a_hand_signal_default_descriptions_command + , a_notes_command + + , a_get_all_command_modality + , a_get_inactive_command_modality + , a_ids_command_modality + , a_names_command_modality + + , a_get_all_bribe + , a_get_inactive_bribe + , a_ids_bribe + , a_names_bribe + + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug + ); + + INSERT INTO tmp_Assessment_Command_Modality_Link_Calc_Assessment_Response ( + id_link + , id_assessment + , id_command + , id_command_modality + , id_bribe + , distance_from_handler + , is_in_sight_of_handler + , is_in_scent_range_of_handler + , is_in_hearing_range_of_handler + , is_on_lead + , trial_count + , active + , does_meet_id_filters + , does_meet_non_id_filters + ) + SELECT + ASSESSMENT_COMMAND_MODALITY_LINK_T.id_link + , ASSESSMENT_COMMAND_MODALITY_LINK_T.id_assessment + , ASSESSMENT_COMMAND_MODALITY_LINK_T.id_command + , ASSESSMENT_COMMAND_MODALITY_LINK_T.id_command_modality + , ASSESSMENT_COMMAND_MODALITY_LINK_T.id_bribe + , ASSESSMENT_COMMAND_MODALITY_LINK_T.distance_from_handler + , ASSESSMENT_COMMAND_MODALITY_LINK_T.is_in_sight_of_handler + , ASSESSMENT_COMMAND_MODALITY_LINK_T.is_in_scent_range_of_handler + , ASSESSMENT_COMMAND_MODALITY_LINK_T.is_in_hearing_range_of_handler + , ASSESSMENT_COMMAND_MODALITY_LINK_T.is_on_lead + , ASSESSMENT_COMMAND_MODALITY_LINK_T.trial_count + , ASSESSMENT_COMMAND_MODALITY_LINK_T.active + + , ASSESSMENT_COMMAND_MODALITY_LINK_T.does_meet_id_filters + , ASSESSMENT_COMMAND_MODALITY_LINK_T.does_meet_non_id_filters + FROM parts.DOG_Assessment_Command_Modality_Link_Temp ASSESSMENT_COMMAND_MODALITY_LINK_T + WHERE ASSESSMENT_COMMAND_MODALITY_LINK_T.GUID = a_guid + ; + + IF a_debug = 1 THEN + SELECT * FROM tmp_Assessment_Command_Modality_Link_Calc_Assessment_Response; + END IF; + END IF; + + -- Call Calc Response Quality Metric + IF NOT EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Assessment_Response t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF a_debug = 1 THEN + SELECT + a_guid -- a_guid + , a_id_user -- a_id_user + , a_get_all_response_quality_metric -- a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric -- a_get_inactive_response_quality_metric + , a_ids_response_quality_metric -- a_ids_response_quality_metric + , a_names_response_quality_metric -- a_names_response_quality_metric + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug + ; + END IF; + + CALL parts.p_dog_calc_response_quality_metric ( + a_guid -- a_guid + , a_id_user -- a_id_user + , a_get_all_response_quality_metric -- a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric -- a_get_inactive_response_quality_metric + , a_ids_response_quality_metric -- a_ids_response_quality_metric + , a_names_response_quality_metric -- a_names_response_quality_metric + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug + ); + + INSERT INTO tmp_Response_Quality_Metric_Calc_Assessment_Response ( + id_metric + , id_unit_measurement + , code + , name + , value_min + , value_max + , active + , does_meet_id_filters + , does_meet_non_id_filters + ) + SELECT + RESPONSE_QUALITY_METRIC_T.id_metric + , RESPONSE_QUALITY_METRIC_T.id_unit_measurement + , RESPONSE_QUALITY_METRIC_T.code + , RESPONSE_QUALITY_METRIC_T.name + , RESPONSE_QUALITY_METRIC_T.value_min + , RESPONSE_QUALITY_METRIC_T.value_max + , RESPONSE_QUALITY_METRIC_T.active + + , RESPONSE_QUALITY_METRIC_T.does_meet_id_filters + , RESPONSE_QUALITY_METRIC_T.does_meet_non_id_filters + FROM parts.DOG_Response_Quality_Metric_Temp RESPONSE_QUALITY_METRIC_T + WHERE RESPONSE_QUALITY_METRIC_T.GUID = a_guid + ; + + IF a_debug = 1 THEN + SELECT * FROM tmp_Response_Quality_Metric_Calc_Assessment_Response; + END IF; + END IF; + + -- Call Calc Obedience Level + IF NOT EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Assessment_Response t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF a_debug = 1 THEN + SELECT + a_guid -- a_guid + , a_id_user -- a_id_user + , a_get_all_obedience_level -- a_get_all_obedience_level + , a_get_inactive_obedience_level -- a_get_inactive_obedience_level + , a_ids_obedience_level -- a_ids_obedience_level + , a_names_obedience_level -- a_names_obedience_level + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug + ; + END IF; + + CALL parts.p_dog_calc_obedience_level ( + a_guid -- a_guid + , a_id_user -- a_id_user + , a_get_all_obedience_level -- a_get_all_obedience_level + , a_get_inactive_obedience_level -- a_get_inactive_obedience_level + , a_ids_obedience_level -- a_ids_obedience_level + , a_names_obedience_level -- a_names_obedience_level + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug + ); + + INSERT INTO tmp_Obedience_Level_Calc_Assessment_Response ( + id_obedience_level + , code + , name + , active + + , does_meet_id_filters + , does_meet_non_id_filters + ) + SELECT + OBEDIENCE_LEVEL_T.id_obedience_level + , OBEDIENCE_LEVEL_T.code + , OBEDIENCE_LEVEL_T.name + , OBEDIENCE_LEVEL_T.active + + , OBEDIENCE_LEVEL_T.does_meet_id_filters + , OBEDIENCE_LEVEL_T.does_meet_non_id_filters + FROM parts.DOG_Obedience_Level_Temp OBEDIENCE_LEVEL_T + WHERE OBEDIENCE_LEVEL_T.GUID = a_guid + ; + + IF a_debug = 1 THEN + SELECT * FROM tmp_Obedience_Level_Calc_Assessment_Response; + END IF; + END IF; + + -- Assessment_Responses + IF v_has_filter_assessment_response_id = 1 THEN + CALL parts.p_core_split(a_guid, a_ids_assessment_response, ',', a_debug); SET sql_mode = ''; - INSERT INTO tmp_Split_Id_Calc_Colour ( + INSERT INTO tmp_Split_Id_Calc_Assessment_Response ( substring , as_int ) @@ -180,12 +678,12 @@ BEGIN CALL parts.p_core_clear_split( a_guid ); END IF; - IF v_has_filter_colour_name = 1 THEN - CALL parts.p_core_split(a_guid, a_names_colour, ',', a_debug); + IF v_has_filter_assessment_response_notes = 1 THEN + CALL parts.p_core_split(a_guid, a_notes_assessment_response, ',', a_debug); SET sql_mode = ''; - INSERT INTO tmp_Split_Name_Calc_Colour ( + INSERT INTO tmp_Split_Notes_Calc_Assessment_Response ( substring , as_int ) @@ -201,20 +699,20 @@ BEGIN CALL parts.p_core_clear_split( a_guid ); END IF; - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error_Calc_Colour t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error_Calc_Assessment_Response t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF EXISTS ( SELECT * - FROM tmp_Split_Id_Calc_Colour t_SPLIT_ID - LEFT JOIN parts.DOG_Colour COLOURS ON t_SPLIT_ID.as_int = COLOURS.id_colour + FROM tmp_Split_Id_Calc_Assessment_Response t_SPLIT_ID + LEFT JOIN parts.DOG_Assessment_Response ASSESSMENT_RESPONSE ON t_SPLIT_ID.as_int = ASSESSMENT_RESPONSE.id_response WHERE ISNULL(t_SPLIT_ID.as_int) - OR ISNULL(COLOURS.id_colour) + OR ISNULL(ASSESSMENT_RESPONSE.id_response) OR ( - COLOURS.active = 0 - AND a_get_inactive_colour = 0 + ASSESSMENT_RESPONSE.active = 0 + AND a_get_inactive_assessment_response = 0 ) ) THEN - INSERT INTO tmp_Msg_Error_Calc_Colour ( + INSERT INTO tmp_Msg_Error_Calc_Assessment_Response ( id_type , code , msg @@ -222,134 +720,283 @@ BEGIN SELECT v_id_type_error_bad_data , v_code_type_error_bad_data - , CONCAT('Invalid or inactive Colour IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_ID.substring SEPARATOR ', '), 'NULL')) - FROM tmp_Split_Id_Calc_Colour t_SPLIT_ID - LEFT JOIN parts.DOG_Colour COLOURS ON t_SPLIT_ID.as_int = COLOURS.id_colour + , CONCAT('Invalid or inactive Assessment_Response IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_ID.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split_Id_Calc_Assessment_Response t_SPLIT_ID + LEFT JOIN parts.DOG_Assessment_Response ASSESSMENT_RESPONSE ON t_SPLIT_ID.as_int = ASSESSMENT_RESPONSE.id_response WHERE ISNULL(t_SPLIT_ID.as_int) - OR ISNULL(COLOURS.id_colour) + OR ISNULL(ASSESSMENT_RESPONSE.id_response) OR ( - COLOURS.active = 0 - AND a_get_inactive_colour = 0 + ASSESSMENT_RESPONSE.active = 0 + AND a_get_inactive_assessment_response = 0 ) ; - /* Don't error on names, hand signals, or notes not found + /* Don't error on notes not found ELSEIF EXISTS () */ ELSE - INSERT INTO tmp_Colour_Calc_Colour ( - id_colour + IF a_debug = 1 THEN + SELECT 'Assessment_Response Filters'; + WITH + Assessment_Response_Id_Filter AS ( + SELECT ASSESSMENT_RESPONSE.id_response + FROM tmp_Split_Id_Calc_Assessment_Response t_SPLIT_ID + INNER JOIN parts.DOG_Assessment_Response ASSESSMENT_RESPONSE ON t_SPLIT_ID.as_int = ASSESSMENT_RESPONSE.id_response + ) + , Assessment_Response_Notes_Filter AS ( + SELECT ASSESSMENT_RESPONSE.id_response + FROM tmp_Split_Notes_Calc_Assessment_Response t_SPLIT_NOTES + INNER JOIN parts.DOG_Assessment_Response ASSESSMENT_RESPONSE ON ASSESSMENT_RESPONSE.notes LIKE CONCAT('%', t_SPLIT_NOTES.substring, '%') + WHERE NULLIF(t_SPLIT_NOTES.substring, '') IS NOT NULL + ) + , Assessment_Response_Filters AS ( + SELECT + ASSESSMENT_RESPONSE_COMBINED.id_response + , MAX(ASSESSMENT_RESPONSE_COMBINED.does_meet_id_filter) AS does_meet_id_filter + , MAX(ASSESSMENT_RESPONSE_COMBINED.does_meet_notes_filter) AS does_meet_notes_filter + FROM ( + SELECT + ASSESSMENT_RESPONSE_ID_FILTER.id_response + , 1 AS does_meet_id_filter + , 0 AS does_meet_notes_filter + FROM Assessment_Response_Id_Filter ASSESSMENT_RESPONSE_ID_FILTER + UNION + SELECT + ASSESSMENT_RESPONSE_NOTES_FILTER.id_response + , 0 AS does_meet_id_filter + , 1 AS does_meet_notes_filter + FROM Assessment_Response_Notes_Filter ASSESSMENT_RESPONSE_NOTES_FILTER + ) ASSESSMENT_RESPONSE_COMBINED + GROUP BY ASSESSMENT_RESPONSE_COMBINED.id_response + ) + SELECT + ASSESSMENT_RESPONSE.id_response + , ASSESSMENT_RESPONSE.id_assessment_command_modality_link + , ASSESSMENT_RESPONSE.id_response_quality_metric + , ASSESSMENT_RESPONSE.id_obedience_level + , ASSESSMENT_RESPONSE.value_measured + , ASSESSMENT_RESPONSE.notes + , ASSESSMENT_RESPONSE.active + , CASE WHEN + v_has_filter_assessment_response_id = 0 + OR ASSESSMENT_RESPONSE_FILTERS.does_meet_id_filter = 1 + THEN 1 ELSE 0 END AS does_meet_id_filters + , CASE WHEN + ( + v_has_filter_assessment_response_notes = 0 + AND v_has_filter_assessment_response_value_measured_min = 0 + AND v_has_filter_assessment_response_value_measured_max = 0 + ) + OR ASSESSMENT_RESPONSE_FILTERS.does_meet_notes_filter = 1 + OR ( + v_has_filter_assessment_response_value_measured_min = 0 + OR ( + v_has_filter_assessment_response_value_measured_min = 1 + AND ASSESSMENT_RESPONSE.value_measured >= v_has_filter_assessment_response_value_measured_min + ) + ) + OR ( + v_has_filter_assessment_response_value_measured_max = 0 + OR ( + v_has_filter_assessment_response_value_measured_max = 1 + AND ASSESSMENT_RESPONSE.value_measured <= v_has_filter_assessment_response_value_measured_max + ) + ) + THEN 1 ELSE 0 END AS does_meet_non_id_filters + FROM parts.DOG_Assessment_Response ASSESSMENT_RESPONSE + LEFT JOIN Assessment_Response_Filters ASSESSMENT_RESPONSE_FILTERS ON ASSESSMENT_RESPONSE.id_response = ASSESSMENT_RESPONSE_FILTERS.id_response + WHERE + ( + a_get_all_assessment_response = 1 + OR ( + v_has_filter_assessment_response_id = 1 + AND ASSESSMENT_RESPONSE_FILTERS.does_meet_id_filter = 1 + ) + OR ( + v_has_filter_assessment_response_notes = 1 + AND ASSESSMENT_RESPONSE_FILTERS.does_meet_notes_filter = 1 + ) + OR ( + v_has_filter_assessment_response_value_measured_min = 1 + AND ASSESSMENT_RESPONSE.value_measured >= v_has_filter_assessment_response_value_measured_min + ) + OR ( + v_has_filter_assessment_response_value_measured_max = 1 + AND ASSESSMENT_RESPONSE.value_measured <= v_has_filter_assessment_response_value_measured_max + ) + ) + AND ( + a_get_inactive_assessment_response = 1 + OR ASSESSMENT_RESPONSE.active = 1 + ) + ; + END IF; + INSERT INTO tmp_Assessment_Response_Calc_Assessment_Response ( + id_response + , id_assessment_command_modality_link + , id_response_quality_metric + , id_obedience_level + , value_measured + , notes + , active , does_meet_id_filters , does_meet_non_id_filters ) WITH - Colour_Id_Filter AS ( - SELECT COLOURS.id_colour - FROM tmp_Split_Id_Calc_Colour t_SPLIT_ID - INNER JOIN parts.DOG_Colour COLOURS ON t_SPLIT_ID.as_int = COLOURS.id_colour + Assessment_Response_Id_Filter AS ( + SELECT ASSESSMENT_RESPONSE.id_response + FROM tmp_Split_Id_Calc_Assessment_Response t_SPLIT_ID + INNER JOIN parts.DOG_Assessment_Response ASSESSMENT_RESPONSE ON t_SPLIT_ID.as_int = ASSESSMENT_RESPONSE.id_response ) - , Colour_Name_Filter AS ( - SELECT COLOURS.id_colour - FROM tmp_Split_Name_Calc_Colour t_SPLIT_NAME - INNER JOIN parts.DOG_Colour COLOURS ON COLOURS.name LIKE CONCAT('%', t_SPLIT_NAME.substring, '%') - WHERE NULLIF(t_SPLIT_NAME.substring, '') IS NOT NULL + , Assessment_Response_Notes_Filter AS ( + SELECT ASSESSMENT_RESPONSE.id_response + FROM tmp_Split_Notes_Calc_Assessment_Response t_SPLIT_NOTES + INNER JOIN parts.DOG_Assessment_Response ASSESSMENT_RESPONSE ON ASSESSMENT_RESPONSE.notes LIKE CONCAT('%', t_SPLIT_NOTES.substring, '%') + WHERE NULLIF(t_SPLIT_NOTES.substring, '') IS NOT NULL ) - , Colour_Filters AS ( + , Assessment_Response_Filters AS ( SELECT - COLOURS_COMBINED.id_colour - , MAX(COLOURS_COMBINED.does_meet_id_filter) AS does_meet_id_filter - , MAX(COLOURS_COMBINED.does_meet_name_filter) AS does_meet_name_filter + ASSESSMENT_RESPONSE_COMBINED.id_response + , MAX(ASSESSMENT_RESPONSE_COMBINED.does_meet_id_filter) AS does_meet_id_filter + , MAX(ASSESSMENT_RESPONSE_COMBINED.does_meet_notes_filter) AS does_meet_notes_filter FROM ( SELECT - COLOURS_ID_FILTER.id_colour + ASSESSMENT_RESPONSE_ID_FILTER.id_response , 1 AS does_meet_id_filter - , 0 AS does_meet_name_filter - FROM Colour_Id_Filter COLOURS_ID_FILTER + , 0 AS does_meet_notes_filter + FROM Assessment_Response_Id_Filter ASSESSMENT_RESPONSE_ID_FILTER UNION SELECT - COLOURS_NAME_FILTER.id_colour + ASSESSMENT_RESPONSE_NOTES_FILTER.id_response , 0 AS does_meet_id_filter - , 1 AS does_meet_name_filter - FROM Colour_Name_Filter COLOURS_NAME_FILTER - ) COLOURS_COMBINED - GROUP BY COLOURS_COMBINED.id_colour + , 1 AS does_meet_notes_filter + FROM Assessment_Response_Notes_Filter ASSESSMENT_RESPONSE_NOTES_FILTER + ) ASSESSMENT_RESPONSE_COMBINED + GROUP BY ASSESSMENT_RESPONSE_COMBINED.id_response ) SELECT - COLOURS.id_colour + ASSESSMENT_RESPONSE.id_response + , ASSESSMENT_RESPONSE.id_assessment_command_modality_link + , ASSESSMENT_RESPONSE.id_response_quality_metric + , ASSESSMENT_RESPONSE.id_obedience_level + , ASSESSMENT_RESPONSE.value_measured + , ASSESSMENT_RESPONSE.notes + , ASSESSMENT_RESPONSE.active , CASE WHEN - v_has_filter_colour_id = 0 - OR IFNULL(COLOURS_FILTERS.does_meet_id_filter, 0) = 1 + v_has_filter_assessment_response_id = 0 + OR ASSESSMENT_RESPONSE_FILTERS.does_meet_id_filter = 1 THEN 1 ELSE 0 END AS does_meet_id_filters , CASE WHEN ( - v_has_filter_colour_name = 0 + v_has_filter_assessment_response_notes = 0 + AND v_has_filter_assessment_response_value_measured_min = 0 + AND v_has_filter_assessment_response_value_measured_max = 0 + ) + OR ASSESSMENT_RESPONSE_FILTERS.does_meet_notes_filter = 1 + OR ( + v_has_filter_assessment_response_value_measured_min = 0 + OR ( + v_has_filter_assessment_response_value_measured_min = 1 + AND ASSESSMENT_RESPONSE.value_measured >= v_has_filter_assessment_response_value_measured_min + ) + ) + OR ( + v_has_filter_assessment_response_value_measured_max = 0 + OR ( + v_has_filter_assessment_response_value_measured_max = 1 + AND ASSESSMENT_RESPONSE.value_measured <= v_has_filter_assessment_response_value_measured_max + ) ) - OR IFNULL(COLOURS_FILTERS.does_meet_name_filter, 0) = 1 THEN 1 ELSE 0 END AS does_meet_non_id_filters - FROM parts.DOG_Colour COLOURS - LEFT JOIN Colour_Filters COLOURS_FILTERS ON COLOURS.id_colour = COLOURS_FILTERS.id_colour + FROM parts.DOG_Assessment_Response ASSESSMENT_RESPONSE + LEFT JOIN Assessment_Response_Filters ASSESSMENT_RESPONSE_FILTERS ON ASSESSMENT_RESPONSE.id_response = ASSESSMENT_RESPONSE_FILTERS.id_response WHERE ( - a_get_all_colour = 1 + a_get_all_assessment_response = 1 OR ( - v_has_filter_colour_id = 1 - AND COLOURS_FILTERS.does_meet_id_filter = 1 + v_has_filter_assessment_response_id = 1 + AND ASSESSMENT_RESPONSE_FILTERS.does_meet_id_filter = 1 ) OR ( - v_has_filter_colour_name = 1 - AND COLOURS_FILTERS.does_meet_name_filter = 1 + v_has_filter_assessment_response_notes = 1 + AND ASSESSMENT_RESPONSE_FILTERS.does_meet_notes_filter = 1 + ) + OR ( + v_has_filter_assessment_response_value_measured_min = 1 + AND ASSESSMENT_RESPONSE.value_measured >= v_has_filter_assessment_response_value_measured_min + ) + OR ( + v_has_filter_assessment_response_value_measured_max = 1 + AND ASSESSMENT_RESPONSE.value_measured <= v_has_filter_assessment_response_value_measured_max ) ) AND ( - a_get_inactive_colour = 1 - OR COLOURS.active = 1 + a_get_inactive_assessment_response = 1 + OR ASSESSMENT_RESPONSE.active = 1 ) ; END IF; END IF; - DELETE FROM tmp_Split_Id_Calc_Colour; - DELETE FROM tmp_Split_Name_Calc_Colour; + DELETE FROM tmp_Split_Id_Calc_Assessment_Response; + DELETE FROM tmp_Split_Notes_Calc_Assessment_Response; IF a_debug = 1 THEN - SELECT 'After get Colours '; - SELECT * FROM tmp_Colour_Calc_Colour; + SELECT 'After get Assessment_Responses'; + SELECT * FROM tmp_Assessment_Response_Calc_Assessment_Response; END IF; -- Filter records - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error_Calc_Colour t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN - DELETE t_COLOURS - FROM tmp_Colour_Calc_Colour t_COLOURS + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error_Calc_Assessment_Response t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + DELETE t_ASSESSMENT_RESPONSE + FROM tmp_Assessment_Response_Calc_Assessment_Response t_ASSESSMENT_RESPONSE + LEFT JOIN tmp_Assessment_Command_Modality_Link_Calc_Assessment_Response t_ASSESSMENT_COMMAND_MODALITY_LINK ON t_ASSESSMENT_RESPONSE.id_assessment_command_modality_link = t_ASSESSMENT_COMMAND_MODALITY_LINK.id_link + LEFT JOIN tmp_Response_Quality_Metric_Calc_Assessment_Response t_RESPONSE_QUALITY_METRIC ON t_ASSESSMENT_RESPONSE.id_response_quality_metric = t_RESPONSE_QUALITY_METRIC.id_metric + LEFT JOIN tmp_Obedience_Level_Calc_Assessment_Response t_OBEDIENCE_LEVEL ON t_ASSESSMENT_RESPONSE.id_obedience_level = t_OBEDIENCE_LEVEL.id_obedience_level WHERE ( a_require_all_id_search_filters_met = 1 AND ( - t_COLOURS.does_meet_id_filters = 0 + t_ASSESSMENT_RESPONSE.does_meet_id_filters = 0 + OR IFNULL(t_ASSESSMENT_COMMAND_MODALITY_LINK.does_meet_id_filters, 1) = 0 + OR IFNULL(t_RESPONSE_QUALITY_METRIC.does_meet_id_filters, 1) = 0 + OR IFNULL(t_OBEDIENCE_LEVEL.does_meet_id_filters, 1) = 0 ) ) OR ( a_require_all_non_id_search_filters_met = 1 AND ( - t_COLOURS.does_meet_non_id_filters = 0 + t_ASSESSMENT_RESPONSE.does_meet_non_id_filters = 0 + OR IFNULL(t_ASSESSMENT_COMMAND_MODALITY_LINK.does_meet_non_id_filters, 1) = 0 + OR IFNULL(t_RESPONSE_QUALITY_METRIC.does_meet_non_id_filters, 1) = 0 + OR IFNULL(t_OBEDIENCE_LEVEL.does_meet_non_id_filters, 1) = 0 ) ) OR ( a_require_any_id_search_filters_met = 1 - AND t_COLOURS.does_meet_id_filters = 0 + AND t_ASSESSMENT_RESPONSE.does_meet_id_filters = 0 + AND IFNULL(t_ASSESSMENT_COMMAND_MODALITY_LINK.does_meet_id_filters, 1) = 0 + AND IFNULL(t_RESPONSE_QUALITY_METRIC.does_meet_id_filters, 1) = 0 + AND IFNULL(t_OBEDIENCE_LEVEL.does_meet_id_filters, 1) = 0 ) OR ( a_require_any_non_id_search_filters_met = 1 - AND t_COLOURS.does_meet_non_id_filters = 0 + AND t_ASSESSMENT_RESPONSE.does_meet_non_id_filters = 0 + AND IFNULL(t_ASSESSMENT_COMMAND_MODALITY_LINK.does_meet_non_id_filters, 1) = 0 + AND IFNULL(t_RESPONSE_QUALITY_METRIC.does_meet_non_id_filters, 1) = 0 + AND IFNULL(t_OBEDIENCE_LEVEL.does_meet_non_id_filters, 1) = 0 ) ; END IF; IF a_debug = 1 THEN - SELECT 'After filter Colours'; - SELECT * FROM tmp_Colour_Calc_Colour; + SELECT 'After filter Assessment_Responses'; + SELECT * FROM tmp_Assessment_Command_Modality_Link_Calc_Assessment_Response; + SELECT * FROM tmp_Response_Quality_Metric_Calc_Assessment_Response; + SELECT * FROM tmp_Obedience_Level_Calc_Assessment_Response; + SELECT * FROM tmp_Assessment_Response_Calc_Assessment_Response; END IF; - -- Calculated fields -- Permissions IF a_debug = 1 THEN @@ -405,10 +1052,10 @@ BEGIN IF (v_can_view = 0) THEN DELETE t_ME - FROM tmp_Msg_Error_Calc_Colour t_ME + FROM tmp_Msg_Error_Calc_Assessment_Response t_ME WHERE t_ME.id_type <> v_id_type_error_no_permission ; - INSERT INTO tmp_Msg_Error_Calc_Colour ( + INSERT INTO tmp_Msg_Error_Calc_Assessment_Response ( id_type , code , msg @@ -416,7 +1063,7 @@ BEGIN VALUES ( v_id_type_error_no_permission , v_code_type_error_no_permission - , 'You do not have permission to view Dogs and Colours.' + , 'You do not have permission to view Dogs and Button Icons.' ) ; END IF; @@ -428,16 +1075,24 @@ BEGIN IF a_debug = 1 THEN SELECT 'Before non-permitted data deletion'; - SELECT * FROM tmp_Colour_Calc_Colour; - SELECT * FROM tmp_Msg_Error_Calc_Colour; + SELECT * FROM tmp_Assessment_Command_Modality_Link_Calc_Assessment_Response; + SELECT * FROM tmp_Response_Quality_Metric_Calc_Assessment_Response; + SELECT * FROM tmp_Obedience_Level_Calc_Assessment_Response; + SELECT * FROM tmp_Assessment_Response_Calc_Assessment_Response; END IF; - IF EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Colour t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Assessment_Response t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN - SELECT * FROM tmp_Colour_Calc_Colour; + SELECT * FROM tmp_Assessment_Command_Modality_Link_Calc_Assessment_Response; + SELECT * FROM tmp_Response_Quality_Metric_Calc_Assessment_Response; + SELECT * FROM tmp_Obedience_Level_Calc_Assessment_Response; + SELECT * FROM tmp_Assessment_Response_Calc_Assessment_Response; END IF; - DELETE FROM tmp_Colour_Calc_Colour; + DELETE FROM tmp_Assessment_Command_Modality_Link_Calc_Assessment_Response; + DELETE FROM tmp_Response_Quality_Metric_Calc_Assessment_Response; + DELETE FROM tmp_Obedience_Level_Calc_Assessment_Response; + DELETE FROM tmp_Assessment_Response_Calc_Assessment_Response; END IF; IF a_debug = 1 THEN @@ -446,12 +1101,15 @@ BEGIN -- Outputs START TRANSACTION; - -- Colours - INSERT INTO parts.DOG_Colour_Temp ( + -- Assessment_Responses + INSERT INTO parts.DOG_Assessment_Response_Temp ( guid - , id_colour - , code - , name + , id_response + , id_assessment_command_modality_link + , id_response_quality_metric + , id_obedience_level + , value_measured + , notes , active , does_meet_id_filters @@ -459,16 +1117,18 @@ BEGIN ) SELECT a_guid - , t_COLOURS.id_colour - , COLOURS.code - , COLOURS.name - , COLOURS.active + , t_ASSESSMENT_RESPONSE.id_response + , t_ASSESSMENT_RESPONSE.id_assessment_command_modality_link + , t_ASSESSMENT_RESPONSE.id_response_quality_metric + , t_ASSESSMENT_RESPONSE.id_obedience_level + , t_ASSESSMENT_RESPONSE.value_measured + , t_ASSESSMENT_RESPONSE.notes + , t_ASSESSMENT_RESPONSE.active - , t_COLOURS.does_meet_id_filters - , t_COLOURS.does_meet_non_id_filters - FROM parts.DOG_Colour COLOURS - INNER JOIN tmp_Colour_Calc_Colour t_COLOURS ON COLOURS.id_colour = t_COLOURS.id_colour - ORDER BY COLOURS.name + , t_ASSESSMENT_RESPONSE.does_meet_id_filters + , t_ASSESSMENT_RESPONSE.does_meet_non_id_filters + FROM parts.DOG_Assessment_Response ASSESSMENT_RESPONSE + INNER JOIN tmp_Assessment_Response_Calc_Assessment_Response t_ASSESSMENT_RESPONSE ON ASSESSMENT_RESPONSE.id_response = t_ASSESSMENT_RESPONSE.id_response ; COMMIT; @@ -484,21 +1144,40 @@ BEGIN , ERROR_TYPE.background_colour , ERROR_TYPE.text_colour , t_ERROR.msg - FROM tmp_Msg_Error_Calc_Colour t_ERROR + FROM tmp_Msg_Error_Calc_Assessment_Response t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type ; END IF; IF a_debug = 1 AND v_can_view = 1 THEN - SELECT * FROM tmp_Colour_Calc_Colour; + SELECT * FROM tmp_Assessment_Command_Modality_Link_Calc_Assessment_Response; + SELECT * FROM tmp_Response_Quality_Metric_Calc_Assessment_Response; + SELECT * FROM tmp_Obedience_Level_Calc_Assessment_Response; + SELECT * FROM tmp_Assessment_Response_Calc_Assessment_Response; END IF; - - CALL parts.p_dog_clear_calc_dog ( a_guid, 0 ); - DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name_Calc_Colour; - DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Colour; - DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Colour; - DROP TEMPORARY TABLE IF EXISTS tmp_Colour_Calc_Colour; + CALL parts.p_dog_clear_calc_assessment_command_modality_link ( + a_guid + , 0 -- a_debug + ); + + CALL parts.p_dog_clear_calc_response_quality_metric ( + a_guid + , 0 -- a_debug + ); + + CALL parts.p_dog_clear_calc_obedience_level ( + a_guid + , 0 -- a_debug + ); + + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Notes_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Response_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Obedience_Level_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Response_Quality_Metric_Calc_Assessment_Response; + DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Command_Modality_Link_Calc_Assessment_Response; IF a_debug = 1 THEN CALL parts.p_core_debug_timing_reporting ( v_time_start ); @@ -509,14 +1188,80 @@ DELIMITER ; /* - -CALL parts.p_dog_calc_colour ( - 'gripe ' -- a_guid +CALL parts.p_dog_calc_assessment_response ( + 'slippery ' -- a_guid , 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user - , 1 -- a_get_all_colour - , 0 -- a_get_inactive_colour - , '' -- a_ids_colour - , '' -- a_names_colour + , 1 -- a_get_all_assessment_response + , 0 -- a_get_inactive_assessment_response + , '' -- a_ids_assessment_response + , '' -- a_notes_assessment_response + , NULL -- a_min_value_measured_assessment_response + , NULL -- a_max_value_measured_assessment_response + + , 1 -- a_get_all_ACM_link + , 0 -- a_get_inactive_ACM_link + , '' -- a_ids_ACM_link + , NULL -- a_min_distance_from_handler_ACM_link + , NULL -- a_max_distance_from_handler_ACM_link + , NULL -- a_value_is_in_sight_of_handler_ACM_link + , NULL -- a_value_is_in_scent_range_of_handler_ACM_link + , NULL -- a_value_is_in_hearing_range_of_handler_ACM_link + , NULL -- a_value_is_on_lead_ACM_link + , NULL -- a_min_trial_count_ACM_link + , NULL -- a_max_trial_count_ACM_link + , 1 -- a_get_all_assessment + , 0 -- a_get_inactive_assessment + , '' -- a_ids_assessment + , '' -- a_notes_assessment + , NULL -- a_min_temperature_assessment + , NULL -- a_max_temperature_assessment + , 1 -- a_get_all_weather + , 0 -- a_get_inactive_weather + , '' -- a_ids_weather + , '' -- a_names_weather + , 1 -- a_get_all_lighting_level + , 0 -- a_get_inactive_lighting_level + , '' -- a_ids_lighting_level + , '' -- a_names_lighting_level + , 1 -- a_get_all_location + , 0 -- a_get_inactive_location + , '' -- a_ids_location + , '' -- a_names_location + , 1 -- a_get_all_user_handler + , 0 -- a_get_inactive_user_handler + , '' -- a_ids_user_handler + -- , IN a_auth0_ids_user_handler TEXT + , '' -- a_names_user_handler + , '' -- a_emails_user_handler + , 1 -- a_get_all_command_category + , 0 -- a_get_inactive_command_category + , '' -- a_ids_command_category + , '' -- a_names_command_category + , 1 -- a_get_all_command + , 0 -- a_get_inactive_command + , '' -- a_ids_command + , '' -- a_names_command + , '' -- a_hand_signal_default_descriptions_command + , '' -- a_notes_command + , 1 -- a_get_all_command_modality + , 0 -- a_get_inactive_command_modality + , '' -- a_ids_command_modality + , '' -- a_names_command_modality + , 1 -- a_get_all_bribe + , 0 -- a_get_inactive_bribe + , '' -- a_ids_bribe + , '' -- a_names_bribe + + , 1 -- a_get_all_response_quality_metric + , 0 -- a_get_inactive_response_quality_metric + , '' -- a_ids_response_quality_metric + , '' -- a_names_response_quality_metric + + , 1 -- a_get_all_obedience_level + , 0 -- a_get_inactive_obedience_level + , '' -- a_ids_obedience_level + , '' -- a_names_obedience_level + , 0 -- a_require_all_id_search_filters_met , 0 -- a_require_any_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met @@ -526,24 +1271,14 @@ CALL parts.p_dog_calc_colour ( ); SELECT * -FROM parts.DOG_Colour_Temp +FROM parts.DOG_Assessment_Response_Temp ; -/* -SELECT * -FROM parts.DOG_Colour_Temp C -WHERE - C.does_meet_id_filters - AND C.does_meet_non_id_filters -; -*/ -CALL parts.p_dog_clear_calc_colour ( - 'gripe ' -- a_guid + +CALL parts.p_dog_clear_calc_assessment_response ( + 'slippery ' -- a_guid , 1 -- debug ); - -DELETE -FROM parts.DOG_Colour_Temp -; +-- DELETE FROM parts.DOG_Assessment_Response_Temp; */ diff --git a/static/MySQL/71340_p_dog_clear_calc_assessment_response.sql b/static/MySQL/71340_p_dog_clear_calc_assessment_response.sql index 1306eda..f0ccdbf 100644 --- a/static/MySQL/71340_p_dog_clear_calc_assessment_response.sql +++ b/static/MySQL/71340_p_dog_clear_calc_assessment_response.sql @@ -1,11 +1,11 @@ USE parts; -DROP PROCEDURE IF EXISTS parts.p_dog_clear_calc_colour; -DROP PROCEDURE IF EXISTS parts.p_colour_clear_calc_colour; +DROP PROCEDURE IF EXISTS parts.p_dog_clear_calc_assessment_response; +DROP PROCEDURE IF EXISTS parts.p_assessment_response_clear_calc_assessment_response; DELIMITER // -CREATE PROCEDURE parts.p_dog_clear_calc_colour ( +CREATE PROCEDURE parts.p_dog_clear_calc_assessment_response ( IN a_guid BINARY(36) , IN a_debug BIT ) @@ -17,9 +17,9 @@ BEGIN START TRANSACTION; - DELETE COLOURS_T - FROM parts.DOG_Colour_Temp COLOURS_T - WHERE COLOURS_T.GUID = a_guid + DELETE ASSESSMENT_RESPONSES_T + FROM parts.DOG_Assessment_Response_Temp ASSESSMENT_RESPONSES_T + WHERE ASSESSMENT_RESPONSES_T.GUID = a_guid ; COMMIT; @@ -32,7 +32,7 @@ DELIMITER ; /* -CALL parts.p_dog_clear_calc_colour ( +CALL parts.p_dog_clear_calc_assessment_response ( 'crips ' -- a_guid , 1 -- debug ); diff --git a/static/MySQL/71340_p_dog_get_many_assessment_response.sql b/static/MySQL/71340_p_dog_get_many_assessment_response.sql index bca9209..92e055e 100644 --- a/static/MySQL/71340_p_dog_get_many_assessment_response.sql +++ b/static/MySQL/71340_p_dog_get_many_assessment_response.sql @@ -1,15 +1,82 @@ USE parts; -DROP PROCEDURE IF EXISTS parts.p_dog_get_many_colour; +DROP PROCEDURE IF EXISTS parts.p_dog_get_many_assessment_response; DELIMITER // -CREATE PROCEDURE parts.p_dog_get_many_colour ( +CREATE PROCEDURE parts.p_dog_get_many_assessment_response ( IN a_id_user INT - , IN a_get_all_colour BIT - , IN a_get_inactive_colour BIT - , IN a_ids_colour TEXT - , IN a_names_colour TEXT + , IN a_get_all_assessment_response BIT + , IN a_get_inactive_assessment_response BIT + , IN a_ids_assessment_response TEXT + , IN a_notes_assessment_response TEXT + , IN a_min_value_measured_assessment_response INT + , IN a_max_value_measured_assessment_response INT + + , IN a_get_all_ACM_link BIT + , IN a_get_inactive_ACM_link BIT + , IN a_ids_ACM_link TEXT + , IN a_min_distance_from_handler_ACM_link FLOAT + , IN a_max_distance_from_handler_ACM_link FLOAT + , IN a_value_is_in_sight_of_handler_ACM_link INT + , IN a_value_is_in_scent_range_of_handler_ACM_link INT + , IN a_value_is_in_hearing_range_of_handler_ACM_link INT + , IN a_value_is_on_lead_ACM_link INT + , IN a_min_trial_count_ACM_link FLOAT + , IN a_max_trial_count_ACM_link FLOAT + , IN a_get_all_assessment BIT + , IN a_get_inactive_assessment BIT + , IN a_ids_assessment TEXT + , IN a_notes_assessment TEXT + , IN a_min_temperature_assessment DECIMAL(5, 2) + , IN a_max_temperature_assessment DECIMAL(5, 2) + , IN a_get_all_weather BIT + , IN a_get_inactive_weather BIT + , IN a_ids_weather TEXT + , IN a_names_weather TEXT + , IN a_get_all_lighting_level BIT + , IN a_get_inactive_lighting_level BIT + , IN a_ids_lighting_level TEXT + , IN a_names_lighting_level TEXT + , IN a_get_all_location BIT + , IN a_get_inactive_location BIT + , IN a_ids_location TEXT + , IN a_names_location TEXT + , IN a_get_all_user_handler BIT + , IN a_get_inactive_user_handler BIT + , IN a_ids_user_handler TEXT + -- , IN a_auth0_ids_user_handler TEXT + , IN a_names_user_handler TEXT + , IN a_emails_user_handler TEXT + , IN a_get_all_command_category BIT + , IN a_get_inactive_command_category BIT + , IN a_ids_command_category TEXT + , IN a_names_command_category TEXT + , IN a_get_all_command BIT + , IN a_get_inactive_command BIT + , IN a_ids_command TEXT + , IN a_names_command TEXT + , IN a_hand_signal_default_descriptions_command TEXT + , IN a_notes_command TEXT + , IN a_get_all_command_modality BIT + , IN a_get_inactive_command_modality BIT + , IN a_ids_command_modality TEXT + , IN a_names_command_modality TEXT + , IN a_get_all_bribe BIT + , IN a_get_inactive_bribe BIT + , IN a_ids_bribe TEXT + , IN a_names_bribe TEXT + + , IN a_get_all_response_quality_metric BIT + , IN a_get_inactive_response_quality_metric BIT + , IN a_ids_response_quality_metric TEXT + , IN a_names_response_quality_metric TEXT + + , IN a_get_all_obedience_level BIT + , IN a_get_inactive_obedience_level BIT + , IN a_ids_obedience_level TEXT + , IN a_names_obedience_level TEXT + , IN a_require_all_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT @@ -86,24 +153,85 @@ BEGIN SET a_id_user := IFNULL(a_id_user, 0); /* - SET a_get_all_colour := IFNULL(a_get_all_colour, 0); - SET a_get_inactive_colour := IFNULL(a_get_inactive_colour, 0); - SET a_ids_colour := TRIM(IFNULL(a_ids_colour, '')); - SET a_names_colour := TRIM(IFNULL(a_names_colour, '')); - SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); - SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); - SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); - SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1); + Filters handled by Calc */ SET a_debug := IFNULL(a_debug, 0); IF a_debug = 1 THEN SELECT a_id_user - , a_get_all_colour - , a_get_inactive_colour - , a_ids_colour - , a_names_colour + + , a_get_all_assessment_response + , a_get_inactive_assessment_response + , a_ids_assessment_response + , a_notes_assessment_response + , a_min_value_measured_assessment_response + , a_max_value_measured_assessment_response + + , a_get_all_ACM_link + , a_get_inactive_ACM_link + , a_ids_ACM_link + , a_min_distance_from_handler_ACM_link + , a_max_distance_from_handler_ACM_link + , a_value_is_in_sight_of_handler_ACM_link + , a_value_is_in_scent_range_of_handler_ACM_link + , a_value_is_in_hearing_range_of_handler_ACM_link + , a_value_is_on_lead_ACM_link + , a_min_trial_count_ACM_link + , a_max_trial_count_ACM_link + , a_get_all_assessment + , a_get_inactive_assessment + , a_ids_assessment + , a_notes_assessment + , a_min_temperature_assessment + , a_max_temperature_assessment + , a_get_all_weather + , a_get_inactive_weather + , a_ids_weather + , a_names_weather + , a_get_all_lighting_level + , a_get_inactive_lighting_level + , a_ids_lighting_level + , a_names_lighting_level + , a_get_all_location + , a_get_inactive_location + , a_ids_location + , a_names_location + , a_get_all_user_handler + , a_get_inactive_user_handler + , a_ids_user_handler + -- , a_auth0_ids_user_handler + , a_names_user_handler + , a_emails_user_handler + , a_get_all_command_category + , a_get_inactive_command_category + , a_ids_command_category + , a_names_command_category + , a_get_all_command + , a_get_inactive_command + , a_ids_command + , a_names_command + , a_hand_signal_default_descriptions_command + , a_notes_command + , a_get_all_command_modality + , a_get_inactive_command_modality + , a_ids_command_modality + , a_names_command_modality + , a_get_all_bribe + , a_get_inactive_bribe + , a_ids_bribe + , a_names_bribe + + , a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric + , a_ids_response_quality_metric + , a_names_response_quality_metric + + , a_get_all_obedience_level + , a_get_inactive_obedience_level + , a_ids_obedience_level + , a_names_obedience_level + , a_require_all_id_search_filters_met , a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met @@ -121,12 +249,15 @@ BEGIN END IF; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; - DROP TEMPORARY TABLE IF EXISTS tmp_Colour; + DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Response; - CREATE TEMPORARY TABLE tmp_Colour ( - id_colour INT NOT NULL - , code VARCHAR(250) - , name VARCHAR(250) + CREATE TEMPORARY TABLE tmp_Assessment_Response ( + id_response INT NOT NULL + , id_assessment_command_modality_link INT + , id_response_quality_metric INT + , id_obedience_level INT + , value_measured DOUBLE + , notes TEXT , active BIT , does_meet_id_filters BIT @@ -207,7 +338,7 @@ BEGIN VALUES ( v_id_type_error_no_permission , v_code_type_error_no_permission - , 'You do not have permission to view Colours.' + , 'You do not have permission to view Assessment_Responses.' ) ; END IF; @@ -218,16 +349,84 @@ BEGIN ); - -- Call Colour Calc + -- Call Assessment_Response Calc IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN SELECT v_guid -- a_guid , a_id_user -- a_id_user - , a_get_all_colour -- a_get_all_colour - , a_get_inactive_colour -- a_get_inactive_colour - , a_ids_colour -- a_ids_colour - , a_names_colour -- a_names_colour + + , a_get_all_assessment_response + , a_get_inactive_assessment_response + , a_ids_assessment_response + , a_notes_assessment_response + , a_min_value_measured_assessment_response + , a_max_value_measured_assessment_response + + , a_get_all_ACM_link + , a_get_inactive_ACM_link + , a_ids_ACM_link + , a_min_distance_from_handler_ACM_link + , a_max_distance_from_handler_ACM_link + , a_value_is_in_sight_of_handler_ACM_link + , a_value_is_in_scent_range_of_handler_ACM_link + , a_value_is_in_hearing_range_of_handler_ACM_link + , a_value_is_on_lead_ACM_link + , a_min_trial_count_ACM_link + , a_max_trial_count_ACM_link + , a_get_all_assessment + , a_get_inactive_assessment + , a_ids_assessment + , a_notes_assessment + , a_min_temperature_assessment + , a_max_temperature_assessment + , a_get_all_weather + , a_get_inactive_weather + , a_ids_weather + , a_names_weather + , a_get_all_lighting_level + , a_get_inactive_lighting_level + , a_ids_lighting_level + , a_names_lighting_level + , a_get_all_location + , a_get_inactive_location + , a_ids_location + , a_names_location + , a_get_all_user_handler + , a_get_inactive_user_handler + , a_ids_user_handler + -- , a_auth0_ids_user_handler + , a_names_user_handler + , a_emails_user_handler + , a_get_all_command_category + , a_get_inactive_command_category + , a_ids_command_category + , a_names_command_category + , a_get_all_command + , a_get_inactive_command + , a_ids_command + , a_names_command + , a_hand_signal_default_descriptions_command + , a_notes_command + , a_get_all_command_modality + , a_get_inactive_command_modality + , a_ids_command_modality + , a_names_command_modality + , a_get_all_bribe + , a_get_inactive_bribe + , a_ids_bribe + , a_names_bribe + + , a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric + , a_ids_response_quality_metric + , a_names_response_quality_metric + + , a_get_all_obedience_level + , a_get_inactive_obedience_level + , a_ids_obedience_level + , a_names_obedience_level + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met @@ -237,13 +436,81 @@ BEGIN ; END IF; - CALL parts.p_dog_calc_colour ( + CALL parts.p_dog_calc_assessment_response ( v_guid -- a_guid , a_id_user -- a_id_user - , a_get_all_colour -- a_get_all_colour - , a_get_inactive_colour -- a_get_inactive_colour - , a_ids_colour -- a_ids_colour - , a_names_colour -- a_names_colour + + , a_get_all_assessment_response + , a_get_inactive_assessment_response + , a_ids_assessment_response + , a_notes_assessment_response + , a_min_value_measured_assessment_response + , a_max_value_measured_assessment_response + + , a_get_all_ACM_link + , a_get_inactive_ACM_link + , a_ids_ACM_link + , a_min_distance_from_handler_ACM_link + , a_max_distance_from_handler_ACM_link + , a_value_is_in_sight_of_handler_ACM_link + , a_value_is_in_scent_range_of_handler_ACM_link + , a_value_is_in_hearing_range_of_handler_ACM_link + , a_value_is_on_lead_ACM_link + , a_min_trial_count_ACM_link + , a_max_trial_count_ACM_link + , a_get_all_assessment + , a_get_inactive_assessment + , a_ids_assessment + , a_notes_assessment + , a_min_temperature_assessment + , a_max_temperature_assessment + , a_get_all_weather + , a_get_inactive_weather + , a_ids_weather + , a_names_weather + , a_get_all_lighting_level + , a_get_inactive_lighting_level + , a_ids_lighting_level + , a_names_lighting_level + , a_get_all_location + , a_get_inactive_location + , a_ids_location + , a_names_location + , a_get_all_user_handler + , a_get_inactive_user_handler + , a_ids_user_handler + -- , a_auth0_ids_user_handler + , a_names_user_handler + , a_emails_user_handler + , a_get_all_command_category + , a_get_inactive_command_category + , a_ids_command_category + , a_names_command_category + , a_get_all_command + , a_get_inactive_command + , a_ids_command + , a_names_command + , a_hand_signal_default_descriptions_command + , a_notes_command + , a_get_all_command_modality + , a_get_inactive_command_modality + , a_ids_command_modality + , a_names_command_modality + , a_get_all_bribe + , a_get_inactive_bribe + , a_ids_bribe + , a_names_bribe + + , a_get_all_response_quality_metric + , a_get_inactive_response_quality_metric + , a_ids_response_quality_metric + , a_names_response_quality_metric + + , a_get_all_obedience_level + , a_get_inactive_obedience_level + , a_ids_obedience_level + , a_names_obedience_level + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met @@ -253,60 +520,73 @@ BEGIN ); IF a_debug = 1 THEN - SELECT COUNT(*) FROM parts.DOG_Colour_Temp; - SELECT * FROM parts.DOG_Colour_Temp; + SELECT COUNT(*) FROM parts.DOG_Assessment_Response_Temp; + SELECT * FROM parts.DOG_Assessment_Response_Temp; END IF; - INSERT INTO tmp_Colour ( - id_colour - , code - , name + INSERT INTO tmp_Assessment_Response ( + id_response + , id_assessment_command_modality_link + , id_response_quality_metric + , id_obedience_level + , value_measured + , notes , active , does_meet_id_filters , does_meet_non_id_filters ) SELECT - COLOUR_T.id_colour - , COLOUR_T.code - , COLOUR_T.name - , COLOUR_T.active + ASSESSMENT_RESPONSE_T.id_response + , ASSESSMENT_RESPONSE_T.id_assessment_command_modality_link + , ASSESSMENT_RESPONSE_T.id_response_quality_metric + , ASSESSMENT_RESPONSE_T.id_obedience_level + , ASSESSMENT_RESPONSE_T.value_measured + , ASSESSMENT_RESPONSE_T.notes + , ASSESSMENT_RESPONSE_T.active - , COLOUR_T.does_meet_id_filters - , COLOUR_T.does_meet_non_id_filters - FROM parts.DOG_Colour_Temp COLOUR_T - WHERE COLOUR_T.GUID = v_guid + , ASSESSMENT_RESPONSE_T.does_meet_id_filters + , ASSESSMENT_RESPONSE_T.does_meet_non_id_filters + FROM parts.DOG_Assessment_Response_Temp ASSESSMENT_RESPONSE_T + WHERE ASSESSMENT_RESPONSE_T.GUID = v_guid ; IF a_debug = 1 THEN - SELECT COUNT(*) FROM tmp_Colour; - SELECT * FROM tmp_Colour; + SELECT COUNT(*) FROM tmp_Assessment_Response; + SELECT * FROM tmp_Assessment_Response; END IF; END IF; -- Filter outputs IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN - SELECT * FROM tmp_Colour; + SELECT * FROM tmp_Assessment_Response; END IF; - DELETE FROM tmp_Colour; + DELETE FROM tmp_Assessment_Response; END IF; -- Outputs - -- Colours + -- Assessment_Responses SELECT - t_COLOURS.id_colour - , t_COLOURS.code - , t_COLOURS.name - , t_COLOURS.active + t_ASSESSMENT_RESPONSE.id_response + , t_ASSESSMENT_RESPONSE.id_assessment_command_modality_link + , t_ASSESSMENT_RESPONSE.id_response_quality_metric + , RESPONSE_QUALITY_METRIC.name AS name_response_quality_metric + , t_ASSESSMENT_RESPONSE.id_obedience_level + , OBEDIENCE_LEVEL.name AS name_obedience_level + , t_ASSESSMENT_RESPONSE.value_measured + , t_ASSESSMENT_RESPONSE.notes + , t_ASSESSMENT_RESPONSE.active - , t_COLOURS.does_meet_id_filters - , t_COLOURS.does_meet_non_id_filters - FROM tmp_Colour t_COLOURS - LEFT JOIN parts.DOG_Colour COLOURS ON t_COLOURS.id_colour = COLOURS.id_colour - ORDER BY t_COLOURS.name + , t_ASSESSMENT_RESPONSE.does_meet_id_filters + , t_ASSESSMENT_RESPONSE.does_meet_non_id_filters + FROM tmp_Assessment_Response t_ASSESSMENT_RESPONSE + LEFT JOIN parts.DOG_Assessment_Response ASSESSMENT_RESPONSE ON t_ASSESSMENT_RESPONSE.id_response = ASSESSMENT_RESPONSE.id_response + LEFT JOIN parts.DOG_Obedience_Level OBEDIENCE_LEVEL ON t_ASSESSMENT_RESPONSE.id_obedience_level = OBEDIENCE_LEVEL.id_obedience_level + LEFT JOIN parts.DOG_Response_Quality_Metric RESPONSE_QUALITY_METRIC ON t_ASSESSMENT_RESPONSE.id_response_quality_metric = RESPONSE_QUALITY_METRIC.id_metric + ORDER BY ASSESSMENT_RESPONSE.created_on DESC ; -- Errors @@ -325,16 +605,16 @@ BEGIN ; IF a_debug = 1 AND v_can_view = 1 THEN - SELECT * FROM tmp_Colour; + SELECT * FROM tmp_Assessment_Response; END IF; - CALL parts.p_dog_clear_calc_colour( + CALL parts.p_dog_clear_calc_assessment_response( v_guid -- a_guid , 0 -- a_debug ); DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; - DROP TEMPORARY TABLE IF EXISTS tmp_Colour; + DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Response; IF a_debug = 1 THEN CALL parts.p_core_debug_timing_reporting ( v_time_start ); @@ -345,26 +625,81 @@ DELIMITER ; /* -CALL parts.p_dog_get_many_colour ( +CALL parts.p_dog_get_many_assessment_response ( 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user - , 1 -- a_get_all_colour - , 0 -- a_get_inactive_colour - , '' -- a_ids_colour - , '' -- a_names_colour - , 1 -- a_require_all_id_search_filters_met - , 1 -- a_require_any_id_search_filters_met - , 0 -- a_require_all_non_id_search_filters_met - , 1 -- a_require_any_non_id_search_filters_met - , 1 -- a_debug -); + + , 1 -- a_get_all_assessment_response + , 0 -- a_get_inactive_assessment_response + , '' -- a_ids_assessment_response + , '' -- a_notes_assessment_response + , NULL -- a_min_value_measured_assessment_response + , NULL -- a_max_value_measured_assessment_response + + , 1 -- a_get_all_ACM_link + , 0 -- a_get_inactive_ACM_link + , '' -- a_ids_ACM_link + , NULL -- a_min_distance_from_handler_ACM_link + , NULL -- a_max_distance_from_handler_ACM_link + , NULL -- a_value_is_in_sight_of_handler_ACM_link + , NULL -- a_value_is_in_scent_range_of_handler_ACM_link + , NULL -- a_value_is_in_hearing_range_of_handler_ACM_link + , NULL -- a_value_is_on_lead_ACM_link + , NULL -- a_min_trial_count_ACM_link + , NULL -- a_max_trial_count_ACM_link + , 1 -- a_get_all_assessment + , 0 -- a_get_inactive_assessment + , '' -- a_ids_assessment + , '' -- a_notes_assessment + , NULL -- a_min_temperature_assessment + , NULL -- a_max_temperature_assessment + , 1 -- a_get_all_weather + , 0 -- a_get_inactive_weather + , '' -- a_ids_weather + , '' -- a_names_weather + , 1 -- a_get_all_lighting_level + , 0 -- a_get_inactive_lighting_level + , '' -- a_ids_lighting_level + , '' -- a_names_lighting_level + , 1 -- a_get_all_location + , 0 -- a_get_inactive_location + , '' -- a_ids_location + , '' -- a_names_location + , 1 -- a_get_all_user_handler + , 0 -- a_get_inactive_user_handler + , '' -- a_ids_user_handler + -- , IN a_auth0_ids_user_handler TEXT + , '' -- a_names_user_handler + , '' -- a_emails_user_handler + , 1 -- a_get_all_command_category + , 0 -- a_get_inactive_command_category + , '' -- a_ids_command_category + , '' -- a_names_command_category + , 1 -- a_get_all_command + , 0 -- a_get_inactive_command + , '' -- a_ids_command + , '' -- a_names_command + , '' -- a_hand_signal_default_descriptions_command + , '' -- a_notes_command + , 1 -- a_get_all_command_modality + , 0 -- a_get_inactive_command_modality + , '' -- a_ids_command_modality + , '' -- a_names_command_modality + , 1 -- a_get_all_bribe + , 0 -- a_get_inactive_bribe + , '' -- a_ids_bribe + , '' -- a_names_bribe + + , 1 -- a_get_all_response_quality_metric + , 0 -- a_get_inactive_response_quality_metric + , '' -- a_ids_response_quality_metric + , '' -- a_names_response_quality_metric + + , 1 -- a_get_all_obedience_level + , 0 -- a_get_inactive_obedience_level + , '' -- a_ids_obedience_level + , '' -- a_names_obedience_level -CALL demo.p_dog_get_many_colour ( - 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user - , 1 -- a_get_all_colour - , 0 -- a_get_inactive_colour - , '' -- a_ids_colour - , 'pat,point' -- a_names_colour , 1 -- a_require_all_id_search_filters_met , 1 -- a_require_any_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met diff --git a/static/css/layouts/table-main.css b/static/css/layouts/table-main.css index 6c99a9f..b2f8ead 100644 --- a/static/css/layouts/table-main.css +++ b/static/css/layouts/table-main.css @@ -4,7 +4,7 @@ margin-top: 1vh; } -#tableMain { +table.table-main { overflow-x: auto; padding: 1vh 1vw; max-width: 88vw; /* min(calc(1vh * 80), calc(1vw * 90)); */ @@ -13,28 +13,29 @@ justify-content: normal; } -#tableMain * { +table.table-main * { padding: 0.25vh 0.5vh; } -#tableMain thead { +table.table-main thead { max-height: 4vh; overflow-y: visible; + background-color: var(--colour-text-background); } -#tableMain tbody { +table.table-main tbody { max-height: 60vh; overflow-y: auto; min-width: fit-content; max-width: fit-content; overflow-x: visible; } -#tableMain tbody.is_collapsed { +table.table-main tbody.is_collapsed { display: block; } -#tableMain:has(tbody > div) tbody { +table.table-main:has(tbody > div) tbody { } -#tableMain tbody > div { +table.table-main tbody > div { margin-left: auto; margin-right: auto; text-align: center; @@ -49,62 +50,75 @@ width: 100%; /* min(calc(90vh), calc(70vw)); */ } -#tableMain select, -#tableMain input:not([type="checkbox"]), -#tableMain textarea, -#tableMain div { +table.table-main select, +table.table-main input:not([type="checkbox"]), +table.table-main textarea, +table.table-main div { box-sizing: border-box; width: 100%; + max-width: 100%; height: 100%; border: 1px solid var(--colour-accent); border-radius: 0.5vh; text-align: center; + background-color: var(--colour-text-background); } -#tableMain thead tr th, #tableMain tbody tr td { - width: 20vh; +table.table-main thead tr th, +table.table-main tbody tr td { + max-width: 20vh; min-width: 20vh; padding: 0 0.5vh; } -#tableMain tbody tr td { +table.table-main tbody tr td { height: 5vh; /* padding-top: 0.5vh; */ } -#tableMain tbody tr td:has(.dirty) { +table.table-main thead tr th.notes, +table.table-main tbody tr td.notes { + max-width: fit-content; +} +table.table-main tbody tr td:has(.dirty) { background-color: var(--colour-primary); } -#tableMain tbody tr:not(:last-of-type) td { +table.table-main tbody tr td:has(.dirty) table tr:not(:has(.dirty)) { + background-color: var(--colour-text-background); +} +table.table-main tbody tr:not(:last-of-type) td { padding-bottom: 0.25vh; } -#tableMain tbody tr td.ddl-preview div, -#tableMain tbody tr td.ddl-preview select { +table.table-main tbody tr td.ddl-preview div { + cursor: pointer; +} +table.table-main tbody tr td.ddl-preview div, +table.table-main tbody tr td.ddl-preview select { padding-left: 2vh; padding-right: 2vh; } -#tableMain tbody tr td.ddl-preview select { +table.table-main tbody tr td.ddl-preview select { font-size: 12px; } -#tableMain thead tr th.active, -#tableMain tbody tr td.active { - width: 6vh; +table.table-main thead tr th.active, +table.table-main tbody tr td.active { + max-width: 6vh; min-width: 6vh; } -#tableMain thead tr th.active svg.active.add { +table.table-main thead tr th.active svg.active.add { fill: var(--colour-primary); background-color: var(--colour-accent); border: 2px solid var(--colour-accent); padding: 0; border-radius: 1vh; } -#tableMain tbody tr td.active svg.active.add { +table.table-main tbody tr td.active svg.active.add { fill: var(--colour-primary); } -#tableMain tbody tr td.active svg.active.delete { +table.table-main tbody tr td.active svg.active.delete { fill: var(--colour-error); } -#tableMain tbody tr td.display_order, -#tableMain thead tr th.display_order { - width: 5vh; +table.table-main tbody tr td.display_order, +table.table-main thead tr th.display_order { + max-width: 5vh; min-width: 5vh; } @@ -121,10 +135,10 @@ width: 15vh; /* height: 3vh; */ } - #tableMain { + table.table-main { max-height: 60vh; } - #tableMain tbody { + table.table-main tbody { max-height: 53vh; } } \ No newline at end of file diff --git a/static/css/pages/dog/assessment.css b/static/css/pages/dog/assessment.css new file mode 100644 index 0000000..6c98e07 --- /dev/null +++ b/static/css/pages/dog/assessment.css @@ -0,0 +1,66 @@ + + +.container.save.button-cancel { + position: fixed; + top: 10vh; + right: 10vh; +} + + +table.table-main.assessment thead tr th.active, +table.table-main.assessment tbody tr td.active, +table.table-main.distraction thead tr th.active, +table.table-main.distraction tbody tr td.active, +table.table-main.assessment_command_modality_link thead tr th.active, +table.table-main.assessment_command_modality_link tbody tr td.active, +table.table-main.assessment_response thead tr th.active, +table.table-main.assessment_response tbody tr td.active { + max-width: 6vh; + min-width: 6vh; +} + +table.table-main.assessment thead tr th, +table.table-main.assessment tbody tr td { + max-width: 15vh; + min-width: 15vh; +} + +table.table-main.distraction thead tr th, +table.table-main.distraction tbody tr td { + max-width: 12vh; + min-width: 12vh; +} + +table.table-main.assessment_command_modality_link thead tr th, +table.table-main.assessment_command_modality_link tbody tr td { + max-width: 6vh; + min-width: 6vh; +} +table.table-main.assessment_command_modality_link tbody tr td.ddl-preview div, +table.table-main.assessment_command_modality_link tbody tr td.ddl-preview select { + padding-left: 0; + padding-right: 0; +} +table.table-main.assessment_command_modality_link thead tr th.is-in-hearing-range-of-handler, +table.table-main.assessment_command_modality_link tbody tr td.is-in-hearing-range-of-handler, +table.table-main.assessment_command_modality_link thead tr th.is-in-scent-range-of-handler, +table.table-main.assessment_command_modality_link tbody tr td.is-in-scent-range-of-handler, +table.table-main.assessment_command_modality_link thead tr th.is-in-sight-of-handler, +table.table-main.assessment_command_modality_link tbody tr td.is-in-sight-of-handler, +table.table-main.assessment_command_modality_link thead tr th.is-on-lead, +table.table-main.assessment_command_modality_link tbody tr td.is-on-lead { + max-width: 4vh; + min-width: 4vh; +} +table.table-main.assessment_command_modality_link thead tr th.notes, +table.table-main.assessment_command_modality_link tbody tr td.notes { + max-width: 12vh; + min-width: 12vh; +} + + +table.table-main.assessment_command_modality_link thead tr th.assessment_response, +table.table-main.assessment_command_modality_link tbody tr td.assessment_response { + max-width: 43vh; + min-width: 43vh; +} \ No newline at end of file diff --git a/static/css/pages/dog/assessments.css b/static/css/pages/dog/assessments.css index 9217631..e69de29 100644 --- a/static/css/pages/dog/assessments.css +++ b/static/css/pages/dog/assessments.css @@ -1,90 +0,0 @@ - -#formFilters .container-input.filter.active { - width: 8vh; -} -#formFilters .container-input.filter.date_from, -#formFilters .container-input.filter.date_to { - width: 8vh; -} - - -#tableMain tbody tr td.cost_total_local_vat_excl, #tableMain thead tr th.cost_total_local_vat_excl, -#tableMain tbody tr td.cost_total_local_vat_incl, #tableMain thead tr th.cost_total_local_vat_incl { - width: 10vh; - min-width: 10vh; -} - -#tableMain thead tr th.order_items.is_collapsed, -#tableMain tbody tr td.order_items.is_collapsed { - width: 15vh; - min-width: 15vh; -} -#tableMain:has(tbody tr td.order_items table thead tr th.product_variations.is_collapsed) thead tr th.order_items, -#tableMain:has(tbody tr td.order_items table thead tr th.product_variations.is_collapsed) tbody tr td.order_items { - width: 100vh; /* 95vh */ - min-width: 100vh; -} -#tableMain thead tr th.order_items, -#tableMain tbody tr td.order_items { - width: 110vh; - min-width: 110vh; -} -#tableMain tbody tr td.order_items table thead tr th, #tableMain tbody tr td.order_items table tbody tr td { - width: 12vh; - min-width: 12vh; -} -#tableMain tbody tr td.order_items table thead tr th.display_order, #tableMain tbody tr td.order_items table tbody tr td.display_order { - width: 5vh; - min-width: 5vh; -} -#tableMain tbody tr td.order_items table thead tr th.id_unit_measurement_quantity, #tableMain tbody tr td.order_items table tbody tr td.id_unit_measurement_quantity, -#tableMain tbody tr td.order_items table thead tr th.unit_measurement_latency_manufacture, #tableMain tbody tr td.order_items table tbody tr td.unit_measurement_latency_manufacture { - width: 6vh; - min-width: 6vh; -} - -#tableMain tbody tr td.order_items table thead tr th.product_variations.is_collapsed, #tableMain tbody tr td.order_items table tbody tr td.product_variations.is_collapsed { - width: 10vh; - min-width: 10vh; -} -#tableMain tbody tr td.order_items table thead tr th.product_variations, #tableMain tbody tr td.order_items table tbody tr td.product_variations { - width: 20vh; - min-width: 20vh; -} -#tableMain tbody tr td.order_items table tbody tr td.product_variations table thead tr th, #tableMain tbody tr td.order_items table tbody tr td.product_variations table tbody tr td { - width: 8vh; - min-width: 8vh; -} -#tableMain tbody tr td.order_items table tbody tr td.product_variations table thead tr th:last-of-type, #tableMain tbody tr td.order_items table tbody tr td.product_variations table tbody tr td:last-of-type { - width: 4vh; - min-width: 4vh; -} - -#tableMain tbody tr td.order_items table thead tr th.quantity_used, #tableMain tbody tr td.order_items table tbody tr td.quantity_used, -#tableMain tbody tr td.order_items table thead tr th.quantity_produced, #tableMain tbody tr td.order_items table tbody tr td.quantity_produced, -#tableMain tbody tr td.order_items table thead tr th.latency_manufacture, #tableMain tbody tr td.order_items table tbody tr td.latency_manufacture { - width: 8vh; - min-width: 8vh; -} -#tableMain tbody tr td.order_items table thead tr th.active, #tableMain tbody tr td.order_items table tbody tr td.active, -#tableMain tbody tr td.order_items table thead tr th.add, #tableMain tbody tr td.order_items table tbody tr td.delete { - width: 4vh; - min-width: 4vh; -} - -#tableMain thead tr th.currency.is_collapsed, #tableMain tbody tr td.currency.is_collapsed { - width: 9vh; - min-width: 9vh; -} -#tableMain thead tr th.currency, #tableMain tbody tr td.currency { - width: 11vh; - min-width: 11vh; -} - -#tableMain tbody tr td.cost_total_local_vat_excl, #tableMain thead tr th.cost_total_local_vat_excl, -#tableMain tbody tr td.cost_total_local_vat_incl, #tableMain thead tr th.cost_total_local_vat_incl, -#tableMain tbody tr td.price_total_local_vat_excl, #tableMain thead tr th.price_total_local_vat_excl, -#tableMain tbody tr td.price_total_local_vat_incl, #tableMain thead tr th.price_total_local_vat_incl { - width: 5vh; - min-width: 5vh; -} \ No newline at end of file diff --git a/static/css/pages/dog/command_button_links.css b/static/css/pages/dog/command_button_links.css index 6f7e648..b83777d 100644 --- a/static/css/pages/dog/command_button_links.css +++ b/static/css/pages/dog/command_button_links.css @@ -23,7 +23,7 @@ #tableMain tbody tr td table tbody tr td.colour, #tableMain tbody tr td table thead tr th.button_icon, #tableMain tbody tr td table tbody tr td.button_icon { - width: 12vh; + max-width: 12vh; max-width: 12vh; } @@ -36,7 +36,7 @@ select.id_variation, select.id_variation_type { @media screen and (max-width: 850px) { #formFilters input, #formFilters select { - width: 12vh; + max-width: 12vh; min-width: 12vh; } } diff --git a/static/css/pages/dog/command_categories.css b/static/css/pages/dog/command_categories.css index 13c210b..ee4fb30 100644 --- a/static/css/pages/dog/command_categories.css +++ b/static/css/pages/dog/command_categories.css @@ -1,11 +1,11 @@ #formFilters #search { - width: 20vh; + max-width: 20vh; min-width: 20vh; } #tableMain tbody > div { - width: 58vh; + max-width: 58vh; } #tableMain thead tr th, #tableMain tbody tr td { @@ -20,19 +20,19 @@ */ #tableMain thead tr th.name , #tableMain tbody tr td.name { - width: 50vh; + max-width: 50vh; min-width: 50vh; } @media screen and (max-width: 800px) { #tableMain thead tr th.name , #tableMain tbody tr td.name { - width: 63vw; + max-width: 63vw; min-width: 63vw; } #tableMain thead tr th.active , #tableMain tbody tr td.active { - width: 3vw; + max-width: 3vw; min-width: 3vw; } } \ No newline at end of file diff --git a/static/css/pages/dog/commands.css b/static/css/pages/dog/commands.css index 661f26f..bde7ad3 100644 --- a/static/css/pages/dog/commands.css +++ b/static/css/pages/dog/commands.css @@ -10,7 +10,7 @@ } #tableMain thead tr th.can-have-button, #tableMain tbody tr td.can-have-button { - width: 6vh; + max-width: 6vh; min-width: 6vh; } diff --git a/static/css/pages/dog/dog_command_links.css b/static/css/pages/dog/dog_command_links.css index 1a22d08..adc06dc 100644 --- a/static/css/pages/dog/dog_command_links.css +++ b/static/css/pages/dog/dog_command_links.css @@ -38,7 +38,7 @@ select.id_variation, select.id_variation_type { @media screen and (max-width: 850px) { #formFilters input, #formFilters select { - width: 12vh; + max-width: 12vh; min-width: 12vh; } } diff --git a/static/css/pages/dog/dogs.css b/static/css/pages/dog/dogs.css index 3d30345..e69de29 100644 --- a/static/css/pages/dog/dogs.css +++ b/static/css/pages/dog/dogs.css @@ -1,48 +0,0 @@ - -#formFilters .container { - max-width: fit-content; -} - -#formFilters .container-input.filter.is_not_empty { - width: 10vh; -} - -#formFilters .container-input.filter.active { - width: 8vh; -} - - -#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order { - width: 5vh; - min-width: 5vh; -} -#tableMain tbody tr td.code, #tableMain thead tr th.code { - width: 10vh; - min-width: 10vh; -} -#tableMain tbody tr td.name, #tableMain thead tr th.name { - width: 15vh; - min-width: 15vh; -} -#tableMain tbody tr td.description, #tableMain thead tr th.description { - width: 25vh; - min-width: 25vh; -} -#tableMain tbody tr td.access_level, #tableMain thead tr th.access_level { - width: 7vh; - min-width: 7vh; -} -#tableMain tbody tr td.active, #tableMain thead tr th.active { - width: 5vh; - min-width: 5vh; -} - -td > input, td > select, td > textarea, .container-input > input, .container-input > select, .container-input > textarea { - border: 2px solid var(--border-colour); - border-radius: 0.5vh; -} - -#tableMain tbody tr td table thead tr th.id_variation_type, #tableMain tbody tr td table tbody tr td.id_variation_type, #tableMain tbody tr td table thead tr th.id_variation, #tableMain tbody tr td table tbody tr td.id_variation { - width: 47.5%; -} - diff --git a/static/dist/css/dog_assessment.bundle.css b/static/dist/css/dog_assessment.bundle.css new file mode 100644 index 0000000..0ef55be --- /dev/null +++ b/static/dist/css/dog_assessment.bundle.css @@ -0,0 +1,124 @@ + +.img-product { + max-width: 20vh; + max-height: 20vh; + border-radius: 3vh; + justify-self: left; +} + +.img-thumbnail { + max-width: 10vh; + max-height: 10vh; + border-radius: 3vh; + justify-self: left; +} + +.buttonAddToBasket { + background-color: var(--colour-page-background); + border-color: var(--colour-primary); +} + +#buttonCheckout, .buttonBuyNow { + background-color: var(--colour-page-background); + /* color: var(--c_purple_dark); */ + border-color: var(--colour-primary); +} + +.button-increment, .button-decrement { + border: 2px solid darkgrey; + background-color: lightgray; + margin: 1vh 1vh; + width: 2.5vh; + height: 2.5vh; + border-radius: 1.25vh; + font-size: 2vh; +} + +.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 */ + + + + +.container.save.button-cancel { + position: fixed; + top: 10vh; + right: 10vh; +} + + +table.table-main.assessment thead tr th.active, +table.table-main.assessment tbody tr td.active, +table.table-main.distraction thead tr th.active, +table.table-main.distraction tbody tr td.active, +table.table-main.assessment_command_modality_link thead tr th.active, +table.table-main.assessment_command_modality_link tbody tr td.active, +table.table-main.assessment_response thead tr th.active, +table.table-main.assessment_response tbody tr td.active { + max-width: 6vh; + min-width: 6vh; +} + +table.table-main.assessment thead tr th, +table.table-main.assessment tbody tr td { + max-width: 15vh; + min-width: 15vh; +} + +table.table-main.distraction thead tr th, +table.table-main.distraction tbody tr td { + max-width: 12vh; + min-width: 12vh; +} + +table.table-main.assessment_command_modality_link thead tr th, +table.table-main.assessment_command_modality_link tbody tr td { + max-width: 6vh; + min-width: 6vh; +} +table.table-main.assessment_command_modality_link tbody tr td.ddl-preview div, +table.table-main.assessment_command_modality_link tbody tr td.ddl-preview select { + padding-left: 0; + padding-right: 0; +} +table.table-main.assessment_command_modality_link thead tr th.is-in-hearing-range-of-handler, +table.table-main.assessment_command_modality_link tbody tr td.is-in-hearing-range-of-handler, +table.table-main.assessment_command_modality_link thead tr th.is-in-scent-range-of-handler, +table.table-main.assessment_command_modality_link tbody tr td.is-in-scent-range-of-handler, +table.table-main.assessment_command_modality_link thead tr th.is-in-sight-of-handler, +table.table-main.assessment_command_modality_link tbody tr td.is-in-sight-of-handler, +table.table-main.assessment_command_modality_link thead tr th.is-on-lead, +table.table-main.assessment_command_modality_link tbody tr td.is-on-lead { + max-width: 4vh; + min-width: 4vh; +} +table.table-main.assessment_command_modality_link thead tr th.notes, +table.table-main.assessment_command_modality_link tbody tr td.notes { + max-width: 12vh; + min-width: 12vh; +} + + +table.table-main.assessment_command_modality_link thead tr th.assessment_response, +table.table-main.assessment_command_modality_link tbody tr td.assessment_response { + max-width: 40vh; + min-width: 40vh; +} + +/*# sourceMappingURL=dog_assessment.bundle.css.map*/ \ No newline at end of file diff --git a/static/dist/css/dog_assessment.bundle.css.map b/static/dist/css/dog_assessment.bundle.css.map new file mode 100644 index 0000000..c1fb6c1 --- /dev/null +++ b/static/dist/css/dog_assessment.bundle.css.map @@ -0,0 +1 @@ +{"version":3,"file":"css/dog_assessment.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;;ACnDf;IACI,eAAe;IACf,SAAS;IACT,WAAW;AACf;;;AAGA;;;;;;;;IAQI,cAAc;IACd,cAAc;AAClB;;AAEA;;IAEI,eAAe;IACf,eAAe;AACnB;;AAEA;;IAEI,eAAe;IACf,eAAe;AACnB;;AAEA;;IAEI,cAAc;IACd,cAAc;AAClB;AACA;;IAEI,eAAe;IACf,gBAAgB;AACpB;AACA;;;;;;;;IAQI,cAAc;IACd,cAAc;AAClB;AACA;;IAEI,eAAe;IACf,eAAe;AACnB;;;AAGA;;IAEI,eAAe;IACf,eAAe;AACnB,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/assessment.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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.container.save.button-cancel {\n position: fixed;\n top: 10vh;\n right: 10vh;\n}\n\n\ntable.table-main.assessment thead tr th.active,\ntable.table-main.assessment tbody tr td.active,\ntable.table-main.distraction thead tr th.active,\ntable.table-main.distraction tbody tr td.active,\ntable.table-main.assessment_command_modality_link thead tr th.active,\ntable.table-main.assessment_command_modality_link tbody tr td.active,\ntable.table-main.assessment_response thead tr th.active,\ntable.table-main.assessment_response tbody tr td.active {\n max-width: 6vh;\n min-width: 6vh;\n}\n\ntable.table-main.assessment thead tr th,\ntable.table-main.assessment tbody tr td {\n max-width: 15vh;\n min-width: 15vh;\n}\n\ntable.table-main.distraction thead tr th,\ntable.table-main.distraction tbody tr td {\n max-width: 12vh;\n min-width: 12vh;\n}\n\ntable.table-main.assessment_command_modality_link thead tr th,\ntable.table-main.assessment_command_modality_link tbody tr td {\n max-width: 6vh;\n min-width: 6vh;\n}\ntable.table-main.assessment_command_modality_link tbody tr td.ddl-preview div, \ntable.table-main.assessment_command_modality_link tbody tr td.ddl-preview select {\n padding-left: 0;\n padding-right: 0;\n}\ntable.table-main.assessment_command_modality_link thead tr th.is-in-hearing-range-of-handler,\ntable.table-main.assessment_command_modality_link tbody tr td.is-in-hearing-range-of-handler,\ntable.table-main.assessment_command_modality_link thead tr th.is-in-scent-range-of-handler,\ntable.table-main.assessment_command_modality_link tbody tr td.is-in-scent-range-of-handler,\ntable.table-main.assessment_command_modality_link thead tr th.is-in-sight-of-handler,\ntable.table-main.assessment_command_modality_link tbody tr td.is-in-sight-of-handler,\ntable.table-main.assessment_command_modality_link thead tr th.is-on-lead,\ntable.table-main.assessment_command_modality_link tbody tr td.is-on-lead {\n max-width: 4vh;\n min-width: 4vh;\n}\ntable.table-main.assessment_command_modality_link thead tr th.notes,\ntable.table-main.assessment_command_modality_link tbody tr td.notes {\n max-width: 12vh;\n min-width: 12vh;\n}\n\n\ntable.table-main.assessment_command_modality_link thead tr th.assessment_response,\ntable.table-main.assessment_command_modality_link tbody tr td.assessment_response {\n max-width: 40vh;\n min-width: 40vh;\n}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/static/dist/css/dog_assessments.bundle.css b/static/dist/css/dog_assessments.bundle.css new file mode 100644 index 0000000..805ac86 --- /dev/null +++ b/static/dist/css/dog_assessments.bundle.css @@ -0,0 +1,59 @@ + +.img-product { + max-width: 20vh; + max-height: 20vh; + border-radius: 3vh; + justify-self: left; +} + +.img-thumbnail { + max-width: 10vh; + max-height: 10vh; + border-radius: 3vh; + justify-self: left; +} + +.buttonAddToBasket { + background-color: var(--colour-page-background); + border-color: var(--colour-primary); +} + +#buttonCheckout, .buttonBuyNow { + background-color: var(--colour-page-background); + /* color: var(--c_purple_dark); */ + border-color: var(--colour-primary); +} + +.button-increment, .button-decrement { + border: 2px solid darkgrey; + background-color: lightgray; + margin: 1vh 1vh; + width: 2.5vh; + height: 2.5vh; + border-radius: 1.25vh; + font-size: 2vh; +} + +.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 */ + + + + +/*# sourceMappingURL=dog_assessments.bundle.css.map*/ \ No newline at end of file diff --git a/static/dist/css/dog_assessments.bundle.css.map b/static/dist/css/dog_assessments.bundle.css.map new file mode 100644 index 0000000..0767195 --- /dev/null +++ b/static/dist/css/dog_assessments.bundle.css.map @@ -0,0 +1 @@ +{"version":3,"file":"css/dog_assessments.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe","sources":["webpack://app/./static/css/sections/dog.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/static/dist/css/dog_command_button_links.bundle.css b/static/dist/css/dog_command_button_links.bundle.css index c196fbf..127c632 100644 --- a/static/dist/css/dog_command_button_links.bundle.css +++ b/static/dist/css/dog_command_button_links.bundle.css @@ -79,7 +79,7 @@ #tableMain tbody tr td table tbody tr td.colour, #tableMain tbody tr td table thead tr th.button_icon, #tableMain tbody tr td table tbody tr td.button_icon { - width: 12vh; + max-width: 12vh; max-width: 12vh; } @@ -92,7 +92,7 @@ select.id_variation, select.id_variation_type { @media screen and (max-width: 850px) { #formFilters input, #formFilters select { - width: 12vh; + max-width: 12vh; min-width: 12vh; } } diff --git a/static/dist/css/dog_command_button_links.bundle.css.map b/static/dist/css/dog_command_button_links.bundle.css.map index 529662f..b7a62c6 100644 --- a/static/dist/css/dog_command_button_links.bundle.css.map +++ b/static/dist/css/dog_command_button_links.bundle.css.map @@ -1 +1 @@ -{"version":3,"file":"css/dog_command_button_links.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;CAGC;;;AAGD;IACI,YAAY;AAChB;;AAEA;;;;;;;CAOC;AACD;;;;;;IAMI,WAAW;IACX,eAAe;AACnB;;AAEA;;;;CAIC;;AAED;IACI;;QAEI,WAAW;QACX,eAAe;IACnB;AACJ","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/command_button_links.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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#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 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 width: 12vh;\n min-width: 12vh;\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"css/dog_command_button_links.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;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.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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#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":""} \ No newline at end of file diff --git a/static/dist/css/dog_command_categories.bundle.css b/static/dist/css/dog_command_categories.bundle.css index 663791e..1441563 100644 --- a/static/dist/css/dog_command_categories.bundle.css +++ b/static/dist/css/dog_command_categories.bundle.css @@ -56,12 +56,12 @@ #formFilters #search { - width: 20vh; + max-width: 20vh; min-width: 20vh; } #tableMain tbody > div { - width: 58vh; + max-width: 58vh; } #tableMain thead tr th, #tableMain tbody tr td { @@ -76,19 +76,19 @@ */ #tableMain thead tr th.name , #tableMain tbody tr td.name { - width: 50vh; + max-width: 50vh; min-width: 50vh; } @media screen and (max-width: 800px) { #tableMain thead tr th.name , #tableMain tbody tr td.name { - width: 63vw; + max-width: 63vw; min-width: 63vw; } #tableMain thead tr th.active , #tableMain tbody tr td.active { - width: 3vw; + max-width: 3vw; min-width: 3vw; } } diff --git a/static/dist/css/dog_command_categories.bundle.css.map b/static/dist/css/dog_command_categories.bundle.css.map index bd5b43c..aabe3d9 100644 --- a/static/dist/css/dog_command_categories.bundle.css.map +++ b/static/dist/css/dog_command_categories.bundle.css.map @@ -1 +1 @@ -{"version":3,"file":"css/dog_command_categories.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;IACI,WAAW;IACX,eAAe;AACnB;;AAEA;IACI,WAAW;AACf;AACA;;IAEI,WAAW;AACf;AACA;IACI,sCAAsC;AAC1C;AACA;;;CAGC;AACD;;IAEI,WAAW;IACX,eAAe;AACnB;;AAEA;IACI;;QAEI,WAAW;QACX,eAAe;IACnB;IACA;;QAEI,UAAU;QACV,cAAc;IAClB;AACJ,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/command_categories.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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#formFilters #search {\n width: 20vh;\n min-width: 20vh;\n}\n\n#tableMain tbody > div {\n 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 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 width: 63vw;\n min-width: 63vw;\n }\n #tableMain thead tr th.active ,\n #tableMain tbody tr td.active {\n width: 3vw;\n min-width: 3vw;\n }\n}"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"css/dog_command_categories.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;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.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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#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":""} \ No newline at end of file diff --git a/static/dist/css/dog_commands.bundle.css b/static/dist/css/dog_commands.bundle.css index f22dbab..93ba690 100644 --- a/static/dist/css/dog_commands.bundle.css +++ b/static/dist/css/dog_commands.bundle.css @@ -66,7 +66,7 @@ } #tableMain thead tr th.can-have-button, #tableMain tbody tr td.can-have-button { - width: 6vh; + max-width: 6vh; min-width: 6vh; } diff --git a/static/dist/css/dog_commands.bundle.css.map b/static/dist/css/dog_commands.bundle.css.map index 3725c59..ead76ac 100644 --- a/static/dist/css/dog_commands.bundle.css.map +++ b/static/dist/css/dog_commands.bundle.css.map @@ -1 +1 @@ -{"version":3,"file":"css/dog_commands.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;;CAIC;;AAED;IACI,WAAW;AACf;AACA;;IAEI,UAAU;IACV,cAAc;AAClB;;AAEA;;;;;;;;CAQC,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/commands.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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#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 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":""} \ No newline at end of file +{"version":3,"file":"css/dog_commands.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;;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.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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#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":""} \ No newline at end of file diff --git a/static/dist/css/dog_dog_command_links.bundle.css b/static/dist/css/dog_dog_command_links.bundle.css index 83ea45d..99f59e9 100644 --- a/static/dist/css/dog_dog_command_links.bundle.css +++ b/static/dist/css/dog_dog_command_links.bundle.css @@ -94,7 +94,7 @@ select.id_variation, select.id_variation_type { @media screen and (max-width: 850px) { #formFilters input, #formFilters select { - width: 12vh; + max-width: 12vh; min-width: 12vh; } } diff --git a/static/dist/css/dog_dog_command_links.bundle.css.map b/static/dist/css/dog_dog_command_links.bundle.css.map index d1b1ef5..b7c61de 100644 --- a/static/dist/css/dog_dog_command_links.bundle.css.map +++ b/static/dist/css/dog_dog_command_links.bundle.css.map @@ -1 +1 @@ -{"version":3,"file":"css/dog_dog_command_links.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;CAGC;;;AAGD;IACI,YAAY;AAChB;AACA;IACI,eAAe;AACnB;;AAEA;;;;;;IAMI,uCAAuC;IACvC,oBAAoB;AACxB;;AAEA;;;;IAII,YAAY;AAChB;;AAEA;;;;CAIC;;AAED;IACI;;QAEI,WAAW;QACX,eAAe;IACnB;AACJ","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/dog_command_links.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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#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 width: 12vh;\n min-width: 12vh;\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"css/dog_dog_command_links.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;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.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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#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":""} \ No newline at end of file diff --git a/static/dist/css/dog_dogs.bundle.css b/static/dist/css/dog_dogs.bundle.css index 9bb69c2..bb91edb 100644 --- a/static/dist/css/dog_dogs.bundle.css +++ b/static/dist/css/dog_dogs.bundle.css @@ -55,53 +55,5 @@ -#formFilters .container { - max-width: fit-content; -} - -#formFilters .container-input.filter.is_not_empty { - width: 10vh; -} - -#formFilters .container-input.filter.active { - width: 8vh; -} - - -#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order { - width: 5vh; - min-width: 5vh; -} -#tableMain tbody tr td.code, #tableMain thead tr th.code { - width: 10vh; - min-width: 10vh; -} -#tableMain tbody tr td.name, #tableMain thead tr th.name { - width: 15vh; - min-width: 15vh; -} -#tableMain tbody tr td.description, #tableMain thead tr th.description { - width: 25vh; - min-width: 25vh; -} -#tableMain tbody tr td.access_level, #tableMain thead tr th.access_level { - width: 7vh; - min-width: 7vh; -} -#tableMain tbody tr td.active, #tableMain thead tr th.active { - width: 5vh; - min-width: 5vh; -} - -td > input, td > select, td > textarea, .container-input > input, .container-input > select, .container-input > textarea { - border: 2px solid var(--border-colour); - border-radius: 0.5vh; -} - -#tableMain tbody tr td table thead tr th.id_variation_type, #tableMain tbody tr td table tbody tr td.id_variation_type, #tableMain tbody tr td table thead tr th.id_variation, #tableMain tbody tr td table tbody tr td.id_variation { - width: 47.5%; -} - - /*# sourceMappingURL=dog_dogs.bundle.css.map*/ \ No newline at end of file diff --git a/static/dist/css/dog_dogs.bundle.css.map b/static/dist/css/dog_dogs.bundle.css.map index 6fb5a1d..69253b6 100644 --- a/static/dist/css/dog_dogs.bundle.css.map +++ b/static/dist/css/dog_dogs.bundle.css.map @@ -1 +1 @@ -{"version":3,"file":"css/dog_dogs.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;IACI,sBAAsB;AAC1B;;AAEA;IACI,WAAW;AACf;;AAEA;IACI,UAAU;AACd;;;AAGA;IACI,UAAU;IACV,cAAc;AAClB;AACA;IACI,WAAW;IACX,eAAe;AACnB;AACA;IACI,WAAW;IACX,eAAe;AACnB;AACA;IACI,WAAW;IACX,eAAe;AACnB;AACA;IACI,UAAU;IACV,cAAc;AAClB;AACA;IACI,UAAU;IACV,cAAc;AAClB;;AAEA;IACI,sCAAsC;IACtC,oBAAoB;AACxB;;AAEA;IACI,YAAY;AAChB","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/dogs.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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#formFilters .container {\n max-width: fit-content;\n}\n\n#formFilters .container-input.filter.is_not_empty {\n width: 10vh;\n} \n\n#formFilters .container-input.filter.active {\n width: 8vh;\n}\n\n\n#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order {\n width: 5vh;\n min-width: 5vh;\n}\n#tableMain tbody tr td.code, #tableMain thead tr th.code {\n width: 10vh;\n min-width: 10vh;\n}\n#tableMain tbody tr td.name, #tableMain thead tr th.name {\n width: 15vh;\n min-width: 15vh;\n}\n#tableMain tbody tr td.description, #tableMain thead tr th.description {\n width: 25vh;\n min-width: 25vh;\n}\n#tableMain tbody tr td.access_level, #tableMain thead tr th.access_level {\n width: 7vh;\n min-width: 7vh;\n}\n#tableMain tbody tr td.active, #tableMain thead tr th.active {\n width: 5vh;\n min-width: 5vh;\n}\n\ntd > input, td > select, td > textarea, .container-input > input, .container-input > select, .container-input > textarea {\n border: 2px solid var(--border-colour);\n border-radius: 0.5vh;\n}\n\n#tableMain tbody tr td table thead tr th.id_variation_type, #tableMain tbody tr td table tbody tr td.id_variation_type, #tableMain tbody tr td table thead tr th.id_variation, #tableMain tbody tr td table tbody tr td.id_variation {\n width: 47.5%;\n}\n\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"css/dog_dogs.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe","sources":["webpack://app/./static/css/sections/dog.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\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"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/static/dist/css/main.bundle.css b/static/dist/css/main.bundle.css index bc0720d..6a4c54c 100644 --- a/static/dist/css/main.bundle.css +++ b/static/dist/css/main.bundle.css @@ -757,7 +757,7 @@ form.filter button.save, form.filter button.button-cancel { margin-top: 1vh; } -#tableMain { +table.table-main { overflow-x: auto; padding: 1vh 1vw; max-width: 88vw; /* min(calc(1vh * 80), calc(1vw * 90)); */ @@ -766,28 +766,29 @@ form.filter button.save, form.filter button.button-cancel { justify-content: normal; } -#tableMain * { +table.table-main * { padding: 0.25vh 0.5vh; } -#tableMain thead { +table.table-main thead { max-height: 4vh; overflow-y: visible; + background-color: var(--colour-text-background); } -#tableMain tbody { +table.table-main tbody { max-height: 60vh; overflow-y: auto; min-width: fit-content; max-width: fit-content; overflow-x: visible; } -#tableMain tbody.is_collapsed { +table.table-main tbody.is_collapsed { display: block; } -#tableMain:has(tbody > div) tbody { +table.table-main:has(tbody > div) tbody { } -#tableMain tbody > div { +table.table-main tbody > div { margin-left: auto; margin-right: auto; text-align: center; @@ -802,62 +803,75 @@ form.filter button.save, form.filter button.button-cancel { width: 100%; /* min(calc(90vh), calc(70vw)); */ } -#tableMain select, -#tableMain input:not([type="checkbox"]), -#tableMain textarea, -#tableMain div { +table.table-main select, +table.table-main input:not([type="checkbox"]), +table.table-main textarea, +table.table-main div { box-sizing: border-box; width: 100%; + max-width: 100%; height: 100%; border: 1px solid var(--colour-accent); border-radius: 0.5vh; text-align: center; + background-color: var(--colour-text-background); } -#tableMain thead tr th, #tableMain tbody tr td { - width: 20vh; +table.table-main thead tr th, +table.table-main tbody tr td { + max-width: 20vh; min-width: 20vh; padding: 0 0.5vh; } -#tableMain tbody tr td { +table.table-main tbody tr td { height: 5vh; /* padding-top: 0.5vh; */ } -#tableMain tbody tr td:has(.dirty) { +table.table-main thead tr th.notes, +table.table-main tbody tr td.notes { + max-width: fit-content; +} +table.table-main tbody tr td:has(.dirty) { background-color: var(--colour-primary); } -#tableMain tbody tr:not(:last-of-type) td { +table.table-main tbody tr td:has(.dirty) table { + background-color: var(--colour-text-background); +} +table.table-main tbody tr:not(:last-of-type) td { padding-bottom: 0.25vh; } -#tableMain tbody tr td.ddl-preview div, -#tableMain tbody tr td.ddl-preview select { +table.table-main tbody tr td.ddl-preview div { + cursor: pointer; +} +table.table-main tbody tr td.ddl-preview div, +table.table-main tbody tr td.ddl-preview select { padding-left: 2vh; padding-right: 2vh; } -#tableMain tbody tr td.ddl-preview select { +table.table-main tbody tr td.ddl-preview select { font-size: 12px; } -#tableMain thead tr th.active, -#tableMain tbody tr td.active { - width: 6vh; +table.table-main thead tr th.active, +table.table-main tbody tr td.active { + max-width: 6vh; min-width: 6vh; } -#tableMain thead tr th.active svg.active.add { +table.table-main thead tr th.active svg.active.add { fill: var(--colour-primary); background-color: var(--colour-accent); border: 2px solid var(--colour-accent); padding: 0; border-radius: 1vh; } -#tableMain tbody tr td.active svg.active.add { +table.table-main tbody tr td.active svg.active.add { fill: var(--colour-primary); } -#tableMain tbody tr td.active svg.active.delete { +table.table-main tbody tr td.active svg.active.delete { fill: var(--colour-error); } -#tableMain tbody tr td.display_order, -#tableMain thead tr th.display_order { - width: 5vh; +table.table-main tbody tr td.display_order, +table.table-main thead tr th.display_order { + max-width: 5vh; min-width: 5vh; } @@ -874,10 +888,10 @@ form.filter button.save, form.filter button.button-cancel { width: 15vh; /* height: 3vh; */ } - #tableMain { + table.table-main { max-height: 60vh; } - #tableMain tbody { + table.table-main tbody { max-height: 53vh; } } diff --git a/static/dist/css/main.bundle.css.map b/static/dist/css/main.bundle.css.map index 626ece2..8a864d8 100644 --- a/static/dist/css/main.bundle.css.map +++ b/static/dist/css/main.bundle.css.map @@ -1 +1 @@ -{"version":3,"file":"css/main.bundle.css","mappings":"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ACI,aAAa;AACjB;;AAEA,2BAA2B;AAC3B;IACI,eAAe;IACf,kBAAkB;IAClB,QAAQ;IACR,eAAe;IACf,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,WAAW;AACf;AACA;IACI,eAAe;IACf,eAAe;IACf,cAAc;IACd,cAAc;AAClB;AACA;;;;;CAKC;AACD;IACI,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,gBAAgB;IAChB,gBAAgB;AACpB;AACA;IACI,sCAAsC;IACtC,kBAAkB;AACtB;AACA;IACI,4BAA4B;IAC5B,6BAA6B;AACjC;AACA;IACI,+BAA+B;IAC/B,gCAAgC;AACpC;;AAEA;IACI,aAAa;IACb,eAAe;IACf,mBAAmB;IACnB,uBAAuB;IACvB,kBAAkB;IAClB,WAAW;IACX,+BAA+B;IAC/B,iBAAiB;IACjB,eAAe;IACf,kBAAkB;AACtB;AACA;IACI,oCAAoC;IACpC,uCAAuC;AAC3C;AACA;IACI,WAAW;IACX;;;KAGC;AACL;AACA;IACI,kBAAkB;IAClB,qBAAqB;AACzB;;AAEA;IACI;QACI,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,gBAAgB;IACpB;IACA;QACI,eAAe;QACf,eAAe;QACf,cAAc;QACd,cAAc;IAClB;IACA;QACI,SAAS;QACT,YAAY;QACZ,kBAAkB;IACtB;AACJ;;AAEA,oBAAoB;AACpB;IACI,kBAAkB;IAClB,UAAU;IACV,WAAW;IACX,YAAY;AAChB;;AAEA;IACI,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,mBAAmB;AACvB;AACA;IACI,kBAAkB;AACtB;;;;;AChIA;IACI,sBAAsB;AAC1B;;AAEA;IACI,2BAA2B;IAC3B,8BAA8B;AAClC;;AAEA;IACI,6BAA6B;AACjC;AACA;IACI,mCAAmC;AACvC;;AAEA;IACI,sBAAsB;AAC1B;AACA;IACI,8CAA8C;AAClD;AACA;IACI,uBAAuB;AAC3B;AACA;IACI,8BAA8B;AAClC;AACA;IACI,uCAAuC;AAC3C;AACA;IACI,6BAA6B;AACjC;;AAEA;IACI,eAAe;IACf,wBAAwB;IACxB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","sources":["webpack://app/./static/css/main.css","webpack://app/./static/css/components/button.css","webpack://app/./static/css/components/form.css","webpack://app/./static/css/components/image.css","webpack://app/./static/css/components/label.css","webpack://app/./static/css/components/overlay.css","webpack://app/./static/css/components/table.css","webpack://app/./static/css/layouts/header.css","webpack://app/./static/css/layouts/footer.css","webpack://app/./static/css/layouts/table-main.css","webpack://app/./static/css/lib/utils.css","webpack://app/./static/css/themes/light.css"],"sourcesContent":["\n:root {\n --font-family-base: 'Open Sans', Arial, sans-serif;\n /* Declare global variables */\n /*\n --c_purple: #5B29FF;\n --c_purple_pastel: #D1D1FF;\n --c_purple_lighter: #E8E1FF;\n --c_purple_light: #C6BDFF;\n --c_purple_dark: #4700B3;\n */\n /* purple theme\n - light https://coolors.co/palette/a172fd-a77afe-ac82fe-b691fe-c1a0fe-cbaffe-d6bffe-e0cefe-ebddfe-f5ecfe\n - dark https://coolors.co/palette/310055-3c0663-4a0a77-5a108f-6818a5-8b2fc9-ab51e3-bd68ee-d283ff-dc97ff\n */\n /*\n --c_purple_darker: #310055;\n --c_purple_dark: #4A0A77;\n --c_purple: #6818A5;\n --c_purple_light: #CBAFFE;\n --c_purple_lighter: #F5ECFE;\n\n --c_blue: #0044FF;\n --c_blue_pastel: #B8E0FF;\n --c_blue_light: #73E8FF;\n --c_blue_dark: #003ADB;\n */\n /* --c_red: * /\n --c-red: #FF0000;\n --c_red_pastel: #FAE0E2;\n --c_red_lighter: #FAE0E2;\n */\n}\n\nhtml {\n height: 100vh;\n /* overflow-y: clip; */\n}\n\nbody {\n background-color: var(--colour-page-background);\n color: var(--colour-text);\n font-family: var(--font-family-base);\n font-family: Arial;\n padding: 0;\n margin: 0;\n border: 0;\n background: linear-gradient(to bottom right, var(--colour-page-background-1), var(--colour-page-background-2)); /* var(--c_purple); */\n height: 100vh;\n /* max-height: 100vh;\n overflow-y: clip; */\n}\n\n* {\n margin: 0;\n}\n\nscript, link {\n display: none !important;\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.page-body > * {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n width: 100%;\n align-self: center;\n font-size: min(16px, calc(1vh * 4));\n}\n#pageBody > * > * {\n align-self: center;\n padding-top: 0.5vh;\n padding-bottom: 0.5vh;\n}\n#pageBody > .card {\n height: fit-content;\n margin: 0.5vh auto;\n}\n\n/* header image */\nimg.header-logo {\n max-height: 15vh;\n max-width: 15vh;\n cursor: pointer;\n border-radius: 3vh;\n}\n\n/* icon images */\n.img-icon {\n max-width: 16vh;\n max-height: 8vh;\n border-radius: 0;\n}\n\n/* Add a card effect for articles */\n.card {\n background-color: var(--colour-text-background);\n padding: 1vh 2.5vw;\n margin: 1vh;\n display: flex !important;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n border-radius: 1.5vh;\n position: relative;\n height: fit-content;\n max-width: 80vw;\n}\n\n.header.card {\n border-radius: 2.5vh;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.container {\n flex: 1;\n margin: 0px;\n align-items: flex-start;\n justify-content: flex-start;\n text-align: flex-start;\n /* max-width: 100%; */\n /* min-width: fit-content; */\n}\n\n.column {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin: auto 0;\n}\n\n.row {\n display: flex; \n flex-direction: row;\n width: 100%;\n flex-wrap: wrap;\n}\n\n.container > .card:first-of-type {\n margin-top: none;\n}\n\n\n/*\n/* Responsive layout - when the screen is less than 800px wide, make the two columns stack on top of each other instead of next to each other *\n@media screen and (max-width: 800px) {\n .leftcolumn, .rightcolumn { \n width: 100%;\n /* padding: 0; *\n }\n}\n\n/* Responsive layout - when the screen is less than 400px wide, make the navigation links stack on top of each other instead of next to each other *\n@media screen and (max-width: 400px) {\n .topnav a {\n float: none;\n width: 100%;\n }\n}\n*/\n\n.container-input {\n padding: 1vh;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n}\n\n.container-input > label {\n width: 100%;\n margin-bottom: 1vh;\n margin-top: 0;\n}\n\n.container-input > input,\n.container-input > textarea {\n border: 2px solid var(--colour-accent);\n padding: 1vh;\n}\n\n.label-title {\n width: 100%;\n}\n\n\nul {\n max-width: 90%;\n padding: 5px 0 10px 0;\n}\nli {\n text-align: left;\n font-size: 18px;\n}\n\n\n:not(input,textarea,select,button).dirty {\n background-color: var(--colour-accent);\n}\ninput.dirty, textarea.dirty, select.dirty {\n border-color: var(--colour-primary);\n}\n\n\n#pageBody > *, button {\n font-size: min(12px, calc(1vh * 3));\n}\n\n\n\n@media screen and (max-width: 400px) {\n img.header-logo {\n border-radius: 3vh;\n }\n /*\n .company-name {\n font-size: 14px;\n }\n */\n}",".button {\n display: inline-block;\n padding: 0.5vh 0.75vh;\n border-radius: 0.75vh;\n text-decoration: none;\n font-weight: bold;\n transition: all 0.3s ease;\n width: fit-content;\n}\n.button:not(.is_collapsed) {\n cursor: pointer;\n}\n.button.is_collapsed {\n display: block;\n opacity: 0;\n}\n\n.button-primary {\n background: var(--colour-accent);\n color: var(--colour-primary);\n border: 2px solid var(--colour-primary);\n}\n\n.button-primary:hover {\n background: var(--colour-secondary);\n}\n\n.button-light {\n background: white;\n color: var(--colour-primary);\n}\n\n.button-light:hover {\n background: var(--colour-accent);\n}\n\n.logo:hover{\n cursor: pointer;\n}\n\n\n.button.icon.active.delete, \n.button.icon.active.add {\n height: 2vh;\n}","\n\nselect {\n border: 1px solid var(--colour-accent);\n}","\nimg, video {\n border-radius: 3vh;\n}\n","\nh1 {\n font-size: min(24px, calc(1vh * 6));\n}\n\nh2 {\n font-size: min(20px, calc(1vh * 5));\n}\n\nh3 {\n font-size: min(16px, calc(1vh * 4));\n margin-top: 1vh;\n}\n\nh4 {\n font-size: 13px;\n margin: 1vh;\n text-align: center;\n margin-left: auto;\n margin-right: auto;\n}\n\nh5 {\n font-size: 11px;\n margin: 1vh;\n}\n","\n\n/* Overlay modal */\n.overlay {\n /*\n display: none;\n */\n position: fixed;\n width: 100px;\n /* height: 50%; */ \n background: var(--colour-page-background);\n justify-content: right;\n align-items: right;\n align-self: right;\n z-index: 999;\n}\n.is_collapsed {\n display: none;\n}\n\n/* Hamburger menu overlay */\n#buttonHamburger {\n cursor: pointer;\n position: absolute;\n right: 0;\n min-height: 4vh;\n max-height: 4vh;\n min-width: 4.5vh;\n max-width: 4.5vh;\n z-index: 10;\n}\n#buttonHamburger .icon.hamburger {\n min-height: 3vh;\n max-height: 3vh;\n min-width: 3vh;\n max-width: 3vh;\n}\n/*\n#buttonHamburger:hover {\n text-decoration: none;\n cursor: pointer;\n}\n*/\n#overlayHamburger {\n top: 20vh;\n right: 0.75vh;\n overflow-x: hidden;\n overflow-y: auto;\n max-height: 60vh;\n}\n#overlayHamburger {\n border: 2px solid var(--border-colour);\n border-radius: 4px;\n}\n#overlayHamburger:first-child {\n border-top-left-radius: 12px;\n border-top-right-radius: 12px;\n}\n#overlayHamburger:last-child {\n border-bottom-left-radius: 12px;\n border-bottom-right-radius: 12px;\n}\n\n#overlayHamburger > * {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n width: 100%;\n /* color: var(--colour-text); */\n font-weight: bold;\n font-size: 15px;\n /* height: 18px; */\n}\n#overlayHamburger > :hover {\n color: var(--colour-page-background);\n background-color: var(--colour-primary);\n}\n#overlayHamburger > * > * {\n width: 100%;\n /*\n margin-top: 4.5px;\n margin-bottom: 4.5px;\n */\n}\n#overlayHamburger > .container {\n padding-top: 4.5px;\n padding-bottom: 4.5px;\n}\n\n@media screen and (max-width: 400px) {\n #buttonHamburger {\n min-height: 6vh;\n max-height: 6vh;\n min-width: 6.5vh;\n max-width: 6.5vh;\n }\n #buttonHamburger .icon.hamburger {\n min-height: 5vh;\n max-height: 5vh;\n min-width: 5vh;\n max-width: 5vh;\n }\n #overlayHamburger {\n top: 22vh;\n width: 100px;\n /* right: 6.5vh; */\n }\n}\n\n/* Confirm overlay */\n#overlayConfirm {\n position: absolute;\n left: 25vw;\n width: 50vw;\n height: 50vh;\n}\n\n#overlayConfirm .row > * {\n margin-left: auto;\n margin-right: auto;\n}\n\n#overlayConfirm .row .button.button-cancel {\n margin-right: 0.5vh;\n}\n#overlayConfirm .row .button.submit {\n margin-left: 0.5vh;\n}\n\n\n","\n#formFilters .container {\n max-width: fit-content;\n}\n\nthead, tbody {\n padding-top: 0px !important;\n padding-bottom: 0px !important;\n}\n\nth {\n background-color: transparent;\n}\ntd {\n font-size: min(12px, calc(1vh * 3));\n}\n\nth, td {\n min-width: fit-content;\n}\ntr:not(:last-child) > td {\n border-bottom: 1px dashed var(--border-colour);\n}\ntd > table > tbody > tr > td {\n border: none !important;\n}\nth.is_collapsed, td.is_collapsed {\n display: table-cell !important;\n}\ntd.dirty {\n background-color: var(--colour-primary);\n}\ntd:not(.dirty) {\n background-color: transparent;\n}\n\ntr {\n min-height: 1px;\n border-bottom: 1px solid;\n border-top: 1px solid;\n border-color: var(--border-colour);\n background-color: transparent;\n}\n\ntable button {\n margin: 0.25vh;\n padding: 0.5vh 1vh;\n}\n\ntable button.active {\n background-color: var(--colour-page-background);\n}\n\ntr.delete, tr.delete > td {\n background-color: var(--colour-error);\n}\n\ntable div {\n align-content: center;\n}","\n/*\nheader {\n background: white;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n / * position: fixed;\n top: 0; * /\n width: 100%;\n z-index: 1000;\n}\n\n.navbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 0;\n}\n\n.logo {\n font-size: 1.5rem;\n font-weight: bold;\n color: var(--primary);\n}\n\n.nav-links {\n display: flex;\n gap: 2rem;\n}\n\n.nav-links a {\n text-decoration: none;\n color: var(--text);\n font-weight: 500;\n align-content: center;\n}\n.nav-links a.button {\n color: white;\n}\n*/\n\n\n/* Navigation */\n.topnav {\n border-bottom-left-radius: 2.5vh;\n border-bottom-right-radius: 2.5vh;\n display: flex;\n flex-wrap: wrap;\n flex: 1;\n flex-direction: row;\n font-weight: bold;\n font-size: 1vh;\n max-height: 15vh;\n height: 15vh;\n align-items: flex-start;\n}\n.topnav a, .topnav label, .topnav p, .topnav h1 {\n float: left;\n display: flex;\n text-align: center;\n text-decoration: none;\n width: 100%;\n max-height: 15vh;\n font-weight: normal;\n justify-content: center;\n}\n.topnav a:hover {\n background-color: var(--colour-page-background);\n}\n\n.topnav > .container {\n max-width: 50%;\n height: 100%;\n align-items: center;\n align-self: center;\n display: flex;\n}\n.topnav > .container.header-logo {\n min-width: 15vh;\n max-width: 15vh;\n}\n.topnav > .container.company-name {\n min-width: calc(100vw - 30vh);\n max-width: calc(100vw - 30vh);\n}\n.topnav select {\n padding: 1vh;\n margin: 1vh;\n border-radius: 1vh;\n border: 2px solid var(--border-colour);\n font-weight: bold;\n text-align: center;\n width: 25vw;\n}\n.topnav select .is_collapsed {\n width: 5vw;\n}\n.company-name {\n font-size: min(28px, calc(1vh * 7));\n}\n/*\n@media screen and (max-width: 450px) {\n .company-name {\n font-size: 18px; / * min(24px, calc(1vh * 7)); * /\n }\n}\n*/\n/* Page Filters */\n#formFilters {\n width: fit-content;\n margin-left: auto;\n margin-right: auto;\n \n}\n#formFilters * {\n font-size: 12px;\n}\n\n#formFilters .container {\n}\n#formFilters .container-input {\n max-width: fit-content;\n padding: 0 0.5vh;\n}\n#formFilters .container-input:has(.dirty) {\n background-color: var(--colour-accent);\n} \n\n#formFilters .container-input input {\n width: 10vh;\n max-width: 10vh;\n height: 20px;\n}\n/*\n#formFilters .container-input input {\n height: 1.7vh;\n}\n#formFilters .container-input select {\n height: 2vh;\n}\n*/\n\n#formFilters .container-input.filter.active_only {\n width: 8vh;\n}\n#formFilters .container-input.filter.active_only input {\n display: none;\n}\n#formFilters .container-input.filter.active_only svg.active_only {\n height: 25px;\n fill: var(--colour-text-background);\n background-color: var(--colour-accent);\n /* border: 1px solid var(--colour-accent);\n border-radius: 0.5vh; */\n width: 25px;\n}\n#formFilters .container-input.filter.active_only svg.active_only.is_checked {\n fill: var(--colour-accent);\n background-color: var(--colour-text-background);\n}\n#formFilters .container-input.filter.is_not_empty {\n width: 12vh;\n}\n\n/*\n#formFilters button {\n padding: 0.5vh 0.75vh;\n background-color: var(--colour-accent);\n color: var(--colour-primary);\n font-weight: bold;\n border-radius: 0.75vh;\n border: 2px solid var(--colour-primary);\n}\n\n#formFilters button.is_collapsed {\n display: block;\n opacity: 0;\n}\n*/\n\nform.filter button.save, form.filter button.button-cancel {\n margin-top: 0;\n margin-bottom: 0;\n}\nform.filter button.save, form.filter button.button-cancel {\n margin-top: 0;\n margin-bottom: 1px;\n}\n\n\n@media screen and (max-width: 400px) {\n #formFilters .container-input select {\n /* height: 3vh; */\n }\n .topnav h1 {\n font-size: 16px;\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 {\n padding: 0.5vh 1vw;\n margin-top: 1vh;\n}\n\n#tableMain {\n overflow-x: auto;\n padding: 1vh 1vw;\n max-width: 88vw; /* min(calc(1vh * 80), calc(1vw * 90)); */\n width: min-content;\n align-items: normal;\n justify-content: normal;\n}\n\n#tableMain * {\n padding: 0.25vh 0.5vh;\n}\n\n#tableMain thead {\n max-height: 4vh;\n overflow-y: visible;\n}\n\n#tableMain tbody {\n max-height: 60vh;\n overflow-y: auto;\n min-width: fit-content;\n max-width: fit-content;\n overflow-x: visible;\n}\n#tableMain tbody.is_collapsed {\n display: block;\n}\n#tableMain:has(tbody > div) tbody {\n}\n#tableMain tbody > div {\n margin-left: auto;\n margin-right: auto;\n text-align: center;\n justify-content: center;\n justify-items: center;\n justify-self: center;\n align-content: center;\n align-items: center;\n align-self: center;\n position: relative;\n display: block;\n width: 100%; /* min(calc(90vh), calc(70vw)); */\n}\n\n#tableMain select, \n#tableMain input:not([type=\"checkbox\"]), \n#tableMain textarea, \n#tableMain div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border: 1px solid var(--colour-accent);\n border-radius: 0.5vh;\n text-align: center;\n}\n\n#tableMain thead tr th, #tableMain tbody tr td {\n width: 20vh;\n min-width: 20vh;\n padding: 0 0.5vh;\n}\n#tableMain tbody tr td {\n height: 5vh;\n /* padding-top: 0.5vh; */\n}\n#tableMain tbody tr td:has(.dirty) {\n background-color: var(--colour-primary);\n}\n#tableMain tbody tr:not(:last-of-type) td {\n padding-bottom: 0.25vh;\n}\n#tableMain tbody tr td.ddl-preview div,\n#tableMain tbody tr td.ddl-preview select {\n padding-left: 2vh;\n padding-right: 2vh;\n}\n#tableMain tbody tr td.ddl-preview select {\n font-size: 12px;\n}\n#tableMain thead tr th.active, \n#tableMain tbody tr td.active {\n width: 6vh;\n min-width: 6vh;\n}\n#tableMain thead tr th.active svg.active.add {\n fill: var(--colour-primary);\n background-color: var(--colour-accent);\n border: 2px solid var(--colour-accent);\n padding: 0;\n border-radius: 1vh;\n}\n#tableMain tbody tr td.active svg.active.add {\n fill: var(--colour-primary);\n}\n#tableMain tbody tr td.active svg.active.delete {\n fill: var(--colour-error);\n}\n#tableMain tbody tr td.display_order, \n#tableMain thead tr th.display_order {\n width: 5vh;\n min-width: 5vh;\n}\n\n#container-template-elements {\n display: none;\n}\n\n\n@media screen and (max-width: 850px) {\n}\n@media screen and (max-width: 400px) {\n #formFilters input[type=\"text\"],\n #formFilters select {\n width: 15vh;\n /* height: 3vh; */\n }\n #tableMain {\n max-height: 60vh;\n }\n #tableMain tbody {\n max-height: 53vh;\n }\n}",".text-center {\n text-align: center;\n}\n\n.section-title {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.section-subtitle {\n margin-bottom: 2rem;\n}\n\n@media (max-width: 768px) {\n .hero h1 {\n font-size: 2.5rem;\n }\n \n .nav-links {\n display: none;\n }\n}","/* Default */\n:root {\n /* Claude dark blue / grey theme */\n --colour-accent: #C77DFF;\n --colour-error: red;\n --colour-page-background: #E0AAFF;\n --colour-page-background-1: #F5ECFE;\n --colour-page-background-2: #FAE0E2;\n --colour-primary: #240046;\n --colour-secondary: #3C096C;\n --colour-text: #10002B;\n --colour-text-background: white;\n --colour-text-link-unvisited: #0000EE;\n --colour-text-link-visited: #551A8B;\n}\n\n/*\n--c_purple_darker: #310055;\n--c_purple_dark: #4A0A77;\n--c_purple: #6818A5;\n--c_purple_light: #CBAFFE;\n--c_purple_lighter: #F5ECFE;\n\n--c_blue: #0044FF;\n--c_blue_pastel: #B8E0FF;\n--c_blue_light: #73E8FF;\n--c_blue_dark: #003ADB;\n/* --c_red: * /\n--c-red: #FF0000;\n--c_red_pastel: #FAE0E2;\n--c_red_lighter: #FAE0E2;\n}\n*/"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"css/main.bundle.css","mappings":"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ACI,aAAa;AACjB;;AAEA,2BAA2B;AAC3B;IACI,eAAe;IACf,kBAAkB;IAClB,QAAQ;IACR,eAAe;IACf,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,WAAW;AACf;AACA;IACI,eAAe;IACf,eAAe;IACf,cAAc;IACd,cAAc;AAClB;AACA;;;;;CAKC;AACD;IACI,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,gBAAgB;IAChB,gBAAgB;AACpB;AACA;IACI,sCAAsC;IACtC,kBAAkB;AACtB;AACA;IACI,4BAA4B;IAC5B,6BAA6B;AACjC;AACA;IACI,+BAA+B;IAC/B,gCAAgC;AACpC;;AAEA;IACI,aAAa;IACb,eAAe;IACf,mBAAmB;IACnB,uBAAuB;IACvB,kBAAkB;IAClB,WAAW;IACX,+BAA+B;IAC/B,iBAAiB;IACjB,eAAe;IACf,kBAAkB;AACtB;AACA;IACI,oCAAoC;IACpC,uCAAuC;AAC3C;AACA;IACI,WAAW;IACX;;;KAGC;AACL;AACA;IACI,kBAAkB;IAClB,qBAAqB;AACzB;;AAEA;IACI;QACI,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,gBAAgB;IACpB;IACA;QACI,eAAe;QACf,eAAe;QACf,cAAc;QACd,cAAc;IAClB;IACA;QACI,SAAS;QACT,YAAY;QACZ,kBAAkB;IACtB;AACJ;;AAEA,oBAAoB;AACpB;IACI,kBAAkB;IAClB,UAAU;IACV,WAAW;IACX,YAAY;AAChB;;AAEA;IACI,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,mBAAmB;AACvB;AACA;IACI,kBAAkB;AACtB;;;;;AChIA;IACI,sBAAsB;AAC1B;;AAEA;IACI,2BAA2B;IAC3B,8BAA8B;AAClC;;AAEA;IACI,6BAA6B;AACjC;AACA;IACI,mCAAmC;AACvC;;AAEA;IACI,sBAAsB;AAC1B;AACA;IACI,8CAA8C;AAClD;AACA;IACI,uBAAuB;AAC3B;AACA;IACI,8BAA8B;AAClC;AACA;IACI,uCAAuC;AAC3C;AACA;IACI,6BAA6B;AACjC;;AAEA;IACI,eAAe;IACf,wBAAwB;IACxB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","sources":["webpack://app/./static/css/main.css","webpack://app/./static/css/components/button.css","webpack://app/./static/css/components/form.css","webpack://app/./static/css/components/image.css","webpack://app/./static/css/components/label.css","webpack://app/./static/css/components/overlay.css","webpack://app/./static/css/components/table.css","webpack://app/./static/css/layouts/header.css","webpack://app/./static/css/layouts/footer.css","webpack://app/./static/css/layouts/table-main.css","webpack://app/./static/css/lib/utils.css","webpack://app/./static/css/themes/light.css"],"sourcesContent":["\n:root {\n --font-family-base: 'Open Sans', Arial, sans-serif;\n /* Declare global variables */\n /*\n --c_purple: #5B29FF;\n --c_purple_pastel: #D1D1FF;\n --c_purple_lighter: #E8E1FF;\n --c_purple_light: #C6BDFF;\n --c_purple_dark: #4700B3;\n */\n /* purple theme\n - light https://coolors.co/palette/a172fd-a77afe-ac82fe-b691fe-c1a0fe-cbaffe-d6bffe-e0cefe-ebddfe-f5ecfe\n - dark https://coolors.co/palette/310055-3c0663-4a0a77-5a108f-6818a5-8b2fc9-ab51e3-bd68ee-d283ff-dc97ff\n */\n /*\n --c_purple_darker: #310055;\n --c_purple_dark: #4A0A77;\n --c_purple: #6818A5;\n --c_purple_light: #CBAFFE;\n --c_purple_lighter: #F5ECFE;\n\n --c_blue: #0044FF;\n --c_blue_pastel: #B8E0FF;\n --c_blue_light: #73E8FF;\n --c_blue_dark: #003ADB;\n */\n /* --c_red: * /\n --c-red: #FF0000;\n --c_red_pastel: #FAE0E2;\n --c_red_lighter: #FAE0E2;\n */\n}\n\nhtml {\n height: 100vh;\n /* overflow-y: clip; */\n}\n\nbody {\n background-color: var(--colour-page-background);\n color: var(--colour-text);\n font-family: var(--font-family-base);\n font-family: Arial;\n padding: 0;\n margin: 0;\n border: 0;\n background: linear-gradient(to bottom right, var(--colour-page-background-1), var(--colour-page-background-2)); /* var(--c_purple); */\n height: 100vh;\n /* max-height: 100vh;\n overflow-y: clip; */\n}\n\n* {\n margin: 0;\n}\n\nscript, link {\n display: none !important;\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.page-body > * {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n width: 100%;\n align-self: center;\n font-size: min(16px, calc(1vh * 4));\n}\n#pageBody > * > * {\n align-self: center;\n padding-top: 0.5vh;\n padding-bottom: 0.5vh;\n}\n#pageBody > .card {\n height: fit-content;\n margin: 0.5vh auto;\n}\n\n/* header image */\nimg.header-logo {\n max-height: 15vh;\n max-width: 15vh;\n cursor: pointer;\n border-radius: 3vh;\n}\n\n/* icon images */\n.img-icon {\n max-width: 16vh;\n max-height: 8vh;\n border-radius: 0;\n}\n\n/* Add a card effect for articles */\n.card {\n background-color: var(--colour-text-background);\n padding: 1vh 2.5vw;\n margin: 1vh;\n display: flex !important;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n border-radius: 1.5vh;\n position: relative;\n height: fit-content;\n max-width: 80vw;\n}\n\n.header.card {\n border-radius: 2.5vh;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.container {\n flex: 1;\n margin: 0px;\n align-items: flex-start;\n justify-content: flex-start;\n text-align: flex-start;\n /* max-width: 100%; */\n /* min-width: fit-content; */\n}\n\n.column {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin: auto 0;\n}\n\n.row {\n display: flex; \n flex-direction: row;\n width: 100%;\n flex-wrap: wrap;\n}\n\n.container > .card:first-of-type {\n margin-top: none;\n}\n\n\n/*\n/* Responsive layout - when the screen is less than 800px wide, make the two columns stack on top of each other instead of next to each other *\n@media screen and (max-width: 800px) {\n .leftcolumn, .rightcolumn { \n width: 100%;\n /* padding: 0; *\n }\n}\n\n/* Responsive layout - when the screen is less than 400px wide, make the navigation links stack on top of each other instead of next to each other *\n@media screen and (max-width: 400px) {\n .topnav a {\n float: none;\n width: 100%;\n }\n}\n*/\n\n.container-input {\n padding: 1vh;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n}\n\n.container-input > label {\n width: 100%;\n margin-bottom: 1vh;\n margin-top: 0;\n}\n\n.container-input > input,\n.container-input > textarea {\n border: 2px solid var(--colour-accent);\n padding: 1vh;\n}\n\n.label-title {\n width: 100%;\n}\n\n\nul {\n max-width: 90%;\n padding: 5px 0 10px 0;\n}\nli {\n text-align: left;\n font-size: 18px;\n}\n\n\n:not(input,textarea,select,button).dirty {\n background-color: var(--colour-accent);\n}\ninput.dirty, textarea.dirty, select.dirty {\n border-color: var(--colour-primary);\n}\n\n\n#pageBody > *, button {\n font-size: min(12px, calc(1vh * 3));\n}\n\n\n\n@media screen and (max-width: 400px) {\n img.header-logo {\n border-radius: 3vh;\n }\n /*\n .company-name {\n font-size: 14px;\n }\n */\n}",".button {\n display: inline-block;\n padding: 0.5vh 0.75vh;\n border-radius: 0.75vh;\n text-decoration: none;\n font-weight: bold;\n transition: all 0.3s ease;\n width: fit-content;\n}\n.button:not(.is_collapsed) {\n cursor: pointer;\n}\n.button.is_collapsed {\n display: block;\n opacity: 0;\n}\n\n.button-primary {\n background: var(--colour-accent);\n color: var(--colour-primary);\n border: 2px solid var(--colour-primary);\n}\n\n.button-primary:hover {\n background: var(--colour-secondary);\n}\n\n.button-light {\n background: white;\n color: var(--colour-primary);\n}\n\n.button-light:hover {\n background: var(--colour-accent);\n}\n\n.logo:hover{\n cursor: pointer;\n}\n\n\n.button.icon.active.delete, \n.button.icon.active.add {\n height: 2vh;\n}","\n\nselect {\n border: 1px solid var(--colour-accent);\n}","\nimg, video {\n border-radius: 3vh;\n}\n","\nh1 {\n font-size: min(24px, calc(1vh * 6));\n}\n\nh2 {\n font-size: min(20px, calc(1vh * 5));\n}\n\nh3 {\n font-size: min(16px, calc(1vh * 4));\n margin-top: 1vh;\n}\n\nh4 {\n font-size: 13px;\n margin: 1vh;\n text-align: center;\n margin-left: auto;\n margin-right: auto;\n}\n\nh5 {\n font-size: 11px;\n margin: 1vh;\n}\n","\n\n/* Overlay modal */\n.overlay {\n /*\n display: none;\n */\n position: fixed;\n width: 100px;\n /* height: 50%; */ \n background: var(--colour-page-background);\n justify-content: right;\n align-items: right;\n align-self: right;\n z-index: 999;\n}\n.is_collapsed {\n display: none;\n}\n\n/* Hamburger menu overlay */\n#buttonHamburger {\n cursor: pointer;\n position: absolute;\n right: 0;\n min-height: 4vh;\n max-height: 4vh;\n min-width: 4.5vh;\n max-width: 4.5vh;\n z-index: 10;\n}\n#buttonHamburger .icon.hamburger {\n min-height: 3vh;\n max-height: 3vh;\n min-width: 3vh;\n max-width: 3vh;\n}\n/*\n#buttonHamburger:hover {\n text-decoration: none;\n cursor: pointer;\n}\n*/\n#overlayHamburger {\n top: 20vh;\n right: 0.75vh;\n overflow-x: hidden;\n overflow-y: auto;\n max-height: 60vh;\n}\n#overlayHamburger {\n border: 2px solid var(--border-colour);\n border-radius: 4px;\n}\n#overlayHamburger:first-child {\n border-top-left-radius: 12px;\n border-top-right-radius: 12px;\n}\n#overlayHamburger:last-child {\n border-bottom-left-radius: 12px;\n border-bottom-right-radius: 12px;\n}\n\n#overlayHamburger > * {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n text-align: center;\n width: 100%;\n /* color: var(--colour-text); */\n font-weight: bold;\n font-size: 15px;\n /* height: 18px; */\n}\n#overlayHamburger > :hover {\n color: var(--colour-page-background);\n background-color: var(--colour-primary);\n}\n#overlayHamburger > * > * {\n width: 100%;\n /*\n margin-top: 4.5px;\n margin-bottom: 4.5px;\n */\n}\n#overlayHamburger > .container {\n padding-top: 4.5px;\n padding-bottom: 4.5px;\n}\n\n@media screen and (max-width: 400px) {\n #buttonHamburger {\n min-height: 6vh;\n max-height: 6vh;\n min-width: 6.5vh;\n max-width: 6.5vh;\n }\n #buttonHamburger .icon.hamburger {\n min-height: 5vh;\n max-height: 5vh;\n min-width: 5vh;\n max-width: 5vh;\n }\n #overlayHamburger {\n top: 22vh;\n width: 100px;\n /* right: 6.5vh; */\n }\n}\n\n/* Confirm overlay */\n#overlayConfirm {\n position: absolute;\n left: 25vw;\n width: 50vw;\n height: 50vh;\n}\n\n#overlayConfirm .row > * {\n margin-left: auto;\n margin-right: auto;\n}\n\n#overlayConfirm .row .button.button-cancel {\n margin-right: 0.5vh;\n}\n#overlayConfirm .row .button.submit {\n margin-left: 0.5vh;\n}\n\n\n","\n#formFilters .container {\n max-width: fit-content;\n}\n\nthead, tbody {\n padding-top: 0px !important;\n padding-bottom: 0px !important;\n}\n\nth {\n background-color: transparent;\n}\ntd {\n font-size: min(12px, calc(1vh * 3));\n}\n\nth, td {\n min-width: fit-content;\n}\ntr:not(:last-child) > td {\n border-bottom: 1px dashed var(--border-colour);\n}\ntd > table > tbody > tr > td {\n border: none !important;\n}\nth.is_collapsed, td.is_collapsed {\n display: table-cell !important;\n}\ntd.dirty {\n background-color: var(--colour-primary);\n}\ntd:not(.dirty) {\n background-color: transparent;\n}\n\ntr {\n min-height: 1px;\n border-bottom: 1px solid;\n border-top: 1px solid;\n border-color: var(--border-colour);\n background-color: transparent;\n}\n\ntable button {\n margin: 0.25vh;\n padding: 0.5vh 1vh;\n}\n\ntable button.active {\n background-color: var(--colour-page-background);\n}\n\ntr.delete, tr.delete > td {\n background-color: var(--colour-error);\n}\n\ntable div {\n align-content: center;\n}","\n/*\nheader {\n background: white;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n / * position: fixed;\n top: 0; * /\n width: 100%;\n z-index: 1000;\n}\n\n.navbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 0;\n}\n\n.logo {\n font-size: 1.5rem;\n font-weight: bold;\n color: var(--primary);\n}\n\n.nav-links {\n display: flex;\n gap: 2rem;\n}\n\n.nav-links a {\n text-decoration: none;\n color: var(--text);\n font-weight: 500;\n align-content: center;\n}\n.nav-links a.button {\n color: white;\n}\n*/\n\n\n/* Navigation */\n.topnav {\n border-bottom-left-radius: 2.5vh;\n border-bottom-right-radius: 2.5vh;\n display: flex;\n flex-wrap: wrap;\n flex: 1;\n flex-direction: row;\n font-weight: bold;\n font-size: 1vh;\n max-height: 15vh;\n height: 15vh;\n align-items: flex-start;\n}\n.topnav a, .topnav label, .topnav p, .topnav h1 {\n float: left;\n display: flex;\n text-align: center;\n text-decoration: none;\n width: 100%;\n max-height: 15vh;\n font-weight: normal;\n justify-content: center;\n}\n.topnav a:hover {\n background-color: var(--colour-page-background);\n}\n\n.topnav > .container {\n max-width: 50%;\n height: 100%;\n align-items: center;\n align-self: center;\n display: flex;\n}\n.topnav > .container.header-logo {\n min-width: 15vh;\n max-width: 15vh;\n}\n.topnav > .container.company-name {\n min-width: calc(100vw - 30vh);\n max-width: calc(100vw - 30vh);\n}\n.topnav select {\n padding: 1vh;\n margin: 1vh;\n border-radius: 1vh;\n border: 2px solid var(--border-colour);\n font-weight: bold;\n text-align: center;\n width: 25vw;\n}\n.topnav select .is_collapsed {\n width: 5vw;\n}\n.company-name {\n font-size: min(28px, calc(1vh * 7));\n}\n/*\n@media screen and (max-width: 450px) {\n .company-name {\n font-size: 18px; / * min(24px, calc(1vh * 7)); * /\n }\n}\n*/\n/* Page Filters */\n#formFilters {\n width: fit-content;\n margin-left: auto;\n margin-right: auto;\n \n}\n#formFilters * {\n font-size: 12px;\n}\n\n#formFilters .container {\n}\n#formFilters .container-input {\n max-width: fit-content;\n padding: 0 0.5vh;\n}\n#formFilters .container-input:has(.dirty) {\n background-color: var(--colour-accent);\n} \n\n#formFilters .container-input input {\n width: 10vh;\n max-width: 10vh;\n height: 20px;\n}\n/*\n#formFilters .container-input input {\n height: 1.7vh;\n}\n#formFilters .container-input select {\n height: 2vh;\n}\n*/\n\n#formFilters .container-input.filter.active_only {\n width: 8vh;\n}\n#formFilters .container-input.filter.active_only input {\n display: none;\n}\n#formFilters .container-input.filter.active_only svg.active_only {\n height: 25px;\n fill: var(--colour-text-background);\n background-color: var(--colour-accent);\n /* border: 1px solid var(--colour-accent);\n border-radius: 0.5vh; */\n width: 25px;\n}\n#formFilters .container-input.filter.active_only svg.active_only.is_checked {\n fill: var(--colour-accent);\n background-color: var(--colour-text-background);\n}\n#formFilters .container-input.filter.is_not_empty {\n width: 12vh;\n}\n\n/*\n#formFilters button {\n padding: 0.5vh 0.75vh;\n background-color: var(--colour-accent);\n color: var(--colour-primary);\n font-weight: bold;\n border-radius: 0.75vh;\n border: 2px solid var(--colour-primary);\n}\n\n#formFilters button.is_collapsed {\n display: block;\n opacity: 0;\n}\n*/\n\nform.filter button.save, form.filter button.button-cancel {\n margin-top: 0;\n margin-bottom: 0;\n}\nform.filter button.save, form.filter button.button-cancel {\n margin-top: 0;\n margin-bottom: 1px;\n}\n\n\n@media screen and (max-width: 400px) {\n #formFilters .container-input select {\n /* height: 3vh; */\n }\n .topnav h1 {\n font-size: 16px;\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 {\n padding: 0.5vh 1vw;\n margin-top: 1vh;\n}\n\ntable.table-main {\n overflow-x: auto;\n padding: 1vh 1vw;\n max-width: 88vw; /* min(calc(1vh * 80), calc(1vw * 90)); */\n width: min-content;\n align-items: normal;\n justify-content: normal;\n}\n\ntable.table-main * {\n padding: 0.25vh 0.5vh;\n}\n\ntable.table-main thead {\n max-height: 4vh;\n overflow-y: visible;\n background-color: var(--colour-text-background);\n}\n\ntable.table-main tbody {\n max-height: 60vh;\n overflow-y: auto;\n min-width: fit-content;\n max-width: fit-content;\n overflow-x: visible;\n}\ntable.table-main tbody.is_collapsed {\n display: block;\n}\ntable.table-main:has(tbody > div) tbody {\n}\ntable.table-main tbody > div {\n margin-left: auto;\n margin-right: auto;\n text-align: center;\n justify-content: center;\n justify-items: center;\n justify-self: center;\n align-content: center;\n align-items: center;\n align-self: center;\n position: relative;\n display: block;\n width: 100%; /* min(calc(90vh), calc(70vw)); */\n}\n\ntable.table-main select, \ntable.table-main input:not([type=\"checkbox\"]), \ntable.table-main textarea, \ntable.table-main div {\n box-sizing: border-box;\n width: 100%;\n max-width: 100%;\n height: 100%;\n border: 1px solid var(--colour-accent);\n border-radius: 0.5vh;\n text-align: center;\n background-color: var(--colour-text-background);\n}\n\ntable.table-main thead tr th, \ntable.table-main tbody tr td {\n max-width: 20vh;\n min-width: 20vh;\n padding: 0 0.5vh;\n}\ntable.table-main tbody tr td {\n height: 5vh;\n /* padding-top: 0.5vh; */\n}\ntable.table-main thead tr th.notes, \ntable.table-main tbody tr td.notes {\n max-width: fit-content;\n}\ntable.table-main tbody tr td:has(.dirty) {\n background-color: var(--colour-primary);\n}\ntable.table-main tbody tr td:has(.dirty) table {\n background-color: var(--colour-text-background);\n}\ntable.table-main tbody tr:not(:last-of-type) td {\n padding-bottom: 0.25vh;\n}\ntable.table-main tbody tr td.ddl-preview div {\n cursor: pointer;\n}\ntable.table-main tbody tr td.ddl-preview div,\ntable.table-main tbody tr td.ddl-preview select {\n padding-left: 2vh;\n padding-right: 2vh;\n}\ntable.table-main tbody tr td.ddl-preview select {\n font-size: 12px;\n}\ntable.table-main thead tr th.active, \ntable.table-main tbody tr td.active {\n max-width: 6vh;\n min-width: 6vh;\n}\ntable.table-main thead tr th.active svg.active.add {\n fill: var(--colour-primary);\n background-color: var(--colour-accent);\n border: 2px solid var(--colour-accent);\n padding: 0;\n border-radius: 1vh;\n}\ntable.table-main tbody tr td.active svg.active.add {\n fill: var(--colour-primary);\n}\ntable.table-main tbody tr td.active svg.active.delete {\n fill: var(--colour-error);\n}\ntable.table-main tbody tr td.display_order, \ntable.table-main thead tr th.display_order {\n max-width: 5vh;\n min-width: 5vh;\n}\n\n#container-template-elements {\n display: none;\n}\n\n\n@media screen and (max-width: 850px) {\n}\n@media screen and (max-width: 400px) {\n #formFilters input[type=\"text\"],\n #formFilters select {\n width: 15vh;\n /* height: 3vh; */\n }\n table.table-main {\n max-height: 60vh;\n }\n table.table-main tbody {\n max-height: 53vh;\n }\n}",".text-center {\n text-align: center;\n}\n\n.section-title {\n font-size: 2rem;\n margin-bottom: 1rem;\n}\n\n.section-subtitle {\n margin-bottom: 2rem;\n}\n\n@media (max-width: 768px) {\n .hero h1 {\n font-size: 2.5rem;\n }\n \n .nav-links {\n display: none;\n }\n}","/* Default */\n:root {\n /* Claude dark blue / grey theme */\n --colour-accent: #C77DFF;\n --colour-error: red;\n --colour-page-background: #E0AAFF;\n --colour-page-background-1: #F5ECFE;\n --colour-page-background-2: #FAE0E2;\n --colour-primary: #240046;\n --colour-secondary: #3C096C;\n --colour-text: #10002B;\n --colour-text-background: white;\n --colour-text-link-unvisited: #0000EE;\n --colour-text-link-visited: #551A8B;\n}\n\n/*\n--c_purple_darker: #310055;\n--c_purple_dark: #4A0A77;\n--c_purple: #6818A5;\n--c_purple_light: #CBAFFE;\n--c_purple_lighter: #F5ECFE;\n\n--c_blue: #0044FF;\n--c_blue_pastel: #B8E0FF;\n--c_blue_light: #73E8FF;\n--c_blue_dark: #003ADB;\n/* --c_red: * /\n--c-red: #FF0000;\n--c_red_pastel: #FAE0E2;\n--c_red_lighter: #FAE0E2;\n}\n*/"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/static/dist/js/dog_assessment.bundle.js b/static/dist/js/dog_assessment.bundle.js new file mode 100644 index 0000000..1b364c4 --- /dev/null +++ b/static/dist/js/dog_assessment.bundle.js @@ -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_assessment.bundle.js.map \ No newline at end of file diff --git a/static/dist/js/dog_assessment.bundle.js.map b/static/dist/js/dog_assessment.bundle.js.map new file mode 100644 index 0000000..247e994 --- /dev/null +++ b/static/dist/js/dog_assessment.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/dog_assessment.bundle.js","mappings":";;;;AAAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/dog.css?a9d0","webpack://app/./static/css/pages/dog/assessment.css?3808"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/static/dist/js/dog_assessments.bundle.js b/static/dist/js/dog_assessments.bundle.js new file mode 100644 index 0000000..03bdf55 --- /dev/null +++ b/static/dist/js/dog_assessments.bundle.js @@ -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_assessments.bundle.js.map \ No newline at end of file diff --git a/static/dist/js/dog_assessments.bundle.js.map b/static/dist/js/dog_assessments.bundle.js.map new file mode 100644 index 0000000..e09f6b4 --- /dev/null +++ b/static/dist/js/dog_assessments.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/dog_assessments.bundle.js","mappings":";;;;AAAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/dog.css?a9d0","webpack://app/./static/css/pages/dog/assessments.css"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/static/dist/js/dog_dogs.bundle.js.map b/static/dist/js/dog_dogs.bundle.js.map index c756005..556bfdb 100644 --- a/static/dist/js/dog_dogs.bundle.js.map +++ b/static/dist/js/dog_dogs.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"js/dog_dogs.bundle.js","mappings":";;;;AAAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/dog.css?a9d0","webpack://app/./static/css/pages/dog/dogs.css?c51b"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/dog_dogs.bundle.js","mappings":";;;;AAAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/dog.css?a9d0","webpack://app/./static/css/pages/dog/dogs.css"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/static/dist/js/main.bundle.js b/static/dist/js/main.bundle.js index 9915f4d..0683ac0 100644 --- a/static/dist/js/main.bundle.js +++ b/static/dist/js/main.bundle.js @@ -445,6 +445,16 @@ var Events = /*#__PURE__*/function () { element.classList.add(classInitialised); }); } + }, { + key: "hookupEventHandler", + value: function hookupEventHandler(eventType, selector, callback) { + Events.initialiseEventHandler(selector, flagInitialised, function (element) { + element.addEventListener(eventType, function (event) { + event.stopPropagation(); + callback(event, element); + }); + }); + } }]); }(); @@ -972,20 +982,10 @@ var BasePage = /*#__PURE__*/function () { this.hookupNavigation(); this.hookupOverlays(); } - }, { - key: "hookupEventHandler", - value: function hookupEventHandler(eventType, selector, callback) { - Events.initialiseEventHandler(selector, flagInitialised, function (element) { - element.addEventListener(eventType, function (event) { - event.stopPropagation(); - callback(event, element); - }); - }); - } }, { key: "hookupNavigation", value: function hookupNavigation() { - this.hookupEventHandler("click", idButtonHamburger, function (event, element) { + Events.hookupEventHandler("click", idButtonHamburger, function (event, element) { var overlayHamburger = document.querySelector(idOverlayHamburger); if (overlayHamburger.classList.contains(flagIsCollapsed)) { overlayHamburger.classList.remove(flagIsCollapsed); @@ -1011,6 +1011,17 @@ var BasePage = /*#__PURE__*/function () { this.hookupButtonsNavDogLocations(); 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); + }); + }); } }, { key: "hookupButtonsNavHome", @@ -1021,7 +1032,7 @@ var BasePage = /*#__PURE__*/function () { key: "hookupButtonsNav", value: function hookupButtonsNav(buttonSelector, hashPageNav) { var _this = this; - this.hookupEventHandler("click", buttonSelector, function (event, button) { + Events.hookupEventHandler("click", buttonSelector, function (event, button) { _this.router.navigateToHash(hashPageNav); }); } @@ -1047,7 +1058,7 @@ var BasePage = /*#__PURE__*/function () { key: "hookupButtonsNavUserLogin", value: function hookupButtonsNavUserLogin() { var _this2 = this; - this.hookupEventHandler("click", '.' + flagNavUserLogin, function (event, navigator) { + Events.hookupEventHandler("click", '.' + flagNavUserLogin, function (event, navigator) { event.stopPropagation(); _this2.leave(); API.loginUser().then(function (response) { @@ -1099,11 +1110,16 @@ var BasePage = /*#__PURE__*/function () { value: function hookupButtonsNavDogCommandButtonLinks() { this.hookupButtonsNav('.' + flagNavDogCommandButtonLinks, hashPageDogCommandButtonLinks); } + }, { + key: "hookupButtonsNavDogAssessments", + value: function hookupButtonsNavDogAssessments() { + this.hookupButtonsNav('.' + flagNavDogAssessments, hashPageDogAssessments); + } }, { key: "hookupLogos", value: function hookupLogos() { var _this3 = this; - this.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, function (event, element) { + Events.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, function (event, element) { utils_Utils.consoleLogIfNotProductionEnvironment('clicking logo'); _this3.router.navigateToHash(hashPageHome); }); @@ -1159,9 +1175,10 @@ var BasePage = /*#__PURE__*/function () { }, { key: "toggleShowButtonsSaveCancel", value: function toggleShowButtonsSaveCancel(show) { + var buttonContainerSelector = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '.' + flagContainer + '.' + flagSave + '.' + flagCancel; // , buttonSave = null, buttonCancel = null - var buttonSave = document.querySelector('form.' + flagFilter + ' button.' + flagSave); - var buttonCancel = document.querySelector('form.' + flagFilter + ' button.' + flagCancel); + var buttonSave = document.querySelector(buttonContainerSelector + ' button.' + flagSave); + var buttonCancel = document.querySelector(buttonContainerSelector + ' button.' + flagCancel); if (show) { buttonCancel.classList.remove(flagIsCollapsed); buttonSave.classList.remove(flagIsCollapsed); @@ -1298,11 +1315,7 @@ var BusinessObjects = /*#__PURE__*/function () { var valueSelected = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var keyText = objectJson[flagNameAttrOptionText]; var keyValue = objectJson[flagNameAttrOptionValue]; - utils_Utils.consoleLogIfNotProductionEnvironment({ - objectJson: objectJson, - keyText: keyText, - keyValue: keyValue - }); + // Utils.consoleLogIfNotProductionEnvironment({objectJson, keyText, keyValue}); return BusinessObjects.getOptionJsonFromObjectJsonAndKeys(objectJson, keyText, keyValue, valueSelected); } }, { @@ -1470,7 +1483,7 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { var filterActiveNew = document.querySelector(idFormFilters + ' div.' + flagActiveOnly + '.' + flagContainerInput + ' svg.' + flagActiveOnly); filterActiveNew.setAttribute('id', flagActiveOnly); if (isChecked) filterActiveNew.classList.add(flagIsChecked); - this.hookupEventHandler("click", filterSelector, function (event, filterActive) { + Events.hookupEventHandler("click", filterSelector, function (event, filterActive) { utils_Utils.consoleLogIfNotProductionEnvironment({ filterActive: filterActive }); @@ -1497,7 +1510,7 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { return _this4.handleChangeFilter(event, filter); }; var filterSelector = idFormFilters + ' #' + filterFlag; - this.hookupEventHandler("change", filterSelector, handler); + Events.hookupEventHandler("change", filterSelector, handler); var filter = document.querySelector(filterSelector); var filterValuePrevious = DOM.getElementValueCurrent(filter); filter.setAttribute(attrValueCurrent, filterValuePrevious); @@ -1550,7 +1563,7 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { key: "hookupButtonApplyFilters", value: function hookupButtonApplyFilters() { var _this5 = this; - this.hookupEventHandler("click", idButtonApplyFilters, function (event, button) { + Events.hookupEventHandler("click", idButtonApplyFilters, function (event, button) { event.stopPropagation(); _this5.callFilterTableContent(); }); @@ -1601,6 +1614,11 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { value: function hookupFilterCommand() { this.hookupFilter(attrIdCommand); } + }, { + key: "hookupFilterLocation", + value: function hookupFilterLocation() { + this.hookupFilter(attrIdLocation); + } /* getAndLoadFilteredTableContent = () => { this.callFilterTableContent() @@ -1788,12 +1806,9 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { if (this.constructor === TableBasePage) { throw new Error("Must implement hookupTableMain() method."); } - if (true) { - // _rowBlank == null) { - Events.initialiseEventHandler(idTableMain, flagInitialised, function (table) { - _this12.cacheRowBlank(); - }); - } + Events.initialiseEventHandler(idTableMain, flagInitialised, function (table) { + _this12.cacheRowBlank(); + }); } }, { key: "cacheRowBlank", @@ -1848,79 +1863,6 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { handler(null, input); }); } - /* - handleChangeElementCellTable(event, element) { - let row = DOM.getRowFromElement(element); - let td = DOM.getCellFromElement(element); - let wasDirtyRow = DOM.hasDirtyChildrenContainer(row); - let wasDirtyElement = element.classList.contains(flagDirty); - let isDirtyElement = DOM.updateAndCheckIsElementDirty(element); - if (isDirtyElement != wasDirtyElement) { - DOM.handleDirtyElement(td, isDirtyElement); - let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row); - if (isNowDirtyRow != wasDirtyRow) { - DOM.handleDirtyElement(row, isNowDirtyRow); - let rows = this.getTableRecords(true); - let existsDirtyRecord = rows.length > 0; - this.toggleShowButtonsSaveCancel(existsDirtyRecord); - } - } - } - handleChangeElementNestedCellTable(event, element, flagColumnList = [], orderNesting = 1) { - let orderNestingTemp = orderNesting; - let row, td, nestedRowSelector; - while (orderNestingTemp > 0) { - nestedRowSelector = idTableMain; - for (let indexOrderNesting = 0; indexOrderNesting < orderNestingTemp; indexOrderNesting++) { - nestedRowSelector += ' tbody tr'; - } - row = DOM.getClosestParent(element, nestedRowSelector); - td = row.querySelector('td.' + flag); - } - let row = DOM.getRowFromElement(element); - let td = DOM.getCellFromElement(element); - let wasDirtyRow = DOM.hasDirtyChildrenContainer(row); - let wasDirtyElement = element.classList.contains(flagDirty); - let isDirtyElement = DOM.updateAndCheckIsElementDirty(element); - if (isDirtyElement != wasDirtyElement) { - DOM.handleDirtyElement(td, isDirtyElement); - let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row); - if (isNowDirtyRow != wasDirtyRow) { - DOM.handleDirtyElement(row, isNowDirtyRow); - let rows = this.getTableRecords(true); - let existsDirtyRecord = rows.length > 0; - this.toggleShowButtonsSaveCancel(existsDirtyRecord); - } - } - } - handleChangeElementSubtableCell(event, element, flagFieldSubtable) { - let rowSubtable = element.closest(idTableMain + ' td.' + flagFieldSubtable + ' tbody tr'); - let rowTable = rowSubtable.closest(idTableMain + ' > tbody > tr'); - let td = DOM.getCellFromElement(element); - // let tdSubtable = td.closest('td.' + flagFieldSubtable); - let wasDirtyRowSubtable = DOM.hasDirtyChildrenContainer(rowSubtable); - let wasDirtyRowTable = DOM.hasDirtyChildrenContainer(rowTable); - let wasDirtyElement = element.classList.contains(flagDirty); - let isDirtyElement = DOM.updateAndCheckIsElementDirty(element); - Utils.consoleLogIfNotProductionEnvironment({isDirtyElement, wasDirtyElement}); - if (isDirtyElement != wasDirtyElement) { - DOM.handleDirtyElement(td, isDirtyElement); - let isNowDirtyRowSubtable = DOM.hasDirtyChildrenContainer(rowSubtable); - Utils.consoleLogIfNotProductionEnvironment({isNowDirtyRowSubtable, wasDirtyRowSubtable}); - if (isNowDirtyRowSubtable != wasDirtyRowSubtable) { - DOM.handleDirtyElement(rowSubtable, isNowDirtyRowSubtable); - let isNowDirtyRowTable = DOM.hasDirtyChildrenContainer(rowTable); - Utils.consoleLogIfNotProductionEnvironment({isNowDirtyRowTable, wasDirtyRowTable}); - if (isNowDirtyRowTable != wasDirtyRowTable) { - DOM.handleDirtyElement(rowTable, isNowDirtyRowTable); - let rows = this.getTableRecords(true); - let existsDirtyRecord = rows.length > 0; - this.toggleShowButtonsSaveCancel(existsDirtyRecord); - } - } - } - } - */ }, { key: "handleChangeNestedElementCellTable", value: function handleChangeNestedElementCellTable(event, element) { @@ -1975,7 +1917,7 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (event, element) { if (!element.classList.contains(flagIsCollapsed)) _this14.handleChangeNestedElementCellTable(event, element); }; - this.hookupEventHandler("change", inputSelector, handler); + Events.hookupEventHandler("change", inputSelector, handler); } }, { key: "hookupFieldsCodeTable", @@ -2005,13 +1947,13 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { var handleClickRowNew = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (event, element) { _this15.handleClickAddRowTable(event, element); }; - var selectorButton = 'table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody > tr > td.' + flagActive + ' .' + flagButton + '.' + flagActive; + var selectorButton = 'table.table-main' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody > tr > td.' + flagActive + ' .' + flagButton + '.' + flagActive; var selectorButtonDelete = selectorButton + '.' + flagDelete; var selectorButtonUndelete = selectorButton + ':not(.' + flagDelete + ')'; utils_Utils.consoleLogIfNotProductionEnvironment("hookupFieldsActive: ", selectorButtonDelete, selectorButtonUndelete); this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupEventHandler("click", 'table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > thead > tr > th.' + flagActive + ' .' + flagButton + '.' + flagActive, function (event, button) { + Events.hookupEventHandler("click", 'table.table-main' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > thead > tr > th.' + flagActive + ' .' + flagButton + '.' + flagActive, function (event, button) { handleClickRowNew(event, button); }); } @@ -2022,7 +1964,7 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { var changeHandler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (event, element) { _this16.handleChangeNestedElementCellTable(event, element); }; - this.hookupEventHandler("click", selectorButtonDelete, function (event, element) { + Events.hookupEventHandler("click", selectorButtonDelete, function (event, element) { _this16.handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, function (changeEvent, changeElement) { changeHandler(changeEvent, changeElement); }); @@ -2062,7 +2004,7 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { var changeHandler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (event, element) { _this18.handleChangeNestedElementCellTable(event, element); }; - this.hookupEventHandler("click", selectorButtonUndelete, function (event, element) { + Events.hookupEventHandler("click", selectorButtonUndelete, function (event, element) { _this18.handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, function (changeEvent, changeElement) { changeHandler(changeEvent, changeElement); }); @@ -2107,7 +2049,7 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { _this20.handleChangeNestedElementCellTable(event, element); }; if (cellSelector == null) cellSelector = idTableMain + ' > tbody > tr > td.' + fieldFlag; - this.hookupEventHandler("click", cellSelector + ' div.' + fieldFlag, function (event, div) { + Events.hookupEventHandler("click", cellSelector + ' div.' + fieldFlag, function (event, div) { _this20.handleClickTableCellDdlPreview(event, div, fieldFlag, optionList, cellSelector, function (ddlSelector) { ddlHookup(ddlSelector, function (event, element) { changeHandler(event, element); @@ -2163,7 +2105,7 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { } /* hookupTableCellDDlPreviewsWhenNotCollapsed(cellSelector, optionList, ddlHookup = (event, element) => { this.hookupTableCellDdls(event, element); }) { - this.hookupEventHandler("click", cellSelector + ' div', (event, div) => { + Events.hookupEventHandler("click", cellSelector + ' div', (event, div) => { this.handleClickTableCellDdlPreview(event, div, optionList, cellSelector, (event, element) => { ddlHookup(event, element); }); }); } @@ -2182,9 +2124,12 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { key: "hookupFieldsCommandCategory", value: function hookupFieldsCommandCategory() { var _this23 = this; + var idTable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + if (idTable == null) idTable = idTableMain; this.hookupTableCellDdlPreviews(flagCommandCategory, utils_Utils.getListFromDict(filterCommandCategories).sort(function (a, b) { return a[flagName].localeCompare(b[flagName]); - }), null, function (cellSelector) { + }), idTable + ' > tbody > tr > td.' + flagCommandCategory // + ' .' + flagCommandCategory + , function (cellSelector) { _this23.hookupCommandCategoryDdls(cellSelector); }); } @@ -2203,7 +2148,11 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { var idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory); this.handleChangeNestedElementCellTable(event, ddlCategory); var idCommandCategoryRowNew = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory); - if (idCommandCategoryRowOld == idCommandCategoryRowNew) return; + if (idCommandCategoryRowOld == idCommandCategoryRowNew || idCommandCategoryRowNew == 0) return; + console.log({ + idCommandCategoryRowNew: idCommandCategoryRowNew, + idCommandCategoryRowOld: idCommandCategoryRowOld + }); var idCommandCategoryFilter = this.getIdCommandCategoryFilter(); var tdCommand = row.querySelector('td.' + flagCommand); tdCommand.dispatchEvent(new Event('click')); @@ -2228,7 +2177,9 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { key: "hookupFieldsCommand", value: function hookupFieldsCommand() { var _this25 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagCommand + ' .' + flagCommand, function (event, div) { + var idTable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + if (idTable == null) idTable = idTableMain; + Events.hookupEventHandler("click", idTable + ' > tbody > tr > td.' + flagCommand + ' div.' + flagCommand, function (event, div) { utils_Utils.consoleLogIfNotProductionEnvironment(div); var parentTr = DOM.getRowFromElement(div); utils_Utils.consoleLogIfNotProductionEnvironment({ @@ -2253,13 +2204,36 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { commandsInCategory: commandsInCategory }); utils_Utils.consoleLogIfNotProductionEnvironment(filterCommandList); - _this25.handleClickTableCellDdlPreview(event, div, flagCommand, sortedCommands, null, function (cellSelector) { + _this25.handleClickTableCellDdlPreview(event, div, flagCommand // fieldFlag + , sortedCommands // optionList + , idTable + ' > tbody > tr > td.' + flagCommand // cellSelector + , function (cellSelector) { _this25.hookupTableCellDdls(cellSelector, function (event, element) { - _this25.handleChangeNestedElementCellTable(event, element); + _this25.handleChangeCommandDdl(event, element); }); }); }); - this.hookupTableCellDdls(idTableMain + ' td.' + flagCommand + ' select.' + flagCommand); + this.hookupTableCellDdls(idTable + ' > tbody > tr > td.' + flagCommand + ' select.' + flagCommand, function (event, element) { + _this25.handleChangeCommandDdl(event, element); + }); + } + }, { + key: "handleChangeCommandDdl", + value: function handleChangeCommandDdl(event, ddlCommand) { + // console.log("handle change command ddl"); + var row = DOM.getRowFromElement(ddlCommand); + this.handleChangeNestedElementCellTable(event, ddlCommand); + var idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); + var idCommandNew = this.getIdCommandRow(row); + var commandNew = filterCommands[idCommandNew]; + // console.log({ idCommandCategoryRowOld, commandNew }); + if (commandNew == null || idCommandCategoryRowOld == commandNew[attrIdCommandCategory]) return; + var divCommandCategory = row.querySelector('td.' + flagCommandCategory + ' div'); + if (divCommandCategory) divCommandCategory.dispatchEvent(new Event('click')); + var ddlCommandCategory = row.querySelector('td.' + flagCommandCategory + ' select.' + flagCommandCategory); + DOM.setElementValueCurrent(ddlCommandCategory, commandNew[attrIdCommandCategory]); + // console.log({ ddlCommandCategory, commandNew }); + this.handleChangeNestedElementCellTable(event, ddlCommandCategory); } }, { key: "getIdCommandCategoryRow", @@ -2271,9 +2245,10 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { key: "getIdCommandCategoryFilter", value: function getIdCommandCategoryFilter() { var formFilters = TableBasePage.getFormFilters(); + var idCommandCategory = 0; + if (formFilters == null) return idCommandCategory; var commandCategoryFilter = formFilters.querySelector('#' + attrIdCommandCategory); var commandFilter = formFilters.querySelector('#' + attrIdCommand); - var idCommandCategory = 0; var valueCurrentCommandCategoryFilter = DOM.getElementAttributeValueCurrent(commandCategoryFilter); utils_Utils.consoleLogIfNotProductionEnvironment({ valueCurrentCommandCategoryFilter: valueCurrentCommandCategoryFilter @@ -2330,19 +2305,19 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { var elementDog = tr.querySelector('td.' + flagDog + ' .' + flagDog); return DOM.getElementAttributeValueCurrent(elementDog); } - }, { - key: "createTdActive", - value: function createTdActive(isActive) { - var tdActive = document.createElement("td"); - tdActive.classList.add(flagActive); - var buttonActive = document.createElement("button"); - buttonActive.classList.add(flagActive); - buttonActive.classList.add(isActive ? flagDelete : flagAdd); - buttonActive.textContent = isActive ? 'x' : '+'; - DOM.setElementAttributesValuesCurrentAndPrevious(buttonActive, isActive); - tdActive.appendChild(buttonActive); - return tdActive; + /* + createTdActive(isActive) { + let tdActive = document.createElement("td"); + tdActive.classList.add(flagActive); + let buttonActive = document.createElement("button"); + buttonActive.classList.add(flagActive); + buttonActive.classList.add(isActive ? flagDelete : flagAdd); + buttonActive.textContent = isActive ? 'x' : '+'; + DOM.setElementAttributesValuesCurrentAndPrevious(buttonActive, isActive); + tdActive.appendChild(buttonActive); + return tdActive; } + */ }, { key: "leave", value: function leave() { @@ -2482,6 +2457,7 @@ function mixin_table_setPrototypeOf(t, e) { return mixin_table_setPrototypeOf = + var DogTableMixinPage = /*#__PURE__*/function (_DogMixinPage) { function DogTableMixinPage(pageCurrent) { mixin_table_classCallCheck(this, DogTableMixinPage); @@ -2505,6 +2481,12 @@ var DogTableMixinPage = /*#__PURE__*/function (_DogMixinPage) { value: function hookupTable() { // Implement table-specific functionality here } + }, { + key: "hookupFieldsLocation", + value: function hookupFieldsLocation() { + this.page.hookupTableCellDdlPreviews(flagLocation, utils_Utils.getListFromDict(filterLocations) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + ); + } }]); }(DogMixinPage); @@ -2824,7 +2806,7 @@ var PageDogDogCommandLinks = /*#__PURE__*/function (_TableBasePage) { key: "postInitialiseRowNewCallback", value: function postInitialiseRowNewCallback(tbody) { var newRows = tbody.querySelectorAll('tr.' + flagRowNew); - var newestRow = newRows[newRows.length - 1]; + var newestRow = newRows[0]; var clickableElementsSelector = ['td.' + flagDog + ' div.' + flagDog, ',td.' + flagCommandCategory + ' div.' + flagCommandCategory, ',td.' + flagCommand + ' div.' + flagCommand].join(''); newestRow.querySelectorAll(clickableElementsSelector).forEach(function (clickableElement) { clickableElement.click(); @@ -2978,7 +2960,7 @@ var PageDogLocations = /*#__PURE__*/function (_TableBasePage) { ) { */ var cellSelector = idTableMain + ' > tbody > tr > td.' + flagLocationParent; - this.hookupEventHandler("click", cellSelector + ' div.' + flagLocationParent, function (event, div) { + Events.hookupEventHandler("click", cellSelector + ' div.' + flagLocationParent, function (event, div) { var row = DOM.getRowFromElement(div); var idLocationRow = Number(row.getAttribute(attrIdLocation)); utils_Utils.consoleLogIfNotProductionEnvironment({ @@ -3193,11 +3175,6 @@ var PageDogCommandButtonLinks = /*#__PURE__*/function (_TableBasePage) { value: function hookupFilterButtonIcon() { this.hookupFilter(attrIdButtonIcon); } - }, { - key: "hookupFilterLocation", - value: function hookupFilterLocation() { - this.hookupFilter(attrIdLocation); - } }, { key: "loadRowTable", value: function loadRowTable(rowJson) { @@ -3229,7 +3206,7 @@ var PageDogCommandButtonLinks = /*#__PURE__*/function (_TableBasePage) { key: "postInitialiseRowNewCallback", value: function postInitialiseRowNewCallback(tbody) { var newRows = tbody.querySelectorAll('tr.' + flagRowNew); - var newestRow = newRows[newRows.length - 1]; + var newestRow = newRows[0]; var clickableElementsSelector = ['td.' + flagDog + ' div.' + flagDog, ',td.' + flagCommandCategory + ' div.' + flagCommandCategory, ',td.' + flagCommand + ' div.' + flagCommand].join(''); newestRow.querySelectorAll(clickableElementsSelector).forEach(function (clickableElement) { clickableElement.click(); @@ -3244,7 +3221,7 @@ var PageDogCommandButtonLinks = /*#__PURE__*/function (_TableBasePage) { this.hookupFieldsButtonShape(); this.hookupFieldsColour(); this.hookupFieldsButtonIcon(); - this.hookupFieldsLocation(); + this.dogMixin.hookupFieldsLocation(); this.hookupFieldsActive(); } }, { @@ -3265,12 +3242,6 @@ var PageDogCommandButtonLinks = /*#__PURE__*/function (_TableBasePage) { this.hookupTableCellDdlPreviews(flagButtonIcon, utils_Utils.getListFromDict(filterButtonIcons) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) ); } - }, { - key: "hookupFieldsLocation", - value: function hookupFieldsLocation() { - this.hookupTableCellDdlPreviews(flagLocation, utils_Utils.getListFromDict(filterLocations) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) - ); - } }, { key: "leave", value: function leave() { @@ -3281,6 +3252,845 @@ var PageDogCommandButtonLinks = /*#__PURE__*/function (_TableBasePage) { command_button_links_defineProperty(PageDogCommandButtonLinks, "hash", hashPageDogCommandButtonLinks); command_button_links_defineProperty(PageDogCommandButtonLinks, "attrIdRowObject", attrIdCommandButtonLink); +;// ./static/js/pages/dog/assessment.js +function assessment_typeof(o) { "@babel/helpers - typeof"; return assessment_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; }, assessment_typeof(o); } +function assessment_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function assessment_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, assessment_toPropertyKey(o.key), o); } } +function assessment_createClass(e, r, t) { return r && assessment_defineProperties(e.prototype, r), t && assessment_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function assessment_callSuper(t, o, e) { return o = assessment_getPrototypeOf(o), assessment_possibleConstructorReturn(t, assessment_isNativeReflectConstruct() ? Reflect.construct(o, e || [], assessment_getPrototypeOf(t).constructor) : o.apply(t, e)); } +function assessment_possibleConstructorReturn(t, e) { if (e && ("object" == assessment_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return assessment_assertThisInitialized(t); } +function assessment_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function assessment_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (assessment_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function assessment_superPropGet(t, o, e, r) { var p = assessment_get(assessment_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } +function assessment_get() { return assessment_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = assessment_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, assessment_get.apply(null, arguments); } +function assessment_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = assessment_getPrototypeOf(t));); return t; } +function assessment_getPrototypeOf(t) { return assessment_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, assessment_getPrototypeOf(t); } +function assessment_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 && assessment_setPrototypeOf(t, e); } +function assessment_setPrototypeOf(t, e) { return assessment_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, assessment_setPrototypeOf(t, e); } +function assessment_defineProperty(e, r, t) { return (r = assessment_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function assessment_toPropertyKey(t) { var i = assessment_toPrimitive(t, "string"); return "symbol" == assessment_typeof(i) ? i : i + ""; } +function assessment_toPrimitive(t, r) { if ("object" != assessment_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != assessment_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + + + + + + + + +var _rowBlankDistraction; +var _rowBlankAssessmentCommandModalityLink; +var PageDogAssessment = /*#__PURE__*/function (_TableBasePage) { + function PageDogAssessment(router) { + var _this; + assessment_classCallCheck(this, PageDogAssessment); + _this = assessment_callSuper(this, PageDogAssessment, [router]); + assessment_defineProperty(_this, "callSaveTableContent", API.saveAssessments); + _this.dogMixin = new DogTableMixinPage(_this); + return _this; + } + assessment_inherits(PageDogAssessment, _TableBasePage); + return assessment_createClass(PageDogAssessment, [{ + key: "initialize", + value: function initialize() { + this.sharedInitialize(); + } + }, { + key: "hookupFilters", + value: function hookupFilters() {} + }, { + 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) { + if (row == null) return; + /* + let inputTemperatureCelcius = row.querySelector('td.' + flagTemperatureCelcius + ' input'); + let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive); + */ + var jsonRow = {}; + jsonRow[attrIdAssessment] = row.getAttribute(attrIdAssessment); + return jsonRow; + } + }, { + key: "initialiseRowNew", + value: function initialiseRowNew(tbody, row) {} + }, { + key: "postInitialiseRowNewCallback", + value: function postInitialiseRowNewCallback(tbody) { + var newRows = tbody.querySelectorAll('tr.' + flagRowNew); + var newestRow = newRows[0]; + var clickableElementsSelector = ['td.' + flagWeather + ' div.' + flagWeather, ',td.' + flagLightingLevel + ' div.' + flagLightingLevel, ',td.' + flagLocation + ' div.' + flagLocation, ',td.' + flagUserHandler + ' div.' + flagUserHandler].join(''); + newestRow.querySelectorAll(clickableElementsSelector).forEach(function (clickableElement) { + clickableElement.click(); + }); + } + }, { + key: "hookupTableMain", + value: function hookupTableMain() { + assessment_superPropGet(PageDogAssessment, "hookupTableMain", this, 3)([]); + this.hookupTableAssessmentHeader(); + this.hookupTableDistractions(); + this.hookupTableAssessmentCommandModalityLinks(); + } + }, { + key: "hookupTableAssessmentHeader", + value: function hookupTableAssessmentHeader() { + this.hookupTableAssessmentFieldWeather(); + this.hookupTableAssessmentFieldLightingLevel(); + this.hookupTableAssessmentFieldTemperature(); + this.hookupTableAssessmentFieldLocation(); + this.hookupTableAssessmentFieldUserHandler(); + this.hookupTableAssessmentFieldNotes(); + } + }, { + key: "hookupTableAssessmentFieldWeather", + value: function hookupTableAssessmentFieldWeather() { + var fieldFlag = flagWeather; + var optionList = utils_Utils.getListFromDict(filterWeathers); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableAssessment + ' td.' + flagWeather; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableAssessmentFieldLightingLevel", + value: function hookupTableAssessmentFieldLightingLevel() { + var fieldFlag = flagLightingLevel; + var optionList = utils_Utils.getListFromDict(filterLightingLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableAssessment + ' td.' + flagLightingLevel; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableAssessmentFieldTemperature", + value: function hookupTableAssessmentFieldTemperature() { + this.hookupChangeHandlerTableCells(idTableAssessment + ' td.' + flagTemperatureCelcius + ' .' + flagTemperatureCelcius); + } + }, { + key: "hookupTableAssessmentFieldLocation", + value: function hookupTableAssessmentFieldLocation() { + var fieldFlag = flagLocation; + var optionList = utils_Utils.getListFromDict(filterLocations); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableAssessment + ' td.' + flagLocation; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableAssessmentFieldUserHandler", + value: function hookupTableAssessmentFieldUserHandler() { + var fieldFlag = flagUserHandler; + var optionList = utils_Utils.getListFromDict(filterUserHandlers); // .sort((a, b) => a[flagName].localeCompare(b[flagName])); + var cellSelector = idTableAssessment + ' td.' + flagUserHandler; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableAssessmentFieldNotes", + value: function hookupTableAssessmentFieldNotes() { + this.hookupChangeHandlerTableCells(idTableAssessment + ' td.' + flagNotes + ' .' + flagNotes); + } + }, { + key: "hookupTableDistractions", + value: function hookupTableDistractions() { + Events.initialiseEventHandler(idTableDistractions, flagInitialised, function (table) { + var selectorRowNew = idTableDistractions + ' tbody tr.' + flagRowNew; + var rowBlankTemp = document.querySelector(selectorRowNew); + utils_Utils.consoleLogIfNotProductionEnvironment("row blank temp: ", rowBlankTemp); + var countRows = document.querySelectorAll(idTableDistractions + ' > tbody > tr').length; + _rowBlankDistraction = rowBlankTemp.cloneNode(true); + document.querySelectorAll(selectorRowNew).forEach(function (row) { + row.remove(); + }); + _rowBlankDistraction.setAttribute(attrIdDistraction, -1 - countRows); + }); + this.hookupTableDistractionsFieldsDistractionType(); + this.hookupTableDistractionsFieldsIntensityLevelEmotional(); + this.hookupTableDistractionsFieldsIntensityLevelScent(); + this.hookupTableDistractionsFieldsIntensityLevelSight(); + this.hookupTableDistractionsFieldsIntensityLevelSound(); + this.hookupTableDistractionsFieldsIntensityLevelTouch(); + this.hookupTableDistractionsFieldsQuantity(); + this.hookupTableDistractionsFieldsProximityMetres(); + this.hookupTableDistractionsFieldsNotes(); + this.hookupTableDistractionsFieldsActive(); + } + }, { + key: "hookupTableDistractionsFieldsDistractionType", + value: function hookupTableDistractionsFieldsDistractionType() { + var fieldFlag = flagDistractionType; + var optionList = utils_Utils.getListFromDict(filterDistractionTypes); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableDistractions + ' td.' + flagDistractionType; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableDistractionsFieldsIntensityLevelEmotional", + value: function hookupTableDistractionsFieldsIntensityLevelEmotional() { + var fieldFlag = flagDistractionIntensityLevelEmotional; + var optionList = utils_Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelEmotional; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableDistractionsFieldsIntensityLevelScent", + value: function hookupTableDistractionsFieldsIntensityLevelScent() { + var fieldFlag = flagDistractionIntensityLevelScent; + var optionList = utils_Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelScent; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableDistractionsFieldsIntensityLevelSight", + value: function hookupTableDistractionsFieldsIntensityLevelSight() { + var fieldFlag = flagDistractionIntensityLevelSight; + var optionList = utils_Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelSight; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableDistractionsFieldsIntensityLevelSound", + value: function hookupTableDistractionsFieldsIntensityLevelSound() { + var fieldFlag = flagDistractionIntensityLevelSound; + var optionList = utils_Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelSound; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableDistractionsFieldsIntensityLevelTouch", + value: function hookupTableDistractionsFieldsIntensityLevelTouch() { + var fieldFlag = flagDistractionIntensityLevelTouch; + var optionList = utils_Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelTouch; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableDistractionsFieldsQuantity", + value: function hookupTableDistractionsFieldsQuantity() { + this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagQuantity + ' .' + flagQuantity); + } + }, { + key: "hookupTableDistractionsFieldsProximityMetres", + value: function hookupTableDistractionsFieldsProximityMetres() { + this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagProximityMetres + ' .' + flagProximityMetres); + } + }, { + key: "hookupTableDistractionsFieldsNotes", + value: function hookupTableDistractionsFieldsNotes() { + this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagNotes + ' .' + flagNotes); + } + }, { + key: "hookupTableDistractionsFieldsActive", + value: function hookupTableDistractionsFieldsActive() { + var _this2 = this; + this.hookupFieldsActive(flagDistraction, function (event, element) { + _this2.handleClickAddRowTableDistractions(event, element); + }); + } + }, { + key: "handleClickAddRowTableDistractions", + value: function handleClickAddRowTableDistractions(event, button) { + event.stopPropagation(); + _rowBlankDistraction.setAttribute(attrIdDistraction, -1 - _rowBlankDistraction.getAttribute(attrIdDistraction)); + var tbody = document.querySelector(idTableDistractions + ' tbody'); + if (tbody.classList.contains(flagIsCollapsed)) return; + var row = _rowBlankDistraction.cloneNode(true); + row.classList.remove(flagInitialised); + row.querySelectorAll('.' + flagInitialised).forEach(function (element) { + element.classList.remove(flagInitialised); + }); + var countRows = document.querySelectorAll(idTableDistractions + ' > tbody > tr').length; + row.setAttribute(attrIdDistraction, -1 - countRows); + tbody.prepend(row); + tbody.scrollTop = 0; + this.hookupTableDistractions(); + this.postInitialiseDistractionRowNewCallback(tbody); + } + }, { + key: "postInitialiseDistractionRowNewCallback", + value: function postInitialiseDistractionRowNewCallback(tbody) { + var newRows = tbody.querySelectorAll('tr.' + flagRowNew); + var newestRow = newRows[0]; + var clickableElementsSelector = ['td.' + flagDistractionType + ' div.' + flagDistractionType, ',td.' + flagDistractionIntensityLevelEmotional + ' div.' + flagDistractionIntensityLevelEmotional, ',td.' + flagDistractionIntensityLevelScent + ' div.' + flagDistractionIntensityLevelScent, ',td.' + flagDistractionIntensityLevelSight + ' div.' + flagDistractionIntensityLevelSight, ',td.' + flagDistractionIntensityLevelSound + ' div.' + flagDistractionIntensityLevelSound, ',td.' + flagDistractionIntensityLevelTouch + ' div.' + flagDistractionIntensityLevelTouch].join(''); + newestRow.querySelectorAll(clickableElementsSelector).forEach(function (clickableElement) { + clickableElement.click(); + }); + } + }, { + key: "hookupTableAssessmentCommandModalityLinks", + value: function hookupTableAssessmentCommandModalityLinks() { + Events.initialiseEventHandler(idTableAssessmentCommandModalityLinks, flagInitialised, function (table) { + var selectorRowNew = idTableAssessmentCommandModalityLinks + ' tbody tr.' + flagRowNew; + var rowBlankTemp = document.querySelector(selectorRowNew); + utils_Utils.consoleLogIfNotProductionEnvironment("row blank temp: ", rowBlankTemp); + var countRows = document.querySelectorAll(idTableAssessmentCommandModalityLinks + ' > tbody > tr').length; + _rowBlankAssessmentCommandModalityLink = rowBlankTemp.cloneNode(true); + document.querySelectorAll(selectorRowNew).forEach(function (row) { + row.remove(); + }); + _rowBlankAssessmentCommandModalityLink.setAttribute(attrIdAssessmentCommandModalityLink, -1 - countRows); + }); + this.hookupTableAssessmentCommandModalityLinksFieldsCommandCategory(); + this.hookupTableAssessmentCommandModalityLinksFieldsCommand(); + this.hookupTableAssessmentCommandModalityLinksFieldsCommandModality(); + this.hookupTableAssessmentCommandModalityLinksFieldsBribe(); + this.hookupTableAssessmentCommandModalityLinksFieldsDistanceFromHandler(); + this.hookupTableAssessmentCommandModalityLinksFieldsIsInHearingRangeOfHandler(); + this.hookupTableAssessmentCommandModalityLinksFieldsIsInScentRangeOfHandler(); + this.hookupTableAssessmentCommandModalityLinksFieldsIsInSightOfHandler(); + this.hookupTableAssessmentCommandModalityLinksFieldsIsOnLead(); + this.hookupTableAssessmentCommandModalityLinksFieldsTrialCount(); + this.hookupTableAssessmentCommandModalityLinksFieldsNotes(); + this.hookupTableAssessmentCommandModalityLinksFieldsResponses(); + this.hookupTableAssessmentCommandModalityLinksFieldsActive(); + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsCommandCategory", + value: function hookupTableAssessmentCommandModalityLinksFieldsCommandCategory() { + this.hookupFieldsCommandCategory(idTableAssessmentCommandModalityLinks); + /* + let fieldFlag = flagCommandCategory; + let optionList = Utils.getListFromDict(filterCommandCategories).sort((a, b) => a[flagName].localeCompare(b[flagName])); + let cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagCommandCategory; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + , (tdSelector) => { this.hookupTableAssessmentCommandModalityLinksDdlsCommandCategory(tdSelector); } + , (event, element) => { this.handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, element); } + ); + */ + } + /* + hookupTableAssessmentCommandModalityLinksDdlsCommandCategory(ddlSelector) { + this.hookupChangeHandlerTableCells(ddlSelector, (event, element) => { this.handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, element); }); + } + handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, ddlCategory) { + let row = DOM.getRowFromElement(ddlCategory); + let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory); + this.handleChangeNestedElementCellTable(event, ddlCategory); + let idCommandCategoryRowNew = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory); + if (idCommandCategoryRowOld == idCommandCategoryRowNew) return; + let divCommand = row.querySelector('td.' + flagCommand + ' div'); + if (divCommand) divCommand.dispatchEvent(new Event('click')); + let ddlCommand = row.querySelector('td.' + flagCommand + ' select.' + flagCommand); + ddlCommand.innerHTML = ''; + ddlCommand.appendChild(DOM.createOption(null)); + let optionJson, option; + let commandsInCategory = Utils.getListFromDict(filterCommands).filter(command => + ( + command[attrIdCommandCategory] == idCommandCategoryRowNew + || idCommandCategoryRowNew == 0 + ) + ); + let sortedCommands = commandsInCategory.sort((a, b) => a[flagName].localeCompare(b[flagName])); + sortedCommands.forEach((command) => { + optionJson = BusinessObjects.getOptionJsonFromObjectJson(command); + option = DOM.createOption(optionJson); + ddlCommand.appendChild(option); + }); + this.handleChangeNestedElementCellTable(event, ddlCommand); + } + */ + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsCommand", + value: function hookupTableAssessmentCommandModalityLinksFieldsCommand() { + this.hookupFieldsCommand(idTableAssessmentCommandModalityLinks); + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsCommandModality", + value: function hookupTableAssessmentCommandModalityLinksFieldsCommandModality() { + var fieldFlag = flagCommandModality; + var optionList = utils_Utils.getListFromDict(filterCommandModalities); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagCommandModality; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsBribe", + value: function hookupTableAssessmentCommandModalityLinksFieldsBribe() { + var fieldFlag = flagBribe; + var optionList = utils_Utils.getListFromDict(filterBribes); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagBribe; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsDistanceFromHandler", + value: function hookupTableAssessmentCommandModalityLinksFieldsDistanceFromHandler() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagDistanceFromHandler + ' .' + flagDistanceFromHandler); + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsIsInHearingRangeOfHandler", + value: function hookupTableAssessmentCommandModalityLinksFieldsIsInHearingRangeOfHandler() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInHearingRangeOfHandler + ' .' + flagIsInHearingRangeOfHandler); + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsIsInScentRangeOfHandler", + value: function hookupTableAssessmentCommandModalityLinksFieldsIsInScentRangeOfHandler() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInScentRangeOfHandler + ' .' + flagIsInScentRangeOfHandler); + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsIsInSightOfHandler", + value: function hookupTableAssessmentCommandModalityLinksFieldsIsInSightOfHandler() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInSightOfHandler + ' .' + flagIsInSightOfHandler); + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsIsOnLead", + value: function hookupTableAssessmentCommandModalityLinksFieldsIsOnLead() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsOnLead + ' .' + flagIsOnLead); + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsTrialCount", + value: function hookupTableAssessmentCommandModalityLinksFieldsTrialCount() { + // this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagTrialCount + ' .' + flagTrialCount); + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsNotes", + value: function hookupTableAssessmentCommandModalityLinksFieldsNotes() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' > tbody > tr > td.' + flagNotes + ' .' + flagNotes); + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsResponses", + value: function hookupTableAssessmentCommandModalityLinksFieldsResponses() { + var _this3 = this; + var eventType = "click"; + var selector = idTableAssessmentCommandModalityLinks + ' td.' + flagAssessmentResponse + ' div.' + flagAssessmentResponse; + var handler = function handler(event, element) { + var parentTd = DOM.getCellFromElement(element); + var responsesTable = document.createElement("table"); + responsesTable.id = idTableAssessmentResponses.replace("#", ""); + responsesTable.classList.add(flagTableMain, flagAssessmentResponse); + var head = document.createElement("thead"); + var headRow = document.createElement("tr"); + var thResponseQualityMetric = document.createElement("th"); + thResponseQualityMetric.classList.add(flagResponseQualityMetric); + thResponseQualityMetric.innerText = 'Response Quality Metric'; + headRow.appendChild(thResponseQualityMetric); + var thObedienceLevel = document.createElement("th"); + thObedienceLevel.classList.add(flagObedienceLevel); + thObedienceLevel.innerText = 'Obedience Level'; + headRow.appendChild(thObedienceLevel); + var thValueMeasured = document.createElement("th"); + thValueMeasured.classList.add(flagValueMeasured); + thValueMeasured.innerText = 'Value Measured'; + headRow.appendChild(thValueMeasured); + var thNotes = document.createElement("th"); + thNotes.classList.add(flagNotes); + thNotes.innerText = 'Notes'; + headRow.appendChild(thNotes); + var thActive = document.createElement("th"); + thActive.classList.add(flagActive); + var templateAddIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagAdd); + thActive.appendChild(templateAddIcon.cloneNode(true)); + headRow.appendChild(thActive); + head.appendChild(headRow); + responsesTable.appendChild(head); + var body = document.createElement("tbody"); + var assessmentCommandModalityLink = assessment[flagAssessmentCommandModalityLink]; + var responses = assessmentCommandModalityLink == null ? null : assessmentCommandModalityLink[flagAssessmentResponse]; + if (responses != null && responses.length > 0) { + for (var response in responses) { + var row = PageDogAssessment.createNewRowTableAssessmentResponses(response); + body.appendChild(row); + } + } + responsesTable.appendChild(body); + parentTd.innerHTML = responsesTable.outerHTML; + _this3.hookupTablesAssessmentResponses(); + }; + Events.hookupEventHandler(eventType, selector, handler); + this.hookupTablesAssessmentResponses(); + } + }, { + key: "hookupTablesAssessmentResponses", + value: function hookupTablesAssessmentResponses() { + this.hookupTableAssessmentResponsesFieldsResponseQualityMetric(); + this.hookupTableAssessmentResponsesFieldsObedienceLevel(); + this.hookupTableAssessmentResponsesFieldsValueMeasured(); + this.hookupTableAssessmentResponsesFieldsNotes(); + this.hookupTableAssessmentResponsesFieldsActive(); + } + }, { + key: "hookupTableAssessmentResponsesFieldsResponseQualityMetric", + value: function hookupTableAssessmentResponsesFieldsResponseQualityMetric() { + var fieldFlag = flagResponseQualityMetric; + var optionList = utils_Utils.getListFromDict(filterResponseQualityMetrics); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableAssessmentResponses + ' td.' + flagResponseQualityMetric; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableAssessmentResponsesFieldsObedienceLevel", + value: function hookupTableAssessmentResponsesFieldsObedienceLevel() { + var fieldFlag = flagObedienceLevel; + var optionList = utils_Utils.getListFromDict(filterObedienceLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + var cellSelector = idTableAssessmentResponses + ' td.' + flagObedienceLevel; + this.hookupTableCellDdlPreviews(fieldFlag, optionList, cellSelector); + } + }, { + key: "hookupTableAssessmentResponsesFieldsValueMeasured", + value: function hookupTableAssessmentResponsesFieldsValueMeasured() { + this.hookupChangeHandlerTableCells(idTableAssessmentResponses + ' td.' + flagValueMeasured + ' .' + flagValueMeasured); + } + }, { + key: "hookupTableAssessmentResponsesFieldsNotes", + value: function hookupTableAssessmentResponsesFieldsNotes() { + this.hookupChangeHandlerTableCells(idTableAssessmentResponses + ' td.' + flagNotes + ' .' + flagNotes); + } + }, { + key: "hookupTableAssessmentResponsesFieldsActive", + value: function hookupTableAssessmentResponsesFieldsActive() { + var _this4 = this; + this.hookupFieldsActive(flagAssessmentResponse, function (event, element) { + _this4.handleClickAddRowTableAssessmentResponses(event, element); + }); + } + }, { + key: "handleClickAddRowTableAssessmentResponses", + value: function handleClickAddRowTableAssessmentResponses(event, button) { + event.stopPropagation(); + var tableResponses = DOM.getClosestParent(button, "table"); + var tbody = tableResponses.querySelector(":scope > tbody"); + var row = PageDogAssessment.createNewRowTableAssessmentResponses(null); + if (tbody.classList.contains(flagIsCollapsed)) return; + row.classList.remove(flagInitialised); + row.querySelectorAll('.' + flagInitialised).forEach(function (element) { + element.classList.remove(flagInitialised); + }); + var countRows = document.querySelectorAll(attrIdAssessmentResponse + ' > tbody > tr').length; + row.setAttribute(attrIdAssessmentResponse, -1 - countRows); + tbody.prepend(row); + tbody.scrollTop = 0; + this.hookupTablesAssessmentResponses(); + this.postInitialiseAssessmentResponseRowNewCallback(tbody); + } + }, { + key: "postInitialiseAssessmentResponseRowNewCallback", + value: function postInitialiseAssessmentResponseRowNewCallback(tbody) { + var newRows = tbody.querySelectorAll('tr.' + flagRowNew); + var newestRow = newRows[0]; + var clickableElementsSelector = ['td.' + flagResponseQualityMetric + ' div.' + flagResponseQualityMetric, ',td.' + flagObedienceLevel + ' div.' + flagObedienceLevel, ',td.' + flagValueMeasured + ' div.' + flagValueMeasured, ',td.' + flagNotes + ' div.' + flagNotes].join(''); + newestRow.querySelectorAll(clickableElementsSelector).forEach(function (clickableElement) { + clickableElement.click(); + }); + var countActiveRows = tbody.querySelectorAll('td.' + flagActive + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagDelete).length; + /* + newRows.filter(row => { + let activeButton = row.querySelector('td.' + flagActive + ' .' + flagButton + '.' + flagIcon + '.' + flagActive); + return activeButton.classList.contains(flagDelete); + }).length; + */ + var rowAssessmentCommandModalityLink = DOM.getRowFromElement(tbody); + var divTrialCount = rowAssessmentCommandModalityLink.querySelector('td.' + flagTrialCount + ' div.' + flagTrialCount); + divTrialCount.innerText = countActiveRows; + } + }, { + key: "hookupTableAssessmentCommandModalityLinksFieldsActive", + value: function hookupTableAssessmentCommandModalityLinksFieldsActive() { + var _this5 = this; + this.hookupFieldsActive(flagAssessmentCommandModalityLink, function (event, element) { + _this5.handleClickAddRowTableAssessmentCommandModalityLinks(event, element); + }); + } + }, { + key: "handleClickAddRowTableAssessmentCommandModalityLinks", + value: function handleClickAddRowTableAssessmentCommandModalityLinks(event, button) { + event.stopPropagation(); + _rowBlankAssessmentCommandModalityLink.setAttribute(attrIdAssessmentCommandModalityLink, -1 - _rowBlankAssessmentCommandModalityLink.getAttribute(attrIdAssessmentCommandModalityLink)); + var tbody = document.querySelector(idTableAssessmentCommandModalityLinks + ' tbody'); + if (tbody.classList.contains(flagIsCollapsed)) return; + var row = _rowBlankAssessmentCommandModalityLink.cloneNode(true); + row.classList.remove(flagInitialised); + row.querySelectorAll('.' + flagInitialised).forEach(function (element) { + element.classList.remove(flagInitialised); + }); + var countRows = document.querySelectorAll(idTableAssessmentCommandModalityLinks + ' > tbody > tr').length; + row.setAttribute(attrIdAssessmentCommandModalityLink, -1 - countRows); + tbody.prepend(row); + tbody.scrollTop = 0; + this.hookupTableAssessmentCommandModalityLinks(); + this.postInitialiseAssessmentCommandModalityLinkRowNewCallback(tbody); + } + }, { + key: "postInitialiseAssessmentCommandModalityLinkRowNewCallback", + value: function postInitialiseAssessmentCommandModalityLinkRowNewCallback(tbody) { + var newRows = tbody.querySelectorAll('tr.' + flagRowNew); + var newestRow = newRows[0]; + var clickableElementsSelector = ['td.' + flagCommandCategory + ' div.' + flagCommandCategory, ',td.' + flagCommand + ' div.' + flagCommand, ',td.' + flagCommandModality + ' div.' + flagCommandModality, ',td.' + flagBribe + ' div.' + flagBribe].join(''); + newestRow.querySelectorAll(clickableElementsSelector).forEach(function (clickableElement) { + clickableElement.click(); + }); + } + }, { + key: "leave", + value: function leave() { + assessment_superPropGet(PageDogAssessment, "leave", this, 3)([]); + } + }], [{ + key: "createNewRowTableAssessmentResponses", + value: function createNewRowTableAssessmentResponses(response) { + if (response == null) response = assessment_defineProperty(assessment_defineProperty(assessment_defineProperty(assessment_defineProperty(assessment_defineProperty(assessment_defineProperty({}, attrIdAssessmentResponse, null), flagResponseQualityMetric, 0), flagObedienceLevel, 0), flagValueMeasured, ''), flagNotes, ''), flagActive, true); + var isNew = response[attrIdAssessmentResponse] == null || response[attrIdAssessmentResponse] < 1; + var row = document.createElement("tr"); + row.classList.add(flagAssessmentResponse); + if (isNew) row.classList.add(flagRowNew); + row.setAttribute(attrIdAssessmentResponse, response[attrIdAssessmentResponse]); + var tdResponseQualityMetric = document.createElement("td"); + tdResponseQualityMetric.classList.add(flagResponseQualityMetric, flagDdlPreview); + var divResponseQualityMetric = document.createElement("div"); + divResponseQualityMetric.classList.add(flagResponseQualityMetric); + DOM.setElementAttributesValuesCurrentAndPrevious(divResponseQualityMetric, response[flagResponseQualityMetric]); + divResponseQualityMetric.innerText = response[flagResponseQualityMetric]; + tdResponseQualityMetric.appendChild(divResponseQualityMetric); + row.appendChild(tdResponseQualityMetric); + var tdObedienceLevel = document.createElement("td"); + tdObedienceLevel.classList.add(flagObedienceLevel, flagDdlPreview); + var divObedienceLevel = document.createElement("div"); + divObedienceLevel.classList.add(flagObedienceLevel); + DOM.setElementAttributesValuesCurrentAndPrevious(divObedienceLevel, response[flagObedienceLevel]); + divObedienceLevel.innerText = response[flagObedienceLevel]; + tdObedienceLevel.appendChild(divObedienceLevel); + row.appendChild(tdObedienceLevel); + var tdValueMeasured = document.createElement("td"); + tdValueMeasured.classList.add(flagValueMeasured, flagDdlPreview); + var inputValueMeasured = document.createElement("input"); + inputValueMeasured.type = "number"; + inputValueMeasured.classList.add(flagValueMeasured); + DOM.setElementAttributesValuesCurrentAndPrevious(inputValueMeasured, response[flagValueMeasured]); + inputValueMeasured.value = response[flagValueMeasured]; + tdValueMeasured.appendChild(inputValueMeasured); + row.appendChild(tdValueMeasured); + var tdNotes = document.createElement("td"); + tdNotes.classList.add(flagNotes, flagDdlPreview); + var inputNotes = document.createElement("textarea"); + inputNotes.classList.add(flagNotes); + DOM.setElementAttributesValuesCurrentAndPrevious(inputNotes, response[flagNotes]); + inputNotes.value = response[flagNotes]; + tdNotes.appendChild(inputNotes); + row.appendChild(tdNotes); + var tdActive = document.createElement("td"); + tdActive.classList.add(flagActive, flagDdlPreview); + var templateAddIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagAdd); + var templateDeleteIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagDelete); + var buttonActive = response[flagActive] ? templateDeleteIcon.cloneNode(true) : templateAddIcon.cloneNode(true); + tdActive.appendChild(buttonActive); + row.appendChild(tdActive); + return row; + } + }]); +}(TableBasePage); +assessment_defineProperty(PageDogAssessment, "hash", hashPageDogAssessment); +assessment_defineProperty(PageDogAssessment, "attrIdRowObject", attrIdAssessment); + +;// ./static/js/pages/dog/assessments.js +function assessments_typeof(o) { "@babel/helpers - typeof"; return assessments_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; }, assessments_typeof(o); } +function assessments_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function assessments_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, assessments_toPropertyKey(o.key), o); } } +function assessments_createClass(e, r, t) { return r && assessments_defineProperties(e.prototype, r), t && assessments_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function assessments_callSuper(t, o, e) { return o = assessments_getPrototypeOf(o), assessments_possibleConstructorReturn(t, assessments_isNativeReflectConstruct() ? Reflect.construct(o, e || [], assessments_getPrototypeOf(t).constructor) : o.apply(t, e)); } +function assessments_possibleConstructorReturn(t, e) { if (e && ("object" == assessments_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return assessments_assertThisInitialized(t); } +function assessments_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function assessments_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (assessments_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function assessments_superPropGet(t, o, e, r) { var p = assessments_get(assessments_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } +function assessments_get() { return assessments_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = assessments_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, assessments_get.apply(null, arguments); } +function assessments_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = assessments_getPrototypeOf(t));); return t; } +function assessments_getPrototypeOf(t) { return assessments_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, assessments_getPrototypeOf(t); } +function assessments_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 && assessments_setPrototypeOf(t, e); } +function assessments_setPrototypeOf(t, e) { return assessments_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, assessments_setPrototypeOf(t, e); } +function assessments_defineProperty(e, r, t) { return (r = assessments_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function assessments_toPropertyKey(t) { var i = assessments_toPrimitive(t, "string"); return "symbol" == assessments_typeof(i) ? i : i + ""; } +function assessments_toPrimitive(t, r) { if ("object" != assessments_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != assessments_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + + + + + + + + +var PageDogAssessments = /*#__PURE__*/function (_TableBasePage) { + function PageDogAssessments(router) { + var _this; + assessments_classCallCheck(this, PageDogAssessments); + _this = assessments_callSuper(this, PageDogAssessments, [router]); + assessments_defineProperty(_this, "callSaveTableContent", API.saveAssessments); + _this.dogMixin = new DogTableMixinPage(_this); + return _this; + } + assessments_inherits(PageDogAssessments, _TableBasePage); + return assessments_createClass(PageDogAssessments, [{ + key: "initialize", + value: function initialize() { + this.sharedInitialize(); + } + }, { + key: "hookupFilters", + value: function hookupFilters() { + this.sharedHookupFilters(); + this.hookupFilterWeather(); + this.hookupFilterLightingLevel(); + this.hookupFilterLocation(); + this.hookupFilterHandler(); + this.hookupFilterActive(); + } + }, { + key: "hookupFilterWeather", + value: function hookupFilterWeather() { + this.hookupFilter(attrIdWeather); + } + }, { + key: "hookupFilterLightingLevel", + value: function hookupFilterLightingLevel() { + this.hookupFilter(attrIdLightingLevel); + } + }, { + key: "hookupFilterHandler", + value: function hookupFilterHandler() { + this.hookupFilter(flagUserHandler); + } + }, { + 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) { + if (row == null) return; + var inputTemperatureCelcius = row.querySelector('td.' + flagTemperatureCelcius + ' input'); + var inputNotes = row.querySelector('td.' + flagNotes + ' textarea'); + var buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive); + var jsonRow = {}; + jsonRow[attrIdAssessment] = row.getAttribute(attrIdAssessment); + jsonRow[attrIdWeather] = this.getIdWeatherRow(row); + jsonRow[attrIdLightingLevel] = this.getIdLightingLevelRow(row); + jsonRow[flagTemperatureCelcius] = DOM.getElementAttributeValueCurrent(inputTemperatureCelcius); + jsonRow[attrIdLocation] = this.getIdLocationRow(row); + jsonRow[flagUserHandler] = this.getIdUserHandlerRow(row); + jsonRow[flagNotes] = DOM.getElementAttributeValueCurrent(inputNotes); + jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); + return jsonRow; + } + }, { + key: "getIdWeatherRow", + value: function getIdWeatherRow(tr) { + var elementWeather = tr.querySelector('td.' + flagWeather + ' .' + flagWeather); + return DOM.getElementAttributeValueCurrent(elementWeather); + } + }, { + key: "getIdLightingLevelRow", + value: function getIdLightingLevelRow(tr) { + var elementLightingLevel = tr.querySelector('td.' + flagLightingLevel + ' .' + flagLightingLevel); + return DOM.getElementAttributeValueCurrent(elementLightingLevel); + } + }, { + key: "getIdLocationRow", + value: function getIdLocationRow(tr) { + var elementLocation = tr.querySelector('td.' + flagLocation + ' .' + flagLocation); + return DOM.getElementAttributeValueCurrent(elementLocation); + } + }, { + key: "getIdUserHandlerRow", + value: function getIdUserHandlerRow(tr) { + var elementUserHandler = tr.querySelector('td.' + flagUserHandler + ' .' + flagUserHandler); + return DOM.getElementAttributeValueCurrent(elementUserHandler); + } + }, { + key: "initialiseRowNew", + value: function initialiseRowNew(tbody, row) {} + }, { + key: "postInitialiseRowNewCallback", + value: function postInitialiseRowNewCallback(tbody) { + var newRows = tbody.querySelectorAll('tr.' + flagRowNew); + var newestRow = newRows[0]; + var clickableElementsSelector = ['td.' + flagWeather + ' div.' + flagWeather, ',td.' + flagLightingLevel + ' div.' + flagLightingLevel, ',td.' + flagLocation + ' div.' + flagLocation, ',td.' + flagUserHandler + ' div.' + flagUserHandler].join(''); + newestRow.querySelectorAll(clickableElementsSelector).forEach(function (clickableElement) { + clickableElement.click(); + }); + } + }, { + key: "hookupTableMain", + value: function hookupTableMain() { + assessments_superPropGet(PageDogAssessments, "hookupTableMain", this, 3)([]); + this.hookupFieldsDetail(); + this.hookupFieldsWeather(); + this.hookupFieldsLightingLevel(); + this.hookupFieldsTemperature(); + this.dogMixin.hookupFieldsLocation(); + this.hookupFieldsHandler(); + this.hookupFieldsNotesTable(); + this.hookupFieldsActive(); + } + }, { + key: "hookupFieldsDetail", + value: function hookupFieldsDetail() { + var _this2 = this; + Events.hookupEventHandler("click" // eventType + , idTableMain + ' td.' + flagDetail + ' button.' + flagDetail // selector + , function (event, element) { + var parentTr = DOM.getRowFromElement(element); + var idAssessment = parentTr.getAttribute(attrIdAssessment); + /* + console.log("click detail"); + console.log({ element, parentTr, idAssessment }); + const data = {}; + const params = { + [attrIdAssessment]: idAssessment + }; + API.request( + hashPageDogAssessment // hashEndpoint + , 'GET' // method + , data + , params + ); + */ + + var formFilters = TableBasePage.getFormFilters(); + var filtersJson = DOM.convertForm2JSON(formFilters); + filtersJson[attrIdAssessment] = idAssessment; + utils_Utils.consoleLogIfNotProductionEnvironment("hookupFieldsDetail"); + utils_Utils.consoleLogIfNotProductionEnvironment("formFilters"); + utils_Utils.consoleLogIfNotProductionEnvironment(formFilters); + utils_Utils.consoleLogIfNotProductionEnvironment("filtersJson"); + utils_Utils.consoleLogIfNotProductionEnvironment(filtersJson); + _this2.leave(); + API.goToHash(hashPageDogAssessment, filtersJson); + }); + } + }, { + key: "hookupFieldsWeather", + value: function hookupFieldsWeather() { + this.hookupTableCellDdlPreviews(flagWeather, utils_Utils.getListFromDict(filterWeathers) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + ); + } + }, { + key: "hookupFieldsLightingLevel", + value: function hookupFieldsLightingLevel() { + this.hookupTableCellDdlPreviews(flagLightingLevel, utils_Utils.getListFromDict(filterLightingLevels) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + ); + } + }, { + key: "hookupFieldsTemperature", + value: function hookupFieldsTemperature() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagTemperatureCelcius + ' input.' + flagTemperatureCelcius); + } + }, { + key: "hookupFieldsHandler", + value: function hookupFieldsHandler() { + this.hookupTableCellDdlPreviews(flagUserHandler, utils_Utils.getListFromDict(filterUserHandlers) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + ); + } + }, { + key: "leave", + value: function leave() { + assessments_superPropGet(PageDogAssessments, "leave", this, 3)([]); + } + }]); +}(TableBasePage); +assessments_defineProperty(PageDogAssessments, "hash", hashPageDogAssessments); +assessments_defineProperty(PageDogAssessments, "attrIdRowObject", attrIdAssessment); + ;// ./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"); } @@ -3495,6 +4305,8 @@ function router_toPrimitive(t, r) { if ("object" != router_typeof(t) || !t) retu + + // Legal @@ -3550,6 +4362,14 @@ var Router = /*#__PURE__*/function () { name: 'PageDogCommandButtonLinks', module: PageDogCommandButtonLinks }; + this.pages[hashPageDogAssessment] = { + name: 'PageDogAssessment', + module: PageDogAssessment + }; + this.pages[hashPageDogAssessments] = { + name: 'PageDogAssessments', + module: PageDogAssessments + }; // Legal this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', @@ -3608,6 +4428,14 @@ var Router = /*#__PURE__*/function () { var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; return _this.navigateToHash(hashPageDogCommandButtonLinks, isPopState); }; + this.routes[hashPageDogAssessment] = function () { + var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + return _this.navigateToHash(hashPageDogAssessment, isPopState); + }; + this.routes[hashPageDogAssessments] = function () { + var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + return _this.navigateToHash(hashPageDogAssessments, isPopState); + }; // Legal this.routes[hashPageAccessibilityStatement] = function () { var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; diff --git a/static/dist/js/main.bundle.js.map b/static/dist/js/main.bundle.js.map index abf0766..b866df6 100644 --- a/static/dist/js/main.bundle.js.map +++ b/static/dist/js/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"js/main.bundle.js","mappings":"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","sources":["webpack://app/./static/js/lib/validation.js","webpack://app/./static/js/dom.js","webpack://app/./static/js/lib/events.js","webpack://app/./static/js/lib/local_storage.js","webpack://app/./static/js/api.js","webpack://app/./static/js/lib/utils.js","webpack://app/./static/js/components/common/temporary/overlay_confirm.js","webpack://app/./static/js/pages/base.js","webpack://app/./static/js/pages/core/home.js","webpack://app/./static/js/pages/dog/home.js","webpack://app/./static/js/lib/business_objects/business_objects.js","webpack://app/./static/js/components/common/temporary/overlay_error.js","webpack://app/./static/js/pages/base_table.js","webpack://app/./static/js/pages/dog/mixin.js","webpack://app/./static/js/pages/dog/mixin_table.js","webpack://app/./static/js/pages/dog/command_categories.js","webpack://app/./static/js/pages/dog/commands.js","webpack://app/./static/js/pages/dog/dog_command_links.js","webpack://app/./static/js/pages/dog/locations.js","webpack://app/./static/js/pages/dog/button_icons.js","webpack://app/./static/js/pages/dog/command_button_links.js","webpack://app/./static/js/pages/legal/accessibility_report.js","webpack://app/./static/js/pages/legal/accessibility_statement.js","webpack://app/./static/js/pages/legal/license.js","webpack://app/./static/js/pages/legal/privacy_policy.js","webpack://app/./static/js/pages/legal/retention_schedule.js","webpack://app/./static/js/router.js","webpack://app/./static/js/app.js","webpack://app/./static/css/main.css?0a91","webpack://app/./static/css/components/button.css?0e0b","webpack://app/./static/css/components/card.css","webpack://app/./static/css/components/dialog.css","webpack://app/./static/css/components/form.css?94e1","webpack://app/./static/css/components/image.css?9f9c","webpack://app/./static/css/components/label.css?b78f","webpack://app/./static/css/components/modal.css","webpack://app/./static/css/components/navigation.css","webpack://app/./static/css/components/overlay.css?6dfd","webpack://app/./static/css/components/table.css?e553","webpack://app/./static/css/layouts/header.css?da75","webpack://app/./static/css/layouts/footer.css?65e3","webpack://app/./static/css/layouts/table-main.css?8c15","webpack://app/./static/css/lib/reset.css","webpack://app/./static/css/lib/typography.css","webpack://app/./static/css/lib/utils.css?0479","webpack://app/./static/css/lib/variables.css","webpack://app/./static/css/themes/light.css?855e"],"sourcesContent":["\nexport default class Validation {\n /*\n isNullOrWhitespace(v) {\n let txt = JSON.stringify(v).replace('/\\s\\g', '');\n return (txt == '' || 'null');\n }\n */\n\n static isEmpty(object) {\n\n let isEmpty = true;\n\n if (object !== null && object !== \"null\" && object !== undefined && object !== \"undefined\") {\n\n if (object.length == undefined) {\n isEmpty = false; // object exists but isn't a collection\n }\n else if (typeof object === \"function\") {\n isEmpty = false; // object is reference\n }\n else { // string or collection\n\n let isString = (typeof object == \"string\");\n\n if (isString) object = object.trim();\n\n if (object.length > 0) {\n\n if (isString) {\n isEmpty = false; // String greater than length 0\n }\n else {\n\n if (typeof object[0] != \"string\") {\n isEmpty = false;\n }\n else {\n for(let i = 0; i < object.length; i++) {\n if (object[i] != \"\") {\n isEmpty = false;\n break\n }\n }\n }\n }\n }\n }\n }\n\n return isEmpty;\n }\n\n static isValidNumber(value, positiveOnly) {\n return !Validation.isEmpty(value) && !isNaN(value) && (!positiveOnly || parseFloat(value) > 0);\n }\n\n static getDataContentType(params) {\n\n var data = null;\n var contentType = '';\n\n if (!Validation.isEmpty(params)) {\n\n if (typeof params === \"string\") {\n data = params;\n contentType = \"application/x-www-form-urlencoded; charset=UTF-8\";\n }\n else {\n data = JSON.stringify(params);\n contentType = \"application/json; charset=UTF-8\";\n }\n }\n\n return { Data: data, ContentType: contentType };\n }\n\n static arrayContainsItem(array, itemValue) {\n\n var hasItem = false;\n\n if (!Validation.isEmpty(array) && !Validation.isEmpty(itemValue)) {\n\n var isJQueryElementArray = array[0] instanceof jQuery;\n\n if (isJQueryElementArray) {\n\n for (let i = 0; i < array.length; i++) {\n\n if (document.querySelectorAll(array[i]).is(itemValue)) {\n hasItem = true;\n break;\n }\n }\n }\n else {\n\n var isDate = array[0] instanceof Date;\n\n if (isDate) {\n \n for (let i = 0; i < array.length; i++) {\n\n if (array[i].getTime() === itemValue.getTime()) {\n hasItem = true;\n break;\n }\n }\n }\n else {\n\n for (let i = 0; i < array.length; i++) {\n\n if (array[i] == itemValue) {\n hasItem = true;\n break;\n }\n }\n }\n }\n }\n\n return hasItem;\n }\n\n static dictHasKey(d, k) {\n return (k in d);\n }\n static areEqualDicts(dict1, dict2) {\n const keys1 = Object.keys(dict1);\n const keys2 = Object.keys(dict2);\n \n if (keys1.length !== keys2.length) {\n return false;\n }\n \n for (let key of keys1) {\n if (dict1[key] !== dict2[key]) {\n return false;\n }\n }\n \n return true;\n }\n\n static imageExists(url, callback) {\n\n var img = new Image();\n\n img.onload = function() { callback(true); };\n img.onerror = function() { callback(false); };\n img.src = url;\n }\n\n static toFixedOrDefault(value, decimalPlaces, defaultValue = null) {\n return Validation.isValidNumber(value) ? parseFloat(value).toFixed(decimalPlaces) : defaultValue;\n }\n}\n","\nimport Utils from \"./lib/utils.js\";\nimport Validation from \"./lib/validation.js\";\n\nexport default class DOM {\n static setElementAttributesValuesCurrentAndPrevious(element, data) {\n DOM.setElementAttributeValueCurrent(element, data);\n DOM.setElementAttributeValuePrevious(element, data);\n }\n static setElementAttributeValueCurrent(element, data) {\n element.setAttribute(attrValueCurrent, data);\n }\n static setElementAttributeValuePrevious(element, data) {\n element.setAttribute(attrValuePrevious, data);\n }\n static setElementValuesCurrentAndPrevious(element, data) {\n DOM.setElementValueCurrent(element, data);\n DOM.setElementAttributeValuePrevious(element, data);\n }\n static setElementValueCurrent(element, data) {\n DOM.setElementAttributeValueCurrent(element, data);\n let tagName = element.tagName.toUpperCase();\n if (element.type === \"checkbox\") {\n element.checked = data;\n }\n else if (tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT') {\n element.value = data;\n }\n else {\n element.textContent = data;\n }\n }\n static setElementValueCurrentIfEmpty(element, data) {\n if (Validation.isEmpty(DOM.getElementValueCurrent(element))) {\n DOM.setElementValueCurrent(element, data);\n }\n }\n static getCellFromElement(element) {\n return element.closest('td');\n }\n static getRowFromElement(element, flagRow) {\n let selector = Validation.isEmpty(flagRow) ? 'tr' : 'tr.' + flagRow;\n return element.closest(selector);\n }\n static getClosestParent(element, parentSelector) {\n let parent = element.parentElement;\n while (parent) {\n if (parent.matches(parentSelector)) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return null;\n }\n static convertForm2JSON(elementForm) {\n let dataForm = {};\n if (Validation.isEmpty(elementForm)) {\n return dataForm;\n }\n let containersFilter = elementForm.querySelectorAll('.' + flagContainerInput + '.' + flagFilter);\n let containerFilter, labelFilter, keyFilter, filter;\n for (let indexFilter = 0; indexFilter < containersFilter.length; indexFilter++) {\n containerFilter = containersFilter[indexFilter];\n labelFilter = containerFilter.querySelector('label');\n keyFilter = labelFilter.getAttribute('for');\n filter = containerFilter.querySelector(`#${keyFilter}`);\n dataForm[keyFilter] = DOM.getElementValueCurrent(filter);\n }\n return dataForm;\n }\n static loadPageBody(contentNew) {\n let pageBody = document.querySelector(idPageBody);\n pageBody.innerHTML = contentNew;\n }\n static getHashPageCurrent() {\n const hashPageCurrent = document.body.dataset.page;\n return hashPageCurrent;\n }\n static updateAndCheckIsElementDirty(element) {\n element.setAttribute(attrValueCurrent, DOM.getElementValueCurrent(element));\n return DOM.isElementDirty(element);\n }\n static isElementDirty(element) {\n let isDirty = element.getAttribute(attrValuePrevious) != element.getAttribute(attrValueCurrent);\n DOM.handleDirtyElement(element, isDirty);\n return isDirty;\n }\n static handleDirtyElement(element, isDirty) {\n DOM.toggleElementHasClassnameFlag(element, isDirty, flagDirty);\n }\n static toggleElementHasClassnameFlag(element, elementHasFlag, flag) {\n let elementAlreadyHasFlag = element.classList.contains(flag);\n if (elementHasFlag == elementAlreadyHasFlag) return;\n if (elementHasFlag) {\n element.classList.add(flag);\n } else {\n element.classList.remove(flag);\n }\n }\n static hasDirtyChildrenContainer(container) {\n if (container == null) return false;\n return container.querySelector('.' + flagDirty) != null;\n }\n static hasDirtyChildrenNotDeletedContainer(container) {\n if (container == null || container.classList.contains(flagDelete)) return false;\n return container.querySelector('.' + flagDirty + ':not(.' + flagDelete + ', .' + flagDelete + ' *)') != null;\n }\n static getElementValueCurrent(element) {\n let returnVal = '';\n \n if (!Validation.isEmpty(element)) {\n \n let tagName = element.tagName.toUpperCase();\n if (element.type === \"checkbox\") {\n returnVal = element.checked;\n }\n /*\n else if (element.classList.contains(flagIsDatePicker)) {\n returnVal = getDatePickerDate(element, adjust4DayLightSavings);\n }\n */\n else if (tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT') {\n returnVal = element.value;\n }\n else if (element.classList.contains(flagButton) && element.classList.contains(flagActive)) { // tagName === 'BUTTON'\n returnVal = element.classList.contains(flagDelete);\n }\n else if (tagName === 'TD') {\n returnVal = DOM.getElementAttributeValueCurrent(element);\n }\n else if (tagName == 'SVG' && element.classList.contains(flagCheckbox)) {\n returnVal = (element.classList.contains(flagIsChecked))\n }\n else {\n returnVal = element.textContent;\n }\n }\n \n if (Validation.isEmpty(returnVal)) returnVal = '';\n \n return returnVal;\n }\n static getElementAttributeValueCurrent(element) {\n // debugger;\n if (Validation.isEmpty(element)) return null;\n return element.getAttribute(attrValueCurrent);\n }\n static getElementAttributeValuePrevious(element) {\n if (Validation.isEmpty(element)) return null;\n return element.getAttribute(attrValuePrevious);\n }\n /* base_table.handleChangeElementCellTable\n static updateAndCheckIsTableElementDirty(element) {\n let wasDirty = DOM.isElementDirty(element);\n let row = DOM.getRowFromElement(element);\n let wasDirtyRow = DOM.hasDirtyChildrenNotDeletedContainer(row);\n let isDirty = DOM.updateAndCheckIsElementDirty(element);\n let cell = DOM.getCellFromElement(element);\n Utils.consoleLogIfNotProductionEnvironment({element, row, cell, isDirty, wasDirty});\n if (isDirty != wasDirty) {\n DOM.handleDirtyElement(cell, isDirty);\n let isDirtyRow = DOM.hasDirtyChildrenNotDeletedContainer(row);\n Utils.consoleLogIfNotProductionEnvironment({isDirtyRow, wasDirtyRow});\n if (isDirtyRow != wasDirtyRow) {\n DOM.handleDirtyElement(row, isDirtyRow);\n }\n }\n }\n */\n static scrollToElement(parent, element) {\n // REQUIRED: parent has scroll-bar\n parent.scrollTop(parent.scrollTop() + (element.offset().top - parent.offset().top));\n }\n static isElementInContainer(container, element) {\n\n if (typeof jQuery === 'function') {\n if (container instanceof jQuery) container = container[0];\n if (element instanceof jQuery) element = element[0];\n }\n\n var containerBounds = container.getBoundingClientRect();\n var elementBounds = element.getBoundingClientRect();\n\n return (\n containerBounds.top <= elementBounds.top &&\n containerBounds.left <= elementBounds.left &&\n ((elementBounds.top + elementBounds.height) <= (containerBounds.top + containerBounds.height)) &&\n ((elementBounds.left + elementBounds.width) <= (containerBounds.left + containerBounds.width))\n );\n }\n static alertError(errorType, errorText) {\n alert(errorType + '\\n' + errorText);\n }\n static createOptionUnselectedProductVariation() {\n return {\n [flagProductVariationType]: {\n [flagNameAttrOptionText]: [flagName],\n [flagNameAttrOptionValue]: [attrIdProductVariationType],\n [flagName]: 'Select Variation Type',\n [attrIdProductVariationType]: 0,\n },\n [flagProductVariation]: {\n [flagNameAttrOptionText]: [flagName],\n [flagNameAttrOptionValue]: [attrIdProductVariation],\n [flagName]: 'Select Variation',\n [attrIdProductVariation]: 0,\n },\n };\n }\n static createOption(optionJson) {\n if (Validation.isEmpty(optionJson)) optionJson = {\n text: 'Select',\n value: 0,\n };\n let option = document.createElement('option');\n option.value = optionJson.value;\n option.textContent = optionJson.text;\n option.selected = optionJson.selected;\n return option;\n }\n\n static escapeHtml(text) {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n static unescapeHtml(html) {\n const div = document.createElement('div');\n div.innerHTML = html;\n return div.textContent || div.innerText || '';\n }\n}\n","\nexport default class Events {\n static initialiseEventHandler(selectorElement, classInitialised, eventHandler) {\n document.querySelectorAll(selectorElement).forEach(function(element) {\n if (element.classList.contains(classInitialised)) return;\n eventHandler(element);\n element.classList.add(classInitialised);\n });\n }\n}","\nimport Validation from \"./validation.js\";\n\nexport default class LocalStorage {\n/*\nfunction getPageLocalStorage(pageHash) {\n\n let ls;\n try {\n ls = JSON.parse(localStorage.getItem(pageHash));\n } catch {\n\n }\n\n if (Validation.isEmpty(ls)) return {}\n\n return ls;\n}\nfunction getPageLocalStorageCurrent() {\n\n return JSON.parse(localStorage.getItem(hashPageCurrent));\n}\n\nfunction setPageLocalStorage(pageHash, newLS) {\n\n localStorage.setItem(pageHash, JSON.stringify(newLS));\n}\n\nfunction clearPageLocalStorage(pageHash) {\n localStorage.removeItem(pageHash);\n}\n\nfunction setupPageLocalStorage(pageHash) {\n\n let ls = getPageLocalStorage(pageHash);\n\n if (Validation.isEmpty(ls)) ls = {};\n\n setPageLocalStorage(pageHash, ls);\n}\n*/\n\n static getLocalStorage(key) {\n return JSON.parse(localStorage.getItem(key));\n }\n\n static setLocalStorage(key, newLS) {\n localStorage.setItem(key, JSON.stringify(newLS));\n }\n\n/*\nfunction setupPageLocalStorageNext(pageHashNext) {\n let lsOld = getPageLocalStorage(hashPageCurrent);\n hashPageCurrent = pageHashNext;\n clearPageLocalStorage(hashPageCurrent);\n setupPageLocalStorage(hashPageCurrent);\n let lsNew = getPageLocalStorage(hashPageCurrent);\n lsNew[keyBasket] = (keyBasket in lsOld) ? lsOld[keyBasket] : {'items': []};\n setPageLocalStorage(hashPageCurrent, lsNew);\n}\n*/\n}","import DOM from './dom.js';\n\nexport default class API {\n \n static getCsrfToken() {\n return document.querySelector(idCSRFToken).getAttribute('content');\n }\n \n static async request(hashEndpoint, method = 'GET', data = null, params = null) {\n const url = API.getUrlFromHash(hashEndpoint, params);\n const csrfToken = API.getCsrfToken();\n const options = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n [flagCsrfToken]: csrfToken,\n }\n };\n\n if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {\n data = { \n ...data, \n [flagCsrfToken]: csrfToken,\n };\n options.body = JSON.stringify(data);\n }\n\n try {\n const response = await fetch(url, options);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return await response.json();\n } catch (error) {\n console.error('API request failed:', error);\n throw error;\n }\n }\n \n static getUrlFromHash(hash, params = null) {\n if (hash == null) hash = hashPageHome;\n let url = API.parameteriseUrl(_pathHost + hash, params);\n return url;\n }\n static parameteriseUrl(url, params) {\n if (params) {\n url += '?' + new URLSearchParams(params).toString();\n }\n return url;\n }\n static goToUrl(url) {\n window.location.href = url;\n }\n static goToHash(hash, params = null) {\n const url = API.getUrlFromHash(hash, params);\n API.goToUrl(url);\n }\n\n // specific api calls\n /* Example:\n getUsers: () => request('/users'),\n getUserById: (id) => request(`/users/${id}`),\n createUser: (userData) => request('/users', 'POST', userData),\n updateUser: (id, userData) => request(`/users/${id}`, 'PUT', userData),\n deleteUser: (id) => request(`/users/${id}`, 'DELETE'),\n */\n static async loginUser() {\n let callback = {};\n callback[flagCallback] = DOM.getHashPageCurrent();\n return await API.request(hashPageUserLogin, 'POST', callback);\n }\n\n // dog\n // Command categories\n static async saveCommandCategories(commandCategories, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagCommandCategory] = commandCategories;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogCommandCategory, 'POST', dataRequest);\n }\n \n // Commands\n static async saveCommands(commands, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagCommand] = commands;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogCommand, 'POST', dataRequest);\n }\n \n // Dog Command Links\n static async saveDogCommandLinks(dogCommandLinks, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagDogCommandLink] = dogCommandLinks;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogDogCommandLink, 'POST', dataRequest);\n }\n \n // Locations\n static async saveLocations(locations, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagLocation] = locations;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogLocation, 'POST', dataRequest);\n }\n \n // Button Icons\n static async saveButtonIcons(buttonIcons, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagButtonIcon] = buttonIcons;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogButtonIcon, 'POST', dataRequest);\n }\n \n // Command Button Links\n static async saveCommandButtonLinks(links, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagCommandButtonLink] = links;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogCommandButtonLink, 'POST', dataRequest);\n }\n \n}\n","// Utility functions\n/*\nfunction $(selector) {\n return document.querySelector(selector);\n}\n\nfunction $$(selector) {\n return document.querySelectorAll(selector);\n}\n*/\nexport default class Utils {\n static getListFromDict(dict) {\n let list = [];\n for (let key in dict) {\n list.push(dict[key]);\n }\n return list;\n }\n static consoleLogIfNotProductionEnvironment(message) {\n if (environment.is_production != \"true\") {\n console.log(message);\n }\n }\n}","\nimport Events from \"../../../lib/events.js\";\n\nexport default class OverlayConfirm {\n static hookup(callbackSuccess) {\n Events.initialiseEventHandler(idOverlayConfirm + ' button.' + flagCancel, flagInitialised, (buttonCancel) => {\n buttonCancel.addEventListener('click', () => {\n let overlay = document.querySelector(idOverlayConfirm);\n overlay.style.visibility = 'hidden';\n });\n });\n Events.initialiseEventHandler(idOverlayConfirm + ' button.' + flagSubmit, flagInitialised, (buttonConfirm) => {\n buttonConfirm.addEventListener('click', () => {\n let overlay = document.querySelector(idOverlayConfirm);\n let textarea = overlay.querySelector('textarea');\n overlay.style.visibility = 'hidden';\n callbackSuccess(textarea.value);\n });\n });\n }\n static show() {\n let overlay = document.querySelector(idOverlayConfirm);\n overlay.classList.remove(flagIsCollapsed);\n overlay.style.visibility = 'visible';\n }\n}","\nimport BusinessObjects from \"../lib/business_objects/business_objects.js\";\nimport Events from \"../lib/events.js\";\nimport LocalStorage from \"../lib/local_storage.js\";\nimport API from \"../api.js\";\nimport DOM from \"../dom.js\";\nimport Utils from \"../lib/utils.js\";\n\nimport OverlayConfirm from \"../components/common/temporary/overlay_confirm.js\";\nimport OverlayError from \"../components/common/temporary/overlay_error.js\";\n\nexport default class BasePage {\n constructor(router) {\n if (!router) {\n throw new Error(\"Router is required\");\n }\n else {\n Utils.consoleLogIfNotProductionEnvironment(\"initialising with router: \", router);\n }\n this.router = router;\n this.title = titlePageCurrent;\n if (this.constructor === BasePage) {\n throw new Error(\"Cannot instantiate abstract class\");\n }\n \n if (!this.constructor.hash) {\n throw new Error(`Class ${this.constructor.name} must have a static hash attribute.`);\n }\n }\n\n initialize() {\n throw new Error(\"Method 'initialize()' must be implemented.\");\n }\n\n sharedInitialize() {\n this.logInitialisation();\n this.hookupCommonElements();\n }\n\n logInitialisation() {\n Utils.consoleLogIfNotProductionEnvironment('Initializing ' + this.title + ' page');\n }\n \n hookupCommonElements() {\n // hookupVideos();\n this.hookupLogos();\n this.hookupNavigation();\n this.hookupOverlays();\n }\n \n hookupEventHandler(eventType, selector, callback) {\n Events.initialiseEventHandler(selector, flagInitialised, (element) => {\n element.addEventListener(eventType, (event) => {\n event.stopPropagation();\n callback(event, element);\n });\n });\n }\n \n hookupNavigation() {\n this.hookupEventHandler(\"click\", idButtonHamburger, (event, element) => {\n let overlayHamburger = document.querySelector(idOverlayHamburger);\n if (overlayHamburger.classList.contains(flagIsCollapsed)) {\n overlayHamburger.classList.remove(flagIsCollapsed);\n overlayHamburger.classList.add(flagExpanded);\n } else {\n overlayHamburger.classList.remove(flagExpanded);\n overlayHamburger.classList.add(flagIsCollapsed);\n }\n });\n\n this.hookupButtonsNavHome();\n // this.hookupButtonsNavAdminHome();\n this.hookupButtonsNavUserAccount();\n this.hookupButtonsNavUserLogout();\n this.hookupButtonsNavUserLogin();\n\n // this.hookupButtonsNavStoreHome();\n // this.hookupButtonsNavStoreManufacturingPurchaseOrders();\n this.hookupButtonsNavDogHome();\n this.hookupButtonsNavDogCommandCategories();\n this.hookupButtonsNavDogCommands();\n this.hookupButtonsNavDogDogCommandLinks();\n this.hookupButtonsNavDogDogs();\n this.hookupButtonsNavDogLocations();\n this.hookupButtonsNavDogButtonIcons();\n this.hookupButtonsNavDogCommandButtonLinks();\n }\n hookupEventHandler(eventType, selector, callback) {\n Events.initialiseEventHandler(selector, flagInitialised, (element) => {\n element.addEventListener(eventType, (event) => {\n event.stopPropagation();\n callback(event, element);\n });\n });\n }\n hookupButtonsNavHome() {\n this.hookupButtonsNav('.' + flagNavHome, hashPageHome);\n }\n hookupButtonsNav(buttonSelector, hashPageNav) {\n this.hookupEventHandler(\"click\", buttonSelector, (event, button) => { \n this.router.navigateToHash(hashPageNav); \n });\n }\n /*\n hookupButtonsNavAdminHome() {\n this.hookupButtonsNav('.' + flagNavAdminHome, hashPageAdminHome);\n }\n hookupButtonsNavServices() {\n this.hookupButtonsNav('.' + flagNavServices, hashPageServices);\n }\n */\n hookupButtonsNavUserAccount() {\n this.hookupButtonsNav('.' + flagNavUserAccount, hashPageUserAccount);\n }\n hookupButtonsNavUserLogout() {\n this.hookupButtonsNav('.' + flagNavUserLogout, hashPageUserLogout);\n }\n hookupButtonsNavUserLogin() {\n this.hookupEventHandler(\"click\", '.' + flagNavUserLogin, (event, navigator) => { \n event.stopPropagation();\n this.leave();\n API.loginUser()\n .then((response) => {\n if (response.Success) {\n window.location.href = response[flagCallback];\n } else {\n DOM.alertError(\"Error\", response.Message);\n }\n });\n });\n }\n hookupButtonsNavDogHome() {\n this.hookupButtonsNav('.' + flagNavDogHome, hashPageDogHome);\n }\n hookupButtonsNavDogCommandCategories() {\n this.hookupButtonsNav('.' + flagNavDogCommandCategories, hashPageDogCommandCategories);\n }\n hookupButtonsNavDogCommands() {\n this.hookupButtonsNav('.' + flagNavDogCommands, hashPageDogCommands);\n }\n hookupButtonsNavDogDogCommandLinks() {\n this.hookupButtonsNav('.' + flagNavDogDogCommandLinks, hashPageDogDogCommandLinks);\n }\n hookupButtonsNavDogDogs() {\n this.hookupButtonsNav('.' + flagNavDogDogs, hashPageDogDogs);\n }\n hookupButtonsNavDogLocations() {\n this.hookupButtonsNav('.' + flagNavDogLocations, hashPageDogLocations);\n }\n hookupButtonsNavDogButtonIcons() {\n this.hookupButtonsNav('.' + flagNavDogButtonIcons, hashPageDogButtonIcons);\n }\n hookupButtonsNavDogCommandButtonLinks() {\n this.hookupButtonsNav('.' + flagNavDogCommandButtonLinks, hashPageDogCommandButtonLinks);\n }\n\n hookupLogos() {\n this.hookupEventHandler(\"click\", \".\" + flagImageLogo + \",\" + \".\" + flagLogo, (event, element) => {\n Utils.consoleLogIfNotProductionEnvironment('clicking logo');\n this.router.navigateToHash(hashPageHome);\n });\n }\n\n hookupOverlays() {\n this.hookupOverlayFromId(idOverlayConfirm);\n this.hookupOverlayFromId(idOverlayError);\n }\n\n hookupOverlayFromId(idOverlay) {\n Events.initialiseEventHandler(idOverlay, flagInitialised, (overlay) => {\n overlay.querySelector('button.' + flagCancel).addEventListener(\"click\", (event) => {\n event.stopPropagation();\n overlay.style.display = 'none';\n });\n });\n }\n\n hookupButtonSave() {\n Events.initialiseEventHandler('form.' + flagFilter + ' button.' + flagSave, flagInitialised, (button) => {\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n button = event.target;\n if (button.classList.contains(flagIsCollapsed)) return;\n Utils.consoleLogIfNotProductionEnvironment('saving page: ', this.title);\n OverlayConfirm.show();\n });\n });\n }\n\n leave() {\n Utils.consoleLogIfNotProductionEnvironment('Leaving ' + this.title + ' page');\n if (this.constructor === BasePage) {\n throw new Error(\"Must implement leave() method.\");\n }\n }\n setLocalStoragePage(dataPage) {\n LocalStorage.setLocalStorage(this.hash, dataPage);\n }\n getLocalStoragePage() {\n return LocalStorage.getLocalStorage(this.hash);\n }\n\n toggleShowButtonsSaveCancel(show) { // , buttonSave = null, buttonCancel = null\n let buttonSave = document.querySelector('form.' + flagFilter + ' button.' + flagSave);\n let buttonCancel = document.querySelector('form.' + flagFilter + ' button.' + flagCancel);\n if (show) {\n buttonCancel.classList.remove(flagIsCollapsed);\n buttonSave.classList.remove(flagIsCollapsed);\n Utils.consoleLogIfNotProductionEnvironment('showing buttons');\n } else {\n buttonCancel.classList.add(flagIsCollapsed);\n buttonSave.classList.add(flagIsCollapsed);\n Utils.consoleLogIfNotProductionEnvironment('hiding buttons');\n }\n }\n\n static isDirtyFilter(filter) {\n let isDirty = DOM.updateAndCheckIsElementDirty(filter);\n if (isDirty) document.querySelectorAll(idTableMain + ' tbody tr').remove();\n return isDirty;\n }\n\n}","\n// internal\nimport BasePage from \"../base.js\";\n// external\n\n\nexport default class PageHome extends BasePage {\n static hash = hashPageHome;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n // this.hookupButtonsNav();\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport BasePage from \"../base.js\";\n\nexport default class PageDogHome extends BasePage {\n static hash = hashPageDogHome;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n this.hookupDogHome();\n }\n hookupDogHome() {\n \n }\n\n leave() {\n super.leave();\n }\n}\n","\nimport Utils from '../utils.js';\n\nexport default class BusinessObjects {\n static getOptionJsonFromObjectJsonAndKeys(objectJson, keyText, keyValue, valueSelected = null) {\n return {\n text: objectJson[keyText],\n value: objectJson[keyValue],\n selected: (objectJson[keyValue] == valueSelected),\n };\n }\n static getOptionJsonFromObjectJson(objectJson, valueSelected = null) {\n let keyText = objectJson[flagNameAttrOptionText];\n let keyValue = objectJson[flagNameAttrOptionValue];\n Utils.consoleLogIfNotProductionEnvironment({objectJson, keyText, keyValue});\n return BusinessObjects.getOptionJsonFromObjectJsonAndKeys(objectJson, keyText, keyValue, valueSelected);\n }\n static getObjectText(objectJson) {\n return objectJson == null ? '' : objectJson[objectJson[flagNameAttrOptionText]];\n }\n static getListObjectsFromIdDictAndCsv(idDict, idCsv) {\n let listObjects = [];\n let ids = idCsv.split(',');\n for (let id of ids) {\n listObjects.push(idDict[id]);\n }\n return listObjects;\n }\n}","\nimport Events from \"../../../lib/events.js\";\n\nexport default class OverlayError {\n static hookup() {\n Events.initialiseEventHandler(idOverlayError + ' button.' + flagCancel, flagInitialised, (buttonCancel) => {\n buttonCancel.addEventListener('click', () => {\n let overlay = document.querySelector(idOverlayError);\n overlay.style.visibility = 'hidden';\n });\n });\n }\n static show(msgError) {\n let overlay = document.querySelector(idOverlayError);\n let labelError = overlay.querySelector(idLabelError);\n labelError.innerText = msgError;\n overlay.style.visibility = 'visible';\n }\n}","\nimport BusinessObjects from \"../lib/business_objects/business_objects.js\";\nimport Events from \"../lib/events.js\";\nimport LocalStorage from \"../lib/local_storage.js\";\nimport Validation from \"../lib/validation.js\";\nimport BasePage from \"./base.js\";\nimport API from \"../api.js\";\nimport DOM from \"../dom.js\";\nimport Utils from \"../lib/utils.js\";\n\nimport OverlayConfirm from \"../components/common/temporary/overlay_confirm.js\";\nimport OverlayError from \"../components/common/temporary/overlay_error.js\";\n\nexport default class TableBasePage extends BasePage {\n // static hash\n // static attrIdRowObject\n // callSaveTableContent\n\n constructor(router) {\n super(router);\n this.cursorYInitial = null;\n this.rowInitial = null;\n this.placeholder = null;\n this.dragSrcEl = null;\n this.dragSrcRow = null;\n\n this.hookupTableCellDdls = this.hookupTableCellDdls.bind(this);\n }\n \n initialize(isPopState = false) {\n throw new Error(\"Must implement initialize() method.\");\n }\n sharedInitialize(isPopState = false, isSinglePageApp = false) {\n if (!isPopState) {\n super.sharedInitialize();\n this.hookupFilters();\n this.hookupButtonsSaveCancel();\n this.hookupTableMain();\n OverlayConfirm.hookup(() => {\n if (isSinglePageApp) {\n this.saveRecordsTableDirtySinglePageApp();\n }\n else {\n this.saveRecordsTableDirty();\n }\n });\n } else {\n let dataPage = this.getLocalStoragePage();\n let filters = dataPage[flagFormFilters];\n let formFilters = TableBasePage.getFormFilters();\n let filtersDefault = DOM.convertForm2JSON(formFilters);\n if (!Validation.areEqualDicts(filters, filtersDefault)) {\n this.callFilterTableContent();\n }\n }\n }\n hookupFilters() {\n if (this.constructor === TableBasePage) {\n throw new Error(\"Subclass of TableBasePage must implement method hookupFilters().\");\n }\n }\n sharedHookupFilters() {\n this.hookupButtonApplyFilters();\n this.hookupSearchTextFilter();\n }\n hookupFilterActive() {\n let filterSelector = idFormFilters + ' #' + flagActiveOnly;\n let filterActiveOld = document.querySelector(filterSelector);\n filterActiveOld.removeAttribute('id');\n let parentDiv = filterActiveOld.parentElement;\n let isChecked = (DOM.getElementAttributeValuePrevious(parentDiv) == \"True\");\n let filterActiveNew = document.querySelector(idFormFilters + ' div.' + flagActiveOnly + '.' + flagContainerInput + ' svg.' + flagActiveOnly);\n filterActiveNew.setAttribute('id', flagActiveOnly);\n if (isChecked) filterActiveNew.classList.add(flagIsChecked);\n\n this.hookupEventHandler(\"click\", filterSelector, (event, filterActive) => {\n Utils.consoleLogIfNotProductionEnvironment({ filterActive });\n Utils.consoleLogIfNotProductionEnvironment({ [filterActive.tagName]: filterActive.tagName });\n let svgElement = (filterActive.tagName.toUpperCase() == 'SVG') ? filterActive : filterActive.parentElement;\n let wasChecked = svgElement.classList.contains(flagIsChecked);\n if (wasChecked) {\n svgElement.classList.remove(flagIsChecked);\n }\n else {\n svgElement.classList.add(flagIsChecked);\n }\n return this.handleChangeFilter(event, filterActive);\n });\n let filter = document.querySelector(filterSelector);\n let filterValuePrevious = DOM.getElementValueCurrent(filter);\n filter.setAttribute(attrValueCurrent, filterValuePrevious);\n filter.setAttribute(attrValuePrevious, filterValuePrevious);\n }\n hookupFilter(filterFlag, handler = (event, filter) => { return this.handleChangeFilter(event, filter); }) {\n let filterSelector = idFormFilters + ' #' + filterFlag;\n this.hookupEventHandler(\"change\", filterSelector, handler);\n let filter = document.querySelector(filterSelector);\n let filterValuePrevious = DOM.getElementValueCurrent(filter);\n filter.setAttribute(attrValueCurrent, filterValuePrevious);\n filter.setAttribute(attrValuePrevious, filterValuePrevious);\n }\n handleChangeFilter(event, filter) {\n let isDirtyFilter = DOM.updateAndCheckIsElementDirty(filter);\n let formFilters = TableBasePage.getFormFilters();\n let areDirtyFilters = isDirtyFilter || DOM.hasDirtyChildrenContainer(formFilters);\n let tbody = document.querySelector(idTableMain + ' tbody');\n let rows = tbody.querySelectorAll(':scope > tr');\n rows.forEach((row) => {\n if (areDirtyFilters && !row.classList.contains(flagIsCollapsed)) row.classList.add(flagIsCollapsed);\n if (!areDirtyFilters && row.classList.contains(flagIsCollapsed)) {\n row.classList.remove(flagIsCollapsed);\n let dirtyInputs = row.querySelectorAll('input.' + flagDirty);\n dirtyInputs.forEach((dirtyInput) => {\n dirtyInput.value = DOM.getElementAttributeValueCurrent(dirtyInput);\n });\n }\n });\n if (areDirtyFilters) {\n /*\n tbody.querySelectorAll('tr').forEach((tr) => { \n if (!DOM.hasDirtyChildrenContainer(tr)) tr.remove(); \n });\n */\n tbody.innerHTML = '
Press \"Apply Filters\" to refresh the table.
' + tbody.innerHTML;\n if (!tbody.classList.contains(flagIsCollapsed)) tbody.classList.add(flagIsCollapsed);\n }\n else {\n let isDirtyLabel = tbody.querySelector(\":scope > div\");\n if (isDirtyLabel != null) isDirtyLabel.remove();\n if (tbody.classList.contains(flagIsCollapsed)) tbody.classList.remove(flagIsCollapsed);\n let initialisedElements = tbody.querySelectorAll('.' + flagInitialised);\n initialisedElements.forEach((initialisedElement) => {\n initialisedElement.classList.remove(flagInitialised);\n });\n this.hookupTableMain();\n }\n this.updateAndToggleShowButtonsSaveCancel();\n }\n hookupFilterIsNotEmpty() {\n this.hookupFilter(flagIsNotEmpty);\n }\n hookupButtonApplyFilters() {\n this.hookupEventHandler(\"click\", idButtonApplyFilters, (event, button) => {\n event.stopPropagation();\n this.callFilterTableContent();\n });\n }\n hookupSearchTextFilter() {\n this.hookupFilter(flagSearch);\n }\n hookupFilterDog() {\n this.hookupFilter(attrIdDog); \n }\n hookupFilterCommandCategory() {\n this.hookupFilter(attrIdCommandCategory, (event, filterCommandCategory) => {\n this.handleChangeFilter();\n let isDirtyFilter = filterCommandCategory.classList.contains(flagDirty);\n let idCommandCategory = DOM.getElementValueCurrent(filterCommandCategory);\n console.log(\"filter commands unsorted\");\n console.log(Utils.getListFromDict(filterCommands));\n let commandsInCategory = Utils.getListFromDict(filterCommands).filter(command => command[attrIdCommandCategory] == idCommandCategory);\n let sortedCommands = commandsInCategory.sort((a, b) => a[flagName].localeCompare(b[flagName]));\n let filterCommand = document.querySelector(idFormFilters + ' .' + flagCommand);\n let idCommandPrevious = DOM.getElementAttributeValuePrevious(filterCommand);\n filterCommand.innerHTML = '';\n let optionJson, option;\n option = DOM.createOption(null);\n filterCommand.appendChild(option);\n sortedCommands.forEach((command) => {\n optionJson = BusinessObjects.getOptionJsonFromObjectJson(command, idCommandPrevious);\n option = DOM.createOption(optionJson);\n filterCommand.appendChild(option);\n });\n filterCommand.dispatchEvent(new Event('change'));\n return isDirtyFilter;\n });\n }\n hookupFilterCommand() {\n this.hookupFilter(attrIdCommand);\n }\n /*\n getAndLoadFilteredTableContent = () => {\n this.callFilterTableContent()\n .catch(error => console.error('Error:', error));\n }\n */\n static getFormFilters() {\n return document.querySelector(idFormFilters);\n }\n callFilterTableContent() {\n let formFilters = TableBasePage.getFormFilters();\n let filtersJson = DOM.convertForm2JSON(formFilters);\n Utils.consoleLogIfNotProductionEnvironment(\"callFilterTableContent\");\n Utils.consoleLogIfNotProductionEnvironment(\"formFilters\");\n Utils.consoleLogIfNotProductionEnvironment(formFilters);\n Utils.consoleLogIfNotProductionEnvironment(\"filtersJson\");\n Utils.consoleLogIfNotProductionEnvironment(filtersJson);\n this.leave();\n API.goToHash(this.constructor.hash, filtersJson);\n }\n callbackLoadTableContent(response) {\n let table = TableBasePage.getTableMain();\n let bodyTable = table.querySelector('tbody');\n bodyTable.querySelectorAll('tr').forEach(function(row) { row.remove(); });\n let rowsJson = response.data[flagRows];\n if (!Validation.isEmpty(rowsJson) && rowsJson.every(row => row.hasOwnProperty('display_order'))) {\n rowsJson = rowsJson.sort((a, b) => a.display_order - b.display_order);\n }\n rowsJson.forEach(this.loadRowTable.bind(this));\n this.hookupTableMain();\n }\n static getTableMain() {\n return document.querySelector(idTableMain);\n }\n loadRowTable(rowJson) {\n throw new Error(\"Subclass of TableBasePage must implement method loadRowTable().\");\n }\n getAndLoadFilteredTableContentSinglePageApp() {\n this.callFilterTableContent()\n .then(data => {\n Utils.consoleLogIfNotProductionEnvironment('Table data received:', data);\n this.callbackLoadTableContent(data);\n })\n .catch(error => console.error('Error:', error));\n }\n hookupButtonsSaveCancel() {\n this.hookupButtonSave();\n this.hookupButtonCancel();\n this.toggleShowButtonsSaveCancel(false);\n }\n saveRecordsTableDirty() {\n let records = this.getTableRecords(true);\n if (records.length == 0) {\n OverlayError.show('No records to save');\n return;\n }\n let formElement = TableBasePage.getFormFilters();\n let comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm));\n /*\n Utils.consoleLogIfNotProductionEnvironment({ formElement, comment, records });\n Utils.consoleLogIfNotProductionEnvironment('records');\n Utils.consoleLogIfNotProductionEnvironment(records);\n debugger;\n */\n this.callSaveTableContent(records, formElement, comment)\n .then(data => {\n if (data[flagStatus] == flagSuccess) {\n if (_verbose) { \n Utils.consoleLogIfNotProductionEnvironment('Records saved!');\n Utils.consoleLogIfNotProductionEnvironment('Data received:', data);\n }\n this.callFilterTableContent();\n }\n else {\n Utils.consoleLogIfNotProductionEnvironment(\"error: \", data[flagMessage]);\n OverlayError.show(data[flagMessage]);\n }\n })\n .catch(error => console.error('Error:', error));\n }\n getTableRecords(dirtyOnly = false) {\n let records = [];\n let record;\n document.querySelectorAll(idTableMain + ' > tbody > tr').forEach((row) => {\n if (dirtyOnly && !DOM.hasDirtyChildrenContainer(row)) return;\n record = this.getJsonRow(row);\n records.push(record);\n });\n return records;\n }\n getJsonRow(row) {\n throw new Error(\"Subclass of TableBasePage must implement method getJsonRow().\");\n }\n saveRecordsTableDirtySinglePageApp() {\n let records = this.getTableRecords(true);\n if (records.length == 0) {\n OverlayError.show('No records to save');\n return;\n }\n let formElement = TableBasePage.getFormFilters();\n let comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm));\n this.callSaveTableContent(records, formElement, comment)\n .then(data => {\n if (data[flagStatus] == flagSuccess) {\n if (_verbose) { \n Utils.consoleLogIfNotProductionEnvironment('Records saved!');\n Utils.consoleLogIfNotProductionEnvironment('Data received:', data);\n }\n this.callbackLoadTableContent(data);\n }\n else {\n Utils.consoleLogIfNotProductionEnvironment(\"error: \", data[flagMessage]);\n OverlayError.show(data[flagMessage]);\n }\n })\n .catch(error => console.error('Error:', error));\n }\n hookupButtonCancel() {\n Events.initialiseEventHandler(idFormFilters + ' button.' + flagCancel, flagInitialised, (button) => {\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n button = event.target;\n if (button.classList.contains(flagIsCollapsed)) return;\n this.callFilterTableContent();\n });\n button.classList.add(flagIsCollapsed);\n });\n }\n handleClickAddRowTable(event, button) {\n event.stopPropagation();\n _rowBlank.setAttribute(this.constructor.attrIdRowObject, -1 - _rowBlank.getAttribute(this.constructor.attrIdRowObject));\n let tbody = document.querySelector(idTableMain + ' tbody');\n if (tbody.classList.contains(flagIsCollapsed)) return;\n let row = _rowBlank.cloneNode(true);\n row.classList.remove(flagInitialised);\n row.querySelectorAll('.' + flagInitialised).forEach(function(element) {\n element.classList.remove(flagInitialised);\n });\n let countRows = document.querySelectorAll(idTableMain + ' > tbody > tr').length;\n row.setAttribute(this.constructor.attrIdRowObject, -1 - countRows);\n this.initialiseRowNew(tbody, row);\n tbody.prepend(row);\n tbody.scrollTop = 0;\n this.hookupTableMain();\n this.postInitialiseRowNewCallback(tbody);\n }\n initialiseRowNew(tbody, row) {\n if (this.constructor === TableBasePage) {\n throw new Error(\"Subclass of TableBasePage must implement method initialiseRowNew().\");\n }\n // row.classList.remove(flagRowNew);\n }\n hookupTableMain() {\n if (this.constructor === TableBasePage) {\n throw new Error(\"Must implement hookupTableMain() method.\");\n }\n if (true) { // _rowBlank == null) {\n Events.initialiseEventHandler(idTableMain, flagInitialised, (table) => {\n this.cacheRowBlank();\n });\n }\n }\n cacheRowBlank() {\n let selectorRowNew = idTableMain + ' tbody tr.' + flagRowNew;\n let rowBlankTemp = document.querySelector(selectorRowNew);\n Utils.consoleLogIfNotProductionEnvironment(\"row blank temp: \", rowBlankTemp);\n let countRows = document.querySelectorAll(idTableMain + ' > tbody > tr').length;\n _rowBlank = rowBlankTemp.cloneNode(true);\n document.querySelectorAll(selectorRowNew).forEach(function(row) {\n row.remove();\n });\n _rowBlank.setAttribute(this.constructor.attrIdRowObject, -1 - countRows);\n }\n postInitialiseRowNewCallback(tbody) {\n if (this.constructor === TableBasePage) {\n throw new Error(\"Subclass of TableBasePage must implement method postInitialiseRowNewCallback(tbody).\");\n }\n }\n initialiseSliderDisplayOrderRowNew(tbody, row) {\n // let tdSelector = ':scope > tr > td.' + flagDisplayOrder;\n // let tbody = document.querySelector('table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody');\n let slidersDisplayOrder = tbody.querySelectorAll(':scope > tr > td.' + flagDisplayOrder + ' input.' + flagSlider);\n let maxDisplayOrder = 0;\n slidersDisplayOrder.forEach((slider) => {\n maxDisplayOrder = Math.max(maxDisplayOrder, parseFloat(DOM.getElementValueCurrent(slider)));\n });\n let sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider);\n DOM.setElementValuesCurrentAndPrevious(sliderDisplayOrder, maxDisplayOrder + 1);\n }\n hookupSlidersDisplayOrderTable() {\n let selectorDisplayOrder = idTableMain + ' tbody tr td.' + flagDisplayOrder + ' input.' + flagSlider + '.' + flagDisplayOrder;\n this.hookupChangeHandlerTableCells(selectorDisplayOrder);\n }\n hookupChangeHandlerTableCells(inputSelector, handler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n Events.initialiseEventHandler(inputSelector, flagInitialised, (input) => {\n input.addEventListener(\"change\", (event) => {\n handler(event, input);\n });\n handler(null, input);\n });\n }\n /*\n handleChangeElementCellTable(event, element) {\n let row = DOM.getRowFromElement(element);\n let td = DOM.getCellFromElement(element);\n let wasDirtyRow = DOM.hasDirtyChildrenContainer(row);\n let wasDirtyElement = element.classList.contains(flagDirty);\n let isDirtyElement = DOM.updateAndCheckIsElementDirty(element);\n if (isDirtyElement != wasDirtyElement) {\n DOM.handleDirtyElement(td, isDirtyElement);\n let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row);\n if (isNowDirtyRow != wasDirtyRow) {\n DOM.handleDirtyElement(row, isNowDirtyRow);\n let rows = this.getTableRecords(true);\n let existsDirtyRecord = rows.length > 0;\n this.toggleShowButtonsSaveCancel(existsDirtyRecord);\n }\n }\n }\n handleChangeElementNestedCellTable(event, element, flagColumnList = [], orderNesting = 1) {\n let orderNestingTemp = orderNesting;\n let row, td, nestedRowSelector;\n while (orderNestingTemp > 0) {\n nestedRowSelector = idTableMain;\n for (let indexOrderNesting = 0; indexOrderNesting < orderNestingTemp; indexOrderNesting++) {\n nestedRowSelector += ' tbody tr';\n }\n row = DOM.getClosestParent(element, nestedRowSelector);\n td = row.querySelector('td.' + flag);\n }\n let row = DOM.getRowFromElement(element);\n let td = DOM.getCellFromElement(element);\n let wasDirtyRow = DOM.hasDirtyChildrenContainer(row);\n let wasDirtyElement = element.classList.contains(flagDirty);\n let isDirtyElement = DOM.updateAndCheckIsElementDirty(element);\n if (isDirtyElement != wasDirtyElement) {\n DOM.handleDirtyElement(td, isDirtyElement);\n let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row);\n if (isNowDirtyRow != wasDirtyRow) {\n DOM.handleDirtyElement(row, isNowDirtyRow);\n let rows = this.getTableRecords(true);\n let existsDirtyRecord = rows.length > 0;\n this.toggleShowButtonsSaveCancel(existsDirtyRecord);\n }\n }\n }\n handleChangeElementSubtableCell(event, element, flagFieldSubtable) {\n let rowSubtable = element.closest(idTableMain + ' td.' + flagFieldSubtable + ' tbody tr');\n let rowTable = rowSubtable.closest(idTableMain + ' > tbody > tr');\n let td = DOM.getCellFromElement(element);\n // let tdSubtable = td.closest('td.' + flagFieldSubtable);\n let wasDirtyRowSubtable = DOM.hasDirtyChildrenContainer(rowSubtable);\n let wasDirtyRowTable = DOM.hasDirtyChildrenContainer(rowTable);\n let wasDirtyElement = element.classList.contains(flagDirty);\n let isDirtyElement = DOM.updateAndCheckIsElementDirty(element);\n Utils.consoleLogIfNotProductionEnvironment({isDirtyElement, wasDirtyElement});\n if (isDirtyElement != wasDirtyElement) {\n DOM.handleDirtyElement(td, isDirtyElement);\n let isNowDirtyRowSubtable = DOM.hasDirtyChildrenContainer(rowSubtable);\n Utils.consoleLogIfNotProductionEnvironment({isNowDirtyRowSubtable, wasDirtyRowSubtable});\n if (isNowDirtyRowSubtable != wasDirtyRowSubtable) {\n DOM.handleDirtyElement(rowSubtable, isNowDirtyRowSubtable);\n let isNowDirtyRowTable = DOM.hasDirtyChildrenContainer(rowTable);\n Utils.consoleLogIfNotProductionEnvironment({isNowDirtyRowTable, wasDirtyRowTable});\n if (isNowDirtyRowTable != wasDirtyRowTable) {\n DOM.handleDirtyElement(rowTable, isNowDirtyRowTable);\n let rows = this.getTableRecords(true);\n let existsDirtyRecord = rows.length > 0;\n this.toggleShowButtonsSaveCancel(existsDirtyRecord);\n }\n }\n }\n }\n */\n handleChangeNestedElementCellTable(event, element) {\n let wasDirtyParentRows = this.getAllIsDirtyRowsInParentTree(element);\n let wasDirtyElement = element.classList.contains(flagDirty);\n let isDirtyElement = DOM.updateAndCheckIsElementDirty(element);\n // Utils.consoleLogIfNotProductionEnvironment({isDirtyElement, wasDirtyElement, wasDirtyParentRows});\n // let td = DOM.getCellFromElement(element);\n // DOM.setElementAttributeValueCurrent(td, DOM.getElementAttributeValueCurrent(element));\n if (isDirtyElement != wasDirtyElement) {\n // DOM.handleDirtyElement(td, isDirtyElement);\n this.updateAndToggleShowButtonsSaveCancel();\n this.cascadeChangedIsDirtyNestedElementCellTable(element, isDirtyElement, wasDirtyParentRows);\n }\n }\n getAllIsDirtyRowsInParentTree(element) {\n let rows = [];\n let parent = element;\n let isDirty;\n while (parent) {\n if (parent.tagName.toUpperCase() == 'TR') {\n isDirty = parent.classList.contains(flagDirty)\n rows.push(isDirty);\n }\n parent = parent.parentElement;\n }\n return rows;\n }\n cascadeChangedIsDirtyNestedElementCellTable(element, isDirtyElement, wasDirtyParentRows) {\n if (Validation.isEmpty(wasDirtyParentRows)) return;\n let tr = DOM.getRowFromElement(element);\n let isDirtyRow = isDirtyElement || DOM.hasDirtyChildrenContainer(tr);\n let wasDirtyRow = wasDirtyParentRows.shift();\n Utils.consoleLogIfNotProductionEnvironment({isDirtyRow, wasDirtyRow});\n if (isDirtyRow != wasDirtyRow) {\n DOM.handleDirtyElement(tr, isDirtyRow);\n this.updateAndToggleShowButtonsSaveCancel();\n this.cascadeChangedIsDirtyNestedElementCellTable(tr.parentElement, isDirtyRow, wasDirtyParentRows);\n }\n }\n hookupChangeHandlerTableCellsWhenNotCollapsed(inputSelector, handler = (event, element) => {\n if (!element.classList.contains(flagIsCollapsed)) this.handleChangeNestedElementCellTable(event, element);\n }) {\n this.hookupEventHandler(\"change\", inputSelector, handler);\n }\n hookupFieldsCodeTable() {\n this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagCode + ' > .' + flagCode);\n }\n hookupFieldsNameTable() {\n this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagName + ' > .' + flagName);\n }\n hookupFieldsDescriptionTable() {\n this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagDescription + ' > .' + flagDescription);\n }\n hookupFieldsNotesTable() {\n this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagNotes + ' > .' + flagNotes);\n }\n hookupFieldsActive(flagTable = '', handleClickRowNew = (event, element) => { this.handleClickAddRowTable(event, element); }) {\n let selectorButton = 'table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody > tr > td.' + flagActive + ' .' + flagButton + '.' + flagActive;\n let selectorButtonDelete = selectorButton + '.' + flagDelete;\n let selectorButtonUndelete = selectorButton + ':not(.' + flagDelete + ')';\n Utils.consoleLogIfNotProductionEnvironment(\"hookupFieldsActive: \", selectorButtonDelete, selectorButtonUndelete);\n this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete);\n this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete);\n this.hookupEventHandler(\n \"click\"\n , 'table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > thead > tr > th.' + flagActive + ' .' + flagButton + '.' + flagActive\n , (event, button) => { handleClickRowNew(event, button); }\n );\n }\n hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n this.hookupEventHandler(\"click\", selectorButtonDelete, (event, element) => {\n this.handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); });\n });\n }\n handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n if (element.tagName.toUpperCase() != 'SVG') element = element.parentElement;\n let valuePrevious = DOM.getElementAttributeValuePrevious(element);\n let wasDirty = element.classList.contains(flagDirty);\n let row = DOM.getRowFromElement(element);\n if (row.classList.contains(flagRowNew) && !DOM.hasDirtyChildrenContainer(row)) {\n row.parentNode.removeChild(row);\n }\n else {\n let buttonAddTemplate = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagActive + '.' + flagAdd);\n let buttonAdd = buttonAddTemplate.cloneNode(true);\n DOM.setElementAttributeValuePrevious(buttonAdd, valuePrevious);\n DOM.setElementAttributeValueCurrent(buttonAdd, false);\n if (wasDirty) buttonAdd.classList.add(flagDirty);\n element.replaceWith(buttonAdd);\n changeHandler(null, buttonAdd);\n this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); });\n }\n this.updateAndToggleShowButtonsSaveCancel();\n }\n hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n this.hookupEventHandler(\"click\", selectorButtonUndelete, (event, element) => {\n this.handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); });\n });\n }\n handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n if (element.tagName.toUpperCase() != 'SVG') element = element.parentElement;\n let valuePrevious = DOM.getElementAttributeValuePrevious(element);\n let wasDirty = DOM.isElementDirty(element);\n let buttonDeleteTemplate = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagActive + '.' + flagDelete);\n let buttonDelete = buttonDeleteTemplate.cloneNode(true);\n DOM.setElementAttributeValuePrevious(buttonDelete, valuePrevious);\n DOM.setElementAttributeValueCurrent(buttonDelete, true);\n if (wasDirty) buttonDelete.classList.add(flagDirty);\n element.replaceWith(buttonDelete);\n changeHandler(null, buttonDelete);\n this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); });\n this.updateAndToggleShowButtonsSaveCancel();\n }\n hookupTdsAccessLevel() {\n this.hookupTableCellDdlPreviews(flagAccessLevel, Utils.getListFromDict(accessLevels));\n }\n hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector = null\n , ddlHookup = (ddlSelector) => { this.hookupTableCellDdls(ddlSelector); }\n , changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }\n ) {\n if (cellSelector == null) cellSelector = idTableMain + ' > tbody > tr > td.' + fieldFlag;\n this.hookupEventHandler(\"click\", cellSelector + ' div.' + fieldFlag, (event, div) => {\n this.handleClickTableCellDdlPreview(\n event\n , div\n , fieldFlag\n , optionList\n , cellSelector\n , (ddlSelector) => { ddlHookup(\n ddlSelector\n , (event, element) => { changeHandler(event, element); }\n ); }\n );\n });\n ddlHookup(cellSelector + ' select.' + fieldFlag);\n }\n hookupTableCellDdls(ddlSelector, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n this.hookupChangeHandlerTableCells(ddlSelector, (event, element) => { changeHandler(event, element); });\n }\n handleClickTableCellDdlPreview(event, div, fieldFlag, optionObjectList, cellSelector = null, ddlHookup = (cellSelector) => { this.hookupTableCellDdls(cellSelector); }) {\n if (Validation.isEmpty(cellSelector)) cellSelector = idTableMain + ' > tbody > tr > td.' + fieldFlag;\n let idSelected = DOM.getElementAttributeValueCurrent(div);\n let td = DOM.getCellFromElement(div);\n td.innerHTML = '';\n let ddl = document.createElement('select');\n ddl.classList.add(fieldFlag);\n DOM.setElementValuesCurrentAndPrevious(ddl, idSelected);\n let optionJson, option;\n if (_verbose) { \n Utils.consoleLogIfNotProductionEnvironment(\"click table cell ddl preview\");\n Utils.consoleLogIfNotProductionEnvironment({optionObjectList, cellSelector});\n }\n option = DOM.createOption(null);\n ddl.appendChild(option);\n optionObjectList.forEach((optionObjectJson) => {\n optionJson = BusinessObjects.getOptionJsonFromObjectJson(optionObjectJson, idSelected);\n option = DOM.createOption(optionJson);\n ddl.appendChild(option);\n });\n td.appendChild(ddl);\n let ddlSelector = cellSelector + ' select.' + fieldFlag;\n ddlHookup(ddlSelector);\n }\n /*\n hookupTableCellDDlPreviewsWhenNotCollapsed(cellSelector, optionList, ddlHookup = (event, element) => { this.hookupTableCellDdls(event, element); }) {\n this.hookupEventHandler(\"click\", cellSelector + ' div', (event, div) => {\n this.handleClickTableCellDdlPreview(event, div, optionList, cellSelector, (event, element) => { ddlHookup(event, element); });\n });\n }\n */\n toggleColumnCollapsed(flagColumn, isCollapsed) {\n this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagIsCollapsed);\n }\n toggleColumnHeaderCollapsed(flagColumn, isCollapsed) {\n this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagIsCollapsed);\n }\n\n hookupFieldsCommandCategory() {\n this.hookupTableCellDdlPreviews(\n flagCommandCategory\n , Utils.getListFromDict(filterCommandCategories).sort((a, b) => a[flagName].localeCompare(b[flagName]))\n , null\n , (cellSelector) => { this.hookupCommandCategoryDdls(cellSelector); }\n );\n }\n hookupCommandCategoryDdls(ddlSelector) {\n this.hookupChangeHandlerTableCells(ddlSelector, (event, element) => { this.handleChangeCommandCategoryDdl(event, element); });\n }\n handleChangeCommandCategoryDdl(event, ddlCategory) {\n let row = DOM.getRowFromElement(ddlCategory);\n let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory);\n this.handleChangeNestedElementCellTable(event, ddlCategory);\n let idCommandCategoryRowNew = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory);\n if (idCommandCategoryRowOld == idCommandCategoryRowNew) return;\n let idCommandCategoryFilter = this.getIdCommandCategoryFilter();\n let tdCommand = row.querySelector('td.' + flagCommand);\n tdCommand.dispatchEvent(new Event('click'));\n let ddlCommand = row.querySelector('td.' + flagCommand + ' select.' + flagCommand);\n ddlCommand.innerHTML = '';\n ddlCommand.appendChild(DOM.createOption(null));\n let optionJson, option;\n let commandsInCategory = Utils.getListFromDict(filterCommands).filter(command => \n (\n command[attrIdCommandCategory] == idCommandCategoryRowNew\n || idCommandCategoryRowNew == 0\n )\n && (\n command[attrIdCommandCategory] == idCommandCategoryFilter\n || idCommandCategoryFilter == 0\n )\n );\n let sortedCommands = commandsInCategory.sort((a, b) => a[flagName].localeCompare(b[flagName]));\n sortedCommands.forEach((command) => {\n optionJson = BusinessObjects.getOptionJsonFromObjectJson(command);\n option = DOM.createOption(optionJson);\n ddlCommand.appendChild(option);\n });\n this.handleChangeNestedElementCellTable(event, ddlCommand);\n }\n hookupFieldsCommand() {\n this.hookupEventHandler(\"click\", idTableMain + ' td.' + flagCommand + ' .' + flagCommand, (event, div) => {\n Utils.consoleLogIfNotProductionEnvironment(div);\n let parentTr = DOM.getRowFromElement(div);\n Utils.consoleLogIfNotProductionEnvironment({ div, parentTr });\n let tdCommandCategory = parentTr.querySelector('td.' + flagCommandCategory);\n let idCommandCategoryRow = this.getIdCommandCategoryRow(parentTr); // DOM.getElementAttributeValueCurrent(tdCommandCategory);\n let idCommandCategoryFilter = this.getIdCommandCategoryFilter();\n let filterCommandList = Utils.getListFromDict(filterCommands);\n let commandsInCategory = filterCommandList.filter(command => \n (\n command[attrIdCommandCategory] == idCommandCategoryRow\n || idCommandCategoryRow == 0\n )\n && (\n command[attrIdCommandCategory] == idCommandCategoryFilter\n || idCommandCategoryFilter == 0\n )\n );\n let sortedCommands = commandsInCategory.sort((a, b) => a[flagName].localeCompare(b[flagName]));\n Utils.consoleLogIfNotProductionEnvironment({ tdCommandCategory, idCommandCategoryRow, idCommandCategoryFilter, filterCommandList, commandsInCategory });\n Utils.consoleLogIfNotProductionEnvironment(filterCommandList);\n this.handleClickTableCellDdlPreview(\n event\n , div\n , flagCommand\n , sortedCommands\n , null\n , (cellSelector) => { this.hookupTableCellDdls(\n cellSelector\n , (event, element) => { this.handleChangeNestedElementCellTable(event, element); }\n ); }\n );\n });\n this.hookupTableCellDdls(idTableMain + ' td.' + flagCommand + ' select.' + flagCommand);\n }\n getIdCommandCategoryRow(tr) {\n let elementCommandCategory = tr.querySelector('td.' + flagCommandCategory + ' .' + flagCommandCategory);\n return DOM.getElementAttributeValueCurrent(elementCommandCategory);\n }\n getIdCommandCategoryFilter() {\n let formFilters = TableBasePage.getFormFilters();\n let commandCategoryFilter = formFilters.querySelector('#' + attrIdCommandCategory);\n let commandFilter = formFilters.querySelector('#' + attrIdCommand);\n let idCommandCategory = 0;\n let valueCurrentCommandCategoryFilter = DOM.getElementAttributeValueCurrent(commandCategoryFilter);\n Utils.consoleLogIfNotProductionEnvironment({ valueCurrentCommandCategoryFilter });\n if (valueCurrentCommandCategoryFilter == \"\") {\n let valueCurrentCommandFilter = DOM.getElementAttributeValueCurrent(commandFilter);\n Utils.consoleLogIfNotProductionEnvironment({ valueCurrentCommandFilter });\n if (valueCurrentCommandFilter != \"\") {\n let command = filterCommands[valueCurrentCommandFilter];\n idCommandCategory = command[attrIdCommandCategory];\n }\n } else {\n idCommandCategory = Number(valueCurrentCommandCategoryFilter);\n }\n return idCommandCategory;\n }\n getHasCommandCategoryFilter() {\n let idCommandCategoryFilter = this.getIdCommandCategoryFilter();\n return !(Validation.isEmpty(idCommandCategoryFilter) || idCommandCategoryFilter == 0);\n }\n getIdCommandRow(tr) {\n let elementCommand = tr.querySelector('td.' + flagCommand + ' .' + flagCommand);\n return DOM.getElementAttributeValueCurrent(elementCommand);\n }\n getIdCommandFilter() {\n let formFilters = TableBasePage.getFormFilters();\n let commandFilter = formFilters.querySelector('#' + attrIdCommand);\n let valueCurrentCommandFilter = DOM.getElementAttributeValueCurrent(commandFilter);\n let idCommand = Number(valueCurrentCommandFilter);\n return idCommand;\n }\n getHasCommandFilter() {\n let idCommandFilter = this.getIdCommandFilter();\n return !(Validation.isEmpty(idCommandFilter) || idCommandFilter == 0);\n }\n hookupFieldsDog() {\n this.hookupTableCellDdlPreviews(flagDog, Utils.getListFromDict(filterDogs));\n }\n getIdDogRow(tr) {\n let elementDog = tr.querySelector('td.' + flagDog + ' .' + flagDog);\n return DOM.getElementAttributeValueCurrent(elementDog);\n }\n \n createTdActive(isActive) {\n let tdActive = document.createElement(\"td\");\n tdActive.classList.add(flagActive);\n let buttonActive = document.createElement(\"button\");\n buttonActive.classList.add(flagActive);\n buttonActive.classList.add(isActive ? flagDelete : flagAdd);\n buttonActive.textContent = isActive ? 'x' : '+';\n DOM.setElementAttributesValuesCurrentAndPrevious(buttonActive, isActive);\n tdActive.appendChild(buttonActive);\n return tdActive;\n }\n \n leave() {\n if (this.constructor === TableBasePage) {\n throw new Error(\"Must implement leave() method.\");\n }\n super.leave();\n let formFilters = TableBasePage.getFormFilters();\n let dataPage = {};\n dataPage[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n this.setLocalStoragePage(dataPage);\n }\n\n toggleColumnHasClassnameFlag(columnFlag, isRequiredFlag, classnameFlag) {\n let table = TableBasePage.getTableMain();\n let columnTh = table.querySelector('th.' + columnFlag);\n let columnThHasFlag = columnTh.classList.contains(classnameFlag);\n if (isRequiredFlag == columnThHasFlag) return;\n DOM.toggleElementHasClassnameFlag(columnTh, isRequiredFlag, classnameFlag);\n }\n toggleColumnHeaderHasClassnameFlag(columnFlag, isRequiredFlag, classnameFlag) {\n let table = TableBasePage.getTableMain();\n let columnTh = table.querySelector('th.' + columnFlag);\n DOM.toggleElementHasClassnameFlag(columnTh, isRequiredFlag, classnameFlag);\n }\n\n updateAndToggleShowButtonsSaveCancel() {\n let records = this.getTableRecords(true);\n let isDirtyMainTable = records.length > 0;\n\n let formFilters = TableBasePage.getFormFilters();\n let areDirtyFilters = DOM.hasDirtyChildrenContainer(formFilters);\n\n this.toggleShowButtonsSaveCancel(isDirtyMainTable && !areDirtyFilters);\n }\n}\n","\nimport Events from \"../../lib/events.js\";\nimport LocalStorage from \"../../lib/local_storage.js\";\nimport Validation from \"../../lib/validation.js\";\n// import BasePage from \"../base.js\";\nimport DOM from \"../../dom.js\";\nimport { isEmpty } from \"../../lib/utils.js\";\nimport TableBasePage from \"../base_table.js\";\n\nexport default class DogMixinPage {\n constructor(pageCurrent) {\n this.page = pageCurrent;\n }\n\n initialize() {\n Utils.consoleLogIfNotProductionEnvironment('hookup dog start for ', this.page.hash);\n this.hookupFilters();\n this.hookupLocalStorageDog();\n }\n hookupFilters() {\n }\n hookupLocalStorageDog() {\n \n }\n\n /*\n hookupDogCardsProduct() {\n \n let d; // , lsShared;\n let selectorCardProduct = '.card.subcard';\n Events.initialiseEventHandler(selectorCardProduct, flagInitialised, function(cardProduct) {\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"initialising product card: \", cardProduct); }\n cardProduct.addEventListener(\"click\", function(event) {\n // d = { keyIdProduct: product.getAttribute(attrIdProduct) }\n var elemClicked = event.target;\n if (elemClicked.id != 'submit') { // disable for submit buttons\n if (_verbose) { \n Utils.consoleLogIfNotProductionEnvironment(\"product click: \" + cardProduct.getAttribute(attrIdProduct));\n Utils.consoleLogIfNotProductionEnvironment(\"permutation click: \" + cardProduct.getAttribute(attrIdPermutation));\n }\n var d = {}\n d[keyIdProduct] = cardProduct.getAttribute(attrIdProduct)\n d[keyIdPermutation] = cardProduct.getAttribute(attrIdPermutation)\n // send quantity requested\n goToPage(hashPageDogProduct, d);\n }\n });\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"click method added for product ID: \" + cardProduct.getAttribute(attrIdProduct) + ', permutation ID: ', cardProduct.getAttribute(attrIdPermutation)); }\n });\n }\n */\n \n leave() {}\n}\n","\nimport Events from \"../../lib/events.js\";\nimport LocalStorage from \"../../lib/local_storage.js\";\nimport Validation from \"../../lib/validation.js\";\n// import BasePage from \"../base.js\";\nimport DOM from \"../../dom.js\";\nimport { isEmpty } from \"../../lib/utils.js\";\nimport DogMixinPage from \"./mixin.js\";\n\nexport default class DogTableMixinPage extends DogMixinPage {\n constructor(pageCurrent) {\n super(pageCurrent);\n }\n initialize() {\n super.initialize();\n this.hookupFilters();\n this.hookupTable();\n }\n hookupFilters() {\n // Implement filter-specific functionality here\n }\n hookupTable() {\n // Implement table-specific functionality here\n }\n}","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogCommandCategories extends TableBasePage {\n static hash = hashPageDogCommandCategories;\n static attrIdRowObject = attrIdCommandCategory;\n callSaveTableContent = API.saveCommandCategories;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterActive();\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n Utils.consoleLogIfNotProductionEnvironment({ row });\n if (row == null) return;\n let inputCode = row.querySelector('td.' + flagCode + ' .' + flagCode);\n let inputName = row.querySelector('td.' + flagName + ' .' + flagName);\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n \n console.log(\"inputCode\");\n console.log(inputCode);\n\n let jsonRow = {};\n jsonRow[attrIdCommandCategory] = row.getAttribute(attrIdCommandCategory);\n jsonRow[flagCode] = DOM.getElementAttributeValueCurrent(inputCode);\n jsonRow[flagName] = DOM.getElementAttributeValueCurrent(inputName);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n return jsonRow;\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n // let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsCodeTable();\n this.hookupFieldsNameTable();\n this.hookupFieldsActive();\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogCommands extends TableBasePage {\n static hash = hashPageDogCommands;\n static attrIdRowObject = attrIdCommand;\n callSaveTableContent = API.saveCommands;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterCommandCategory();\n this.hookupFilterActive();\n }\n hookupFilterCommandCategory() {\n this.hookupFilter(attrIdCommandCategory);\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n let inputName = row.querySelector('td.' + flagName + ' .' + flagName);\n let inputHandSignalDefaultDescription = row.querySelector('td.' + flagHandSignalDefaultDescription + ' .' + flagHandSignalDefaultDescription);\n let inputCanHaveButton = row.querySelector('td.' + flagCanHaveButton + ' .' + flagCanHaveButton);\n let inputNotes = row.querySelector('td.' + flagNotes + ' .' + flagNotes);\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n\n /*\n Utils.consoleLogIfNotProductionEnvironment({ inputName, inputHandSignalDefaultDescription, inputCanHaveButton, inputNotes, buttonActive });\n debugger;\n */\n\n let jsonRow = {};\n jsonRow[attrIdCommand] = row.getAttribute(attrIdCommand);\n jsonRow[attrIdCommandCategory] = this.getIdCommandCategoryRow(row);\n jsonRow[flagName] = DOM.getElementAttributeValueCurrent(inputName);\n jsonRow[flagHandSignalDefaultDescription] = DOM.getElementAttributeValueCurrent(inputHandSignalDefaultDescription);\n jsonRow[flagCanHaveButton] = (DOM.getElementAttributeValueCurrent(inputCanHaveButton) == \"true\");\n jsonRow[flagNotes] = DOM.getElementAttributeValueCurrent(inputNotes);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n return jsonRow;\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagDog + ' div.' + flagDog\n , ',td.' + flagCommandCategory + ' div.' + flagCommandCategory\n , ',td.' + flagCommand + ' div.' + flagCommand\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsCommandCategory();\n this.hookupFieldsNameTable();\n this.hookupTextareasHandSignalDefaultDescription();\n this.hookupFieldsCanHaveButton();\n this.hookupFieldsNotesTable();\n this.hookupFieldsActive();\n }\n hookupFieldsCommandCategory() {\n this.hookupTableCellDdlPreviews(\n flagCommandCategory\n , Utils.getListFromDict(filterCommandCategories)\n );\n }\n hookupTextareasHandSignalDefaultDescription() {\n this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagHandSignalDefaultDescription + ' .' + flagHandSignalDefaultDescription);\n }\n hookupFieldsCanHaveButton() {\n this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCanHaveButton + ' .' + flagCanHaveButton);\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogDogCommandLinks extends TableBasePage {\n static hash = hashPageDogDogCommandLinks;\n static attrIdRowObject = attrIdDogCommandLink;\n callSaveTableContent = API.saveDogCommandLinks;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterDog();\n this.hookupFilterCommandCategory();\n this.hookupFilterCommand();\n this.hookupFilterActive();\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n let inputHandSignalDescription = row.querySelector('td.' + flagHandSignalDescription + ' textarea');\n let inputNotes = row.querySelector('td.' + flagNotes + ' textarea');\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n\n let jsonRow = {};\n jsonRow[attrIdDogCommandLink] = row.getAttribute(attrIdDogCommandLink);\n jsonRow[attrIdDog] = this.getIdDogRow(row);\n jsonRow[attrIdCommand] = this.getIdCommandRow(row);\n jsonRow[flagHandSignalDescription] = DOM.getElementAttributeValueCurrent(inputHandSignalDescription);\n jsonRow[flagNotes] = DOM.getElementAttributeValueCurrent(inputNotes);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n return jsonRow;\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[newRows.length - 1];\n let clickableElementsSelector = [\n 'td.' + flagDog + ' div.' + flagDog\n , ',td.' + flagCommandCategory + ' div.' + flagCommandCategory\n , ',td.' + flagCommand + ' div.' + flagCommand\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsDog();\n this.hookupFieldsCommandCategory();\n this.hookupFieldsCommand();\n this.hookupTextareasHandSignalDescription();\n this.hookupFieldsNotesTable();\n this.hookupFieldsActive();\n }\n hookupTextareasHandSignalDescription() {\n this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagHandSignalDescription + ' .' + flagHandSignalDescription);\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogLocations extends TableBasePage {\n static hash = hashPageDogLocations;\n static attrIdRowObject = attrIdLocation;\n callSaveTableContent = API.saveLocations;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterActive();\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n let inputName = row.querySelector('td.' + flagName + ' .' + flagName);\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n\n let jsonRow = {};\n jsonRow[attrIdLocation] = row.getAttribute(attrIdLocation);\n jsonRow[flagLocationParent] = this.getIdLocationParentRow(row);\n jsonRow[flagName] = DOM.getElementAttributeValueCurrent(inputName);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n\n console.log(\"jsonRow\");\n console.log(jsonRow);\n\n return jsonRow;\n }\n getIdLocationParentRow(row) {\n let elementLocationParent = row.querySelector('td.' + flagLocationParent + ' .' + flagLocationParent);\n return DOM.getElementAttributeValueCurrent(elementLocationParent);\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagLocationParent + ' div.' + flagLocationParent\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsLocationParent();\n this.hookupFieldsNameTable();\n this.hookupFieldsActive();\n }\n hookupFieldsLocationParent() {\n /*\n this.hookupTableCellDdlPreviews(\n flagLocationParent\n , Utils.getListFromDict(locations).filter(location => \n (\n location[attrIdLocation] == idLocationRow\n || idLocationRow < 1\n )\n ) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n , null // cellSelector\n , (cellSelector) => { this.hookupLocationParentDdls(cellSelector); }\n ,\n );\n\n fieldFlag\n , optionList\n , cellSelector = null\n , ddlHookup = (ddlSelector) => { this.hookupTableCellDdls(ddlSelector); }\n , changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }\n ) {\n\n */\n let cellSelector = idTableMain + ' > tbody > tr > td.' + flagLocationParent;\n this.hookupEventHandler(\"click\", cellSelector + ' div.' + flagLocationParent, (event, div) => {\n let row = DOM.getRowFromElement(div);\n let idLocationRow = Number(row.getAttribute(attrIdLocation));\n Utils.consoleLogIfNotProductionEnvironment({ idLocationRow });\n this.handleClickTableCellDdlPreview(\n event\n , div\n , flagLocationParent\n , Utils.getListFromDict(locations).filter(location => \n (\n location[attrIdLocation] != idLocationRow\n || idLocationRow < 1\n )\n ) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n , cellSelector\n , (ddlSelector) => { this.hookupTableCellDdls(\n ddlSelector\n , (event, element) => { this.handleChangeNestedElementCellTable(event, element); }\n ); }\n );\n });\n this.hookupTableCellDdls(\n cellSelector + ' select.' + flagLocationParent\n , (event, element) => { this.handleChangeNestedElementCellTable(event, element); }\n );\n }\n /*\n hookupLocationParentDdls(ddlSelector) {\n this.hookupChangeHandlerTableCells(ddlSelector, (event, element) => { this.handleChangeNestedElementCellTable(event, element); });\n }\n */\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogButtonIcons extends TableBasePage {\n static hash = hashPageDogButtonIcons;\n static attrIdRowObject = attrIdButtonIcon;\n callSaveTableContent = API.saveButtonIcons;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterActive();\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n let inputName = row.querySelector('td.' + flagName + ' .' + flagName);\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n\n let jsonRow = {};\n jsonRow[attrIdButtonIcon] = row.getAttribute(attrIdButtonIcon);\n jsonRow[flagImage] = this.getIdImageRow(row);\n jsonRow[flagName] = DOM.getElementAttributeValueCurrent(inputName);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n\n console.log(\"jsonRow\");\n console.log(jsonRow);\n\n return jsonRow;\n }\n getIdImageRow(row) {\n let elementImage = row.querySelector('td.' + flagImage + ' .' + flagImage);\n return DOM.getElementAttributeValueCurrent(elementImage);\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagImage + ' div.' + flagImage\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsImage();\n this.hookupFieldsNameTable();\n this.hookupFieldsActive();\n }\n hookupFieldsImage() {\n this.hookupTableCellDdlPreviews(\n flagImage\n , Utils.getListFromDict(buttonicons) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogCommandButtonLinks extends TableBasePage {\n static hash = hashPageDogCommandButtonLinks;\n static attrIdRowObject = attrIdCommandButtonLink;\n callSaveTableContent = API.saveCommandButtonLinks;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterCommandCategory();\n this.hookupFilterCommand();\n this.hookupFilterButtonShape();\n this.hookupFilterColour();\n this.hookupFilterButtonIcon();\n this.hookupFilterLocation();\n this.hookupFilterActive();\n }\n hookupFilterButtonShape() {\n this.hookupFilter(attrIdButtonShape);\n }\n hookupFilterColour() {\n this.hookupFilter(attrIdColour);\n }\n hookupFilterButtonIcon() {\n this.hookupFilter(attrIdButtonIcon);\n }\n hookupFilterLocation() {\n this.hookupFilter(attrIdLocation);\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n let inputHandSignalDescription = row.querySelector('td.' + flagHandSignalDescription + ' textarea');\n let inputNotes = row.querySelector('td.' + flagNotes + ' textarea');\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n\n let jsonRow = {};\n jsonRow[attrIdCommandButtonLink] = row.getAttribute(attrIdCommandButtonLink);\n jsonRow[attrIdDog] = this.getIdDogRow(row);\n jsonRow[attrIdCommand] = this.getIdCommandRow(row);\n jsonRow[flagHandSignalDescription] = DOM.getElementAttributeValueCurrent(inputHandSignalDescription);\n jsonRow[flagNotes] = DOM.getElementAttributeValueCurrent(inputNotes);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n return jsonRow;\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[newRows.length - 1];\n let clickableElementsSelector = [\n 'td.' + flagDog + ' div.' + flagDog\n , ',td.' + flagCommandCategory + ' div.' + flagCommandCategory\n , ',td.' + flagCommand + ' div.' + flagCommand\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsCommandCategory();\n this.hookupFieldsCommand();\n this.hookupFieldsButtonShape();\n this.hookupFieldsColour();\n this.hookupFieldsButtonIcon();\n this.hookupFieldsLocation();\n this.hookupFieldsActive();\n }\n hookupFieldsButtonShape() {\n this.hookupTableCellDdlPreviews(\n flagButtonShape\n , Utils.getListFromDict(filterButtonShapes) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n hookupFieldsColour() {\n this.hookupTableCellDdlPreviews(\n flagColour\n , Utils.getListFromDict(filterColours) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n hookupFieldsButtonIcon() {\n this.hookupTableCellDdlPreviews(\n flagButtonIcon\n , Utils.getListFromDict(filterButtonIcons) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n hookupFieldsLocation() {\n this.hookupTableCellDdlPreviews(\n flagLocation\n , Utils.getListFromDict(filterLocations) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n\n leave() {\n super.leave();\n }\n}\n\n","import BasePage from \"../base.js\";\n\nexport default class PageAccessibilityReport extends BasePage {\n static hash = hashPageAccessibilityReport;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n leave() {\n super.leave();\n }\n}\n","import BasePage from \"../base.js\";\n\nexport default class PageAccessibilityStatement extends BasePage {\n static hash = hashPageAccessibilityStatement;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n leave() {\n super.leave();\n }\n}\n","\nimport BasePage from \"../base.js\";\n\nexport default class PageLicense extends BasePage {\n static hash = hashPageLicense;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n leave() {\n super.leave();\n }\n}","\nimport BasePage from \"../base.js\";\n\nexport default class PagePrivacyPolicy extends BasePage {\n static hash = hashPagePrivacyPolicy;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n leave() {\n super.leave();\n }\n}","import BasePage from \"../base.js\";\n\nexport default class PageRetentionSchedule extends BasePage {\n static hash = hashPageDataRetentionSchedule;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n leave() {\n super.leave();\n }\n}\n","\n// Pages\n// Core\nimport PageHome from './pages/core/home.js';\n// Dog\nimport PageDogHome from './pages/dog/home.js';\nimport PageDogCommandCategories from './pages/dog/command_categories.js';\nimport PageDogCommands from './pages/dog/commands.js';\nimport PageDogDogCommandLinks from './pages/dog/dog_command_links.js';\n// import PageDogDogs from './pages/dog/dogs.js';\nimport PageDogLocations from './pages/dog/locations.js';\nimport PageDogButtonIcons from './pages/dog/button_icons.js';\nimport PageDogCommandButtonLinks from './pages/dog/command_button_links.js';\n// Legal\nimport PageAccessibilityReport from './pages/legal/accessibility_report.js';\nimport PageAccessibilityStatement from './pages/legal/accessibility_statement.js';\nimport PageLicense from './pages/legal/license.js';\nimport PagePrivacyPolicy from './pages/legal/privacy_policy.js';\nimport PageRetentionSchedule from './pages/legal/retention_schedule.js';\n// User\n// import PageUserLogin from './pages/user/login.js';\n// import PageUserLogout from './pages/user/logout.js';\n// import PageUserAccount from './pages/user/account.js';\n\nimport API from './api.js';\nimport DOM from './dom.js';\nimport Utils from './lib/utils.js';\n\n\nexport default class Router {\n constructor() {\n // Pages\n this.pages = {};\n // Core\n this.pages[hashPageHome] = { name: 'PageHome', module: PageHome };\n // Dog\n this.pages[hashPageDogHome] = { name: 'PageDogHome', module: PageDogHome };\n this.pages[hashPageDogCommandCategories] = { name: 'PageDogCommands', module: PageDogCommandCategories };\n this.pages[hashPageDogCommands] = { name: 'PageDogCommands', module: PageDogCommands };\n this.pages[hashPageDogDogCommandLinks] = { name: 'PageDogDogCommandLinks', module: PageDogDogCommandLinks };\n // this.pages[hashPageDogDogs] = { name: 'PageDogDogs', module: PageDogDogs };\n this.pages[hashPageDogLocations] = { name: 'PageDogLocations', module: PageDogLocations };\n this.pages[hashPageDogButtonIcons] = { name: 'PageDogButtonIcons', module: PageDogButtonIcons };\n this.pages[hashPageDogCommandButtonLinks] = { name: 'PageDogCommandButtonLinks', module: PageDogCommandButtonLinks };\n // Legal\n this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', module: PageAccessibilityStatement };\n this.pages[hashPageDataRetentionSchedule] = { name: 'PageDataRetentionSchedule', module: PageRetentionSchedule };\n this.pages[hashPageLicense] = { name: 'PageLicense', module: PageLicense };\n this.pages[hashPagePrivacyPolicy] = { name: 'PagePrivacyPolicy', module: PagePrivacyPolicy };\n // User\n // this.pages[hashPageUserLogin] = { name: 'PageUserLogin', module: PageUserLogin }; // pathModule: './pages/user/login.js' };\n // this.pages[hashPageUserLogout] = { name: 'PageUserLogout', module: PageUserLogout }; // pathModule: './pages/user/logout.js' };\n // this.pages[hashPageUserAccount] = { name: 'PageUserAccount', module: PageUserAccount }; // pathModule: './pages/user/account.js' };\n // Routes\n this.routes = {};\n // Core\n this.routes[hashPageHome] = (isPopState = false) => this.navigateToHash(hashPageHome, isPopState);\n // Dog\n this.routes[hashPageDogHome] = (isPopState = false) => this.navigateToHash(hashPageDogHome, isPopState);\n this.routes[hashPageDogCommandCategories] = (isPopState = false) => this.navigateToHash(hashPageDogCommandCategories, isPopState);\n this.routes[hashPageDogCommands] = (isPopState = false) => this.navigateToHash(hashPageDogCommands, isPopState);\n this.routes[hashPageDogDogCommandLinks] = (isPopState = false) => this.navigateToHash(hashPageDogDogCommandLinks, isPopState);\n // this.routes[hashPageDogDogs] = (isPopState = false) => this.navigateToHash(hashPageDogDogs, isPopState);\n this.routes[hashPageDogLocations] = (isPopState = false) => this.navigateToHash(hashPageDogLocations, isPopState);\n this.routes[hashPageDogButtonIcons] = (isPopState = false) => this.navigateToHash(hashPageDogButtonIcons, isPopState);\n this.routes[hashPageDogCommandButtonLinks] = (isPopState = false) => this.navigateToHash(hashPageDogCommandButtonLinks, isPopState);\n // Legal\n this.routes[hashPageAccessibilityStatement] = (isPopState = false) => this.navigateToHash(hashPageAccessibilityStatement, isPopState);\n this.routes[hashPageDataRetentionSchedule] = (isPopState = false) => this.navigateToHash(hashPageDataRetentionSchedule, isPopState);\n this.routes[hashPageLicense] = (isPopState = false) => this.navigateToHash(hashPageLicense, isPopState);\n this.routes[hashPagePrivacyPolicy] = (isPopState = false) => this.navigateToHash(hashPagePrivacyPolicy, isPopState);\n // User\n // this.routes[hashPageUserLogin] = (isPopState = false) => this.navigateToHash(hashPageUserLogin, isPopState);\n // this.routes[hashPageUserLogout] = (isPopState = false) => this.navigateToHash(hashPageUserLogout, isPopState);\n // this.routes[hashPageUserAccount] = (isPopState = false) => this.navigateToHash(hashPageUserAccount, isPopState);\n this.initialize();\n }\n loadPage(hashPage, isPopState = false) {\n const PageClass = this.getClassPageFromHash(hashPage);\n this.currentPage = new PageClass(this);\n this.currentPage.initialize(isPopState);\n window.addEventListener('beforeunload', () => this.currentPage.leave());\n }\n getClassPageFromHash(hashPage) {\n \n let pageJson = this.pages[hashPage];\n try {\n const module = pageJson.module;\n return module; \n }\n catch (error) {\n Utils.consoleLogIfNotProductionEnvironment(\"this.pages: \", this.pages);\n console.error('Page not found:', hashPage);\n throw error;\n }\n }\n initialize() {\n window.addEventListener('popstate', this.handlePopState.bind(this));\n }\n handlePopState(event) {\n this.loadPageCurrent();\n }\n loadPageCurrent() {\n const hashPageCurrent = DOM.getHashPageCurrent();\n this.loadPage(hashPageCurrent);\n }\n navigateToHash(hash, data = null, params = null, isPopState = false) {\n let url = API.getUrlFromHash(hash, params);\n history.pushState({data: data, params: params}, '', hash);\n API.goToUrl(url, data);\n }\n \n navigateToUrl(url, data = null, appendHistory = true) {\n // this.beforeLeave();\n if (appendHistory) history.pushState(data, '', url);\n url = API.parameteriseUrl(url, data);\n API.goToUrl(url);\n }\n\n static loadPageBodyFromResponse(response) {\n DOM.loadPageBody(response.data);\n }\n}\n\nexport const router = new Router();\n","\n'use strict';\n\nimport DOM from './dom.js';\nimport Router from './router.js';\n\n\nclass App {\n constructor() {\n this.dom = new DOM();\n this.router = new Router();\n }\n\n initialize() {\n this.setupEventListeners();\n this.start();\n }\n\n setupEventListeners() {\n // document.addEventListener('click', this.handleGlobalClick.bind(this));\n }\n\n handleGlobalClick(event) {\n }\n\n start() {\n this.initPageCurrent();\n }\n\n initPageCurrent() {\n this.router.loadPageCurrent();\n }\n \n}\n\nconst app = new App();\n\nfunction domReady(fn) {\n if (document.readyState !== 'loading') {\n fn();\n } else {\n document.addEventListener('DOMContentLoaded', fn);\n }\n}\n\ndomReady(() => {\n app.initialize();\n});\n\nwindow.app = app;\n\nexport default app;","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":["Validation","_classCallCheck","_createClass","key","value","isEmpty","object","undefined","length","isString","trim","i","isValidNumber","positiveOnly","isNaN","parseFloat","getDataContentType","params","data","contentType","JSON","stringify","Data","ContentType","arrayContainsItem","array","itemValue","hasItem","isJQueryElementArray","jQuery","document","querySelectorAll","is","isDate","Date","getTime","dictHasKey","d","k","areEqualDicts","dict1","dict2","keys1","Object","keys","keys2","_i3","_keys","imageExists","url","callback","img","Image","onload","onerror","src","toFixedOrDefault","decimalPlaces","defaultValue","arguments","toFixed","default","Utils","DOM","setElementAttributesValuesCurrentAndPrevious","element","setElementAttributeValueCurrent","setElementAttributeValuePrevious","setAttribute","attrValueCurrent","attrValuePrevious","setElementValuesCurrentAndPrevious","setElementValueCurrent","tagName","toUpperCase","type","checked","textContent","setElementValueCurrentIfEmpty","getElementValueCurrent","getCellFromElement","closest","getRowFromElement","flagRow","selector","getClosestParent","parentSelector","parent","parentElement","matches","convertForm2JSON","elementForm","dataForm","containersFilter","flagContainerInput","flagFilter","containerFilter","labelFilter","keyFilter","filter","indexFilter","querySelector","getAttribute","concat","loadPageBody","contentNew","pageBody","idPageBody","innerHTML","getHashPageCurrent","hashPageCurrent","body","dataset","page","updateAndCheckIsElementDirty","isElementDirty","isDirty","handleDirtyElement","toggleElementHasClassnameFlag","flagDirty","elementHasFlag","flag","elementAlreadyHasFlag","classList","contains","add","remove","hasDirtyChildrenContainer","container","hasDirtyChildrenNotDeletedContainer","flagDelete","returnVal","flagButton","flagActive","getElementAttributeValueCurrent","flagCheckbox","flagIsChecked","getElementAttributeValuePrevious","scrollToElement","scrollTop","offset","top","isElementInContainer","containerBounds","getBoundingClientRect","elementBounds","left","height","width","alertError","errorType","errorText","alert","createOptionUnselectedProductVariation","_defineProperty","flagProductVariationType","flagNameAttrOptionText","flagName","flagNameAttrOptionValue","attrIdProductVariationType","flagProductVariation","attrIdProductVariation","createOption","optionJson","text","option","createElement","selected","escapeHtml","div","unescapeHtml","html","innerText","Events","initialiseEventHandler","selectorElement","classInitialised","eventHandler","forEach","LocalStorage","getLocalStorage","parse","localStorage","getItem","setLocalStorage","newLS","setItem","_regeneratorRuntime","e","t","r","prototype","n","hasOwnProperty","o","defineProperty","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","getPrototypeOf","v","values","g","defineIteratorMethods","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptor","apply","_objectSpread","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","asyncGeneratorStep","_asyncToGenerator","_next","_throw","_defineProperties","_toPrimitive","toPrimitive","String","Number","API","getCsrfToken","idCSRFToken","_request","_callee","hashEndpoint","csrfToken","options","response","_args","_callee$","_context","getUrlFromHash","headers","flagCsrfToken","fetch","ok","status","json","t0","console","error","request","_x","hash","hashPageHome","parameteriseUrl","_pathHost","URLSearchParams","toString","goToUrl","window","location","href","goToHash","_loginUser","_callee2","_callee2$","_context2","flagCallback","hashPageUserLogin","loginUser","_saveCommandCategories","_callee3","commandCategories","formFilters","comment","dataRequest","_callee3$","_context3","flagFormFilters","flagCommandCategory","flagComment","hashSaveDogCommandCategory","saveCommandCategories","_x2","_x3","_x4","_saveCommands","_callee4","commands","_callee4$","_context4","flagCommand","hashSaveDogCommand","saveCommands","_x5","_x6","_x7","_saveDogCommandLinks","_callee5","dogCommandLinks","_callee5$","_context5","flagDogCommandLink","hashSaveDogDogCommandLink","saveDogCommandLinks","_x8","_x9","_x10","_saveLocations","_callee6","locations","_callee6$","_context6","flagLocation","hashSaveDogLocation","saveLocations","_x11","_x12","_x13","_saveButtonIcons","_callee7","buttonIcons","_callee7$","_context7","flagButtonIcon","hashSaveDogButtonIcon","saveButtonIcons","_x14","_x15","_x16","_saveCommandButtonLinks","_callee8","links","_callee8$","_context8","flagCommandButtonLink","hashSaveDogCommandButtonLink","saveCommandButtonLinks","_x17","_x18","_x19","getListFromDict","dict","list","consoleLogIfNotProductionEnvironment","message","environment","is_production","log","OverlayConfirm","hookup","callbackSuccess","idOverlayConfirm","flagCancel","flagInitialised","buttonCancel","addEventListener","overlay","style","visibility","flagSubmit","buttonConfirm","textarea","show","flagIsCollapsed","BusinessObjects","OverlayError","BasePage","router","title","titlePageCurrent","initialize","sharedInitialize","logInitialisation","hookupCommonElements","hookupLogos","hookupNavigation","hookupOverlays","hookupEventHandler","eventType","event","stopPropagation","idButtonHamburger","overlayHamburger","idOverlayHamburger","flagExpanded","hookupButtonsNavHome","hookupButtonsNavUserAccount","hookupButtonsNavUserLogout","hookupButtonsNavUserLogin","hookupButtonsNavDogHome","hookupButtonsNavDogCommandCategories","hookupButtonsNavDogCommands","hookupButtonsNavDogDogCommandLinks","hookupButtonsNavDogDogs","hookupButtonsNavDogLocations","hookupButtonsNavDogButtonIcons","hookupButtonsNavDogCommandButtonLinks","hookupButtonsNav","flagNavHome","buttonSelector","hashPageNav","_this","button","navigateToHash","flagNavUserAccount","hashPageUserAccount","flagNavUserLogout","hashPageUserLogout","_this2","flagNavUserLogin","navigator","leave","Success","Message","flagNavDogHome","hashPageDogHome","flagNavDogCommandCategories","hashPageDogCommandCategories","flagNavDogCommands","hashPageDogCommands","flagNavDogDogCommandLinks","hashPageDogDogCommandLinks","flagNavDogDogs","hashPageDogDogs","flagNavDogLocations","hashPageDogLocations","flagNavDogButtonIcons","hashPageDogButtonIcons","flagNavDogCommandButtonLinks","hashPageDogCommandButtonLinks","_this3","flagImageLogo","flagLogo","hookupOverlayFromId","idOverlayError","idOverlay","display","hookupButtonSave","_this4","flagSave","target","setLocalStoragePage","dataPage","getLocalStoragePage","toggleShowButtonsSaveCancel","buttonSave","isDirtyFilter","idTableMain","PageHome","_BasePage","_callSuper","_inherits","_superPropGet","PageDogHome","hookupDogHome","getOptionJsonFromObjectJsonAndKeys","objectJson","keyText","keyValue","valueSelected","getOptionJsonFromObjectJson","getObjectText","getListObjectsFromIdDictAndCsv","idDict","idCsv","listObjects","ids","split","_iterator","_createForOfIteratorHelper","_step","id","err","msgError","labelError","idLabelError","TableBasePage","cursorYInitial","rowInitial","placeholder","dragSrcEl","dragSrcRow","hookupTableCellDdls","bind","isPopState","isSinglePageApp","hookupFilters","hookupButtonsSaveCancel","hookupTableMain","saveRecordsTableDirtySinglePageApp","saveRecordsTableDirty","filters","getFormFilters","filtersDefault","callFilterTableContent","sharedHookupFilters","hookupButtonApplyFilters","hookupSearchTextFilter","hookupFilterActive","filterSelector","idFormFilters","flagActiveOnly","filterActiveOld","removeAttribute","parentDiv","isChecked","filterActiveNew","filterActive","svgElement","wasChecked","handleChangeFilter","filterValuePrevious","hookupFilter","filterFlag","handler","areDirtyFilters","tbody","rows","row","dirtyInputs","dirtyInput","isDirtyLabel","initialisedElements","initialisedElement","updateAndToggleShowButtonsSaveCancel","hookupFilterIsNotEmpty","flagIsNotEmpty","_this5","idButtonApplyFilters","flagSearch","hookupFilterDog","attrIdDog","hookupFilterCommandCategory","_this6","attrIdCommandCategory","filterCommandCategory","idCommandCategory","filterCommands","commandsInCategory","command","sortedCommands","sort","b","localeCompare","filterCommand","idCommandPrevious","appendChild","dispatchEvent","Event","hookupFilterCommand","attrIdCommand","filtersJson","callbackLoadTableContent","table","getTableMain","bodyTable","rowsJson","flagRows","every","display_order","loadRowTable","rowJson","getAndLoadFilteredTableContentSinglePageApp","_this7","hookupButtonCancel","_this8","records","getTableRecords","formElement","idTextareaConfirm","callSaveTableContent","flagStatus","flagSuccess","_verbose","flagMessage","_this9","dirtyOnly","record","getJsonRow","_this10","_this11","handleClickAddRowTable","_rowBlank","attrIdRowObject","cloneNode","countRows","initialiseRowNew","prepend","postInitialiseRowNewCallback","_this12","cacheRowBlank","selectorRowNew","flagRowNew","rowBlankTemp","initialiseSliderDisplayOrderRowNew","slidersDisplayOrder","flagDisplayOrder","flagSlider","maxDisplayOrder","slider","Math","max","sliderDisplayOrder","hookupSlidersDisplayOrderTable","selectorDisplayOrder","hookupChangeHandlerTableCells","inputSelector","_this13","handleChangeNestedElementCellTable","input","wasDirtyParentRows","getAllIsDirtyRowsInParentTree","wasDirtyElement","isDirtyElement","cascadeChangedIsDirtyNestedElementCellTable","tr","isDirtyRow","wasDirtyRow","shift","hookupChangeHandlerTableCellsWhenNotCollapsed","_this14","hookupFieldsCodeTable","flagCode","hookupFieldsNameTable","hookupFieldsDescriptionTable","flagDescription","hookupFieldsNotesTable","flagNotes","hookupFieldsActive","_this15","flagTable","handleClickRowNew","selectorButton","selectorButtonDelete","selectorButtonUndelete","hookupButtonsRowDelete","hookupButtonsRowUndelete","_this16","changeHandler","handleClickButtonRowDelete","changeEvent","changeElement","_this17","valuePrevious","wasDirty","parentNode","removeChild","buttonAddTemplate","idContainerTemplateElements","flagAdd","buttonAdd","replaceWith","_this18","handleClickButtonRowUndelete","_this19","buttonDeleteTemplate","buttonDelete","hookupTdsAccessLevel","hookupTableCellDdlPreviews","flagAccessLevel","accessLevels","fieldFlag","optionList","_this20","cellSelector","ddlHookup","ddlSelector","handleClickTableCellDdlPreview","_this21","optionObjectList","_this22","idSelected","td","ddl","optionObjectJson","toggleColumnCollapsed","flagColumn","isCollapsed","toggleColumnHasClassnameFlag","toggleColumnHeaderCollapsed","hookupFieldsCommandCategory","_this23","filterCommandCategories","hookupCommandCategoryDdls","_this24","handleChangeCommandCategoryDdl","ddlCategory","idCommandCategoryRowOld","getIdCommandCategoryRow","idCommandCategoryRowNew","idCommandCategoryFilter","getIdCommandCategoryFilter","tdCommand","ddlCommand","hookupFieldsCommand","_this25","parentTr","tdCommandCategory","idCommandCategoryRow","filterCommandList","elementCommandCategory","commandCategoryFilter","commandFilter","valueCurrentCommandCategoryFilter","valueCurrentCommandFilter","getHasCommandCategoryFilter","getIdCommandRow","elementCommand","getIdCommandFilter","idCommand","getHasCommandFilter","idCommandFilter","hookupFieldsDog","flagDog","filterDogs","getIdDogRow","elementDog","createTdActive","isActive","tdActive","buttonActive","columnFlag","isRequiredFlag","classnameFlag","columnTh","columnThHasFlag","toggleColumnHeaderHasClassnameFlag","isDirtyMainTable","DogMixinPage","pageCurrent","hookupLocalStorageDog","DogTableMixinPage","_DogMixinPage","hookupTable","PageDogCommandCategories","_TableBasePage","dogMixin","inputCode","inputName","jsonRow","PageDogCommands","inputHandSignalDefaultDescription","flagHandSignalDefaultDescription","inputCanHaveButton","flagCanHaveButton","inputNotes","newRows","newestRow","clickableElementsSelector","join","clickableElement","click","hookupTextareasHandSignalDefaultDescription","hookupFieldsCanHaveButton","PageDogDogCommandLinks","inputHandSignalDescription","flagHandSignalDescription","attrIdDogCommandLink","hookupTextareasHandSignalDescription","PageDogLocations","attrIdLocation","flagLocationParent","getIdLocationParentRow","elementLocationParent","hookupFieldsLocationParent","idLocationRow","PageDogButtonIcons","attrIdButtonIcon","flagImage","getIdImageRow","elementImage","hookupFieldsImage","buttonicons","PageDogCommandButtonLinks","hookupFilterButtonShape","hookupFilterColour","hookupFilterButtonIcon","hookupFilterLocation","attrIdButtonShape","attrIdColour","attrIdCommandButtonLink","hookupFieldsButtonShape","hookupFieldsColour","hookupFieldsButtonIcon","hookupFieldsLocation","flagButtonShape","filterButtonShapes","flagColour","filterColours","filterButtonIcons","filterLocations","PageAccessibilityReport","hashPageAccessibilityReport","PageAccessibilityStatement","hashPageAccessibilityStatement","PageLicense","hashPageLicense","PagePrivacyPolicy","hashPagePrivacyPolicy","PageRetentionSchedule","hashPageDataRetentionSchedule","Router","pages","module","routes","loadPage","hashPage","PageClass","getClassPageFromHash","currentPage","pageJson","handlePopState","loadPageCurrent","history","pushState","navigateToUrl","appendHistory","loadPageBodyFromResponse","App","dom","setupEventListeners","start","handleGlobalClick","initPageCurrent","app","domReady","fn","readyState"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/main.bundle.js","mappings":";;;;;;;;;;;;;;IACqBA,UAAU;EAAA,SAAAA,WAAA;IAAAC,eAAA,OAAAD,UAAA;EAAA;EAAA,OAAAE,YAAA,CAAAF,UAAA;IAAAG,GAAA;IAAAC,KAAA;IAC3B;AACJ;AACA;AACA;AACA;AACA;;IAEI,SAAOC,OAAOA,CAACC,MAAM,EAAE;MAEnB,IAAID,OAAO,GAAG,IAAI;MAElB,IAAIC,MAAM,KAAK,IAAI,IAAIA,MAAM,KAAK,MAAM,IAAIA,MAAM,KAAKC,SAAS,IAAID,MAAM,KAAK,WAAW,EAAE;QAExF,IAAIA,MAAM,CAACE,MAAM,IAAID,SAAS,EAAE;UAC5BF,OAAO,GAAG,KAAK,CAAC,CAAC;QACrB,CAAC,MACI,IAAI,OAAOC,MAAM,KAAK,UAAU,EAAE;UACnCD,OAAO,GAAG,KAAK,CAAC,CAAC;QACrB,CAAC,MACI;UAAE;;UAEH,IAAII,QAAQ,GAAI,OAAOH,MAAM,IAAI,QAAS;UAE1C,IAAIG,QAAQ,EAAEH,MAAM,GAAGA,MAAM,CAACI,IAAI,CAAC,CAAC;UAEpC,IAAIJ,MAAM,CAACE,MAAM,GAAG,CAAC,EAAE;YAEnB,IAAIC,QAAQ,EAAE;cACVJ,OAAO,GAAG,KAAK,CAAC,CAAC;YACrB,CAAC,MACI;cAED,IAAI,OAAOC,MAAM,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE;gBAC9BD,OAAO,GAAG,KAAK;cACnB,CAAC,MACI;gBACD,KAAI,IAAIM,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,MAAM,CAACE,MAAM,EAAEG,CAAC,EAAE,EAAE;kBACnC,IAAIL,MAAM,CAACK,CAAC,CAAC,IAAI,EAAE,EAAE;oBACjBN,OAAO,GAAG,KAAK;oBACf;kBACJ;gBACJ;cACJ;YACJ;UACJ;QACJ;MACJ;MAEA,OAAOA,OAAO;IAClB;EAAC;IAAAF,GAAA;IAAAC,KAAA,EAED,SAAOQ,aAAaA,CAACR,KAAK,EAAES,YAAY,EAAE;MACtC,OAAO,CAACb,UAAU,CAACK,OAAO,CAACD,KAAK,CAAC,IAAI,CAACU,KAAK,CAACV,KAAK,CAAC,KAAK,CAACS,YAAY,IAAIE,UAAU,CAACX,KAAK,CAAC,GAAG,CAAC,CAAC;IAClG;EAAC;IAAAD,GAAA;IAAAC,KAAA,EAED,SAAOY,kBAAkBA,CAACC,MAAM,EAAE;MAE9B,IAAIC,IAAI,GAAG,IAAI;MACf,IAAIC,WAAW,GAAG,EAAE;MAEpB,IAAI,CAACnB,UAAU,CAACK,OAAO,CAACY,MAAM,CAAC,EAAE;QAE7B,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE;UAC5BC,IAAI,GAAGD,MAAM;UACbE,WAAW,GAAG,kDAAkD;QACpE,CAAC,MACI;UACDD,IAAI,GAAGE,IAAI,CAACC,SAAS,CAACJ,MAAM,CAAC;UAC7BE,WAAW,GAAG,iCAAiC;QACnD;MACJ;MAEA,OAAO;QAAEG,IAAI,EAAEJ,IAAI;QAAEK,WAAW,EAAEJ;MAAY,CAAC;IACnD;EAAC;IAAAhB,GAAA;IAAAC,KAAA,EAED,SAAOoB,iBAAiBA,CAACC,KAAK,EAAEC,SAAS,EAAE;MAEvC,IAAIC,OAAO,GAAG,KAAK;MAEnB,IAAI,CAAC3B,UAAU,CAACK,OAAO,CAACoB,KAAK,CAAC,IAAI,CAACzB,UAAU,CAACK,OAAO,CAACqB,SAAS,CAAC,EAAE;QAE9D,IAAIE,oBAAoB,GAAGH,KAAK,CAAC,CAAC,CAAC,YAAYI,MAAM;QAErD,IAAID,oBAAoB,EAAE;UAEtB,KAAK,IAAIjB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGc,KAAK,CAACjB,MAAM,EAAEG,CAAC,EAAE,EAAE;YAEnC,IAAImB,QAAQ,CAACC,gBAAgB,CAACN,KAAK,CAACd,CAAC,CAAC,CAAC,CAACqB,EAAE,CAACN,SAAS,CAAC,EAAE;cACnDC,OAAO,GAAG,IAAI;cACd;YACJ;UACJ;QACJ,CAAC,MACI;UAED,IAAIM,MAAM,GAAGR,KAAK,CAAC,CAAC,CAAC,YAAYS,IAAI;UAErC,IAAID,MAAM,EAAE;YAER,KAAK,IAAItB,EAAC,GAAG,CAAC,EAAEA,EAAC,GAAGc,KAAK,CAACjB,MAAM,EAAEG,EAAC,EAAE,EAAE;cAEnC,IAAIc,KAAK,CAACd,EAAC,CAAC,CAACwB,OAAO,CAAC,CAAC,KAAKT,SAAS,CAACS,OAAO,CAAC,CAAC,EAAE;gBAC5CR,OAAO,GAAG,IAAI;gBACd;cACJ;YACJ;UACJ,CAAC,MACI;YAED,KAAK,IAAIhB,GAAC,GAAG,CAAC,EAAEA,GAAC,GAAGc,KAAK,CAACjB,MAAM,EAAEG,GAAC,EAAE,EAAE;cAEnC,IAAIc,KAAK,CAACd,GAAC,CAAC,IAAIe,SAAS,EAAE;gBACvBC,OAAO,GAAG,IAAI;gBACd;cACJ;YACJ;UACJ;QACJ;MACJ;MAEA,OAAOA,OAAO;IAClB;EAAC;IAAAxB,GAAA;IAAAC,KAAA,EAED,SAAOgC,UAAUA,CAACC,CAAC,EAAEC,CAAC,EAAE;MACpB,OAAQA,CAAC,IAAID,CAAC;IAClB;EAAC;IAAAlC,GAAA;IAAAC,KAAA,EACD,SAAOmC,aAAaA,CAACC,KAAK,EAAEC,KAAK,EAAE;MAC/B,IAAMC,KAAK,GAAGC,MAAM,CAACC,IAAI,CAACJ,KAAK,CAAC;MAChC,IAAMK,KAAK,GAAGF,MAAM,CAACC,IAAI,CAACH,KAAK,CAAC;MAEhC,IAAIC,KAAK,CAAClC,MAAM,KAAKqC,KAAK,CAACrC,MAAM,EAAE;QACnC,OAAO,KAAK;MACZ;MAEA,SAAAsC,GAAA,MAAAC,KAAA,GAAgBL,KAAK,EAAAI,GAAA,GAAAC,KAAA,CAAAvC,MAAA,EAAAsC,GAAA,IAAE;QAAlB,IAAI3C,GAAG,GAAA4C,KAAA,CAAAD,GAAA;QACZ,IAAIN,KAAK,CAACrC,GAAG,CAAC,KAAKsC,KAAK,CAACtC,GAAG,CAAC,EAAE;UAC3B,OAAO,KAAK;QAChB;MACA;MAEA,OAAO,IAAI;IACf;EAAC;IAAAA,GAAA;IAAAC,KAAA,EAED,SAAO4C,WAAWA,CAACC,GAAG,EAAEC,QAAQ,EAAE;MAE9B,IAAIC,GAAG,GAAG,IAAIC,KAAK,CAAC,CAAC;MAErBD,GAAG,CAACE,MAAM,GAAG,YAAW;QAAEH,QAAQ,CAAC,IAAI,CAAC;MAAE,CAAC;MAC3CC,GAAG,CAACG,OAAO,GAAG,YAAW;QAAEJ,QAAQ,CAAC,KAAK,CAAC;MAAE,CAAC;MAC7CC,GAAG,CAACI,GAAG,GAAGN,GAAG;IACjB;EAAC;IAAA9C,GAAA;IAAAC,KAAA,EAED,SAAOoD,gBAAgBA,CAACpD,KAAK,EAAEqD,aAAa,EAAuB;MAAA,IAArBC,YAAY,GAAAC,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MAC7D,OAAO3D,UAAU,CAACY,aAAa,CAACR,KAAK,CAAC,GAAGW,UAAU,CAACX,KAAK,CAAC,CAACwD,OAAO,CAACH,aAAa,CAAC,GAAGC,YAAY;IACpG;EAAC;AAAA;;;;;;;;;;AC3J8B;AACU;AAAA,IAExBK,GAAG;EAAA,SAAAA,IAAA;IAAA9D,kBAAA,OAAA8D,GAAA;EAAA;EAAA,OAAA7D,eAAA,CAAA6D,GAAA;IAAA5D,GAAA;IAAAC,KAAA,EACpB,SAAO4D,4CAA4CA,CAACC,OAAO,EAAE/C,IAAI,EAAE;MAC/D6C,GAAG,CAACG,+BAA+B,CAACD,OAAO,EAAE/C,IAAI,CAAC;MAClD6C,GAAG,CAACI,gCAAgC,CAACF,OAAO,EAAE/C,IAAI,CAAC;IACvD;EAAC;IAAAf,GAAA;IAAAC,KAAA,EACD,SAAO8D,+BAA+BA,CAACD,OAAO,EAAE/C,IAAI,EAAE;MAClD+C,OAAO,CAACG,YAAY,CAACC,gBAAgB,EAAEnD,IAAI,CAAC;IAChD;EAAC;IAAAf,GAAA;IAAAC,KAAA,EACD,SAAO+D,gCAAgCA,CAACF,OAAO,EAAE/C,IAAI,EAAE;MACnD+C,OAAO,CAACG,YAAY,CAACE,iBAAiB,EAAEpD,IAAI,CAAC;IACjD;EAAC;IAAAf,GAAA;IAAAC,KAAA,EACD,SAAOmE,kCAAkCA,CAACN,OAAO,EAAE/C,IAAI,EAAE;MACrD6C,GAAG,CAACS,sBAAsB,CAACP,OAAO,EAAE/C,IAAI,CAAC;MACzC6C,GAAG,CAACI,gCAAgC,CAACF,OAAO,EAAE/C,IAAI,CAAC;IACvD;EAAC;IAAAf,GAAA;IAAAC,KAAA,EACD,SAAOoE,sBAAsBA,CAACP,OAAO,EAAE/C,IAAI,EAAE;MACzC6C,GAAG,CAACG,+BAA+B,CAACD,OAAO,EAAE/C,IAAI,CAAC;MAClD,IAAIuD,OAAO,GAAGR,OAAO,CAACQ,OAAO,CAACC,WAAW,CAAC,CAAC;MAC3C,IAAIT,OAAO,CAACU,IAAI,KAAK,UAAU,EAAE;QAC7BV,OAAO,CAACW,OAAO,GAAG1D,IAAI;MAC1B,CAAC,MACI,IAAIuD,OAAO,KAAK,OAAO,IAAIA,OAAO,KAAK,UAAU,IAAIA,OAAO,KAAK,QAAQ,EAAE;QAC5ER,OAAO,CAAC7D,KAAK,GAAGc,IAAI;MACxB,CAAC,MACI;QACD+C,OAAO,CAACY,WAAW,GAAG3D,IAAI;MAC9B;IACJ;EAAC;IAAAf,GAAA;IAAAC,KAAA,EACD,SAAO0E,6BAA6BA,CAACb,OAAO,EAAE/C,IAAI,EAAE;MAChD,IAAIlB,UAAU,CAACK,OAAO,CAAC0D,GAAG,CAACgB,sBAAsB,CAACd,OAAO,CAAC,CAAC,EAAE;QACzDF,GAAG,CAACS,sBAAsB,CAACP,OAAO,EAAE/C,IAAI,CAAC;MAC7C;IACJ;EAAC;IAAAf,GAAA;IAAAC,KAAA,EACD,SAAO4E,kBAAkBA,CAACf,OAAO,EAAE;MAC/B,OAAOA,OAAO,CAACgB,OAAO,CAAC,IAAI,CAAC;IAChC;EAAC;IAAA9E,GAAA;IAAAC,KAAA,EACD,SAAO8E,iBAAiBA,CAACjB,OAAO,EAAEkB,OAAO,EAAE;MACvC,IAAIC,QAAQ,GAAGpF,UAAU,CAACK,OAAO,CAAC8E,OAAO,CAAC,GAAG,IAAI,GAAG,KAAK,GAAGA,OAAO;MACnE,OAAOlB,OAAO,CAACgB,OAAO,CAACG,QAAQ,CAAC;IACpC;EAAC;IAAAjF,GAAA;IAAAC,KAAA,EACD,SAAOiF,gBAAgBA,CAACpB,OAAO,EAAEqB,cAAc,EAAE;MAC7C,IAAIC,MAAM,GAAGtB,OAAO,CAACuB,aAAa;MAClC,OAAOD,MAAM,EAAE;QACX,IAAIA,MAAM,CAACE,OAAO,CAACH,cAAc,CAAC,EAAE;UAChC,OAAOC,MAAM;QACjB;QACAA,MAAM,GAAGA,MAAM,CAACC,aAAa;MACjC;MACA,OAAO,IAAI;IACb;EAAC;IAAArF,GAAA;IAAAC,KAAA,EACH,SAAOsF,gBAAgBA,CAACC,WAAW,EAAE;MACjC,IAAIC,QAAQ,GAAG,CAAC,CAAC;MACjB,IAAI5F,UAAU,CAACK,OAAO,CAACsF,WAAW,CAAC,EAAE;QACjC,OAAOC,QAAQ;MACnB;MACA,IAAIC,gBAAgB,GAAGF,WAAW,CAAC5D,gBAAgB,CAAC,GAAG,GAAG+D,kBAAkB,GAAG,GAAG,GAAGC,UAAU,CAAC;MAChG,IAAIC,eAAe,EAAEC,WAAW,EAAEC,SAAS,EAAEC,MAAM;MACnD,KAAK,IAAIC,WAAW,GAAG,CAAC,EAAEA,WAAW,GAAGP,gBAAgB,CAACrF,MAAM,EAAE4F,WAAW,EAAE,EAAE;QAC5EJ,eAAe,GAAGH,gBAAgB,CAACO,WAAW,CAAC;QAC/CH,WAAW,GAAGD,eAAe,CAACK,aAAa,CAAC,OAAO,CAAC;QACpDH,SAAS,GAAGD,WAAW,CAACK,YAAY,CAAC,KAAK,CAAC;QAC3CH,MAAM,GAAGH,eAAe,CAACK,aAAa,KAAAE,MAAA,CAAKL,SAAS,CAAE,CAAC;QACvDN,QAAQ,CAACM,SAAS,CAAC,GAAGnC,GAAG,CAACgB,sBAAsB,CAACoB,MAAM,CAAC;MAC5D;MACA,OAAOP,QAAQ;IACnB;EAAC;IAAAzF,GAAA;IAAAC,KAAA,EACD,SAAOoG,YAAYA,CAACC,UAAU,EAAE;MAC5B,IAAIC,QAAQ,GAAG5E,QAAQ,CAACuE,aAAa,CAACM,UAAU,CAAC;MACjDD,QAAQ,CAACE,SAAS,GAAGH,UAAU;IACnC;EAAC;IAAAtG,GAAA;IAAAC,KAAA,EACD,SAAOyG,kBAAkBA,CAAA,EAAG;MACxB,IAAMC,eAAe,GAAGhF,QAAQ,CAACiF,IAAI,CAACC,OAAO,CAACC,IAAI;MAClD,OAAOH,eAAe;IAC1B;EAAC;IAAA3G,GAAA;IAAAC,KAAA,EACD,SAAO8G,4BAA4BA,CAACjD,OAAO,EAAE;MACzCA,OAAO,CAACG,YAAY,CAACC,gBAAgB,EAAEN,GAAG,CAACgB,sBAAsB,CAACd,OAAO,CAAC,CAAC;MAC3E,OAAOF,GAAG,CAACoD,cAAc,CAAClD,OAAO,CAAC;IACtC;EAAC;IAAA9D,GAAA;IAAAC,KAAA,EACD,SAAO+G,cAAcA,CAAClD,OAAO,EAAE;MAC3B,IAAImD,OAAO,GAAGnD,OAAO,CAACqC,YAAY,CAAChC,iBAAiB,CAAC,IAAIL,OAAO,CAACqC,YAAY,CAACjC,gBAAgB,CAAC;MAC/FN,GAAG,CAACsD,kBAAkB,CAACpD,OAAO,EAAEmD,OAAO,CAAC;MACxC,OAAOA,OAAO;IAClB;EAAC;IAAAjH,GAAA;IAAAC,KAAA,EACD,SAAOiH,kBAAkBA,CAACpD,OAAO,EAAEmD,OAAO,EAAE;MACxCrD,GAAG,CAACuD,6BAA6B,CAACrD,OAAO,EAAEmD,OAAO,EAAEG,SAAS,CAAC;IAClE;EAAC;IAAApH,GAAA;IAAAC,KAAA,EACD,SAAOkH,6BAA6BA,CAACrD,OAAO,EAAEuD,cAAc,EAAEC,IAAI,EAAE;MAChE,IAAIC,qBAAqB,GAAGzD,OAAO,CAAC0D,SAAS,CAACC,QAAQ,CAACH,IAAI,CAAC;MAC5D,IAAID,cAAc,IAAIE,qBAAqB,EAAE;MAC7C,IAAIF,cAAc,EAAE;QAChBvD,OAAO,CAAC0D,SAAS,CAACE,GAAG,CAACJ,IAAI,CAAC;MAC/B,CAAC,MAAM;QACHxD,OAAO,CAAC0D,SAAS,CAACG,MAAM,CAACL,IAAI,CAAC;MAClC;IACJ;EAAC;IAAAtH,GAAA;IAAAC,KAAA,EACD,SAAO2H,yBAAyBA,CAACC,SAAS,EAAE;MACxC,IAAIA,SAAS,IAAI,IAAI,EAAE,OAAO,KAAK;MACnC,OAAOA,SAAS,CAAC3B,aAAa,CAAC,GAAG,GAAGkB,SAAS,CAAC,IAAI,IAAI;IAC3D;EAAC;IAAApH,GAAA;IAAAC,KAAA,EACD,SAAO6H,mCAAmCA,CAACD,SAAS,EAAE;MAClD,IAAIA,SAAS,IAAI,IAAI,IAAIA,SAAS,CAACL,SAAS,CAACC,QAAQ,CAACM,UAAU,CAAC,EAAE,OAAO,KAAK;MAC/E,OAAOF,SAAS,CAAC3B,aAAa,CAAC,GAAG,GAAGkB,SAAS,GAAG,QAAQ,GAAGW,UAAU,GAAG,KAAK,GAAGA,UAAU,GAAG,KAAK,CAAC,IAAI,IAAI;IAChH;EAAC;IAAA/H,GAAA;IAAAC,KAAA,EACD,SAAO2E,sBAAsBA,CAACd,OAAO,EAAE;MACnC,IAAIkE,SAAS,GAAG,EAAE;MAElB,IAAI,CAACnI,UAAU,CAACK,OAAO,CAAC4D,OAAO,CAAC,EAAE;QAE9B,IAAIQ,OAAO,GAAGR,OAAO,CAACQ,OAAO,CAACC,WAAW,CAAC,CAAC;QAC3C,IAAIT,OAAO,CAACU,IAAI,KAAK,UAAU,EAAE;UAC7BwD,SAAS,GAAGlE,OAAO,CAACW,OAAO;QAC/B;QACA;AACZ;AACA;AACA;AACA,UAJY,KAKK,IAAIH,OAAO,KAAK,OAAO,IAAIA,OAAO,KAAK,UAAU,IAAIA,OAAO,KAAK,QAAQ,EAAE;UAC5E0D,SAAS,GAAGlE,OAAO,CAAC7D,KAAK;QAC7B,CAAC,MACI,IAAI6D,OAAO,CAAC0D,SAAS,CAACC,QAAQ,CAACQ,UAAU,CAAC,IAAInE,OAAO,CAAC0D,SAAS,CAACC,QAAQ,CAACS,UAAU,CAAC,EAAE;UAAE;UACzFF,SAAS,GAAGlE,OAAO,CAAC0D,SAAS,CAACC,QAAQ,CAACM,UAAU,CAAC;QACtD,CAAC,MACI,IAAIzD,OAAO,KAAK,IAAI,EAAE;UACvB0D,SAAS,GAAGpE,GAAG,CAACuE,+BAA+B,CAACrE,OAAO,CAAC;QAC5D,CAAC,MACI,IAAIQ,OAAO,IAAI,KAAK,IAAIR,OAAO,CAAC0D,SAAS,CAACC,QAAQ,CAACW,YAAY,CAAC,EAAE;UACnEJ,SAAS,GAAIlE,OAAO,CAAC0D,SAAS,CAACC,QAAQ,CAACY,aAAa,CAAE;QAC3D,CAAC,MACI;UACDL,SAAS,GAAGlE,OAAO,CAACY,WAAW;QACnC;MACJ;MAEA,IAAI7E,UAAU,CAACK,OAAO,CAAC8H,SAAS,CAAC,EAAEA,SAAS,GAAG,EAAE;MAEjD,OAAOA,SAAS;IACpB;EAAC;IAAAhI,GAAA;IAAAC,KAAA,EACD,SAAOkI,+BAA+BA,CAACrE,OAAO,EAAE;MAC5C;MACA,IAAIjE,UAAU,CAACK,OAAO,CAAC4D,OAAO,CAAC,EAAE,OAAO,IAAI;MAC5C,OAAOA,OAAO,CAACqC,YAAY,CAACjC,gBAAgB,CAAC;IACjD;EAAC;IAAAlE,GAAA;IAAAC,KAAA,EACD,SAAOqI,gCAAgCA,CAACxE,OAAO,EAAE;MAC7C,IAAIjE,UAAU,CAACK,OAAO,CAAC4D,OAAO,CAAC,EAAE,OAAO,IAAI;MAC5C,OAAOA,OAAO,CAACqC,YAAY,CAAChC,iBAAiB,CAAC;IAClD;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EAjBI;IAAAnE,GAAA;IAAAC,KAAA,EAkBA,SAAOsI,eAAeA,CAACnD,MAAM,EAAEtB,OAAO,EAAE;MACpC;MACAsB,MAAM,CAACoD,SAAS,CAACpD,MAAM,CAACoD,SAAS,CAAC,CAAC,IAAI1E,OAAO,CAAC2E,MAAM,CAAC,CAAC,CAACC,GAAG,GAAGtD,MAAM,CAACqD,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC;IACvF;EAAC;IAAA1I,GAAA;IAAAC,KAAA,EACD,SAAO0I,oBAAoBA,CAACd,SAAS,EAAE/D,OAAO,EAAE;MAE5C,IAAI,OAAOpC,MAAM,KAAK,UAAU,EAAE;QAC9B,IAAImG,SAAS,YAAYnG,MAAM,EAAEmG,SAAS,GAAGA,SAAS,CAAC,CAAC,CAAC;QACzD,IAAI/D,OAAO,YAAYpC,MAAM,EAAEoC,OAAO,GAAGA,OAAO,CAAC,CAAC,CAAC;MACvD;MAEA,IAAI8E,eAAe,GAAGf,SAAS,CAACgB,qBAAqB,CAAC,CAAC;MACvD,IAAIC,aAAa,GAAGhF,OAAO,CAAC+E,qBAAqB,CAAC,CAAC;MAEnD,OACID,eAAe,CAACF,GAAG,IAAII,aAAa,CAACJ,GAAG,IACxCE,eAAe,CAACG,IAAI,IAAID,aAAa,CAACC,IAAI,IACxCD,aAAa,CAACJ,GAAG,GAAGI,aAAa,CAACE,MAAM,IAAMJ,eAAe,CAACF,GAAG,GAAGE,eAAe,CAACI,MAAQ,IAC5FF,aAAa,CAACC,IAAI,GAAGD,aAAa,CAACG,KAAK,IAAML,eAAe,CAACG,IAAI,GAAGH,eAAe,CAACK,KAAO;IAEtG;EAAC;IAAAjJ,GAAA;IAAAC,KAAA,EACD,SAAOiJ,UAAUA,CAACC,SAAS,EAAEC,SAAS,EAAE;MACpCC,KAAK,CAACF,SAAS,GAAG,IAAI,GAAGC,SAAS,CAAC;IACvC;EAAC;IAAApJ,GAAA;IAAAC,KAAA,EACD,SAAOqJ,sCAAsCA,CAAA,EAAG;MAC5C,OAAAC,eAAA,CAAAA,eAAA,KACKC,wBAAwB,EAAAD,eAAA,CAAAA,eAAA,CAAAA,eAAA,CAAAA,eAAA,KACpBE,sBAAsB,EAAG,CAACC,QAAQ,CAAC,GACnCC,uBAAuB,EAAG,CAACC,0BAA0B,CAAC,GACtDF,QAAQ,EAAG,uBAAuB,GAClCE,0BAA0B,EAAG,CAAC,IAElCC,oBAAoB,EAAAN,eAAA,CAAAA,eAAA,CAAAA,eAAA,CAAAA,eAAA,KAChBE,sBAAsB,EAAG,CAACC,QAAQ,CAAC,GACnCC,uBAAuB,EAAG,CAACG,sBAAsB,CAAC,GAClDJ,QAAQ,EAAG,kBAAkB,GAC7BI,sBAAsB,EAAG,CAAC;IAGvC;EAAC;IAAA9J,GAAA;IAAAC,KAAA,EACD,SAAO8J,YAAYA,CAACC,UAAU,EAAE;MAC5B,IAAInK,UAAU,CAACK,OAAO,CAAC8J,UAAU,CAAC,EAAEA,UAAU,GAAG;QAC7CC,IAAI,EAAE,QAAQ;QACdhK,KAAK,EAAE;MACX,CAAC;MACD,IAAIiK,MAAM,GAAGvI,QAAQ,CAACwI,aAAa,CAAC,QAAQ,CAAC;MAC7CD,MAAM,CAACjK,KAAK,GAAG+J,UAAU,CAAC/J,KAAK;MAC/BiK,MAAM,CAACxF,WAAW,GAAGsF,UAAU,CAACC,IAAI;MACpCC,MAAM,CAACE,QAAQ,GAAGJ,UAAU,CAACI,QAAQ;MACrC,OAAOF,MAAM;IACjB;EAAC;IAAAlK,GAAA;IAAAC,KAAA,EAED,SAAOoK,UAAUA,CAACJ,IAAI,EAAE;MACpB,IAAMK,GAAG,GAAG3I,QAAQ,CAACwI,aAAa,CAAC,KAAK,CAAC;MACzCG,GAAG,CAAC5F,WAAW,GAAGuF,IAAI;MACtB,OAAOK,GAAG,CAAC7D,SAAS;IACxB;EAAC;IAAAzG,GAAA;IAAAC,KAAA,EACD,SAAOsK,YAAYA,CAACC,IAAI,EAAE;MACtB,IAAMF,GAAG,GAAG3I,QAAQ,CAACwI,aAAa,CAAC,KAAK,CAAC;MACzCG,GAAG,CAAC7D,SAAS,GAAG+D,IAAI;MACpB,OAAOF,GAAG,CAAC5F,WAAW,IAAI4F,GAAG,CAACG,SAAS,IAAI,EAAE;IACjD;EAAC;AAAA;;;;;;;;;ICrOgBC,MAAM;EAAA,SAAAA,OAAA;IAAA5K,qBAAA,OAAA4K,MAAA;EAAA;EAAA,OAAA3K,kBAAA,CAAA2K,MAAA;IAAA1K,GAAA;IAAAC,KAAA,EACvB,SAAO0K,sBAAsBA,CAACC,eAAe,EAAEC,gBAAgB,EAAEC,YAAY,EAAE;MAC3EnJ,QAAQ,CAACC,gBAAgB,CAACgJ,eAAe,CAAC,CAACG,OAAO,CAAC,UAASjH,OAAO,EAAE;QACjE,IAAIA,OAAO,CAAC0D,SAAS,CAACC,QAAQ,CAACoD,gBAAgB,CAAC,EAAE;QAClDC,YAAY,CAAChH,OAAO,CAAC;QACrBA,OAAO,CAAC0D,SAAS,CAACE,GAAG,CAACmD,gBAAgB,CAAC;MAC3C,CAAC,CAAC;IACN;EAAC;IAAA7K,GAAA;IAAAC,KAAA,EACD,SAAO+K,kBAAkBA,CAACC,SAAS,EAAEhG,QAAQ,EAAElC,QAAQ,EAAE;MACrD2H,MAAM,CAACC,sBAAsB,CAAC1F,QAAQ,EAAEiG,eAAe,EAAE,UAACpH,OAAO,EAAK;QAClEA,OAAO,CAACqH,gBAAgB,CAACF,SAAS,EAAE,UAACG,KAAK,EAAK;UAC3CA,KAAK,CAACC,eAAe,CAAC,CAAC;UACvBtI,QAAQ,CAACqI,KAAK,EAAEtH,OAAO,CAAC;QAC5B,CAAC,CAAC;MACN,CAAC,CAAC;IACN;EAAC;AAAA;;;;;;;;;ACfoC;AAAA,IAEpBwH,YAAY;EAAA,SAAAA,aAAA;IAAAxL,4BAAA,OAAAwL,YAAA;EAAA;EAAA,OAAAvL,yBAAA,CAAAuL,YAAA;IAAAtL,GAAA;IAAAC,KAAA;IACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;IAEI,SAAOsL,eAAeA,CAACvL,GAAG,EAAE;MACxB,OAAOiB,IAAI,CAACuK,KAAK,CAACC,YAAY,CAACC,OAAO,CAAC1L,GAAG,CAAC,CAAC;IAChD;EAAC;IAAAA,GAAA;IAAAC,KAAA,EAED,SAAO0L,eAAeA,CAAC3L,GAAG,EAAE4L,KAAK,EAAE;MAC/BH,YAAY,CAACI,OAAO,CAAC7L,GAAG,EAAEiB,IAAI,CAACC,SAAS,CAAC0K,KAAK,CAAC,CAAC;IACpD;;IAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EAVA;AAAA;;;;+CCjDA,qJAAAE,mBAAA,YAAAA,oBAAA,WAAAC,CAAA,SAAAC,CAAA,EAAAD,CAAA,OAAAE,CAAA,GAAAzJ,MAAA,CAAA0J,SAAA,EAAAC,CAAA,GAAAF,CAAA,CAAAG,cAAA,EAAAC,CAAA,GAAA7J,MAAA,CAAA8J,cAAA,cAAAN,CAAA,EAAAD,CAAA,EAAAE,CAAA,IAAAD,CAAA,CAAAD,CAAA,IAAAE,CAAA,CAAAhM,KAAA,KAAAO,CAAA,wBAAA+L,MAAA,GAAAA,MAAA,OAAAC,CAAA,GAAAhM,CAAA,CAAAiM,QAAA,kBAAAC,CAAA,GAAAlM,CAAA,CAAAmM,aAAA,uBAAAC,CAAA,GAAApM,CAAA,CAAAqM,WAAA,8BAAAC,OAAAd,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAzJ,MAAA,CAAA8J,cAAA,CAAAN,CAAA,EAAAD,CAAA,IAAA9L,KAAA,EAAAgM,CAAA,EAAAc,UAAA,MAAAC,YAAA,MAAAC,QAAA,SAAAjB,CAAA,CAAAD,CAAA,WAAAe,MAAA,mBAAAd,CAAA,IAAAc,MAAA,YAAAA,OAAAd,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAD,CAAA,CAAAD,CAAA,IAAAE,CAAA,gBAAAiB,KAAAlB,CAAA,EAAAD,CAAA,EAAAE,CAAA,EAAAE,CAAA,QAAA3L,CAAA,GAAAuL,CAAA,IAAAA,CAAA,CAAAG,SAAA,YAAAiB,SAAA,GAAApB,CAAA,GAAAoB,SAAA,EAAAX,CAAA,GAAAhK,MAAA,CAAA4K,MAAA,CAAA5M,CAAA,CAAA0L,SAAA,GAAAQ,CAAA,OAAAW,OAAA,CAAAlB,CAAA,gBAAAE,CAAA,CAAAG,CAAA,eAAAvM,KAAA,EAAAqN,gBAAA,CAAAtB,CAAA,EAAAC,CAAA,EAAAS,CAAA,MAAAF,CAAA,aAAAe,SAAAvB,CAAA,EAAAD,CAAA,EAAAE,CAAA,mBAAAzH,IAAA,YAAAgJ,GAAA,EAAAxB,CAAA,CAAAyB,IAAA,CAAA1B,CAAA,EAAAE,CAAA,cAAAD,CAAA,aAAAxH,IAAA,WAAAgJ,GAAA,EAAAxB,CAAA,QAAAD,CAAA,CAAAmB,IAAA,GAAAA,IAAA,MAAAQ,CAAA,qBAAAC,CAAA,qBAAAC,CAAA,gBAAAC,CAAA,gBAAAC,CAAA,gBAAAX,UAAA,cAAAY,kBAAA,cAAAC,2BAAA,SAAAC,CAAA,OAAAnB,MAAA,CAAAmB,CAAA,EAAAzB,CAAA,qCAAAtK,CAAA,GAAAM,MAAA,CAAA0L,cAAA,EAAAC,CAAA,GAAAjM,CAAA,IAAAA,CAAA,CAAAA,CAAA,CAAAkM,MAAA,QAAAD,CAAA,IAAAA,CAAA,KAAAlC,CAAA,IAAAE,CAAA,CAAAsB,IAAA,CAAAU,CAAA,EAAA3B,CAAA,MAAAyB,CAAA,GAAAE,CAAA,OAAAE,CAAA,GAAAL,0BAAA,CAAA9B,SAAA,GAAAiB,SAAA,CAAAjB,SAAA,GAAA1J,MAAA,CAAA4K,MAAA,CAAAa,CAAA,YAAAK,sBAAAtC,CAAA,gCAAAjB,OAAA,WAAAgB,CAAA,IAAAe,MAAA,CAAAd,CAAA,EAAAD,CAAA,YAAAC,CAAA,gBAAAuC,OAAA,CAAAxC,CAAA,EAAAC,CAAA,sBAAAwC,cAAAxC,CAAA,EAAAD,CAAA,aAAA0C,OAAAxC,CAAA,EAAAI,CAAA,EAAA7L,CAAA,EAAAgM,CAAA,QAAAE,CAAA,GAAAa,QAAA,CAAAvB,CAAA,CAAAC,CAAA,GAAAD,CAAA,EAAAK,CAAA,mBAAAK,CAAA,CAAAlI,IAAA,QAAAoI,CAAA,GAAAF,CAAA,CAAAc,GAAA,EAAAE,CAAA,GAAAd,CAAA,CAAA3M,KAAA,SAAAyN,CAAA,gBAAAgB,UAAA,CAAAhB,CAAA,KAAAvB,CAAA,CAAAsB,IAAA,CAAAC,CAAA,eAAA3B,CAAA,CAAA4C,OAAA,CAAAjB,CAAA,CAAAkB,OAAA,EAAAC,IAAA,WAAA7C,CAAA,IAAAyC,MAAA,SAAAzC,CAAA,EAAAxL,CAAA,EAAAgM,CAAA,gBAAAR,CAAA,IAAAyC,MAAA,UAAAzC,CAAA,EAAAxL,CAAA,EAAAgM,CAAA,QAAAT,CAAA,CAAA4C,OAAA,CAAAjB,CAAA,EAAAmB,IAAA,WAAA7C,CAAA,IAAAY,CAAA,CAAA3M,KAAA,GAAA+L,CAAA,EAAAxL,CAAA,CAAAoM,CAAA,gBAAAZ,CAAA,WAAAyC,MAAA,UAAAzC,CAAA,EAAAxL,CAAA,EAAAgM,CAAA,SAAAA,CAAA,CAAAE,CAAA,CAAAc,GAAA,SAAAvB,CAAA,EAAAI,CAAA,oBAAApM,KAAA,WAAAA,MAAA+L,CAAA,EAAAG,CAAA,aAAA2C,2BAAA,eAAA/C,CAAA,WAAAA,CAAA,EAAAE,CAAA,IAAAwC,MAAA,CAAAzC,CAAA,EAAAG,CAAA,EAAAJ,CAAA,EAAAE,CAAA,gBAAAA,CAAA,GAAAA,CAAA,GAAAA,CAAA,CAAA4C,IAAA,CAAAC,0BAAA,EAAAA,0BAAA,IAAAA,0BAAA,qBAAAxB,iBAAAvB,CAAA,EAAAE,CAAA,EAAAE,CAAA,QAAAE,CAAA,GAAAqB,CAAA,mBAAAlN,CAAA,EAAAgM,CAAA,QAAAH,CAAA,KAAAuB,CAAA,QAAAmB,KAAA,sCAAA1C,CAAA,KAAAwB,CAAA,oBAAArN,CAAA,QAAAgM,CAAA,WAAAvM,KAAA,EAAA+L,CAAA,EAAAgD,IAAA,eAAA7C,CAAA,CAAA8C,MAAA,GAAAzO,CAAA,EAAA2L,CAAA,CAAAqB,GAAA,GAAAhB,CAAA,UAAAE,CAAA,GAAAP,CAAA,CAAA+C,QAAA,MAAAxC,CAAA,QAAAE,CAAA,GAAAuC,mBAAA,CAAAzC,CAAA,EAAAP,CAAA,OAAAS,CAAA,QAAAA,CAAA,KAAAkB,CAAA,mBAAAlB,CAAA,qBAAAT,CAAA,CAAA8C,MAAA,EAAA9C,CAAA,CAAAiD,IAAA,GAAAjD,CAAA,CAAAkD,KAAA,GAAAlD,CAAA,CAAAqB,GAAA,sBAAArB,CAAA,CAAA8C,MAAA,QAAA5C,CAAA,KAAAqB,CAAA,QAAArB,CAAA,GAAAwB,CAAA,EAAA1B,CAAA,CAAAqB,GAAA,EAAArB,CAAA,CAAAmD,iBAAA,CAAAnD,CAAA,CAAAqB,GAAA,uBAAArB,CAAA,CAAA8C,MAAA,IAAA9C,CAAA,CAAAoD,MAAA,WAAApD,CAAA,CAAAqB,GAAA,GAAAnB,CAAA,GAAAuB,CAAA,MAAAK,CAAA,GAAAV,QAAA,CAAAxB,CAAA,EAAAE,CAAA,EAAAE,CAAA,oBAAA8B,CAAA,CAAAzJ,IAAA,QAAA6H,CAAA,GAAAF,CAAA,CAAA6C,IAAA,GAAAnB,CAAA,GAAAF,CAAA,EAAAM,CAAA,CAAAT,GAAA,KAAAM,CAAA,qBAAA7N,KAAA,EAAAgO,CAAA,CAAAT,GAAA,EAAAwB,IAAA,EAAA7C,CAAA,CAAA6C,IAAA,kBAAAf,CAAA,CAAAzJ,IAAA,KAAA6H,CAAA,GAAAwB,CAAA,EAAA1B,CAAA,CAAA8C,MAAA,YAAA9C,CAAA,CAAAqB,GAAA,GAAAS,CAAA,CAAAT,GAAA,mBAAA2B,oBAAApD,CAAA,EAAAE,CAAA,QAAAE,CAAA,GAAAF,CAAA,CAAAgD,MAAA,EAAA5C,CAAA,GAAAN,CAAA,CAAAU,QAAA,CAAAN,CAAA,OAAAE,CAAA,KAAAL,CAAA,SAAAC,CAAA,CAAAiD,QAAA,qBAAA/C,CAAA,IAAAJ,CAAA,CAAAU,QAAA,eAAAR,CAAA,CAAAgD,MAAA,aAAAhD,CAAA,CAAAuB,GAAA,GAAAxB,CAAA,EAAAmD,mBAAA,CAAApD,CAAA,EAAAE,CAAA,eAAAA,CAAA,CAAAgD,MAAA,kBAAA9C,CAAA,KAAAF,CAAA,CAAAgD,MAAA,YAAAhD,CAAA,CAAAuB,GAAA,OAAAgC,SAAA,uCAAArD,CAAA,iBAAA2B,CAAA,MAAAtN,CAAA,GAAA+M,QAAA,CAAAlB,CAAA,EAAAN,CAAA,CAAAU,QAAA,EAAAR,CAAA,CAAAuB,GAAA,mBAAAhN,CAAA,CAAAgE,IAAA,SAAAyH,CAAA,CAAAgD,MAAA,YAAAhD,CAAA,CAAAuB,GAAA,GAAAhN,CAAA,CAAAgN,GAAA,EAAAvB,CAAA,CAAAiD,QAAA,SAAApB,CAAA,MAAAtB,CAAA,GAAAhM,CAAA,CAAAgN,GAAA,SAAAhB,CAAA,GAAAA,CAAA,CAAAwC,IAAA,IAAA/C,CAAA,CAAAF,CAAA,CAAA0D,UAAA,IAAAjD,CAAA,CAAAvM,KAAA,EAAAgM,CAAA,CAAAyD,IAAA,GAAA3D,CAAA,CAAA4D,OAAA,eAAA1D,CAAA,CAAAgD,MAAA,KAAAhD,CAAA,CAAAgD,MAAA,WAAAhD,CAAA,CAAAuB,GAAA,GAAAxB,CAAA,GAAAC,CAAA,CAAAiD,QAAA,SAAApB,CAAA,IAAAtB,CAAA,IAAAP,CAAA,CAAAgD,MAAA,YAAAhD,CAAA,CAAAuB,GAAA,OAAAgC,SAAA,sCAAAvD,CAAA,CAAAiD,QAAA,SAAApB,CAAA,cAAA8B,aAAA5D,CAAA,QAAAD,CAAA,KAAA8D,MAAA,EAAA7D,CAAA,YAAAA,CAAA,KAAAD,CAAA,CAAA+D,QAAA,GAAA9D,CAAA,WAAAA,CAAA,KAAAD,CAAA,CAAAgE,UAAA,GAAA/D,CAAA,KAAAD,CAAA,CAAAiE,QAAA,GAAAhE,CAAA,WAAAiE,UAAA,CAAAC,IAAA,CAAAnE,CAAA,cAAAoE,cAAAnE,CAAA,QAAAD,CAAA,GAAAC,CAAA,CAAAoE,UAAA,QAAArE,CAAA,CAAAvH,IAAA,oBAAAuH,CAAA,CAAAyB,GAAA,EAAAxB,CAAA,CAAAoE,UAAA,GAAArE,CAAA,aAAAsB,QAAArB,CAAA,SAAAiE,UAAA,MAAAJ,MAAA,aAAA7D,CAAA,CAAAjB,OAAA,CAAA6E,YAAA,cAAAS,KAAA,iBAAAjC,OAAArC,CAAA,QAAAA,CAAA,WAAAA,CAAA,QAAAE,CAAA,GAAAF,CAAA,CAAAS,CAAA,OAAAP,CAAA,SAAAA,CAAA,CAAAwB,IAAA,CAAA1B,CAAA,4BAAAA,CAAA,CAAA2D,IAAA,SAAA3D,CAAA,OAAApL,KAAA,CAAAoL,CAAA,CAAA1L,MAAA,SAAAgM,CAAA,OAAA7L,CAAA,YAAAkP,KAAA,aAAArD,CAAA,GAAAN,CAAA,CAAA1L,MAAA,OAAA8L,CAAA,CAAAsB,IAAA,CAAA1B,CAAA,EAAAM,CAAA,UAAAqD,IAAA,CAAAzP,KAAA,GAAA8L,CAAA,CAAAM,CAAA,GAAAqD,IAAA,CAAAV,IAAA,OAAAU,IAAA,SAAAA,IAAA,CAAAzP,KAAA,GAAA+L,CAAA,EAAA0D,IAAA,CAAAV,IAAA,OAAAU,IAAA,YAAAlP,CAAA,CAAAkP,IAAA,GAAAlP,CAAA,gBAAAgP,SAAA,CAAAd,UAAA,CAAA3C,CAAA,kCAAAgC,iBAAA,CAAA7B,SAAA,GAAA8B,0BAAA,EAAA3B,CAAA,CAAAgC,CAAA,mBAAApO,KAAA,EAAA+N,0BAAA,EAAAhB,YAAA,SAAAX,CAAA,CAAA2B,0BAAA,mBAAA/N,KAAA,EAAA8N,iBAAA,EAAAf,YAAA,SAAAe,iBAAA,CAAAuC,WAAA,GAAAxD,MAAA,CAAAkB,0BAAA,EAAApB,CAAA,wBAAAb,CAAA,CAAAwE,mBAAA,aAAAvE,CAAA,QAAAD,CAAA,wBAAAC,CAAA,IAAAA,CAAA,CAAAwE,WAAA,WAAAzE,CAAA,KAAAA,CAAA,KAAAgC,iBAAA,6BAAAhC,CAAA,CAAAuE,WAAA,IAAAvE,CAAA,CAAA0E,IAAA,OAAA1E,CAAA,CAAA2E,IAAA,aAAA1E,CAAA,WAAAxJ,MAAA,CAAAmO,cAAA,GAAAnO,MAAA,CAAAmO,cAAA,CAAA3E,CAAA,EAAAgC,0BAAA,KAAAhC,CAAA,CAAA4E,SAAA,GAAA5C,0BAAA,EAAAlB,MAAA,CAAAd,CAAA,EAAAY,CAAA,yBAAAZ,CAAA,CAAAE,SAAA,GAAA1J,MAAA,CAAA4K,MAAA,CAAAiB,CAAA,GAAArC,CAAA,KAAAD,CAAA,CAAA8E,KAAA,aAAA7E,CAAA,aAAA4C,OAAA,EAAA5C,CAAA,OAAAsC,qBAAA,CAAAE,aAAA,CAAAtC,SAAA,GAAAY,MAAA,CAAA0B,aAAA,CAAAtC,SAAA,EAAAQ,CAAA,iCAAAX,CAAA,CAAAyC,aAAA,GAAAA,aAAA,EAAAzC,CAAA,CAAA+E,KAAA,aAAA9E,CAAA,EAAAC,CAAA,EAAAE,CAAA,EAAAE,CAAA,EAAA7L,CAAA,eAAAA,CAAA,KAAAA,CAAA,GAAAuQ,OAAA,OAAAvE,CAAA,OAAAgC,aAAA,CAAAtB,IAAA,CAAAlB,CAAA,EAAAC,CAAA,EAAAE,CAAA,EAAAE,CAAA,GAAA7L,CAAA,UAAAuL,CAAA,CAAAwE,mBAAA,CAAAtE,CAAA,IAAAO,CAAA,GAAAA,CAAA,CAAAkD,IAAA,GAAAb,IAAA,WAAA7C,CAAA,WAAAA,CAAA,CAAAgD,IAAA,GAAAhD,CAAA,CAAA/L,KAAA,GAAAuM,CAAA,CAAAkD,IAAA,WAAApB,qBAAA,CAAAD,CAAA,GAAAvB,MAAA,CAAAuB,CAAA,EAAAzB,CAAA,gBAAAE,MAAA,CAAAuB,CAAA,EAAA7B,CAAA,iCAAAM,MAAA,CAAAuB,CAAA,6DAAAtC,CAAA,CAAAtJ,IAAA,aAAAuJ,CAAA,QAAAD,CAAA,GAAAvJ,MAAA,CAAAwJ,CAAA,GAAAC,CAAA,gBAAAE,CAAA,IAAAJ,CAAA,EAAAE,CAAA,CAAAiE,IAAA,CAAA/D,CAAA,UAAAF,CAAA,CAAA+E,OAAA,aAAAtB,KAAA,WAAAzD,CAAA,CAAA5L,MAAA,SAAA2L,CAAA,GAAAC,CAAA,CAAAgF,GAAA,QAAAjF,CAAA,IAAAD,CAAA,SAAA2D,IAAA,CAAAzP,KAAA,GAAA+L,CAAA,EAAA0D,IAAA,CAAAV,IAAA,OAAAU,IAAA,WAAAA,IAAA,CAAAV,IAAA,OAAAU,IAAA,QAAA3D,CAAA,CAAAqC,MAAA,GAAAA,MAAA,EAAAf,OAAA,CAAAnB,SAAA,KAAAsE,WAAA,EAAAnD,OAAA,EAAAgD,KAAA,WAAAA,MAAAtE,CAAA,aAAAmF,IAAA,WAAAxB,IAAA,WAAAN,IAAA,QAAAC,KAAA,GAAArD,CAAA,OAAAgD,IAAA,YAAAE,QAAA,cAAAD,MAAA,gBAAAzB,GAAA,GAAAxB,CAAA,OAAAiE,UAAA,CAAAlF,OAAA,CAAAoF,aAAA,IAAApE,CAAA,WAAAE,CAAA,kBAAAA,CAAA,CAAAkF,MAAA,OAAAhF,CAAA,CAAAsB,IAAA,OAAAxB,CAAA,MAAAtL,KAAA,EAAAsL,CAAA,CAAAmF,KAAA,cAAAnF,CAAA,IAAAD,CAAA,MAAAqF,IAAA,WAAAA,KAAA,SAAArC,IAAA,WAAAhD,CAAA,QAAAiE,UAAA,IAAAG,UAAA,kBAAApE,CAAA,CAAAxH,IAAA,QAAAwH,CAAA,CAAAwB,GAAA,cAAA8D,IAAA,KAAAhC,iBAAA,WAAAA,kBAAAvD,CAAA,aAAAiD,IAAA,QAAAjD,CAAA,MAAAE,CAAA,kBAAAsF,OAAApF,CAAA,EAAAE,CAAA,WAAAG,CAAA,CAAAhI,IAAA,YAAAgI,CAAA,CAAAgB,GAAA,GAAAzB,CAAA,EAAAE,CAAA,CAAAyD,IAAA,GAAAvD,CAAA,EAAAE,CAAA,KAAAJ,CAAA,CAAAgD,MAAA,WAAAhD,CAAA,CAAAuB,GAAA,GAAAxB,CAAA,KAAAK,CAAA,aAAAA,CAAA,QAAA4D,UAAA,CAAA5P,MAAA,MAAAgM,CAAA,SAAAA,CAAA,QAAA7L,CAAA,QAAAyP,UAAA,CAAA5D,CAAA,GAAAG,CAAA,GAAAhM,CAAA,CAAA4P,UAAA,iBAAA5P,CAAA,CAAAqP,MAAA,SAAA0B,MAAA,aAAA/Q,CAAA,CAAAqP,MAAA,SAAAqB,IAAA,QAAAxE,CAAA,GAAAP,CAAA,CAAAsB,IAAA,CAAAjN,CAAA,eAAAoM,CAAA,GAAAT,CAAA,CAAAsB,IAAA,CAAAjN,CAAA,qBAAAkM,CAAA,IAAAE,CAAA,aAAAsE,IAAA,GAAA1Q,CAAA,CAAAsP,QAAA,SAAAyB,MAAA,CAAA/Q,CAAA,CAAAsP,QAAA,gBAAAoB,IAAA,GAAA1Q,CAAA,CAAAuP,UAAA,SAAAwB,MAAA,CAAA/Q,CAAA,CAAAuP,UAAA,cAAArD,CAAA,aAAAwE,IAAA,GAAA1Q,CAAA,CAAAsP,QAAA,SAAAyB,MAAA,CAAA/Q,CAAA,CAAAsP,QAAA,qBAAAlD,CAAA,QAAAmC,KAAA,qDAAAmC,IAAA,GAAA1Q,CAAA,CAAAuP,UAAA,SAAAwB,MAAA,CAAA/Q,CAAA,CAAAuP,UAAA,YAAAR,MAAA,WAAAA,OAAAvD,CAAA,EAAAD,CAAA,aAAAE,CAAA,QAAAgE,UAAA,CAAA5P,MAAA,MAAA4L,CAAA,SAAAA,CAAA,QAAAI,CAAA,QAAA4D,UAAA,CAAAhE,CAAA,OAAAI,CAAA,CAAAwD,MAAA,SAAAqB,IAAA,IAAA/E,CAAA,CAAAsB,IAAA,CAAApB,CAAA,wBAAA6E,IAAA,GAAA7E,CAAA,CAAA0D,UAAA,QAAAvP,CAAA,GAAA6L,CAAA,aAAA7L,CAAA,iBAAAwL,CAAA,mBAAAA,CAAA,KAAAxL,CAAA,CAAAqP,MAAA,IAAA9D,CAAA,IAAAA,CAAA,IAAAvL,CAAA,CAAAuP,UAAA,KAAAvP,CAAA,cAAAgM,CAAA,GAAAhM,CAAA,GAAAA,CAAA,CAAA4P,UAAA,cAAA5D,CAAA,CAAAhI,IAAA,GAAAwH,CAAA,EAAAQ,CAAA,CAAAgB,GAAA,GAAAzB,CAAA,EAAAvL,CAAA,SAAAyO,MAAA,gBAAAS,IAAA,GAAAlP,CAAA,CAAAuP,UAAA,EAAAjC,CAAA,SAAA0D,QAAA,CAAAhF,CAAA,MAAAgF,QAAA,WAAAA,SAAAxF,CAAA,EAAAD,CAAA,oBAAAC,CAAA,CAAAxH,IAAA,QAAAwH,CAAA,CAAAwB,GAAA,qBAAAxB,CAAA,CAAAxH,IAAA,mBAAAwH,CAAA,CAAAxH,IAAA,QAAAkL,IAAA,GAAA1D,CAAA,CAAAwB,GAAA,gBAAAxB,CAAA,CAAAxH,IAAA,SAAA8M,IAAA,QAAA9D,GAAA,GAAAxB,CAAA,CAAAwB,GAAA,OAAAyB,MAAA,kBAAAS,IAAA,yBAAA1D,CAAA,CAAAxH,IAAA,IAAAuH,CAAA,UAAA2D,IAAA,GAAA3D,CAAA,GAAA+B,CAAA,KAAA2D,MAAA,WAAAA,OAAAzF,CAAA,aAAAD,CAAA,QAAAkE,UAAA,CAAA5P,MAAA,MAAA0L,CAAA,SAAAA,CAAA,QAAAE,CAAA,QAAAgE,UAAA,CAAAlE,CAAA,OAAAE,CAAA,CAAA8D,UAAA,KAAA/D,CAAA,cAAAwF,QAAA,CAAAvF,CAAA,CAAAmE,UAAA,EAAAnE,CAAA,CAAA+D,QAAA,GAAAG,aAAA,CAAAlE,CAAA,GAAA6B,CAAA,yBAAA4D,OAAA1F,CAAA,aAAAD,CAAA,QAAAkE,UAAA,CAAA5P,MAAA,MAAA0L,CAAA,SAAAA,CAAA,QAAAE,CAAA,QAAAgE,UAAA,CAAAlE,CAAA,OAAAE,CAAA,CAAA4D,MAAA,KAAA7D,CAAA,QAAAG,CAAA,GAAAF,CAAA,CAAAmE,UAAA,kBAAAjE,CAAA,CAAA3H,IAAA,QAAA6H,CAAA,GAAAF,CAAA,CAAAqB,GAAA,EAAA2C,aAAA,CAAAlE,CAAA,YAAAI,CAAA,YAAA0C,KAAA,8BAAA4C,aAAA,WAAAA,cAAA5F,CAAA,EAAAE,CAAA,EAAAE,CAAA,gBAAA+C,QAAA,KAAAzC,QAAA,EAAA2B,MAAA,CAAArC,CAAA,GAAA0D,UAAA,EAAAxD,CAAA,EAAA0D,OAAA,EAAAxD,CAAA,oBAAA8C,MAAA,UAAAzB,GAAA,GAAAxB,CAAA,GAAA8B,CAAA,OAAA/B,CAAA;AAAA,SAAA6F,QAAA7F,CAAA,EAAAE,CAAA,QAAAD,CAAA,GAAAxJ,MAAA,CAAAC,IAAA,CAAAsJ,CAAA,OAAAvJ,MAAA,CAAAqP,qBAAA,QAAAxF,CAAA,GAAA7J,MAAA,CAAAqP,qBAAA,CAAA9F,CAAA,GAAAE,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAArG,MAAA,WAAAiG,CAAA,WAAAzJ,MAAA,CAAAsP,wBAAA,CAAA/F,CAAA,EAAAE,CAAA,EAAAc,UAAA,OAAAf,CAAA,CAAAkE,IAAA,CAAA6B,KAAA,CAAA/F,CAAA,EAAAK,CAAA,YAAAL,CAAA;AAAA,SAAAgG,cAAAjG,CAAA,aAAAE,CAAA,MAAAA,CAAA,GAAAzI,SAAA,CAAAnD,MAAA,EAAA4L,CAAA,UAAAD,CAAA,WAAAxI,SAAA,CAAAyI,CAAA,IAAAzI,SAAA,CAAAyI,CAAA,QAAAA,CAAA,OAAA2F,OAAA,CAAApP,MAAA,CAAAwJ,CAAA,OAAAjB,OAAA,WAAAkB,CAAA,IAAA1C,kBAAA,CAAAwC,CAAA,EAAAE,CAAA,EAAAD,CAAA,CAAAC,CAAA,SAAAzJ,MAAA,CAAAyP,yBAAA,GAAAzP,MAAA,CAAA0P,gBAAA,CAAAnG,CAAA,EAAAvJ,MAAA,CAAAyP,yBAAA,CAAAjG,CAAA,KAAA4F,OAAA,CAAApP,MAAA,CAAAwJ,CAAA,GAAAjB,OAAA,WAAAkB,CAAA,IAAAzJ,MAAA,CAAA8J,cAAA,CAAAP,CAAA,EAAAE,CAAA,EAAAzJ,MAAA,CAAAsP,wBAAA,CAAA9F,CAAA,EAAAC,CAAA,iBAAAF,CAAA;AAAA,SAAAxC,kBAAAA,CAAAwC,CAAA,EAAAE,CAAA,EAAAD,CAAA,YAAAC,CAAA,GAAAkG,iBAAA,CAAAlG,CAAA,MAAAF,CAAA,GAAAvJ,MAAA,CAAA8J,cAAA,CAAAP,CAAA,EAAAE,CAAA,IAAAhM,KAAA,EAAA+L,CAAA,EAAAe,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAlB,CAAA,CAAAE,CAAA,IAAAD,CAAA,EAAAD,CAAA;AAAA,SAAAqG,mBAAAjG,CAAA,EAAAH,CAAA,EAAAD,CAAA,EAAAE,CAAA,EAAAI,CAAA,EAAAG,CAAA,EAAAE,CAAA,cAAAlM,CAAA,GAAA2L,CAAA,CAAAK,CAAA,EAAAE,CAAA,GAAAE,CAAA,GAAApM,CAAA,CAAAP,KAAA,WAAAkM,CAAA,gBAAAJ,CAAA,CAAAI,CAAA,KAAA3L,CAAA,CAAAwO,IAAA,GAAAhD,CAAA,CAAAY,CAAA,IAAAmE,OAAA,CAAApC,OAAA,CAAA/B,CAAA,EAAAiC,IAAA,CAAA5C,CAAA,EAAAI,CAAA;AAAA,SAAAgG,kBAAAlG,CAAA,6BAAAH,CAAA,SAAAD,CAAA,GAAAvI,SAAA,aAAAuN,OAAA,WAAA9E,CAAA,EAAAI,CAAA,QAAAG,CAAA,GAAAL,CAAA,CAAA4F,KAAA,CAAA/F,CAAA,EAAAD,CAAA,YAAAuG,MAAAnG,CAAA,IAAAiG,kBAAA,CAAA5F,CAAA,EAAAP,CAAA,EAAAI,CAAA,EAAAiG,KAAA,EAAAC,MAAA,UAAApG,CAAA,cAAAoG,OAAApG,CAAA,IAAAiG,kBAAA,CAAA5F,CAAA,EAAAP,CAAA,EAAAI,CAAA,EAAAiG,KAAA,EAAAC,MAAA,WAAApG,CAAA,KAAAmG,KAAA;AAAA,SAAAxS,kBAAAA,CAAA0M,CAAA,EAAAL,CAAA,UAAAK,CAAA,YAAAL,CAAA,aAAAqD,SAAA;AAAA,SAAAgD,oBAAAA,CAAAzG,CAAA,EAAAE,CAAA,aAAAD,CAAA,MAAAA,CAAA,GAAAC,CAAA,CAAA5L,MAAA,EAAA2L,CAAA,UAAAK,CAAA,GAAAJ,CAAA,CAAAD,CAAA,GAAAK,CAAA,CAAAU,UAAA,GAAAV,CAAA,CAAAU,UAAA,QAAAV,CAAA,CAAAW,YAAA,kBAAAX,CAAA,KAAAA,CAAA,CAAAY,QAAA,QAAAzK,MAAA,CAAA8J,cAAA,CAAAP,CAAA,EAAAoG,iBAAA,CAAA9F,CAAA,CAAArM,GAAA,GAAAqM,CAAA;AAAA,SAAAtM,eAAAA,CAAAgM,CAAA,EAAAE,CAAA,EAAAD,CAAA,WAAAC,CAAA,IAAAuG,oBAAA,CAAAzG,CAAA,CAAAG,SAAA,EAAAD,CAAA,GAAAD,CAAA,IAAAwG,oBAAA,CAAAzG,CAAA,EAAAC,CAAA,GAAAxJ,MAAA,CAAA8J,cAAA,CAAAP,CAAA,iBAAAkB,QAAA,SAAAlB,CAAA;AAAA,SAAAoG,iBAAAA,CAAAnG,CAAA,QAAAxL,CAAA,GAAAiS,eAAA,CAAAzG,CAAA,gCAAA0C,UAAA,CAAAlO,CAAA,IAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAiS,eAAAA,CAAAzG,CAAA,EAAAC,CAAA,oBAAAyC,UAAA,CAAA1C,CAAA,MAAAA,CAAA,SAAAA,CAAA,MAAAD,CAAA,GAAAC,CAAA,CAAAO,MAAA,CAAAmG,WAAA,kBAAA3G,CAAA,QAAAvL,CAAA,GAAAuL,CAAA,CAAA0B,IAAA,CAAAzB,CAAA,EAAAC,CAAA,gCAAAyC,UAAA,CAAAlO,CAAA,UAAAA,CAAA,YAAAgP,SAAA,yEAAAvD,CAAA,GAAA0G,MAAA,GAAAC,MAAA,EAAA5G,CAAA;AAD2B;AAAA,IAEN6G,GAAG;EAAA,SAAAA,IAAA;IAAA/S,kBAAA,OAAA+S,GAAA;EAAA;EAAA,OAAA9S,eAAA,CAAA8S,GAAA;IAAA7S,GAAA;IAAAC,KAAA,EAEpB,SAAO6S,YAAYA,CAAA,EAAG;MAClB,OAAOnR,QAAQ,CAACuE,aAAa,CAAC6M,WAAW,CAAC,CAAC5M,YAAY,CAAC,SAAS,CAAC;IACtE;EAAC;IAAAnG,GAAA;IAAAC,KAAA;MAAA,IAAA+S,QAAA,GAAAX,iBAAA,cAAAvG,mBAAA,GAAA4E,IAAA,CAED,SAAAuC,QAAqBC,YAAY;QAAA,IAAAjE,MAAA;UAAAlO,IAAA;UAAAD,MAAA;UAAAgC,GAAA;UAAAqQ,SAAA;UAAAC,OAAA;UAAAC,QAAA;UAAAC,KAAA,GAAA9P,SAAA;QAAA,OAAAsI,mBAAA,GAAAoB,IAAA,UAAAqG,SAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAtC,IAAA,GAAAsC,QAAA,CAAA9D,IAAA;YAAA;cAAET,MAAM,GAAAqE,KAAA,CAAAjT,MAAA,QAAAiT,KAAA,QAAAlT,SAAA,GAAAkT,KAAA,MAAG,KAAK;cAAEvS,IAAI,GAAAuS,KAAA,CAAAjT,MAAA,QAAAiT,KAAA,QAAAlT,SAAA,GAAAkT,KAAA,MAAG,IAAI;cAAExS,MAAM,GAAAwS,KAAA,CAAAjT,MAAA,QAAAiT,KAAA,QAAAlT,SAAA,GAAAkT,KAAA,MAAG,IAAI;cACnExQ,GAAG,GAAG+P,GAAG,CAACY,cAAc,CAACP,YAAY,EAAEpS,MAAM,CAAC;cAC9CqS,SAAS,GAAGN,GAAG,CAACC,YAAY,CAAC,CAAC;cAC9BM,OAAO,GAAG;gBACZnE,MAAM,EAANA,MAAM;gBACNyE,OAAO,EAAAnK,kBAAA;kBACH,cAAc,EAAE;gBAAkB,GACjCoK,aAAa,EAAGR,SAAS;cAElC,CAAC;cAED,IAAIpS,IAAI,KAAKkO,MAAM,KAAK,MAAM,IAAIA,MAAM,KAAK,KAAK,IAAIA,MAAM,KAAK,OAAO,CAAC,EAAE;gBACvElO,IAAI,GAAAiR,aAAA,CAAAA,aAAA,KACGjR,IAAI,OAAAwI,kBAAA,KACNoK,aAAa,EAAGR,SAAS,EAC7B;gBACDC,OAAO,CAACxM,IAAI,GAAG3F,IAAI,CAACC,SAAS,CAACH,IAAI,CAAC;cACvC;cAACyS,QAAA,CAAAtC,IAAA;cAAAsC,QAAA,CAAA9D,IAAA;cAAA,OAG0BkE,KAAK,CAAC9Q,GAAG,EAAEsQ,OAAO,CAAC;YAAA;cAApCC,QAAQ,GAAAG,QAAA,CAAApE,IAAA;cAAA,IACTiE,QAAQ,CAACQ,EAAE;gBAAAL,QAAA,CAAA9D,IAAA;gBAAA;cAAA;cAAA,MACN,IAAIX,KAAK,wBAAA3I,MAAA,CAAwBiN,QAAQ,CAACS,MAAM,CAAE,CAAC;YAAA;cAAAN,QAAA,CAAA9D,IAAA;cAAA,OAEhD2D,QAAQ,CAACU,IAAI,CAAC,CAAC;YAAA;cAAA,OAAAP,QAAA,CAAAjE,MAAA,WAAAiE,QAAA,CAAApE,IAAA;YAAA;cAAAoE,QAAA,CAAAtC,IAAA;cAAAsC,QAAA,CAAAQ,EAAA,GAAAR,QAAA;cAE5BS,OAAO,CAACC,KAAK,CAAC,qBAAqB,EAAAV,QAAA,CAAAQ,EAAO,CAAC;cAAC,MAAAR,QAAA,CAAAQ,EAAA;YAAA;YAAA;cAAA,OAAAR,QAAA,CAAAnC,IAAA;UAAA;QAAA,GAAA4B,OAAA;MAAA,CAGnD;MAAA,SA7BYkB,OAAOA,CAAAC,EAAA;QAAA,OAAApB,QAAA,CAAAjB,KAAA,OAAAvO,SAAA;MAAA;MAAA,OAAP2Q,OAAO;IAAA;EAAA;IAAAnU,GAAA;IAAAC,KAAA,EA+BpB,SAAOwT,cAAcA,CAACY,IAAI,EAAiB;MAAA,IAAfvT,MAAM,GAAA0C,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MACrC,IAAI6Q,IAAI,IAAI,IAAI,EAAEA,IAAI,GAAGC,YAAY;MACrC,IAAIxR,GAAG,GAAG+P,GAAG,CAAC0B,eAAe,CAACC,SAAS,GAAGH,IAAI,EAAEvT,MAAM,CAAC;MACvD,OAAOgC,GAAG;IACd;EAAC;IAAA9C,GAAA;IAAAC,KAAA,EACD,SAAOsU,eAAeA,CAACzR,GAAG,EAAEhC,MAAM,EAAE;MAChC,IAAIA,MAAM,EAAE;QACRgC,GAAG,IAAI,GAAG,GAAG,IAAI2R,eAAe,CAAC3T,MAAM,CAAC,CAAC4T,QAAQ,CAAC,CAAC;MACvD;MACA,OAAO5R,GAAG;IACd;EAAC;IAAA9C,GAAA;IAAAC,KAAA,EACD,SAAO0U,OAAOA,CAAC7R,GAAG,EAAE;MAChB8R,MAAM,CAACC,QAAQ,CAACC,IAAI,GAAGhS,GAAG;IAC9B;EAAC;IAAA9C,GAAA;IAAAC,KAAA,EACD,SAAO8U,QAAQA,CAACV,IAAI,EAAiB;MAAA,IAAfvT,MAAM,GAAA0C,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MAC/B,IAAMV,GAAG,GAAG+P,GAAG,CAACY,cAAc,CAACY,IAAI,EAAEvT,MAAM,CAAC;MAC5C+R,GAAG,CAAC8B,OAAO,CAAC7R,GAAG,CAAC;IACpB;;IAEA;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;EANI;IAAA9C,GAAA;IAAAC,KAAA;MAAA,IAAA+U,UAAA,GAAA3C,iBAAA,cAAAvG,mBAAA,GAAA4E,IAAA,CAOA,SAAAuE,SAAA;QAAA,IAAAlS,QAAA;QAAA,OAAA+I,mBAAA,GAAAoB,IAAA,UAAAgI,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAjE,IAAA,GAAAiE,SAAA,CAAAzF,IAAA;YAAA;cACQ3M,QAAQ,GAAG,CAAC,CAAC;cACjBA,QAAQ,CAACqS,YAAY,CAAC,GAAGxR,GAAG,CAAC8C,kBAAkB,CAAC,CAAC;cAACyO,SAAA,CAAAzF,IAAA;cAAA,OACrCmD,GAAG,CAACsB,OAAO,CAACkB,iBAAiB,EAAE,MAAM,EAAEtS,QAAQ,CAAC;YAAA;cAAA,OAAAoS,SAAA,CAAA5F,MAAA,WAAA4F,SAAA,CAAA/F,IAAA;YAAA;YAAA;cAAA,OAAA+F,SAAA,CAAA9D,IAAA;UAAA;QAAA,GAAA4D,QAAA;MAAA,CAChE;MAAA,SAJYK,SAASA,CAAA;QAAA,OAAAN,UAAA,CAAAjD,KAAA,OAAAvO,SAAA;MAAA;MAAA,OAAT8R,SAAS;IAAA,IAMtB;IACA;EAAA;IAAAtV,GAAA;IAAAC,KAAA;MAAA,IAAAsV,sBAAA,GAAAlD,iBAAA,cAAAvG,mBAAA,GAAA4E,IAAA,CACA,SAAA8E,SAAmCC,iBAAiB,EAAEC,WAAW,EAAEC,OAAO;QAAA,IAAAC,WAAA;QAAA,OAAA9J,mBAAA,GAAAoB,IAAA,UAAA2I,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAA5E,IAAA,GAAA4E,SAAA,CAAApG,IAAA;YAAA;cAClEkG,WAAW,GAAG,CAAC,CAAC;cACpBA,WAAW,CAACG,eAAe,CAAC,GAAGnS,GAAG,CAAC2B,gBAAgB,CAACmQ,WAAW,CAAC;cAChEE,WAAW,CAACI,mBAAmB,CAAC,GAAGP,iBAAiB;cACpDG,WAAW,CAACK,WAAW,CAAC,GAAGN,OAAO;cAACG,SAAA,CAAApG,IAAA;cAAA,OACtBmD,GAAG,CAACsB,OAAO,CAAC+B,0BAA0B,EAAE,MAAM,EAAEN,WAAW,CAAC;YAAA;cAAA,OAAAE,SAAA,CAAAvG,MAAA,WAAAuG,SAAA,CAAA1G,IAAA;YAAA;YAAA;cAAA,OAAA0G,SAAA,CAAAzE,IAAA;UAAA;QAAA,GAAAmE,QAAA;MAAA,CAC5E;MAAA,SANYW,qBAAqBA,CAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA;QAAA,OAAAf,sBAAA,CAAAxD,KAAA,OAAAvO,SAAA;MAAA;MAAA,OAArB2S,qBAAqB;IAAA,IAQlC;EAAA;IAAAnW,GAAA;IAAAC,KAAA;MAAA,IAAAsW,aAAA,GAAAlE,iBAAA,cAAAvG,mBAAA,GAAA4E,IAAA,CACA,SAAA8F,SAA0BC,QAAQ,EAAEf,WAAW,EAAEC,OAAO;QAAA,IAAAC,WAAA;QAAA,OAAA9J,mBAAA,GAAAoB,IAAA,UAAAwJ,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAzF,IAAA,GAAAyF,SAAA,CAAAjH,IAAA;YAAA;cAChDkG,WAAW,GAAG,CAAC,CAAC;cACpBA,WAAW,CAACG,eAAe,CAAC,GAAGnS,GAAG,CAAC2B,gBAAgB,CAACmQ,WAAW,CAAC;cAChEE,WAAW,CAACgB,WAAW,CAAC,GAAGH,QAAQ;cACnCb,WAAW,CAACK,WAAW,CAAC,GAAGN,OAAO;cAACgB,SAAA,CAAAjH,IAAA;cAAA,OACtBmD,GAAG,CAACsB,OAAO,CAAC0C,kBAAkB,EAAE,MAAM,EAAEjB,WAAW,CAAC;YAAA;cAAA,OAAAe,SAAA,CAAApH,MAAA,WAAAoH,SAAA,CAAAvH,IAAA;YAAA;YAAA;cAAA,OAAAuH,SAAA,CAAAtF,IAAA;UAAA;QAAA,GAAAmF,QAAA;MAAA,CACpE;MAAA,SANYM,YAAYA,CAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA;QAAA,OAAAV,aAAA,CAAAxE,KAAA,OAAAvO,SAAA;MAAA;MAAA,OAAZsT,YAAY;IAAA,IAQzB;EAAA;IAAA9W,GAAA;IAAAC,KAAA;MAAA,IAAAiX,oBAAA,GAAA7E,iBAAA,cAAAvG,mBAAA,GAAA4E,IAAA,CACA,SAAAyG,SAAiCC,eAAe,EAAE1B,WAAW,EAAEC,OAAO;QAAA,IAAAC,WAAA;QAAA,OAAA9J,mBAAA,GAAAoB,IAAA,UAAAmK,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAApG,IAAA,GAAAoG,SAAA,CAAA5H,IAAA;YAAA;cAC9DkG,WAAW,GAAG,CAAC,CAAC;cACpBA,WAAW,CAACG,eAAe,CAAC,GAAGnS,GAAG,CAAC2B,gBAAgB,CAACmQ,WAAW,CAAC;cAChEE,WAAW,CAAC2B,kBAAkB,CAAC,GAAGH,eAAe;cACjDxB,WAAW,CAACK,WAAW,CAAC,GAAGN,OAAO;cAAC2B,SAAA,CAAA5H,IAAA;cAAA,OACtBmD,GAAG,CAACsB,OAAO,CAACqD,yBAAyB,EAAE,MAAM,EAAE5B,WAAW,CAAC;YAAA;cAAA,OAAA0B,SAAA,CAAA/H,MAAA,WAAA+H,SAAA,CAAAlI,IAAA;YAAA;YAAA;cAAA,OAAAkI,SAAA,CAAAjG,IAAA;UAAA;QAAA,GAAA8F,QAAA;MAAA,CAC3E;MAAA,SANYM,mBAAmBA,CAAAC,GAAA,EAAAC,GAAA,EAAAC,IAAA;QAAA,OAAAV,oBAAA,CAAAnF,KAAA,OAAAvO,SAAA;MAAA;MAAA,OAAnBiU,mBAAmB;IAAA,IAQhC;EAAA;IAAAzX,GAAA;IAAAC,KAAA;MAAA,IAAA4X,cAAA,GAAAxF,iBAAA,cAAAvG,mBAAA,GAAA4E,IAAA,CACA,SAAAoH,SAA2BC,SAAS,EAAErC,WAAW,EAAEC,OAAO;QAAA,IAAAC,WAAA;QAAA,OAAA9J,mBAAA,GAAAoB,IAAA,UAAA8K,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAA/G,IAAA,GAAA+G,SAAA,CAAAvI,IAAA;YAAA;cAClDkG,WAAW,GAAG,CAAC,CAAC;cACpBA,WAAW,CAACG,eAAe,CAAC,GAAGnS,GAAG,CAAC2B,gBAAgB,CAACmQ,WAAW,CAAC;cAChEE,WAAW,CAACsC,YAAY,CAAC,GAAGH,SAAS;cACrCnC,WAAW,CAACK,WAAW,CAAC,GAAGN,OAAO;cAACsC,SAAA,CAAAvI,IAAA;cAAA,OACtBmD,GAAG,CAACsB,OAAO,CAACgE,mBAAmB,EAAE,MAAM,EAAEvC,WAAW,CAAC;YAAA;cAAA,OAAAqC,SAAA,CAAA1I,MAAA,WAAA0I,SAAA,CAAA7I,IAAA;YAAA;YAAA;cAAA,OAAA6I,SAAA,CAAA5G,IAAA;UAAA;QAAA,GAAAyG,QAAA;MAAA,CACrE;MAAA,SANYM,aAAaA,CAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;QAAA,OAAAV,cAAA,CAAA9F,KAAA,OAAAvO,SAAA;MAAA;MAAA,OAAb4U,aAAa;IAAA,IAQ1B;EAAA;IAAApY,GAAA;IAAAC,KAAA;MAAA,IAAAuY,gBAAA,GAAAnG,iBAAA,cAAAvG,mBAAA,GAAA4E,IAAA,CACA,SAAA+H,SAA6BC,WAAW,EAAEhD,WAAW,EAAEC,OAAO;QAAA,IAAAC,WAAA;QAAA,OAAA9J,mBAAA,GAAAoB,IAAA,UAAAyL,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAA1H,IAAA,GAAA0H,SAAA,CAAAlJ,IAAA;YAAA;cACtDkG,WAAW,GAAG,CAAC,CAAC;cACpBA,WAAW,CAACG,eAAe,CAAC,GAAGnS,GAAG,CAAC2B,gBAAgB,CAACmQ,WAAW,CAAC;cAChEE,WAAW,CAACiD,cAAc,CAAC,GAAGH,WAAW;cACzC9C,WAAW,CAACK,WAAW,CAAC,GAAGN,OAAO;cAACiD,SAAA,CAAAlJ,IAAA;cAAA,OACtBmD,GAAG,CAACsB,OAAO,CAAC2E,qBAAqB,EAAE,MAAM,EAAElD,WAAW,CAAC;YAAA;cAAA,OAAAgD,SAAA,CAAArJ,MAAA,WAAAqJ,SAAA,CAAAxJ,IAAA;YAAA;YAAA;cAAA,OAAAwJ,SAAA,CAAAvH,IAAA;UAAA;QAAA,GAAAoH,QAAA;MAAA,CACvE;MAAA,SANYM,eAAeA,CAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;QAAA,OAAAV,gBAAA,CAAAzG,KAAA,OAAAvO,SAAA;MAAA;MAAA,OAAfuV,eAAe;IAAA,IAQ5B;EAAA;IAAA/Y,GAAA;IAAAC,KAAA;MAAA,IAAAkZ,uBAAA,GAAA9G,iBAAA,cAAAvG,mBAAA,GAAA4E,IAAA,CACA,SAAA0I,SAAoCC,KAAK,EAAE3D,WAAW,EAAEC,OAAO;QAAA,IAAAC,WAAA;QAAA,OAAA9J,mBAAA,GAAAoB,IAAA,UAAAoM,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAArI,IAAA,GAAAqI,SAAA,CAAA7J,IAAA;YAAA;cACvDkG,WAAW,GAAG,CAAC,CAAC;cACpBA,WAAW,CAACG,eAAe,CAAC,GAAGnS,GAAG,CAAC2B,gBAAgB,CAACmQ,WAAW,CAAC;cAChEE,WAAW,CAAC4D,qBAAqB,CAAC,GAAGH,KAAK;cAC1CzD,WAAW,CAACK,WAAW,CAAC,GAAGN,OAAO;cAAC4D,SAAA,CAAA7J,IAAA;cAAA,OACtBmD,GAAG,CAACsB,OAAO,CAACsF,4BAA4B,EAAE,MAAM,EAAE7D,WAAW,CAAC;YAAA;cAAA,OAAA2D,SAAA,CAAAhK,MAAA,WAAAgK,SAAA,CAAAnK,IAAA;YAAA;YAAA;cAAA,OAAAmK,SAAA,CAAAlI,IAAA;UAAA;QAAA,GAAA+H,QAAA;MAAA,CAC9E;MAAA,SANYM,sBAAsBA,CAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;QAAA,OAAAV,uBAAA,CAAApH,KAAA,OAAAvO,SAAA;MAAA;MAAA,OAAtBkW,sBAAsB;IAAA;EAAA;AAAA;;;;;;;;;ACvHvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARA,IASqB/V,WAAK;EAAA,SAAAA,MAAA;IAAA7D,oBAAA,OAAA6D,KAAA;EAAA;EAAA,OAAA5D,iBAAA,CAAA4D,KAAA;IAAA3D,GAAA;IAAAC,KAAA,EACtB,SAAO6Z,eAAeA,CAACC,IAAI,EAAE;MACzB,IAAIC,IAAI,GAAG,EAAE;MACb,KAAK,IAAIha,GAAG,IAAI+Z,IAAI,EAAE;QAClBC,IAAI,CAAC9J,IAAI,CAAC6J,IAAI,CAAC/Z,GAAG,CAAC,CAAC;MACxB;MACA,OAAOga,IAAI;IACf;EAAC;IAAAha,GAAA;IAAAC,KAAA,EACD,SAAOga,oCAAoCA,CAACC,OAAO,EAAE;MACjD,IAAIC,WAAW,CAACC,aAAa,IAAI,MAAM,EAAE;QACrCnG,OAAO,CAACoG,GAAG,CAACH,OAAO,CAAC;MACxB;IACJ;EAAC;AAAA;;;;;;;;;ACrBuC;AAAA,IAEvBI,cAAc;EAAA,SAAAA,eAAA;IAAAxa,8BAAA,OAAAwa,cAAA;EAAA;EAAA,OAAAva,2BAAA,CAAAua,cAAA;IAAAta,GAAA;IAAAC,KAAA,EAC/B,SAAOsa,MAAMA,CAACC,eAAe,EAAE;MAC3B9P,MAAM,CAACC,sBAAsB,CAAC8P,gBAAgB,GAAG,UAAU,GAAGC,UAAU,EAAExP,eAAe,EAAE,UAACyP,YAAY,EAAK;QACzGA,YAAY,CAACxP,gBAAgB,CAAC,OAAO,EAAE,YAAM;UACzC,IAAIyP,OAAO,GAAGjZ,QAAQ,CAACuE,aAAa,CAACuU,gBAAgB,CAAC;UACtDG,OAAO,CAACC,KAAK,CAACC,UAAU,GAAG,QAAQ;QACvC,CAAC,CAAC;MACN,CAAC,CAAC;MACFpQ,MAAM,CAACC,sBAAsB,CAAC8P,gBAAgB,GAAG,UAAU,GAAGM,UAAU,EAAE7P,eAAe,EAAE,UAAC8P,aAAa,EAAK;QAC1GA,aAAa,CAAC7P,gBAAgB,CAAC,OAAO,EAAE,YAAM;UAC1C,IAAIyP,OAAO,GAAGjZ,QAAQ,CAACuE,aAAa,CAACuU,gBAAgB,CAAC;UACtD,IAAIQ,QAAQ,GAAGL,OAAO,CAAC1U,aAAa,CAAC,UAAU,CAAC;UAChD0U,OAAO,CAACC,KAAK,CAACC,UAAU,GAAG,QAAQ;UACnCN,eAAe,CAACS,QAAQ,CAAChb,KAAK,CAAC;QACnC,CAAC,CAAC;MACN,CAAC,CAAC;IACN;EAAC;IAAAD,GAAA;IAAAC,KAAA,EACD,SAAOib,IAAIA,CAAA,EAAG;MACV,IAAIN,OAAO,GAAGjZ,QAAQ,CAACuE,aAAa,CAACuU,gBAAgB,CAAC;MACtDG,OAAO,CAACpT,SAAS,CAACG,MAAM,CAACwT,eAAe,CAAC;MACzCP,OAAO,CAACC,KAAK,CAACC,UAAU,GAAG,SAAS;IACxC;EAAC;AAAA;;;;;;;;;ACvBqE;AACpC;AACa;AACvB;AACA;AACQ;AAE2C;AACJ;AAAA,IAEtDQ,QAAQ;EACzB,SAAAA,SAAYC,MAAM,EAAE;IAAAzb,mBAAA,OAAAwb,QAAA;IAChB,IAAI,CAACC,MAAM,EAAE;MACT,MAAM,IAAIxM,KAAK,CAAC,oBAAoB,CAAC;IACzC,CAAC,MACI;MACDpL,WAAK,CAACsW,oCAAoC,CAAC,4BAA4B,EAAEsB,MAAM,CAAC;IACpF;IACA,IAAI,CAACA,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACC,KAAK,GAAGC,gBAAgB;IAC7B,IAAI,IAAI,CAACjL,WAAW,KAAK8K,QAAQ,EAAE;MAC/B,MAAM,IAAIvM,KAAK,CAAC,mCAAmC,CAAC;IACxD;IAEA,IAAI,CAAC,IAAI,CAACyB,WAAW,CAAC6D,IAAI,EAAE;MACxB,MAAM,IAAItF,KAAK,UAAA3I,MAAA,CAAU,IAAI,CAACoK,WAAW,CAACC,IAAI,wCAAqC,CAAC;IACxF;EACJ;EAAC,OAAA1Q,gBAAA,CAAAub,QAAA;IAAAtb,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,MAAM,IAAI3M,KAAK,CAAC,4CAA4C,CAAC;IACjE;EAAC;IAAA/O,GAAA;IAAAC,KAAA,EAED,SAAA0b,gBAAgBA,CAAA,EAAG;MACf,IAAI,CAACC,iBAAiB,CAAC,CAAC;MACxB,IAAI,CAACC,oBAAoB,CAAC,CAAC;IAC/B;EAAC;IAAA7b,GAAA;IAAAC,KAAA,EAED,SAAA2b,iBAAiBA,CAAA,EAAG;MAChBjY,WAAK,CAACsW,oCAAoC,CAAC,eAAe,GAAG,IAAI,CAACuB,KAAK,GAAG,OAAO,CAAC;IACtF;EAAC;IAAAxb,GAAA;IAAAC,KAAA,EAED,SAAA4b,oBAAoBA,CAAA,EAAG;MACnB;MACA,IAAI,CAACC,WAAW,CAAC,CAAC;MAClB,IAAI,CAACC,gBAAgB,CAAC,CAAC;MACvB,IAAI,CAACC,cAAc,CAAC,CAAC;IACzB;EAAC;IAAAhc,GAAA;IAAAC,KAAA,EAED,SAAA8b,gBAAgBA,CAAA,EAAG;MACfrR,MAAM,CAACM,kBAAkB,CAAC,OAAO,EAAEiR,iBAAiB,EAAE,UAAC7Q,KAAK,EAAEtH,OAAO,EAAK;QACtE,IAAIoY,gBAAgB,GAAGva,QAAQ,CAACuE,aAAa,CAACiW,kBAAkB,CAAC;QACjE,IAAID,gBAAgB,CAAC1U,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAE;UACtDe,gBAAgB,CAAC1U,SAAS,CAACG,MAAM,CAACwT,eAAe,CAAC;UAClDe,gBAAgB,CAAC1U,SAAS,CAACE,GAAG,CAAC0U,YAAY,CAAC;QAChD,CAAC,MAAM;UACHF,gBAAgB,CAAC1U,SAAS,CAACG,MAAM,CAACyU,YAAY,CAAC;UAC/CF,gBAAgB,CAAC1U,SAAS,CAACE,GAAG,CAACyT,eAAe,CAAC;QACnD;MACJ,CAAC,CAAC;MAEF,IAAI,CAACkB,oBAAoB,CAAC,CAAC;MAC3B;MACA,IAAI,CAACC,2BAA2B,CAAC,CAAC;MAClC,IAAI,CAACC,0BAA0B,CAAC,CAAC;MACjC,IAAI,CAACC,yBAAyB,CAAC,CAAC;;MAEhC;MACA;MACA,IAAI,CAACC,uBAAuB,CAAC,CAAC;MAC9B,IAAI,CAACC,oCAAoC,CAAC,CAAC;MAC3C,IAAI,CAACC,2BAA2B,CAAC,CAAC;MAClC,IAAI,CAACC,kCAAkC,CAAC,CAAC;MACzC,IAAI,CAACC,uBAAuB,CAAC,CAAC;MAC9B,IAAI,CAACC,4BAA4B,CAAC,CAAC;MACnC,IAAI,CAACC,8BAA8B,CAAC,CAAC;MACrC,IAAI,CAACC,qCAAqC,CAAC,CAAC;MAC5C,IAAI,CAACC,8BAA8B,CAAC,CAAC;IACzC;EAAC;IAAAjd,GAAA;IAAAC,KAAA,EACD,SAAA+K,kBAAkBA,CAACC,SAAS,EAAEhG,QAAQ,EAAElC,QAAQ,EAAE;MAC9C2H,MAAM,CAACC,sBAAsB,CAAC1F,QAAQ,EAAEiG,eAAe,EAAE,UAACpH,OAAO,EAAK;QAClEA,OAAO,CAACqH,gBAAgB,CAACF,SAAS,EAAE,UAACG,KAAK,EAAK;UAC3CA,KAAK,CAACC,eAAe,CAAC,CAAC;UACvBtI,QAAQ,CAACqI,KAAK,EAAEtH,OAAO,CAAC;QAC5B,CAAC,CAAC;MACN,CAAC,CAAC;IACN;EAAC;IAAA9D,GAAA;IAAAC,KAAA,EACD,SAAAoc,oBAAoBA,CAAA,EAAG;MACnB,IAAI,CAACa,gBAAgB,CAAC,GAAG,GAAGC,WAAW,EAAE7I,YAAY,CAAC;IAC1D;EAAC;IAAAtU,GAAA;IAAAC,KAAA,EACD,SAAAid,gBAAgBA,CAACE,cAAc,EAAEC,WAAW,EAAE;MAAA,IAAAC,KAAA;MAC1C5S,MAAM,CAACM,kBAAkB,CAAC,OAAO,EAAEoS,cAAc,EAAE,UAAChS,KAAK,EAAEmS,MAAM,EAAK;QAClED,KAAI,CAAC/B,MAAM,CAACiC,cAAc,CAACH,WAAW,CAAC;MAC3C,CAAC,CAAC;IACN;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EAPI;IAAArd,GAAA;IAAAC,KAAA,EAQA,SAAAqc,2BAA2BA,CAAA,EAAG;MAC1B,IAAI,CAACY,gBAAgB,CAAC,GAAG,GAAGO,kBAAkB,EAAEC,mBAAmB,CAAC;IACxE;EAAC;IAAA1d,GAAA;IAAAC,KAAA,EACD,SAAAsc,0BAA0BA,CAAA,EAAG;MACzB,IAAI,CAACW,gBAAgB,CAAC,GAAG,GAAGS,iBAAiB,EAAEC,kBAAkB,CAAC;IACtE;EAAC;IAAA5d,GAAA;IAAAC,KAAA,EACD,SAAAuc,yBAAyBA,CAAA,EAAG;MAAA,IAAAqB,MAAA;MACxBnT,MAAM,CAACM,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG8S,gBAAgB,EAAE,UAAC1S,KAAK,EAAE2S,SAAS,EAAK;QAC7E3S,KAAK,CAACC,eAAe,CAAC,CAAC;QACvBwS,MAAI,CAACG,KAAK,CAAC,CAAC;QACZnL,GAAG,CAACyC,SAAS,CAAC,CAAC,CACVzG,IAAI,CAAC,UAACwE,QAAQ,EAAK;UACpB,IAAIA,QAAQ,CAAC4K,OAAO,EAAE;YAClBrJ,MAAM,CAACC,QAAQ,CAACC,IAAI,GAAGzB,QAAQ,CAAC+B,YAAY,CAAC;UACjD,CAAC,MAAM;YACHxR,GAAG,CAACsF,UAAU,CAAC,OAAO,EAAEmK,QAAQ,CAAC6K,OAAO,CAAC;UAC7C;QACJ,CAAC,CAAC;MACN,CAAC,CAAC;IACN;EAAC;IAAAle,GAAA;IAAAC,KAAA,EACD,SAAAwc,uBAAuBA,CAAA,EAAG;MACtB,IAAI,CAACS,gBAAgB,CAAC,GAAG,GAAGiB,cAAc,EAAEC,eAAe,CAAC;IAChE;EAAC;IAAApe,GAAA;IAAAC,KAAA,EACD,SAAAyc,oCAAoCA,CAAA,EAAG;MACnC,IAAI,CAACQ,gBAAgB,CAAC,GAAG,GAAGmB,2BAA2B,EAAEC,4BAA4B,CAAC;IAC1F;EAAC;IAAAte,GAAA;IAAAC,KAAA,EACD,SAAA0c,2BAA2BA,CAAA,EAAG;MAC1B,IAAI,CAACO,gBAAgB,CAAC,GAAG,GAAGqB,kBAAkB,EAAEC,mBAAmB,CAAC;IACxE;EAAC;IAAAxe,GAAA;IAAAC,KAAA,EACD,SAAA2c,kCAAkCA,CAAA,EAAG;MACjC,IAAI,CAACM,gBAAgB,CAAC,GAAG,GAAGuB,yBAAyB,EAAEC,0BAA0B,CAAC;IACtF;EAAC;IAAA1e,GAAA;IAAAC,KAAA,EACD,SAAA4c,uBAAuBA,CAAA,EAAG;MACtB,IAAI,CAACK,gBAAgB,CAAC,GAAG,GAAGyB,cAAc,EAAEC,eAAe,CAAC;IAChE;EAAC;IAAA5e,GAAA;IAAAC,KAAA,EACD,SAAA6c,4BAA4BA,CAAA,EAAG;MAC3B,IAAI,CAACI,gBAAgB,CAAC,GAAG,GAAG2B,mBAAmB,EAAEC,oBAAoB,CAAC;IAC1E;EAAC;IAAA9e,GAAA;IAAAC,KAAA,EACD,SAAA8c,8BAA8BA,CAAA,EAAG;MAC7B,IAAI,CAACG,gBAAgB,CAAC,GAAG,GAAG6B,qBAAqB,EAAEC,sBAAsB,CAAC;IAC9E;EAAC;IAAAhf,GAAA;IAAAC,KAAA,EACD,SAAA+c,qCAAqCA,CAAA,EAAG;MACpC,IAAI,CAACE,gBAAgB,CAAC,GAAG,GAAG+B,4BAA4B,EAAEC,6BAA6B,CAAC;IAC5F;EAAC;IAAAlf,GAAA;IAAAC,KAAA,EACD,SAAAgd,8BAA8BA,CAAA,EAAG;MAC7B,IAAI,CAACC,gBAAgB,CAAC,GAAG,GAAGiC,qBAAqB,EAAEC,sBAAsB,CAAC;IAC9E;EAAC;IAAApf,GAAA;IAAAC,KAAA,EAED,SAAA6b,WAAWA,CAAA,EAAG;MAAA,IAAAuD,MAAA;MACV3U,MAAM,CAACM,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAGsU,aAAa,GAAG,GAAG,GAAG,GAAG,GAAGC,QAAQ,EAAE,UAACnU,KAAK,EAAEtH,OAAO,EAAK;QAC/FH,WAAK,CAACsW,oCAAoC,CAAC,eAAe,CAAC;QAC3DoF,MAAI,CAAC9D,MAAM,CAACiC,cAAc,CAAClJ,YAAY,CAAC;MAC5C,CAAC,CAAC;IACN;EAAC;IAAAtU,GAAA;IAAAC,KAAA,EAED,SAAA+b,cAAcA,CAAA,EAAG;MACb,IAAI,CAACwD,mBAAmB,CAAC/E,gBAAgB,CAAC;MAC1C,IAAI,CAAC+E,mBAAmB,CAACC,cAAc,CAAC;IAC5C;EAAC;IAAAzf,GAAA;IAAAC,KAAA,EAED,SAAAuf,mBAAmBA,CAACE,SAAS,EAAE;MAC3BhV,MAAM,CAACC,sBAAsB,CAAC+U,SAAS,EAAExU,eAAe,EAAE,UAAC0P,OAAO,EAAK;QACnEA,OAAO,CAAC1U,aAAa,CAAC,SAAS,GAAGwU,UAAU,CAAC,CAACvP,gBAAgB,CAAC,OAAO,EAAE,UAACC,KAAK,EAAK;UAC/EA,KAAK,CAACC,eAAe,CAAC,CAAC;UACvBuP,OAAO,CAACC,KAAK,CAAC8E,OAAO,GAAG,MAAM;QAClC,CAAC,CAAC;MACN,CAAC,CAAC;IACN;EAAC;IAAA3f,GAAA;IAAAC,KAAA,EAED,SAAA2f,gBAAgBA,CAAA,EAAG;MAAA,IAAAC,MAAA;MACfnV,MAAM,CAACC,sBAAsB,CAAC,OAAO,GAAG/E,UAAU,GAAG,UAAU,GAAGka,QAAQ,EAAE5U,eAAe,EAAE,UAACqS,MAAM,EAAK;QACrGA,MAAM,CAACpS,gBAAgB,CAAC,OAAO,EAAE,UAACC,KAAK,EAAK;UACxCA,KAAK,CAACC,eAAe,CAAC,CAAC;UACvBkS,MAAM,GAAGnS,KAAK,CAAC2U,MAAM;UACrB,IAAIxC,MAAM,CAAC/V,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAE;UAChDxX,WAAK,CAACsW,oCAAoC,CAAC,eAAe,EAAE4F,MAAI,CAACrE,KAAK,CAAC;UACvElB,cAAc,CAACY,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC;MACN,CAAC,CAAC;IACN;EAAC;IAAAlb,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJra,WAAK,CAACsW,oCAAoC,CAAC,UAAU,GAAG,IAAI,CAACuB,KAAK,GAAG,OAAO,CAAC;MAC7E,IAAI,IAAI,CAAChL,WAAW,KAAK8K,QAAQ,EAAE;QAC/B,MAAM,IAAIvM,KAAK,CAAC,gCAAgC,CAAC;MACrD;IACJ;EAAC;IAAA/O,GAAA;IAAAC,KAAA,EACD,SAAA+f,mBAAmBA,CAACC,QAAQ,EAAE;MAC1B3U,YAAY,CAACK,eAAe,CAAC,IAAI,CAAC0I,IAAI,EAAE4L,QAAQ,CAAC;IACrD;EAAC;IAAAjgB,GAAA;IAAAC,KAAA,EACD,SAAAigB,mBAAmBA,CAAA,EAAG;MAClB,OAAO5U,YAAY,CAACC,eAAe,CAAC,IAAI,CAAC8I,IAAI,CAAC;IAClD;EAAC;IAAArU,GAAA;IAAAC,KAAA,EAED,SAAAkgB,2BAA2BA,CAACjF,IAAI,EAAqF;MAAA,IAAnFkF,uBAAuB,GAAA5c,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,GAAG,GAAG6c,aAAa,GAAG,GAAG,GAAGP,QAAQ,GAAG,GAAG,GAAGpF,UAAU;MAAI;MACnH,IAAI4F,UAAU,GAAG3e,QAAQ,CAACuE,aAAa,CAACka,uBAAuB,GAAG,UAAU,GAAGN,QAAQ,CAAC;MACxF,IAAInF,YAAY,GAAGhZ,QAAQ,CAACuE,aAAa,CAACka,uBAAuB,GAAG,UAAU,GAAG1F,UAAU,CAAC;MAC5F,IAAIQ,IAAI,EAAE;QACNP,YAAY,CAACnT,SAAS,CAACG,MAAM,CAACwT,eAAe,CAAC;QAC9CmF,UAAU,CAAC9Y,SAAS,CAACG,MAAM,CAACwT,eAAe,CAAC;QAC5CxX,WAAK,CAACsW,oCAAoC,CAAC,iBAAiB,CAAC;MACjE,CAAC,MAAM;QACHU,YAAY,CAACnT,SAAS,CAACE,GAAG,CAACyT,eAAe,CAAC;QAC3CmF,UAAU,CAAC9Y,SAAS,CAACE,GAAG,CAACyT,eAAe,CAAC;QACzCxX,WAAK,CAACsW,oCAAoC,CAAC,gBAAgB,CAAC;MAChE;IACJ;EAAC;IAAAja,GAAA;IAAAC,KAAA,EAED,SAAOsgB,aAAaA,CAACva,MAAM,EAAE;MACzB,IAAIiB,OAAO,GAAGrD,GAAG,CAACmD,4BAA4B,CAACf,MAAM,CAAC;MACtD,IAAIiB,OAAO,EAAEtF,QAAQ,CAACC,gBAAgB,CAAC4e,WAAW,GAAG,WAAW,CAAC,CAAC7Y,MAAM,CAAC,CAAC;MAC1E,OAAOV,OAAO;IAClB;EAAC;AAAA;;;;;;;;;;;;;;;;;;;;ACvNL;AACkC;AAClC;AAAA,IAGqBwZ,QAAQ,0BAAAC,SAAA;EAGzB,SAAAD,SAAYlF,MAAM,EAAE;IAAAzb,mBAAA,OAAA2gB,QAAA;IAAA,OAAAE,UAAA,OAAAF,QAAA,GACVlF,MAAM;EAChB;EAACqF,SAAA,CAAAH,QAAA,EAAAC,SAAA;EAAA,OAAA3gB,gBAAA,CAAA0gB,QAAA;IAAAzgB,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;MACvB;IACJ;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,aAAA,CAAAJ,QAAA;IACJ;EAAC;AAAA,EAdiCnF,QAAQ;AAAA/R,mBAAA,CAAzBkX,QAAQ,UACXnM,YAAY;;;;;;;;;;;;;;;;;;;;ACNI;AAAA,IAEbwM,WAAW,0BAAAJ,SAAA;EAG5B,SAAAI,YAAYvF,MAAM,EAAE;IAAAzb,uBAAA,OAAAghB,WAAA;IAAA,OAAAH,cAAA,OAAAG,WAAA,GACVvF,MAAM;EAChB;EAACqF,aAAA,CAAAE,WAAA,EAAAJ,SAAA;EAAA,OAAA3gB,oBAAA,CAAA+gB,WAAA;IAAA9gB,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;MACvB,IAAI,CAACoF,aAAa,CAAC,CAAC;IACxB;EAAC;IAAA/gB,GAAA;IAAAC,KAAA,EACD,SAAA8gB,aAAaA,CAAA,EAAG,CAEhB;EAAC;IAAA/gB,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,iBAAA,CAAAC,WAAA;IACJ;EAAC;AAAA,EAjBoCxF,QAAQ;AAAA/R,uBAAA,CAA5BuX,WAAW,UACd1C,eAAe;;;;;;;;;;;;ACHD;AAAA,IAEXhD,eAAe;EAAA,SAAAA,gBAAA;IAAAtb,+BAAA,OAAAsb,eAAA;EAAA;EAAA,OAAArb,4BAAA,CAAAqb,eAAA;IAAApb,GAAA;IAAAC,KAAA,EAChC,SAAO+gB,kCAAkCA,CAACC,UAAU,EAAEC,OAAO,EAAEC,QAAQ,EAAwB;MAAA,IAAtBC,aAAa,GAAA5d,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MACzF,OAAO;QACHyG,IAAI,EAAEgX,UAAU,CAACC,OAAO,CAAC;QACzBjhB,KAAK,EAAEghB,UAAU,CAACE,QAAQ,CAAC;QAC3B/W,QAAQ,EAAG6W,UAAU,CAACE,QAAQ,CAAC,IAAIC;MACvC,CAAC;IACL;EAAC;IAAAphB,GAAA;IAAAC,KAAA,EACD,SAAOohB,2BAA2BA,CAACJ,UAAU,EAAwB;MAAA,IAAtBG,aAAa,GAAA5d,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MAC/D,IAAI0d,OAAO,GAAGD,UAAU,CAACxX,sBAAsB,CAAC;MAChD,IAAI0X,QAAQ,GAAGF,UAAU,CAACtX,uBAAuB,CAAC;MAClD;MACA,OAAOyR,eAAe,CAAC4F,kCAAkC,CAACC,UAAU,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,aAAa,CAAC;IAC3G;EAAC;IAAAphB,GAAA;IAAAC,KAAA,EACD,SAAOqhB,aAAaA,CAACL,UAAU,EAAE;MAC7B,OAAOA,UAAU,IAAI,IAAI,GAAG,EAAE,GAAGA,UAAU,CAACA,UAAU,CAACxX,sBAAsB,CAAC,CAAC;IACnF;EAAC;IAAAzJ,GAAA;IAAAC,KAAA,EACD,SAAOshB,8BAA8BA,CAACC,MAAM,EAAEC,KAAK,EAAE;MACjD,IAAIC,WAAW,GAAG,EAAE;MACpB,IAAIC,GAAG,GAAGF,KAAK,CAACG,KAAK,CAAC,GAAG,CAAC;MAAC,IAAAC,SAAA,GAAAC,0BAAA,CACZH,GAAG;QAAAI,KAAA;MAAA;QAAlB,KAAAF,SAAA,CAAAhU,CAAA,MAAAkU,KAAA,GAAAF,SAAA,CAAA1V,CAAA,IAAA6C,IAAA,GAAoB;UAAA,IAAXgT,EAAE,GAAAD,KAAA,CAAA9hB,KAAA;UACPyhB,WAAW,CAACxR,IAAI,CAACsR,MAAM,CAACQ,EAAE,CAAC,CAAC;QAChC;MAAC,SAAAC,GAAA;QAAAJ,SAAA,CAAA9V,CAAA,CAAAkW,GAAA;MAAA;QAAAJ,SAAA,CAAAjU,CAAA;MAAA;MACD,OAAO8T,WAAW;IACtB;EAAC;AAAA;;;;;;;;;AC1BuC;AAAA,IAEvBrG,YAAY;EAAA,SAAAA,aAAA;IAAAvb,4BAAA,OAAAub,YAAA;EAAA;EAAA,OAAAtb,yBAAA,CAAAsb,YAAA;IAAArb,GAAA;IAAAC,KAAA,EAC7B,SAAOsa,MAAMA,CAAA,EAAG;MACZ7P,MAAM,CAACC,sBAAsB,CAAC8U,cAAc,GAAG,UAAU,GAAG/E,UAAU,EAAExP,eAAe,EAAE,UAACyP,YAAY,EAAK;QACvGA,YAAY,CAACxP,gBAAgB,CAAC,OAAO,EAAE,YAAM;UACzC,IAAIyP,OAAO,GAAGjZ,QAAQ,CAACuE,aAAa,CAACuZ,cAAc,CAAC;UACpD7E,OAAO,CAACC,KAAK,CAACC,UAAU,GAAG,QAAQ;QACvC,CAAC,CAAC;MACN,CAAC,CAAC;IACN;EAAC;IAAA9a,GAAA;IAAAC,KAAA,EACD,SAAOib,IAAIA,CAACgH,QAAQ,EAAE;MAClB,IAAItH,OAAO,GAAGjZ,QAAQ,CAACuE,aAAa,CAACuZ,cAAc,CAAC;MACpD,IAAI0C,UAAU,GAAGvH,OAAO,CAAC1U,aAAa,CAACkc,YAAY,CAAC;MACpDD,UAAU,CAAC1X,SAAS,GAAGyX,QAAQ;MAC/BtH,OAAO,CAACC,KAAK,CAACC,UAAU,GAAG,SAAS;IACxC;EAAC;AAAA;;;;;;;;;;;;;;;;;;;;AChBqE;AACpC;AACa;AACL;AACb;AACL;AACA;AACQ;AAE2C;AACJ;AAAA,IAEtDuH,aAAa,0BAAA3B,SAAA;EAC9B;EACA;EACA;;EAEA,SAAA2B,cAAY9G,MAAM,EAAE;IAAA,IAAA+B,KAAA;IAAAxd,yBAAA,OAAAuiB,aAAA;IAChB/E,KAAA,GAAAqD,oBAAA,OAAA0B,aAAA,GAAM9G,MAAM;IACZ+B,KAAA,CAAKgF,cAAc,GAAG,IAAI;IAC1BhF,KAAA,CAAKiF,UAAU,GAAG,IAAI;IACtBjF,KAAA,CAAKkF,WAAW,GAAG,IAAI;IACvBlF,KAAA,CAAKmF,SAAS,GAAG,IAAI;IACrBnF,KAAA,CAAKoF,UAAU,GAAG,IAAI;IAEtBpF,KAAA,CAAKqF,mBAAmB,GAAGrF,KAAA,CAAKqF,mBAAmB,CAACC,IAAI,CAAAtF,KAAK,CAAC;IAAC,OAAAA,KAAA;EACnE;EAACsD,mBAAA,CAAAyB,aAAA,EAAA3B,SAAA;EAAA,OAAA3gB,sBAAA,CAAAsiB,aAAA;IAAAriB,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAqB;MAAA,IAApBmH,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MACzB,MAAM,IAAIuL,KAAK,CAAC,qCAAqC,CAAC;IAC1D;EAAC;IAAA/O,GAAA;IAAAC,KAAA,EACD,SAAA0b,gBAAgBA,CAAA,EAA8C;MAAA,IAAAkC,MAAA;MAAA,IAA7CgF,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,IAAEsf,eAAe,GAAAtf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MACxD,IAAI,CAACqf,UAAU,EAAE;QACbhC,uBAAA,CAAAwB,aAAA;QACA,IAAI,CAACU,aAAa,CAAC,CAAC;QACpB,IAAI,CAACC,uBAAuB,CAAC,CAAC;QAC9B,IAAI,CAACC,eAAe,CAAC,CAAC;QACtB3I,cAAc,CAACC,MAAM,CAAC,YAAM;UACxB,IAAIuI,eAAe,EAAE;YACjBjF,MAAI,CAACqF,kCAAkC,CAAC,CAAC;UAC7C,CAAC,MACI;YACDrF,MAAI,CAACsF,qBAAqB,CAAC,CAAC;UAChC;QACJ,CAAC,CAAC;MACN,CAAC,MAAM;QACH,IAAIlD,QAAQ,GAAG,IAAI,CAACC,mBAAmB,CAAC,CAAC;QACzC,IAAIkD,OAAO,GAAGnD,QAAQ,CAAClK,eAAe,CAAC;QACvC,IAAIL,WAAW,GAAG2M,aAAa,CAACgB,cAAc,CAAC,CAAC;QAChD,IAAIC,cAAc,GAAG1f,GAAG,CAAC2B,gBAAgB,CAACmQ,WAAW,CAAC;QACtD,IAAI,CAAC7V,UAAU,CAACuC,aAAa,CAACghB,OAAO,EAAEE,cAAc,CAAC,EAAE;UACpD,IAAI,CAACC,sBAAsB,CAAC,CAAC;QACjC;MACJ;IACJ;EAAC;IAAAvjB,GAAA;IAAAC,KAAA,EACD,SAAA8iB,aAAaA,CAAA,EAAG;MACZ,IAAI,IAAI,CAACvS,WAAW,KAAK6R,aAAa,EAAE;QACpC,MAAM,IAAItT,KAAK,CAAC,kEAAkE,CAAC;MACvF;IACJ;EAAC;IAAA/O,GAAA;IAAAC,KAAA,EACD,SAAAujB,mBAAmBA,CAAA,EAAG;MAClB,IAAI,CAACC,wBAAwB,CAAC,CAAC;MAC/B,IAAI,CAACC,sBAAsB,CAAC,CAAC;IACjC;EAAC;IAAA1jB,GAAA;IAAAC,KAAA,EACD,SAAA0jB,kBAAkBA,CAAA,EAAG;MAAA,IAAAtE,MAAA;MACjB,IAAIuE,cAAc,GAAGC,aAAa,GAAG,IAAI,GAAGC,cAAc;MAC1D,IAAIC,eAAe,GAAGpiB,QAAQ,CAACuE,aAAa,CAAC0d,cAAc,CAAC;MAC5DG,eAAe,CAACC,eAAe,CAAC,IAAI,CAAC;MACrC,IAAIC,SAAS,GAAGF,eAAe,CAAC1e,aAAa;MAC7C,IAAI6e,SAAS,GAAItgB,GAAG,CAAC0E,gCAAgC,CAAC2b,SAAS,CAAC,IAAI,MAAO;MAC3E,IAAIE,eAAe,GAAGxiB,QAAQ,CAACuE,aAAa,CAAC2d,aAAa,GAAG,OAAO,GAAGC,cAAc,GAAG,GAAG,GAAGne,kBAAkB,GAAG,OAAO,GAAGme,cAAc,CAAC;MAC5IK,eAAe,CAAClgB,YAAY,CAAC,IAAI,EAAE6f,cAAc,CAAC;MAClD,IAAII,SAAS,EAAEC,eAAe,CAAC3c,SAAS,CAACE,GAAG,CAACW,aAAa,CAAC;MAE3DqC,MAAM,CAACM,kBAAkB,CAAC,OAAO,EAAE4Y,cAAc,EAAE,UAACxY,KAAK,EAAEgZ,YAAY,EAAK;QACxEzgB,WAAK,CAACsW,oCAAoC,CAAC;UAAEmK,YAAY,EAAZA;QAAa,CAAC,CAAC;QAC5DzgB,WAAK,CAACsW,oCAAoC,CAAA1Q,yBAAA,KAAI6a,YAAY,CAAC9f,OAAO,EAAG8f,YAAY,CAAC9f,OAAO,CAAE,CAAC;QAC5F,IAAI+f,UAAU,GAAID,YAAY,CAAC9f,OAAO,CAACC,WAAW,CAAC,CAAC,IAAI,KAAK,GAAI6f,YAAY,GAAGA,YAAY,CAAC/e,aAAa;QAC1G,IAAIif,UAAU,GAAGD,UAAU,CAAC7c,SAAS,CAACC,QAAQ,CAACY,aAAa,CAAC;QAC7D,IAAIic,UAAU,EAAE;UACZD,UAAU,CAAC7c,SAAS,CAACG,MAAM,CAACU,aAAa,CAAC;QAC9C,CAAC,MACI;UACDgc,UAAU,CAAC7c,SAAS,CAACE,GAAG,CAACW,aAAa,CAAC;QAC3C;QACA,OAAOgX,MAAI,CAACkF,kBAAkB,CAACnZ,KAAK,EAAEgZ,YAAY,CAAC;MACvD,CAAC,CAAC;MACF,IAAIpe,MAAM,GAAGrE,QAAQ,CAACuE,aAAa,CAAC0d,cAAc,CAAC;MACnD,IAAIY,mBAAmB,GAAG5gB,GAAG,CAACgB,sBAAsB,CAACoB,MAAM,CAAC;MAC5DA,MAAM,CAAC/B,YAAY,CAACC,gBAAgB,EAAEsgB,mBAAmB,CAAC;MAC1Dxe,MAAM,CAAC/B,YAAY,CAACE,iBAAiB,EAAEqgB,mBAAmB,CAAC;IAC/D;EAAC;IAAAxkB,GAAA;IAAAC,KAAA,EACD,SAAAwkB,YAAYA,CAACC,UAAU,EAAmF;MAAA,IAAA7E,MAAA;MAAA,IAAjF8E,OAAO,GAAAnhB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC4H,KAAK,EAAEpF,MAAM,EAAK;QAAE,OAAO6Z,MAAI,CAAC0E,kBAAkB,CAACnZ,KAAK,EAAEpF,MAAM,CAAC;MAAE,CAAC;MACpG,IAAI4d,cAAc,GAAGC,aAAa,GAAG,IAAI,GAAGa,UAAU;MACtDha,MAAM,CAACM,kBAAkB,CAAC,QAAQ,EAAE4Y,cAAc,EAAEe,OAAO,CAAC;MAC5D,IAAI3e,MAAM,GAAGrE,QAAQ,CAACuE,aAAa,CAAC0d,cAAc,CAAC;MACnD,IAAIY,mBAAmB,GAAG5gB,GAAG,CAACgB,sBAAsB,CAACoB,MAAM,CAAC;MAC5DA,MAAM,CAAC/B,YAAY,CAACC,gBAAgB,EAAEsgB,mBAAmB,CAAC;MAC1Dxe,MAAM,CAAC/B,YAAY,CAACE,iBAAiB,EAAEqgB,mBAAmB,CAAC;IAC/D;EAAC;IAAAxkB,GAAA;IAAAC,KAAA,EACD,SAAAskB,kBAAkBA,CAACnZ,KAAK,EAAEpF,MAAM,EAAE;MAC9B,IAAIua,aAAa,GAAG3c,GAAG,CAACmD,4BAA4B,CAACf,MAAM,CAAC;MAC5D,IAAI0P,WAAW,GAAG2M,aAAa,CAACgB,cAAc,CAAC,CAAC;MAChD,IAAIuB,eAAe,GAAGrE,aAAa,IAAI3c,GAAG,CAACgE,yBAAyB,CAAC8N,WAAW,CAAC;MACjF,IAAImP,KAAK,GAAGljB,QAAQ,CAACuE,aAAa,CAACsa,WAAW,GAAG,QAAQ,CAAC;MAC1D,IAAIsE,IAAI,GAAGD,KAAK,CAACjjB,gBAAgB,CAAC,aAAa,CAAC;MAChDkjB,IAAI,CAAC/Z,OAAO,CAAC,UAACga,GAAG,EAAK;QAClB,IAAIH,eAAe,IAAI,CAACG,GAAG,CAACvd,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAE4J,GAAG,CAACvd,SAAS,CAACE,GAAG,CAACyT,eAAe,CAAC;QACnG,IAAI,CAACyJ,eAAe,IAAIG,GAAG,CAACvd,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAE;UAC7D4J,GAAG,CAACvd,SAAS,CAACG,MAAM,CAACwT,eAAe,CAAC;UACrC,IAAI6J,WAAW,GAAGD,GAAG,CAACnjB,gBAAgB,CAAC,QAAQ,GAAGwF,SAAS,CAAC;UAC5D4d,WAAW,CAACja,OAAO,CAAC,UAACka,UAAU,EAAK;YAChCA,UAAU,CAAChlB,KAAK,GAAG2D,GAAG,CAACuE,+BAA+B,CAAC8c,UAAU,CAAC;UACtE,CAAC,CAAC;QACN;MACJ,CAAC,CAAC;MACF,IAAIL,eAAe,EAAE;QACjB;AACZ;AACA;AACA;AACA;QACYC,KAAK,CAACpe,SAAS,GAAG,wDAAwD,GAAGoe,KAAK,CAACpe,SAAS;QAC5F,IAAI,CAACoe,KAAK,CAACrd,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAE0J,KAAK,CAACrd,SAAS,CAACE,GAAG,CAACyT,eAAe,CAAC;MACxF,CAAC,MACI;QACD,IAAI+J,YAAY,GAAGL,KAAK,CAAC3e,aAAa,CAAC,cAAc,CAAC;QACtD,IAAIgf,YAAY,IAAI,IAAI,EAAEA,YAAY,CAACvd,MAAM,CAAC,CAAC;QAC/C,IAAIkd,KAAK,CAACrd,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAE0J,KAAK,CAACrd,SAAS,CAACG,MAAM,CAACwT,eAAe,CAAC;QACtF,IAAIgK,mBAAmB,GAAGN,KAAK,CAACjjB,gBAAgB,CAAC,GAAG,GAAGsJ,eAAe,CAAC;QACvEia,mBAAmB,CAACpa,OAAO,CAAC,UAACqa,kBAAkB,EAAK;UAChDA,kBAAkB,CAAC5d,SAAS,CAACG,MAAM,CAACuD,eAAe,CAAC;QACxD,CAAC,CAAC;QACF,IAAI,CAAC+X,eAAe,CAAC,CAAC;MAC1B;MACA,IAAI,CAACoC,oCAAoC,CAAC,CAAC;IAC/C;EAAC;IAAArlB,GAAA;IAAAC,KAAA,EACD,SAAAqlB,sBAAsBA,CAAA,EAAG;MACrB,IAAI,CAACb,YAAY,CAACc,cAAc,CAAC;IACrC;EAAC;IAAAvlB,GAAA;IAAAC,KAAA,EACD,SAAAwjB,wBAAwBA,CAAA,EAAG;MAAA,IAAA+B,MAAA;MACvB9a,MAAM,CAACM,kBAAkB,CAAC,OAAO,EAAEya,oBAAoB,EAAE,UAACra,KAAK,EAAEmS,MAAM,EAAK;QACxEnS,KAAK,CAACC,eAAe,CAAC,CAAC;QACvBma,MAAI,CAACjC,sBAAsB,CAAC,CAAC;MACjC,CAAC,CAAC;IACN;EAAC;IAAAvjB,GAAA;IAAAC,KAAA,EACD,SAAAyjB,sBAAsBA,CAAA,EAAG;MACrB,IAAI,CAACe,YAAY,CAACiB,UAAU,CAAC;IACjC;EAAC;IAAA1lB,GAAA;IAAAC,KAAA,EACD,SAAA0lB,eAAeA,CAAA,EAAG;MACd,IAAI,CAAClB,YAAY,CAACmB,SAAS,CAAC;IAChC;EAAC;IAAA5lB,GAAA;IAAAC,KAAA,EACD,SAAA4lB,2BAA2BA,CAAA,EAAG;MAAA,IAAAC,MAAA;MAC1B,IAAI,CAACrB,YAAY,CAACsB,qBAAqB,EAAE,UAAC3a,KAAK,EAAE4a,qBAAqB,EAAK;QACvEF,MAAI,CAACvB,kBAAkB,CAAC,CAAC;QACzB,IAAIhE,aAAa,GAAGyF,qBAAqB,CAACxe,SAAS,CAACC,QAAQ,CAACL,SAAS,CAAC;QACvE,IAAI6e,iBAAiB,GAAGriB,GAAG,CAACgB,sBAAsB,CAACohB,qBAAqB,CAAC;QACzE/R,OAAO,CAACoG,GAAG,CAAC,0BAA0B,CAAC;QACvCpG,OAAO,CAACoG,GAAG,CAAC1W,WAAK,CAACmW,eAAe,CAACoM,cAAc,CAAC,CAAC;QAClD,IAAIC,kBAAkB,GAAGxiB,WAAK,CAACmW,eAAe,CAACoM,cAAc,CAAC,CAAClgB,MAAM,CAAC,UAAAogB,OAAO;UAAA,OAAIA,OAAO,CAACL,qBAAqB,CAAC,IAAIE,iBAAiB;QAAA,EAAC;QACrI,IAAII,cAAc,GAAGF,kBAAkB,CAACG,IAAI,CAAC,UAAC9Z,CAAC,EAAE+Z,CAAC;UAAA,OAAK/Z,CAAC,CAAC9C,QAAQ,CAAC,CAAC8c,aAAa,CAACD,CAAC,CAAC7c,QAAQ,CAAC,CAAC;QAAA,EAAC;QAC9F,IAAI+c,aAAa,GAAG9kB,QAAQ,CAACuE,aAAa,CAAC2d,aAAa,GAAG,IAAI,GAAGjN,WAAW,CAAC;QAC9E,IAAI8P,iBAAiB,GAAG9iB,GAAG,CAAC0E,gCAAgC,CAACme,aAAa,CAAC;QAC3EA,aAAa,CAAChgB,SAAS,GAAG,EAAE;QAC5B,IAAIuD,UAAU,EAAEE,MAAM;QACtBA,MAAM,GAAGtG,GAAG,CAACmG,YAAY,CAAC,IAAI,CAAC;QAC/B0c,aAAa,CAACE,WAAW,CAACzc,MAAM,CAAC;QACjCmc,cAAc,CAACtb,OAAO,CAAC,UAACqb,OAAO,EAAK;UAChCpc,UAAU,GAAGoR,eAAe,CAACiG,2BAA2B,CAAC+E,OAAO,EAAEM,iBAAiB,CAAC;UACpFxc,MAAM,GAAGtG,GAAG,CAACmG,YAAY,CAACC,UAAU,CAAC;UACrCyc,aAAa,CAACE,WAAW,CAACzc,MAAM,CAAC;QACrC,CAAC,CAAC;QACFuc,aAAa,CAACG,aAAa,CAAC,IAAIC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChD,OAAOtG,aAAa;MACxB,CAAC,CAAC;IACN;EAAC;IAAAvgB,GAAA;IAAAC,KAAA,EACD,SAAA6mB,mBAAmBA,CAAA,EAAG;MAClB,IAAI,CAACrC,YAAY,CAACsC,aAAa,CAAC;IACpC;EAAC;IAAA/mB,GAAA;IAAAC,KAAA,EACD,SAAA+mB,oBAAoBA,CAAA,EAAG;MACnB,IAAI,CAACvC,YAAY,CAACwC,cAAc,CAAC;IACrC;IACA;AACJ;AACA;AACA;AACA;AACA;EALI;IAAAjnB,GAAA;IAAAC,KAAA,EASA,SAAAsjB,sBAAsBA,CAAA,EAAG;MACrB,IAAI7N,WAAW,GAAG2M,aAAa,CAACgB,cAAc,CAAC,CAAC;MAChD,IAAI6D,WAAW,GAAGtjB,GAAG,CAAC2B,gBAAgB,CAACmQ,WAAW,CAAC;MACnD/R,WAAK,CAACsW,oCAAoC,CAAC,wBAAwB,CAAC;MACpEtW,WAAK,CAACsW,oCAAoC,CAAC,aAAa,CAAC;MACzDtW,WAAK,CAACsW,oCAAoC,CAACvE,WAAW,CAAC;MACvD/R,WAAK,CAACsW,oCAAoC,CAAC,aAAa,CAAC;MACzDtW,WAAK,CAACsW,oCAAoC,CAACiN,WAAW,CAAC;MACvD,IAAI,CAAClJ,KAAK,CAAC,CAAC;MACZnL,GAAG,CAACkC,QAAQ,CAAC,IAAI,CAACvE,WAAW,CAAC6D,IAAI,EAAE6S,WAAW,CAAC;IACpD;EAAC;IAAAlnB,GAAA;IAAAC,KAAA,EACD,SAAAknB,wBAAwBA,CAAC9T,QAAQ,EAAE;MAC/B,IAAI+T,KAAK,GAAG/E,aAAa,CAACgF,YAAY,CAAC,CAAC;MACxC,IAAIC,SAAS,GAAGF,KAAK,CAAClhB,aAAa,CAAC,OAAO,CAAC;MAC5CohB,SAAS,CAAC1lB,gBAAgB,CAAC,IAAI,CAAC,CAACmJ,OAAO,CAAC,UAASga,GAAG,EAAE;QAAEA,GAAG,CAACpd,MAAM,CAAC,CAAC;MAAE,CAAC,CAAC;MACzE,IAAI4f,QAAQ,GAAGlU,QAAQ,CAACtS,IAAI,CAACymB,QAAQ,CAAC;MACtC,IAAI,CAAC3nB,UAAU,CAACK,OAAO,CAACqnB,QAAQ,CAAC,IAAIA,QAAQ,CAACE,KAAK,CAAC,UAAA1C,GAAG;QAAA,OAAIA,GAAG,CAAC3Y,cAAc,CAAC,eAAe,CAAC;MAAA,EAAC,EAAE;QAC7Fmb,QAAQ,GAAGA,QAAQ,CAACjB,IAAI,CAAC,UAAC9Z,CAAC,EAAE+Z,CAAC;UAAA,OAAK/Z,CAAC,CAACkb,aAAa,GAAGnB,CAAC,CAACmB,aAAa;QAAA,EAAC;MACzE;MACAH,QAAQ,CAACxc,OAAO,CAAC,IAAI,CAAC4c,YAAY,CAAC/E,IAAI,CAAC,IAAI,CAAC,CAAC;MAC9C,IAAI,CAACK,eAAe,CAAC,CAAC;IAC1B;EAAC;IAAAjjB,GAAA;IAAAC,KAAA,EAID,SAAA0nB,YAAYA,CAACC,OAAO,EAAE;MAClB,MAAM,IAAI7Y,KAAK,CAAC,iEAAiE,CAAC;IACtF;EAAC;IAAA/O,GAAA;IAAAC,KAAA,EACD,SAAA4nB,2CAA2CA,CAAA,EAAG;MAAA,IAAAC,MAAA;MAC1C,IAAI,CAACvE,sBAAsB,CAAC,CAAC,CACxB1U,IAAI,CAAC,UAAA9N,IAAI,EAAI;QACV4C,WAAK,CAACsW,oCAAoC,CAAC,sBAAsB,EAAElZ,IAAI,CAAC;QACxE+mB,MAAI,CAACX,wBAAwB,CAACpmB,IAAI,CAAC;MACvC,CAAC,CAAC,SACI,CAAC,UAAAmT,KAAK;QAAA,OAAID,OAAO,CAACC,KAAK,CAAC,QAAQ,EAAEA,KAAK,CAAC;MAAA,EAAC;IACvD;EAAC;IAAAlU,GAAA;IAAAC,KAAA,EACD,SAAA+iB,uBAAuBA,CAAA,EAAG;MACtB,IAAI,CAACpD,gBAAgB,CAAC,CAAC;MACvB,IAAI,CAACmI,kBAAkB,CAAC,CAAC;MACzB,IAAI,CAAC5H,2BAA2B,CAAC,KAAK,CAAC;IAC3C;EAAC;IAAAngB,GAAA;IAAAC,KAAA,EACD,SAAAkjB,qBAAqBA,CAAA,EAAG;MAAA,IAAA6E,MAAA;MACpB,IAAIC,OAAO,GAAG,IAAI,CAACC,eAAe,CAAC,IAAI,CAAC;MACxC,IAAID,OAAO,CAAC5nB,MAAM,IAAI,CAAC,EAAE;QACrBgb,YAAY,CAACH,IAAI,CAAC,oBAAoB,CAAC;QACvC;MACJ;MACA,IAAIiN,WAAW,GAAG9F,aAAa,CAACgB,cAAc,CAAC,CAAC;MAChD,IAAI1N,OAAO,GAAG/R,GAAG,CAACgB,sBAAsB,CAACjD,QAAQ,CAACuE,aAAa,CAACkiB,iBAAiB,CAAC,CAAC;MACnF;AACR;AACA;AACA;AACA;AACA;MACQ,IAAI,CAACC,oBAAoB,CAACJ,OAAO,EAAEE,WAAW,EAAExS,OAAO,CAAC,CACnD9G,IAAI,CAAC,UAAA9N,IAAI,EAAI;QACV,IAAIA,IAAI,CAACunB,UAAU,CAAC,IAAIC,WAAW,EAAE;UACjC,IAAIC,QAAQ,EAAE;YACV7kB,WAAK,CAACsW,oCAAoC,CAAC,gBAAgB,CAAC;YAC5DtW,WAAK,CAACsW,oCAAoC,CAAC,gBAAgB,EAAElZ,IAAI,CAAC;UACtE;UACAinB,MAAI,CAACzE,sBAAsB,CAAC,CAAC;QACjC,CAAC,MACI;UACD5f,WAAK,CAACsW,oCAAoC,CAAC,SAAS,EAAElZ,IAAI,CAAC0nB,WAAW,CAAC,CAAC;UACxEpN,YAAY,CAACH,IAAI,CAACna,IAAI,CAAC0nB,WAAW,CAAC,CAAC;QACxC;MACJ,CAAC,CAAC,SACI,CAAC,UAAAvU,KAAK;QAAA,OAAID,OAAO,CAACC,KAAK,CAAC,QAAQ,EAAEA,KAAK,CAAC;MAAA,EAAC;IACvD;EAAC;IAAAlU,GAAA;IAAAC,KAAA,EACD,SAAAioB,eAAeA,CAAA,EAAoB;MAAA,IAAAQ,MAAA;MAAA,IAAnBC,SAAS,GAAAnlB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAC7B,IAAIykB,OAAO,GAAG,EAAE;MAChB,IAAIW,MAAM;MACVjnB,QAAQ,CAACC,gBAAgB,CAAC4e,WAAW,GAAG,eAAe,CAAC,CAACzV,OAAO,CAAC,UAACga,GAAG,EAAK;QACtE,IAAI4D,SAAS,IAAI,CAAC/kB,GAAG,CAACgE,yBAAyB,CAACmd,GAAG,CAAC,EAAE;QACtD6D,MAAM,GAAGF,MAAI,CAACG,UAAU,CAAC9D,GAAG,CAAC;QAC7BkD,OAAO,CAAC/X,IAAI,CAAC0Y,MAAM,CAAC;MACxB,CAAC,CAAC;MACF,OAAOX,OAAO;IAClB;EAAC;IAAAjoB,GAAA;IAAAC,KAAA,EACD,SAAA4oB,UAAUA,CAAC9D,GAAG,EAAE;MACZ,MAAM,IAAIhW,KAAK,CAAC,+DAA+D,CAAC;IACpF;EAAC;IAAA/O,GAAA;IAAAC,KAAA,EACD,SAAAijB,kCAAkCA,CAAA,EAAG;MAAA,IAAA4F,OAAA;MACjC,IAAIb,OAAO,GAAG,IAAI,CAACC,eAAe,CAAC,IAAI,CAAC;MACxC,IAAID,OAAO,CAAC5nB,MAAM,IAAI,CAAC,EAAE;QACrBgb,YAAY,CAACH,IAAI,CAAC,oBAAoB,CAAC;QACvC;MACJ;MACA,IAAIiN,WAAW,GAAG9F,aAAa,CAACgB,cAAc,CAAC,CAAC;MAChD,IAAI1N,OAAO,GAAG/R,GAAG,CAACgB,sBAAsB,CAACjD,QAAQ,CAACuE,aAAa,CAACkiB,iBAAiB,CAAC,CAAC;MACnF,IAAI,CAACC,oBAAoB,CAACJ,OAAO,EAAEE,WAAW,EAAExS,OAAO,CAAC,CACnD9G,IAAI,CAAC,UAAA9N,IAAI,EAAI;QACV,IAAIA,IAAI,CAACunB,UAAU,CAAC,IAAIC,WAAW,EAAE;UACjC,IAAIC,QAAQ,EAAE;YACV7kB,WAAK,CAACsW,oCAAoC,CAAC,gBAAgB,CAAC;YAC5DtW,WAAK,CAACsW,oCAAoC,CAAC,gBAAgB,EAAElZ,IAAI,CAAC;UACtE;UACA+nB,OAAI,CAAC3B,wBAAwB,CAACpmB,IAAI,CAAC;QACvC,CAAC,MACI;UACD4C,WAAK,CAACsW,oCAAoC,CAAC,SAAS,EAAElZ,IAAI,CAAC0nB,WAAW,CAAC,CAAC;UACxEpN,YAAY,CAACH,IAAI,CAACna,IAAI,CAAC0nB,WAAW,CAAC,CAAC;QACxC;MACJ,CAAC,CAAC,SACI,CAAC,UAAAvU,KAAK;QAAA,OAAID,OAAO,CAACC,KAAK,CAAC,QAAQ,EAAEA,KAAK,CAAC;MAAA,EAAC;IACvD;EAAC;IAAAlU,GAAA;IAAAC,KAAA,EACD,SAAA8nB,kBAAkBA,CAAA,EAAG;MAAA,IAAAgB,OAAA;MACjBre,MAAM,CAACC,sBAAsB,CAACkZ,aAAa,GAAG,UAAU,GAAGnJ,UAAU,EAAExP,eAAe,EAAE,UAACqS,MAAM,EAAK;QAChGA,MAAM,CAACpS,gBAAgB,CAAC,OAAO,EAAE,UAACC,KAAK,EAAK;UACxCA,KAAK,CAACC,eAAe,CAAC,CAAC;UACvBkS,MAAM,GAAGnS,KAAK,CAAC2U,MAAM;UACrB,IAAIxC,MAAM,CAAC/V,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAE;UAChD4N,OAAI,CAACxF,sBAAsB,CAAC,CAAC;QACjC,CAAC,CAAC;QACFhG,MAAM,CAAC/V,SAAS,CAACE,GAAG,CAACyT,eAAe,CAAC;MACzC,CAAC,CAAC;IACN;EAAC;IAAAnb,GAAA;IAAAC,KAAA,EACD,SAAA+oB,sBAAsBA,CAAC5d,KAAK,EAAEmS,MAAM,EAAE;MAClCnS,KAAK,CAACC,eAAe,CAAC,CAAC;MACvB4d,SAAS,CAAChlB,YAAY,CAAC,IAAI,CAACuM,WAAW,CAAC0Y,eAAe,EAAE,CAAC,CAAC,GAAGD,SAAS,CAAC9iB,YAAY,CAAC,IAAI,CAACqK,WAAW,CAAC0Y,eAAe,CAAC,CAAC;MACvH,IAAIrE,KAAK,GAAGljB,QAAQ,CAACuE,aAAa,CAACsa,WAAW,GAAG,QAAQ,CAAC;MAC1D,IAAIqE,KAAK,CAACrd,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAE;MAC/C,IAAI4J,GAAG,GAAGkE,SAAS,CAACE,SAAS,CAAC,IAAI,CAAC;MACnCpE,GAAG,CAACvd,SAAS,CAACG,MAAM,CAACuD,eAAe,CAAC;MACrC6Z,GAAG,CAACnjB,gBAAgB,CAAC,GAAG,GAAGsJ,eAAe,CAAC,CAACH,OAAO,CAAC,UAASjH,OAAO,EAAE;QAClEA,OAAO,CAAC0D,SAAS,CAACG,MAAM,CAACuD,eAAe,CAAC;MAC7C,CAAC,CAAC;MACF,IAAIke,SAAS,GAAGznB,QAAQ,CAACC,gBAAgB,CAAC4e,WAAW,GAAG,eAAe,CAAC,CAACngB,MAAM;MAC/E0kB,GAAG,CAAC9gB,YAAY,CAAC,IAAI,CAACuM,WAAW,CAAC0Y,eAAe,EAAE,CAAC,CAAC,GAAGE,SAAS,CAAC;MAClE,IAAI,CAACC,gBAAgB,CAACxE,KAAK,EAAEE,GAAG,CAAC;MACjCF,KAAK,CAACyE,OAAO,CAACvE,GAAG,CAAC;MAClBF,KAAK,CAACrc,SAAS,GAAG,CAAC;MACnB,IAAI,CAACya,eAAe,CAAC,CAAC;MACtB,IAAI,CAACsG,4BAA4B,CAAC1E,KAAK,CAAC;IAC5C;EAAC;IAAA7kB,GAAA;IAAAC,KAAA,EACD,SAAAopB,gBAAgBA,CAACxE,KAAK,EAAEE,GAAG,EAAE;MACzB,IAAI,IAAI,CAACvU,WAAW,KAAK6R,aAAa,EAAE;QACpC,MAAM,IAAItT,KAAK,CAAC,qEAAqE,CAAC;MAC1F;MACA;IACJ;EAAC;IAAA/O,GAAA;IAAAC,KAAA,EACD,SAAAgjB,eAAeA,CAAA,EAAG;MAAA,IAAAuG,OAAA;MACd,IAAI,IAAI,CAAChZ,WAAW,KAAK6R,aAAa,EAAE;QACpC,MAAM,IAAItT,KAAK,CAAC,0CAA0C,CAAC;MAC/D;MACArE,MAAM,CAACC,sBAAsB,CAAC6V,WAAW,EAAEtV,eAAe,EAAE,UAACkc,KAAK,EAAK;QACnEoC,OAAI,CAACC,aAAa,CAAC,CAAC;MACxB,CAAC,CAAC;IACN;EAAC;IAAAzpB,GAAA;IAAAC,KAAA,EACD,SAAAwpB,aAAaA,CAAA,EAAG;MACZ,IAAIC,cAAc,GAAGlJ,WAAW,GAAG,YAAY,GAAGmJ,UAAU;MAC5D,IAAIC,YAAY,GAAGjoB,QAAQ,CAACuE,aAAa,CAACwjB,cAAc,CAAC;MACzD/lB,WAAK,CAACsW,oCAAoC,CAAC,kBAAkB,EAAE2P,YAAY,CAAC;MAC5E,IAAIR,SAAS,GAAGznB,QAAQ,CAACC,gBAAgB,CAAC4e,WAAW,GAAG,eAAe,CAAC,CAACngB,MAAM;MAC/E4oB,SAAS,GAAGW,YAAY,CAACT,SAAS,CAAC,IAAI,CAAC;MACxCxnB,QAAQ,CAACC,gBAAgB,CAAC8nB,cAAc,CAAC,CAAC3e,OAAO,CAAC,UAASga,GAAG,EAAE;QAC5DA,GAAG,CAACpd,MAAM,CAAC,CAAC;MAChB,CAAC,CAAC;MACFshB,SAAS,CAAChlB,YAAY,CAAC,IAAI,CAACuM,WAAW,CAAC0Y,eAAe,EAAE,CAAC,CAAC,GAAGE,SAAS,CAAC;IAC5E;EAAC;IAAAppB,GAAA;IAAAC,KAAA,EACD,SAAAspB,4BAA4BA,CAAC1E,KAAK,EAAE;MAChC,IAAI,IAAI,CAACrU,WAAW,KAAK6R,aAAa,EAAE;QACpC,MAAM,IAAItT,KAAK,CAAC,sFAAsF,CAAC;MAC3G;IACJ;EAAC;IAAA/O,GAAA;IAAAC,KAAA,EACD,SAAA4pB,kCAAkCA,CAAChF,KAAK,EAAEE,GAAG,EAAE;MAC3C;MACA;MACA,IAAI+E,mBAAmB,GAAGjF,KAAK,CAACjjB,gBAAgB,CAAC,mBAAmB,GAAGmoB,gBAAgB,GAAG,SAAS,GAAGC,UAAU,CAAC;MACjH,IAAIC,eAAe,GAAG,CAAC;MACvBH,mBAAmB,CAAC/e,OAAO,CAAC,UAACmf,MAAM,EAAK;QACpCD,eAAe,GAAGE,IAAI,CAACC,GAAG,CAACH,eAAe,EAAErpB,UAAU,CAACgD,GAAG,CAACgB,sBAAsB,CAACslB,MAAM,CAAC,CAAC,CAAC;MAC/F,CAAC,CAAC;MACF,IAAIG,kBAAkB,GAAGtF,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAG6jB,gBAAgB,GAAG,IAAI,GAAGC,UAAU,CAAC;MACxFpmB,GAAG,CAACQ,kCAAkC,CAACimB,kBAAkB,EAAEJ,eAAe,GAAG,CAAC,CAAC;IACnF;EAAC;IAAAjqB,GAAA;IAAAC,KAAA,EACD,SAAAqqB,8BAA8BA,CAAA,EAAG;MAC7B,IAAIC,oBAAoB,GAAG/J,WAAW,GAAG,eAAe,GAAGuJ,gBAAgB,GAAG,SAAS,GAAGC,UAAU,GAAG,GAAG,GAAGD,gBAAgB;MAC7H,IAAI,CAACS,6BAA6B,CAACD,oBAAoB,CAAC;IAC5D;EAAC;IAAAvqB,GAAA;IAAAC,KAAA,EACD,SAAAuqB,6BAA6BA,CAACC,aAAa,EAA8F;MAAA,IAAAC,OAAA;MAAA,IAA5F/F,OAAO,GAAAnhB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC4H,KAAK,EAAEtH,OAAO,EAAK;QAAE4mB,OAAI,CAACC,kCAAkC,CAACvf,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC;MACnI4G,MAAM,CAACC,sBAAsB,CAAC8f,aAAa,EAAEvf,eAAe,EAAE,UAAC0f,KAAK,EAAK;QACrEA,KAAK,CAACzf,gBAAgB,CAAC,QAAQ,EAAE,UAACC,KAAK,EAAK;UACxCuZ,OAAO,CAACvZ,KAAK,EAAEwf,KAAK,CAAC;QACzB,CAAC,CAAC;QACFjG,OAAO,CAAC,IAAI,EAAEiG,KAAK,CAAC;MACxB,CAAC,CAAC;IACN;EAAC;IAAA5qB,GAAA;IAAAC,KAAA,EACD,SAAA0qB,kCAAkCA,CAACvf,KAAK,EAAEtH,OAAO,EAAE;MAC/C,IAAI+mB,kBAAkB,GAAG,IAAI,CAACC,6BAA6B,CAAChnB,OAAO,CAAC;MACpE,IAAIinB,eAAe,GAAGjnB,OAAO,CAAC0D,SAAS,CAACC,QAAQ,CAACL,SAAS,CAAC;MAC3D,IAAI4jB,cAAc,GAAGpnB,GAAG,CAACmD,4BAA4B,CAACjD,OAAO,CAAC;MAC9D;MACA;MACA;MACA,IAAIknB,cAAc,IAAID,eAAe,EAAE;QACnC;QACA,IAAI,CAAC1F,oCAAoC,CAAC,CAAC;QAC3C,IAAI,CAAC4F,2CAA2C,CAACnnB,OAAO,EAAEknB,cAAc,EAAEH,kBAAkB,CAAC;MACjG;IACJ;EAAC;IAAA7qB,GAAA;IAAAC,KAAA,EACD,SAAA6qB,6BAA6BA,CAAChnB,OAAO,EAAE;MACnC,IAAIghB,IAAI,GAAG,EAAE;MACb,IAAI1f,MAAM,GAAGtB,OAAO;MACpB,IAAImD,OAAO;MACX,OAAO7B,MAAM,EAAE;QACX,IAAIA,MAAM,CAACd,OAAO,CAACC,WAAW,CAAC,CAAC,IAAI,IAAI,EAAE;UACtC0C,OAAO,GAAG7B,MAAM,CAACoC,SAAS,CAACC,QAAQ,CAACL,SAAS,CAAC;UAC9C0d,IAAI,CAAC5U,IAAI,CAACjJ,OAAO,CAAC;QACtB;QACA7B,MAAM,GAAGA,MAAM,CAACC,aAAa;MACjC;MACA,OAAOyf,IAAI;IACf;EAAC;IAAA9kB,GAAA;IAAAC,KAAA,EACD,SAAAgrB,2CAA2CA,CAACnnB,OAAO,EAAEknB,cAAc,EAAEH,kBAAkB,EAAE;MACrF,IAAIhrB,UAAU,CAACK,OAAO,CAAC2qB,kBAAkB,CAAC,EAAE;MAC5C,IAAIK,EAAE,GAAGtnB,GAAG,CAACmB,iBAAiB,CAACjB,OAAO,CAAC;MACvC,IAAIqnB,UAAU,GAAGH,cAAc,IAAIpnB,GAAG,CAACgE,yBAAyB,CAACsjB,EAAE,CAAC;MACpE,IAAIE,WAAW,GAAGP,kBAAkB,CAACQ,KAAK,CAAC,CAAC;MAC5C1nB,WAAK,CAACsW,oCAAoC,CAAC;QAACkR,UAAU,EAAVA,UAAU;QAAEC,WAAW,EAAXA;MAAW,CAAC,CAAC;MACrE,IAAID,UAAU,IAAIC,WAAW,EAAE;QAC3BxnB,GAAG,CAACsD,kBAAkB,CAACgkB,EAAE,EAAEC,UAAU,CAAC;QACtC,IAAI,CAAC9F,oCAAoC,CAAC,CAAC;QAC3C,IAAI,CAAC4F,2CAA2C,CAACC,EAAE,CAAC7lB,aAAa,EAAE8lB,UAAU,EAAEN,kBAAkB,CAAC;MACtG;IACJ;EAAC;IAAA7qB,GAAA;IAAAC,KAAA,EACD,SAAAqrB,6CAA6CA,CAACb,aAAa,EAExD;MAAA,IAAAc,OAAA;MAAA,IAF0D5G,OAAO,GAAAnhB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC4H,KAAK,EAAEtH,OAAO,EAAK;QACvF,IAAI,CAACA,OAAO,CAAC0D,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAEoQ,OAAI,CAACZ,kCAAkC,CAACvf,KAAK,EAAEtH,OAAO,CAAC;MAC7G,CAAC;MACG4G,MAAM,CAACM,kBAAkB,CAAC,QAAQ,EAAEyf,aAAa,EAAE9F,OAAO,CAAC;IAC/D;EAAC;IAAA3kB,GAAA;IAAAC,KAAA,EACD,SAAAurB,qBAAqBA,CAAA,EAAG;MACpB,IAAI,CAAChB,6BAA6B,CAAChK,WAAW,GAAG,qBAAqB,GAAGiL,QAAQ,GAAG,MAAM,GAAGA,QAAQ,CAAC;IAC1G;EAAC;IAAAzrB,GAAA;IAAAC,KAAA,EACD,SAAAyrB,qBAAqBA,CAAA,EAAG;MACpB,IAAI,CAAClB,6BAA6B,CAAChK,WAAW,GAAG,qBAAqB,GAAG9W,QAAQ,GAAG,MAAM,GAAGA,QAAQ,CAAC;IAC1G;EAAC;IAAA1J,GAAA;IAAAC,KAAA,EACD,SAAA0rB,4BAA4BA,CAAA,EAAG;MAC3B,IAAI,CAACnB,6BAA6B,CAAChK,WAAW,GAAG,qBAAqB,GAAGoL,eAAe,GAAG,MAAM,GAAGA,eAAe,CAAC;IACxH;EAAC;IAAA5rB,GAAA;IAAAC,KAAA,EACD,SAAA4rB,sBAAsBA,CAAA,EAAG;MACrB,IAAI,CAACrB,6BAA6B,CAAChK,WAAW,GAAG,qBAAqB,GAAGsL,SAAS,GAAG,MAAM,GAAGA,SAAS,CAAC;IAC5G;EAAC;IAAA9rB,GAAA;IAAAC,KAAA,EACD,SAAA8rB,kBAAkBA,CAAA,EAA2G;MAAA,IAAAC,OAAA;MAAA,IAA1GC,SAAS,GAAAzoB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,EAAE;MAAA,IAAE0oB,iBAAiB,GAAA1oB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC4H,KAAK,EAAEtH,OAAO,EAAK;QAAEkoB,OAAI,CAAChD,sBAAsB,CAAC5d,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC;MACvH,IAAIqoB,cAAc,GAAG,kBAAkB,IAAItsB,UAAU,CAACK,OAAO,CAAC+rB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,GAAGA,SAAS,CAAC,GAAG,qBAAqB,GAAG/jB,UAAU,GAAG,IAAI,GAAGD,UAAU,GAAG,GAAG,GAAGC,UAAU;MAC5K,IAAIkkB,oBAAoB,GAAGD,cAAc,GAAG,GAAG,GAAGpkB,UAAU;MAC5D,IAAIskB,sBAAsB,GAAGF,cAAc,GAAG,QAAQ,GAAGpkB,UAAU,GAAG,GAAG;MACzEpE,WAAK,CAACsW,oCAAoC,CAAC,sBAAsB,EAAEmS,oBAAoB,EAAEC,sBAAsB,CAAC;MAChH,IAAI,CAACC,sBAAsB,CAACF,oBAAoB,EAAEC,sBAAsB,CAAC;MACzE,IAAI,CAACE,wBAAwB,CAACH,oBAAoB,EAAEC,sBAAsB,CAAC;MAC3E3hB,MAAM,CAACM,kBAAkB,CACrB,OAAO,EACL,kBAAkB,IAAInL,UAAU,CAACK,OAAO,CAAC+rB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,GAAGA,SAAS,CAAC,GAAG,qBAAqB,GAAG/jB,UAAU,GAAG,IAAI,GAAGD,UAAU,GAAG,GAAG,GAAGC,UAAU,EACvJ,UAACkD,KAAK,EAAEmS,MAAM,EAAK;QAAE2O,iBAAiB,CAAC9gB,KAAK,EAAEmS,MAAM,CAAC;MAAE,CAC7D,CAAC;IACL;EAAC;IAAAvd,GAAA;IAAAC,KAAA,EACD,SAAAqsB,sBAAsBA,CAACF,oBAAoB,EAAEC,sBAAsB,EAAoG;MAAA,IAAAG,OAAA;MAAA,IAAlGC,aAAa,GAAAjpB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC4H,KAAK,EAAEtH,OAAO,EAAK;QAAE0oB,OAAI,CAAC7B,kCAAkC,CAACvf,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC;MACjK4G,MAAM,CAACM,kBAAkB,CAAC,OAAO,EAAEohB,oBAAoB,EAAE,UAAChhB,KAAK,EAAEtH,OAAO,EAAK;QACzE0oB,OAAI,CAACE,0BAA0B,CAACthB,KAAK,EAAEtH,OAAO,EAAEsoB,oBAAoB,EAAEC,sBAAsB,EAAE,UAACM,WAAW,EAAEC,aAAa,EAAK;UAAEH,aAAa,CAACE,WAAW,EAAEC,aAAa,CAAC;QAAE,CAAC,CAAC;MACjL,CAAC,CAAC;IACN;EAAC;IAAA5sB,GAAA;IAAAC,KAAA,EACD,SAAAysB,0BAA0BA,CAACthB,KAAK,EAAEtH,OAAO,EAAEsoB,oBAAoB,EAAEC,sBAAsB,EAAoG;MAAA,IAAAQ,OAAA;MAAA,IAAlGJ,aAAa,GAAAjpB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC4H,KAAK,EAAEtH,OAAO,EAAK;QAAE+oB,OAAI,CAAClC,kCAAkC,CAACvf,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC;MACrL,IAAIA,OAAO,CAACQ,OAAO,CAACC,WAAW,CAAC,CAAC,IAAI,KAAK,EAAET,OAAO,GAAGA,OAAO,CAACuB,aAAa;MAC3E,IAAIynB,aAAa,GAAGlpB,GAAG,CAAC0E,gCAAgC,CAACxE,OAAO,CAAC;MACjE,IAAIipB,QAAQ,GAAGjpB,OAAO,CAAC0D,SAAS,CAACC,QAAQ,CAACL,SAAS,CAAC;MACpD,IAAI2d,GAAG,GAAGnhB,GAAG,CAACmB,iBAAiB,CAACjB,OAAO,CAAC;MACxC,IAAIihB,GAAG,CAACvd,SAAS,CAACC,QAAQ,CAACkiB,UAAU,CAAC,IAAI,CAAC/lB,GAAG,CAACgE,yBAAyB,CAACmd,GAAG,CAAC,EAAE;QAC3EA,GAAG,CAACiI,UAAU,CAACC,WAAW,CAAClI,GAAG,CAAC;MACnC,CAAC,MACI;QACD,IAAImI,iBAAiB,GAAGvrB,QAAQ,CAACuE,aAAa,CAACinB,2BAA2B,GAAG,IAAI,GAAGllB,UAAU,GAAG,GAAG,GAAGC,UAAU,GAAG,GAAG,GAAGklB,OAAO,CAAC;QAClI,IAAIC,SAAS,GAAGH,iBAAiB,CAAC/D,SAAS,CAAC,IAAI,CAAC;QACjDvlB,GAAG,CAACI,gCAAgC,CAACqpB,SAAS,EAAEP,aAAa,CAAC;QAC9DlpB,GAAG,CAACG,+BAA+B,CAACspB,SAAS,EAAE,KAAK,CAAC;QACrD,IAAIN,QAAQ,EAAEM,SAAS,CAAC7lB,SAAS,CAACE,GAAG,CAACN,SAAS,CAAC;QAChDtD,OAAO,CAACwpB,WAAW,CAACD,SAAS,CAAC;QAC9BZ,aAAa,CAAC,IAAI,EAAEY,SAAS,CAAC;QAC9B,IAAI,CAACd,wBAAwB,CAACH,oBAAoB,EAAEC,sBAAsB,EAAE,UAACM,WAAW,EAAEC,aAAa,EAAK;UAAEH,aAAa,CAACE,WAAW,EAAEC,aAAa,CAAC;QAAE,CAAC,CAAC;MAC/J;MACA,IAAI,CAACvH,oCAAoC,CAAC,CAAC;IAC/C;EAAC;IAAArlB,GAAA;IAAAC,KAAA,EACD,SAAAssB,wBAAwBA,CAACH,oBAAoB,EAAEC,sBAAsB,EAAoG;MAAA,IAAAkB,OAAA;MAAA,IAAlGd,aAAa,GAAAjpB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC4H,KAAK,EAAEtH,OAAO,EAAK;QAAEypB,OAAI,CAAC5C,kCAAkC,CAACvf,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC;MACnK4G,MAAM,CAACM,kBAAkB,CAAC,OAAO,EAAEqhB,sBAAsB,EAAE,UAACjhB,KAAK,EAAEtH,OAAO,EAAK;QAC3EypB,OAAI,CAACC,4BAA4B,CAACpiB,KAAK,EAAEtH,OAAO,EAAEsoB,oBAAoB,EAAEC,sBAAsB,EAAE,UAACM,WAAW,EAAEC,aAAa,EAAK;UAAEH,aAAa,CAACE,WAAW,EAAEC,aAAa,CAAC;QAAE,CAAC,CAAC;MACnL,CAAC,CAAC;IACN;EAAC;IAAA5sB,GAAA;IAAAC,KAAA,EACD,SAAAutB,4BAA4BA,CAACpiB,KAAK,EAAEtH,OAAO,EAAEsoB,oBAAoB,EAAEC,sBAAsB,EAAoG;MAAA,IAAAoB,OAAA;MAAA,IAAlGhB,aAAa,GAAAjpB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC4H,KAAK,EAAEtH,OAAO,EAAK;QAAE2pB,OAAI,CAAC9C,kCAAkC,CAACvf,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC;MACvL,IAAIA,OAAO,CAACQ,OAAO,CAACC,WAAW,CAAC,CAAC,IAAI,KAAK,EAAET,OAAO,GAAGA,OAAO,CAACuB,aAAa;MAC3E,IAAIynB,aAAa,GAAGlpB,GAAG,CAAC0E,gCAAgC,CAACxE,OAAO,CAAC;MACjE,IAAIipB,QAAQ,GAAGnpB,GAAG,CAACoD,cAAc,CAAClD,OAAO,CAAC;MAC1C,IAAI4pB,oBAAoB,GAAG/rB,QAAQ,CAACuE,aAAa,CAACinB,2BAA2B,GAAG,IAAI,GAAGllB,UAAU,GAAG,GAAG,GAAGC,UAAU,GAAG,GAAG,GAAGH,UAAU,CAAC;MACxI,IAAI4lB,YAAY,GAAGD,oBAAoB,CAACvE,SAAS,CAAC,IAAI,CAAC;MACvDvlB,GAAG,CAACI,gCAAgC,CAAC2pB,YAAY,EAAEb,aAAa,CAAC;MACjElpB,GAAG,CAACG,+BAA+B,CAAC4pB,YAAY,EAAE,IAAI,CAAC;MACvD,IAAIZ,QAAQ,EAAEY,YAAY,CAACnmB,SAAS,CAACE,GAAG,CAACN,SAAS,CAAC;MACnDtD,OAAO,CAACwpB,WAAW,CAACK,YAAY,CAAC;MACjClB,aAAa,CAAC,IAAI,EAAEkB,YAAY,CAAC;MACjC,IAAI,CAACrB,sBAAsB,CAACF,oBAAoB,EAAEC,sBAAsB,EAAE,UAACM,WAAW,EAAEC,aAAa,EAAK;QAAEH,aAAa,CAACE,WAAW,EAAEC,aAAa,CAAC;MAAE,CAAC,CAAC;MACzJ,IAAI,CAACvH,oCAAoC,CAAC,CAAC;IAC/C;EAAC;IAAArlB,GAAA;IAAAC,KAAA,EACD,SAAA2tB,oBAAoBA,CAAA,EAAG;MACnB,IAAI,CAACC,0BAA0B,CAACC,eAAe,EAAEnqB,WAAK,CAACmW,eAAe,CAACiU,YAAY,CAAC,CAAC;IACzF;EAAC;IAAA/tB,GAAA;IAAAC,KAAA,EACD,SAAA4tB,0BAA0BA,CACtBG,SAAS,EACPC,UAAU,EAId;MAAA,IAAAC,OAAA;MAAA,IAHIC,YAAY,GAAA3qB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MAAA,IACnB4qB,SAAS,GAAA5qB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC6qB,WAAW,EAAK;QAAEH,OAAI,CAACvL,mBAAmB,CAAC0L,WAAW,CAAC;MAAE,CAAC;MAAA,IACvE5B,aAAa,GAAAjpB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC4H,KAAK,EAAEtH,OAAO,EAAK;QAAEoqB,OAAI,CAACvD,kCAAkC,CAACvf,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC;MAElG,IAAIqqB,YAAY,IAAI,IAAI,EAAEA,YAAY,GAAG3N,WAAW,GAAG,qBAAqB,GAAGwN,SAAS;MACxFtjB,MAAM,CAACM,kBAAkB,CAAC,OAAO,EAAEmjB,YAAY,GAAG,OAAO,GAAGH,SAAS,EAAE,UAAC5iB,KAAK,EAAEd,GAAG,EAAK;QACnF4jB,OAAI,CAACI,8BAA8B,CAC/BljB,KAAK,EACHd,GAAG,EACH0jB,SAAS,EACTC,UAAU,EACVE,YAAY,EACZ,UAACE,WAAW,EAAK;UAAED,SAAS,CAC1BC,WAAW,EACT,UAACjjB,KAAK,EAAEtH,OAAO,EAAK;YAAE2oB,aAAa,CAACrhB,KAAK,EAAEtH,OAAO,CAAC;UAAE,CAC3D,CAAC;QAAE,CACP,CAAC;MACL,CAAC,CAAC;MACFsqB,SAAS,CAACD,YAAY,GAAG,UAAU,GAAGH,SAAS,CAAC;IACpD;EAAC;IAAAhuB,GAAA;IAAAC,KAAA,EACD,SAAA0iB,mBAAmBA,CAAC0L,WAAW,EAAoG;MAAA,IAAAE,OAAA;MAAA,IAAlG9B,aAAa,GAAAjpB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC4H,KAAK,EAAEtH,OAAO,EAAK;QAAEyqB,OAAI,CAAC5D,kCAAkC,CAACvf,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC;MAC7H,IAAI,CAAC0mB,6BAA6B,CAAC6D,WAAW,EAAE,UAACjjB,KAAK,EAAEtH,OAAO,EAAK;QAAE2oB,aAAa,CAACrhB,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC,CAAC;IAC3G;EAAC;IAAA9D,GAAA;IAAAC,KAAA,EACD,SAAAquB,8BAA8BA,CAACljB,KAAK,EAAEd,GAAG,EAAE0jB,SAAS,EAAEQ,gBAAgB,EAAkG;MAAA,IAAAC,OAAA;MAAA,IAAhGN,YAAY,GAAA3qB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MAAA,IAAE4qB,SAAS,GAAA5qB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,UAAC2qB,YAAY,EAAK;QAAEM,OAAI,CAAC9L,mBAAmB,CAACwL,YAAY,CAAC;MAAE,CAAC;MAClK,IAAItuB,UAAU,CAACK,OAAO,CAACiuB,YAAY,CAAC,EAAEA,YAAY,GAAG3N,WAAW,GAAG,qBAAqB,GAAGwN,SAAS;MACpG,IAAIU,UAAU,GAAG9qB,GAAG,CAACuE,+BAA+B,CAACmC,GAAG,CAAC;MACzD,IAAIqkB,EAAE,GAAG/qB,GAAG,CAACiB,kBAAkB,CAACyF,GAAG,CAAC;MACpCqkB,EAAE,CAACloB,SAAS,GAAG,EAAE;MACjB,IAAImoB,GAAG,GAAGjtB,QAAQ,CAACwI,aAAa,CAAC,QAAQ,CAAC;MAC1CykB,GAAG,CAACpnB,SAAS,CAACE,GAAG,CAACsmB,SAAS,CAAC;MAC5BpqB,GAAG,CAACQ,kCAAkC,CAACwqB,GAAG,EAAEF,UAAU,CAAC;MACvD,IAAI1kB,UAAU,EAAEE,MAAM;MACtB,IAAIse,QAAQ,EAAE;QACV7kB,WAAK,CAACsW,oCAAoC,CAAC,8BAA8B,CAAC;QAC1EtW,WAAK,CAACsW,oCAAoC,CAAC;UAACuU,gBAAgB,EAAhBA,gBAAgB;UAAEL,YAAY,EAAZA;QAAY,CAAC,CAAC;MAChF;MACAjkB,MAAM,GAAGtG,GAAG,CAACmG,YAAY,CAAC,IAAI,CAAC;MAC/B6kB,GAAG,CAACjI,WAAW,CAACzc,MAAM,CAAC;MACvBskB,gBAAgB,CAACzjB,OAAO,CAAC,UAAC8jB,gBAAgB,EAAK;QAC3C7kB,UAAU,GAAGoR,eAAe,CAACiG,2BAA2B,CAACwN,gBAAgB,EAAEH,UAAU,CAAC;QACtFxkB,MAAM,GAAGtG,GAAG,CAACmG,YAAY,CAACC,UAAU,CAAC;QACrC4kB,GAAG,CAACjI,WAAW,CAACzc,MAAM,CAAC;MAC3B,CAAC,CAAC;MACFykB,EAAE,CAAChI,WAAW,CAACiI,GAAG,CAAC;MACnB,IAAIP,WAAW,GAAGF,YAAY,GAAG,UAAU,GAAGH,SAAS;MACvDI,SAAS,CAACC,WAAW,CAAC;IAC1B;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;EANI;IAAAruB,GAAA;IAAAC,KAAA,EAOA,SAAA6uB,qBAAqBA,CAACC,UAAU,EAAEC,WAAW,EAAE;MAC3C,IAAI,CAACC,4BAA4B,CAACF,UAAU,EAAEC,WAAW,EAAE7T,eAAe,CAAC;IAC/E;EAAC;IAAAnb,GAAA;IAAAC,KAAA,EACD,SAAAivB,2BAA2BA,CAACH,UAAU,EAAEC,WAAW,EAAE;MACjD,IAAI,CAACC,4BAA4B,CAACF,UAAU,EAAEC,WAAW,EAAE7T,eAAe,CAAC;IAC/E;EAAC;IAAAnb,GAAA;IAAAC,KAAA,EAED,SAAAkvB,2BAA2BA,CAAA,EAAiB;MAAA,IAAAC,OAAA;MAAA,IAAhBC,OAAO,GAAA7rB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MACtC,IAAI6rB,OAAO,IAAI,IAAI,EAAEA,OAAO,GAAG7O,WAAW;MAC1C,IAAI,CAACqN,0BAA0B,CAC3B7X,mBAAmB,EACjBrS,WAAK,CAACmW,eAAe,CAACwV,uBAAuB,CAAC,CAAChJ,IAAI,CAAC,UAAC9Z,CAAC,EAAE+Z,CAAC;QAAA,OAAK/Z,CAAC,CAAC9C,QAAQ,CAAC,CAAC8c,aAAa,CAACD,CAAC,CAAC7c,QAAQ,CAAC,CAAC;MAAA,EAAC,EACrG2lB,OAAO,GAAG,qBAAqB,GAAGrZ,mBAAmB,CAAC;MAAA,EACtD,UAACmY,YAAY,EAAK;QAAEiB,OAAI,CAACG,yBAAyB,CAACpB,YAAY,CAAC;MAAE,CACxE,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAAsvB,yBAAyBA,CAAClB,WAAW,EAAE;MAAA,IAAAmB,OAAA;MACnC,IAAI,CAAChF,6BAA6B,CAAC6D,WAAW,EAAE,UAACjjB,KAAK,EAAEtH,OAAO,EAAK;QAAE0rB,OAAI,CAACC,8BAA8B,CAACrkB,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC,CAAC;IACjI;EAAC;IAAA9D,GAAA;IAAAC,KAAA,EACD,SAAAwvB,8BAA8BA,CAACrkB,KAAK,EAAEskB,WAAW,EAAE;MAC/C,IAAI3K,GAAG,GAAGnhB,GAAG,CAACmB,iBAAiB,CAAC2qB,WAAW,CAAC;MAC5C,IAAIC,uBAAuB,GAAG,IAAI,CAACC,uBAAuB,CAAC7K,GAAG,CAAC,CAAC,CAAC;MACjE,IAAI,CAAC4F,kCAAkC,CAACvf,KAAK,EAAEskB,WAAW,CAAC;MAC3D,IAAIG,uBAAuB,GAAG,IAAI,CAACD,uBAAuB,CAAC7K,GAAG,CAAC,CAAC,CAAC;MACjE,IACI4K,uBAAuB,IAAIE,uBAAuB,IAC/CA,uBAAuB,IAAI,CAAC,EACjC;MACF5b,OAAO,CAACoG,GAAG,CAAC;QAAEwV,uBAAuB,EAAvBA,uBAAuB;QAAEF,uBAAuB,EAAvBA;MAAwB,CAAC,CAAC;MACjE,IAAIG,uBAAuB,GAAG,IAAI,CAACC,0BAA0B,CAAC,CAAC;MAC/D,IAAIC,SAAS,GAAGjL,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAG0Q,WAAW,CAAC;MACtDoZ,SAAS,CAACpJ,aAAa,CAAC,IAAIC,KAAK,CAAC,OAAO,CAAC,CAAC;MAC3C,IAAIoJ,UAAU,GAAGlL,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAG0Q,WAAW,GAAG,UAAU,GAAGA,WAAW,CAAC;MAClFqZ,UAAU,CAACxpB,SAAS,GAAG,EAAE;MACzBwpB,UAAU,CAACtJ,WAAW,CAAC/iB,GAAG,CAACmG,YAAY,CAAC,IAAI,CAAC,CAAC;MAC9C,IAAIC,UAAU,EAAEE,MAAM;MACtB,IAAIic,kBAAkB,GAAGxiB,WAAK,CAACmW,eAAe,CAACoM,cAAc,CAAC,CAAClgB,MAAM,CAAC,UAAAogB,OAAO;QAAA,OACzE,CACIA,OAAO,CAACL,qBAAqB,CAAC,IAAI8J,uBAAuB,IACtDA,uBAAuB,IAAI,CAAC,MAG5BzJ,OAAO,CAACL,qBAAqB,CAAC,IAAI+J,uBAAuB,IACzDA,uBAAuB,IAAI,CAAC,CAClC;MAAA,CACL,CAAC;MACD,IAAIzJ,cAAc,GAAGF,kBAAkB,CAACG,IAAI,CAAC,UAAC9Z,CAAC,EAAE+Z,CAAC;QAAA,OAAK/Z,CAAC,CAAC9C,QAAQ,CAAC,CAAC8c,aAAa,CAACD,CAAC,CAAC7c,QAAQ,CAAC,CAAC;MAAA,EAAC;MAC9F2c,cAAc,CAACtb,OAAO,CAAC,UAACqb,OAAO,EAAK;QAChCpc,UAAU,GAAGoR,eAAe,CAACiG,2BAA2B,CAAC+E,OAAO,CAAC;QACjElc,MAAM,GAAGtG,GAAG,CAACmG,YAAY,CAACC,UAAU,CAAC;QACrCimB,UAAU,CAACtJ,WAAW,CAACzc,MAAM,CAAC;MAClC,CAAC,CAAC;MACF,IAAI,CAACygB,kCAAkC,CAACvf,KAAK,EAAE6kB,UAAU,CAAC;IAC9D;EAAC;IAAAjwB,GAAA;IAAAC,KAAA,EACD,SAAAiwB,mBAAmBA,CAAA,EAAiB;MAAA,IAAAC,OAAA;MAAA,IAAhBd,OAAO,GAAA7rB,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MAC9B,IAAI6rB,OAAO,IAAI,IAAI,EAAEA,OAAO,GAAG7O,WAAW;MAC1C9V,MAAM,CAACM,kBAAkB,CAAC,OAAO,EAAEqkB,OAAO,GAAG,qBAAqB,GAAGzY,WAAW,GAAG,OAAO,GAAGA,WAAW,EAAE,UAACxL,KAAK,EAAEd,GAAG,EAAK;QACtH3G,WAAK,CAACsW,oCAAoC,CAAC3P,GAAG,CAAC;QAC/C,IAAI8lB,QAAQ,GAAGxsB,GAAG,CAACmB,iBAAiB,CAACuF,GAAG,CAAC;QACzC3G,WAAK,CAACsW,oCAAoC,CAAC;UAAE3P,GAAG,EAAHA,GAAG;UAAE8lB,QAAQ,EAARA;QAAS,CAAC,CAAC;QAC7D,IAAIC,iBAAiB,GAAGD,QAAQ,CAAClqB,aAAa,CAAC,KAAK,GAAG8P,mBAAmB,CAAC;QAC3E,IAAIsa,oBAAoB,GAAGH,OAAI,CAACP,uBAAuB,CAACQ,QAAQ,CAAC,CAAC,CAAC;QACnE,IAAIN,uBAAuB,GAAGK,OAAI,CAACJ,0BAA0B,CAAC,CAAC;QAC/D,IAAIQ,iBAAiB,GAAG5sB,WAAK,CAACmW,eAAe,CAACoM,cAAc,CAAC;QAC7D,IAAIC,kBAAkB,GAAGoK,iBAAiB,CAACvqB,MAAM,CAAC,UAAAogB,OAAO;UAAA,OACrD,CACIA,OAAO,CAACL,qBAAqB,CAAC,IAAIuK,oBAAoB,IACnDA,oBAAoB,IAAI,CAAC,MAGzBlK,OAAO,CAACL,qBAAqB,CAAC,IAAI+J,uBAAuB,IACzDA,uBAAuB,IAAI,CAAC,CAClC;QAAA,CACL,CAAC;QACD,IAAIzJ,cAAc,GAAGF,kBAAkB,CAACG,IAAI,CAAC,UAAC9Z,CAAC,EAAE+Z,CAAC;UAAA,OAAK/Z,CAAC,CAAC9C,QAAQ,CAAC,CAAC8c,aAAa,CAACD,CAAC,CAAC7c,QAAQ,CAAC,CAAC;QAAA,EAAC;QAC9F/F,WAAK,CAACsW,oCAAoC,CAAC;UAAEoW,iBAAiB,EAAjBA,iBAAiB;UAAEC,oBAAoB,EAApBA,oBAAoB;UAAER,uBAAuB,EAAvBA,uBAAuB;UAAES,iBAAiB,EAAjBA,iBAAiB;UAAEpK,kBAAkB,EAAlBA;QAAmB,CAAC,CAAC;QACvJxiB,WAAK,CAACsW,oCAAoC,CAACsW,iBAAiB,CAAC;QAC7DJ,OAAI,CAAC7B,8BAA8B,CAC/BljB,KAAK,EACHd,GAAG,EACHsM,WAAW,CAAC;QAAA,EACZyP,cAAc,CAAC;QAAA,EACfgJ,OAAO,GAAG,qBAAqB,GAAGzY,WAAW,CAAC;QAAA,EAC9C,UAACuX,YAAY,EAAK;UAAEgC,OAAI,CAACxN,mBAAmB,CAC1CwL,YAAY,EACV,UAAC/iB,KAAK,EAAEtH,OAAO,EAAK;YAAEqsB,OAAI,CAACK,sBAAsB,CAACplB,KAAK,EAAEtH,OAAO,CAAC;UAAE,CACzE,CAAC;QAAE,CACP,CAAC;MACL,CAAC,CAAC;MACF,IAAI,CAAC6e,mBAAmB,CACpB0M,OAAO,GAAG,qBAAqB,GAAGzY,WAAW,GAAG,UAAU,GAAGA,WAAW,EACtE,UAACxL,KAAK,EAAEtH,OAAO,EAAK;QAAEqsB,OAAI,CAACK,sBAAsB,CAACplB,KAAK,EAAEtH,OAAO,CAAC;MAAE,CACzE,CAAC;IACL;EAAC;IAAA9D,GAAA;IAAAC,KAAA,EACD,SAAAuwB,sBAAsBA,CAACplB,KAAK,EAAE6kB,UAAU,EAAE;MACtC;MACA,IAAIlL,GAAG,GAAGnhB,GAAG,CAACmB,iBAAiB,CAACkrB,UAAU,CAAC;MAC3C,IAAI,CAACtF,kCAAkC,CAACvf,KAAK,EAAE6kB,UAAU,CAAC;MAC1D,IAAIN,uBAAuB,GAAG,IAAI,CAACC,uBAAuB,CAAC7K,GAAG,CAAC;MAC/D,IAAI0L,YAAY,GAAG,IAAI,CAACC,eAAe,CAAC3L,GAAG,CAAC;MAC5C,IAAI4L,UAAU,GAAGzK,cAAc,CAACuK,YAAY,CAAC;MAC7C;MACA,IAAIE,UAAU,IAAI,IAAI,IAAIhB,uBAAuB,IAAIgB,UAAU,CAAC5K,qBAAqB,CAAC,EAAE;MACxF,IAAI6K,kBAAkB,GAAG7L,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAG8P,mBAAmB,GAAG,MAAM,CAAC;MAChF,IAAI4a,kBAAkB,EAAEA,kBAAkB,CAAChK,aAAa,CAAC,IAAIC,KAAK,CAAC,OAAO,CAAC,CAAC;MAC5E,IAAIgK,kBAAkB,GAAG9L,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAG8P,mBAAmB,GAAG,UAAU,GAAGA,mBAAmB,CAAC;MAC1GpS,GAAG,CAACS,sBAAsB,CAACwsB,kBAAkB,EAAEF,UAAU,CAAC5K,qBAAqB,CAAC,CAAC;MACjF;MACA,IAAI,CAAC4E,kCAAkC,CAACvf,KAAK,EAAEylB,kBAAkB,CAAC;IACtE;EAAC;IAAA7wB,GAAA;IAAAC,KAAA,EACD,SAAA2vB,uBAAuBA,CAAC1E,EAAE,EAAE;MACxB,IAAI4F,sBAAsB,GAAG5F,EAAE,CAAChlB,aAAa,CAAC,KAAK,GAAG8P,mBAAmB,GAAG,IAAI,GAAGA,mBAAmB,CAAC;MACvG,OAAOpS,GAAG,CAACuE,+BAA+B,CAAC2oB,sBAAsB,CAAC;IACtE;EAAC;IAAA9wB,GAAA;IAAAC,KAAA,EACD,SAAA8vB,0BAA0BA,CAAA,EAAG;MACzB,IAAIra,WAAW,GAAG2M,aAAa,CAACgB,cAAc,CAAC,CAAC;MAChD,IAAI4C,iBAAiB,GAAG,CAAC;MACzB,IAAIvQ,WAAW,IAAI,IAAI,EAAE,OAAOuQ,iBAAiB;MACjD,IAAI8K,qBAAqB,GAAGrb,WAAW,CAACxP,aAAa,CAAC,GAAG,GAAG6f,qBAAqB,CAAC;MAClF,IAAIiL,aAAa,GAAGtb,WAAW,CAACxP,aAAa,CAAC,GAAG,GAAG6gB,aAAa,CAAC;MAClE,IAAIkK,iCAAiC,GAAGrtB,GAAG,CAACuE,+BAA+B,CAAC4oB,qBAAqB,CAAC;MAClGptB,WAAK,CAACsW,oCAAoC,CAAC;QAAEgX,iCAAiC,EAAjCA;MAAkC,CAAC,CAAC;MACjF,IAAIA,iCAAiC,IAAI,EAAE,EAAE;QACzC,IAAIC,yBAAyB,GAAGttB,GAAG,CAACuE,+BAA+B,CAAC6oB,aAAa,CAAC;QAClFrtB,WAAK,CAACsW,oCAAoC,CAAC;UAAEiX,yBAAyB,EAAzBA;QAA0B,CAAC,CAAC;QACzE,IAAIA,yBAAyB,IAAI,EAAE,EAAE;UACjC,IAAI9K,OAAO,GAAGF,cAAc,CAACgL,yBAAyB,CAAC;UACvDjL,iBAAiB,GAAGG,OAAO,CAACL,qBAAqB,CAAC;QACtD;MACJ,CAAC,MAAM;QACHE,iBAAiB,GAAGrT,MAAM,CAACqe,iCAAiC,CAAC;MACjE;MACA,OAAOhL,iBAAiB;IAC5B;EAAC;IAAAjmB,GAAA;IAAAC,KAAA,EACD,SAAAkxB,2BAA2BA,CAAA,EAAG;MAC1B,IAAIrB,uBAAuB,GAAG,IAAI,CAACC,0BAA0B,CAAC,CAAC;MAC/D,OAAO,EAAElwB,UAAU,CAACK,OAAO,CAAC4vB,uBAAuB,CAAC,IAAIA,uBAAuB,IAAI,CAAC,CAAC;IACzF;EAAC;IAAA9vB,GAAA;IAAAC,KAAA,EACD,SAAAywB,eAAeA,CAACxF,EAAE,EAAE;MAChB,IAAIkG,cAAc,GAAGlG,EAAE,CAAChlB,aAAa,CAAC,KAAK,GAAG0Q,WAAW,GAAG,IAAI,GAAGA,WAAW,CAAC;MAC/E,OAAOhT,GAAG,CAACuE,+BAA+B,CAACipB,cAAc,CAAC;IAC9D;EAAC;IAAApxB,GAAA;IAAAC,KAAA,EACD,SAAAoxB,kBAAkBA,CAAA,EAAG;MACjB,IAAI3b,WAAW,GAAG2M,aAAa,CAACgB,cAAc,CAAC,CAAC;MAChD,IAAI2N,aAAa,GAAGtb,WAAW,CAACxP,aAAa,CAAC,GAAG,GAAG6gB,aAAa,CAAC;MAClE,IAAImK,yBAAyB,GAAGttB,GAAG,CAACuE,+BAA+B,CAAC6oB,aAAa,CAAC;MAClF,IAAIM,SAAS,GAAG1e,MAAM,CAACse,yBAAyB,CAAC;MACjD,OAAOI,SAAS;IACpB;EAAC;IAAAtxB,GAAA;IAAAC,KAAA,EACD,SAAAsxB,mBAAmBA,CAAA,EAAG;MAClB,IAAIC,eAAe,GAAG,IAAI,CAACH,kBAAkB,CAAC,CAAC;MAC/C,OAAO,EAAExxB,UAAU,CAACK,OAAO,CAACsxB,eAAe,CAAC,IAAIA,eAAe,IAAI,CAAC,CAAC;IACzE;EAAC;IAAAxxB,GAAA;IAAAC,KAAA,EACD,SAAAwxB,eAAeA,CAAA,EAAG;MACd,IAAI,CAAC5D,0BAA0B,CAAC6D,OAAO,EAAE/tB,WAAK,CAACmW,eAAe,CAAC6X,UAAU,CAAC,CAAC;IAC/E;EAAC;IAAA3xB,GAAA;IAAAC,KAAA,EACD,SAAA2xB,WAAWA,CAAC1G,EAAE,EAAE;MACZ,IAAI2G,UAAU,GAAG3G,EAAE,CAAChlB,aAAa,CAAC,KAAK,GAAGwrB,OAAO,GAAG,IAAI,GAAGA,OAAO,CAAC;MACnE,OAAO9tB,GAAG,CAACuE,+BAA+B,CAAC0pB,UAAU,CAAC;IAC1D;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EAZI;IAAA7xB,GAAA;IAAAC,KAAA,EAaA,SAAA+d,KAAKA,CAAA,EAAG;MACJ,IAAI,IAAI,CAACxN,WAAW,KAAK6R,aAAa,EAAE;QACpC,MAAM,IAAItT,KAAK,CAAC,gCAAgC,CAAC;MACrD;MACA8R,uBAAA,CAAAwB,aAAA;MACA,IAAI3M,WAAW,GAAG2M,aAAa,CAACgB,cAAc,CAAC,CAAC;MAChD,IAAIpD,QAAQ,GAAG,CAAC,CAAC;MACjBA,QAAQ,CAAClK,eAAe,CAAC,GAAGnS,GAAG,CAAC2B,gBAAgB,CAACmQ,WAAW,CAAC;MAC7D,IAAI,CAACsK,mBAAmB,CAACC,QAAQ,CAAC;IACtC;EAAC;IAAAjgB,GAAA;IAAAC,KAAA,EAED,SAAAgvB,4BAA4BA,CAAC6C,UAAU,EAAEC,cAAc,EAAEC,aAAa,EAAE;MACpE,IAAI5K,KAAK,GAAG/E,aAAa,CAACgF,YAAY,CAAC,CAAC;MACxC,IAAI4K,QAAQ,GAAG7K,KAAK,CAAClhB,aAAa,CAAC,KAAK,GAAG4rB,UAAU,CAAC;MACtD,IAAII,eAAe,GAAGD,QAAQ,CAACzqB,SAAS,CAACC,QAAQ,CAACuqB,aAAa,CAAC;MAChE,IAAID,cAAc,IAAIG,eAAe,EAAE;MACvCtuB,GAAG,CAACuD,6BAA6B,CAAC8qB,QAAQ,EAAEF,cAAc,EAAEC,aAAa,CAAC;IAC9E;EAAC;IAAAhyB,GAAA;IAAAC,KAAA,EACD,SAAAkyB,kCAAkCA,CAACL,UAAU,EAAEC,cAAc,EAAEC,aAAa,EAAE;MAC1E,IAAI5K,KAAK,GAAG/E,aAAa,CAACgF,YAAY,CAAC,CAAC;MACxC,IAAI4K,QAAQ,GAAG7K,KAAK,CAAClhB,aAAa,CAAC,KAAK,GAAG4rB,UAAU,CAAC;MACtDluB,GAAG,CAACuD,6BAA6B,CAAC8qB,QAAQ,EAAEF,cAAc,EAAEC,aAAa,CAAC;IAC9E;EAAC;IAAAhyB,GAAA;IAAAC,KAAA,EAED,SAAAolB,oCAAoCA,CAAA,EAAG;MACnC,IAAI4C,OAAO,GAAG,IAAI,CAACC,eAAe,CAAC,IAAI,CAAC;MACxC,IAAIkK,gBAAgB,GAAGnK,OAAO,CAAC5nB,MAAM,GAAG,CAAC;MAEzC,IAAIqV,WAAW,GAAG2M,aAAa,CAACgB,cAAc,CAAC,CAAC;MAChD,IAAIuB,eAAe,GAAGhhB,GAAG,CAACgE,yBAAyB,CAAC8N,WAAW,CAAC;MAEhE,IAAI,CAACyK,2BAA2B,CAACiS,gBAAgB,IAAI,CAACxN,eAAe,CAAC;IAC1E;EAAC;IAAA5kB,GAAA;IAAAC,KAAA,EA1jBD,SAAOojB,cAAcA,CAAA,EAAG;MACpB,OAAO1hB,QAAQ,CAACuE,aAAa,CAAC2d,aAAa,CAAC;IAChD;EAAC;IAAA7jB,GAAA;IAAAC,KAAA,EAuBD,SAAOonB,YAAYA,CAAA,EAAG;MAClB,OAAO1lB,QAAQ,CAACuE,aAAa,CAACsa,WAAW,CAAC;IAC9C;EAAC;AAAA,EA3MsClF,QAAQ;;;;;;;;;ACZV;AACa;AACL;AACjD;AAC+B;AACc;AACA;AAAA,IAExB+W,YAAY;EAC7B,SAAAA,aAAYC,WAAW,EAAE;IAAAxyB,oBAAA,OAAAuyB,YAAA;IACrB,IAAI,CAACvrB,IAAI,GAAGwrB,WAAW;EAC3B;EAAC,OAAAvyB,iBAAA,CAAAsyB,YAAA;IAAAryB,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT/X,KAAK,CAACsW,oCAAoC,CAAC,uBAAuB,EAAE,IAAI,CAACnT,IAAI,CAACuN,IAAI,CAAC;MACnF,IAAI,CAAC0O,aAAa,CAAC,CAAC;MACpB,IAAI,CAACwP,qBAAqB,CAAC,CAAC;IAChC;EAAC;IAAAvyB,GAAA;IAAAC,KAAA,EACD,SAAA8iB,aAAaA,CAAA,EAAG,CAChB;EAAC;IAAA/iB,GAAA;IAAAC,KAAA,EACD,SAAAsyB,qBAAqBA,CAAA,EAAG,CAExB;;IAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EAzBI;IAAAvyB,GAAA;IAAAC,KAAA,EA2BA,SAAA+d,KAAKA,CAAA,EAAG,CAAC;EAAC;AAAA;;;;;;;;;;;;;;;;;;;ACnD2B;AACa;AACL;AACjD;AAC+B;AACc;AACP;AACC;AAAA,IAElBwU,iBAAiB,0BAAAC,aAAA;EAClC,SAAAD,kBAAYF,WAAW,EAAE;IAAAxyB,0BAAA,OAAA0yB,iBAAA;IAAA,OAAA7R,qBAAA,OAAA6R,iBAAA,GACfF,WAAW;EACrB;EAAC1R,oBAAA,CAAA4R,iBAAA,EAAAC,aAAA;EAAA,OAAA1yB,uBAAA,CAAAyyB,iBAAA;IAAAxyB,GAAA;IAAAC,KAAA,EACD,SAAAyb,UAAUA,CAAA,EAAG;MACTmF,wBAAA,CAAA2R,iBAAA;MACA,IAAI,CAACzP,aAAa,CAAC,CAAC;MACpB,IAAI,CAAC2P,WAAW,CAAC,CAAC;IACtB;EAAC;IAAA1yB,GAAA;IAAAC,KAAA,EACD,SAAA8iB,aAAaA,CAAA,EAAG;MACZ;IAAA;EACH;IAAA/iB,GAAA;IAAAC,KAAA,EACD,SAAAyyB,WAAWA,CAAA,EAAG;MACV;IAAA;EACH;IAAA1yB,GAAA;IAAAC,KAAA,EACD,SAAA0yB,oBAAoBA,CAAA,EAAG;MACnB,IAAI,CAAC7rB,IAAI,CAAC+mB,0BAA0B,CAChC3V,YAAY,EACVvU,WAAK,CAACmW,eAAe,CAAC8Y,eAAe,CAAC,CAAC;MAC7C,CAAC;IACL;EAAC;AAAA,EApB0CP,YAAY;;;;;;;;;;;;;;;;;;;;ACT5B;AAC8C;AAC9C;AACU;AACI;AACN;AACU;AACA;AAAA,IAE5BQ,wBAAwB,0BAAAC,cAAA;EAKzC,SAAAD,yBAAYtX,MAAM,EAAE;IAAA,IAAA+B,KAAA;IAAAxd,iCAAA,OAAA+yB,wBAAA;IAChBvV,KAAA,GAAAqD,4BAAA,OAAAkS,wBAAA,GAAMtX,MAAM;IAAEhS,iCAAA,CAAA+T,KAAA,0BAHKzK,GAAG,CAACsD,qBAAqB;IAI5CmH,KAAA,CAAKyV,QAAQ,GAAG,IAAIP,iBAAiB,CAAAlV,KAAK,CAAC;IAAC,OAAAA,KAAA;EAChD;EAACsD,2BAAA,CAAAiS,wBAAA,EAAAC,cAAA;EAAA,OAAA/yB,8BAAA,CAAA8yB,wBAAA;IAAA7yB,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA8iB,aAAaA,CAAA,EAAG;MACZ,IAAI,CAACS,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACG,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA3jB,GAAA;IAAAC,KAAA,EAED,SAAA0nB,YAAYA,CAACC,OAAO,EAAE;MAClB,IAAIA,OAAO,IAAI,IAAI,EAAE;MACrB,IAAIY,QAAQ,EAAE;QAAE7kB,WAAK,CAACsW,oCAAoC,CAAC,qBAAqB,EAAE2N,OAAO,CAAC;MAAE;IAChG;EAAC;IAAA5nB,GAAA;IAAAC,KAAA,EACD,SAAA4oB,UAAUA,CAAC9D,GAAG,EAAE;MACZphB,WAAK,CAACsW,oCAAoC,CAAC;QAAE8K,GAAG,EAAHA;MAAI,CAAC,CAAC;MACnD,IAAIA,GAAG,IAAI,IAAI,EAAE;MACjB,IAAIiO,SAAS,GAAGjO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGulB,QAAQ,GAAG,IAAI,GAAGA,QAAQ,CAAC;MACrE,IAAIwH,SAAS,GAAGlO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGwD,QAAQ,GAAG,IAAI,GAAGA,QAAQ,CAAC;MACrE,IAAIwpB,YAAY,GAAGnO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGgC,UAAU,GAAG,IAAI,GAAGA,UAAU,CAAC;MAE5E+L,OAAO,CAACoG,GAAG,CAAC,WAAW,CAAC;MACxBpG,OAAO,CAACoG,GAAG,CAAC2Y,SAAS,CAAC;MAEtB,IAAIG,OAAO,GAAG,CAAC,CAAC;MAChBA,OAAO,CAACpN,qBAAqB,CAAC,GAAGhB,GAAG,CAAC5e,YAAY,CAAC4f,qBAAqB,CAAC;MACxEoN,OAAO,CAAC1H,QAAQ,CAAC,GAAG7nB,GAAG,CAACuE,+BAA+B,CAAC6qB,SAAS,CAAC;MAClEG,OAAO,CAACzpB,QAAQ,CAAC,GAAG9F,GAAG,CAACuE,+BAA+B,CAAC8qB,SAAS,CAAC;MAClEE,OAAO,CAACjrB,UAAU,CAAC,GAAGgrB,YAAY,CAAC1rB,SAAS,CAACC,QAAQ,CAACM,UAAU,CAAC;MACjE,OAAOorB,OAAO;IAClB;EAAC;IAAAnzB,GAAA;IAAAC,KAAA,EACD,SAAAopB,gBAAgBA,CAACxE,KAAK,EAAEE,GAAG,EAAE,CAE7B;EAAC;IAAA/kB,GAAA;IAAAC,KAAA,EACD,SAAAspB,4BAA4BA,CAAC1E,KAAK,EAAE;MAChC;IAAA;EACH;IAAA7kB,GAAA;IAAAC,KAAA,EAED,SAAAgjB,eAAeA,CAAA,EAAG;MACdpC,+BAAA,CAAAgS,wBAAA;MACA,IAAI,CAACrH,qBAAqB,CAAC,CAAC;MAC5B,IAAI,CAACE,qBAAqB,CAAC,CAAC;MAC5B,IAAI,CAACK,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA/rB,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,+BAAA,CAAAgS,wBAAA;IACJ;EAAC;AAAA,EAxDiDxQ,aAAa;AAAA9Y,iCAAA,CAA9CspB,wBAAwB,UAC3BvU,4BAA4B;AAAA/U,iCAAA,CADzBspB,wBAAwB,qBAEhB9M,qBAAqB;;;;;;;;;;;;;;;;;;;;ACXnB;AAC8C;AAC9C;AACU;AACI;AACN;AACU;AACA;AAAA,IAE5BqN,eAAe,0BAAAN,cAAA;EAKhC,SAAAM,gBAAY7X,MAAM,EAAE;IAAA,IAAA+B,KAAA;IAAAxd,uBAAA,OAAAszB,eAAA;IAChB9V,KAAA,GAAAqD,kBAAA,OAAAyS,eAAA,GAAM7X,MAAM;IAAEhS,uBAAA,CAAA+T,KAAA,0BAHKzK,GAAG,CAACiE,YAAY;IAInCwG,KAAA,CAAKyV,QAAQ,GAAG,IAAIP,iBAAiB,CAAAlV,KAAK,CAAC;IAAC,OAAAA,KAAA;EAChD;EAACsD,iBAAA,CAAAwS,eAAA,EAAAN,cAAA;EAAA,OAAA/yB,oBAAA,CAAAqzB,eAAA;IAAApzB,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA8iB,aAAaA,CAAA,EAAG;MACZ,IAAI,CAACS,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACqC,2BAA2B,CAAC,CAAC;MAClC,IAAI,CAAClC,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA3jB,GAAA;IAAAC,KAAA,EACD,SAAA4lB,2BAA2BA,CAAA,EAAG;MAC1B,IAAI,CAACpB,YAAY,CAACsB,qBAAqB,CAAC;IAC5C;EAAC;IAAA/lB,GAAA;IAAAC,KAAA,EAED,SAAA0nB,YAAYA,CAACC,OAAO,EAAE;MAClB,IAAIA,OAAO,IAAI,IAAI,EAAE;MACrB,IAAIY,QAAQ,EAAE;QAAE7kB,WAAK,CAACsW,oCAAoC,CAAC,qBAAqB,EAAE2N,OAAO,CAAC;MAAE;IAChG;EAAC;IAAA5nB,GAAA;IAAAC,KAAA,EACD,SAAA4oB,UAAUA,CAAC9D,GAAG,EAAE;MACZ,IAAIA,GAAG,IAAI,IAAI,EAAE;MACjB,IAAIkO,SAAS,GAAGlO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGwD,QAAQ,GAAG,IAAI,GAAGA,QAAQ,CAAC;MACrE,IAAI2pB,iCAAiC,GAAGtO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGotB,gCAAgC,GAAG,IAAI,GAAGA,gCAAgC,CAAC;MAC7I,IAAIC,kBAAkB,GAAGxO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGstB,iBAAiB,GAAG,IAAI,GAAGA,iBAAiB,CAAC;MAChG,IAAIC,UAAU,GAAG1O,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAG4lB,SAAS,GAAG,IAAI,GAAGA,SAAS,CAAC;MACxE,IAAIoH,YAAY,GAAGnO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGgC,UAAU,GAAG,IAAI,GAAGA,UAAU,CAAC;;MAE5E;AACR;AACA;AACA;;MAEQ,IAAIirB,OAAO,GAAG,CAAC,CAAC;MAChBA,OAAO,CAACpM,aAAa,CAAC,GAAGhC,GAAG,CAAC5e,YAAY,CAAC4gB,aAAa,CAAC;MACxDoM,OAAO,CAACpN,qBAAqB,CAAC,GAAG,IAAI,CAAC6J,uBAAuB,CAAC7K,GAAG,CAAC;MAClEoO,OAAO,CAACzpB,QAAQ,CAAC,GAAG9F,GAAG,CAACuE,+BAA+B,CAAC8qB,SAAS,CAAC;MAClEE,OAAO,CAACG,gCAAgC,CAAC,GAAG1vB,GAAG,CAACuE,+BAA+B,CAACkrB,iCAAiC,CAAC;MAClHF,OAAO,CAACK,iBAAiB,CAAC,GAAI5vB,GAAG,CAACuE,+BAA+B,CAACorB,kBAAkB,CAAC,IAAI,MAAO;MAChGJ,OAAO,CAACrH,SAAS,CAAC,GAAGloB,GAAG,CAACuE,+BAA+B,CAACsrB,UAAU,CAAC;MACpEN,OAAO,CAACjrB,UAAU,CAAC,GAAGgrB,YAAY,CAAC1rB,SAAS,CAACC,QAAQ,CAACM,UAAU,CAAC;MACjE,OAAOorB,OAAO;IAClB;EAAC;IAAAnzB,GAAA;IAAAC,KAAA,EACD,SAAAopB,gBAAgBA,CAACxE,KAAK,EAAEE,GAAG,EAAE,CAE7B;EAAC;IAAA/kB,GAAA;IAAAC,KAAA,EACD,SAAAspB,4BAA4BA,CAAC1E,KAAK,EAAE;MAChC,IAAI6O,OAAO,GAAG7O,KAAK,CAACjjB,gBAAgB,CAAC,KAAK,GAAG+nB,UAAU,CAAC;MACxD,IAAIgK,SAAS,GAAGD,OAAO,CAAC,CAAC,CAAC;MAC1B,IAAIE,yBAAyB,GAAG,CAC5B,KAAK,GAAGlC,OAAO,GAAG,OAAO,GAAGA,OAAO,EACjC,MAAM,GAAG1b,mBAAmB,GAAG,OAAO,GAAGA,mBAAmB,EAC5D,MAAM,GAAGY,WAAW,GAAG,OAAO,GAAGA,WAAW,CACjD,CAACid,IAAI,CAAC,EAAE,CAAC;MACVF,SAAS,CAAC/xB,gBAAgB,CAACgyB,yBAAyB,CAAC,CAAC7oB,OAAO,CAAC,UAAC+oB,gBAAgB,EAAK;QAChFA,gBAAgB,CAACC,KAAK,CAAC,CAAC;MAC5B,CAAC,CAAC;IACN;EAAC;IAAA/zB,GAAA;IAAAC,KAAA,EAED,SAAAgjB,eAAeA,CAAA,EAAG;MACdpC,qBAAA,CAAAuS,eAAA;MACA,IAAI,CAACjE,2BAA2B,CAAC,CAAC;MAClC,IAAI,CAACzD,qBAAqB,CAAC,CAAC;MAC5B,IAAI,CAACsI,2CAA2C,CAAC,CAAC;MAClD,IAAI,CAACC,yBAAyB,CAAC,CAAC;MAChC,IAAI,CAACpI,sBAAsB,CAAC,CAAC;MAC7B,IAAI,CAACE,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA/rB,GAAA;IAAAC,KAAA,EACD,SAAAkvB,2BAA2BA,CAAA,EAAG;MAC1B,IAAI,CAACtB,0BAA0B,CAC3B7X,mBAAmB,EACjBrS,WAAK,CAACmW,eAAe,CAACwV,uBAAuB,CACnD,CAAC;IACL;EAAC;IAAAtvB,GAAA;IAAAC,KAAA,EACD,SAAA+zB,2CAA2CA,CAAA,EAAG;MAC1C,IAAI,CAACxJ,6BAA6B,CAAChK,WAAW,GAAG,MAAM,GAAG8S,gCAAgC,GAAG,IAAI,GAAGA,gCAAgC,CAAC;IACzI;EAAC;IAAAtzB,GAAA;IAAAC,KAAA,EACD,SAAAg0B,yBAAyBA,CAAA,EAAG;MACxB,IAAI,CAACzJ,6BAA6B,CAAChK,WAAW,GAAG,MAAM,GAAGgT,iBAAiB,GAAG,IAAI,GAAGA,iBAAiB,CAAC;IAC3G;EAAC;IAAAxzB,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,qBAAA,CAAAuS,eAAA;IACJ;EAAC;AAAA,EA1FwC/Q,aAAa;AAAA9Y,uBAAA,CAArC6pB,eAAe,UAClB5U,mBAAmB;AAAAjV,uBAAA,CADhB6pB,eAAe,qBAEPrM,aAAa;;;;;;;;;;;;;;;;;;;;ACXX;AAC8C;AAC9C;AACU;AACI;AACN;AACU;AACA;AAAA,IAE5BmN,sBAAsB,0BAAApB,cAAA;EAKvC,SAAAoB,uBAAY3Y,MAAM,EAAE;IAAA,IAAA+B,KAAA;IAAAxd,gCAAA,OAAAo0B,sBAAA;IAChB5W,KAAA,GAAAqD,2BAAA,OAAAuT,sBAAA,GAAM3Y,MAAM;IAAEhS,gCAAA,CAAA+T,KAAA,0BAHKzK,GAAG,CAAC4E,mBAAmB;IAI1C6F,KAAA,CAAKyV,QAAQ,GAAG,IAAIP,iBAAiB,CAAAlV,KAAK,CAAC;IAAC,OAAAA,KAAA;EAChD;EAACsD,0BAAA,CAAAsT,sBAAA,EAAApB,cAAA;EAAA,OAAA/yB,6BAAA,CAAAm0B,sBAAA;IAAAl0B,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA8iB,aAAaA,CAAA,EAAG;MACZ,IAAI,CAACS,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACmC,eAAe,CAAC,CAAC;MACtB,IAAI,CAACE,2BAA2B,CAAC,CAAC;MAClC,IAAI,CAACiB,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACnD,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA3jB,GAAA;IAAAC,KAAA,EAED,SAAA0nB,YAAYA,CAACC,OAAO,EAAE;MAClB,IAAIA,OAAO,IAAI,IAAI,EAAE;MACrB,IAAIY,QAAQ,EAAE;QAAE7kB,WAAK,CAACsW,oCAAoC,CAAC,qBAAqB,EAAE2N,OAAO,CAAC;MAAE;IAChG;EAAC;IAAA5nB,GAAA;IAAAC,KAAA,EACD,SAAA4oB,UAAUA,CAAC9D,GAAG,EAAE;MACZ,IAAIA,GAAG,IAAI,IAAI,EAAE;MACjB,IAAIoP,0BAA0B,GAAGpP,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGkuB,yBAAyB,GAAG,WAAW,CAAC;MACnG,IAAIX,UAAU,GAAG1O,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAG4lB,SAAS,GAAG,WAAW,CAAC;MACnE,IAAIoH,YAAY,GAAGnO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGgC,UAAU,GAAG,IAAI,GAAGA,UAAU,CAAC;MAE5E,IAAIirB,OAAO,GAAG,CAAC,CAAC;MAChBA,OAAO,CAACkB,oBAAoB,CAAC,GAAGtP,GAAG,CAAC5e,YAAY,CAACkuB,oBAAoB,CAAC;MACtElB,OAAO,CAACvN,SAAS,CAAC,GAAG,IAAI,CAACgM,WAAW,CAAC7M,GAAG,CAAC;MAC1CoO,OAAO,CAACpM,aAAa,CAAC,GAAG,IAAI,CAAC2J,eAAe,CAAC3L,GAAG,CAAC;MAClDoO,OAAO,CAACiB,yBAAyB,CAAC,GAAGxwB,GAAG,CAACuE,+BAA+B,CAACgsB,0BAA0B,CAAC;MACpGhB,OAAO,CAACrH,SAAS,CAAC,GAAGloB,GAAG,CAACuE,+BAA+B,CAACsrB,UAAU,CAAC;MACpEN,OAAO,CAACjrB,UAAU,CAAC,GAAGgrB,YAAY,CAAC1rB,SAAS,CAACC,QAAQ,CAACM,UAAU,CAAC;MACjE,OAAOorB,OAAO;IAClB;EAAC;IAAAnzB,GAAA;IAAAC,KAAA,EACD,SAAAopB,gBAAgBA,CAACxE,KAAK,EAAEE,GAAG,EAAE,CAE7B;EAAC;IAAA/kB,GAAA;IAAAC,KAAA,EACD,SAAAspB,4BAA4BA,CAAC1E,KAAK,EAAE;MAChC,IAAI6O,OAAO,GAAG7O,KAAK,CAACjjB,gBAAgB,CAAC,KAAK,GAAG+nB,UAAU,CAAC;MACxD,IAAIgK,SAAS,GAAGD,OAAO,CAAC,CAAC,CAAC;MAC1B,IAAIE,yBAAyB,GAAG,CAC5B,KAAK,GAAGlC,OAAO,GAAG,OAAO,GAAGA,OAAO,EACjC,MAAM,GAAG1b,mBAAmB,GAAG,OAAO,GAAGA,mBAAmB,EAC5D,MAAM,GAAGY,WAAW,GAAG,OAAO,GAAGA,WAAW,CACjD,CAACid,IAAI,CAAC,EAAE,CAAC;MACVF,SAAS,CAAC/xB,gBAAgB,CAACgyB,yBAAyB,CAAC,CAAC7oB,OAAO,CAAC,UAAC+oB,gBAAgB,EAAK;QAChFA,gBAAgB,CAACC,KAAK,CAAC,CAAC;MAC5B,CAAC,CAAC;IACN;EAAC;IAAA/zB,GAAA;IAAAC,KAAA,EAED,SAAAgjB,eAAeA,CAAA,EAAG;MACdpC,8BAAA,CAAAqT,sBAAA;MACA,IAAI,CAACzC,eAAe,CAAC,CAAC;MACtB,IAAI,CAACtC,2BAA2B,CAAC,CAAC;MAClC,IAAI,CAACe,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACoE,oCAAoC,CAAC,CAAC;MAC3C,IAAI,CAACzI,sBAAsB,CAAC,CAAC;MAC7B,IAAI,CAACE,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA/rB,GAAA;IAAAC,KAAA,EACD,SAAAq0B,oCAAoCA,CAAA,EAAG;MACnC,IAAI,CAAC9J,6BAA6B,CAAChK,WAAW,GAAG,MAAM,GAAG4T,yBAAyB,GAAG,IAAI,GAAGA,yBAAyB,CAAC;IAC3H;EAAC;IAAAp0B,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,8BAAA,CAAAqT,sBAAA;IACJ;EAAC;AAAA,EAxE+C7R,aAAa;AAAA9Y,gCAAA,CAA5C2qB,sBAAsB,UACzBxV,0BAA0B;AAAAnV,gCAAA,CADvB2qB,sBAAsB,qBAEdG,oBAAoB;;;;;;;;;;;;;;;;;;;;ACXlB;AAC8C;AAC9C;AACU;AACI;AACN;AACU;AACA;AAAA,IAE5BE,gBAAgB,0BAAAzB,cAAA;EAKjC,SAAAyB,iBAAYhZ,MAAM,EAAE;IAAA,IAAA+B,KAAA;IAAAxd,wBAAA,OAAAy0B,gBAAA;IAChBjX,KAAA,GAAAqD,mBAAA,OAAA4T,gBAAA,GAAMhZ,MAAM;IAAEhS,wBAAA,CAAA+T,KAAA,0BAHKzK,GAAG,CAACuF,aAAa;IAIpCkF,KAAA,CAAKyV,QAAQ,GAAG,IAAIP,iBAAiB,CAAAlV,KAAK,CAAC;IAAC,OAAAA,KAAA;EAChD;EAACsD,kBAAA,CAAA2T,gBAAA,EAAAzB,cAAA;EAAA,OAAA/yB,qBAAA,CAAAw0B,gBAAA;IAAAv0B,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA8iB,aAAaA,CAAA,EAAG;MACZ,IAAI,CAACS,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACG,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA3jB,GAAA;IAAAC,KAAA,EAED,SAAA0nB,YAAYA,CAACC,OAAO,EAAE;MAClB,IAAIA,OAAO,IAAI,IAAI,EAAE;MACrB,IAAIY,QAAQ,EAAE;QAAE7kB,WAAK,CAACsW,oCAAoC,CAAC,qBAAqB,EAAE2N,OAAO,CAAC;MAAE;IAChG;EAAC;IAAA5nB,GAAA;IAAAC,KAAA,EACD,SAAA4oB,UAAUA,CAAC9D,GAAG,EAAE;MACZ,IAAIA,GAAG,IAAI,IAAI,EAAE;MACjB,IAAIkO,SAAS,GAAGlO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGwD,QAAQ,GAAG,IAAI,GAAGA,QAAQ,CAAC;MACrE,IAAIwpB,YAAY,GAAGnO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGgC,UAAU,GAAG,IAAI,GAAGA,UAAU,CAAC;MAE5E,IAAIirB,OAAO,GAAG,CAAC,CAAC;MAChBA,OAAO,CAAClM,cAAc,CAAC,GAAGlC,GAAG,CAAC5e,YAAY,CAAC8gB,cAAc,CAAC;MAC1DkM,OAAO,CAACqB,kBAAkB,CAAC,GAAG,IAAI,CAACC,sBAAsB,CAAC1P,GAAG,CAAC;MAC9DoO,OAAO,CAACzpB,QAAQ,CAAC,GAAG9F,GAAG,CAACuE,+BAA+B,CAAC8qB,SAAS,CAAC;MAClEE,OAAO,CAACjrB,UAAU,CAAC,GAAGgrB,YAAY,CAAC1rB,SAAS,CAACC,QAAQ,CAACM,UAAU,CAAC;MAEjEkM,OAAO,CAACoG,GAAG,CAAC,SAAS,CAAC;MACtBpG,OAAO,CAACoG,GAAG,CAAC8Y,OAAO,CAAC;MAEpB,OAAOA,OAAO;IAClB;EAAC;IAAAnzB,GAAA;IAAAC,KAAA,EACD,SAAAw0B,sBAAsBA,CAAC1P,GAAG,EAAE;MACxB,IAAI2P,qBAAqB,GAAG3P,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGsuB,kBAAkB,GAAG,IAAI,GAAGA,kBAAkB,CAAC;MACrG,OAAO5wB,GAAG,CAACuE,+BAA+B,CAACusB,qBAAqB,CAAC;IACrE;EAAC;IAAA10B,GAAA;IAAAC,KAAA,EACD,SAAAopB,gBAAgBA,CAACxE,KAAK,EAAEE,GAAG,EAAE,CAE7B;EAAC;IAAA/kB,GAAA;IAAAC,KAAA,EACD,SAAAspB,4BAA4BA,CAAC1E,KAAK,EAAE;MAChC,IAAI6O,OAAO,GAAG7O,KAAK,CAACjjB,gBAAgB,CAAC,KAAK,GAAG+nB,UAAU,CAAC;MACxD,IAAIgK,SAAS,GAAGD,OAAO,CAAC,CAAC,CAAC;MAC1B,IAAIE,yBAAyB,GAAG,CAC5B,KAAK,GAAGY,kBAAkB,GAAG,OAAO,GAAGA,kBAAkB,CAC5D,CAACX,IAAI,CAAC,EAAE,CAAC;MACVF,SAAS,CAAC/xB,gBAAgB,CAACgyB,yBAAyB,CAAC,CAAC7oB,OAAO,CAAC,UAAC+oB,gBAAgB,EAAK;QAChFA,gBAAgB,CAACC,KAAK,CAAC,CAAC;MAC5B,CAAC,CAAC;IACN;EAAC;IAAA/zB,GAAA;IAAAC,KAAA,EAED,SAAAgjB,eAAeA,CAAA,EAAG;MACdpC,sBAAA,CAAA0T,gBAAA;MACA,IAAI,CAACI,0BAA0B,CAAC,CAAC;MACjC,IAAI,CAACjJ,qBAAqB,CAAC,CAAC;MAC5B,IAAI,CAACK,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA/rB,GAAA;IAAAC,KAAA,EACD,SAAA00B,0BAA0BA,CAAA,EAAG;MAAA,IAAA9W,MAAA;MACzB;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MAGQ,IAAIsQ,YAAY,GAAG3N,WAAW,GAAG,qBAAqB,GAAGgU,kBAAkB;MAC3E9pB,MAAM,CAACM,kBAAkB,CAAC,OAAO,EAAEmjB,YAAY,GAAG,OAAO,GAAGqG,kBAAkB,EAAE,UAACppB,KAAK,EAAEd,GAAG,EAAK;QAC5F,IAAIya,GAAG,GAAGnhB,GAAG,CAACmB,iBAAiB,CAACuF,GAAG,CAAC;QACpC,IAAIsqB,aAAa,GAAGhiB,MAAM,CAACmS,GAAG,CAAC5e,YAAY,CAAC8gB,cAAc,CAAC,CAAC;QAC5DtjB,WAAK,CAACsW,oCAAoC,CAAC;UAAE2a,aAAa,EAAbA;QAAc,CAAC,CAAC;QAC7D/W,MAAI,CAACyQ,8BAA8B,CAC/BljB,KAAK,EACHd,GAAG,EACHkqB,kBAAkB,EAClB7wB,WAAK,CAACmW,eAAe,CAAC/B,SAAS,CAAC,CAAC/R,MAAM,CAAC,UAAA6O,QAAQ;UAAA,OAE1CA,QAAQ,CAACoS,cAAc,CAAC,IAAI2N,aAAa,IACtCA,aAAa,GAAG,CAAC;QAAA,CAE5B,CAAC,CAAC;QAAA,EACAzG,YAAY,EACZ,UAACE,WAAW,EAAK;UAAExQ,MAAI,CAAC8E,mBAAmB,CACzC0L,WAAW,EACT,UAACjjB,KAAK,EAAEtH,OAAO,EAAK;YAAE+Z,MAAI,CAAC8M,kCAAkC,CAACvf,KAAK,EAAEtH,OAAO,CAAC;UAAE,CACrF,CAAC;QAAE,CACP,CAAC;MACL,CAAC,CAAC;MACF,IAAI,CAAC6e,mBAAmB,CACpBwL,YAAY,GAAG,UAAU,GAAGqG,kBAAkB,EAC5C,UAACppB,KAAK,EAAEtH,OAAO,EAAK;QAAE+Z,MAAI,CAAC8M,kCAAkC,CAACvf,KAAK,EAAEtH,OAAO,CAAC;MAAE,CACrF,CAAC;IACL;IACA;AACJ;AACA;AACA;AACA;EAJI;IAAA9D,GAAA;IAAAC,KAAA,EAMA,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,sBAAA,CAAA0T,gBAAA;IACJ;EAAC;AAAA,EAzHyClS,aAAa;AAAA9Y,wBAAA,CAAtCgrB,gBAAgB,UACnBzV,oBAAoB;AAAAvV,wBAAA,CADjBgrB,gBAAgB,qBAERtN,cAAc;;;;;;;;;;;;;;;;;;;;ACXZ;AAC8C;AAC9C;AACU;AACI;AACN;AACU;AACA;AAAA,IAE5B4N,kBAAkB,0BAAA/B,cAAA;EAKnC,SAAA+B,mBAAYtZ,MAAM,EAAE;IAAA,IAAA+B,KAAA;IAAAxd,2BAAA,OAAA+0B,kBAAA;IAChBvX,KAAA,GAAAqD,sBAAA,OAAAkU,kBAAA,GAAMtZ,MAAM;IAAEhS,2BAAA,CAAA+T,KAAA,0BAHKzK,GAAG,CAACkG,eAAe;IAItCuE,KAAA,CAAKyV,QAAQ,GAAG,IAAIP,iBAAiB,CAAAlV,KAAK,CAAC;IAAC,OAAAA,KAAA;EAChD;EAACsD,qBAAA,CAAAiU,kBAAA,EAAA/B,cAAA;EAAA,OAAA/yB,wBAAA,CAAA80B,kBAAA;IAAA70B,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA8iB,aAAaA,CAAA,EAAG;MACZ,IAAI,CAACS,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACG,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA3jB,GAAA;IAAAC,KAAA,EAED,SAAA0nB,YAAYA,CAACC,OAAO,EAAE;MAClB,IAAIA,OAAO,IAAI,IAAI,EAAE;MACrB,IAAIY,QAAQ,EAAE;QAAE7kB,WAAK,CAACsW,oCAAoC,CAAC,qBAAqB,EAAE2N,OAAO,CAAC;MAAE;IAChG;EAAC;IAAA5nB,GAAA;IAAAC,KAAA,EACD,SAAA4oB,UAAUA,CAAC9D,GAAG,EAAE;MACZ,IAAIA,GAAG,IAAI,IAAI,EAAE;MACjB,IAAIkO,SAAS,GAAGlO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGwD,QAAQ,GAAG,IAAI,GAAGA,QAAQ,CAAC;MACrE,IAAIwpB,YAAY,GAAGnO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGgC,UAAU,GAAG,IAAI,GAAGA,UAAU,CAAC;MAE5E,IAAIirB,OAAO,GAAG,CAAC,CAAC;MAChBA,OAAO,CAAC2B,gBAAgB,CAAC,GAAG/P,GAAG,CAAC5e,YAAY,CAAC2uB,gBAAgB,CAAC;MAC9D3B,OAAO,CAAC4B,SAAS,CAAC,GAAG,IAAI,CAACC,aAAa,CAACjQ,GAAG,CAAC;MAC5CoO,OAAO,CAACzpB,QAAQ,CAAC,GAAG9F,GAAG,CAACuE,+BAA+B,CAAC8qB,SAAS,CAAC;MAClEE,OAAO,CAACjrB,UAAU,CAAC,GAAGgrB,YAAY,CAAC1rB,SAAS,CAACC,QAAQ,CAACM,UAAU,CAAC;MAEjEkM,OAAO,CAACoG,GAAG,CAAC,SAAS,CAAC;MACtBpG,OAAO,CAACoG,GAAG,CAAC8Y,OAAO,CAAC;MAEpB,OAAOA,OAAO;IAClB;EAAC;IAAAnzB,GAAA;IAAAC,KAAA,EACD,SAAA+0B,aAAaA,CAACjQ,GAAG,EAAE;MACf,IAAIkQ,YAAY,GAAGlQ,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAG6uB,SAAS,GAAG,IAAI,GAAGA,SAAS,CAAC;MAC1E,OAAOnxB,GAAG,CAACuE,+BAA+B,CAAC8sB,YAAY,CAAC;IAC5D;EAAC;IAAAj1B,GAAA;IAAAC,KAAA,EACD,SAAAopB,gBAAgBA,CAACxE,KAAK,EAAEE,GAAG,EAAE,CAE7B;EAAC;IAAA/kB,GAAA;IAAAC,KAAA,EACD,SAAAspB,4BAA4BA,CAAC1E,KAAK,EAAE;MAChC,IAAI6O,OAAO,GAAG7O,KAAK,CAACjjB,gBAAgB,CAAC,KAAK,GAAG+nB,UAAU,CAAC;MACxD,IAAIgK,SAAS,GAAGD,OAAO,CAAC,CAAC,CAAC;MAC1B,IAAIE,yBAAyB,GAAG,CAC5B,KAAK,GAAGmB,SAAS,GAAG,OAAO,GAAGA,SAAS,CAC1C,CAAClB,IAAI,CAAC,EAAE,CAAC;MACVF,SAAS,CAAC/xB,gBAAgB,CAACgyB,yBAAyB,CAAC,CAAC7oB,OAAO,CAAC,UAAC+oB,gBAAgB,EAAK;QAChFA,gBAAgB,CAACC,KAAK,CAAC,CAAC;MAC5B,CAAC,CAAC;IACN;EAAC;IAAA/zB,GAAA;IAAAC,KAAA,EAED,SAAAgjB,eAAeA,CAAA,EAAG;MACdpC,yBAAA,CAAAgU,kBAAA;MACA,IAAI,CAACK,iBAAiB,CAAC,CAAC;MACxB,IAAI,CAACxJ,qBAAqB,CAAC,CAAC;MAC5B,IAAI,CAACK,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA/rB,GAAA;IAAAC,KAAA,EACD,SAAAi1B,iBAAiBA,CAAA,EAAG;MAChB,IAAI,CAACrH,0BAA0B,CAC3BkH,SAAS,EACPpxB,WAAK,CAACmW,eAAe,CAACqb,WAAW,CAAC,CAAC;MACzC,CAAC;IACL;EAAC;IAAAn1B,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,yBAAA,CAAAgU,kBAAA;IACJ;EAAC;AAAA,EAxE2CxS,aAAa;AAAA9Y,2BAAA,CAAxCsrB,kBAAkB,UACrB7V,sBAAsB;AAAAzV,2BAAA,CADnBsrB,kBAAkB,qBAEVC,gBAAgB;;;;;;;;;;;;;;;;;;;;ACXd;AAC8C;AAC9C;AACU;AACI;AACN;AACU;AACA;AAAA,IAE5BM,yBAAyB,0BAAAtC,cAAA;EAK1C,SAAAsC,0BAAY7Z,MAAM,EAAE;IAAA,IAAA+B,KAAA;IAAAxd,mCAAA,OAAAs1B,yBAAA;IAChB9X,KAAA,GAAAqD,8BAAA,OAAAyU,yBAAA,GAAM7Z,MAAM;IAAEhS,mCAAA,CAAA+T,KAAA,0BAHKzK,GAAG,CAAC6G,sBAAsB;IAI7C4D,KAAA,CAAKyV,QAAQ,GAAG,IAAIP,iBAAiB,CAAAlV,KAAK,CAAC;IAAC,OAAAA,KAAA;EAChD;EAACsD,6BAAA,CAAAwU,yBAAA,EAAAtC,cAAA;EAAA,OAAA/yB,gCAAA,CAAAq1B,yBAAA;IAAAp1B,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA8iB,aAAaA,CAAA,EAAG;MACZ,IAAI,CAACS,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACqC,2BAA2B,CAAC,CAAC;MAClC,IAAI,CAACiB,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACuO,uBAAuB,CAAC,CAAC;MAC9B,IAAI,CAACC,kBAAkB,CAAC,CAAC;MACzB,IAAI,CAACC,sBAAsB,CAAC,CAAC;MAC7B,IAAI,CAACvO,oBAAoB,CAAC,CAAC;MAC3B,IAAI,CAACrD,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA3jB,GAAA;IAAAC,KAAA,EACD,SAAAo1B,uBAAuBA,CAAA,EAAG;MACtB,IAAI,CAAC5Q,YAAY,CAAC+Q,iBAAiB,CAAC;IACxC;EAAC;IAAAx1B,GAAA;IAAAC,KAAA,EACD,SAAAq1B,kBAAkBA,CAAA,EAAG;MACjB,IAAI,CAAC7Q,YAAY,CAACgR,YAAY,CAAC;IACnC;EAAC;IAAAz1B,GAAA;IAAAC,KAAA,EACD,SAAAs1B,sBAAsBA,CAAA,EAAG;MACrB,IAAI,CAAC9Q,YAAY,CAACqQ,gBAAgB,CAAC;IACvC;EAAC;IAAA90B,GAAA;IAAAC,KAAA,EAED,SAAA0nB,YAAYA,CAACC,OAAO,EAAE;MAClB,IAAIA,OAAO,IAAI,IAAI,EAAE;MACrB,IAAIY,QAAQ,EAAE;QAAE7kB,WAAK,CAACsW,oCAAoC,CAAC,qBAAqB,EAAE2N,OAAO,CAAC;MAAE;IAChG;EAAC;IAAA5nB,GAAA;IAAAC,KAAA,EACD,SAAA4oB,UAAUA,CAAC9D,GAAG,EAAE;MACZ,IAAIA,GAAG,IAAI,IAAI,EAAE;MACjB,IAAIoP,0BAA0B,GAAGpP,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGkuB,yBAAyB,GAAG,WAAW,CAAC;MACnG,IAAIX,UAAU,GAAG1O,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAG4lB,SAAS,GAAG,WAAW,CAAC;MACnE,IAAIoH,YAAY,GAAGnO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGgC,UAAU,GAAG,IAAI,GAAGA,UAAU,CAAC;MAE5E,IAAIirB,OAAO,GAAG,CAAC,CAAC;MAChBA,OAAO,CAACuC,uBAAuB,CAAC,GAAG3Q,GAAG,CAAC5e,YAAY,CAACuvB,uBAAuB,CAAC;MAC5EvC,OAAO,CAACvN,SAAS,CAAC,GAAG,IAAI,CAACgM,WAAW,CAAC7M,GAAG,CAAC;MAC1CoO,OAAO,CAACpM,aAAa,CAAC,GAAG,IAAI,CAAC2J,eAAe,CAAC3L,GAAG,CAAC;MAClDoO,OAAO,CAACiB,yBAAyB,CAAC,GAAGxwB,GAAG,CAACuE,+BAA+B,CAACgsB,0BAA0B,CAAC;MACpGhB,OAAO,CAACrH,SAAS,CAAC,GAAGloB,GAAG,CAACuE,+BAA+B,CAACsrB,UAAU,CAAC;MACpEN,OAAO,CAACjrB,UAAU,CAAC,GAAGgrB,YAAY,CAAC1rB,SAAS,CAACC,QAAQ,CAACM,UAAU,CAAC;MACjE,OAAOorB,OAAO;IAClB;EAAC;IAAAnzB,GAAA;IAAAC,KAAA,EACD,SAAAopB,gBAAgBA,CAACxE,KAAK,EAAEE,GAAG,EAAE,CAE7B;EAAC;IAAA/kB,GAAA;IAAAC,KAAA,EACD,SAAAspB,4BAA4BA,CAAC1E,KAAK,EAAE;MAChC,IAAI6O,OAAO,GAAG7O,KAAK,CAACjjB,gBAAgB,CAAC,KAAK,GAAG+nB,UAAU,CAAC;MACxD,IAAIgK,SAAS,GAAGD,OAAO,CAAC,CAAC,CAAC;MAC1B,IAAIE,yBAAyB,GAAG,CAC5B,KAAK,GAAGlC,OAAO,GAAG,OAAO,GAAGA,OAAO,EACjC,MAAM,GAAG1b,mBAAmB,GAAG,OAAO,GAAGA,mBAAmB,EAC5D,MAAM,GAAGY,WAAW,GAAG,OAAO,GAAGA,WAAW,CACjD,CAACid,IAAI,CAAC,EAAE,CAAC;MACVF,SAAS,CAAC/xB,gBAAgB,CAACgyB,yBAAyB,CAAC,CAAC7oB,OAAO,CAAC,UAAC+oB,gBAAgB,EAAK;QAChFA,gBAAgB,CAACC,KAAK,CAAC,CAAC;MAC5B,CAAC,CAAC;IACN;EAAC;IAAA/zB,GAAA;IAAAC,KAAA,EAED,SAAAgjB,eAAeA,CAAA,EAAG;MACdpC,iCAAA,CAAAuU,yBAAA;MACA,IAAI,CAACjG,2BAA2B,CAAC,CAAC;MAClC,IAAI,CAACe,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACyF,uBAAuB,CAAC,CAAC;MAC9B,IAAI,CAACC,kBAAkB,CAAC,CAAC;MACzB,IAAI,CAACC,sBAAsB,CAAC,CAAC;MAC7B,IAAI,CAAC9C,QAAQ,CAACJ,oBAAoB,CAAC,CAAC;MACpC,IAAI,CAAC5G,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA/rB,GAAA;IAAAC,KAAA,EACD,SAAA01B,uBAAuBA,CAAA,EAAG;MACtB,IAAI,CAAC9H,0BAA0B,CAC3BiI,eAAe,EACbnyB,WAAK,CAACmW,eAAe,CAACic,kBAAkB,CAAC,CAAC;MAChD,CAAC;IACL;EAAC;IAAA/1B,GAAA;IAAAC,KAAA,EACD,SAAA21B,kBAAkBA,CAAA,EAAG;MACjB,IAAI,CAAC/H,0BAA0B,CAC3BmI,UAAU,EACRryB,WAAK,CAACmW,eAAe,CAACmc,aAAa,CAAC,CAAC;MAC3C,CAAC;IACL;EAAC;IAAAj2B,GAAA;IAAAC,KAAA,EACD,SAAA41B,sBAAsBA,CAAA,EAAG;MACrB,IAAI,CAAChI,0BAA0B,CAC3BhV,cAAc,EACZlV,WAAK,CAACmW,eAAe,CAACoc,iBAAiB,CAAC,CAAC;MAC/C,CAAC;IACL;EAAC;IAAAl2B,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,iCAAA,CAAAuU,yBAAA;IACJ;EAAC;AAAA,EApGkD/S,aAAa;AAAA9Y,mCAAA,CAA/C6rB,yBAAyB,UAC5BlW,6BAA6B;AAAA3V,mCAAA,CAD1B6rB,yBAAyB,qBAEjBM,uBAAuB;;;;;;;;;;;;;;;;;;;;ACXrB;AAC8C;AAC9C;AACU;AACI;AACN;AACU;AACA;AAEjD,IAAIS,oBAAoB;AACxB,IAAIC,sCAAsC;AAAC,IAEtBC,iBAAiB,0BAAAvD,cAAA;EAKlC,SAAAuD,kBAAY9a,MAAM,EAAE;IAAA,IAAA+B,KAAA;IAAAxd,yBAAA,OAAAu2B,iBAAA;IAChB/Y,KAAA,GAAAqD,oBAAA,OAAA0V,iBAAA,GAAM9a,MAAM;IAAEhS,yBAAA,CAAA+T,KAAA,0BAHKzK,GAAG,CAACyjB,eAAe;IAItChZ,KAAA,CAAKyV,QAAQ,GAAG,IAAIP,iBAAiB,CAAAlV,KAAK,CAAC;IAAC,OAAAA,KAAA;EAChD;EAACsD,mBAAA,CAAAyV,iBAAA,EAAAvD,cAAA;EAAA,OAAA/yB,sBAAA,CAAAs2B,iBAAA;IAAAr2B,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA8iB,aAAaA,CAAA,EAAG,CAChB;EAAC;IAAA/iB,GAAA;IAAAC,KAAA,EAED,SAAA0nB,YAAYA,CAACC,OAAO,EAAE;MAClB,IAAIA,OAAO,IAAI,IAAI,EAAE;MACrB,IAAIY,QAAQ,EAAE;QAAE7kB,WAAK,CAACsW,oCAAoC,CAAC,qBAAqB,EAAE2N,OAAO,CAAC;MAAE;IAChG;EAAC;IAAA5nB,GAAA;IAAAC,KAAA,EACD,SAAA4oB,UAAUA,CAAC9D,GAAG,EAAE;MACZ,IAAIA,GAAG,IAAI,IAAI,EAAE;MACjB;AACR;AACA;AACA;MACQ,IAAIoO,OAAO,GAAG,CAAC,CAAC;MAChBA,OAAO,CAACoD,gBAAgB,CAAC,GAAGxR,GAAG,CAAC5e,YAAY,CAACowB,gBAAgB,CAAC;MAC9D,OAAOpD,OAAO;IAClB;EAAC;IAAAnzB,GAAA;IAAAC,KAAA,EACD,SAAAopB,gBAAgBA,CAACxE,KAAK,EAAEE,GAAG,EAAE,CAE7B;EAAC;IAAA/kB,GAAA;IAAAC,KAAA,EACD,SAAAspB,4BAA4BA,CAAC1E,KAAK,EAAE;MAChC,IAAI6O,OAAO,GAAG7O,KAAK,CAACjjB,gBAAgB,CAAC,KAAK,GAAG+nB,UAAU,CAAC;MACxD,IAAIgK,SAAS,GAAGD,OAAO,CAAC,CAAC,CAAC;MAC1B,IAAIE,yBAAyB,GAAG,CAC5B,KAAK,GAAG4C,WAAW,GAAG,OAAO,GAAGA,WAAW,EACzC,MAAM,GAAGC,iBAAiB,GAAG,OAAO,GAAGA,iBAAiB,EACxD,MAAM,GAAGve,YAAY,GAAG,OAAO,GAAGA,YAAY,EAC9C,MAAM,GAAGwe,eAAe,GAAG,OAAO,GAAGA,eAAe,CACzD,CAAC7C,IAAI,CAAC,EAAE,CAAC;MACVF,SAAS,CAAC/xB,gBAAgB,CAACgyB,yBAAyB,CAAC,CAAC7oB,OAAO,CAAC,UAAC+oB,gBAAgB,EAAK;QAChFA,gBAAgB,CAACC,KAAK,CAAC,CAAC;MAC5B,CAAC,CAAC;IACN;EAAC;IAAA/zB,GAAA;IAAAC,KAAA,EAED,SAAAgjB,eAAeA,CAAA,EAAG;MACdpC,uBAAA,CAAAwV,iBAAA;MACA,IAAI,CAACM,2BAA2B,CAAC,CAAC;MAClC,IAAI,CAACC,uBAAuB,CAAC,CAAC;MAC9B,IAAI,CAACC,yCAAyC,CAAC,CAAC;IACpD;EAAC;IAAA72B,GAAA;IAAAC,KAAA,EACD,SAAA02B,2BAA2BA,CAAA,EAAG;MAC1B,IAAI,CAACG,iCAAiC,CAAC,CAAC;MACxC,IAAI,CAACC,uCAAuC,CAAC,CAAC;MAC9C,IAAI,CAACC,qCAAqC,CAAC,CAAC;MAC5C,IAAI,CAACC,kCAAkC,CAAC,CAAC;MACzC,IAAI,CAACC,qCAAqC,CAAC,CAAC;MAC5C,IAAI,CAACC,+BAA+B,CAAC,CAAC;IAC1C;EAAC;IAAAn3B,GAAA;IAAAC,KAAA,EACD,SAAA62B,iCAAiCA,CAAA,EAAG;MAChC,IAAI9I,SAAS,GAAGwI,WAAW;MAC3B,IAAIvI,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAACsd,cAAc,CAAC,CAAC,CAAC;MACxD,IAAIjJ,YAAY,GAAGkJ,iBAAiB,GAAG,MAAM,GAAGb,WAAW;MAC3D,IAAI,CAAC3I,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAA82B,uCAAuCA,CAAA,EAAG;MACtC,IAAI/I,SAAS,GAAGyI,iBAAiB;MACjC,IAAIxI,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAACwd,oBAAoB,CAAC,CAAC,CAAC;MAC9D,IAAInJ,YAAY,GAAGkJ,iBAAiB,GAAG,MAAM,GAAGZ,iBAAiB;MACjE,IAAI,CAAC5I,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAA+2B,qCAAqCA,CAAA,EAAG;MACpC,IAAI,CAACxM,6BAA6B,CAAC6M,iBAAiB,GAAG,MAAM,GAAGE,sBAAsB,GAAG,IAAI,GAAGA,sBAAsB,CAAC;IAC3H;EAAC;IAAAv3B,GAAA;IAAAC,KAAA,EACD,SAAAg3B,kCAAkCA,CAAA,EAAG;MACjC,IAAIjJ,SAAS,GAAG9V,YAAY;MAC5B,IAAI+V,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAAC8Y,eAAe,CAAC,CAAC,CAAC;MACzD,IAAIzE,YAAY,GAAGkJ,iBAAiB,GAAG,MAAM,GAAGnf,YAAY;MAC5D,IAAI,CAAC2V,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAAi3B,qCAAqCA,CAAA,EAAG;MACpC,IAAIlJ,SAAS,GAAG0I,eAAe;MAC/B,IAAIzI,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAAC0d,kBAAkB,CAAC,CAAC,CAAC;MAC5D,IAAIrJ,YAAY,GAAGkJ,iBAAiB,GAAG,MAAM,GAAGX,eAAe;MAC/D,IAAI,CAAC7I,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAAk3B,+BAA+BA,CAAA,EAAG;MAC9B,IAAI,CAAC3M,6BAA6B,CAAC6M,iBAAiB,GAAG,MAAM,GAAGvL,SAAS,GAAG,IAAI,GAAGA,SAAS,CAAC;IACjG;EAAC;IAAA9rB,GAAA;IAAAC,KAAA,EACD,SAAA22B,uBAAuBA,CAAA,EAAG;MACtBlsB,MAAM,CAACC,sBAAsB,CAAC8sB,mBAAmB,EAAEvsB,eAAe,EAAE,UAACkc,KAAK,EAAK;QAC3E,IAAIsC,cAAc,GAAG+N,mBAAmB,GAAG,YAAY,GAAG9N,UAAU;QACpE,IAAIC,YAAY,GAAGjoB,QAAQ,CAACuE,aAAa,CAACwjB,cAAc,CAAC;QACzD/lB,WAAK,CAACsW,oCAAoC,CAAC,kBAAkB,EAAE2P,YAAY,CAAC;QAC5E,IAAIR,SAAS,GAAGznB,QAAQ,CAACC,gBAAgB,CAAC61B,mBAAmB,GAAG,eAAe,CAAC,CAACp3B,MAAM;QACvF81B,oBAAoB,GAAGvM,YAAY,CAACT,SAAS,CAAC,IAAI,CAAC;QACnDxnB,QAAQ,CAACC,gBAAgB,CAAC8nB,cAAc,CAAC,CAAC3e,OAAO,CAAC,UAASga,GAAG,EAAE;UAC5DA,GAAG,CAACpd,MAAM,CAAC,CAAC;QAChB,CAAC,CAAC;QACFwuB,oBAAoB,CAAClyB,YAAY,CAACyzB,iBAAiB,EAAE,CAAC,CAAC,GAAGtO,SAAS,CAAC;MACxE,CAAC,CAAC;MAEF,IAAI,CAACuO,4CAA4C,CAAC,CAAC;MACnD,IAAI,CAACC,oDAAoD,CAAC,CAAC;MAC3D,IAAI,CAACC,gDAAgD,CAAC,CAAC;MACvD,IAAI,CAACC,gDAAgD,CAAC,CAAC;MACvD,IAAI,CAACC,gDAAgD,CAAC,CAAC;MACvD,IAAI,CAACC,gDAAgD,CAAC,CAAC;MACvD,IAAI,CAACC,qCAAqC,CAAC,CAAC;MAC5C,IAAI,CAACC,4CAA4C,CAAC,CAAC;MACnD,IAAI,CAACC,kCAAkC,CAAC,CAAC;MACzC,IAAI,CAACC,mCAAmC,CAAC,CAAC;IAC9C;EAAC;IAAAp4B,GAAA;IAAAC,KAAA,EACD,SAAA03B,4CAA4CA,CAAA,EAAG;MAC3C,IAAI3J,SAAS,GAAGqK,mBAAmB;MACnC,IAAIpK,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAACwe,sBAAsB,CAAC,CAAC,CAAC;MAChE,IAAInK,YAAY,GAAGsJ,mBAAmB,GAAG,MAAM,GAAGY,mBAAmB;MACrE,IAAI,CAACxK,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAA23B,oDAAoDA,CAAA,EAAG;MACnD,IAAI5J,SAAS,GAAGuK,sCAAsC;MACtD,IAAItK,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAAC0e,gCAAgC,CAAC,CAAC,CAAC;MAC1E,IAAIrK,YAAY,GAAGsJ,mBAAmB,GAAG,MAAM,GAAGc,sCAAsC;MACxF,IAAI,CAAC1K,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAA43B,gDAAgDA,CAAA,EAAG;MAC/C,IAAI7J,SAAS,GAAGyK,kCAAkC;MAClD,IAAIxK,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAAC0e,gCAAgC,CAAC,CAAC,CAAC;MAC1E,IAAIrK,YAAY,GAAGsJ,mBAAmB,GAAG,MAAM,GAAGgB,kCAAkC;MACpF,IAAI,CAAC5K,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAA63B,gDAAgDA,CAAA,EAAG;MAC/C,IAAI9J,SAAS,GAAG0K,kCAAkC;MAClD,IAAIzK,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAAC0e,gCAAgC,CAAC,CAAC,CAAC;MAC1E,IAAIrK,YAAY,GAAGsJ,mBAAmB,GAAG,MAAM,GAAGiB,kCAAkC;MACpF,IAAI,CAAC7K,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAA83B,gDAAgDA,CAAA,EAAG;MAC/C,IAAI/J,SAAS,GAAG2K,kCAAkC;MAClD,IAAI1K,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAAC0e,gCAAgC,CAAC,CAAC,CAAC;MAC1E,IAAIrK,YAAY,GAAGsJ,mBAAmB,GAAG,MAAM,GAAGkB,kCAAkC;MACpF,IAAI,CAAC9K,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAA+3B,gDAAgDA,CAAA,EAAG;MAC/C,IAAIhK,SAAS,GAAG4K,kCAAkC;MAClD,IAAI3K,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAAC0e,gCAAgC,CAAC,CAAC,CAAC;MAC1E,IAAIrK,YAAY,GAAGsJ,mBAAmB,GAAG,MAAM,GAAGmB,kCAAkC;MACpF,IAAI,CAAC/K,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAAg4B,qCAAqCA,CAAA,EAAG;MACpC,IAAI,CAACzN,6BAA6B,CAACiN,mBAAmB,GAAG,MAAM,GAAGoB,YAAY,GAAG,IAAI,GAAGA,YAAY,CAAC;IACzG;EAAC;IAAA74B,GAAA;IAAAC,KAAA,EACD,SAAAi4B,4CAA4CA,CAAA,EAAG;MAC3C,IAAI,CAAC1N,6BAA6B,CAACiN,mBAAmB,GAAG,MAAM,GAAGqB,mBAAmB,GAAG,IAAI,GAAGA,mBAAmB,CAAC;IACvH;EAAC;IAAA94B,GAAA;IAAAC,KAAA,EACD,SAAAk4B,kCAAkCA,CAAA,EAAG;MACjC,IAAI,CAAC3N,6BAA6B,CAACiN,mBAAmB,GAAG,MAAM,GAAG3L,SAAS,GAAG,IAAI,GAAGA,SAAS,CAAC;IACnG;EAAC;IAAA9rB,GAAA;IAAAC,KAAA,EACD,SAAAm4B,mCAAmCA,CAAA,EAAG;MAAA,IAAAva,MAAA;MAClC,IAAI,CAACkO,kBAAkB,CAACgN,eAAe,EAAE,UAAC3tB,KAAK,EAAEtH,OAAO,EAAK;QAAE+Z,MAAI,CAACmb,kCAAkC,CAAC5tB,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC,CAAC;IAC9H;EAAC;IAAA9D,GAAA;IAAAC,KAAA,EACD,SAAA+4B,kCAAkCA,CAAC5tB,KAAK,EAAEmS,MAAM,EAAE;MAC9CnS,KAAK,CAACC,eAAe,CAAC,CAAC;MACvB8qB,oBAAoB,CAAClyB,YAAY,CAACyzB,iBAAiB,EAAE,CAAC,CAAC,GAAGvB,oBAAoB,CAAChwB,YAAY,CAACuxB,iBAAiB,CAAC,CAAC;MAC/G,IAAI7S,KAAK,GAAGljB,QAAQ,CAACuE,aAAa,CAACuxB,mBAAmB,GAAG,QAAQ,CAAC;MAClE,IAAI5S,KAAK,CAACrd,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAE;MAC/C,IAAI4J,GAAG,GAAGoR,oBAAoB,CAAChN,SAAS,CAAC,IAAI,CAAC;MAC9CpE,GAAG,CAACvd,SAAS,CAACG,MAAM,CAACuD,eAAe,CAAC;MACrC6Z,GAAG,CAACnjB,gBAAgB,CAAC,GAAG,GAAGsJ,eAAe,CAAC,CAACH,OAAO,CAAC,UAASjH,OAAO,EAAE;QAClEA,OAAO,CAAC0D,SAAS,CAACG,MAAM,CAACuD,eAAe,CAAC;MAC7C,CAAC,CAAC;MACF,IAAIke,SAAS,GAAGznB,QAAQ,CAACC,gBAAgB,CAAC61B,mBAAmB,GAAG,eAAe,CAAC,CAACp3B,MAAM;MACvF0kB,GAAG,CAAC9gB,YAAY,CAACyzB,iBAAiB,EAAE,CAAC,CAAC,GAAGtO,SAAS,CAAC;MACnDvE,KAAK,CAACyE,OAAO,CAACvE,GAAG,CAAC;MAClBF,KAAK,CAACrc,SAAS,GAAG,CAAC;MACnB,IAAI,CAACouB,uBAAuB,CAAC,CAAC;MAC9B,IAAI,CAACqC,uCAAuC,CAACpU,KAAK,CAAC;IACvD;EAAC;IAAA7kB,GAAA;IAAAC,KAAA,EACD,SAAAg5B,uCAAuCA,CAACpU,KAAK,EAAE;MAC3C,IAAI6O,OAAO,GAAG7O,KAAK,CAACjjB,gBAAgB,CAAC,KAAK,GAAG+nB,UAAU,CAAC;MACxD,IAAIgK,SAAS,GAAGD,OAAO,CAAC,CAAC,CAAC;MAC1B,IAAIE,yBAAyB,GAAG,CAC5B,KAAK,GAAGyE,mBAAmB,GAAG,OAAO,GAAGA,mBAAmB,EACzD,MAAM,GAAGE,sCAAsC,GAAG,OAAO,GAAGA,sCAAsC,EAClG,MAAM,GAAGE,kCAAkC,GAAG,OAAO,GAAGA,kCAAkC,EAC1F,MAAM,GAAGC,kCAAkC,GAAG,OAAO,GAAGA,kCAAkC,EAC1F,MAAM,GAAGC,kCAAkC,GAAG,OAAO,GAAGA,kCAAkC,EAC1F,MAAM,GAAGC,kCAAkC,GAAG,OAAO,GAAGA,kCAAkC,CAC/F,CAAC/E,IAAI,CAAC,EAAE,CAAC;MACVF,SAAS,CAAC/xB,gBAAgB,CAACgyB,yBAAyB,CAAC,CAAC7oB,OAAO,CAAC,UAAC+oB,gBAAgB,EAAK;QAChFA,gBAAgB,CAACC,KAAK,CAAC,CAAC;MAC5B,CAAC,CAAC;IACN;EAAC;IAAA/zB,GAAA;IAAAC,KAAA,EACD,SAAA42B,yCAAyCA,CAAA,EAAG;MACxCnsB,MAAM,CAACC,sBAAsB,CAACuuB,qCAAqC,EAAEhuB,eAAe,EAAE,UAACkc,KAAK,EAAK;QAC7F,IAAIsC,cAAc,GAAGwP,qCAAqC,GAAG,YAAY,GAAGvP,UAAU;QACtF,IAAIC,YAAY,GAAGjoB,QAAQ,CAACuE,aAAa,CAACwjB,cAAc,CAAC;QACzD/lB,WAAK,CAACsW,oCAAoC,CAAC,kBAAkB,EAAE2P,YAAY,CAAC;QAC5E,IAAIR,SAAS,GAAGznB,QAAQ,CAACC,gBAAgB,CAACs3B,qCAAqC,GAAG,eAAe,CAAC,CAAC74B,MAAM;QACzG+1B,sCAAsC,GAAGxM,YAAY,CAACT,SAAS,CAAC,IAAI,CAAC;QACrExnB,QAAQ,CAACC,gBAAgB,CAAC8nB,cAAc,CAAC,CAAC3e,OAAO,CAAC,UAASga,GAAG,EAAE;UAC5DA,GAAG,CAACpd,MAAM,CAAC,CAAC;QAChB,CAAC,CAAC;QACFyuB,sCAAsC,CAACnyB,YAAY,CAACk1B,mCAAmC,EAAE,CAAC,CAAC,GAAG/P,SAAS,CAAC;MAC5G,CAAC,CAAC;MAEF,IAAI,CAACgQ,8DAA8D,CAAC,CAAC;MACrE,IAAI,CAACC,sDAAsD,CAAC,CAAC;MAC7D,IAAI,CAACC,8DAA8D,CAAC,CAAC;MACrE,IAAI,CAACC,oDAAoD,CAAC,CAAC;MAC3D,IAAI,CAACC,kEAAkE,CAAC,CAAC;MACzE,IAAI,CAACC,wEAAwE,CAAC,CAAC;MAC/E,IAAI,CAACC,sEAAsE,CAAC,CAAC;MAC7E,IAAI,CAACC,iEAAiE,CAAC,CAAC;MACxE,IAAI,CAACC,uDAAuD,CAAC,CAAC;MAC9D,IAAI,CAACC,yDAAyD,CAAC,CAAC;MAChE,IAAI,CAACC,oDAAoD,CAAC,CAAC;MAC3D,IAAI,CAACC,wDAAwD,CAAC,CAAC;MAC/D,IAAI,CAACC,qDAAqD,CAAC,CAAC;IAChE;EAAC;IAAAh6B,GAAA;IAAAC,KAAA,EACD,SAAAm5B,8DAA8DA,CAAA,EAAG;MAC7D,IAAI,CAACjK,2BAA2B,CAAC+J,qCAAqC,CAAC;MACvE;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACI;IACA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EA9BI;IAAAl5B,GAAA;IAAAC,KAAA,EA+BA,SAAAo5B,sDAAsDA,CAAA,EAAG;MACrD,IAAI,CAACnJ,mBAAmB,CAACgJ,qCAAqC,CAAC;IACnE;EAAC;IAAAl5B,GAAA;IAAAC,KAAA,EACD,SAAAq5B,8DAA8DA,CAAA,EAAG;MAC7D,IAAItL,SAAS,GAAGiM,mBAAmB;MACnC,IAAIhM,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAACogB,uBAAuB,CAAC,CAAC,CAAC;MACjE,IAAI/L,YAAY,GAAG+K,qCAAqC,GAAG,MAAM,GAAGe,mBAAmB;MACvF,IAAI,CAACpM,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAAs5B,oDAAoDA,CAAA,EAAG;MACnD,IAAIvL,SAAS,GAAGmM,SAAS;MACzB,IAAIlM,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAACsgB,YAAY,CAAC,CAAC,CAAC;MACtD,IAAIjM,YAAY,GAAG+K,qCAAqC,GAAG,MAAM,GAAGiB,SAAS;MAC7E,IAAI,CAACtM,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAAu5B,kEAAkEA,CAAA,EAAG;MACjE,IAAI,CAAChP,6BAA6B,CAAC0O,qCAAqC,GAAG,MAAM,GAAGmB,uBAAuB,GAAG,IAAI,GAAGA,uBAAuB,CAAC;IACjJ;EAAC;IAAAr6B,GAAA;IAAAC,KAAA,EACD,SAAAw5B,wEAAwEA,CAAA,EAAG;MACvE,IAAI,CAACjP,6BAA6B,CAAC0O,qCAAqC,GAAG,MAAM,GAAGoB,6BAA6B,GAAG,IAAI,GAAGA,6BAA6B,CAAC;IAC7J;EAAC;IAAAt6B,GAAA;IAAAC,KAAA,EACD,SAAAy5B,sEAAsEA,CAAA,EAAG;MACrE,IAAI,CAAClP,6BAA6B,CAAC0O,qCAAqC,GAAG,MAAM,GAAGqB,2BAA2B,GAAG,IAAI,GAAGA,2BAA2B,CAAC;IACzJ;EAAC;IAAAv6B,GAAA;IAAAC,KAAA,EACD,SAAA05B,iEAAiEA,CAAA,EAAG;MAChE,IAAI,CAACnP,6BAA6B,CAAC0O,qCAAqC,GAAG,MAAM,GAAGsB,sBAAsB,GAAG,IAAI,GAAGA,sBAAsB,CAAC;IAC/I;EAAC;IAAAx6B,GAAA;IAAAC,KAAA,EACD,SAAA25B,uDAAuDA,CAAA,EAAG;MACtD,IAAI,CAACpP,6BAA6B,CAAC0O,qCAAqC,GAAG,MAAM,GAAGuB,YAAY,GAAG,IAAI,GAAGA,YAAY,CAAC;IAC3H;EAAC;IAAAz6B,GAAA;IAAAC,KAAA,EACD,SAAA45B,yDAAyDA,CAAA,EAAG;MACxD;IAAA;EACH;IAAA75B,GAAA;IAAAC,KAAA,EACD,SAAA65B,oDAAoDA,CAAA,EAAG;MACnD,IAAI,CAACtP,6BAA6B,CAAC0O,qCAAqC,GAAG,qBAAqB,GAAGpN,SAAS,GAAG,IAAI,GAAGA,SAAS,CAAC;IACpI;EAAC;IAAA9rB,GAAA;IAAAC,KAAA,EACD,SAAA85B,wDAAwDA,CAAA,EAAG;MAAA,IAAA1a,MAAA;MACvD,IAAIpU,SAAS,GAAG,OAAO;MACvB,IAAIhG,QAAQ,GAAGi0B,qCAAqC,GAAG,MAAM,GAAGwB,sBAAsB,GAAG,OAAO,GAAGA,sBAAsB;MACzH,IAAI/V,OAAO,GAAG,SAAVA,OAAOA,CAAIvZ,KAAK,EAAEtH,OAAO,EAAK;QAC9B,IAAI62B,QAAQ,GAAG/2B,GAAG,CAACiB,kBAAkB,CAACf,OAAO,CAAC;QAC9C,IAAI82B,cAAc,GAAGj5B,QAAQ,CAACwI,aAAa,CAAC,OAAO,CAAC;QACpDywB,cAAc,CAAC5Y,EAAE,GAAG6Y,0BAA0B,CAACC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QAC/DF,cAAc,CAACpzB,SAAS,CAACE,GAAG,CAACqzB,aAAa,EAAEL,sBAAsB,CAAC;QAEnE,IAAIM,IAAI,GAAGr5B,QAAQ,CAACwI,aAAa,CAAC,OAAO,CAAC;QAC1C,IAAI8wB,OAAO,GAAGt5B,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;QAC1C,IAAI+wB,uBAAuB,GAAGv5B,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;QAC1D+wB,uBAAuB,CAAC1zB,SAAS,CAACE,GAAG,CAACyzB,yBAAyB,CAAC;QAChED,uBAAuB,CAACzwB,SAAS,GAAG,yBAAyB;QAC7DwwB,OAAO,CAACtU,WAAW,CAACuU,uBAAuB,CAAC;QAC5C,IAAIE,gBAAgB,GAAGz5B,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;QACnDixB,gBAAgB,CAAC5zB,SAAS,CAACE,GAAG,CAAC2zB,kBAAkB,CAAC;QAClDD,gBAAgB,CAAC3wB,SAAS,GAAG,iBAAiB;QAC9CwwB,OAAO,CAACtU,WAAW,CAACyU,gBAAgB,CAAC;QACrC,IAAIE,eAAe,GAAG35B,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;QAClDmxB,eAAe,CAAC9zB,SAAS,CAACE,GAAG,CAAC6zB,iBAAiB,CAAC;QAChDD,eAAe,CAAC7wB,SAAS,GAAG,gBAAgB;QAC5CwwB,OAAO,CAACtU,WAAW,CAAC2U,eAAe,CAAC;QACpC,IAAIE,OAAO,GAAG75B,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;QAC1CqxB,OAAO,CAACh0B,SAAS,CAACE,GAAG,CAACokB,SAAS,CAAC;QAChC0P,OAAO,CAAC/wB,SAAS,GAAG,OAAO;QAC3BwwB,OAAO,CAACtU,WAAW,CAAC6U,OAAO,CAAC;QAC5B,IAAIC,QAAQ,GAAG95B,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;QAC3CsxB,QAAQ,CAACj0B,SAAS,CAACE,GAAG,CAACQ,UAAU,CAAC;QAClC,IAAIwzB,eAAe,GAAG/5B,QAAQ,CAACuE,aAAa,CAACinB,2BAA2B,GAAG,IAAI,GAAGllB,UAAU,GAAG,GAAG,GAAG0zB,QAAQ,GAAG,GAAG,GAAGzzB,UAAU,GAAG,GAAG,GAAGklB,OAAO,CAAC;QACjJqO,QAAQ,CAAC9U,WAAW,CAAC+U,eAAe,CAACvS,SAAS,CAAC,IAAI,CAAC,CAAC;QACrD8R,OAAO,CAACtU,WAAW,CAAC8U,QAAQ,CAAC;QAC7BT,IAAI,CAACrU,WAAW,CAACsU,OAAO,CAAC;QACzBL,cAAc,CAACjU,WAAW,CAACqU,IAAI,CAAC;QAEhC,IAAIp0B,IAAI,GAAGjF,QAAQ,CAACwI,aAAa,CAAC,OAAO,CAAC;QAE1C,IAAIyxB,6BAA6B,GAAGC,UAAU,CAACC,iCAAiC,CAAC;QACjF,IAAIC,SAAS,GAAIH,6BAA6B,IAAI,IAAI,GAAI,IAAI,GAAGA,6BAA6B,CAAClB,sBAAsB,CAAC;QAEtH,IAAIqB,SAAS,IAAI,IAAI,IAAIA,SAAS,CAAC17B,MAAM,GAAG,CAAC,EAAE;UAC3C,KAAK,IAAIgT,QAAQ,IAAI0oB,SAAS,EAAE;YAC5B,IAAIhX,GAAG,GAAGsR,iBAAiB,CAAC2F,oCAAoC,CAAC3oB,QAAQ,CAAC;YAC1EzM,IAAI,CAAC+f,WAAW,CAAC5B,GAAG,CAAC;UACzB;QACJ;QACA6V,cAAc,CAACjU,WAAW,CAAC/f,IAAI,CAAC;QAEhC+zB,QAAQ,CAACl0B,SAAS,GAAGm0B,cAAc,CAACqB,SAAS;QAE7C5c,MAAI,CAAC6c,+BAA+B,CAAC,CAAC;MAC1C,CAAC;MACDxxB,MAAM,CAACM,kBAAkB,CACrBC,SAAS,EACPhG,QAAQ,EACR0f,OACN,CAAC;MACD,IAAI,CAACuX,+BAA+B,CAAC,CAAC;IAC1C;EAAC;IAAAl8B,GAAA;IAAAC,KAAA,EA+DD,SAAAi8B,+BAA+BA,CAAA,EAAG;MAC9B,IAAI,CAACC,yDAAyD,CAAC,CAAC;MAChE,IAAI,CAACC,kDAAkD,CAAC,CAAC;MACzD,IAAI,CAACC,iDAAiD,CAAC,CAAC;MACxD,IAAI,CAACC,yCAAyC,CAAC,CAAC;MAChD,IAAI,CAACC,0CAA0C,CAAC,CAAC;IACrD;EAAC;IAAAv8B,GAAA;IAAAC,KAAA,EACD,SAAAk8B,yDAAyDA,CAAA,EAAG;MACxD,IAAInO,SAAS,GAAGmN,yBAAyB;MACzC,IAAIlN,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAAC0iB,4BAA4B,CAAC,CAAC,CAAC;MACtE,IAAIrO,YAAY,GAAG0M,0BAA0B,GAAG,MAAM,GAAGM,yBAAyB;MAClF,IAAI,CAACtN,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAAm8B,kDAAkDA,CAAA,EAAG;MACjD,IAAIpO,SAAS,GAAGqN,kBAAkB;MAClC,IAAIpN,UAAU,GAAGtqB,WAAK,CAACmW,eAAe,CAAC2iB,qBAAqB,CAAC,CAAC,CAAC;MAC/D,IAAItO,YAAY,GAAG0M,0BAA0B,GAAG,MAAM,GAAGQ,kBAAkB;MAC3E,IAAI,CAACxN,0BAA0B,CAC3BG,SAAS,EACPC,UAAU,EACVE,YACN,CAAC;IACL;EAAC;IAAAnuB,GAAA;IAAAC,KAAA,EACD,SAAAo8B,iDAAiDA,CAAA,EAAG;MAChD,IAAI,CAAC7R,6BAA6B,CAACqQ,0BAA0B,GAAG,MAAM,GAAGU,iBAAiB,GAAG,IAAI,GAAGA,iBAAiB,CAAC;IAC1H;EAAC;IAAAv7B,GAAA;IAAAC,KAAA,EACD,SAAAq8B,yCAAyCA,CAAA,EAAG;MACxC,IAAI,CAAC9R,6BAA6B,CAACqQ,0BAA0B,GAAG,MAAM,GAAG/O,SAAS,GAAG,IAAI,GAAGA,SAAS,CAAC;IAC1G;EAAC;IAAA9rB,GAAA;IAAAC,KAAA,EACD,SAAAs8B,0CAA0CA,CAAA,EAAG;MAAA,IAAA1c,MAAA;MACzC,IAAI,CAACkM,kBAAkB,CAAC2O,sBAAsB,EAAE,UAACtvB,KAAK,EAAEtH,OAAO,EAAK;QAAE+b,MAAI,CAAC6c,yCAAyC,CAACtxB,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC,CAAC;IAC5I;EAAC;IAAA9D,GAAA;IAAAC,KAAA,EACD,SAAAy8B,yCAAyCA,CAACtxB,KAAK,EAAEmS,MAAM,EAAE;MACrDnS,KAAK,CAACC,eAAe,CAAC,CAAC;MACvB,IAAIsxB,cAAc,GAAG/4B,GAAG,CAACsB,gBAAgB,CAACqY,MAAM,EAAE,OAAO,CAAC;MAC1D,IAAIsH,KAAK,GAAG8X,cAAc,CAACz2B,aAAa,CAAC,gBAAgB,CAAC;MAC1D,IAAI6e,GAAG,GAAGsR,iBAAiB,CAAC2F,oCAAoC,CAAC,IAAI,CAAC;MACtE,IAAInX,KAAK,CAACrd,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAE;MAC/C4J,GAAG,CAACvd,SAAS,CAACG,MAAM,CAACuD,eAAe,CAAC;MACrC6Z,GAAG,CAACnjB,gBAAgB,CAAC,GAAG,GAAGsJ,eAAe,CAAC,CAACH,OAAO,CAAC,UAASjH,OAAO,EAAE;QAClEA,OAAO,CAAC0D,SAAS,CAACG,MAAM,CAACuD,eAAe,CAAC;MAC7C,CAAC,CAAC;MACF,IAAIke,SAAS,GAAGznB,QAAQ,CAACC,gBAAgB,CAACg7B,wBAAwB,GAAG,eAAe,CAAC,CAACv8B,MAAM;MAC5F0kB,GAAG,CAAC9gB,YAAY,CAAC24B,wBAAwB,EAAE,CAAC,CAAC,GAAGxT,SAAS,CAAC;MAC1DvE,KAAK,CAACyE,OAAO,CAACvE,GAAG,CAAC;MAClBF,KAAK,CAACrc,SAAS,GAAG,CAAC;MACnB,IAAI,CAAC0zB,+BAA+B,CAAC,CAAC;MACtC,IAAI,CAACW,8CAA8C,CAAChY,KAAK,CAAC;IAC9D;EAAC;IAAA7kB,GAAA;IAAAC,KAAA,EACD,SAAA48B,8CAA8CA,CAAChY,KAAK,EAAE;MAClD,IAAI6O,OAAO,GAAG7O,KAAK,CAACjjB,gBAAgB,CAAC,KAAK,GAAG+nB,UAAU,CAAC;MACxD,IAAIgK,SAAS,GAAGD,OAAO,CAAC,CAAC,CAAC;MAC1B,IAAIE,yBAAyB,GAAG,CAC5B,KAAK,GAAGuH,yBAAyB,GAAG,OAAO,GAAGA,yBAAyB,EACrE,MAAM,GAAGE,kBAAkB,GAAG,OAAO,GAAGA,kBAAkB,EAC1D,MAAM,GAAGE,iBAAiB,GAAG,OAAO,GAAGA,iBAAiB,EACxD,MAAM,GAAGzP,SAAS,GAAG,OAAO,GAAGA,SAAS,CAC7C,CAAC+H,IAAI,CAAC,EAAE,CAAC;MACVF,SAAS,CAAC/xB,gBAAgB,CAACgyB,yBAAyB,CAAC,CAAC7oB,OAAO,CAAC,UAAC+oB,gBAAgB,EAAK;QAChFA,gBAAgB,CAACC,KAAK,CAAC,CAAC;MAC5B,CAAC,CAAC;MACF,IAAI+I,eAAe,GAAGjY,KAAK,CAACjjB,gBAAgB,CAAC,KAAK,GAAGsG,UAAU,GAAG,IAAI,GAAGD,UAAU,GAAG,GAAG,GAAG0zB,QAAQ,GAAG,GAAG,GAAGzzB,UAAU,GAAG,GAAG,GAAGH,UAAU,CAAC,CAAC1H,MAAM;MAClJ;AACR;AACA;AACA;AACA;AACA;MACQ,IAAI08B,gCAAgC,GAAGn5B,GAAG,CAACmB,iBAAiB,CAAC8f,KAAK,CAAC;MACnE,IAAImY,aAAa,GAAGD,gCAAgC,CAAC72B,aAAa,CAAC,KAAK,GAAG+2B,cAAc,GAAG,OAAO,GAAGA,cAAc,CAAC;MACrHD,aAAa,CAACvyB,SAAS,GAAGqyB,eAAe;IAC7C;EAAC;IAAA98B,GAAA;IAAAC,KAAA,EAED,SAAA+5B,qDAAqDA,CAAA,EAAG;MAAA,IAAAxU,MAAA;MACpD,IAAI,CAACuG,kBAAkB,CAAC+P,iCAAiC,EAAE,UAAC1wB,KAAK,EAAEtH,OAAO,EAAK;QAAE0hB,MAAI,CAAC0X,oDAAoD,CAAC9xB,KAAK,EAAEtH,OAAO,CAAC;MAAE,CAAC,CAAC;IAClK;EAAC;IAAA9D,GAAA;IAAAC,KAAA,EACD,SAAAi9B,oDAAoDA,CAAC9xB,KAAK,EAAEmS,MAAM,EAAE;MAChEnS,KAAK,CAACC,eAAe,CAAC,CAAC;MACvB+qB,sCAAsC,CAACnyB,YAAY,CAACk1B,mCAAmC,EAAE,CAAC,CAAC,GAAG/C,sCAAsC,CAACjwB,YAAY,CAACgzB,mCAAmC,CAAC,CAAC;MACvL,IAAItU,KAAK,GAAGljB,QAAQ,CAACuE,aAAa,CAACgzB,qCAAqC,GAAG,QAAQ,CAAC;MACpF,IAAIrU,KAAK,CAACrd,SAAS,CAACC,QAAQ,CAAC0T,eAAe,CAAC,EAAE;MAC/C,IAAI4J,GAAG,GAAGqR,sCAAsC,CAACjN,SAAS,CAAC,IAAI,CAAC;MAChEpE,GAAG,CAACvd,SAAS,CAACG,MAAM,CAACuD,eAAe,CAAC;MACrC6Z,GAAG,CAACnjB,gBAAgB,CAAC,GAAG,GAAGsJ,eAAe,CAAC,CAACH,OAAO,CAAC,UAASjH,OAAO,EAAE;QAClEA,OAAO,CAAC0D,SAAS,CAACG,MAAM,CAACuD,eAAe,CAAC;MAC7C,CAAC,CAAC;MACF,IAAIke,SAAS,GAAGznB,QAAQ,CAACC,gBAAgB,CAACs3B,qCAAqC,GAAG,eAAe,CAAC,CAAC74B,MAAM;MACzG0kB,GAAG,CAAC9gB,YAAY,CAACk1B,mCAAmC,EAAE,CAAC,CAAC,GAAG/P,SAAS,CAAC;MACrEvE,KAAK,CAACyE,OAAO,CAACvE,GAAG,CAAC;MAClBF,KAAK,CAACrc,SAAS,GAAG,CAAC;MACnB,IAAI,CAACquB,yCAAyC,CAAC,CAAC;MAChD,IAAI,CAACsG,yDAAyD,CAACtY,KAAK,CAAC;IACzE;EAAC;IAAA7kB,GAAA;IAAAC,KAAA,EACD,SAAAk9B,yDAAyDA,CAACtY,KAAK,EAAE;MAC7D,IAAI6O,OAAO,GAAG7O,KAAK,CAACjjB,gBAAgB,CAAC,KAAK,GAAG+nB,UAAU,CAAC;MACxD,IAAIgK,SAAS,GAAGD,OAAO,CAAC,CAAC,CAAC;MAC1B,IAAIE,yBAAyB,GAAG,CAC5B,KAAK,GAAG5d,mBAAmB,GAAG,OAAO,GAAGA,mBAAmB,EACzD,MAAM,GAAGY,WAAW,GAAG,OAAO,GAAGA,WAAW,EAC5C,MAAM,GAAGqjB,mBAAmB,GAAG,OAAO,GAAGA,mBAAmB,EAC5D,MAAM,GAAGE,SAAS,GAAG,OAAO,GAAGA,SAAS,CAC7C,CAACtG,IAAI,CAAC,EAAE,CAAC;MACVF,SAAS,CAAC/xB,gBAAgB,CAACgyB,yBAAyB,CAAC,CAAC7oB,OAAO,CAAC,UAAC+oB,gBAAgB,EAAK;QAChFA,gBAAgB,CAACC,KAAK,CAAC,CAAC;MAC5B,CAAC,CAAC;IACN;EAAC;IAAA/zB,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,uBAAA,CAAAwV,iBAAA;IACJ;EAAC;IAAAr2B,GAAA;IAAAC,KAAA,EA/KD,SAAO+7B,oCAAoCA,CAAC3oB,QAAQ,EAAE;MAClD,IAAIA,QAAQ,IAAI,IAAI,EAAEA,QAAQ,GAAA9J,yBAAA,CAAAA,yBAAA,CAAAA,yBAAA,CAAAA,yBAAA,CAAAA,yBAAA,CAAAA,yBAAA,KACzBqzB,wBAAwB,EAAG,IAAI,GAC7BzB,yBAAyB,EAAG,CAAC,GAC7BE,kBAAkB,EAAG,CAAC,GACtBE,iBAAiB,EAAG,EAAE,GACtBzP,SAAS,EAAG,EAAE,GACd5jB,UAAU,EAAG,IAAI,CACvB;MACD,IAAIk1B,KAAK,GAAI/pB,QAAQ,CAACupB,wBAAwB,CAAC,IAAI,IAAI,IAAIvpB,QAAQ,CAACupB,wBAAwB,CAAC,GAAG,CAAE;MAClG,IAAI7X,GAAG,GAAGpjB,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;MACtC4a,GAAG,CAACvd,SAAS,CAACE,GAAG,CAACgzB,sBAAsB,CAAC;MACzC,IAAI0C,KAAK,EAAErY,GAAG,CAACvd,SAAS,CAACE,GAAG,CAACiiB,UAAU,CAAC;MACxC5E,GAAG,CAAC9gB,YAAY,CAAC24B,wBAAwB,EAAEvpB,QAAQ,CAACupB,wBAAwB,CAAC,CAAC;MAE9E,IAAIS,uBAAuB,GAAG17B,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;MAC1DkzB,uBAAuB,CAAC71B,SAAS,CAACE,GAAG,CAACyzB,yBAAyB,EAAEmC,cAAc,CAAC;MAChF,IAAIC,wBAAwB,GAAG57B,QAAQ,CAACwI,aAAa,CAAC,KAAK,CAAC;MAC5DozB,wBAAwB,CAAC/1B,SAAS,CAACE,GAAG,CAACyzB,yBAAyB,CAAC;MACjEv3B,GAAG,CAACC,4CAA4C,CAAC05B,wBAAwB,EAAElqB,QAAQ,CAAC8nB,yBAAyB,CAAC,CAAC;MAC/GoC,wBAAwB,CAAC9yB,SAAS,GAAG4I,QAAQ,CAAC8nB,yBAAyB,CAAC;MACxEkC,uBAAuB,CAAC1W,WAAW,CAAC4W,wBAAwB,CAAC;MAC7DxY,GAAG,CAAC4B,WAAW,CAAC0W,uBAAuB,CAAC;MAExC,IAAIG,gBAAgB,GAAG77B,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;MACnDqzB,gBAAgB,CAACh2B,SAAS,CAACE,GAAG,CAAC2zB,kBAAkB,EAAEiC,cAAc,CAAC;MAClE,IAAIG,iBAAiB,GAAG97B,QAAQ,CAACwI,aAAa,CAAC,KAAK,CAAC;MACrDszB,iBAAiB,CAACj2B,SAAS,CAACE,GAAG,CAAC2zB,kBAAkB,CAAC;MACnDz3B,GAAG,CAACC,4CAA4C,CAAC45B,iBAAiB,EAAEpqB,QAAQ,CAACgoB,kBAAkB,CAAC,CAAC;MACjGoC,iBAAiB,CAAChzB,SAAS,GAAG4I,QAAQ,CAACgoB,kBAAkB,CAAC;MAC1DmC,gBAAgB,CAAC7W,WAAW,CAAC8W,iBAAiB,CAAC;MAC/C1Y,GAAG,CAAC4B,WAAW,CAAC6W,gBAAgB,CAAC;MAEjC,IAAIE,eAAe,GAAG/7B,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;MAClDuzB,eAAe,CAACl2B,SAAS,CAACE,GAAG,CAAC6zB,iBAAiB,EAAE+B,cAAc,CAAC;MAChE,IAAIK,kBAAkB,GAAGh8B,QAAQ,CAACwI,aAAa,CAAC,OAAO,CAAC;MACxDwzB,kBAAkB,CAACn5B,IAAI,GAAG,QAAQ;MAClCm5B,kBAAkB,CAACn2B,SAAS,CAACE,GAAG,CAAC6zB,iBAAiB,CAAC;MACnD33B,GAAG,CAACC,4CAA4C,CAAC85B,kBAAkB,EAAEtqB,QAAQ,CAACkoB,iBAAiB,CAAC,CAAC;MACjGoC,kBAAkB,CAAC19B,KAAK,GAAGoT,QAAQ,CAACkoB,iBAAiB,CAAC;MACtDmC,eAAe,CAAC/W,WAAW,CAACgX,kBAAkB,CAAC;MAC/C5Y,GAAG,CAAC4B,WAAW,CAAC+W,eAAe,CAAC;MAEhC,IAAIE,OAAO,GAAGj8B,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;MAC1CyzB,OAAO,CAACp2B,SAAS,CAACE,GAAG,CAACokB,SAAS,EAAEwR,cAAc,CAAC;MAChD,IAAI7J,UAAU,GAAG9xB,QAAQ,CAACwI,aAAa,CAAC,UAAU,CAAC;MACnDspB,UAAU,CAACjsB,SAAS,CAACE,GAAG,CAACokB,SAAS,CAAC;MACnCloB,GAAG,CAACC,4CAA4C,CAAC4vB,UAAU,EAAEpgB,QAAQ,CAACyY,SAAS,CAAC,CAAC;MACjF2H,UAAU,CAACxzB,KAAK,GAAGoT,QAAQ,CAACyY,SAAS,CAAC;MACtC8R,OAAO,CAACjX,WAAW,CAAC8M,UAAU,CAAC;MAC/B1O,GAAG,CAAC4B,WAAW,CAACiX,OAAO,CAAC;MAExB,IAAIC,QAAQ,GAAGl8B,QAAQ,CAACwI,aAAa,CAAC,IAAI,CAAC;MAC3C0zB,QAAQ,CAACr2B,SAAS,CAACE,GAAG,CAACQ,UAAU,EAAEo1B,cAAc,CAAC;MAClD,IAAI5B,eAAe,GAAG/5B,QAAQ,CAACuE,aAAa,CAACinB,2BAA2B,GAAG,IAAI,GAAGllB,UAAU,GAAG,GAAG,GAAG0zB,QAAQ,GAAG,GAAG,GAAGzzB,UAAU,GAAG,GAAG,GAAGklB,OAAO,CAAC;MACjJ,IAAI0Q,kBAAkB,GAAGn8B,QAAQ,CAACuE,aAAa,CAACinB,2BAA2B,GAAG,IAAI,GAAGllB,UAAU,GAAG,GAAG,GAAG0zB,QAAQ,GAAG,GAAG,GAAGzzB,UAAU,GAAG,GAAG,GAAGH,UAAU,CAAC;MACvJ,IAAImrB,YAAY,GAAI7f,QAAQ,CAACnL,UAAU,CAAC,GAAI41B,kBAAkB,CAAC3U,SAAS,CAAC,IAAI,CAAC,GAAGuS,eAAe,CAACvS,SAAS,CAAC,IAAI,CAAC;MAChH0U,QAAQ,CAAClX,WAAW,CAACuM,YAAY,CAAC;MAClCnO,GAAG,CAAC4B,WAAW,CAACkX,QAAQ,CAAC;MAEzB,OAAO9Y,GAAG;IACd;EAAC;AAAA,EAzd0C1C,aAAa;AAAA9Y,yBAAA,CAAvC8sB,iBAAiB,UACpB0H,qBAAqB;AAAAx0B,yBAAA,CADlB8sB,iBAAiB,qBAETE,gBAAgB;;;;;;;;;;;;;;;;;;;;ACdd;AAC8C;AAC9C;AACU;AACI;AACN;AACU;AACA;AAAA,IAE5ByH,kBAAkB,0BAAAlL,cAAA;EAKnC,SAAAkL,mBAAYziB,MAAM,EAAE;IAAA,IAAA+B,KAAA;IAAAxd,0BAAA,OAAAk+B,kBAAA;IAChB1gB,KAAA,GAAAqD,qBAAA,OAAAqd,kBAAA,GAAMziB,MAAM;IAAEhS,0BAAA,CAAA+T,KAAA,0BAHKzK,GAAG,CAACyjB,eAAe;IAItChZ,KAAA,CAAKyV,QAAQ,GAAG,IAAIP,iBAAiB,CAAAlV,KAAK,CAAC;IAAC,OAAAA,KAAA;EAChD;EAACsD,oBAAA,CAAAod,kBAAA,EAAAlL,cAAA;EAAA,OAAA/yB,uBAAA,CAAAi+B,kBAAA;IAAAh+B,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA8iB,aAAaA,CAAA,EAAG;MACZ,IAAI,CAACS,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACya,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACC,yBAAyB,CAAC,CAAC;MAChC,IAAI,CAAClX,oBAAoB,CAAC,CAAC;MAC3B,IAAI,CAACmX,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACxa,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA3jB,GAAA;IAAAC,KAAA,EACD,SAAAg+B,mBAAmBA,CAAA,EAAG;MAClB,IAAI,CAACxZ,YAAY,CAAC2Z,aAAa,CAAC;IACpC;EAAC;IAAAp+B,GAAA;IAAAC,KAAA,EACD,SAAAi+B,yBAAyBA,CAAA,EAAG;MACxB,IAAI,CAACzZ,YAAY,CAAC4Z,mBAAmB,CAAC;IAC1C;EAAC;IAAAr+B,GAAA;IAAAC,KAAA,EACD,SAAAk+B,mBAAmBA,CAAA,EAAG;MAClB,IAAI,CAAC1Z,YAAY,CAACiS,eAAe,CAAC;IACtC;EAAC;IAAA12B,GAAA;IAAAC,KAAA,EAED,SAAA0nB,YAAYA,CAACC,OAAO,EAAE;MAClB,IAAIA,OAAO,IAAI,IAAI,EAAE;MACrB,IAAIY,QAAQ,EAAE;QAAE7kB,WAAK,CAACsW,oCAAoC,CAAC,qBAAqB,EAAE2N,OAAO,CAAC;MAAE;IAChG;EAAC;IAAA5nB,GAAA;IAAAC,KAAA,EACD,SAAA4oB,UAAUA,CAAC9D,GAAG,EAAE;MACZ,IAAIA,GAAG,IAAI,IAAI,EAAE;MACjB,IAAIuZ,uBAAuB,GAAGvZ,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGqxB,sBAAsB,GAAG,QAAQ,CAAC;MAC1F,IAAI9D,UAAU,GAAG1O,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAG4lB,SAAS,GAAG,WAAW,CAAC;MACnE,IAAIoH,YAAY,GAAGnO,GAAG,CAAC7e,aAAa,CAAC,KAAK,GAAGgC,UAAU,GAAG,IAAI,GAAGA,UAAU,CAAC;MAE5E,IAAIirB,OAAO,GAAG,CAAC,CAAC;MAChBA,OAAO,CAACoD,gBAAgB,CAAC,GAAGxR,GAAG,CAAC5e,YAAY,CAACowB,gBAAgB,CAAC;MAC9DpD,OAAO,CAACiL,aAAa,CAAC,GAAG,IAAI,CAACG,eAAe,CAACxZ,GAAG,CAAC;MAClDoO,OAAO,CAACkL,mBAAmB,CAAC,GAAG,IAAI,CAACG,qBAAqB,CAACzZ,GAAG,CAAC;MAC9DoO,OAAO,CAACoE,sBAAsB,CAAC,GAAG3zB,GAAG,CAACuE,+BAA+B,CAACm2B,uBAAuB,CAAC;MAC9FnL,OAAO,CAAClM,cAAc,CAAC,GAAG,IAAI,CAACwX,gBAAgB,CAAC1Z,GAAG,CAAC;MACpDoO,OAAO,CAACuD,eAAe,CAAC,GAAG,IAAI,CAACgI,mBAAmB,CAAC3Z,GAAG,CAAC;MACxDoO,OAAO,CAACrH,SAAS,CAAC,GAAGloB,GAAG,CAACuE,+BAA+B,CAACsrB,UAAU,CAAC;MACpEN,OAAO,CAACjrB,UAAU,CAAC,GAAGgrB,YAAY,CAAC1rB,SAAS,CAACC,QAAQ,CAACM,UAAU,CAAC;MACjE,OAAOorB,OAAO;IAClB;EAAC;IAAAnzB,GAAA;IAAAC,KAAA,EACD,SAAAs+B,eAAeA,CAACrT,EAAE,EAAE;MAChB,IAAIyT,cAAc,GAAGzT,EAAE,CAAChlB,aAAa,CAAC,KAAK,GAAGswB,WAAW,GAAG,IAAI,GAAGA,WAAW,CAAC;MAC/E,OAAO5yB,GAAG,CAACuE,+BAA+B,CAACw2B,cAAc,CAAC;IAC9D;EAAC;IAAA3+B,GAAA;IAAAC,KAAA,EACD,SAAAu+B,qBAAqBA,CAACtT,EAAE,EAAE;MACtB,IAAI0T,oBAAoB,GAAG1T,EAAE,CAAChlB,aAAa,CAAC,KAAK,GAAGuwB,iBAAiB,GAAG,IAAI,GAAGA,iBAAiB,CAAC;MACjG,OAAO7yB,GAAG,CAACuE,+BAA+B,CAACy2B,oBAAoB,CAAC;IACpE;EAAC;IAAA5+B,GAAA;IAAAC,KAAA,EACD,SAAAw+B,gBAAgBA,CAACvT,EAAE,EAAE;MACjB,IAAI2T,eAAe,GAAG3T,EAAE,CAAChlB,aAAa,CAAC,KAAK,GAAGgS,YAAY,GAAG,IAAI,GAAGA,YAAY,CAAC;MAClF,OAAOtU,GAAG,CAACuE,+BAA+B,CAAC02B,eAAe,CAAC;IAC/D;EAAC;IAAA7+B,GAAA;IAAAC,KAAA,EACD,SAAAy+B,mBAAmBA,CAACxT,EAAE,EAAE;MACpB,IAAI4T,kBAAkB,GAAG5T,EAAE,CAAChlB,aAAa,CAAC,KAAK,GAAGwwB,eAAe,GAAG,IAAI,GAAGA,eAAe,CAAC;MAC3F,OAAO9yB,GAAG,CAACuE,+BAA+B,CAAC22B,kBAAkB,CAAC;IAClE;EAAC;IAAA9+B,GAAA;IAAAC,KAAA,EACD,SAAAopB,gBAAgBA,CAACxE,KAAK,EAAEE,GAAG,EAAE,CAE7B;EAAC;IAAA/kB,GAAA;IAAAC,KAAA,EACD,SAAAspB,4BAA4BA,CAAC1E,KAAK,EAAE;MAChC,IAAI6O,OAAO,GAAG7O,KAAK,CAACjjB,gBAAgB,CAAC,KAAK,GAAG+nB,UAAU,CAAC;MACxD,IAAIgK,SAAS,GAAGD,OAAO,CAAC,CAAC,CAAC;MAC1B,IAAIE,yBAAyB,GAAG,CAC5B,KAAK,GAAG4C,WAAW,GAAG,OAAO,GAAGA,WAAW,EACzC,MAAM,GAAGC,iBAAiB,GAAG,OAAO,GAAGA,iBAAiB,EACxD,MAAM,GAAGve,YAAY,GAAG,OAAO,GAAGA,YAAY,EAC9C,MAAM,GAAGwe,eAAe,GAAG,OAAO,GAAGA,eAAe,CACzD,CAAC7C,IAAI,CAAC,EAAE,CAAC;MACVF,SAAS,CAAC/xB,gBAAgB,CAACgyB,yBAAyB,CAAC,CAAC7oB,OAAO,CAAC,UAAC+oB,gBAAgB,EAAK;QAChFA,gBAAgB,CAACC,KAAK,CAAC,CAAC;MAC5B,CAAC,CAAC;IACN;EAAC;IAAA/zB,GAAA;IAAAC,KAAA,EAED,SAAAgjB,eAAeA,CAAA,EAAG;MACdpC,wBAAA,CAAAmd,kBAAA;MACA,IAAI,CAACe,kBAAkB,CAAC,CAAC;MACzB,IAAI,CAACC,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACC,yBAAyB,CAAC,CAAC;MAChC,IAAI,CAACC,uBAAuB,CAAC,CAAC;MAC9B,IAAI,CAACnM,QAAQ,CAACJ,oBAAoB,CAAC,CAAC;MACpC,IAAI,CAACwM,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACtT,sBAAsB,CAAC,CAAC;MAC7B,IAAI,CAACE,kBAAkB,CAAC,CAAC;IAC7B;EAAC;IAAA/rB,GAAA;IAAAC,KAAA,EACD,SAAA8+B,kBAAkBA,CAAA,EAAG;MAAA,IAAAlhB,MAAA;MACjBnT,MAAM,CAACM,kBAAkB,CACrB,OAAO,CAAC;MAAA,EACNwV,WAAW,GAAG,MAAM,GAAG4e,UAAU,GAAG,UAAU,GAAGA,UAAU,CAAC;MAAA,EAC5D,UAACh0B,KAAK,EAAEtH,OAAO,EAAK;QAClB,IAAIssB,QAAQ,GAAGxsB,GAAG,CAACmB,iBAAiB,CAACjB,OAAO,CAAC;QAC7C,IAAIu7B,YAAY,GAAGjP,QAAQ,CAACjqB,YAAY,CAACowB,gBAAgB,CAAC;QAC1D;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;QAEgB,IAAI7gB,WAAW,GAAG2M,aAAa,CAACgB,cAAc,CAAC,CAAC;QAChD,IAAI6D,WAAW,GAAGtjB,GAAG,CAAC2B,gBAAgB,CAACmQ,WAAW,CAAC;QACnDwR,WAAW,CAACqP,gBAAgB,CAAC,GAAG8I,YAAY;QAC5C17B,WAAK,CAACsW,oCAAoC,CAAC,oBAAoB,CAAC;QAChEtW,WAAK,CAACsW,oCAAoC,CAAC,aAAa,CAAC;QACzDtW,WAAK,CAACsW,oCAAoC,CAACvE,WAAW,CAAC;QACvD/R,WAAK,CAACsW,oCAAoC,CAAC,aAAa,CAAC;QACzDtW,WAAK,CAACsW,oCAAoC,CAACiN,WAAW,CAAC;QACvDrJ,MAAI,CAACG,KAAK,CAAC,CAAC;QACZnL,GAAG,CAACkC,QAAQ,CAACgpB,qBAAqB,EAAE7W,WAAW,CAAC;MACpD,CACJ,CAAC;IACL;EAAC;IAAAlnB,GAAA;IAAAC,KAAA,EACD,SAAA++B,mBAAmBA,CAAA,EAAG;MAClB,IAAI,CAACnR,0BAA0B,CAC3B2I,WAAW,EACT7yB,WAAK,CAACmW,eAAe,CAACsd,cAAc,CAAC,CAAC;MAC5C,CAAC;IACL;EAAC;IAAAp3B,GAAA;IAAAC,KAAA,EACD,SAAAg/B,yBAAyBA,CAAA,EAAG;MACxB,IAAI,CAACpR,0BAA0B,CAC3B4I,iBAAiB,EACf9yB,WAAK,CAACmW,eAAe,CAACwd,oBAAoB,CAAC,CAAC;MAClD,CAAC;IACL;EAAC;IAAAt3B,GAAA;IAAAC,KAAA,EACD,SAAAi/B,uBAAuBA,CAAA,EAAG;MACtB,IAAI,CAAC1U,6BAA6B,CAAChK,WAAW,GAAG,MAAM,GAAG+W,sBAAsB,GAAG,SAAS,GAAGA,sBAAsB,CAAC;IAC1H;EAAC;IAAAv3B,GAAA;IAAAC,KAAA,EACD,SAAAk/B,mBAAmBA,CAAA,EAAG;MAClB,IAAI,CAACtR,0BAA0B,CAC3B6I,eAAe,EACb/yB,WAAK,CAACmW,eAAe,CAAC0d,kBAAkB,CAAC,CAAC;MAChD,CAAC;IACL;EAAC;IAAAx3B,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,wBAAA,CAAAmd,kBAAA;IACJ;EAAC;AAAA,EA5J2C3b,aAAa;AAAA9Y,0BAAA,CAAxCy0B,kBAAkB,UACrB5e,sBAAsB;AAAA7V,0BAAA,CADnBy0B,kBAAkB,qBAEVzH,gBAAgB;;;;;;;;;;;;;;;;;;;;ACZX;AAAA,IAEb+I,uBAAuB,0BAAA5e,SAAA;EAGxC,SAAA4e,wBAAY/jB,MAAM,EAAE;IAAAzb,mCAAA,OAAAw/B,uBAAA;IAAA,OAAA3e,8BAAA,OAAA2e,uBAAA,GACV/jB,MAAM;EAChB;EAACqF,6BAAA,CAAA0e,uBAAA,EAAA5e,SAAA;EAAA,OAAA3gB,gCAAA,CAAAu/B,uBAAA;IAAAt/B,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,iCAAA,CAAAye,uBAAA;IACJ;EAAC;AAAA,EAbgDhkB,QAAQ;AAAA/R,mCAAA,CAAxC+1B,uBAAuB,UAC1BC,2BAA2B;;;;;;;;;;;;;;;;;;;;ACHX;AAAA,IAEbC,0BAA0B,0BAAA9e,SAAA;EAG3C,SAAA8e,2BAAYjkB,MAAM,EAAE;IAAAzb,sCAAA,OAAA0/B,0BAAA;IAAA,OAAA7e,iCAAA,OAAA6e,0BAAA,GACVjkB,MAAM;EAChB;EAACqF,gCAAA,CAAA4e,0BAAA,EAAA9e,SAAA;EAAA,OAAA3gB,mCAAA,CAAAy/B,0BAAA;IAAAx/B,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,oCAAA,CAAA2e,0BAAA;IACJ;EAAC;AAAA,EAbmDlkB,QAAQ;AAAA/R,sCAAA,CAA3Ci2B,0BAA0B,UAC7BC,8BAA8B;;;;;;;;;;;;;;;;;;;;ACFd;AAAA,IAEbC,WAAW,0BAAAhf,SAAA;EAG5B,SAAAgf,YAAYnkB,MAAM,EAAE;IAAAzb,sBAAA,OAAA4/B,WAAA;IAAA,OAAA/e,iBAAA,OAAA+e,WAAA,GACVnkB,MAAM;EAChB;EAACqF,gBAAA,CAAA8e,WAAA,EAAAhf,SAAA;EAAA,OAAA3gB,mBAAA,CAAA2/B,WAAA;IAAA1/B,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,oBAAA,CAAA6e,WAAA;IACJ;EAAC;AAAA,EAboCpkB,QAAQ;AAAA/R,sBAAA,CAA5Bm2B,WAAW,UACdC,eAAe;;;;;;;;;;;;;;;;;;;;ACHC;AAAA,IAEbC,iBAAiB,0BAAAlf,SAAA;EAGlC,SAAAkf,kBAAYrkB,MAAM,EAAE;IAAAzb,6BAAA,OAAA8/B,iBAAA;IAAA,OAAAjf,wBAAA,OAAAif,iBAAA,GACVrkB,MAAM;EAChB;EAACqF,uBAAA,CAAAgf,iBAAA,EAAAlf,SAAA;EAAA,OAAA3gB,0BAAA,CAAA6/B,iBAAA;IAAA5/B,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,2BAAA,CAAA+e,iBAAA;IACJ;EAAC;AAAA,EAb0CtkB,QAAQ;AAAA/R,6BAAA,CAAlCq2B,iBAAiB,UACpBC,qBAAqB;;;;;;;;;;;;;;;;;;;;ACJL;AAAA,IAEbC,qBAAqB,0BAAApf,SAAA;EAGtC,SAAAof,sBAAYvkB,MAAM,EAAE;IAAAzb,iCAAA,OAAAggC,qBAAA;IAAA,OAAAnf,4BAAA,OAAAmf,qBAAA,GACVvkB,MAAM;EAChB;EAACqF,2BAAA,CAAAkf,qBAAA,EAAApf,SAAA;EAAA,OAAA3gB,8BAAA,CAAA+/B,qBAAA;IAAA9/B,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACC,gBAAgB,CAAC,CAAC;IAC3B;EAAC;IAAA3b,GAAA;IAAAC,KAAA,EAED,SAAA+d,KAAKA,CAAA,EAAG;MACJ6C,+BAAA,CAAAif,qBAAA;IACJ;EAAC;AAAA,EAb8CxkB,QAAQ;AAAA/R,iCAAA,CAAtCu2B,qBAAqB,UACxBC,6BAA6B;;;;;;;;;ACF/C;AACA;AAC4C;AAC5C;AAC8C;AAC2B;AACnB;AACgB;AACtE;AACwD;AACK;AACe;AAClB;AACE;AAC5D;AAC4E;AACM;AAC/B;AACa;AACQ;AACxE;AACA;AACA;AACA;;AAE2B;AACA;AACQ;AAAA,IAGdC,MAAM;EACvB,SAAAA,OAAA,EAAc;IAAA,IAAA1iB,KAAA;IAAAxd,qBAAA,OAAAkgC,MAAA;IACV;IACA,IAAI,CAACC,KAAK,GAAG,CAAC,CAAC;IACf;IACA,IAAI,CAACA,KAAK,CAAC3rB,YAAY,CAAC,GAAG;MAAE7D,IAAI,EAAE,UAAU;MAAEyvB,MAAM,EAAEzf,QAAQA;IAAC,CAAC;IACjE;IACA,IAAI,CAACwf,KAAK,CAAC7hB,eAAe,CAAC,GAAG;MAAE3N,IAAI,EAAE,aAAa;MAAEyvB,MAAM,EAAEpf,WAAWA;IAAC,CAAC;IAC1E,IAAI,CAACmf,KAAK,CAAC3hB,4BAA4B,CAAC,GAAG;MAAE7N,IAAI,EAAE,iBAAiB;MAAEyvB,MAAM,EAAErN,wBAAwBA;IAAC,CAAC;IACxG,IAAI,CAACoN,KAAK,CAACzhB,mBAAmB,CAAC,GAAG;MAAE/N,IAAI,EAAE,iBAAiB;MAAEyvB,MAAM,EAAE9M,eAAeA;IAAC,CAAC;IACtF,IAAI,CAAC6M,KAAK,CAACvhB,0BAA0B,CAAC,GAAG;MAAEjO,IAAI,EAAE,wBAAwB;MAAEyvB,MAAM,EAAEhM,sBAAsBA;IAAC,CAAC;IAC3G;IACA,IAAI,CAAC+L,KAAK,CAACnhB,oBAAoB,CAAC,GAAG;MAAErO,IAAI,EAAE,kBAAkB;MAAEyvB,MAAM,EAAE3L,gBAAgBA;IAAC,CAAC;IACzF,IAAI,CAAC0L,KAAK,CAACjhB,sBAAsB,CAAC,GAAG;MAAEvO,IAAI,EAAE,oBAAoB;MAAEyvB,MAAM,EAAErL,kBAAkBA;IAAC,CAAC;IAC/F,IAAI,CAACoL,KAAK,CAAC/gB,6BAA6B,CAAC,GAAG;MAAEzO,IAAI,EAAE,2BAA2B;MAAEyvB,MAAM,EAAE9K,yBAAyBA;IAAC,CAAC;IACpH,IAAI,CAAC6K,KAAK,CAAClC,qBAAqB,CAAC,GAAG;MAAEttB,IAAI,EAAE,mBAAmB;MAAEyvB,MAAM,EAAE7J,iBAAiBA;IAAC,CAAC;IAC5F,IAAI,CAAC4J,KAAK,CAAC7gB,sBAAsB,CAAC,GAAG;MAAE3O,IAAI,EAAE,oBAAoB;MAAEyvB,MAAM,EAAElC,kBAAkBA;IAAC,CAAC;IAC/F;IACA,IAAI,CAACiC,KAAK,CAACR,8BAA8B,CAAC,GAAG;MAAEhvB,IAAI,EAAE,4BAA4B;MAAEyvB,MAAM,EAAEV,0BAA0BA;IAAC,CAAC;IACvH,IAAI,CAACS,KAAK,CAACF,6BAA6B,CAAC,GAAG;MAAEtvB,IAAI,EAAE,2BAA2B;MAAEyvB,MAAM,EAAEJ,qBAAqBA;IAAC,CAAC;IAChH,IAAI,CAACG,KAAK,CAACN,eAAe,CAAC,GAAG;MAAElvB,IAAI,EAAE,aAAa;MAAEyvB,MAAM,EAAER,WAAWA;IAAC,CAAC;IAC1E,IAAI,CAACO,KAAK,CAACJ,qBAAqB,CAAC,GAAG;MAAEpvB,IAAI,EAAE,mBAAmB;MAAEyvB,MAAM,EAAEN,iBAAiBA;IAAC,CAAC;IAC5F;IACA;IACA;IACA;IACA;IACA,IAAI,CAACO,MAAM,GAAG,CAAC,CAAC;IAChB;IACA,IAAI,CAACA,MAAM,CAAC7rB,YAAY,CAAC,GAAG;MAAA,IAACuO,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAAClJ,YAAY,EAAEuO,UAAU,CAAC;IAAA;IACjG;IACA,IAAI,CAACsd,MAAM,CAAC/hB,eAAe,CAAC,GAAG;MAAA,IAACyE,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAACY,eAAe,EAAEyE,UAAU,CAAC;IAAA;IACvG,IAAI,CAACsd,MAAM,CAAC7hB,4BAA4B,CAAC,GAAG;MAAA,IAACuE,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAACc,4BAA4B,EAAEuE,UAAU,CAAC;IAAA;IACjI,IAAI,CAACsd,MAAM,CAAC3hB,mBAAmB,CAAC,GAAG;MAAA,IAACqE,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAACgB,mBAAmB,EAAEqE,UAAU,CAAC;IAAA;IAC/G,IAAI,CAACsd,MAAM,CAACzhB,0BAA0B,CAAC,GAAG;MAAA,IAACmE,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAACkB,0BAA0B,EAAEmE,UAAU,CAAC;IAAA;IAC7H;IACA,IAAI,CAACsd,MAAM,CAACrhB,oBAAoB,CAAC,GAAG;MAAA,IAAC+D,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAACsB,oBAAoB,EAAE+D,UAAU,CAAC;IAAA;IACjH,IAAI,CAACsd,MAAM,CAACnhB,sBAAsB,CAAC,GAAG;MAAA,IAAC6D,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAACwB,sBAAsB,EAAE6D,UAAU,CAAC;IAAA;IACrH,IAAI,CAACsd,MAAM,CAACjhB,6BAA6B,CAAC,GAAG;MAAA,IAAC2D,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAAC0B,6BAA6B,EAAE2D,UAAU,CAAC;IAAA;IACnI,IAAI,CAACsd,MAAM,CAACpC,qBAAqB,CAAC,GAAG;MAAA,IAAClb,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAACugB,qBAAqB,EAAElb,UAAU,CAAC;IAAA;IACnH,IAAI,CAACsd,MAAM,CAAC/gB,sBAAsB,CAAC,GAAG;MAAA,IAACyD,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAAC4B,sBAAsB,EAAEyD,UAAU,CAAC;IAAA;IACrH;IACA,IAAI,CAACsd,MAAM,CAACV,8BAA8B,CAAC,GAAG;MAAA,IAAC5c,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAACiiB,8BAA8B,EAAE5c,UAAU,CAAC;IAAA;IACrI,IAAI,CAACsd,MAAM,CAACJ,6BAA6B,CAAC,GAAG;MAAA,IAACld,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAACuiB,6BAA6B,EAAEld,UAAU,CAAC;IAAA;IACnI,IAAI,CAACsd,MAAM,CAACR,eAAe,CAAC,GAAG;MAAA,IAAC9c,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAACmiB,eAAe,EAAE9c,UAAU,CAAC;IAAA;IACvG,IAAI,CAACsd,MAAM,CAACN,qBAAqB,CAAC,GAAG;MAAA,IAAChd,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAAA,OAAK8Z,KAAI,CAACE,cAAc,CAACqiB,qBAAqB,EAAEhd,UAAU,CAAC;IAAA;IACnH;IACA;IACA;IACA;IACA,IAAI,CAACnH,UAAU,CAAC,CAAC;EACrB;EAAC,OAAA3b,kBAAA,CAAAigC,MAAA;IAAAhgC,GAAA;IAAAC,KAAA,EACD,SAAAmgC,QAAQA,CAACC,QAAQ,EAAsB;MAAA,IAAAxiB,MAAA;MAAA,IAApBgF,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MACjC,IAAM88B,SAAS,GAAG,IAAI,CAACC,oBAAoB,CAACF,QAAQ,CAAC;MACrD,IAAI,CAACG,WAAW,GAAG,IAAIF,SAAS,CAAC,IAAI,CAAC;MACtC,IAAI,CAACE,WAAW,CAAC9kB,UAAU,CAACmH,UAAU,CAAC;MACvCjO,MAAM,CAACzJ,gBAAgB,CAAC,cAAc,EAAE;QAAA,OAAM0S,MAAI,CAAC2iB,WAAW,CAACxiB,KAAK,CAAC,CAAC;MAAA,EAAC;IAC3E;EAAC;IAAAhe,GAAA;IAAAC,KAAA,EACD,SAAAsgC,oBAAoBA,CAACF,QAAQ,EAAE;MAE3B,IAAII,QAAQ,GAAG,IAAI,CAACR,KAAK,CAACI,QAAQ,CAAC;MACnC,IAAI;QACA,IAAMH,MAAM,GAAGO,QAAQ,CAACP,MAAM;QAC9B,OAAOA,MAAM;MACjB,CAAC,CACD,OAAOhsB,KAAK,EAAE;QACVvQ,WAAK,CAACsW,oCAAoC,CAAC,cAAc,EAAE,IAAI,CAACgmB,KAAK,CAAC;QACtEhsB,OAAO,CAACC,KAAK,CAAC,iBAAiB,EAAEmsB,QAAQ,CAAC;QAC1C,MAAMnsB,KAAK;MACf;IACJ;EAAC;IAAAlU,GAAA;IAAAC,KAAA,EACD,SAAAyb,UAAUA,CAAA,EAAG;MACT9G,MAAM,CAACzJ,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAACu1B,cAAc,CAAC9d,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE;EAAC;IAAA5iB,GAAA;IAAAC,KAAA,EACD,SAAAygC,cAAcA,CAACt1B,KAAK,EAAE;MAClB,IAAI,CAACu1B,eAAe,CAAC,CAAC;IAC1B;EAAC;IAAA3gC,GAAA;IAAAC,KAAA,EACD,SAAA0gC,eAAeA,CAAA,EAAG;MACd,IAAMh6B,eAAe,GAAG/C,GAAG,CAAC8C,kBAAkB,CAAC,CAAC;MAChD,IAAI,CAAC05B,QAAQ,CAACz5B,eAAe,CAAC;IAClC;EAAC;IAAA3G,GAAA;IAAAC,KAAA,EACD,SAAAud,cAAcA,CAACnJ,IAAI,EAAkD;MAAA,IAAhDtT,IAAI,GAAAyC,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MAAA,IAAE1C,MAAM,GAAA0C,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MAAA,IAAEqf,UAAU,GAAArf,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,KAAK;MAC/D,IAAIV,GAAG,GAAG+P,GAAG,CAACY,cAAc,CAACY,IAAI,EAAEvT,MAAM,CAAC;MAC1C8/B,OAAO,CAACC,SAAS,CAAC;QAAC9/B,IAAI,EAAEA,IAAI;QAAED,MAAM,EAAEA;MAAM,CAAC,EAAE,EAAE,EAAEuT,IAAI,CAAC;MACzDxB,GAAG,CAAC8B,OAAO,CAAC7R,GAAG,EAAE/B,IAAI,CAAC;IAC1B;EAAC;IAAAf,GAAA;IAAAC,KAAA,EAED,SAAA6gC,aAAaA,CAACh+B,GAAG,EAAqC;MAAA,IAAnC/B,IAAI,GAAAyC,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MAAA,IAAEu9B,aAAa,GAAAv9B,SAAA,CAAAnD,MAAA,QAAAmD,SAAA,QAAApD,SAAA,GAAAoD,SAAA,MAAG,IAAI;MAChD;MACA,IAAIu9B,aAAa,EAAEH,OAAO,CAACC,SAAS,CAAC9/B,IAAI,EAAE,EAAE,EAAE+B,GAAG,CAAC;MACnDA,GAAG,GAAG+P,GAAG,CAAC0B,eAAe,CAACzR,GAAG,EAAE/B,IAAI,CAAC;MACpC8R,GAAG,CAAC8B,OAAO,CAAC7R,GAAG,CAAC;IACpB;EAAC;IAAA9C,GAAA;IAAAC,KAAA,EAED,SAAO+gC,wBAAwBA,CAAC3tB,QAAQ,EAAE;MACtCzP,GAAG,CAACyC,YAAY,CAACgN,QAAQ,CAACtS,IAAI,CAAC;IACnC;EAAC;AAAA;AAhGsB;AAmGpB,IAAMwa,MAAM,GAAG,IAAIykB,MAAM,CAAC,CAAC;;ACjIrB;;AAAA,SAAAtxB,UAAAA,CAAArC,CAAA,sCAAAqC,UAAA,wBAAAnC,MAAA,uBAAAA,MAAA,CAAAE,QAAA,aAAAJ,CAAA,kBAAAA,CAAA,gBAAAA,CAAA,WAAAA,CAAA,yBAAAE,MAAA,IAAAF,CAAA,CAAAmE,WAAA,KAAAjE,MAAA,IAAAF,CAAA,KAAAE,MAAA,CAAAL,SAAA,qBAAAG,CAAA,KAAAqC,UAAA,CAAArC,CAAA;AAAA,SAAAvM,kBAAAA,CAAA0M,CAAA,EAAAL,CAAA,UAAAK,CAAA,YAAAL,CAAA,aAAAqD,SAAA;AAAA,SAAAgD,oBAAAA,CAAAzG,CAAA,EAAAE,CAAA,aAAAD,CAAA,MAAAA,CAAA,GAAAC,CAAA,CAAA5L,MAAA,EAAA2L,CAAA,UAAAK,CAAA,GAAAJ,CAAA,CAAAD,CAAA,GAAAK,CAAA,CAAAU,UAAA,GAAAV,CAAA,CAAAU,UAAA,QAAAV,CAAA,CAAAW,YAAA,kBAAAX,CAAA,KAAAA,CAAA,CAAAY,QAAA,QAAAzK,MAAA,CAAA8J,cAAA,CAAAP,CAAA,EAAAoG,iBAAA,CAAA9F,CAAA,CAAArM,GAAA,GAAAqM,CAAA;AAAA,SAAAtM,eAAAA,CAAAgM,CAAA,EAAAE,CAAA,EAAAD,CAAA,WAAAC,CAAA,IAAAuG,oBAAA,CAAAzG,CAAA,CAAAG,SAAA,EAAAD,CAAA,GAAAD,CAAA,IAAAwG,oBAAA,CAAAzG,CAAA,EAAAC,CAAA,GAAAxJ,MAAA,CAAA8J,cAAA,CAAAP,CAAA,iBAAAkB,QAAA,SAAAlB,CAAA;AAAA,SAAAoG,iBAAAA,CAAAnG,CAAA,QAAAxL,CAAA,GAAAiS,eAAA,CAAAzG,CAAA,gCAAA0C,UAAA,CAAAlO,CAAA,IAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAiS,eAAAA,CAAAzG,CAAA,EAAAC,CAAA,oBAAAyC,UAAA,CAAA1C,CAAA,MAAAA,CAAA,SAAAA,CAAA,MAAAD,CAAA,GAAAC,CAAA,CAAAO,MAAA,CAAAmG,WAAA,kBAAA3G,CAAA,QAAAvL,CAAA,GAAAuL,CAAA,CAAA0B,IAAA,CAAAzB,CAAA,EAAAC,CAAA,gCAAAyC,UAAA,CAAAlO,CAAA,UAAAA,CAAA,YAAAgP,SAAA,yEAAAvD,CAAA,GAAA0G,MAAA,GAAAC,MAAA,EAAA5G,CAAA;AAEc;AACM;AAAA,IAG3Bi1B,GAAG;EACL,SAAAA,IAAA,EAAc;IAAAnhC,kBAAA,OAAAmhC,GAAA;IACV,IAAI,CAACC,GAAG,GAAG,IAAIt9B,GAAG,CAAC,CAAC;IACpB,IAAI,CAAC2X,MAAM,GAAG,IAAIykB,MAAM,CAAC,CAAC;EAC9B;EAAC,OAAAjgC,eAAA,CAAAkhC,GAAA;IAAAjhC,GAAA;IAAAC,KAAA,EAED,SAAAyb,UAAUA,CAAA,EAAG;MACT,IAAI,CAACylB,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACC,KAAK,CAAC,CAAC;IAChB;EAAC;IAAAphC,GAAA;IAAAC,KAAA,EAED,SAAAkhC,mBAAmBA,CAAA,EAAG;MAClB;IAAA;EACH;IAAAnhC,GAAA;IAAAC,KAAA,EAED,SAAAohC,iBAAiBA,CAACj2B,KAAK,EAAE,CACzB;EAAC;IAAApL,GAAA;IAAAC,KAAA,EAED,SAAAmhC,KAAKA,CAAA,EAAG;MACJ,IAAI,CAACE,eAAe,CAAC,CAAC;IAC1B;EAAC;IAAAthC,GAAA;IAAAC,KAAA,EAED,SAAAqhC,eAAeA,CAAA,EAAG;MACd,IAAI,CAAC/lB,MAAM,CAAColB,eAAe,CAAC,CAAC;IACjC;EAAC;AAAA;AAIL,IAAMY,GAAG,GAAG,IAAIN,GAAG,CAAC,CAAC;AAErB,SAASO,QAAQA,CAACC,EAAE,EAAE;EAClB,IAAI9/B,QAAQ,CAAC+/B,UAAU,KAAK,SAAS,EAAE;IACnCD,EAAE,CAAC,CAAC;EACR,CAAC,MAAM;IACH9/B,QAAQ,CAACwJ,gBAAgB,CAAC,kBAAkB,EAAEs2B,EAAE,CAAC;EACrD;AACJ;AAEAD,QAAQ,CAAC,YAAM;EACXD,GAAG,CAAC7lB,UAAU,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF9G,MAAM,CAAC2sB,GAAG,GAAGA,GAAG;AAEhB,6CAAeA,gDAAAA,GAAG,I;;;;;ACnDlB;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA;;;;;;ACAA","sources":["webpack://app/./static/js/lib/validation.js","webpack://app/./static/js/dom.js","webpack://app/./static/js/lib/events.js","webpack://app/./static/js/lib/local_storage.js","webpack://app/./static/js/api.js","webpack://app/./static/js/lib/utils.js","webpack://app/./static/js/components/common/temporary/overlay_confirm.js","webpack://app/./static/js/pages/base.js","webpack://app/./static/js/pages/core/home.js","webpack://app/./static/js/pages/dog/home.js","webpack://app/./static/js/lib/business_objects/business_objects.js","webpack://app/./static/js/components/common/temporary/overlay_error.js","webpack://app/./static/js/pages/base_table.js","webpack://app/./static/js/pages/dog/mixin.js","webpack://app/./static/js/pages/dog/mixin_table.js","webpack://app/./static/js/pages/dog/command_categories.js","webpack://app/./static/js/pages/dog/commands.js","webpack://app/./static/js/pages/dog/dog_command_links.js","webpack://app/./static/js/pages/dog/locations.js","webpack://app/./static/js/pages/dog/button_icons.js","webpack://app/./static/js/pages/dog/command_button_links.js","webpack://app/./static/js/pages/dog/assessment.js","webpack://app/./static/js/pages/dog/assessments.js","webpack://app/./static/js/pages/legal/accessibility_report.js","webpack://app/./static/js/pages/legal/accessibility_statement.js","webpack://app/./static/js/pages/legal/license.js","webpack://app/./static/js/pages/legal/privacy_policy.js","webpack://app/./static/js/pages/legal/retention_schedule.js","webpack://app/./static/js/router.js","webpack://app/./static/js/app.js","webpack://app/./static/css/main.css?0a91","webpack://app/./static/css/components/button.css?0e0b","webpack://app/./static/css/components/card.css","webpack://app/./static/css/components/dialog.css","webpack://app/./static/css/components/form.css?94e1","webpack://app/./static/css/components/image.css?9f9c","webpack://app/./static/css/components/label.css?b78f","webpack://app/./static/css/components/modal.css","webpack://app/./static/css/components/navigation.css","webpack://app/./static/css/components/overlay.css?6dfd","webpack://app/./static/css/components/table.css?e553","webpack://app/./static/css/layouts/header.css?da75","webpack://app/./static/css/layouts/footer.css?65e3","webpack://app/./static/css/layouts/table-main.css?8c15","webpack://app/./static/css/lib/reset.css","webpack://app/./static/css/lib/typography.css","webpack://app/./static/css/lib/utils.css?0479","webpack://app/./static/css/lib/variables.css","webpack://app/./static/css/themes/light.css?855e"],"sourcesContent":["\nexport default class Validation {\n /*\n isNullOrWhitespace(v) {\n let txt = JSON.stringify(v).replace('/\\s\\g', '');\n return (txt == '' || 'null');\n }\n */\n\n static isEmpty(object) {\n\n let isEmpty = true;\n\n if (object !== null && object !== \"null\" && object !== undefined && object !== \"undefined\") {\n\n if (object.length == undefined) {\n isEmpty = false; // object exists but isn't a collection\n }\n else if (typeof object === \"function\") {\n isEmpty = false; // object is reference\n }\n else { // string or collection\n\n let isString = (typeof object == \"string\");\n\n if (isString) object = object.trim();\n\n if (object.length > 0) {\n\n if (isString) {\n isEmpty = false; // String greater than length 0\n }\n else {\n\n if (typeof object[0] != \"string\") {\n isEmpty = false;\n }\n else {\n for(let i = 0; i < object.length; i++) {\n if (object[i] != \"\") {\n isEmpty = false;\n break\n }\n }\n }\n }\n }\n }\n }\n\n return isEmpty;\n }\n\n static isValidNumber(value, positiveOnly) {\n return !Validation.isEmpty(value) && !isNaN(value) && (!positiveOnly || parseFloat(value) > 0);\n }\n\n static getDataContentType(params) {\n\n var data = null;\n var contentType = '';\n\n if (!Validation.isEmpty(params)) {\n\n if (typeof params === \"string\") {\n data = params;\n contentType = \"application/x-www-form-urlencoded; charset=UTF-8\";\n }\n else {\n data = JSON.stringify(params);\n contentType = \"application/json; charset=UTF-8\";\n }\n }\n\n return { Data: data, ContentType: contentType };\n }\n\n static arrayContainsItem(array, itemValue) {\n\n var hasItem = false;\n\n if (!Validation.isEmpty(array) && !Validation.isEmpty(itemValue)) {\n\n var isJQueryElementArray = array[0] instanceof jQuery;\n\n if (isJQueryElementArray) {\n\n for (let i = 0; i < array.length; i++) {\n\n if (document.querySelectorAll(array[i]).is(itemValue)) {\n hasItem = true;\n break;\n }\n }\n }\n else {\n\n var isDate = array[0] instanceof Date;\n\n if (isDate) {\n \n for (let i = 0; i < array.length; i++) {\n\n if (array[i].getTime() === itemValue.getTime()) {\n hasItem = true;\n break;\n }\n }\n }\n else {\n\n for (let i = 0; i < array.length; i++) {\n\n if (array[i] == itemValue) {\n hasItem = true;\n break;\n }\n }\n }\n }\n }\n\n return hasItem;\n }\n\n static dictHasKey(d, k) {\n return (k in d);\n }\n static areEqualDicts(dict1, dict2) {\n const keys1 = Object.keys(dict1);\n const keys2 = Object.keys(dict2);\n \n if (keys1.length !== keys2.length) {\n return false;\n }\n \n for (let key of keys1) {\n if (dict1[key] !== dict2[key]) {\n return false;\n }\n }\n \n return true;\n }\n\n static imageExists(url, callback) {\n\n var img = new Image();\n\n img.onload = function() { callback(true); };\n img.onerror = function() { callback(false); };\n img.src = url;\n }\n\n static toFixedOrDefault(value, decimalPlaces, defaultValue = null) {\n return Validation.isValidNumber(value) ? parseFloat(value).toFixed(decimalPlaces) : defaultValue;\n }\n}\n","\nimport Utils from \"./lib/utils.js\";\nimport Validation from \"./lib/validation.js\";\n\nexport default class DOM {\n static setElementAttributesValuesCurrentAndPrevious(element, data) {\n DOM.setElementAttributeValueCurrent(element, data);\n DOM.setElementAttributeValuePrevious(element, data);\n }\n static setElementAttributeValueCurrent(element, data) {\n element.setAttribute(attrValueCurrent, data);\n }\n static setElementAttributeValuePrevious(element, data) {\n element.setAttribute(attrValuePrevious, data);\n }\n static setElementValuesCurrentAndPrevious(element, data) {\n DOM.setElementValueCurrent(element, data);\n DOM.setElementAttributeValuePrevious(element, data);\n }\n static setElementValueCurrent(element, data) {\n DOM.setElementAttributeValueCurrent(element, data);\n let tagName = element.tagName.toUpperCase();\n if (element.type === \"checkbox\") {\n element.checked = data;\n }\n else if (tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT') {\n element.value = data;\n }\n else {\n element.textContent = data;\n }\n }\n static setElementValueCurrentIfEmpty(element, data) {\n if (Validation.isEmpty(DOM.getElementValueCurrent(element))) {\n DOM.setElementValueCurrent(element, data);\n }\n }\n static getCellFromElement(element) {\n return element.closest('td');\n }\n static getRowFromElement(element, flagRow) {\n let selector = Validation.isEmpty(flagRow) ? 'tr' : 'tr.' + flagRow;\n return element.closest(selector);\n }\n static getClosestParent(element, parentSelector) {\n let parent = element.parentElement;\n while (parent) {\n if (parent.matches(parentSelector)) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return null;\n }\n static convertForm2JSON(elementForm) {\n let dataForm = {};\n if (Validation.isEmpty(elementForm)) {\n return dataForm;\n }\n let containersFilter = elementForm.querySelectorAll('.' + flagContainerInput + '.' + flagFilter);\n let containerFilter, labelFilter, keyFilter, filter;\n for (let indexFilter = 0; indexFilter < containersFilter.length; indexFilter++) {\n containerFilter = containersFilter[indexFilter];\n labelFilter = containerFilter.querySelector('label');\n keyFilter = labelFilter.getAttribute('for');\n filter = containerFilter.querySelector(`#${keyFilter}`);\n dataForm[keyFilter] = DOM.getElementValueCurrent(filter);\n }\n return dataForm;\n }\n static loadPageBody(contentNew) {\n let pageBody = document.querySelector(idPageBody);\n pageBody.innerHTML = contentNew;\n }\n static getHashPageCurrent() {\n const hashPageCurrent = document.body.dataset.page;\n return hashPageCurrent;\n }\n static updateAndCheckIsElementDirty(element) {\n element.setAttribute(attrValueCurrent, DOM.getElementValueCurrent(element));\n return DOM.isElementDirty(element);\n }\n static isElementDirty(element) {\n let isDirty = element.getAttribute(attrValuePrevious) != element.getAttribute(attrValueCurrent);\n DOM.handleDirtyElement(element, isDirty);\n return isDirty;\n }\n static handleDirtyElement(element, isDirty) {\n DOM.toggleElementHasClassnameFlag(element, isDirty, flagDirty);\n }\n static toggleElementHasClassnameFlag(element, elementHasFlag, flag) {\n let elementAlreadyHasFlag = element.classList.contains(flag);\n if (elementHasFlag == elementAlreadyHasFlag) return;\n if (elementHasFlag) {\n element.classList.add(flag);\n } else {\n element.classList.remove(flag);\n }\n }\n static hasDirtyChildrenContainer(container) {\n if (container == null) return false;\n return container.querySelector('.' + flagDirty) != null;\n }\n static hasDirtyChildrenNotDeletedContainer(container) {\n if (container == null || container.classList.contains(flagDelete)) return false;\n return container.querySelector('.' + flagDirty + ':not(.' + flagDelete + ', .' + flagDelete + ' *)') != null;\n }\n static getElementValueCurrent(element) {\n let returnVal = '';\n \n if (!Validation.isEmpty(element)) {\n \n let tagName = element.tagName.toUpperCase();\n if (element.type === \"checkbox\") {\n returnVal = element.checked;\n }\n /*\n else if (element.classList.contains(flagIsDatePicker)) {\n returnVal = getDatePickerDate(element, adjust4DayLightSavings);\n }\n */\n else if (tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT') {\n returnVal = element.value;\n }\n else if (element.classList.contains(flagButton) && element.classList.contains(flagActive)) { // tagName === 'BUTTON'\n returnVal = element.classList.contains(flagDelete);\n }\n else if (tagName === 'TD') {\n returnVal = DOM.getElementAttributeValueCurrent(element);\n }\n else if (tagName == 'SVG' && element.classList.contains(flagCheckbox)) {\n returnVal = (element.classList.contains(flagIsChecked))\n }\n else {\n returnVal = element.textContent;\n }\n }\n \n if (Validation.isEmpty(returnVal)) returnVal = '';\n \n return returnVal;\n }\n static getElementAttributeValueCurrent(element) {\n // debugger;\n if (Validation.isEmpty(element)) return null;\n return element.getAttribute(attrValueCurrent);\n }\n static getElementAttributeValuePrevious(element) {\n if (Validation.isEmpty(element)) return null;\n return element.getAttribute(attrValuePrevious);\n }\n /* base_table.handleChangeElementCellTable\n static updateAndCheckIsTableElementDirty(element) {\n let wasDirty = DOM.isElementDirty(element);\n let row = DOM.getRowFromElement(element);\n let wasDirtyRow = DOM.hasDirtyChildrenNotDeletedContainer(row);\n let isDirty = DOM.updateAndCheckIsElementDirty(element);\n let cell = DOM.getCellFromElement(element);\n Utils.consoleLogIfNotProductionEnvironment({element, row, cell, isDirty, wasDirty});\n if (isDirty != wasDirty) {\n DOM.handleDirtyElement(cell, isDirty);\n let isDirtyRow = DOM.hasDirtyChildrenNotDeletedContainer(row);\n Utils.consoleLogIfNotProductionEnvironment({isDirtyRow, wasDirtyRow});\n if (isDirtyRow != wasDirtyRow) {\n DOM.handleDirtyElement(row, isDirtyRow);\n }\n }\n }\n */\n static scrollToElement(parent, element) {\n // REQUIRED: parent has scroll-bar\n parent.scrollTop(parent.scrollTop() + (element.offset().top - parent.offset().top));\n }\n static isElementInContainer(container, element) {\n\n if (typeof jQuery === 'function') {\n if (container instanceof jQuery) container = container[0];\n if (element instanceof jQuery) element = element[0];\n }\n\n var containerBounds = container.getBoundingClientRect();\n var elementBounds = element.getBoundingClientRect();\n\n return (\n containerBounds.top <= elementBounds.top &&\n containerBounds.left <= elementBounds.left &&\n ((elementBounds.top + elementBounds.height) <= (containerBounds.top + containerBounds.height)) &&\n ((elementBounds.left + elementBounds.width) <= (containerBounds.left + containerBounds.width))\n );\n }\n static alertError(errorType, errorText) {\n alert(errorType + '\\n' + errorText);\n }\n static createOptionUnselectedProductVariation() {\n return {\n [flagProductVariationType]: {\n [flagNameAttrOptionText]: [flagName],\n [flagNameAttrOptionValue]: [attrIdProductVariationType],\n [flagName]: 'Select Variation Type',\n [attrIdProductVariationType]: 0,\n },\n [flagProductVariation]: {\n [flagNameAttrOptionText]: [flagName],\n [flagNameAttrOptionValue]: [attrIdProductVariation],\n [flagName]: 'Select Variation',\n [attrIdProductVariation]: 0,\n },\n };\n }\n static createOption(optionJson) {\n if (Validation.isEmpty(optionJson)) optionJson = {\n text: 'Select',\n value: 0,\n };\n let option = document.createElement('option');\n option.value = optionJson.value;\n option.textContent = optionJson.text;\n option.selected = optionJson.selected;\n return option;\n }\n\n static escapeHtml(text) {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n static unescapeHtml(html) {\n const div = document.createElement('div');\n div.innerHTML = html;\n return div.textContent || div.innerText || '';\n }\n}\n","\nexport default class Events {\n static initialiseEventHandler(selectorElement, classInitialised, eventHandler) {\n document.querySelectorAll(selectorElement).forEach(function(element) {\n if (element.classList.contains(classInitialised)) return;\n eventHandler(element);\n element.classList.add(classInitialised);\n });\n }\n static hookupEventHandler(eventType, selector, callback) {\n Events.initialiseEventHandler(selector, flagInitialised, (element) => {\n element.addEventListener(eventType, (event) => {\n event.stopPropagation();\n callback(event, element);\n });\n });\n }\n}","\nimport Validation from \"./validation.js\";\n\nexport default class LocalStorage {\n/*\nfunction getPageLocalStorage(pageHash) {\n\n let ls;\n try {\n ls = JSON.parse(localStorage.getItem(pageHash));\n } catch {\n\n }\n\n if (Validation.isEmpty(ls)) return {}\n\n return ls;\n}\nfunction getPageLocalStorageCurrent() {\n\n return JSON.parse(localStorage.getItem(hashPageCurrent));\n}\n\nfunction setPageLocalStorage(pageHash, newLS) {\n\n localStorage.setItem(pageHash, JSON.stringify(newLS));\n}\n\nfunction clearPageLocalStorage(pageHash) {\n localStorage.removeItem(pageHash);\n}\n\nfunction setupPageLocalStorage(pageHash) {\n\n let ls = getPageLocalStorage(pageHash);\n\n if (Validation.isEmpty(ls)) ls = {};\n\n setPageLocalStorage(pageHash, ls);\n}\n*/\n\n static getLocalStorage(key) {\n return JSON.parse(localStorage.getItem(key));\n }\n\n static setLocalStorage(key, newLS) {\n localStorage.setItem(key, JSON.stringify(newLS));\n }\n\n/*\nfunction setupPageLocalStorageNext(pageHashNext) {\n let lsOld = getPageLocalStorage(hashPageCurrent);\n hashPageCurrent = pageHashNext;\n clearPageLocalStorage(hashPageCurrent);\n setupPageLocalStorage(hashPageCurrent);\n let lsNew = getPageLocalStorage(hashPageCurrent);\n lsNew[keyBasket] = (keyBasket in lsOld) ? lsOld[keyBasket] : {'items': []};\n setPageLocalStorage(hashPageCurrent, lsNew);\n}\n*/\n}","import DOM from './dom.js';\n\nexport default class API {\n \n static getCsrfToken() {\n return document.querySelector(idCSRFToken).getAttribute('content');\n }\n \n static async request(hashEndpoint, method = 'GET', data = null, params = null) {\n const url = API.getUrlFromHash(hashEndpoint, params);\n const csrfToken = API.getCsrfToken();\n const options = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n [flagCsrfToken]: csrfToken,\n }\n };\n\n if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {\n data = { \n ...data, \n [flagCsrfToken]: csrfToken,\n };\n options.body = JSON.stringify(data);\n }\n\n try {\n const response = await fetch(url, options);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return await response.json();\n } catch (error) {\n console.error('API request failed:', error);\n throw error;\n }\n }\n \n static getUrlFromHash(hash, params = null) {\n if (hash == null) hash = hashPageHome;\n let url = API.parameteriseUrl(_pathHost + hash, params);\n return url;\n }\n static parameteriseUrl(url, params) {\n if (params) {\n url += '?' + new URLSearchParams(params).toString();\n }\n return url;\n }\n static goToUrl(url) {\n window.location.href = url;\n }\n static goToHash(hash, params = null) {\n const url = API.getUrlFromHash(hash, params);\n API.goToUrl(url);\n }\n\n // specific api calls\n /* Example:\n getUsers: () => request('/users'),\n getUserById: (id) => request(`/users/${id}`),\n createUser: (userData) => request('/users', 'POST', userData),\n updateUser: (id, userData) => request(`/users/${id}`, 'PUT', userData),\n deleteUser: (id) => request(`/users/${id}`, 'DELETE'),\n */\n static async loginUser() {\n let callback = {};\n callback[flagCallback] = DOM.getHashPageCurrent();\n return await API.request(hashPageUserLogin, 'POST', callback);\n }\n\n // dog\n // Command categories\n static async saveCommandCategories(commandCategories, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagCommandCategory] = commandCategories;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogCommandCategory, 'POST', dataRequest);\n }\n \n // Commands\n static async saveCommands(commands, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagCommand] = commands;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogCommand, 'POST', dataRequest);\n }\n \n // Dog Command Links\n static async saveDogCommandLinks(dogCommandLinks, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagDogCommandLink] = dogCommandLinks;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogDogCommandLink, 'POST', dataRequest);\n }\n \n // Locations\n static async saveLocations(locations, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagLocation] = locations;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogLocation, 'POST', dataRequest);\n }\n \n // Button Icons\n static async saveButtonIcons(buttonIcons, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagButtonIcon] = buttonIcons;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogButtonIcon, 'POST', dataRequest);\n }\n \n // Command Button Links\n static async saveCommandButtonLinks(links, formFilters, comment) {\n let dataRequest = {};\n dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n dataRequest[flagCommandButtonLink] = links;\n dataRequest[flagComment] = comment;\n return await API.request(hashSaveDogCommandButtonLink, 'POST', dataRequest);\n }\n \n}\n","// Utility functions\n/*\nfunction $(selector) {\n return document.querySelector(selector);\n}\n\nfunction $$(selector) {\n return document.querySelectorAll(selector);\n}\n*/\nexport default class Utils {\n static getListFromDict(dict) {\n let list = [];\n for (let key in dict) {\n list.push(dict[key]);\n }\n return list;\n }\n static consoleLogIfNotProductionEnvironment(message) {\n if (environment.is_production != \"true\") {\n console.log(message);\n }\n }\n}","\nimport Events from \"../../../lib/events.js\";\n\nexport default class OverlayConfirm {\n static hookup(callbackSuccess) {\n Events.initialiseEventHandler(idOverlayConfirm + ' button.' + flagCancel, flagInitialised, (buttonCancel) => {\n buttonCancel.addEventListener('click', () => {\n let overlay = document.querySelector(idOverlayConfirm);\n overlay.style.visibility = 'hidden';\n });\n });\n Events.initialiseEventHandler(idOverlayConfirm + ' button.' + flagSubmit, flagInitialised, (buttonConfirm) => {\n buttonConfirm.addEventListener('click', () => {\n let overlay = document.querySelector(idOverlayConfirm);\n let textarea = overlay.querySelector('textarea');\n overlay.style.visibility = 'hidden';\n callbackSuccess(textarea.value);\n });\n });\n }\n static show() {\n let overlay = document.querySelector(idOverlayConfirm);\n overlay.classList.remove(flagIsCollapsed);\n overlay.style.visibility = 'visible';\n }\n}","\nimport BusinessObjects from \"../lib/business_objects/business_objects.js\";\nimport Events from \"../lib/events.js\";\nimport LocalStorage from \"../lib/local_storage.js\";\nimport API from \"../api.js\";\nimport DOM from \"../dom.js\";\nimport Utils from \"../lib/utils.js\";\n\nimport OverlayConfirm from \"../components/common/temporary/overlay_confirm.js\";\nimport OverlayError from \"../components/common/temporary/overlay_error.js\";\n\nexport default class BasePage {\n constructor(router) {\n if (!router) {\n throw new Error(\"Router is required\");\n }\n else {\n Utils.consoleLogIfNotProductionEnvironment(\"initialising with router: \", router);\n }\n this.router = router;\n this.title = titlePageCurrent;\n if (this.constructor === BasePage) {\n throw new Error(\"Cannot instantiate abstract class\");\n }\n \n if (!this.constructor.hash) {\n throw new Error(`Class ${this.constructor.name} must have a static hash attribute.`);\n }\n }\n\n initialize() {\n throw new Error(\"Method 'initialize()' must be implemented.\");\n }\n\n sharedInitialize() {\n this.logInitialisation();\n this.hookupCommonElements();\n }\n\n logInitialisation() {\n Utils.consoleLogIfNotProductionEnvironment('Initializing ' + this.title + ' page');\n }\n \n hookupCommonElements() {\n // hookupVideos();\n this.hookupLogos();\n this.hookupNavigation();\n this.hookupOverlays();\n }\n \n hookupNavigation() {\n Events.hookupEventHandler(\"click\", idButtonHamburger, (event, element) => {\n let overlayHamburger = document.querySelector(idOverlayHamburger);\n if (overlayHamburger.classList.contains(flagIsCollapsed)) {\n overlayHamburger.classList.remove(flagIsCollapsed);\n overlayHamburger.classList.add(flagExpanded);\n } else {\n overlayHamburger.classList.remove(flagExpanded);\n overlayHamburger.classList.add(flagIsCollapsed);\n }\n });\n\n this.hookupButtonsNavHome();\n // this.hookupButtonsNavAdminHome();\n this.hookupButtonsNavUserAccount();\n this.hookupButtonsNavUserLogout();\n this.hookupButtonsNavUserLogin();\n\n // this.hookupButtonsNavStoreHome();\n // this.hookupButtonsNavStoreManufacturingPurchaseOrders();\n this.hookupButtonsNavDogHome();\n this.hookupButtonsNavDogCommandCategories();\n this.hookupButtonsNavDogCommands();\n this.hookupButtonsNavDogDogCommandLinks();\n this.hookupButtonsNavDogDogs();\n this.hookupButtonsNavDogLocations();\n this.hookupButtonsNavDogButtonIcons();\n this.hookupButtonsNavDogCommandButtonLinks();\n this.hookupButtonsNavDogAssessments();\n }\n hookupEventHandler(eventType, selector, callback) {\n Events.initialiseEventHandler(selector, flagInitialised, (element) => {\n element.addEventListener(eventType, (event) => {\n event.stopPropagation();\n callback(event, element);\n });\n });\n }\n hookupButtonsNavHome() {\n this.hookupButtonsNav('.' + flagNavHome, hashPageHome);\n }\n hookupButtonsNav(buttonSelector, hashPageNav) {\n Events.hookupEventHandler(\"click\", buttonSelector, (event, button) => { \n this.router.navigateToHash(hashPageNav); \n });\n }\n /*\n hookupButtonsNavAdminHome() {\n this.hookupButtonsNav('.' + flagNavAdminHome, hashPageAdminHome);\n }\n hookupButtonsNavServices() {\n this.hookupButtonsNav('.' + flagNavServices, hashPageServices);\n }\n */\n hookupButtonsNavUserAccount() {\n this.hookupButtonsNav('.' + flagNavUserAccount, hashPageUserAccount);\n }\n hookupButtonsNavUserLogout() {\n this.hookupButtonsNav('.' + flagNavUserLogout, hashPageUserLogout);\n }\n hookupButtonsNavUserLogin() {\n Events.hookupEventHandler(\"click\", '.' + flagNavUserLogin, (event, navigator) => { \n event.stopPropagation();\n this.leave();\n API.loginUser()\n .then((response) => {\n if (response.Success) {\n window.location.href = response[flagCallback];\n } else {\n DOM.alertError(\"Error\", response.Message);\n }\n });\n });\n }\n hookupButtonsNavDogHome() {\n this.hookupButtonsNav('.' + flagNavDogHome, hashPageDogHome);\n }\n hookupButtonsNavDogCommandCategories() {\n this.hookupButtonsNav('.' + flagNavDogCommandCategories, hashPageDogCommandCategories);\n }\n hookupButtonsNavDogCommands() {\n this.hookupButtonsNav('.' + flagNavDogCommands, hashPageDogCommands);\n }\n hookupButtonsNavDogDogCommandLinks() {\n this.hookupButtonsNav('.' + flagNavDogDogCommandLinks, hashPageDogDogCommandLinks);\n }\n hookupButtonsNavDogDogs() {\n this.hookupButtonsNav('.' + flagNavDogDogs, hashPageDogDogs);\n }\n hookupButtonsNavDogLocations() {\n this.hookupButtonsNav('.' + flagNavDogLocations, hashPageDogLocations);\n }\n hookupButtonsNavDogButtonIcons() {\n this.hookupButtonsNav('.' + flagNavDogButtonIcons, hashPageDogButtonIcons);\n }\n hookupButtonsNavDogCommandButtonLinks() {\n this.hookupButtonsNav('.' + flagNavDogCommandButtonLinks, hashPageDogCommandButtonLinks);\n }\n hookupButtonsNavDogAssessments() {\n this.hookupButtonsNav('.' + flagNavDogAssessments, hashPageDogAssessments);\n }\n\n hookupLogos() {\n Events.hookupEventHandler(\"click\", \".\" + flagImageLogo + \",\" + \".\" + flagLogo, (event, element) => {\n Utils.consoleLogIfNotProductionEnvironment('clicking logo');\n this.router.navigateToHash(hashPageHome);\n });\n }\n\n hookupOverlays() {\n this.hookupOverlayFromId(idOverlayConfirm);\n this.hookupOverlayFromId(idOverlayError);\n }\n\n hookupOverlayFromId(idOverlay) {\n Events.initialiseEventHandler(idOverlay, flagInitialised, (overlay) => {\n overlay.querySelector('button.' + flagCancel).addEventListener(\"click\", (event) => {\n event.stopPropagation();\n overlay.style.display = 'none';\n });\n });\n }\n\n hookupButtonSave() {\n Events.initialiseEventHandler('form.' + flagFilter + ' button.' + flagSave, flagInitialised, (button) => {\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n button = event.target;\n if (button.classList.contains(flagIsCollapsed)) return;\n Utils.consoleLogIfNotProductionEnvironment('saving page: ', this.title);\n OverlayConfirm.show();\n });\n });\n }\n\n leave() {\n Utils.consoleLogIfNotProductionEnvironment('Leaving ' + this.title + ' page');\n if (this.constructor === BasePage) {\n throw new Error(\"Must implement leave() method.\");\n }\n }\n setLocalStoragePage(dataPage) {\n LocalStorage.setLocalStorage(this.hash, dataPage);\n }\n getLocalStoragePage() {\n return LocalStorage.getLocalStorage(this.hash);\n }\n\n toggleShowButtonsSaveCancel(show, buttonContainerSelector = '.' + flagContainer + '.' + flagSave + '.' + flagCancel) { // , buttonSave = null, buttonCancel = null\n let buttonSave = document.querySelector(buttonContainerSelector + ' button.' + flagSave);\n let buttonCancel = document.querySelector(buttonContainerSelector + ' button.' + flagCancel);\n if (show) {\n buttonCancel.classList.remove(flagIsCollapsed);\n buttonSave.classList.remove(flagIsCollapsed);\n Utils.consoleLogIfNotProductionEnvironment('showing buttons');\n } else {\n buttonCancel.classList.add(flagIsCollapsed);\n buttonSave.classList.add(flagIsCollapsed);\n Utils.consoleLogIfNotProductionEnvironment('hiding buttons');\n }\n }\n\n static isDirtyFilter(filter) {\n let isDirty = DOM.updateAndCheckIsElementDirty(filter);\n if (isDirty) document.querySelectorAll(idTableMain + ' tbody tr').remove();\n return isDirty;\n }\n\n}","\n// internal\nimport BasePage from \"../base.js\";\n// external\n\n\nexport default class PageHome extends BasePage {\n static hash = hashPageHome;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n // this.hookupButtonsNav();\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport BasePage from \"../base.js\";\n\nexport default class PageDogHome extends BasePage {\n static hash = hashPageDogHome;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n this.hookupDogHome();\n }\n hookupDogHome() {\n \n }\n\n leave() {\n super.leave();\n }\n}\n","\nimport Utils from '../utils.js';\n\nexport default class BusinessObjects {\n static getOptionJsonFromObjectJsonAndKeys(objectJson, keyText, keyValue, valueSelected = null) {\n return {\n text: objectJson[keyText],\n value: objectJson[keyValue],\n selected: (objectJson[keyValue] == valueSelected),\n };\n }\n static getOptionJsonFromObjectJson(objectJson, valueSelected = null) {\n let keyText = objectJson[flagNameAttrOptionText];\n let keyValue = objectJson[flagNameAttrOptionValue];\n // Utils.consoleLogIfNotProductionEnvironment({objectJson, keyText, keyValue});\n return BusinessObjects.getOptionJsonFromObjectJsonAndKeys(objectJson, keyText, keyValue, valueSelected);\n }\n static getObjectText(objectJson) {\n return objectJson == null ? '' : objectJson[objectJson[flagNameAttrOptionText]];\n }\n static getListObjectsFromIdDictAndCsv(idDict, idCsv) {\n let listObjects = [];\n let ids = idCsv.split(',');\n for (let id of ids) {\n listObjects.push(idDict[id]);\n }\n return listObjects;\n }\n}","\nimport Events from \"../../../lib/events.js\";\n\nexport default class OverlayError {\n static hookup() {\n Events.initialiseEventHandler(idOverlayError + ' button.' + flagCancel, flagInitialised, (buttonCancel) => {\n buttonCancel.addEventListener('click', () => {\n let overlay = document.querySelector(idOverlayError);\n overlay.style.visibility = 'hidden';\n });\n });\n }\n static show(msgError) {\n let overlay = document.querySelector(idOverlayError);\n let labelError = overlay.querySelector(idLabelError);\n labelError.innerText = msgError;\n overlay.style.visibility = 'visible';\n }\n}","\nimport BusinessObjects from \"../lib/business_objects/business_objects.js\";\nimport Events from \"../lib/events.js\";\nimport LocalStorage from \"../lib/local_storage.js\";\nimport Validation from \"../lib/validation.js\";\nimport BasePage from \"./base.js\";\nimport API from \"../api.js\";\nimport DOM from \"../dom.js\";\nimport Utils from \"../lib/utils.js\";\n\nimport OverlayConfirm from \"../components/common/temporary/overlay_confirm.js\";\nimport OverlayError from \"../components/common/temporary/overlay_error.js\";\n\nexport default class TableBasePage extends BasePage {\n // static hash\n // static attrIdRowObject\n // callSaveTableContent\n\n constructor(router) {\n super(router);\n this.cursorYInitial = null;\n this.rowInitial = null;\n this.placeholder = null;\n this.dragSrcEl = null;\n this.dragSrcRow = null;\n\n this.hookupTableCellDdls = this.hookupTableCellDdls.bind(this);\n }\n \n initialize(isPopState = false) {\n throw new Error(\"Must implement initialize() method.\");\n }\n sharedInitialize(isPopState = false, isSinglePageApp = false) {\n if (!isPopState) {\n super.sharedInitialize();\n this.hookupFilters();\n this.hookupButtonsSaveCancel();\n this.hookupTableMain();\n OverlayConfirm.hookup(() => {\n if (isSinglePageApp) {\n this.saveRecordsTableDirtySinglePageApp();\n }\n else {\n this.saveRecordsTableDirty();\n }\n });\n } else {\n let dataPage = this.getLocalStoragePage();\n let filters = dataPage[flagFormFilters];\n let formFilters = TableBasePage.getFormFilters();\n let filtersDefault = DOM.convertForm2JSON(formFilters);\n if (!Validation.areEqualDicts(filters, filtersDefault)) {\n this.callFilterTableContent();\n }\n }\n }\n hookupFilters() {\n if (this.constructor === TableBasePage) {\n throw new Error(\"Subclass of TableBasePage must implement method hookupFilters().\");\n }\n }\n sharedHookupFilters() {\n this.hookupButtonApplyFilters();\n this.hookupSearchTextFilter();\n }\n hookupFilterActive() {\n let filterSelector = idFormFilters + ' #' + flagActiveOnly;\n let filterActiveOld = document.querySelector(filterSelector);\n filterActiveOld.removeAttribute('id');\n let parentDiv = filterActiveOld.parentElement;\n let isChecked = (DOM.getElementAttributeValuePrevious(parentDiv) == \"True\");\n let filterActiveNew = document.querySelector(idFormFilters + ' div.' + flagActiveOnly + '.' + flagContainerInput + ' svg.' + flagActiveOnly);\n filterActiveNew.setAttribute('id', flagActiveOnly);\n if (isChecked) filterActiveNew.classList.add(flagIsChecked);\n\n Events.hookupEventHandler(\"click\", filterSelector, (event, filterActive) => {\n Utils.consoleLogIfNotProductionEnvironment({ filterActive });\n Utils.consoleLogIfNotProductionEnvironment({ [filterActive.tagName]: filterActive.tagName });\n let svgElement = (filterActive.tagName.toUpperCase() == 'SVG') ? filterActive : filterActive.parentElement;\n let wasChecked = svgElement.classList.contains(flagIsChecked);\n if (wasChecked) {\n svgElement.classList.remove(flagIsChecked);\n }\n else {\n svgElement.classList.add(flagIsChecked);\n }\n return this.handleChangeFilter(event, filterActive);\n });\n let filter = document.querySelector(filterSelector);\n let filterValuePrevious = DOM.getElementValueCurrent(filter);\n filter.setAttribute(attrValueCurrent, filterValuePrevious);\n filter.setAttribute(attrValuePrevious, filterValuePrevious);\n }\n hookupFilter(filterFlag, handler = (event, filter) => { return this.handleChangeFilter(event, filter); }) {\n let filterSelector = idFormFilters + ' #' + filterFlag;\n Events.hookupEventHandler(\"change\", filterSelector, handler);\n let filter = document.querySelector(filterSelector);\n let filterValuePrevious = DOM.getElementValueCurrent(filter);\n filter.setAttribute(attrValueCurrent, filterValuePrevious);\n filter.setAttribute(attrValuePrevious, filterValuePrevious);\n }\n handleChangeFilter(event, filter) {\n let isDirtyFilter = DOM.updateAndCheckIsElementDirty(filter);\n let formFilters = TableBasePage.getFormFilters();\n let areDirtyFilters = isDirtyFilter || DOM.hasDirtyChildrenContainer(formFilters);\n let tbody = document.querySelector(idTableMain + ' tbody');\n let rows = tbody.querySelectorAll(':scope > tr');\n rows.forEach((row) => {\n if (areDirtyFilters && !row.classList.contains(flagIsCollapsed)) row.classList.add(flagIsCollapsed);\n if (!areDirtyFilters && row.classList.contains(flagIsCollapsed)) {\n row.classList.remove(flagIsCollapsed);\n let dirtyInputs = row.querySelectorAll('input.' + flagDirty);\n dirtyInputs.forEach((dirtyInput) => {\n dirtyInput.value = DOM.getElementAttributeValueCurrent(dirtyInput);\n });\n }\n });\n if (areDirtyFilters) {\n /*\n tbody.querySelectorAll('tr').forEach((tr) => { \n if (!DOM.hasDirtyChildrenContainer(tr)) tr.remove(); \n });\n */\n tbody.innerHTML = '
Press \"Apply Filters\" to refresh the table.
' + tbody.innerHTML;\n if (!tbody.classList.contains(flagIsCollapsed)) tbody.classList.add(flagIsCollapsed);\n }\n else {\n let isDirtyLabel = tbody.querySelector(\":scope > div\");\n if (isDirtyLabel != null) isDirtyLabel.remove();\n if (tbody.classList.contains(flagIsCollapsed)) tbody.classList.remove(flagIsCollapsed);\n let initialisedElements = tbody.querySelectorAll('.' + flagInitialised);\n initialisedElements.forEach((initialisedElement) => {\n initialisedElement.classList.remove(flagInitialised);\n });\n this.hookupTableMain();\n }\n this.updateAndToggleShowButtonsSaveCancel();\n }\n hookupFilterIsNotEmpty() {\n this.hookupFilter(flagIsNotEmpty);\n }\n hookupButtonApplyFilters() {\n Events.hookupEventHandler(\"click\", idButtonApplyFilters, (event, button) => {\n event.stopPropagation();\n this.callFilterTableContent();\n });\n }\n hookupSearchTextFilter() {\n this.hookupFilter(flagSearch);\n }\n hookupFilterDog() {\n this.hookupFilter(attrIdDog); \n }\n hookupFilterCommandCategory() {\n this.hookupFilter(attrIdCommandCategory, (event, filterCommandCategory) => {\n this.handleChangeFilter();\n let isDirtyFilter = filterCommandCategory.classList.contains(flagDirty);\n let idCommandCategory = DOM.getElementValueCurrent(filterCommandCategory);\n console.log(\"filter commands unsorted\");\n console.log(Utils.getListFromDict(filterCommands));\n let commandsInCategory = Utils.getListFromDict(filterCommands).filter(command => command[attrIdCommandCategory] == idCommandCategory);\n let sortedCommands = commandsInCategory.sort((a, b) => a[flagName].localeCompare(b[flagName]));\n let filterCommand = document.querySelector(idFormFilters + ' .' + flagCommand);\n let idCommandPrevious = DOM.getElementAttributeValuePrevious(filterCommand);\n filterCommand.innerHTML = '';\n let optionJson, option;\n option = DOM.createOption(null);\n filterCommand.appendChild(option);\n sortedCommands.forEach((command) => {\n optionJson = BusinessObjects.getOptionJsonFromObjectJson(command, idCommandPrevious);\n option = DOM.createOption(optionJson);\n filterCommand.appendChild(option);\n });\n filterCommand.dispatchEvent(new Event('change'));\n return isDirtyFilter;\n });\n }\n hookupFilterCommand() {\n this.hookupFilter(attrIdCommand);\n }\n hookupFilterLocation() {\n this.hookupFilter(attrIdLocation);\n }\n /*\n getAndLoadFilteredTableContent = () => {\n this.callFilterTableContent()\n .catch(error => console.error('Error:', error));\n }\n */\n static getFormFilters() {\n return document.querySelector(idFormFilters);\n }\n callFilterTableContent() {\n let formFilters = TableBasePage.getFormFilters();\n let filtersJson = DOM.convertForm2JSON(formFilters);\n Utils.consoleLogIfNotProductionEnvironment(\"callFilterTableContent\");\n Utils.consoleLogIfNotProductionEnvironment(\"formFilters\");\n Utils.consoleLogIfNotProductionEnvironment(formFilters);\n Utils.consoleLogIfNotProductionEnvironment(\"filtersJson\");\n Utils.consoleLogIfNotProductionEnvironment(filtersJson);\n this.leave();\n API.goToHash(this.constructor.hash, filtersJson);\n }\n callbackLoadTableContent(response) {\n let table = TableBasePage.getTableMain();\n let bodyTable = table.querySelector('tbody');\n bodyTable.querySelectorAll('tr').forEach(function(row) { row.remove(); });\n let rowsJson = response.data[flagRows];\n if (!Validation.isEmpty(rowsJson) && rowsJson.every(row => row.hasOwnProperty('display_order'))) {\n rowsJson = rowsJson.sort((a, b) => a.display_order - b.display_order);\n }\n rowsJson.forEach(this.loadRowTable.bind(this));\n this.hookupTableMain();\n }\n static getTableMain() {\n return document.querySelector(idTableMain);\n }\n loadRowTable(rowJson) {\n throw new Error(\"Subclass of TableBasePage must implement method loadRowTable().\");\n }\n getAndLoadFilteredTableContentSinglePageApp() {\n this.callFilterTableContent()\n .then(data => {\n Utils.consoleLogIfNotProductionEnvironment('Table data received:', data);\n this.callbackLoadTableContent(data);\n })\n .catch(error => console.error('Error:', error));\n }\n hookupButtonsSaveCancel() {\n this.hookupButtonSave();\n this.hookupButtonCancel();\n this.toggleShowButtonsSaveCancel(false);\n }\n saveRecordsTableDirty() {\n let records = this.getTableRecords(true);\n if (records.length == 0) {\n OverlayError.show('No records to save');\n return;\n }\n let formElement = TableBasePage.getFormFilters();\n let comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm));\n /*\n Utils.consoleLogIfNotProductionEnvironment({ formElement, comment, records });\n Utils.consoleLogIfNotProductionEnvironment('records');\n Utils.consoleLogIfNotProductionEnvironment(records);\n debugger;\n */\n this.callSaveTableContent(records, formElement, comment)\n .then(data => {\n if (data[flagStatus] == flagSuccess) {\n if (_verbose) { \n Utils.consoleLogIfNotProductionEnvironment('Records saved!');\n Utils.consoleLogIfNotProductionEnvironment('Data received:', data);\n }\n this.callFilterTableContent();\n }\n else {\n Utils.consoleLogIfNotProductionEnvironment(\"error: \", data[flagMessage]);\n OverlayError.show(data[flagMessage]);\n }\n })\n .catch(error => console.error('Error:', error));\n }\n getTableRecords(dirtyOnly = false) {\n let records = [];\n let record;\n document.querySelectorAll(idTableMain + ' > tbody > tr').forEach((row) => {\n if (dirtyOnly && !DOM.hasDirtyChildrenContainer(row)) return;\n record = this.getJsonRow(row);\n records.push(record);\n });\n return records;\n }\n getJsonRow(row) {\n throw new Error(\"Subclass of TableBasePage must implement method getJsonRow().\");\n }\n saveRecordsTableDirtySinglePageApp() {\n let records = this.getTableRecords(true);\n if (records.length == 0) {\n OverlayError.show('No records to save');\n return;\n }\n let formElement = TableBasePage.getFormFilters();\n let comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm));\n this.callSaveTableContent(records, formElement, comment)\n .then(data => {\n if (data[flagStatus] == flagSuccess) {\n if (_verbose) { \n Utils.consoleLogIfNotProductionEnvironment('Records saved!');\n Utils.consoleLogIfNotProductionEnvironment('Data received:', data);\n }\n this.callbackLoadTableContent(data);\n }\n else {\n Utils.consoleLogIfNotProductionEnvironment(\"error: \", data[flagMessage]);\n OverlayError.show(data[flagMessage]);\n }\n })\n .catch(error => console.error('Error:', error));\n }\n hookupButtonCancel() {\n Events.initialiseEventHandler(idFormFilters + ' button.' + flagCancel, flagInitialised, (button) => {\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n button = event.target;\n if (button.classList.contains(flagIsCollapsed)) return;\n this.callFilterTableContent();\n });\n button.classList.add(flagIsCollapsed);\n });\n }\n handleClickAddRowTable(event, button) {\n event.stopPropagation();\n _rowBlank.setAttribute(this.constructor.attrIdRowObject, -1 - _rowBlank.getAttribute(this.constructor.attrIdRowObject));\n let tbody = document.querySelector(idTableMain + ' tbody');\n if (tbody.classList.contains(flagIsCollapsed)) return;\n let row = _rowBlank.cloneNode(true);\n row.classList.remove(flagInitialised);\n row.querySelectorAll('.' + flagInitialised).forEach(function(element) {\n element.classList.remove(flagInitialised);\n });\n let countRows = document.querySelectorAll(idTableMain + ' > tbody > tr').length;\n row.setAttribute(this.constructor.attrIdRowObject, -1 - countRows);\n this.initialiseRowNew(tbody, row);\n tbody.prepend(row);\n tbody.scrollTop = 0;\n this.hookupTableMain();\n this.postInitialiseRowNewCallback(tbody);\n }\n initialiseRowNew(tbody, row) {\n if (this.constructor === TableBasePage) {\n throw new Error(\"Subclass of TableBasePage must implement method initialiseRowNew().\");\n }\n // row.classList.remove(flagRowNew);\n }\n hookupTableMain() {\n if (this.constructor === TableBasePage) {\n throw new Error(\"Must implement hookupTableMain() method.\");\n }\n Events.initialiseEventHandler(idTableMain, flagInitialised, (table) => {\n this.cacheRowBlank();\n });\n }\n cacheRowBlank() {\n let selectorRowNew = idTableMain + ' tbody tr.' + flagRowNew;\n let rowBlankTemp = document.querySelector(selectorRowNew);\n Utils.consoleLogIfNotProductionEnvironment(\"row blank temp: \", rowBlankTemp);\n let countRows = document.querySelectorAll(idTableMain + ' > tbody > tr').length;\n _rowBlank = rowBlankTemp.cloneNode(true);\n document.querySelectorAll(selectorRowNew).forEach(function(row) {\n row.remove();\n });\n _rowBlank.setAttribute(this.constructor.attrIdRowObject, -1 - countRows);\n }\n postInitialiseRowNewCallback(tbody) {\n if (this.constructor === TableBasePage) {\n throw new Error(\"Subclass of TableBasePage must implement method postInitialiseRowNewCallback(tbody).\");\n }\n }\n initialiseSliderDisplayOrderRowNew(tbody, row) {\n // let tdSelector = ':scope > tr > td.' + flagDisplayOrder;\n // let tbody = document.querySelector('table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody');\n let slidersDisplayOrder = tbody.querySelectorAll(':scope > tr > td.' + flagDisplayOrder + ' input.' + flagSlider);\n let maxDisplayOrder = 0;\n slidersDisplayOrder.forEach((slider) => {\n maxDisplayOrder = Math.max(maxDisplayOrder, parseFloat(DOM.getElementValueCurrent(slider)));\n });\n let sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider);\n DOM.setElementValuesCurrentAndPrevious(sliderDisplayOrder, maxDisplayOrder + 1);\n }\n hookupSlidersDisplayOrderTable() {\n let selectorDisplayOrder = idTableMain + ' tbody tr td.' + flagDisplayOrder + ' input.' + flagSlider + '.' + flagDisplayOrder;\n this.hookupChangeHandlerTableCells(selectorDisplayOrder);\n }\n hookupChangeHandlerTableCells(inputSelector, handler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n Events.initialiseEventHandler(inputSelector, flagInitialised, (input) => {\n input.addEventListener(\"change\", (event) => {\n handler(event, input);\n });\n handler(null, input);\n });\n }\n handleChangeNestedElementCellTable(event, element) {\n let wasDirtyParentRows = this.getAllIsDirtyRowsInParentTree(element);\n let wasDirtyElement = element.classList.contains(flagDirty);\n let isDirtyElement = DOM.updateAndCheckIsElementDirty(element);\n // Utils.consoleLogIfNotProductionEnvironment({isDirtyElement, wasDirtyElement, wasDirtyParentRows});\n // let td = DOM.getCellFromElement(element);\n // DOM.setElementAttributeValueCurrent(td, DOM.getElementAttributeValueCurrent(element));\n if (isDirtyElement != wasDirtyElement) {\n // DOM.handleDirtyElement(td, isDirtyElement);\n this.updateAndToggleShowButtonsSaveCancel();\n this.cascadeChangedIsDirtyNestedElementCellTable(element, isDirtyElement, wasDirtyParentRows);\n }\n }\n getAllIsDirtyRowsInParentTree(element) {\n let rows = [];\n let parent = element;\n let isDirty;\n while (parent) {\n if (parent.tagName.toUpperCase() == 'TR') {\n isDirty = parent.classList.contains(flagDirty)\n rows.push(isDirty);\n }\n parent = parent.parentElement;\n }\n return rows;\n }\n cascadeChangedIsDirtyNestedElementCellTable(element, isDirtyElement, wasDirtyParentRows) {\n if (Validation.isEmpty(wasDirtyParentRows)) return;\n let tr = DOM.getRowFromElement(element);\n let isDirtyRow = isDirtyElement || DOM.hasDirtyChildrenContainer(tr);\n let wasDirtyRow = wasDirtyParentRows.shift();\n Utils.consoleLogIfNotProductionEnvironment({isDirtyRow, wasDirtyRow});\n if (isDirtyRow != wasDirtyRow) {\n DOM.handleDirtyElement(tr, isDirtyRow);\n this.updateAndToggleShowButtonsSaveCancel();\n this.cascadeChangedIsDirtyNestedElementCellTable(tr.parentElement, isDirtyRow, wasDirtyParentRows);\n }\n }\n hookupChangeHandlerTableCellsWhenNotCollapsed(inputSelector, handler = (event, element) => {\n if (!element.classList.contains(flagIsCollapsed)) this.handleChangeNestedElementCellTable(event, element);\n }) {\n Events.hookupEventHandler(\"change\", inputSelector, handler);\n }\n hookupFieldsCodeTable() {\n this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagCode + ' > .' + flagCode);\n }\n hookupFieldsNameTable() {\n this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagName + ' > .' + flagName);\n }\n hookupFieldsDescriptionTable() {\n this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagDescription + ' > .' + flagDescription);\n }\n hookupFieldsNotesTable() {\n this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagNotes + ' > .' + flagNotes);\n }\n hookupFieldsActive(flagTable = '', handleClickRowNew = (event, element) => { this.handleClickAddRowTable(event, element); }) {\n let selectorButton = 'table.table-main' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody > tr > td.' + flagActive + ' .' + flagButton + '.' + flagActive;\n let selectorButtonDelete = selectorButton + '.' + flagDelete;\n let selectorButtonUndelete = selectorButton + ':not(.' + flagDelete + ')';\n Utils.consoleLogIfNotProductionEnvironment(\"hookupFieldsActive: \", selectorButtonDelete, selectorButtonUndelete);\n this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete);\n this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete);\n Events.hookupEventHandler(\n \"click\"\n , 'table.table-main' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > thead > tr > th.' + flagActive + ' .' + flagButton + '.' + flagActive\n , (event, button) => { handleClickRowNew(event, button); }\n );\n }\n hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n Events.hookupEventHandler(\"click\", selectorButtonDelete, (event, element) => {\n this.handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); });\n });\n }\n handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n if (element.tagName.toUpperCase() != 'SVG') element = element.parentElement;\n let valuePrevious = DOM.getElementAttributeValuePrevious(element);\n let wasDirty = element.classList.contains(flagDirty);\n let row = DOM.getRowFromElement(element);\n if (row.classList.contains(flagRowNew) && !DOM.hasDirtyChildrenContainer(row)) {\n row.parentNode.removeChild(row);\n }\n else {\n let buttonAddTemplate = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagActive + '.' + flagAdd);\n let buttonAdd = buttonAddTemplate.cloneNode(true);\n DOM.setElementAttributeValuePrevious(buttonAdd, valuePrevious);\n DOM.setElementAttributeValueCurrent(buttonAdd, false);\n if (wasDirty) buttonAdd.classList.add(flagDirty);\n element.replaceWith(buttonAdd);\n changeHandler(null, buttonAdd);\n this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); });\n }\n this.updateAndToggleShowButtonsSaveCancel();\n }\n hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n Events.hookupEventHandler(\"click\", selectorButtonUndelete, (event, element) => {\n this.handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); });\n });\n }\n handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n if (element.tagName.toUpperCase() != 'SVG') element = element.parentElement;\n let valuePrevious = DOM.getElementAttributeValuePrevious(element);\n let wasDirty = DOM.isElementDirty(element);\n let buttonDeleteTemplate = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagActive + '.' + flagDelete);\n let buttonDelete = buttonDeleteTemplate.cloneNode(true);\n DOM.setElementAttributeValuePrevious(buttonDelete, valuePrevious);\n DOM.setElementAttributeValueCurrent(buttonDelete, true);\n if (wasDirty) buttonDelete.classList.add(flagDirty);\n element.replaceWith(buttonDelete);\n changeHandler(null, buttonDelete);\n this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); });\n this.updateAndToggleShowButtonsSaveCancel();\n }\n hookupTdsAccessLevel() {\n this.hookupTableCellDdlPreviews(flagAccessLevel, Utils.getListFromDict(accessLevels));\n }\n hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector = null\n , ddlHookup = (ddlSelector) => { this.hookupTableCellDdls(ddlSelector); }\n , changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }\n ) {\n if (cellSelector == null) cellSelector = idTableMain + ' > tbody > tr > td.' + fieldFlag;\n Events.hookupEventHandler(\"click\", cellSelector + ' div.' + fieldFlag, (event, div) => {\n this.handleClickTableCellDdlPreview(\n event\n , div\n , fieldFlag\n , optionList\n , cellSelector\n , (ddlSelector) => { ddlHookup(\n ddlSelector\n , (event, element) => { changeHandler(event, element); }\n ); }\n );\n });\n ddlHookup(cellSelector + ' select.' + fieldFlag);\n }\n hookupTableCellDdls(ddlSelector, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {\n this.hookupChangeHandlerTableCells(ddlSelector, (event, element) => { changeHandler(event, element); });\n }\n handleClickTableCellDdlPreview(event, div, fieldFlag, optionObjectList, cellSelector = null, ddlHookup = (cellSelector) => { this.hookupTableCellDdls(cellSelector); }) {\n if (Validation.isEmpty(cellSelector)) cellSelector = idTableMain + ' > tbody > tr > td.' + fieldFlag;\n let idSelected = DOM.getElementAttributeValueCurrent(div);\n let td = DOM.getCellFromElement(div);\n td.innerHTML = '';\n let ddl = document.createElement('select');\n ddl.classList.add(fieldFlag);\n DOM.setElementValuesCurrentAndPrevious(ddl, idSelected);\n let optionJson, option;\n if (_verbose) { \n Utils.consoleLogIfNotProductionEnvironment(\"click table cell ddl preview\");\n Utils.consoleLogIfNotProductionEnvironment({optionObjectList, cellSelector});\n }\n option = DOM.createOption(null);\n ddl.appendChild(option);\n optionObjectList.forEach((optionObjectJson) => {\n optionJson = BusinessObjects.getOptionJsonFromObjectJson(optionObjectJson, idSelected);\n option = DOM.createOption(optionJson);\n ddl.appendChild(option);\n });\n td.appendChild(ddl);\n let ddlSelector = cellSelector + ' select.' + fieldFlag;\n ddlHookup(ddlSelector);\n }\n /*\n hookupTableCellDDlPreviewsWhenNotCollapsed(cellSelector, optionList, ddlHookup = (event, element) => { this.hookupTableCellDdls(event, element); }) {\n Events.hookupEventHandler(\"click\", cellSelector + ' div', (event, div) => {\n this.handleClickTableCellDdlPreview(event, div, optionList, cellSelector, (event, element) => { ddlHookup(event, element); });\n });\n }\n */\n toggleColumnCollapsed(flagColumn, isCollapsed) {\n this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagIsCollapsed);\n }\n toggleColumnHeaderCollapsed(flagColumn, isCollapsed) {\n this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagIsCollapsed);\n }\n\n hookupFieldsCommandCategory(idTable = null) {\n if (idTable == null) idTable = idTableMain;\n this.hookupTableCellDdlPreviews(\n flagCommandCategory\n , Utils.getListFromDict(filterCommandCategories).sort((a, b) => a[flagName].localeCompare(b[flagName]))\n , idTable + ' > tbody > tr > td.' + flagCommandCategory // + ' .' + flagCommandCategory\n , (cellSelector) => { this.hookupCommandCategoryDdls(cellSelector); }\n );\n }\n hookupCommandCategoryDdls(ddlSelector) {\n this.hookupChangeHandlerTableCells(ddlSelector, (event, element) => { this.handleChangeCommandCategoryDdl(event, element); });\n }\n handleChangeCommandCategoryDdl(event, ddlCategory) {\n let row = DOM.getRowFromElement(ddlCategory);\n let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory);\n this.handleChangeNestedElementCellTable(event, ddlCategory);\n let idCommandCategoryRowNew = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory);\n if (\n idCommandCategoryRowOld == idCommandCategoryRowNew\n || idCommandCategoryRowNew == 0\n ) return;\n console.log({ idCommandCategoryRowNew, idCommandCategoryRowOld });\n let idCommandCategoryFilter = this.getIdCommandCategoryFilter();\n let tdCommand = row.querySelector('td.' + flagCommand);\n tdCommand.dispatchEvent(new Event('click'));\n let ddlCommand = row.querySelector('td.' + flagCommand + ' select.' + flagCommand);\n ddlCommand.innerHTML = '';\n ddlCommand.appendChild(DOM.createOption(null));\n let optionJson, option;\n let commandsInCategory = Utils.getListFromDict(filterCommands).filter(command => \n (\n command[attrIdCommandCategory] == idCommandCategoryRowNew\n || idCommandCategoryRowNew == 0\n )\n && (\n command[attrIdCommandCategory] == idCommandCategoryFilter\n || idCommandCategoryFilter == 0\n )\n );\n let sortedCommands = commandsInCategory.sort((a, b) => a[flagName].localeCompare(b[flagName]));\n sortedCommands.forEach((command) => {\n optionJson = BusinessObjects.getOptionJsonFromObjectJson(command);\n option = DOM.createOption(optionJson);\n ddlCommand.appendChild(option);\n });\n this.handleChangeNestedElementCellTable(event, ddlCommand);\n }\n hookupFieldsCommand(idTable = null) {\n if (idTable == null) idTable = idTableMain;\n Events.hookupEventHandler(\"click\", idTable + ' > tbody > tr > td.' + flagCommand + ' div.' + flagCommand, (event, div) => {\n Utils.consoleLogIfNotProductionEnvironment(div);\n let parentTr = DOM.getRowFromElement(div);\n Utils.consoleLogIfNotProductionEnvironment({ div, parentTr });\n let tdCommandCategory = parentTr.querySelector('td.' + flagCommandCategory);\n let idCommandCategoryRow = this.getIdCommandCategoryRow(parentTr); // DOM.getElementAttributeValueCurrent(tdCommandCategory);\n let idCommandCategoryFilter = this.getIdCommandCategoryFilter();\n let filterCommandList = Utils.getListFromDict(filterCommands);\n let commandsInCategory = filterCommandList.filter(command => \n (\n command[attrIdCommandCategory] == idCommandCategoryRow\n || idCommandCategoryRow == 0\n )\n && (\n command[attrIdCommandCategory] == idCommandCategoryFilter\n || idCommandCategoryFilter == 0\n )\n );\n let sortedCommands = commandsInCategory.sort((a, b) => a[flagName].localeCompare(b[flagName]));\n Utils.consoleLogIfNotProductionEnvironment({ tdCommandCategory, idCommandCategoryRow, idCommandCategoryFilter, filterCommandList, commandsInCategory });\n Utils.consoleLogIfNotProductionEnvironment(filterCommandList);\n this.handleClickTableCellDdlPreview(\n event\n , div\n , flagCommand // fieldFlag\n , sortedCommands // optionList\n , idTable + ' > tbody > tr > td.' + flagCommand // cellSelector\n , (cellSelector) => { this.hookupTableCellDdls(\n cellSelector\n , (event, element) => { this.handleChangeCommandDdl(event, element); }\n ); }\n );\n });\n this.hookupTableCellDdls(\n idTable + ' > tbody > tr > td.' + flagCommand + ' select.' + flagCommand\n , (event, element) => { this.handleChangeCommandDdl(event, element); }\n );\n }\n handleChangeCommandDdl(event, ddlCommand) {\n // console.log(\"handle change command ddl\");\n let row = DOM.getRowFromElement(ddlCommand);\n this.handleChangeNestedElementCellTable(event, ddlCommand);\n let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row);\n let idCommandNew = this.getIdCommandRow(row);\n let commandNew = filterCommands[idCommandNew];\n // console.log({ idCommandCategoryRowOld, commandNew });\n if (commandNew == null || idCommandCategoryRowOld == commandNew[attrIdCommandCategory]) return;\n let divCommandCategory = row.querySelector('td.' + flagCommandCategory + ' div');\n if (divCommandCategory) divCommandCategory.dispatchEvent(new Event('click'));\n let ddlCommandCategory = row.querySelector('td.' + flagCommandCategory + ' select.' + flagCommandCategory);\n DOM.setElementValueCurrent(ddlCommandCategory, commandNew[attrIdCommandCategory]);\n // console.log({ ddlCommandCategory, commandNew });\n this.handleChangeNestedElementCellTable(event, ddlCommandCategory);\n }\n getIdCommandCategoryRow(tr) {\n let elementCommandCategory = tr.querySelector('td.' + flagCommandCategory + ' .' + flagCommandCategory);\n return DOM.getElementAttributeValueCurrent(elementCommandCategory);\n }\n getIdCommandCategoryFilter() {\n let formFilters = TableBasePage.getFormFilters();\n let idCommandCategory = 0;\n if (formFilters == null) return idCommandCategory;\n let commandCategoryFilter = formFilters.querySelector('#' + attrIdCommandCategory);\n let commandFilter = formFilters.querySelector('#' + attrIdCommand);\n let valueCurrentCommandCategoryFilter = DOM.getElementAttributeValueCurrent(commandCategoryFilter);\n Utils.consoleLogIfNotProductionEnvironment({ valueCurrentCommandCategoryFilter });\n if (valueCurrentCommandCategoryFilter == \"\") {\n let valueCurrentCommandFilter = DOM.getElementAttributeValueCurrent(commandFilter);\n Utils.consoleLogIfNotProductionEnvironment({ valueCurrentCommandFilter });\n if (valueCurrentCommandFilter != \"\") {\n let command = filterCommands[valueCurrentCommandFilter];\n idCommandCategory = command[attrIdCommandCategory];\n }\n } else {\n idCommandCategory = Number(valueCurrentCommandCategoryFilter);\n }\n return idCommandCategory;\n }\n getHasCommandCategoryFilter() {\n let idCommandCategoryFilter = this.getIdCommandCategoryFilter();\n return !(Validation.isEmpty(idCommandCategoryFilter) || idCommandCategoryFilter == 0);\n }\n getIdCommandRow(tr) {\n let elementCommand = tr.querySelector('td.' + flagCommand + ' .' + flagCommand);\n return DOM.getElementAttributeValueCurrent(elementCommand);\n }\n getIdCommandFilter() {\n let formFilters = TableBasePage.getFormFilters();\n let commandFilter = formFilters.querySelector('#' + attrIdCommand);\n let valueCurrentCommandFilter = DOM.getElementAttributeValueCurrent(commandFilter);\n let idCommand = Number(valueCurrentCommandFilter);\n return idCommand;\n }\n getHasCommandFilter() {\n let idCommandFilter = this.getIdCommandFilter();\n return !(Validation.isEmpty(idCommandFilter) || idCommandFilter == 0);\n }\n hookupFieldsDog() {\n this.hookupTableCellDdlPreviews(flagDog, Utils.getListFromDict(filterDogs));\n }\n getIdDogRow(tr) {\n let elementDog = tr.querySelector('td.' + flagDog + ' .' + flagDog);\n return DOM.getElementAttributeValueCurrent(elementDog);\n }\n /*\n createTdActive(isActive) {\n let tdActive = document.createElement(\"td\");\n tdActive.classList.add(flagActive);\n let buttonActive = document.createElement(\"button\");\n buttonActive.classList.add(flagActive);\n buttonActive.classList.add(isActive ? flagDelete : flagAdd);\n buttonActive.textContent = isActive ? 'x' : '+';\n DOM.setElementAttributesValuesCurrentAndPrevious(buttonActive, isActive);\n tdActive.appendChild(buttonActive);\n return tdActive;\n }\n */\n leave() {\n if (this.constructor === TableBasePage) {\n throw new Error(\"Must implement leave() method.\");\n }\n super.leave();\n let formFilters = TableBasePage.getFormFilters();\n let dataPage = {};\n dataPage[flagFormFilters] = DOM.convertForm2JSON(formFilters);\n this.setLocalStoragePage(dataPage);\n }\n\n toggleColumnHasClassnameFlag(columnFlag, isRequiredFlag, classnameFlag) {\n let table = TableBasePage.getTableMain();\n let columnTh = table.querySelector('th.' + columnFlag);\n let columnThHasFlag = columnTh.classList.contains(classnameFlag);\n if (isRequiredFlag == columnThHasFlag) return;\n DOM.toggleElementHasClassnameFlag(columnTh, isRequiredFlag, classnameFlag);\n }\n toggleColumnHeaderHasClassnameFlag(columnFlag, isRequiredFlag, classnameFlag) {\n let table = TableBasePage.getTableMain();\n let columnTh = table.querySelector('th.' + columnFlag);\n DOM.toggleElementHasClassnameFlag(columnTh, isRequiredFlag, classnameFlag);\n }\n\n updateAndToggleShowButtonsSaveCancel() {\n let records = this.getTableRecords(true);\n let isDirtyMainTable = records.length > 0;\n\n let formFilters = TableBasePage.getFormFilters();\n let areDirtyFilters = DOM.hasDirtyChildrenContainer(formFilters);\n\n this.toggleShowButtonsSaveCancel(isDirtyMainTable && !areDirtyFilters);\n }\n}\n","\nimport Events from \"../../lib/events.js\";\nimport LocalStorage from \"../../lib/local_storage.js\";\nimport Validation from \"../../lib/validation.js\";\n// import BasePage from \"../base.js\";\nimport DOM from \"../../dom.js\";\nimport { isEmpty } from \"../../lib/utils.js\";\nimport TableBasePage from \"../base_table.js\";\n\nexport default class DogMixinPage {\n constructor(pageCurrent) {\n this.page = pageCurrent;\n }\n\n initialize() {\n Utils.consoleLogIfNotProductionEnvironment('hookup dog start for ', this.page.hash);\n this.hookupFilters();\n this.hookupLocalStorageDog();\n }\n hookupFilters() {\n }\n hookupLocalStorageDog() {\n \n }\n\n /*\n hookupDogCardsProduct() {\n \n let d; // , lsShared;\n let selectorCardProduct = '.card.subcard';\n Events.initialiseEventHandler(selectorCardProduct, flagInitialised, function(cardProduct) {\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"initialising product card: \", cardProduct); }\n cardProduct.addEventListener(\"click\", function(event) {\n // d = { keyIdProduct: product.getAttribute(attrIdProduct) }\n var elemClicked = event.target;\n if (elemClicked.id != 'submit') { // disable for submit buttons\n if (_verbose) { \n Utils.consoleLogIfNotProductionEnvironment(\"product click: \" + cardProduct.getAttribute(attrIdProduct));\n Utils.consoleLogIfNotProductionEnvironment(\"permutation click: \" + cardProduct.getAttribute(attrIdPermutation));\n }\n var d = {}\n d[keyIdProduct] = cardProduct.getAttribute(attrIdProduct)\n d[keyIdPermutation] = cardProduct.getAttribute(attrIdPermutation)\n // send quantity requested\n goToPage(hashPageDogProduct, d);\n }\n });\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"click method added for product ID: \" + cardProduct.getAttribute(attrIdProduct) + ', permutation ID: ', cardProduct.getAttribute(attrIdPermutation)); }\n });\n }\n */\n \n leave() {}\n}\n","\nimport Events from \"../../lib/events.js\";\nimport LocalStorage from \"../../lib/local_storage.js\";\nimport Validation from \"../../lib/validation.js\";\n// import BasePage from \"../base.js\";\nimport DOM from \"../../dom.js\";\nimport { isEmpty } from \"../../lib/utils.js\";\nimport DogMixinPage from \"./mixin.js\";\nimport Utils from \"../../lib/utils.js\";\n\nexport default class DogTableMixinPage extends DogMixinPage {\n constructor(pageCurrent) {\n super(pageCurrent);\n }\n initialize() {\n super.initialize();\n this.hookupFilters();\n this.hookupTable();\n }\n hookupFilters() {\n // Implement filter-specific functionality here\n }\n hookupTable() {\n // Implement table-specific functionality here\n }\n hookupFieldsLocation() {\n this.page.hookupTableCellDdlPreviews(\n flagLocation\n , Utils.getListFromDict(filterLocations) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n}","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogCommandCategories extends TableBasePage {\n static hash = hashPageDogCommandCategories;\n static attrIdRowObject = attrIdCommandCategory;\n callSaveTableContent = API.saveCommandCategories;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterActive();\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n Utils.consoleLogIfNotProductionEnvironment({ row });\n if (row == null) return;\n let inputCode = row.querySelector('td.' + flagCode + ' .' + flagCode);\n let inputName = row.querySelector('td.' + flagName + ' .' + flagName);\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n \n console.log(\"inputCode\");\n console.log(inputCode);\n\n let jsonRow = {};\n jsonRow[attrIdCommandCategory] = row.getAttribute(attrIdCommandCategory);\n jsonRow[flagCode] = DOM.getElementAttributeValueCurrent(inputCode);\n jsonRow[flagName] = DOM.getElementAttributeValueCurrent(inputName);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n return jsonRow;\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n // let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsCodeTable();\n this.hookupFieldsNameTable();\n this.hookupFieldsActive();\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogCommands extends TableBasePage {\n static hash = hashPageDogCommands;\n static attrIdRowObject = attrIdCommand;\n callSaveTableContent = API.saveCommands;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterCommandCategory();\n this.hookupFilterActive();\n }\n hookupFilterCommandCategory() {\n this.hookupFilter(attrIdCommandCategory);\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n let inputName = row.querySelector('td.' + flagName + ' .' + flagName);\n let inputHandSignalDefaultDescription = row.querySelector('td.' + flagHandSignalDefaultDescription + ' .' + flagHandSignalDefaultDescription);\n let inputCanHaveButton = row.querySelector('td.' + flagCanHaveButton + ' .' + flagCanHaveButton);\n let inputNotes = row.querySelector('td.' + flagNotes + ' .' + flagNotes);\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n\n /*\n Utils.consoleLogIfNotProductionEnvironment({ inputName, inputHandSignalDefaultDescription, inputCanHaveButton, inputNotes, buttonActive });\n debugger;\n */\n\n let jsonRow = {};\n jsonRow[attrIdCommand] = row.getAttribute(attrIdCommand);\n jsonRow[attrIdCommandCategory] = this.getIdCommandCategoryRow(row);\n jsonRow[flagName] = DOM.getElementAttributeValueCurrent(inputName);\n jsonRow[flagHandSignalDefaultDescription] = DOM.getElementAttributeValueCurrent(inputHandSignalDefaultDescription);\n jsonRow[flagCanHaveButton] = (DOM.getElementAttributeValueCurrent(inputCanHaveButton) == \"true\");\n jsonRow[flagNotes] = DOM.getElementAttributeValueCurrent(inputNotes);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n return jsonRow;\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagDog + ' div.' + flagDog\n , ',td.' + flagCommandCategory + ' div.' + flagCommandCategory\n , ',td.' + flagCommand + ' div.' + flagCommand\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsCommandCategory();\n this.hookupFieldsNameTable();\n this.hookupTextareasHandSignalDefaultDescription();\n this.hookupFieldsCanHaveButton();\n this.hookupFieldsNotesTable();\n this.hookupFieldsActive();\n }\n hookupFieldsCommandCategory() {\n this.hookupTableCellDdlPreviews(\n flagCommandCategory\n , Utils.getListFromDict(filterCommandCategories)\n );\n }\n hookupTextareasHandSignalDefaultDescription() {\n this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagHandSignalDefaultDescription + ' .' + flagHandSignalDefaultDescription);\n }\n hookupFieldsCanHaveButton() {\n this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCanHaveButton + ' .' + flagCanHaveButton);\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogDogCommandLinks extends TableBasePage {\n static hash = hashPageDogDogCommandLinks;\n static attrIdRowObject = attrIdDogCommandLink;\n callSaveTableContent = API.saveDogCommandLinks;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterDog();\n this.hookupFilterCommandCategory();\n this.hookupFilterCommand();\n this.hookupFilterActive();\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n let inputHandSignalDescription = row.querySelector('td.' + flagHandSignalDescription + ' textarea');\n let inputNotes = row.querySelector('td.' + flagNotes + ' textarea');\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n\n let jsonRow = {};\n jsonRow[attrIdDogCommandLink] = row.getAttribute(attrIdDogCommandLink);\n jsonRow[attrIdDog] = this.getIdDogRow(row);\n jsonRow[attrIdCommand] = this.getIdCommandRow(row);\n jsonRow[flagHandSignalDescription] = DOM.getElementAttributeValueCurrent(inputHandSignalDescription);\n jsonRow[flagNotes] = DOM.getElementAttributeValueCurrent(inputNotes);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n return jsonRow;\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagDog + ' div.' + flagDog\n , ',td.' + flagCommandCategory + ' div.' + flagCommandCategory\n , ',td.' + flagCommand + ' div.' + flagCommand\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsDog();\n this.hookupFieldsCommandCategory();\n this.hookupFieldsCommand();\n this.hookupTextareasHandSignalDescription();\n this.hookupFieldsNotesTable();\n this.hookupFieldsActive();\n }\n hookupTextareasHandSignalDescription() {\n this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagHandSignalDescription + ' .' + flagHandSignalDescription);\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogLocations extends TableBasePage {\n static hash = hashPageDogLocations;\n static attrIdRowObject = attrIdLocation;\n callSaveTableContent = API.saveLocations;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterActive();\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n let inputName = row.querySelector('td.' + flagName + ' .' + flagName);\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n\n let jsonRow = {};\n jsonRow[attrIdLocation] = row.getAttribute(attrIdLocation);\n jsonRow[flagLocationParent] = this.getIdLocationParentRow(row);\n jsonRow[flagName] = DOM.getElementAttributeValueCurrent(inputName);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n\n console.log(\"jsonRow\");\n console.log(jsonRow);\n\n return jsonRow;\n }\n getIdLocationParentRow(row) {\n let elementLocationParent = row.querySelector('td.' + flagLocationParent + ' .' + flagLocationParent);\n return DOM.getElementAttributeValueCurrent(elementLocationParent);\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagLocationParent + ' div.' + flagLocationParent\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsLocationParent();\n this.hookupFieldsNameTable();\n this.hookupFieldsActive();\n }\n hookupFieldsLocationParent() {\n /*\n this.hookupTableCellDdlPreviews(\n flagLocationParent\n , Utils.getListFromDict(locations).filter(location => \n (\n location[attrIdLocation] == idLocationRow\n || idLocationRow < 1\n )\n ) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n , null // cellSelector\n , (cellSelector) => { this.hookupLocationParentDdls(cellSelector); }\n ,\n );\n\n fieldFlag\n , optionList\n , cellSelector = null\n , ddlHookup = (ddlSelector) => { this.hookupTableCellDdls(ddlSelector); }\n , changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }\n ) {\n\n */\n let cellSelector = idTableMain + ' > tbody > tr > td.' + flagLocationParent;\n Events.hookupEventHandler(\"click\", cellSelector + ' div.' + flagLocationParent, (event, div) => {\n let row = DOM.getRowFromElement(div);\n let idLocationRow = Number(row.getAttribute(attrIdLocation));\n Utils.consoleLogIfNotProductionEnvironment({ idLocationRow });\n this.handleClickTableCellDdlPreview(\n event\n , div\n , flagLocationParent\n , Utils.getListFromDict(locations).filter(location => \n (\n location[attrIdLocation] != idLocationRow\n || idLocationRow < 1\n )\n ) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n , cellSelector\n , (ddlSelector) => { this.hookupTableCellDdls(\n ddlSelector\n , (event, element) => { this.handleChangeNestedElementCellTable(event, element); }\n ); }\n );\n });\n this.hookupTableCellDdls(\n cellSelector + ' select.' + flagLocationParent\n , (event, element) => { this.handleChangeNestedElementCellTable(event, element); }\n );\n }\n /*\n hookupLocationParentDdls(ddlSelector) {\n this.hookupChangeHandlerTableCells(ddlSelector, (event, element) => { this.handleChangeNestedElementCellTable(event, element); });\n }\n */\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogButtonIcons extends TableBasePage {\n static hash = hashPageDogButtonIcons;\n static attrIdRowObject = attrIdButtonIcon;\n callSaveTableContent = API.saveButtonIcons;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterActive();\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n let inputName = row.querySelector('td.' + flagName + ' .' + flagName);\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n\n let jsonRow = {};\n jsonRow[attrIdButtonIcon] = row.getAttribute(attrIdButtonIcon);\n jsonRow[flagImage] = this.getIdImageRow(row);\n jsonRow[flagName] = DOM.getElementAttributeValueCurrent(inputName);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n\n console.log(\"jsonRow\");\n console.log(jsonRow);\n\n return jsonRow;\n }\n getIdImageRow(row) {\n let elementImage = row.querySelector('td.' + flagImage + ' .' + flagImage);\n return DOM.getElementAttributeValueCurrent(elementImage);\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagImage + ' div.' + flagImage\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsImage();\n this.hookupFieldsNameTable();\n this.hookupFieldsActive();\n }\n hookupFieldsImage() {\n this.hookupTableCellDdlPreviews(\n flagImage\n , Utils.getListFromDict(buttonicons) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogCommandButtonLinks extends TableBasePage {\n static hash = hashPageDogCommandButtonLinks;\n static attrIdRowObject = attrIdCommandButtonLink;\n callSaveTableContent = API.saveCommandButtonLinks;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterCommandCategory();\n this.hookupFilterCommand();\n this.hookupFilterButtonShape();\n this.hookupFilterColour();\n this.hookupFilterButtonIcon();\n this.hookupFilterLocation();\n this.hookupFilterActive();\n }\n hookupFilterButtonShape() {\n this.hookupFilter(attrIdButtonShape);\n }\n hookupFilterColour() {\n this.hookupFilter(attrIdColour);\n }\n hookupFilterButtonIcon() {\n this.hookupFilter(attrIdButtonIcon);\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n let inputHandSignalDescription = row.querySelector('td.' + flagHandSignalDescription + ' textarea');\n let inputNotes = row.querySelector('td.' + flagNotes + ' textarea');\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n\n let jsonRow = {};\n jsonRow[attrIdCommandButtonLink] = row.getAttribute(attrIdCommandButtonLink);\n jsonRow[attrIdDog] = this.getIdDogRow(row);\n jsonRow[attrIdCommand] = this.getIdCommandRow(row);\n jsonRow[flagHandSignalDescription] = DOM.getElementAttributeValueCurrent(inputHandSignalDescription);\n jsonRow[flagNotes] = DOM.getElementAttributeValueCurrent(inputNotes);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n return jsonRow;\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagDog + ' div.' + flagDog\n , ',td.' + flagCommandCategory + ' div.' + flagCommandCategory\n , ',td.' + flagCommand + ' div.' + flagCommand\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsCommandCategory();\n this.hookupFieldsCommand();\n this.hookupFieldsButtonShape();\n this.hookupFieldsColour();\n this.hookupFieldsButtonIcon();\n this.dogMixin.hookupFieldsLocation();\n this.hookupFieldsActive();\n }\n hookupFieldsButtonShape() {\n this.hookupTableCellDdlPreviews(\n flagButtonShape\n , Utils.getListFromDict(filterButtonShapes) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n hookupFieldsColour() {\n this.hookupTableCellDdlPreviews(\n flagColour\n , Utils.getListFromDict(filterColours) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n hookupFieldsButtonIcon() {\n this.hookupTableCellDdlPreviews(\n flagButtonIcon\n , Utils.getListFromDict(filterButtonIcons) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nvar _rowBlankDistraction;\nvar _rowBlankAssessmentCommandModalityLink;\n\nexport default class PageDogAssessment extends TableBasePage {\n static hash = hashPageDogAssessment;\n static attrIdRowObject = attrIdAssessment;\n callSaveTableContent = API.saveAssessments;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n /*\n let inputTemperatureCelcius = row.querySelector('td.' + flagTemperatureCelcius + ' input');\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n */\n let jsonRow = {};\n jsonRow[attrIdAssessment] = row.getAttribute(attrIdAssessment);\n return jsonRow;\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagWeather + ' div.' + flagWeather\n , ',td.' + flagLightingLevel + ' div.' + flagLightingLevel\n , ',td.' + flagLocation + ' div.' + flagLocation\n , ',td.' + flagUserHandler + ' div.' + flagUserHandler\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupTableAssessmentHeader();\n this.hookupTableDistractions();\n this.hookupTableAssessmentCommandModalityLinks();\n }\n hookupTableAssessmentHeader() {\n this.hookupTableAssessmentFieldWeather();\n this.hookupTableAssessmentFieldLightingLevel();\n this.hookupTableAssessmentFieldTemperature();\n this.hookupTableAssessmentFieldLocation();\n this.hookupTableAssessmentFieldUserHandler();\n this.hookupTableAssessmentFieldNotes();\n }\n hookupTableAssessmentFieldWeather() {\n let fieldFlag = flagWeather;\n let optionList = Utils.getListFromDict(filterWeathers); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableAssessment + ' td.' + flagWeather;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableAssessmentFieldLightingLevel() {\n let fieldFlag = flagLightingLevel;\n let optionList = Utils.getListFromDict(filterLightingLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableAssessment + ' td.' + flagLightingLevel;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableAssessmentFieldTemperature() {\n this.hookupChangeHandlerTableCells(idTableAssessment + ' td.' + flagTemperatureCelcius + ' .' + flagTemperatureCelcius);\n }\n hookupTableAssessmentFieldLocation() {\n let fieldFlag = flagLocation;\n let optionList = Utils.getListFromDict(filterLocations); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableAssessment + ' td.' + flagLocation;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableAssessmentFieldUserHandler() {\n let fieldFlag = flagUserHandler;\n let optionList = Utils.getListFromDict(filterUserHandlers); // .sort((a, b) => a[flagName].localeCompare(b[flagName]));\n let cellSelector = idTableAssessment + ' td.' + flagUserHandler;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableAssessmentFieldNotes() {\n this.hookupChangeHandlerTableCells(idTableAssessment + ' td.' + flagNotes + ' .' + flagNotes);\n }\n hookupTableDistractions() {\n Events.initialiseEventHandler(idTableDistractions, flagInitialised, (table) => {\n let selectorRowNew = idTableDistractions + ' tbody tr.' + flagRowNew;\n let rowBlankTemp = document.querySelector(selectorRowNew);\n Utils.consoleLogIfNotProductionEnvironment(\"row blank temp: \", rowBlankTemp);\n let countRows = document.querySelectorAll(idTableDistractions + ' > tbody > tr').length;\n _rowBlankDistraction = rowBlankTemp.cloneNode(true);\n document.querySelectorAll(selectorRowNew).forEach(function(row) {\n row.remove();\n });\n _rowBlankDistraction.setAttribute(attrIdDistraction, -1 - countRows);\n });\n\n this.hookupTableDistractionsFieldsDistractionType();\n this.hookupTableDistractionsFieldsIntensityLevelEmotional();\n this.hookupTableDistractionsFieldsIntensityLevelScent();\n this.hookupTableDistractionsFieldsIntensityLevelSight();\n this.hookupTableDistractionsFieldsIntensityLevelSound();\n this.hookupTableDistractionsFieldsIntensityLevelTouch();\n this.hookupTableDistractionsFieldsQuantity();\n this.hookupTableDistractionsFieldsProximityMetres();\n this.hookupTableDistractionsFieldsNotes();\n this.hookupTableDistractionsFieldsActive();\n }\n hookupTableDistractionsFieldsDistractionType() {\n let fieldFlag = flagDistractionType;\n let optionList = Utils.getListFromDict(filterDistractionTypes); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableDistractions + ' td.' + flagDistractionType;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableDistractionsFieldsIntensityLevelEmotional() {\n let fieldFlag = flagDistractionIntensityLevelEmotional;\n let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelEmotional;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableDistractionsFieldsIntensityLevelScent() {\n let fieldFlag = flagDistractionIntensityLevelScent;\n let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelScent;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableDistractionsFieldsIntensityLevelSight() {\n let fieldFlag = flagDistractionIntensityLevelSight;\n let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelSight;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableDistractionsFieldsIntensityLevelSound() {\n let fieldFlag = flagDistractionIntensityLevelSound;\n let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelSound;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableDistractionsFieldsIntensityLevelTouch() {\n let fieldFlag = flagDistractionIntensityLevelTouch;\n let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelTouch;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableDistractionsFieldsQuantity() {\n this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagQuantity + ' .' + flagQuantity);\n }\n hookupTableDistractionsFieldsProximityMetres() {\n this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagProximityMetres + ' .' + flagProximityMetres);\n }\n hookupTableDistractionsFieldsNotes() {\n this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagNotes + ' .' + flagNotes);\n }\n hookupTableDistractionsFieldsActive() {\n this.hookupFieldsActive(flagDistraction, (event, element) => { this.handleClickAddRowTableDistractions(event, element); });\n }\n handleClickAddRowTableDistractions(event, button) {\n event.stopPropagation();\n _rowBlankDistraction.setAttribute(attrIdDistraction, -1 - _rowBlankDistraction.getAttribute(attrIdDistraction));\n let tbody = document.querySelector(idTableDistractions + ' tbody');\n if (tbody.classList.contains(flagIsCollapsed)) return;\n let row = _rowBlankDistraction.cloneNode(true);\n row.classList.remove(flagInitialised);\n row.querySelectorAll('.' + flagInitialised).forEach(function(element) {\n element.classList.remove(flagInitialised);\n });\n let countRows = document.querySelectorAll(idTableDistractions + ' > tbody > tr').length;\n row.setAttribute(attrIdDistraction, -1 - countRows);\n tbody.prepend(row);\n tbody.scrollTop = 0;\n this.hookupTableDistractions();\n this.postInitialiseDistractionRowNewCallback(tbody);\n }\n postInitialiseDistractionRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagDistractionType + ' div.' + flagDistractionType\n , ',td.' + flagDistractionIntensityLevelEmotional + ' div.' + flagDistractionIntensityLevelEmotional\n , ',td.' + flagDistractionIntensityLevelScent + ' div.' + flagDistractionIntensityLevelScent\n , ',td.' + flagDistractionIntensityLevelSight + ' div.' + flagDistractionIntensityLevelSight\n , ',td.' + flagDistractionIntensityLevelSound + ' div.' + flagDistractionIntensityLevelSound\n , ',td.' + flagDistractionIntensityLevelTouch + ' div.' + flagDistractionIntensityLevelTouch\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n hookupTableAssessmentCommandModalityLinks() {\n Events.initialiseEventHandler(idTableAssessmentCommandModalityLinks, flagInitialised, (table) => {\n let selectorRowNew = idTableAssessmentCommandModalityLinks + ' tbody tr.' + flagRowNew;\n let rowBlankTemp = document.querySelector(selectorRowNew);\n Utils.consoleLogIfNotProductionEnvironment(\"row blank temp: \", rowBlankTemp);\n let countRows = document.querySelectorAll(idTableAssessmentCommandModalityLinks + ' > tbody > tr').length;\n _rowBlankAssessmentCommandModalityLink = rowBlankTemp.cloneNode(true);\n document.querySelectorAll(selectorRowNew).forEach(function(row) {\n row.remove();\n });\n _rowBlankAssessmentCommandModalityLink.setAttribute(attrIdAssessmentCommandModalityLink, -1 - countRows);\n });\n\n this.hookupTableAssessmentCommandModalityLinksFieldsCommandCategory();\n this.hookupTableAssessmentCommandModalityLinksFieldsCommand();\n this.hookupTableAssessmentCommandModalityLinksFieldsCommandModality();\n this.hookupTableAssessmentCommandModalityLinksFieldsBribe();\n this.hookupTableAssessmentCommandModalityLinksFieldsDistanceFromHandler();\n this.hookupTableAssessmentCommandModalityLinksFieldsIsInHearingRangeOfHandler();\n this.hookupTableAssessmentCommandModalityLinksFieldsIsInScentRangeOfHandler();\n this.hookupTableAssessmentCommandModalityLinksFieldsIsInSightOfHandler();\n this.hookupTableAssessmentCommandModalityLinksFieldsIsOnLead();\n this.hookupTableAssessmentCommandModalityLinksFieldsTrialCount();\n this.hookupTableAssessmentCommandModalityLinksFieldsNotes();\n this.hookupTableAssessmentCommandModalityLinksFieldsResponses();\n this.hookupTableAssessmentCommandModalityLinksFieldsActive();\n }\n hookupTableAssessmentCommandModalityLinksFieldsCommandCategory() {\n this.hookupFieldsCommandCategory(idTableAssessmentCommandModalityLinks);\n /*\n let fieldFlag = flagCommandCategory;\n let optionList = Utils.getListFromDict(filterCommandCategories).sort((a, b) => a[flagName].localeCompare(b[flagName]));\n let cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagCommandCategory;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n , (tdSelector) => { this.hookupTableAssessmentCommandModalityLinksDdlsCommandCategory(tdSelector); }\n , (event, element) => { this.handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, element); }\n );\n */\n }\n /*\n hookupTableAssessmentCommandModalityLinksDdlsCommandCategory(ddlSelector) {\n this.hookupChangeHandlerTableCells(ddlSelector, (event, element) => { this.handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, element); });\n }\n handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, ddlCategory) {\n let row = DOM.getRowFromElement(ddlCategory);\n let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory);\n this.handleChangeNestedElementCellTable(event, ddlCategory);\n let idCommandCategoryRowNew = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory);\n if (idCommandCategoryRowOld == idCommandCategoryRowNew) return;\n let divCommand = row.querySelector('td.' + flagCommand + ' div');\n if (divCommand) divCommand.dispatchEvent(new Event('click'));\n let ddlCommand = row.querySelector('td.' + flagCommand + ' select.' + flagCommand);\n ddlCommand.innerHTML = '';\n ddlCommand.appendChild(DOM.createOption(null));\n let optionJson, option;\n let commandsInCategory = Utils.getListFromDict(filterCommands).filter(command => \n (\n command[attrIdCommandCategory] == idCommandCategoryRowNew\n || idCommandCategoryRowNew == 0\n )\n );\n let sortedCommands = commandsInCategory.sort((a, b) => a[flagName].localeCompare(b[flagName]));\n sortedCommands.forEach((command) => {\n optionJson = BusinessObjects.getOptionJsonFromObjectJson(command);\n option = DOM.createOption(optionJson);\n ddlCommand.appendChild(option);\n });\n this.handleChangeNestedElementCellTable(event, ddlCommand);\n }\n */\n hookupTableAssessmentCommandModalityLinksFieldsCommand() {\n this.hookupFieldsCommand(idTableAssessmentCommandModalityLinks);\n }\n hookupTableAssessmentCommandModalityLinksFieldsCommandModality() {\n let fieldFlag = flagCommandModality;\n let optionList = Utils.getListFromDict(filterCommandModalities); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagCommandModality;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableAssessmentCommandModalityLinksFieldsBribe() {\n let fieldFlag = flagBribe;\n let optionList = Utils.getListFromDict(filterBribes); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagBribe;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableAssessmentCommandModalityLinksFieldsDistanceFromHandler() {\n this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagDistanceFromHandler + ' .' + flagDistanceFromHandler);\n }\n hookupTableAssessmentCommandModalityLinksFieldsIsInHearingRangeOfHandler() {\n this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInHearingRangeOfHandler + ' .' + flagIsInHearingRangeOfHandler);\n }\n hookupTableAssessmentCommandModalityLinksFieldsIsInScentRangeOfHandler() {\n this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInScentRangeOfHandler + ' .' + flagIsInScentRangeOfHandler);\n }\n hookupTableAssessmentCommandModalityLinksFieldsIsInSightOfHandler() {\n this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInSightOfHandler + ' .' + flagIsInSightOfHandler);\n }\n hookupTableAssessmentCommandModalityLinksFieldsIsOnLead() {\n this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsOnLead + ' .' + flagIsOnLead);\n }\n hookupTableAssessmentCommandModalityLinksFieldsTrialCount() {\n // this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagTrialCount + ' .' + flagTrialCount);\n }\n hookupTableAssessmentCommandModalityLinksFieldsNotes() {\n this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' > tbody > tr > td.' + flagNotes + ' .' + flagNotes);\n }\n hookupTableAssessmentCommandModalityLinksFieldsResponses() {\n let eventType = \"click\";\n let selector = idTableAssessmentCommandModalityLinks + ' td.' + flagAssessmentResponse + ' div.' + flagAssessmentResponse;\n let handler = (event, element) => {\n let parentTd = DOM.getCellFromElement(element);\n let responsesTable = document.createElement(\"table\");\n responsesTable.id = idTableAssessmentResponses.replace(\"#\", \"\");\n responsesTable.classList.add(flagTableMain, flagAssessmentResponse);\n\n let head = document.createElement(\"thead\");\n let headRow = document.createElement(\"tr\");\n let thResponseQualityMetric = document.createElement(\"th\");\n thResponseQualityMetric.classList.add(flagResponseQualityMetric);\n thResponseQualityMetric.innerText = 'Response Quality Metric';\n headRow.appendChild(thResponseQualityMetric);\n let thObedienceLevel = document.createElement(\"th\");\n thObedienceLevel.classList.add(flagObedienceLevel);\n thObedienceLevel.innerText = 'Obedience Level';\n headRow.appendChild(thObedienceLevel);\n let thValueMeasured = document.createElement(\"th\");\n thValueMeasured.classList.add(flagValueMeasured);\n thValueMeasured.innerText = 'Value Measured';\n headRow.appendChild(thValueMeasured);\n let thNotes = document.createElement(\"th\");\n thNotes.classList.add(flagNotes);\n thNotes.innerText = 'Notes';\n headRow.appendChild(thNotes);\n let thActive = document.createElement(\"th\");\n thActive.classList.add(flagActive);\n let templateAddIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagAdd);\n thActive.appendChild(templateAddIcon.cloneNode(true));\n headRow.appendChild(thActive);\n head.appendChild(headRow);\n responsesTable.appendChild(head);\n\n let body = document.createElement(\"tbody\");\n \n let assessmentCommandModalityLink = assessment[flagAssessmentCommandModalityLink];\n let responses = (assessmentCommandModalityLink == null) ? null : assessmentCommandModalityLink[flagAssessmentResponse];\n \n if (responses != null && responses.length > 0) {\n for (let response in responses) {\n let row = PageDogAssessment.createNewRowTableAssessmentResponses(response);\n body.appendChild(row);\n }\n }\n responsesTable.appendChild(body);\n\n parentTd.innerHTML = responsesTable.outerHTML;\n\n this.hookupTablesAssessmentResponses();\n };\n Events.hookupEventHandler(\n eventType\n , selector\n , handler\n );\n this.hookupTablesAssessmentResponses();\n }\n static createNewRowTableAssessmentResponses(response) {\n if (response == null) response = {\n [attrIdAssessmentResponse]: null\n , [flagResponseQualityMetric]: 0\n , [flagObedienceLevel]: 0\n , [flagValueMeasured]: ''\n , [flagNotes]: ''\n , [flagActive]: true\n };\n let isNew = (response[attrIdAssessmentResponse] == null || response[attrIdAssessmentResponse] < 1);\n let row = document.createElement(\"tr\");\n row.classList.add(flagAssessmentResponse);\n if (isNew) row.classList.add(flagRowNew);\n row.setAttribute(attrIdAssessmentResponse, response[attrIdAssessmentResponse]);\n\n let tdResponseQualityMetric = document.createElement(\"td\");\n tdResponseQualityMetric.classList.add(flagResponseQualityMetric, flagDdlPreview);\n let divResponseQualityMetric = document.createElement(\"div\");\n divResponseQualityMetric.classList.add(flagResponseQualityMetric);\n DOM.setElementAttributesValuesCurrentAndPrevious(divResponseQualityMetric, response[flagResponseQualityMetric]);\n divResponseQualityMetric.innerText = response[flagResponseQualityMetric];\n tdResponseQualityMetric.appendChild(divResponseQualityMetric);\n row.appendChild(tdResponseQualityMetric);\n\n let tdObedienceLevel = document.createElement(\"td\");\n tdObedienceLevel.classList.add(flagObedienceLevel, flagDdlPreview);\n let divObedienceLevel = document.createElement(\"div\");\n divObedienceLevel.classList.add(flagObedienceLevel);\n DOM.setElementAttributesValuesCurrentAndPrevious(divObedienceLevel, response[flagObedienceLevel]);\n divObedienceLevel.innerText = response[flagObedienceLevel];\n tdObedienceLevel.appendChild(divObedienceLevel);\n row.appendChild(tdObedienceLevel);\n\n let tdValueMeasured = document.createElement(\"td\");\n tdValueMeasured.classList.add(flagValueMeasured, flagDdlPreview);\n let inputValueMeasured = document.createElement(\"input\");\n inputValueMeasured.type = \"number\";\n inputValueMeasured.classList.add(flagValueMeasured);\n DOM.setElementAttributesValuesCurrentAndPrevious(inputValueMeasured, response[flagValueMeasured]);\n inputValueMeasured.value = response[flagValueMeasured];\n tdValueMeasured.appendChild(inputValueMeasured);\n row.appendChild(tdValueMeasured);\n\n let tdNotes = document.createElement(\"td\");\n tdNotes.classList.add(flagNotes, flagDdlPreview);\n let inputNotes = document.createElement(\"textarea\");\n inputNotes.classList.add(flagNotes);\n DOM.setElementAttributesValuesCurrentAndPrevious(inputNotes, response[flagNotes]);\n inputNotes.value = response[flagNotes];\n tdNotes.appendChild(inputNotes);\n row.appendChild(tdNotes);\n\n let tdActive = document.createElement(\"td\");\n tdActive.classList.add(flagActive, flagDdlPreview);\n let templateAddIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagAdd);\n let templateDeleteIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagDelete);\n let buttonActive = (response[flagActive]) ? templateDeleteIcon.cloneNode(true) : templateAddIcon.cloneNode(true);\n tdActive.appendChild(buttonActive);\n row.appendChild(tdActive);\n\n return row;\n }\n hookupTablesAssessmentResponses() {\n this.hookupTableAssessmentResponsesFieldsResponseQualityMetric();\n this.hookupTableAssessmentResponsesFieldsObedienceLevel();\n this.hookupTableAssessmentResponsesFieldsValueMeasured();\n this.hookupTableAssessmentResponsesFieldsNotes();\n this.hookupTableAssessmentResponsesFieldsActive();\n }\n hookupTableAssessmentResponsesFieldsResponseQualityMetric() {\n let fieldFlag = flagResponseQualityMetric;\n let optionList = Utils.getListFromDict(filterResponseQualityMetrics); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableAssessmentResponses + ' td.' + flagResponseQualityMetric;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableAssessmentResponsesFieldsObedienceLevel() {\n let fieldFlag = flagObedienceLevel;\n let optionList = Utils.getListFromDict(filterObedienceLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n let cellSelector = idTableAssessmentResponses + ' td.' + flagObedienceLevel;\n this.hookupTableCellDdlPreviews(\n fieldFlag\n , optionList\n , cellSelector\n );\n }\n hookupTableAssessmentResponsesFieldsValueMeasured() {\n this.hookupChangeHandlerTableCells(idTableAssessmentResponses + ' td.' + flagValueMeasured + ' .' + flagValueMeasured);\n }\n hookupTableAssessmentResponsesFieldsNotes() {\n this.hookupChangeHandlerTableCells(idTableAssessmentResponses + ' td.' + flagNotes + ' .' + flagNotes);\n }\n hookupTableAssessmentResponsesFieldsActive() {\n this.hookupFieldsActive(flagAssessmentResponse, (event, element) => { this.handleClickAddRowTableAssessmentResponses(event, element); });\n }\n handleClickAddRowTableAssessmentResponses(event, button) {\n event.stopPropagation();\n let tableResponses = DOM.getClosestParent(button, \"table\");\n let tbody = tableResponses.querySelector(\":scope > tbody\");\n let row = PageDogAssessment.createNewRowTableAssessmentResponses(null);\n if (tbody.classList.contains(flagIsCollapsed)) return;\n row.classList.remove(flagInitialised);\n row.querySelectorAll('.' + flagInitialised).forEach(function(element) {\n element.classList.remove(flagInitialised);\n });\n let countRows = document.querySelectorAll(attrIdAssessmentResponse + ' > tbody > tr').length;\n row.setAttribute(attrIdAssessmentResponse, -1 - countRows);\n tbody.prepend(row);\n tbody.scrollTop = 0;\n this.hookupTablesAssessmentResponses();\n this.postInitialiseAssessmentResponseRowNewCallback(tbody);\n }\n postInitialiseAssessmentResponseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagResponseQualityMetric + ' div.' + flagResponseQualityMetric\n , ',td.' + flagObedienceLevel + ' div.' + flagObedienceLevel\n , ',td.' + flagValueMeasured + ' div.' + flagValueMeasured\n , ',td.' + flagNotes + ' div.' + flagNotes\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n let countActiveRows = tbody.querySelectorAll('td.' + flagActive + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagDelete).length;\n /*\n newRows.filter(row => {\n let activeButton = row.querySelector('td.' + flagActive + ' .' + flagButton + '.' + flagIcon + '.' + flagActive);\n return activeButton.classList.contains(flagDelete);\n }).length;\n */\n let rowAssessmentCommandModalityLink = DOM.getRowFromElement(tbody);\n let divTrialCount = rowAssessmentCommandModalityLink.querySelector('td.' + flagTrialCount + ' div.' + flagTrialCount);\n divTrialCount.innerText = countActiveRows;\n }\n\n hookupTableAssessmentCommandModalityLinksFieldsActive() {\n this.hookupFieldsActive(flagAssessmentCommandModalityLink, (event, element) => { this.handleClickAddRowTableAssessmentCommandModalityLinks(event, element); });\n }\n handleClickAddRowTableAssessmentCommandModalityLinks(event, button) {\n event.stopPropagation();\n _rowBlankAssessmentCommandModalityLink.setAttribute(attrIdAssessmentCommandModalityLink, -1 - _rowBlankAssessmentCommandModalityLink.getAttribute(attrIdAssessmentCommandModalityLink));\n let tbody = document.querySelector(idTableAssessmentCommandModalityLinks + ' tbody');\n if (tbody.classList.contains(flagIsCollapsed)) return;\n let row = _rowBlankAssessmentCommandModalityLink.cloneNode(true);\n row.classList.remove(flagInitialised);\n row.querySelectorAll('.' + flagInitialised).forEach(function(element) {\n element.classList.remove(flagInitialised);\n });\n let countRows = document.querySelectorAll(idTableAssessmentCommandModalityLinks + ' > tbody > tr').length;\n row.setAttribute(attrIdAssessmentCommandModalityLink, -1 - countRows);\n tbody.prepend(row);\n tbody.scrollTop = 0;\n this.hookupTableAssessmentCommandModalityLinks();\n this.postInitialiseAssessmentCommandModalityLinkRowNewCallback(tbody);\n }\n postInitialiseAssessmentCommandModalityLinkRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagCommandCategory + ' div.' + flagCommandCategory\n , ',td.' + flagCommand + ' div.' + flagCommand\n , ',td.' + flagCommandModality + ' div.' + flagCommandModality\n , ',td.' + flagBribe + ' div.' + flagBribe\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n leave() {\n super.leave();\n }\n}\n\n","\nimport API from \"../../api.js\";\nimport BusinessObjects from \"../../lib/business_objects/business_objects.js\";\nimport DOM from \"../../dom.js\";\nimport Events from \"../../lib/events.js\";\nimport TableBasePage from \"../base_table.js\";\nimport Utils from \"../../lib/utils.js\";\nimport Validation from \"../../lib/validation.js\";\nimport DogTableMixinPage from \"./mixin_table.js\";\n\nexport default class PageDogAssessments extends TableBasePage {\n static hash = hashPageDogAssessments;\n static attrIdRowObject = attrIdAssessment;\n callSaveTableContent = API.saveAssessments;\n\n constructor(router) {\n super(router);\n this.dogMixin = new DogTableMixinPage(this);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n hookupFilters() {\n this.sharedHookupFilters();\n this.hookupFilterWeather();\n this.hookupFilterLightingLevel();\n this.hookupFilterLocation();\n this.hookupFilterHandler();\n this.hookupFilterActive();\n }\n hookupFilterWeather() {\n this.hookupFilter(attrIdWeather);\n }\n hookupFilterLightingLevel() {\n this.hookupFilter(attrIdLightingLevel);\n }\n hookupFilterHandler() {\n this.hookupFilter(flagUserHandler);\n }\n\n loadRowTable(rowJson) {\n if (rowJson == null) return;\n if (_verbose) { Utils.consoleLogIfNotProductionEnvironment(\"applying data row: \", rowJson); }\n }\n getJsonRow(row) {\n if (row == null) return;\n let inputTemperatureCelcius = row.querySelector('td.' + flagTemperatureCelcius + ' input');\n let inputNotes = row.querySelector('td.' + flagNotes + ' textarea');\n let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);\n\n let jsonRow = {};\n jsonRow[attrIdAssessment] = row.getAttribute(attrIdAssessment);\n jsonRow[attrIdWeather] = this.getIdWeatherRow(row);\n jsonRow[attrIdLightingLevel] = this.getIdLightingLevelRow(row);\n jsonRow[flagTemperatureCelcius] = DOM.getElementAttributeValueCurrent(inputTemperatureCelcius);\n jsonRow[attrIdLocation] = this.getIdLocationRow(row);\n jsonRow[flagUserHandler] = this.getIdUserHandlerRow(row);\n jsonRow[flagNotes] = DOM.getElementAttributeValueCurrent(inputNotes);\n jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);\n return jsonRow;\n }\n getIdWeatherRow(tr) {\n let elementWeather = tr.querySelector('td.' + flagWeather + ' .' + flagWeather);\n return DOM.getElementAttributeValueCurrent(elementWeather);\n }\n getIdLightingLevelRow(tr) {\n let elementLightingLevel = tr.querySelector('td.' + flagLightingLevel + ' .' + flagLightingLevel);\n return DOM.getElementAttributeValueCurrent(elementLightingLevel);\n }\n getIdLocationRow(tr) {\n let elementLocation = tr.querySelector('td.' + flagLocation + ' .' + flagLocation);\n return DOM.getElementAttributeValueCurrent(elementLocation);\n }\n getIdUserHandlerRow(tr) {\n let elementUserHandler = tr.querySelector('td.' + flagUserHandler + ' .' + flagUserHandler);\n return DOM.getElementAttributeValueCurrent(elementUserHandler);\n }\n initialiseRowNew(tbody, row) {\n \n }\n postInitialiseRowNewCallback(tbody) {\n let newRows = tbody.querySelectorAll('tr.' + flagRowNew);\n let newestRow = newRows[0];\n let clickableElementsSelector = [\n 'td.' + flagWeather + ' div.' + flagWeather\n , ',td.' + flagLightingLevel + ' div.' + flagLightingLevel\n , ',td.' + flagLocation + ' div.' + flagLocation\n , ',td.' + flagUserHandler + ' div.' + flagUserHandler\n ].join('');\n newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {\n clickableElement.click();\n });\n }\n\n hookupTableMain() {\n super.hookupTableMain();\n this.hookupFieldsDetail();\n this.hookupFieldsWeather();\n this.hookupFieldsLightingLevel();\n this.hookupFieldsTemperature();\n this.dogMixin.hookupFieldsLocation();\n this.hookupFieldsHandler();\n this.hookupFieldsNotesTable();\n this.hookupFieldsActive();\n }\n hookupFieldsDetail() {\n Events.hookupEventHandler(\n \"click\" // eventType\n , idTableMain + ' td.' + flagDetail + ' button.' + flagDetail // selector\n , (event, element) => {\n let parentTr = DOM.getRowFromElement(element);\n let idAssessment = parentTr.getAttribute(attrIdAssessment);\n /*\n console.log(\"click detail\");\n console.log({ element, parentTr, idAssessment });\n const data = {};\n const params = {\n [attrIdAssessment]: idAssessment\n };\n API.request(\n hashPageDogAssessment // hashEndpoint\n , 'GET' // method\n , data\n , params\n );\n */\n\n let formFilters = TableBasePage.getFormFilters();\n let filtersJson = DOM.convertForm2JSON(formFilters);\n filtersJson[attrIdAssessment] = idAssessment;\n Utils.consoleLogIfNotProductionEnvironment(\"hookupFieldsDetail\");\n Utils.consoleLogIfNotProductionEnvironment(\"formFilters\");\n Utils.consoleLogIfNotProductionEnvironment(formFilters);\n Utils.consoleLogIfNotProductionEnvironment(\"filtersJson\");\n Utils.consoleLogIfNotProductionEnvironment(filtersJson);\n this.leave();\n API.goToHash(hashPageDogAssessment, filtersJson);\n }\n );\n }\n hookupFieldsWeather() {\n this.hookupTableCellDdlPreviews(\n flagWeather\n , Utils.getListFromDict(filterWeathers) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n hookupFieldsLightingLevel() {\n this.hookupTableCellDdlPreviews(\n flagLightingLevel\n , Utils.getListFromDict(filterLightingLevels) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n hookupFieldsTemperature() {\n this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagTemperatureCelcius + ' input.' + flagTemperatureCelcius);\n }\n hookupFieldsHandler() {\n this.hookupTableCellDdlPreviews(\n flagUserHandler\n , Utils.getListFromDict(filterUserHandlers) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))\n );\n }\n\n leave() {\n super.leave();\n }\n}\n\n","import BasePage from \"../base.js\";\n\nexport default class PageAccessibilityReport extends BasePage {\n static hash = hashPageAccessibilityReport;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n leave() {\n super.leave();\n }\n}\n","import BasePage from \"../base.js\";\n\nexport default class PageAccessibilityStatement extends BasePage {\n static hash = hashPageAccessibilityStatement;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n leave() {\n super.leave();\n }\n}\n","\nimport BasePage from \"../base.js\";\n\nexport default class PageLicense extends BasePage {\n static hash = hashPageLicense;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n leave() {\n super.leave();\n }\n}","\nimport BasePage from \"../base.js\";\n\nexport default class PagePrivacyPolicy extends BasePage {\n static hash = hashPagePrivacyPolicy;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n leave() {\n super.leave();\n }\n}","import BasePage from \"../base.js\";\n\nexport default class PageRetentionSchedule extends BasePage {\n static hash = hashPageDataRetentionSchedule;\n\n constructor(router) {\n super(router);\n }\n\n initialize() {\n this.sharedInitialize();\n }\n\n leave() {\n super.leave();\n }\n}\n","\n// Pages\n// Core\nimport PageHome from './pages/core/home.js';\n// Dog\nimport PageDogHome from './pages/dog/home.js';\nimport PageDogCommandCategories from './pages/dog/command_categories.js';\nimport PageDogCommands from './pages/dog/commands.js';\nimport PageDogDogCommandLinks from './pages/dog/dog_command_links.js';\n// import PageDogDogs from './pages/dog/dogs.js';\nimport PageDogLocations from './pages/dog/locations.js';\nimport PageDogButtonIcons from './pages/dog/button_icons.js';\nimport PageDogCommandButtonLinks from './pages/dog/command_button_links.js';\nimport PageDogAssessment from './pages/dog/assessment.js';\nimport PageDogAssessments from './pages/dog/assessments.js';\n// Legal\nimport PageAccessibilityReport from './pages/legal/accessibility_report.js';\nimport PageAccessibilityStatement from './pages/legal/accessibility_statement.js';\nimport PageLicense from './pages/legal/license.js';\nimport PagePrivacyPolicy from './pages/legal/privacy_policy.js';\nimport PageRetentionSchedule from './pages/legal/retention_schedule.js';\n// User\n// import PageUserLogin from './pages/user/login.js';\n// import PageUserLogout from './pages/user/logout.js';\n// import PageUserAccount from './pages/user/account.js';\n\nimport API from './api.js';\nimport DOM from './dom.js';\nimport Utils from './lib/utils.js';\n\n\nexport default class Router {\n constructor() {\n // Pages\n this.pages = {};\n // Core\n this.pages[hashPageHome] = { name: 'PageHome', module: PageHome };\n // Dog\n this.pages[hashPageDogHome] = { name: 'PageDogHome', module: PageDogHome };\n this.pages[hashPageDogCommandCategories] = { name: 'PageDogCommands', module: PageDogCommandCategories };\n this.pages[hashPageDogCommands] = { name: 'PageDogCommands', module: PageDogCommands };\n this.pages[hashPageDogDogCommandLinks] = { name: 'PageDogDogCommandLinks', module: PageDogDogCommandLinks };\n // this.pages[hashPageDogDogs] = { name: 'PageDogDogs', module: PageDogDogs };\n this.pages[hashPageDogLocations] = { name: 'PageDogLocations', module: PageDogLocations };\n this.pages[hashPageDogButtonIcons] = { name: 'PageDogButtonIcons', module: PageDogButtonIcons };\n this.pages[hashPageDogCommandButtonLinks] = { name: 'PageDogCommandButtonLinks', module: PageDogCommandButtonLinks };\n this.pages[hashPageDogAssessment] = { name: 'PageDogAssessment', module: PageDogAssessment };\n this.pages[hashPageDogAssessments] = { name: 'PageDogAssessments', module: PageDogAssessments };\n // Legal\n this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', module: PageAccessibilityStatement };\n this.pages[hashPageDataRetentionSchedule] = { name: 'PageDataRetentionSchedule', module: PageRetentionSchedule };\n this.pages[hashPageLicense] = { name: 'PageLicense', module: PageLicense };\n this.pages[hashPagePrivacyPolicy] = { name: 'PagePrivacyPolicy', module: PagePrivacyPolicy };\n // User\n // this.pages[hashPageUserLogin] = { name: 'PageUserLogin', module: PageUserLogin }; // pathModule: './pages/user/login.js' };\n // this.pages[hashPageUserLogout] = { name: 'PageUserLogout', module: PageUserLogout }; // pathModule: './pages/user/logout.js' };\n // this.pages[hashPageUserAccount] = { name: 'PageUserAccount', module: PageUserAccount }; // pathModule: './pages/user/account.js' };\n // Routes\n this.routes = {};\n // Core\n this.routes[hashPageHome] = (isPopState = false) => this.navigateToHash(hashPageHome, isPopState);\n // Dog\n this.routes[hashPageDogHome] = (isPopState = false) => this.navigateToHash(hashPageDogHome, isPopState);\n this.routes[hashPageDogCommandCategories] = (isPopState = false) => this.navigateToHash(hashPageDogCommandCategories, isPopState);\n this.routes[hashPageDogCommands] = (isPopState = false) => this.navigateToHash(hashPageDogCommands, isPopState);\n this.routes[hashPageDogDogCommandLinks] = (isPopState = false) => this.navigateToHash(hashPageDogDogCommandLinks, isPopState);\n // this.routes[hashPageDogDogs] = (isPopState = false) => this.navigateToHash(hashPageDogDogs, isPopState);\n this.routes[hashPageDogLocations] = (isPopState = false) => this.navigateToHash(hashPageDogLocations, isPopState);\n this.routes[hashPageDogButtonIcons] = (isPopState = false) => this.navigateToHash(hashPageDogButtonIcons, isPopState);\n this.routes[hashPageDogCommandButtonLinks] = (isPopState = false) => this.navigateToHash(hashPageDogCommandButtonLinks, isPopState);\n this.routes[hashPageDogAssessment] = (isPopState = false) => this.navigateToHash(hashPageDogAssessment, isPopState);\n this.routes[hashPageDogAssessments] = (isPopState = false) => this.navigateToHash(hashPageDogAssessments, isPopState);\n // Legal\n this.routes[hashPageAccessibilityStatement] = (isPopState = false) => this.navigateToHash(hashPageAccessibilityStatement, isPopState);\n this.routes[hashPageDataRetentionSchedule] = (isPopState = false) => this.navigateToHash(hashPageDataRetentionSchedule, isPopState);\n this.routes[hashPageLicense] = (isPopState = false) => this.navigateToHash(hashPageLicense, isPopState);\n this.routes[hashPagePrivacyPolicy] = (isPopState = false) => this.navigateToHash(hashPagePrivacyPolicy, isPopState);\n // User\n // this.routes[hashPageUserLogin] = (isPopState = false) => this.navigateToHash(hashPageUserLogin, isPopState);\n // this.routes[hashPageUserLogout] = (isPopState = false) => this.navigateToHash(hashPageUserLogout, isPopState);\n // this.routes[hashPageUserAccount] = (isPopState = false) => this.navigateToHash(hashPageUserAccount, isPopState);\n this.initialize();\n }\n loadPage(hashPage, isPopState = false) {\n const PageClass = this.getClassPageFromHash(hashPage);\n this.currentPage = new PageClass(this);\n this.currentPage.initialize(isPopState);\n window.addEventListener('beforeunload', () => this.currentPage.leave());\n }\n getClassPageFromHash(hashPage) {\n \n let pageJson = this.pages[hashPage];\n try {\n const module = pageJson.module;\n return module; \n }\n catch (error) {\n Utils.consoleLogIfNotProductionEnvironment(\"this.pages: \", this.pages);\n console.error('Page not found:', hashPage);\n throw error;\n }\n }\n initialize() {\n window.addEventListener('popstate', this.handlePopState.bind(this));\n }\n handlePopState(event) {\n this.loadPageCurrent();\n }\n loadPageCurrent() {\n const hashPageCurrent = DOM.getHashPageCurrent();\n this.loadPage(hashPageCurrent);\n }\n navigateToHash(hash, data = null, params = null, isPopState = false) {\n let url = API.getUrlFromHash(hash, params);\n history.pushState({data: data, params: params}, '', hash);\n API.goToUrl(url, data);\n }\n \n navigateToUrl(url, data = null, appendHistory = true) {\n // this.beforeLeave();\n if (appendHistory) history.pushState(data, '', url);\n url = API.parameteriseUrl(url, data);\n API.goToUrl(url);\n }\n\n static loadPageBodyFromResponse(response) {\n DOM.loadPageBody(response.data);\n }\n}\n\nexport const router = new Router();\n","\n'use strict';\n\nimport DOM from './dom.js';\nimport Router from './router.js';\n\n\nclass App {\n constructor() {\n this.dom = new DOM();\n this.router = new Router();\n }\n\n initialize() {\n this.setupEventListeners();\n this.start();\n }\n\n setupEventListeners() {\n // document.addEventListener('click', this.handleGlobalClick.bind(this));\n }\n\n handleGlobalClick(event) {\n }\n\n start() {\n this.initPageCurrent();\n }\n\n initPageCurrent() {\n this.router.loadPageCurrent();\n }\n \n}\n\nconst app = new App();\n\nfunction domReady(fn) {\n if (document.readyState !== 'loading') {\n fn();\n } else {\n document.addEventListener('DOMContentLoaded', fn);\n }\n}\n\ndomReady(() => {\n app.initialize();\n});\n\nwindow.app = app;\n\nexport default app;","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":["Validation","_classCallCheck","_createClass","key","value","isEmpty","object","undefined","length","isString","trim","i","isValidNumber","positiveOnly","isNaN","parseFloat","getDataContentType","params","data","contentType","JSON","stringify","Data","ContentType","arrayContainsItem","array","itemValue","hasItem","isJQueryElementArray","jQuery","document","querySelectorAll","is","isDate","Date","getTime","dictHasKey","d","k","areEqualDicts","dict1","dict2","keys1","Object","keys","keys2","_i3","_keys","imageExists","url","callback","img","Image","onload","onerror","src","toFixedOrDefault","decimalPlaces","defaultValue","arguments","toFixed","default","Utils","DOM","setElementAttributesValuesCurrentAndPrevious","element","setElementAttributeValueCurrent","setElementAttributeValuePrevious","setAttribute","attrValueCurrent","attrValuePrevious","setElementValuesCurrentAndPrevious","setElementValueCurrent","tagName","toUpperCase","type","checked","textContent","setElementValueCurrentIfEmpty","getElementValueCurrent","getCellFromElement","closest","getRowFromElement","flagRow","selector","getClosestParent","parentSelector","parent","parentElement","matches","convertForm2JSON","elementForm","dataForm","containersFilter","flagContainerInput","flagFilter","containerFilter","labelFilter","keyFilter","filter","indexFilter","querySelector","getAttribute","concat","loadPageBody","contentNew","pageBody","idPageBody","innerHTML","getHashPageCurrent","hashPageCurrent","body","dataset","page","updateAndCheckIsElementDirty","isElementDirty","isDirty","handleDirtyElement","toggleElementHasClassnameFlag","flagDirty","elementHasFlag","flag","elementAlreadyHasFlag","classList","contains","add","remove","hasDirtyChildrenContainer","container","hasDirtyChildrenNotDeletedContainer","flagDelete","returnVal","flagButton","flagActive","getElementAttributeValueCurrent","flagCheckbox","flagIsChecked","getElementAttributeValuePrevious","scrollToElement","scrollTop","offset","top","isElementInContainer","containerBounds","getBoundingClientRect","elementBounds","left","height","width","alertError","errorType","errorText","alert","createOptionUnselectedProductVariation","_defineProperty","flagProductVariationType","flagNameAttrOptionText","flagName","flagNameAttrOptionValue","attrIdProductVariationType","flagProductVariation","attrIdProductVariation","createOption","optionJson","text","option","createElement","selected","escapeHtml","div","unescapeHtml","html","innerText","Events","initialiseEventHandler","selectorElement","classInitialised","eventHandler","forEach","hookupEventHandler","eventType","flagInitialised","addEventListener","event","stopPropagation","LocalStorage","getLocalStorage","parse","localStorage","getItem","setLocalStorage","newLS","setItem","_regeneratorRuntime","e","t","r","prototype","n","hasOwnProperty","o","defineProperty","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","getPrototypeOf","v","values","g","defineIteratorMethods","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptor","apply","_objectSpread","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","asyncGeneratorStep","_asyncToGenerator","_next","_throw","_defineProperties","_toPrimitive","toPrimitive","String","Number","API","getCsrfToken","idCSRFToken","_request","_callee","hashEndpoint","csrfToken","options","response","_args","_callee$","_context","getUrlFromHash","headers","flagCsrfToken","fetch","ok","status","json","t0","console","error","request","_x","hash","hashPageHome","parameteriseUrl","_pathHost","URLSearchParams","toString","goToUrl","window","location","href","goToHash","_loginUser","_callee2","_callee2$","_context2","flagCallback","hashPageUserLogin","loginUser","_saveCommandCategories","_callee3","commandCategories","formFilters","comment","dataRequest","_callee3$","_context3","flagFormFilters","flagCommandCategory","flagComment","hashSaveDogCommandCategory","saveCommandCategories","_x2","_x3","_x4","_saveCommands","_callee4","commands","_callee4$","_context4","flagCommand","hashSaveDogCommand","saveCommands","_x5","_x6","_x7","_saveDogCommandLinks","_callee5","dogCommandLinks","_callee5$","_context5","flagDogCommandLink","hashSaveDogDogCommandLink","saveDogCommandLinks","_x8","_x9","_x10","_saveLocations","_callee6","locations","_callee6$","_context6","flagLocation","hashSaveDogLocation","saveLocations","_x11","_x12","_x13","_saveButtonIcons","_callee7","buttonIcons","_callee7$","_context7","flagButtonIcon","hashSaveDogButtonIcon","saveButtonIcons","_x14","_x15","_x16","_saveCommandButtonLinks","_callee8","links","_callee8$","_context8","flagCommandButtonLink","hashSaveDogCommandButtonLink","saveCommandButtonLinks","_x17","_x18","_x19","getListFromDict","dict","list","consoleLogIfNotProductionEnvironment","message","environment","is_production","log","OverlayConfirm","hookup","callbackSuccess","idOverlayConfirm","flagCancel","buttonCancel","overlay","style","visibility","flagSubmit","buttonConfirm","textarea","show","flagIsCollapsed","BusinessObjects","OverlayError","BasePage","router","title","titlePageCurrent","initialize","sharedInitialize","logInitialisation","hookupCommonElements","hookupLogos","hookupNavigation","hookupOverlays","idButtonHamburger","overlayHamburger","idOverlayHamburger","flagExpanded","hookupButtonsNavHome","hookupButtonsNavUserAccount","hookupButtonsNavUserLogout","hookupButtonsNavUserLogin","hookupButtonsNavDogHome","hookupButtonsNavDogCommandCategories","hookupButtonsNavDogCommands","hookupButtonsNavDogDogCommandLinks","hookupButtonsNavDogDogs","hookupButtonsNavDogLocations","hookupButtonsNavDogButtonIcons","hookupButtonsNavDogCommandButtonLinks","hookupButtonsNavDogAssessments","hookupButtonsNav","flagNavHome","buttonSelector","hashPageNav","_this","button","navigateToHash","flagNavUserAccount","hashPageUserAccount","flagNavUserLogout","hashPageUserLogout","_this2","flagNavUserLogin","navigator","leave","Success","Message","flagNavDogHome","hashPageDogHome","flagNavDogCommandCategories","hashPageDogCommandCategories","flagNavDogCommands","hashPageDogCommands","flagNavDogDogCommandLinks","hashPageDogDogCommandLinks","flagNavDogDogs","hashPageDogDogs","flagNavDogLocations","hashPageDogLocations","flagNavDogButtonIcons","hashPageDogButtonIcons","flagNavDogCommandButtonLinks","hashPageDogCommandButtonLinks","flagNavDogAssessments","hashPageDogAssessments","_this3","flagImageLogo","flagLogo","hookupOverlayFromId","idOverlayError","idOverlay","display","hookupButtonSave","_this4","flagSave","target","setLocalStoragePage","dataPage","getLocalStoragePage","toggleShowButtonsSaveCancel","buttonContainerSelector","flagContainer","buttonSave","isDirtyFilter","idTableMain","PageHome","_BasePage","_callSuper","_inherits","_superPropGet","PageDogHome","hookupDogHome","getOptionJsonFromObjectJsonAndKeys","objectJson","keyText","keyValue","valueSelected","getOptionJsonFromObjectJson","getObjectText","getListObjectsFromIdDictAndCsv","idDict","idCsv","listObjects","ids","split","_iterator","_createForOfIteratorHelper","_step","id","err","msgError","labelError","idLabelError","TableBasePage","cursorYInitial","rowInitial","placeholder","dragSrcEl","dragSrcRow","hookupTableCellDdls","bind","isPopState","isSinglePageApp","hookupFilters","hookupButtonsSaveCancel","hookupTableMain","saveRecordsTableDirtySinglePageApp","saveRecordsTableDirty","filters","getFormFilters","filtersDefault","callFilterTableContent","sharedHookupFilters","hookupButtonApplyFilters","hookupSearchTextFilter","hookupFilterActive","filterSelector","idFormFilters","flagActiveOnly","filterActiveOld","removeAttribute","parentDiv","isChecked","filterActiveNew","filterActive","svgElement","wasChecked","handleChangeFilter","filterValuePrevious","hookupFilter","filterFlag","handler","areDirtyFilters","tbody","rows","row","dirtyInputs","dirtyInput","isDirtyLabel","initialisedElements","initialisedElement","updateAndToggleShowButtonsSaveCancel","hookupFilterIsNotEmpty","flagIsNotEmpty","_this5","idButtonApplyFilters","flagSearch","hookupFilterDog","attrIdDog","hookupFilterCommandCategory","_this6","attrIdCommandCategory","filterCommandCategory","idCommandCategory","filterCommands","commandsInCategory","command","sortedCommands","sort","b","localeCompare","filterCommand","idCommandPrevious","appendChild","dispatchEvent","Event","hookupFilterCommand","attrIdCommand","hookupFilterLocation","attrIdLocation","filtersJson","callbackLoadTableContent","table","getTableMain","bodyTable","rowsJson","flagRows","every","display_order","loadRowTable","rowJson","getAndLoadFilteredTableContentSinglePageApp","_this7","hookupButtonCancel","_this8","records","getTableRecords","formElement","idTextareaConfirm","callSaveTableContent","flagStatus","flagSuccess","_verbose","flagMessage","_this9","dirtyOnly","record","getJsonRow","_this10","_this11","handleClickAddRowTable","_rowBlank","attrIdRowObject","cloneNode","countRows","initialiseRowNew","prepend","postInitialiseRowNewCallback","_this12","cacheRowBlank","selectorRowNew","flagRowNew","rowBlankTemp","initialiseSliderDisplayOrderRowNew","slidersDisplayOrder","flagDisplayOrder","flagSlider","maxDisplayOrder","slider","Math","max","sliderDisplayOrder","hookupSlidersDisplayOrderTable","selectorDisplayOrder","hookupChangeHandlerTableCells","inputSelector","_this13","handleChangeNestedElementCellTable","input","wasDirtyParentRows","getAllIsDirtyRowsInParentTree","wasDirtyElement","isDirtyElement","cascadeChangedIsDirtyNestedElementCellTable","tr","isDirtyRow","wasDirtyRow","shift","hookupChangeHandlerTableCellsWhenNotCollapsed","_this14","hookupFieldsCodeTable","flagCode","hookupFieldsNameTable","hookupFieldsDescriptionTable","flagDescription","hookupFieldsNotesTable","flagNotes","hookupFieldsActive","_this15","flagTable","handleClickRowNew","selectorButton","selectorButtonDelete","selectorButtonUndelete","hookupButtonsRowDelete","hookupButtonsRowUndelete","_this16","changeHandler","handleClickButtonRowDelete","changeEvent","changeElement","_this17","valuePrevious","wasDirty","parentNode","removeChild","buttonAddTemplate","idContainerTemplateElements","flagAdd","buttonAdd","replaceWith","_this18","handleClickButtonRowUndelete","_this19","buttonDeleteTemplate","buttonDelete","hookupTdsAccessLevel","hookupTableCellDdlPreviews","flagAccessLevel","accessLevels","fieldFlag","optionList","_this20","cellSelector","ddlHookup","ddlSelector","handleClickTableCellDdlPreview","_this21","optionObjectList","_this22","idSelected","td","ddl","optionObjectJson","toggleColumnCollapsed","flagColumn","isCollapsed","toggleColumnHasClassnameFlag","toggleColumnHeaderCollapsed","hookupFieldsCommandCategory","_this23","idTable","filterCommandCategories","hookupCommandCategoryDdls","_this24","handleChangeCommandCategoryDdl","ddlCategory","idCommandCategoryRowOld","getIdCommandCategoryRow","idCommandCategoryRowNew","idCommandCategoryFilter","getIdCommandCategoryFilter","tdCommand","ddlCommand","hookupFieldsCommand","_this25","parentTr","tdCommandCategory","idCommandCategoryRow","filterCommandList","handleChangeCommandDdl","idCommandNew","getIdCommandRow","commandNew","divCommandCategory","ddlCommandCategory","elementCommandCategory","commandCategoryFilter","commandFilter","valueCurrentCommandCategoryFilter","valueCurrentCommandFilter","getHasCommandCategoryFilter","elementCommand","getIdCommandFilter","idCommand","getHasCommandFilter","idCommandFilter","hookupFieldsDog","flagDog","filterDogs","getIdDogRow","elementDog","columnFlag","isRequiredFlag","classnameFlag","columnTh","columnThHasFlag","toggleColumnHeaderHasClassnameFlag","isDirtyMainTable","DogMixinPage","pageCurrent","hookupLocalStorageDog","DogTableMixinPage","_DogMixinPage","hookupTable","hookupFieldsLocation","filterLocations","PageDogCommandCategories","_TableBasePage","dogMixin","inputCode","inputName","buttonActive","jsonRow","PageDogCommands","inputHandSignalDefaultDescription","flagHandSignalDefaultDescription","inputCanHaveButton","flagCanHaveButton","inputNotes","newRows","newestRow","clickableElementsSelector","join","clickableElement","click","hookupTextareasHandSignalDefaultDescription","hookupFieldsCanHaveButton","PageDogDogCommandLinks","inputHandSignalDescription","flagHandSignalDescription","attrIdDogCommandLink","hookupTextareasHandSignalDescription","PageDogLocations","flagLocationParent","getIdLocationParentRow","elementLocationParent","hookupFieldsLocationParent","idLocationRow","PageDogButtonIcons","attrIdButtonIcon","flagImage","getIdImageRow","elementImage","hookupFieldsImage","buttonicons","PageDogCommandButtonLinks","hookupFilterButtonShape","hookupFilterColour","hookupFilterButtonIcon","attrIdButtonShape","attrIdColour","attrIdCommandButtonLink","hookupFieldsButtonShape","hookupFieldsColour","hookupFieldsButtonIcon","flagButtonShape","filterButtonShapes","flagColour","filterColours","filterButtonIcons","_rowBlankDistraction","_rowBlankAssessmentCommandModalityLink","PageDogAssessment","saveAssessments","attrIdAssessment","flagWeather","flagLightingLevel","flagUserHandler","hookupTableAssessmentHeader","hookupTableDistractions","hookupTableAssessmentCommandModalityLinks","hookupTableAssessmentFieldWeather","hookupTableAssessmentFieldLightingLevel","hookupTableAssessmentFieldTemperature","hookupTableAssessmentFieldLocation","hookupTableAssessmentFieldUserHandler","hookupTableAssessmentFieldNotes","filterWeathers","idTableAssessment","filterLightingLevels","flagTemperatureCelcius","filterUserHandlers","idTableDistractions","attrIdDistraction","hookupTableDistractionsFieldsDistractionType","hookupTableDistractionsFieldsIntensityLevelEmotional","hookupTableDistractionsFieldsIntensityLevelScent","hookupTableDistractionsFieldsIntensityLevelSight","hookupTableDistractionsFieldsIntensityLevelSound","hookupTableDistractionsFieldsIntensityLevelTouch","hookupTableDistractionsFieldsQuantity","hookupTableDistractionsFieldsProximityMetres","hookupTableDistractionsFieldsNotes","hookupTableDistractionsFieldsActive","flagDistractionType","filterDistractionTypes","flagDistractionIntensityLevelEmotional","filterDistractionIntensityLevels","flagDistractionIntensityLevelScent","flagDistractionIntensityLevelSight","flagDistractionIntensityLevelSound","flagDistractionIntensityLevelTouch","flagQuantity","flagProximityMetres","flagDistraction","handleClickAddRowTableDistractions","postInitialiseDistractionRowNewCallback","idTableAssessmentCommandModalityLinks","attrIdAssessmentCommandModalityLink","hookupTableAssessmentCommandModalityLinksFieldsCommandCategory","hookupTableAssessmentCommandModalityLinksFieldsCommand","hookupTableAssessmentCommandModalityLinksFieldsCommandModality","hookupTableAssessmentCommandModalityLinksFieldsBribe","hookupTableAssessmentCommandModalityLinksFieldsDistanceFromHandler","hookupTableAssessmentCommandModalityLinksFieldsIsInHearingRangeOfHandler","hookupTableAssessmentCommandModalityLinksFieldsIsInScentRangeOfHandler","hookupTableAssessmentCommandModalityLinksFieldsIsInSightOfHandler","hookupTableAssessmentCommandModalityLinksFieldsIsOnLead","hookupTableAssessmentCommandModalityLinksFieldsTrialCount","hookupTableAssessmentCommandModalityLinksFieldsNotes","hookupTableAssessmentCommandModalityLinksFieldsResponses","hookupTableAssessmentCommandModalityLinksFieldsActive","flagCommandModality","filterCommandModalities","flagBribe","filterBribes","flagDistanceFromHandler","flagIsInHearingRangeOfHandler","flagIsInScentRangeOfHandler","flagIsInSightOfHandler","flagIsOnLead","flagAssessmentResponse","parentTd","responsesTable","idTableAssessmentResponses","replace","flagTableMain","head","headRow","thResponseQualityMetric","flagResponseQualityMetric","thObedienceLevel","flagObedienceLevel","thValueMeasured","flagValueMeasured","thNotes","thActive","templateAddIcon","flagIcon","assessmentCommandModalityLink","assessment","flagAssessmentCommandModalityLink","responses","createNewRowTableAssessmentResponses","outerHTML","hookupTablesAssessmentResponses","hookupTableAssessmentResponsesFieldsResponseQualityMetric","hookupTableAssessmentResponsesFieldsObedienceLevel","hookupTableAssessmentResponsesFieldsValueMeasured","hookupTableAssessmentResponsesFieldsNotes","hookupTableAssessmentResponsesFieldsActive","filterResponseQualityMetrics","filterObedienceLevels","handleClickAddRowTableAssessmentResponses","tableResponses","attrIdAssessmentResponse","postInitialiseAssessmentResponseRowNewCallback","countActiveRows","rowAssessmentCommandModalityLink","divTrialCount","flagTrialCount","handleClickAddRowTableAssessmentCommandModalityLinks","postInitialiseAssessmentCommandModalityLinkRowNewCallback","isNew","tdResponseQualityMetric","flagDdlPreview","divResponseQualityMetric","tdObedienceLevel","divObedienceLevel","tdValueMeasured","inputValueMeasured","tdNotes","tdActive","templateDeleteIcon","hashPageDogAssessment","PageDogAssessments","hookupFilterWeather","hookupFilterLightingLevel","hookupFilterHandler","attrIdWeather","attrIdLightingLevel","inputTemperatureCelcius","getIdWeatherRow","getIdLightingLevelRow","getIdLocationRow","getIdUserHandlerRow","elementWeather","elementLightingLevel","elementLocation","elementUserHandler","hookupFieldsDetail","hookupFieldsWeather","hookupFieldsLightingLevel","hookupFieldsTemperature","hookupFieldsHandler","flagDetail","idAssessment","PageAccessibilityReport","hashPageAccessibilityReport","PageAccessibilityStatement","hashPageAccessibilityStatement","PageLicense","hashPageLicense","PagePrivacyPolicy","hashPagePrivacyPolicy","PageRetentionSchedule","hashPageDataRetentionSchedule","Router","pages","module","routes","loadPage","hashPage","PageClass","getClassPageFromHash","currentPage","pageJson","handlePopState","loadPageCurrent","history","pushState","navigateToUrl","appendHistory","loadPageBodyFromResponse","App","dom","setupEventListeners","start","handleGlobalClick","initPageCurrent","app","domReady","fn","readyState"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/lib/business_objects/business_objects.js b/static/js/lib/business_objects/business_objects.js index 9566a18..4c1facb 100644 --- a/static/js/lib/business_objects/business_objects.js +++ b/static/js/lib/business_objects/business_objects.js @@ -12,7 +12,7 @@ export default class BusinessObjects { static getOptionJsonFromObjectJson(objectJson, valueSelected = null) { let keyText = objectJson[flagNameAttrOptionText]; let keyValue = objectJson[flagNameAttrOptionValue]; - Utils.consoleLogIfNotProductionEnvironment({objectJson, keyText, keyValue}); + // Utils.consoleLogIfNotProductionEnvironment({objectJson, keyText, keyValue}); return BusinessObjects.getOptionJsonFromObjectJsonAndKeys(objectJson, keyText, keyValue, valueSelected); } static getObjectText(objectJson) { diff --git a/static/js/lib/events.js b/static/js/lib/events.js index 05edecd..4568dfd 100644 --- a/static/js/lib/events.js +++ b/static/js/lib/events.js @@ -7,4 +7,12 @@ export default class Events { element.classList.add(classInitialised); }); } + static hookupEventHandler(eventType, selector, callback) { + Events.initialiseEventHandler(selector, flagInitialised, (element) => { + element.addEventListener(eventType, (event) => { + event.stopPropagation(); + callback(event, element); + }); + }); + } } \ No newline at end of file diff --git a/static/js/pages/base.js b/static/js/pages/base.js index 5267a86..d8dacef 100644 --- a/static/js/pages/base.js +++ b/static/js/pages/base.js @@ -48,17 +48,8 @@ export default class BasePage { this.hookupOverlays(); } - hookupEventHandler(eventType, selector, callback) { - Events.initialiseEventHandler(selector, flagInitialised, (element) => { - element.addEventListener(eventType, (event) => { - event.stopPropagation(); - callback(event, element); - }); - }); - } - hookupNavigation() { - this.hookupEventHandler("click", idButtonHamburger, (event, element) => { + Events.hookupEventHandler("click", idButtonHamburger, (event, element) => { let overlayHamburger = document.querySelector(idOverlayHamburger); if (overlayHamburger.classList.contains(flagIsCollapsed)) { overlayHamburger.classList.remove(flagIsCollapsed); @@ -85,6 +76,7 @@ export default class BasePage { this.hookupButtonsNavDogLocations(); this.hookupButtonsNavDogButtonIcons(); this.hookupButtonsNavDogCommandButtonLinks(); + this.hookupButtonsNavDogAssessments(); } hookupEventHandler(eventType, selector, callback) { Events.initialiseEventHandler(selector, flagInitialised, (element) => { @@ -98,7 +90,7 @@ export default class BasePage { this.hookupButtonsNav('.' + flagNavHome, hashPageHome); } hookupButtonsNav(buttonSelector, hashPageNav) { - this.hookupEventHandler("click", buttonSelector, (event, button) => { + Events.hookupEventHandler("click", buttonSelector, (event, button) => { this.router.navigateToHash(hashPageNav); }); } @@ -117,7 +109,7 @@ export default class BasePage { this.hookupButtonsNav('.' + flagNavUserLogout, hashPageUserLogout); } hookupButtonsNavUserLogin() { - this.hookupEventHandler("click", '.' + flagNavUserLogin, (event, navigator) => { + Events.hookupEventHandler("click", '.' + flagNavUserLogin, (event, navigator) => { event.stopPropagation(); this.leave(); API.loginUser() @@ -154,9 +146,12 @@ export default class BasePage { hookupButtonsNavDogCommandButtonLinks() { this.hookupButtonsNav('.' + flagNavDogCommandButtonLinks, hashPageDogCommandButtonLinks); } + hookupButtonsNavDogAssessments() { + this.hookupButtonsNav('.' + flagNavDogAssessments, hashPageDogAssessments); + } hookupLogos() { - this.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, (event, element) => { + Events.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, (event, element) => { Utils.consoleLogIfNotProductionEnvironment('clicking logo'); this.router.navigateToHash(hashPageHome); }); @@ -201,9 +196,9 @@ export default class BasePage { return LocalStorage.getLocalStorage(this.hash); } - toggleShowButtonsSaveCancel(show) { // , buttonSave = null, buttonCancel = null - let buttonSave = document.querySelector('form.' + flagFilter + ' button.' + flagSave); - let buttonCancel = document.querySelector('form.' + flagFilter + ' button.' + flagCancel); + toggleShowButtonsSaveCancel(show, buttonContainerSelector = '.' + flagContainer + '.' + flagSave + '.' + flagCancel) { // , buttonSave = null, buttonCancel = null + let buttonSave = document.querySelector(buttonContainerSelector + ' button.' + flagSave); + let buttonCancel = document.querySelector(buttonContainerSelector + ' button.' + flagCancel); if (show) { buttonCancel.classList.remove(flagIsCollapsed); buttonSave.classList.remove(flagIsCollapsed); diff --git a/static/js/pages/base_table.js b/static/js/pages/base_table.js index e8fe176..994855d 100644 --- a/static/js/pages/base_table.js +++ b/static/js/pages/base_table.js @@ -73,7 +73,7 @@ export default class TableBasePage extends BasePage { filterActiveNew.setAttribute('id', flagActiveOnly); if (isChecked) filterActiveNew.classList.add(flagIsChecked); - this.hookupEventHandler("click", filterSelector, (event, filterActive) => { + Events.hookupEventHandler("click", filterSelector, (event, filterActive) => { Utils.consoleLogIfNotProductionEnvironment({ filterActive }); Utils.consoleLogIfNotProductionEnvironment({ [filterActive.tagName]: filterActive.tagName }); let svgElement = (filterActive.tagName.toUpperCase() == 'SVG') ? filterActive : filterActive.parentElement; @@ -93,7 +93,7 @@ export default class TableBasePage extends BasePage { } hookupFilter(filterFlag, handler = (event, filter) => { return this.handleChangeFilter(event, filter); }) { let filterSelector = idFormFilters + ' #' + filterFlag; - this.hookupEventHandler("change", filterSelector, handler); + Events.hookupEventHandler("change", filterSelector, handler); let filter = document.querySelector(filterSelector); let filterValuePrevious = DOM.getElementValueCurrent(filter); filter.setAttribute(attrValueCurrent, filterValuePrevious); @@ -140,7 +140,7 @@ export default class TableBasePage extends BasePage { this.hookupFilter(flagIsNotEmpty); } hookupButtonApplyFilters() { - this.hookupEventHandler("click", idButtonApplyFilters, (event, button) => { + Events.hookupEventHandler("click", idButtonApplyFilters, (event, button) => { event.stopPropagation(); this.callFilterTableContent(); }); @@ -178,6 +178,9 @@ export default class TableBasePage extends BasePage { hookupFilterCommand() { this.hookupFilter(attrIdCommand); } + hookupFilterLocation() { + this.hookupFilter(attrIdLocation); + } /* getAndLoadFilteredTableContent = () => { this.callFilterTableContent() @@ -334,11 +337,9 @@ export default class TableBasePage extends BasePage { if (this.constructor === TableBasePage) { throw new Error("Must implement hookupTableMain() method."); } - if (true) { // _rowBlank == null) { - Events.initialiseEventHandler(idTableMain, flagInitialised, (table) => { - this.cacheRowBlank(); - }); - } + Events.initialiseEventHandler(idTableMain, flagInitialised, (table) => { + this.cacheRowBlank(); + }); } cacheRowBlank() { let selectorRowNew = idTableMain + ' tbody tr.' + flagRowNew; @@ -379,79 +380,6 @@ export default class TableBasePage extends BasePage { handler(null, input); }); } - /* - handleChangeElementCellTable(event, element) { - let row = DOM.getRowFromElement(element); - let td = DOM.getCellFromElement(element); - let wasDirtyRow = DOM.hasDirtyChildrenContainer(row); - let wasDirtyElement = element.classList.contains(flagDirty); - let isDirtyElement = DOM.updateAndCheckIsElementDirty(element); - if (isDirtyElement != wasDirtyElement) { - DOM.handleDirtyElement(td, isDirtyElement); - let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row); - if (isNowDirtyRow != wasDirtyRow) { - DOM.handleDirtyElement(row, isNowDirtyRow); - let rows = this.getTableRecords(true); - let existsDirtyRecord = rows.length > 0; - this.toggleShowButtonsSaveCancel(existsDirtyRecord); - } - } - } - handleChangeElementNestedCellTable(event, element, flagColumnList = [], orderNesting = 1) { - let orderNestingTemp = orderNesting; - let row, td, nestedRowSelector; - while (orderNestingTemp > 0) { - nestedRowSelector = idTableMain; - for (let indexOrderNesting = 0; indexOrderNesting < orderNestingTemp; indexOrderNesting++) { - nestedRowSelector += ' tbody tr'; - } - row = DOM.getClosestParent(element, nestedRowSelector); - td = row.querySelector('td.' + flag); - } - let row = DOM.getRowFromElement(element); - let td = DOM.getCellFromElement(element); - let wasDirtyRow = DOM.hasDirtyChildrenContainer(row); - let wasDirtyElement = element.classList.contains(flagDirty); - let isDirtyElement = DOM.updateAndCheckIsElementDirty(element); - if (isDirtyElement != wasDirtyElement) { - DOM.handleDirtyElement(td, isDirtyElement); - let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row); - if (isNowDirtyRow != wasDirtyRow) { - DOM.handleDirtyElement(row, isNowDirtyRow); - let rows = this.getTableRecords(true); - let existsDirtyRecord = rows.length > 0; - this.toggleShowButtonsSaveCancel(existsDirtyRecord); - } - } - } - handleChangeElementSubtableCell(event, element, flagFieldSubtable) { - let rowSubtable = element.closest(idTableMain + ' td.' + flagFieldSubtable + ' tbody tr'); - let rowTable = rowSubtable.closest(idTableMain + ' > tbody > tr'); - let td = DOM.getCellFromElement(element); - // let tdSubtable = td.closest('td.' + flagFieldSubtable); - let wasDirtyRowSubtable = DOM.hasDirtyChildrenContainer(rowSubtable); - let wasDirtyRowTable = DOM.hasDirtyChildrenContainer(rowTable); - let wasDirtyElement = element.classList.contains(flagDirty); - let isDirtyElement = DOM.updateAndCheckIsElementDirty(element); - Utils.consoleLogIfNotProductionEnvironment({isDirtyElement, wasDirtyElement}); - if (isDirtyElement != wasDirtyElement) { - DOM.handleDirtyElement(td, isDirtyElement); - let isNowDirtyRowSubtable = DOM.hasDirtyChildrenContainer(rowSubtable); - Utils.consoleLogIfNotProductionEnvironment({isNowDirtyRowSubtable, wasDirtyRowSubtable}); - if (isNowDirtyRowSubtable != wasDirtyRowSubtable) { - DOM.handleDirtyElement(rowSubtable, isNowDirtyRowSubtable); - let isNowDirtyRowTable = DOM.hasDirtyChildrenContainer(rowTable); - Utils.consoleLogIfNotProductionEnvironment({isNowDirtyRowTable, wasDirtyRowTable}); - if (isNowDirtyRowTable != wasDirtyRowTable) { - DOM.handleDirtyElement(rowTable, isNowDirtyRowTable); - let rows = this.getTableRecords(true); - let existsDirtyRecord = rows.length > 0; - this.toggleShowButtonsSaveCancel(existsDirtyRecord); - } - } - } - } - */ handleChangeNestedElementCellTable(event, element) { let wasDirtyParentRows = this.getAllIsDirtyRowsInParentTree(element); let wasDirtyElement = element.classList.contains(flagDirty); @@ -493,7 +421,7 @@ export default class TableBasePage extends BasePage { hookupChangeHandlerTableCellsWhenNotCollapsed(inputSelector, handler = (event, element) => { if (!element.classList.contains(flagIsCollapsed)) this.handleChangeNestedElementCellTable(event, element); }) { - this.hookupEventHandler("change", inputSelector, handler); + Events.hookupEventHandler("change", inputSelector, handler); } hookupFieldsCodeTable() { this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagCode + ' > .' + flagCode); @@ -508,20 +436,20 @@ export default class TableBasePage extends BasePage { this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagNotes + ' > .' + flagNotes); } hookupFieldsActive(flagTable = '', handleClickRowNew = (event, element) => { this.handleClickAddRowTable(event, element); }) { - let selectorButton = 'table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody > tr > td.' + flagActive + ' .' + flagButton + '.' + flagActive; + let selectorButton = 'table.table-main' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody > tr > td.' + flagActive + ' .' + flagButton + '.' + flagActive; let selectorButtonDelete = selectorButton + '.' + flagDelete; let selectorButtonUndelete = selectorButton + ':not(.' + flagDelete + ')'; Utils.consoleLogIfNotProductionEnvironment("hookupFieldsActive: ", selectorButtonDelete, selectorButtonUndelete); this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupEventHandler( + Events.hookupEventHandler( "click" - , 'table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > thead > tr > th.' + flagActive + ' .' + flagButton + '.' + flagActive + , 'table.table-main' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > thead > tr > th.' + flagActive + ' .' + flagButton + '.' + flagActive , (event, button) => { handleClickRowNew(event, button); } ); } hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) { - this.hookupEventHandler("click", selectorButtonDelete, (event, element) => { + Events.hookupEventHandler("click", selectorButtonDelete, (event, element) => { this.handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); }); }); } @@ -546,7 +474,7 @@ export default class TableBasePage extends BasePage { this.updateAndToggleShowButtonsSaveCancel(); } hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) { - this.hookupEventHandler("click", selectorButtonUndelete, (event, element) => { + Events.hookupEventHandler("click", selectorButtonUndelete, (event, element) => { this.handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); }); }); } @@ -575,7 +503,7 @@ export default class TableBasePage extends BasePage { , changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); } ) { if (cellSelector == null) cellSelector = idTableMain + ' > tbody > tr > td.' + fieldFlag; - this.hookupEventHandler("click", cellSelector + ' div.' + fieldFlag, (event, div) => { + Events.hookupEventHandler("click", cellSelector + ' div.' + fieldFlag, (event, div) => { this.handleClickTableCellDdlPreview( event , div @@ -619,7 +547,7 @@ export default class TableBasePage extends BasePage { } /* hookupTableCellDDlPreviewsWhenNotCollapsed(cellSelector, optionList, ddlHookup = (event, element) => { this.hookupTableCellDdls(event, element); }) { - this.hookupEventHandler("click", cellSelector + ' div', (event, div) => { + Events.hookupEventHandler("click", cellSelector + ' div', (event, div) => { this.handleClickTableCellDdlPreview(event, div, optionList, cellSelector, (event, element) => { ddlHookup(event, element); }); }); } @@ -631,11 +559,12 @@ export default class TableBasePage extends BasePage { this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagIsCollapsed); } - hookupFieldsCommandCategory() { + hookupFieldsCommandCategory(idTable = null) { + if (idTable == null) idTable = idTableMain; this.hookupTableCellDdlPreviews( flagCommandCategory , Utils.getListFromDict(filterCommandCategories).sort((a, b) => a[flagName].localeCompare(b[flagName])) - , null + , idTable + ' > tbody > tr > td.' + flagCommandCategory // + ' .' + flagCommandCategory , (cellSelector) => { this.hookupCommandCategoryDdls(cellSelector); } ); } @@ -647,7 +576,11 @@ export default class TableBasePage extends BasePage { let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory); this.handleChangeNestedElementCellTable(event, ddlCategory); let idCommandCategoryRowNew = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory); - if (idCommandCategoryRowOld == idCommandCategoryRowNew) return; + if ( + idCommandCategoryRowOld == idCommandCategoryRowNew + || idCommandCategoryRowNew == 0 + ) return; + console.log({ idCommandCategoryRowNew, idCommandCategoryRowOld }); let idCommandCategoryFilter = this.getIdCommandCategoryFilter(); let tdCommand = row.querySelector('td.' + flagCommand); tdCommand.dispatchEvent(new Event('click')); @@ -673,8 +606,9 @@ export default class TableBasePage extends BasePage { }); this.handleChangeNestedElementCellTable(event, ddlCommand); } - hookupFieldsCommand() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagCommand + ' .' + flagCommand, (event, div) => { + hookupFieldsCommand(idTable = null) { + if (idTable == null) idTable = idTableMain; + Events.hookupEventHandler("click", idTable + ' > tbody > tr > td.' + flagCommand + ' div.' + flagCommand, (event, div) => { Utils.consoleLogIfNotProductionEnvironment(div); let parentTr = DOM.getRowFromElement(div); Utils.consoleLogIfNotProductionEnvironment({ div, parentTr }); @@ -698,16 +632,35 @@ export default class TableBasePage extends BasePage { this.handleClickTableCellDdlPreview( event , div - , flagCommand - , sortedCommands - , null + , flagCommand // fieldFlag + , sortedCommands // optionList + , idTable + ' > tbody > tr > td.' + flagCommand // cellSelector , (cellSelector) => { this.hookupTableCellDdls( cellSelector - , (event, element) => { this.handleChangeNestedElementCellTable(event, element); } + , (event, element) => { this.handleChangeCommandDdl(event, element); } ); } ); }); - this.hookupTableCellDdls(idTableMain + ' td.' + flagCommand + ' select.' + flagCommand); + this.hookupTableCellDdls( + idTable + ' > tbody > tr > td.' + flagCommand + ' select.' + flagCommand + , (event, element) => { this.handleChangeCommandDdl(event, element); } + ); + } + handleChangeCommandDdl(event, ddlCommand) { + // console.log("handle change command ddl"); + let row = DOM.getRowFromElement(ddlCommand); + this.handleChangeNestedElementCellTable(event, ddlCommand); + let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); + let idCommandNew = this.getIdCommandRow(row); + let commandNew = filterCommands[idCommandNew]; + // console.log({ idCommandCategoryRowOld, commandNew }); + if (commandNew == null || idCommandCategoryRowOld == commandNew[attrIdCommandCategory]) return; + let divCommandCategory = row.querySelector('td.' + flagCommandCategory + ' div'); + if (divCommandCategory) divCommandCategory.dispatchEvent(new Event('click')); + let ddlCommandCategory = row.querySelector('td.' + flagCommandCategory + ' select.' + flagCommandCategory); + DOM.setElementValueCurrent(ddlCommandCategory, commandNew[attrIdCommandCategory]); + // console.log({ ddlCommandCategory, commandNew }); + this.handleChangeNestedElementCellTable(event, ddlCommandCategory); } getIdCommandCategoryRow(tr) { let elementCommandCategory = tr.querySelector('td.' + flagCommandCategory + ' .' + flagCommandCategory); @@ -715,9 +668,10 @@ export default class TableBasePage extends BasePage { } getIdCommandCategoryFilter() { let formFilters = TableBasePage.getFormFilters(); + let idCommandCategory = 0; + if (formFilters == null) return idCommandCategory; let commandCategoryFilter = formFilters.querySelector('#' + attrIdCommandCategory); let commandFilter = formFilters.querySelector('#' + attrIdCommand); - let idCommandCategory = 0; let valueCurrentCommandCategoryFilter = DOM.getElementAttributeValueCurrent(commandCategoryFilter); Utils.consoleLogIfNotProductionEnvironment({ valueCurrentCommandCategoryFilter }); if (valueCurrentCommandCategoryFilter == "") { @@ -758,7 +712,7 @@ export default class TableBasePage extends BasePage { let elementDog = tr.querySelector('td.' + flagDog + ' .' + flagDog); return DOM.getElementAttributeValueCurrent(elementDog); } - + /* createTdActive(isActive) { let tdActive = document.createElement("td"); tdActive.classList.add(flagActive); @@ -770,7 +724,7 @@ export default class TableBasePage extends BasePage { tdActive.appendChild(buttonActive); return tdActive; } - + */ leave() { if (this.constructor === TableBasePage) { throw new Error("Must implement leave() method."); diff --git a/static/js/pages/dog/assessment.js b/static/js/pages/dog/assessment.js new file mode 100644 index 0000000..19ab5d4 --- /dev/null +++ b/static/js/pages/dog/assessment.js @@ -0,0 +1,603 @@ + +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"; + +var _rowBlankDistraction; +var _rowBlankAssessmentCommandModalityLink; + +export default class PageDogAssessment extends TableBasePage { + static hash = hashPageDogAssessment; + static attrIdRowObject = attrIdAssessment; + callSaveTableContent = API.saveAssessments; + + constructor(router) { + super(router); + this.dogMixin = new DogTableMixinPage(this); + } + + initialize() { + this.sharedInitialize(); + } + + hookupFilters() { + } + + loadRowTable(rowJson) { + if (rowJson == null) return; + if (_verbose) { Utils.consoleLogIfNotProductionEnvironment("applying data row: ", rowJson); } + } + getJsonRow(row) { + if (row == null) return; + /* + let inputTemperatureCelcius = row.querySelector('td.' + flagTemperatureCelcius + ' input'); + let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive); + */ + let jsonRow = {}; + jsonRow[attrIdAssessment] = row.getAttribute(attrIdAssessment); + return jsonRow; + } + initialiseRowNew(tbody, row) { + + } + postInitialiseRowNewCallback(tbody) { + let newRows = tbody.querySelectorAll('tr.' + flagRowNew); + let newestRow = newRows[0]; + let clickableElementsSelector = [ + 'td.' + flagWeather + ' div.' + flagWeather + , ',td.' + flagLightingLevel + ' div.' + flagLightingLevel + , ',td.' + flagLocation + ' div.' + flagLocation + , ',td.' + flagUserHandler + ' div.' + flagUserHandler + ].join(''); + newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => { + clickableElement.click(); + }); + } + + hookupTableMain() { + super.hookupTableMain(); + this.hookupTableAssessmentHeader(); + this.hookupTableDistractions(); + this.hookupTableAssessmentCommandModalityLinks(); + } + hookupTableAssessmentHeader() { + this.hookupTableAssessmentFieldWeather(); + this.hookupTableAssessmentFieldLightingLevel(); + this.hookupTableAssessmentFieldTemperature(); + this.hookupTableAssessmentFieldLocation(); + this.hookupTableAssessmentFieldUserHandler(); + this.hookupTableAssessmentFieldNotes(); + } + hookupTableAssessmentFieldWeather() { + let fieldFlag = flagWeather; + let optionList = Utils.getListFromDict(filterWeathers); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableAssessment + ' td.' + flagWeather; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableAssessmentFieldLightingLevel() { + let fieldFlag = flagLightingLevel; + let optionList = Utils.getListFromDict(filterLightingLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableAssessment + ' td.' + flagLightingLevel; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableAssessmentFieldTemperature() { + this.hookupChangeHandlerTableCells(idTableAssessment + ' td.' + flagTemperatureCelcius + ' .' + flagTemperatureCelcius); + } + hookupTableAssessmentFieldLocation() { + let fieldFlag = flagLocation; + let optionList = Utils.getListFromDict(filterLocations); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableAssessment + ' td.' + flagLocation; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableAssessmentFieldUserHandler() { + let fieldFlag = flagUserHandler; + let optionList = Utils.getListFromDict(filterUserHandlers); // .sort((a, b) => a[flagName].localeCompare(b[flagName])); + let cellSelector = idTableAssessment + ' td.' + flagUserHandler; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableAssessmentFieldNotes() { + this.hookupChangeHandlerTableCells(idTableAssessment + ' td.' + flagNotes + ' .' + flagNotes); + } + hookupTableDistractions() { + Events.initialiseEventHandler(idTableDistractions, flagInitialised, (table) => { + let selectorRowNew = idTableDistractions + ' tbody tr.' + flagRowNew; + let rowBlankTemp = document.querySelector(selectorRowNew); + Utils.consoleLogIfNotProductionEnvironment("row blank temp: ", rowBlankTemp); + let countRows = document.querySelectorAll(idTableDistractions + ' > tbody > tr').length; + _rowBlankDistraction = rowBlankTemp.cloneNode(true); + document.querySelectorAll(selectorRowNew).forEach(function(row) { + row.remove(); + }); + _rowBlankDistraction.setAttribute(attrIdDistraction, -1 - countRows); + }); + + this.hookupTableDistractionsFieldsDistractionType(); + this.hookupTableDistractionsFieldsIntensityLevelEmotional(); + this.hookupTableDistractionsFieldsIntensityLevelScent(); + this.hookupTableDistractionsFieldsIntensityLevelSight(); + this.hookupTableDistractionsFieldsIntensityLevelSound(); + this.hookupTableDistractionsFieldsIntensityLevelTouch(); + this.hookupTableDistractionsFieldsQuantity(); + this.hookupTableDistractionsFieldsProximityMetres(); + this.hookupTableDistractionsFieldsNotes(); + this.hookupTableDistractionsFieldsActive(); + } + hookupTableDistractionsFieldsDistractionType() { + let fieldFlag = flagDistractionType; + let optionList = Utils.getListFromDict(filterDistractionTypes); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableDistractions + ' td.' + flagDistractionType; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableDistractionsFieldsIntensityLevelEmotional() { + let fieldFlag = flagDistractionIntensityLevelEmotional; + let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelEmotional; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableDistractionsFieldsIntensityLevelScent() { + let fieldFlag = flagDistractionIntensityLevelScent; + let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelScent; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableDistractionsFieldsIntensityLevelSight() { + let fieldFlag = flagDistractionIntensityLevelSight; + let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelSight; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableDistractionsFieldsIntensityLevelSound() { + let fieldFlag = flagDistractionIntensityLevelSound; + let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelSound; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableDistractionsFieldsIntensityLevelTouch() { + let fieldFlag = flagDistractionIntensityLevelTouch; + let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelTouch; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableDistractionsFieldsQuantity() { + this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagQuantity + ' .' + flagQuantity); + } + hookupTableDistractionsFieldsProximityMetres() { + this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagProximityMetres + ' .' + flagProximityMetres); + } + hookupTableDistractionsFieldsNotes() { + this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagNotes + ' .' + flagNotes); + } + hookupTableDistractionsFieldsActive() { + this.hookupFieldsActive(flagDistraction, (event, element) => { this.handleClickAddRowTableDistractions(event, element); }); + } + handleClickAddRowTableDistractions(event, button) { + event.stopPropagation(); + _rowBlankDistraction.setAttribute(attrIdDistraction, -1 - _rowBlankDistraction.getAttribute(attrIdDistraction)); + let tbody = document.querySelector(idTableDistractions + ' tbody'); + if (tbody.classList.contains(flagIsCollapsed)) return; + let row = _rowBlankDistraction.cloneNode(true); + row.classList.remove(flagInitialised); + row.querySelectorAll('.' + flagInitialised).forEach(function(element) { + element.classList.remove(flagInitialised); + }); + let countRows = document.querySelectorAll(idTableDistractions + ' > tbody > tr').length; + row.setAttribute(attrIdDistraction, -1 - countRows); + tbody.prepend(row); + tbody.scrollTop = 0; + this.hookupTableDistractions(); + this.postInitialiseDistractionRowNewCallback(tbody); + } + postInitialiseDistractionRowNewCallback(tbody) { + let newRows = tbody.querySelectorAll('tr.' + flagRowNew); + let newestRow = newRows[0]; + let clickableElementsSelector = [ + 'td.' + flagDistractionType + ' div.' + flagDistractionType + , ',td.' + flagDistractionIntensityLevelEmotional + ' div.' + flagDistractionIntensityLevelEmotional + , ',td.' + flagDistractionIntensityLevelScent + ' div.' + flagDistractionIntensityLevelScent + , ',td.' + flagDistractionIntensityLevelSight + ' div.' + flagDistractionIntensityLevelSight + , ',td.' + flagDistractionIntensityLevelSound + ' div.' + flagDistractionIntensityLevelSound + , ',td.' + flagDistractionIntensityLevelTouch + ' div.' + flagDistractionIntensityLevelTouch + ].join(''); + newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => { + clickableElement.click(); + }); + } + hookupTableAssessmentCommandModalityLinks() { + Events.initialiseEventHandler(idTableAssessmentCommandModalityLinks, flagInitialised, (table) => { + let selectorRowNew = idTableAssessmentCommandModalityLinks + ' tbody tr.' + flagRowNew; + let rowBlankTemp = document.querySelector(selectorRowNew); + Utils.consoleLogIfNotProductionEnvironment("row blank temp: ", rowBlankTemp); + let countRows = document.querySelectorAll(idTableAssessmentCommandModalityLinks + ' > tbody > tr').length; + _rowBlankAssessmentCommandModalityLink = rowBlankTemp.cloneNode(true); + document.querySelectorAll(selectorRowNew).forEach(function(row) { + row.remove(); + }); + _rowBlankAssessmentCommandModalityLink.setAttribute(attrIdAssessmentCommandModalityLink, -1 - countRows); + }); + + this.hookupTableAssessmentCommandModalityLinksFieldsCommandCategory(); + this.hookupTableAssessmentCommandModalityLinksFieldsCommand(); + this.hookupTableAssessmentCommandModalityLinksFieldsCommandModality(); + this.hookupTableAssessmentCommandModalityLinksFieldsBribe(); + this.hookupTableAssessmentCommandModalityLinksFieldsDistanceFromHandler(); + this.hookupTableAssessmentCommandModalityLinksFieldsIsInHearingRangeOfHandler(); + this.hookupTableAssessmentCommandModalityLinksFieldsIsInScentRangeOfHandler(); + this.hookupTableAssessmentCommandModalityLinksFieldsIsInSightOfHandler(); + this.hookupTableAssessmentCommandModalityLinksFieldsIsOnLead(); + this.hookupTableAssessmentCommandModalityLinksFieldsTrialCount(); + this.hookupTableAssessmentCommandModalityLinksFieldsNotes(); + this.hookupTableAssessmentCommandModalityLinksFieldsResponses(); + this.hookupTableAssessmentCommandModalityLinksFieldsActive(); + } + hookupTableAssessmentCommandModalityLinksFieldsCommandCategory() { + this.hookupFieldsCommandCategory(idTableAssessmentCommandModalityLinks); + /* + let fieldFlag = flagCommandCategory; + let optionList = Utils.getListFromDict(filterCommandCategories).sort((a, b) => a[flagName].localeCompare(b[flagName])); + let cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagCommandCategory; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + , (tdSelector) => { this.hookupTableAssessmentCommandModalityLinksDdlsCommandCategory(tdSelector); } + , (event, element) => { this.handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, element); } + ); + */ + } + /* + hookupTableAssessmentCommandModalityLinksDdlsCommandCategory(ddlSelector) { + this.hookupChangeHandlerTableCells(ddlSelector, (event, element) => { this.handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, element); }); + } + handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, ddlCategory) { + let row = DOM.getRowFromElement(ddlCategory); + let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory); + this.handleChangeNestedElementCellTable(event, ddlCategory); + let idCommandCategoryRowNew = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory); + if (idCommandCategoryRowOld == idCommandCategoryRowNew) return; + let divCommand = row.querySelector('td.' + flagCommand + ' div'); + if (divCommand) divCommand.dispatchEvent(new Event('click')); + let ddlCommand = row.querySelector('td.' + flagCommand + ' select.' + flagCommand); + ddlCommand.innerHTML = ''; + ddlCommand.appendChild(DOM.createOption(null)); + let optionJson, option; + let commandsInCategory = Utils.getListFromDict(filterCommands).filter(command => + ( + command[attrIdCommandCategory] == idCommandCategoryRowNew + || idCommandCategoryRowNew == 0 + ) + ); + let sortedCommands = commandsInCategory.sort((a, b) => a[flagName].localeCompare(b[flagName])); + sortedCommands.forEach((command) => { + optionJson = BusinessObjects.getOptionJsonFromObjectJson(command); + option = DOM.createOption(optionJson); + ddlCommand.appendChild(option); + }); + this.handleChangeNestedElementCellTable(event, ddlCommand); + } + */ + hookupTableAssessmentCommandModalityLinksFieldsCommand() { + this.hookupFieldsCommand(idTableAssessmentCommandModalityLinks); + } + hookupTableAssessmentCommandModalityLinksFieldsCommandModality() { + let fieldFlag = flagCommandModality; + let optionList = Utils.getListFromDict(filterCommandModalities); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagCommandModality; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableAssessmentCommandModalityLinksFieldsBribe() { + let fieldFlag = flagBribe; + let optionList = Utils.getListFromDict(filterBribes); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagBribe; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableAssessmentCommandModalityLinksFieldsDistanceFromHandler() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagDistanceFromHandler + ' .' + flagDistanceFromHandler); + } + hookupTableAssessmentCommandModalityLinksFieldsIsInHearingRangeOfHandler() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInHearingRangeOfHandler + ' .' + flagIsInHearingRangeOfHandler); + } + hookupTableAssessmentCommandModalityLinksFieldsIsInScentRangeOfHandler() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInScentRangeOfHandler + ' .' + flagIsInScentRangeOfHandler); + } + hookupTableAssessmentCommandModalityLinksFieldsIsInSightOfHandler() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInSightOfHandler + ' .' + flagIsInSightOfHandler); + } + hookupTableAssessmentCommandModalityLinksFieldsIsOnLead() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsOnLead + ' .' + flagIsOnLead); + } + hookupTableAssessmentCommandModalityLinksFieldsTrialCount() { + // this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagTrialCount + ' .' + flagTrialCount); + } + hookupTableAssessmentCommandModalityLinksFieldsNotes() { + this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' > tbody > tr > td.' + flagNotes + ' .' + flagNotes); + } + hookupTableAssessmentCommandModalityLinksFieldsResponses() { + let eventType = "click"; + let selector = idTableAssessmentCommandModalityLinks + ' td.' + flagAssessmentResponse + ' div.' + flagAssessmentResponse; + let handler = (event, element) => { + let parentTd = DOM.getCellFromElement(element); + let responsesTable = document.createElement("table"); + responsesTable.id = idTableAssessmentResponses.replace("#", ""); + responsesTable.classList.add(flagTableMain, flagAssessmentResponse); + + let head = document.createElement("thead"); + let headRow = document.createElement("tr"); + let thResponseQualityMetric = document.createElement("th"); + thResponseQualityMetric.classList.add(flagResponseQualityMetric); + thResponseQualityMetric.innerText = 'Response Quality Metric'; + headRow.appendChild(thResponseQualityMetric); + let thObedienceLevel = document.createElement("th"); + thObedienceLevel.classList.add(flagObedienceLevel); + thObedienceLevel.innerText = 'Obedience Level'; + headRow.appendChild(thObedienceLevel); + let thValueMeasured = document.createElement("th"); + thValueMeasured.classList.add(flagValueMeasured); + thValueMeasured.innerText = 'Value Measured'; + headRow.appendChild(thValueMeasured); + let thNotes = document.createElement("th"); + thNotes.classList.add(flagNotes); + thNotes.innerText = 'Notes'; + headRow.appendChild(thNotes); + let thActive = document.createElement("th"); + thActive.classList.add(flagActive); + let templateAddIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagAdd); + thActive.appendChild(templateAddIcon.cloneNode(true)); + headRow.appendChild(thActive); + head.appendChild(headRow); + responsesTable.appendChild(head); + + let body = document.createElement("tbody"); + + let assessmentCommandModalityLink = assessment[flagAssessmentCommandModalityLink]; + let responses = (assessmentCommandModalityLink == null) ? null : assessmentCommandModalityLink[flagAssessmentResponse]; + + if (responses != null && responses.length > 0) { + for (let response in responses) { + let row = PageDogAssessment.createNewRowTableAssessmentResponses(response); + body.appendChild(row); + } + } + responsesTable.appendChild(body); + + parentTd.innerHTML = responsesTable.outerHTML; + + this.hookupTablesAssessmentResponses(); + }; + Events.hookupEventHandler( + eventType + , selector + , handler + ); + this.hookupTablesAssessmentResponses(); + } + static createNewRowTableAssessmentResponses(response) { + if (response == null) response = { + [attrIdAssessmentResponse]: null + , [flagResponseQualityMetric]: 0 + , [flagObedienceLevel]: 0 + , [flagValueMeasured]: '' + , [flagNotes]: '' + , [flagActive]: true + }; + let isNew = (response[attrIdAssessmentResponse] == null || response[attrIdAssessmentResponse] < 1); + let row = document.createElement("tr"); + row.classList.add(flagAssessmentResponse); + if (isNew) row.classList.add(flagRowNew); + row.setAttribute(attrIdAssessmentResponse, response[attrIdAssessmentResponse]); + + let tdResponseQualityMetric = document.createElement("td"); + tdResponseQualityMetric.classList.add(flagResponseQualityMetric, flagDdlPreview); + let divResponseQualityMetric = document.createElement("div"); + divResponseQualityMetric.classList.add(flagResponseQualityMetric); + DOM.setElementAttributesValuesCurrentAndPrevious(divResponseQualityMetric, response[flagResponseQualityMetric]); + divResponseQualityMetric.innerText = response[flagResponseQualityMetric]; + tdResponseQualityMetric.appendChild(divResponseQualityMetric); + row.appendChild(tdResponseQualityMetric); + + let tdObedienceLevel = document.createElement("td"); + tdObedienceLevel.classList.add(flagObedienceLevel, flagDdlPreview); + let divObedienceLevel = document.createElement("div"); + divObedienceLevel.classList.add(flagObedienceLevel); + DOM.setElementAttributesValuesCurrentAndPrevious(divObedienceLevel, response[flagObedienceLevel]); + divObedienceLevel.innerText = response[flagObedienceLevel]; + tdObedienceLevel.appendChild(divObedienceLevel); + row.appendChild(tdObedienceLevel); + + let tdValueMeasured = document.createElement("td"); + tdValueMeasured.classList.add(flagValueMeasured, flagDdlPreview); + let inputValueMeasured = document.createElement("input"); + inputValueMeasured.type = "number"; + inputValueMeasured.classList.add(flagValueMeasured); + DOM.setElementAttributesValuesCurrentAndPrevious(inputValueMeasured, response[flagValueMeasured]); + inputValueMeasured.value = response[flagValueMeasured]; + tdValueMeasured.appendChild(inputValueMeasured); + row.appendChild(tdValueMeasured); + + let tdNotes = document.createElement("td"); + tdNotes.classList.add(flagNotes, flagDdlPreview); + let inputNotes = document.createElement("textarea"); + inputNotes.classList.add(flagNotes); + DOM.setElementAttributesValuesCurrentAndPrevious(inputNotes, response[flagNotes]); + inputNotes.value = response[flagNotes]; + tdNotes.appendChild(inputNotes); + row.appendChild(tdNotes); + + let tdActive = document.createElement("td"); + tdActive.classList.add(flagActive, flagDdlPreview); + let templateAddIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagAdd); + let templateDeleteIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagDelete); + let buttonActive = (response[flagActive]) ? templateDeleteIcon.cloneNode(true) : templateAddIcon.cloneNode(true); + tdActive.appendChild(buttonActive); + row.appendChild(tdActive); + + return row; + } + hookupTablesAssessmentResponses() { + this.hookupTableAssessmentResponsesFieldsResponseQualityMetric(); + this.hookupTableAssessmentResponsesFieldsObedienceLevel(); + this.hookupTableAssessmentResponsesFieldsValueMeasured(); + this.hookupTableAssessmentResponsesFieldsNotes(); + this.hookupTableAssessmentResponsesFieldsActive(); + } + hookupTableAssessmentResponsesFieldsResponseQualityMetric() { + let fieldFlag = flagResponseQualityMetric; + let optionList = Utils.getListFromDict(filterResponseQualityMetrics); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableAssessmentResponses + ' td.' + flagResponseQualityMetric; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableAssessmentResponsesFieldsObedienceLevel() { + let fieldFlag = flagObedienceLevel; + let optionList = Utils.getListFromDict(filterObedienceLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + let cellSelector = idTableAssessmentResponses + ' td.' + flagObedienceLevel; + this.hookupTableCellDdlPreviews( + fieldFlag + , optionList + , cellSelector + ); + } + hookupTableAssessmentResponsesFieldsValueMeasured() { + this.hookupChangeHandlerTableCells(idTableAssessmentResponses + ' td.' + flagValueMeasured + ' .' + flagValueMeasured); + } + hookupTableAssessmentResponsesFieldsNotes() { + this.hookupChangeHandlerTableCells(idTableAssessmentResponses + ' td.' + flagNotes + ' .' + flagNotes); + } + hookupTableAssessmentResponsesFieldsActive() { + this.hookupFieldsActive(flagAssessmentResponse, (event, element) => { this.handleClickAddRowTableAssessmentResponses(event, element); }); + } + handleClickAddRowTableAssessmentResponses(event, button) { + event.stopPropagation(); + let tableResponses = DOM.getClosestParent(button, "table"); + let tbody = tableResponses.querySelector(":scope > tbody"); + let row = PageDogAssessment.createNewRowTableAssessmentResponses(null); + if (tbody.classList.contains(flagIsCollapsed)) return; + row.classList.remove(flagInitialised); + row.querySelectorAll('.' + flagInitialised).forEach(function(element) { + element.classList.remove(flagInitialised); + }); + let countRows = document.querySelectorAll(attrIdAssessmentResponse + ' > tbody > tr').length; + row.setAttribute(attrIdAssessmentResponse, -1 - countRows); + tbody.prepend(row); + tbody.scrollTop = 0; + this.hookupTablesAssessmentResponses(); + this.postInitialiseAssessmentResponseRowNewCallback(tbody); + } + postInitialiseAssessmentResponseRowNewCallback(tbody) { + let newRows = tbody.querySelectorAll('tr.' + flagRowNew); + let newestRow = newRows[0]; + let clickableElementsSelector = [ + 'td.' + flagResponseQualityMetric + ' div.' + flagResponseQualityMetric + , ',td.' + flagObedienceLevel + ' div.' + flagObedienceLevel + , ',td.' + flagValueMeasured + ' div.' + flagValueMeasured + , ',td.' + flagNotes + ' div.' + flagNotes + ].join(''); + newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => { + clickableElement.click(); + }); + let countActiveRows = tbody.querySelectorAll('td.' + flagActive + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagDelete).length; + /* + newRows.filter(row => { + let activeButton = row.querySelector('td.' + flagActive + ' .' + flagButton + '.' + flagIcon + '.' + flagActive); + return activeButton.classList.contains(flagDelete); + }).length; + */ + let rowAssessmentCommandModalityLink = DOM.getRowFromElement(tbody); + let divTrialCount = rowAssessmentCommandModalityLink.querySelector('td.' + flagTrialCount + ' div.' + flagTrialCount); + divTrialCount.innerText = countActiveRows; + } + + hookupTableAssessmentCommandModalityLinksFieldsActive() { + this.hookupFieldsActive(flagAssessmentCommandModalityLink, (event, element) => { this.handleClickAddRowTableAssessmentCommandModalityLinks(event, element); }); + } + handleClickAddRowTableAssessmentCommandModalityLinks(event, button) { + event.stopPropagation(); + _rowBlankAssessmentCommandModalityLink.setAttribute(attrIdAssessmentCommandModalityLink, -1 - _rowBlankAssessmentCommandModalityLink.getAttribute(attrIdAssessmentCommandModalityLink)); + let tbody = document.querySelector(idTableAssessmentCommandModalityLinks + ' tbody'); + if (tbody.classList.contains(flagIsCollapsed)) return; + let row = _rowBlankAssessmentCommandModalityLink.cloneNode(true); + row.classList.remove(flagInitialised); + row.querySelectorAll('.' + flagInitialised).forEach(function(element) { + element.classList.remove(flagInitialised); + }); + let countRows = document.querySelectorAll(idTableAssessmentCommandModalityLinks + ' > tbody > tr').length; + row.setAttribute(attrIdAssessmentCommandModalityLink, -1 - countRows); + tbody.prepend(row); + tbody.scrollTop = 0; + this.hookupTableAssessmentCommandModalityLinks(); + this.postInitialiseAssessmentCommandModalityLinkRowNewCallback(tbody); + } + postInitialiseAssessmentCommandModalityLinkRowNewCallback(tbody) { + let newRows = tbody.querySelectorAll('tr.' + flagRowNew); + let newestRow = newRows[0]; + let clickableElementsSelector = [ + 'td.' + flagCommandCategory + ' div.' + flagCommandCategory + , ',td.' + flagCommand + ' div.' + flagCommand + , ',td.' + flagCommandModality + ' div.' + flagCommandModality + , ',td.' + flagBribe + ' div.' + flagBribe + ].join(''); + newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => { + clickableElement.click(); + }); + } + + leave() { + super.leave(); + } +} + diff --git a/static/js/pages/dog/assessments.js b/static/js/pages/dog/assessments.js new file mode 100644 index 0000000..d793cbc --- /dev/null +++ b/static/js/pages/dog/assessments.js @@ -0,0 +1,169 @@ + +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 PageDogAssessments extends TableBasePage { + static hash = hashPageDogAssessments; + static attrIdRowObject = attrIdAssessment; + callSaveTableContent = API.saveAssessments; + + constructor(router) { + super(router); + this.dogMixin = new DogTableMixinPage(this); + } + + initialize() { + this.sharedInitialize(); + } + + hookupFilters() { + this.sharedHookupFilters(); + this.hookupFilterWeather(); + this.hookupFilterLightingLevel(); + this.hookupFilterLocation(); + this.hookupFilterHandler(); + this.hookupFilterActive(); + } + hookupFilterWeather() { + this.hookupFilter(attrIdWeather); + } + hookupFilterLightingLevel() { + this.hookupFilter(attrIdLightingLevel); + } + hookupFilterHandler() { + this.hookupFilter(flagUserHandler); + } + + loadRowTable(rowJson) { + if (rowJson == null) return; + if (_verbose) { Utils.consoleLogIfNotProductionEnvironment("applying data row: ", rowJson); } + } + getJsonRow(row) { + if (row == null) return; + let inputTemperatureCelcius = row.querySelector('td.' + flagTemperatureCelcius + ' input'); + let inputNotes = row.querySelector('td.' + flagNotes + ' textarea'); + let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive); + + let jsonRow = {}; + jsonRow[attrIdAssessment] = row.getAttribute(attrIdAssessment); + jsonRow[attrIdWeather] = this.getIdWeatherRow(row); + jsonRow[attrIdLightingLevel] = this.getIdLightingLevelRow(row); + jsonRow[flagTemperatureCelcius] = DOM.getElementAttributeValueCurrent(inputTemperatureCelcius); + jsonRow[attrIdLocation] = this.getIdLocationRow(row); + jsonRow[flagUserHandler] = this.getIdUserHandlerRow(row); + jsonRow[flagNotes] = DOM.getElementAttributeValueCurrent(inputNotes); + jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); + return jsonRow; + } + getIdWeatherRow(tr) { + let elementWeather = tr.querySelector('td.' + flagWeather + ' .' + flagWeather); + return DOM.getElementAttributeValueCurrent(elementWeather); + } + getIdLightingLevelRow(tr) { + let elementLightingLevel = tr.querySelector('td.' + flagLightingLevel + ' .' + flagLightingLevel); + return DOM.getElementAttributeValueCurrent(elementLightingLevel); + } + getIdLocationRow(tr) { + let elementLocation = tr.querySelector('td.' + flagLocation + ' .' + flagLocation); + return DOM.getElementAttributeValueCurrent(elementLocation); + } + getIdUserHandlerRow(tr) { + let elementUserHandler = tr.querySelector('td.' + flagUserHandler + ' .' + flagUserHandler); + return DOM.getElementAttributeValueCurrent(elementUserHandler); + } + initialiseRowNew(tbody, row) { + + } + postInitialiseRowNewCallback(tbody) { + let newRows = tbody.querySelectorAll('tr.' + flagRowNew); + let newestRow = newRows[0]; + let clickableElementsSelector = [ + 'td.' + flagWeather + ' div.' + flagWeather + , ',td.' + flagLightingLevel + ' div.' + flagLightingLevel + , ',td.' + flagLocation + ' div.' + flagLocation + , ',td.' + flagUserHandler + ' div.' + flagUserHandler + ].join(''); + newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => { + clickableElement.click(); + }); + } + + hookupTableMain() { + super.hookupTableMain(); + this.hookupFieldsDetail(); + this.hookupFieldsWeather(); + this.hookupFieldsLightingLevel(); + this.hookupFieldsTemperature(); + this.dogMixin.hookupFieldsLocation(); + this.hookupFieldsHandler(); + this.hookupFieldsNotesTable(); + this.hookupFieldsActive(); + } + hookupFieldsDetail() { + Events.hookupEventHandler( + "click" // eventType + , idTableMain + ' td.' + flagDetail + ' button.' + flagDetail // selector + , (event, element) => { + let parentTr = DOM.getRowFromElement(element); + let idAssessment = parentTr.getAttribute(attrIdAssessment); + /* + console.log("click detail"); + console.log({ element, parentTr, idAssessment }); + const data = {}; + const params = { + [attrIdAssessment]: idAssessment + }; + API.request( + hashPageDogAssessment // hashEndpoint + , 'GET' // method + , data + , params + ); + */ + + let formFilters = TableBasePage.getFormFilters(); + let filtersJson = DOM.convertForm2JSON(formFilters); + filtersJson[attrIdAssessment] = idAssessment; + Utils.consoleLogIfNotProductionEnvironment("hookupFieldsDetail"); + Utils.consoleLogIfNotProductionEnvironment("formFilters"); + Utils.consoleLogIfNotProductionEnvironment(formFilters); + Utils.consoleLogIfNotProductionEnvironment("filtersJson"); + Utils.consoleLogIfNotProductionEnvironment(filtersJson); + this.leave(); + API.goToHash(hashPageDogAssessment, filtersJson); + } + ); + } + hookupFieldsWeather() { + this.hookupTableCellDdlPreviews( + flagWeather + , Utils.getListFromDict(filterWeathers) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + ); + } + hookupFieldsLightingLevel() { + this.hookupTableCellDdlPreviews( + flagLightingLevel + , Utils.getListFromDict(filterLightingLevels) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + ); + } + hookupFieldsTemperature() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagTemperatureCelcius + ' input.' + flagTemperatureCelcius); + } + hookupFieldsHandler() { + this.hookupTableCellDdlPreviews( + flagUserHandler + , Utils.getListFromDict(filterUserHandlers) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + ); + } + + leave() { + super.leave(); + } +} + diff --git a/static/js/pages/dog/command_button_links.js b/static/js/pages/dog/command_button_links.js index 61b2fab..c1a5251 100644 --- a/static/js/pages/dog/command_button_links.js +++ b/static/js/pages/dog/command_button_links.js @@ -41,9 +41,6 @@ export default class PageDogCommandButtonLinks extends TableBasePage { hookupFilterButtonIcon() { this.hookupFilter(attrIdButtonIcon); } - hookupFilterLocation() { - this.hookupFilter(attrIdLocation); - } loadRowTable(rowJson) { if (rowJson == null) return; @@ -69,7 +66,7 @@ export default class PageDogCommandButtonLinks extends TableBasePage { } postInitialiseRowNewCallback(tbody) { let newRows = tbody.querySelectorAll('tr.' + flagRowNew); - let newestRow = newRows[newRows.length - 1]; + let newestRow = newRows[0]; let clickableElementsSelector = [ 'td.' + flagDog + ' div.' + flagDog , ',td.' + flagCommandCategory + ' div.' + flagCommandCategory @@ -87,7 +84,7 @@ export default class PageDogCommandButtonLinks extends TableBasePage { this.hookupFieldsButtonShape(); this.hookupFieldsColour(); this.hookupFieldsButtonIcon(); - this.hookupFieldsLocation(); + this.dogMixin.hookupFieldsLocation(); this.hookupFieldsActive(); } hookupFieldsButtonShape() { @@ -108,12 +105,6 @@ export default class PageDogCommandButtonLinks extends TableBasePage { , Utils.getListFromDict(filterButtonIcons) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) ); } - hookupFieldsLocation() { - this.hookupTableCellDdlPreviews( - flagLocation - , Utils.getListFromDict(filterLocations) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) - ); - } leave() { super.leave(); diff --git a/static/js/pages/dog/dog_command_links.js b/static/js/pages/dog/dog_command_links.js index cd2fff7..af6dc61 100644 --- a/static/js/pages/dog/dog_command_links.js +++ b/static/js/pages/dog/dog_command_links.js @@ -54,7 +54,7 @@ export default class PageDogDogCommandLinks extends TableBasePage { } postInitialiseRowNewCallback(tbody) { let newRows = tbody.querySelectorAll('tr.' + flagRowNew); - let newestRow = newRows[newRows.length - 1]; + let newestRow = newRows[0]; let clickableElementsSelector = [ 'td.' + flagDog + ' div.' + flagDog , ',td.' + flagCommandCategory + ' div.' + flagCommandCategory diff --git a/static/js/pages/dog/locations.js b/static/js/pages/dog/locations.js index 950ef0b..140b498 100644 --- a/static/js/pages/dog/locations.js +++ b/static/js/pages/dog/locations.js @@ -95,7 +95,7 @@ export default class PageDogLocations extends TableBasePage { */ let cellSelector = idTableMain + ' > tbody > tr > td.' + flagLocationParent; - this.hookupEventHandler("click", cellSelector + ' div.' + flagLocationParent, (event, div) => { + Events.hookupEventHandler("click", cellSelector + ' div.' + flagLocationParent, (event, div) => { let row = DOM.getRowFromElement(div); let idLocationRow = Number(row.getAttribute(attrIdLocation)); Utils.consoleLogIfNotProductionEnvironment({ idLocationRow }); diff --git a/static/js/pages/dog/mixin_table.js b/static/js/pages/dog/mixin_table.js index d835352..ab2e5ea 100644 --- a/static/js/pages/dog/mixin_table.js +++ b/static/js/pages/dog/mixin_table.js @@ -6,6 +6,7 @@ import Validation from "../../lib/validation.js"; import DOM from "../../dom.js"; import { isEmpty } from "../../lib/utils.js"; import DogMixinPage from "./mixin.js"; +import Utils from "../../lib/utils.js"; export default class DogTableMixinPage extends DogMixinPage { constructor(pageCurrent) { @@ -22,4 +23,10 @@ export default class DogTableMixinPage extends DogMixinPage { hookupTable() { // Implement table-specific functionality here } + hookupFieldsLocation() { + this.page.hookupTableCellDdlPreviews( + flagLocation + , Utils.getListFromDict(filterLocations) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) + ); + } } \ No newline at end of file diff --git a/static/js/router.js b/static/js/router.js index 5d08f77..7344f86 100644 --- a/static/js/router.js +++ b/static/js/router.js @@ -11,6 +11,8 @@ import PageDogDogCommandLinks from './pages/dog/dog_command_links.js'; import PageDogLocations from './pages/dog/locations.js'; 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'; // Legal import PageAccessibilityReport from './pages/legal/accessibility_report.js'; import PageAccessibilityStatement from './pages/legal/accessibility_statement.js'; @@ -42,6 +44,8 @@ export default class Router { this.pages[hashPageDogLocations] = { name: 'PageDogLocations', module: PageDogLocations }; this.pages[hashPageDogButtonIcons] = { name: 'PageDogButtonIcons', module: PageDogButtonIcons }; this.pages[hashPageDogCommandButtonLinks] = { name: 'PageDogCommandButtonLinks', module: PageDogCommandButtonLinks }; + this.pages[hashPageDogAssessment] = { name: 'PageDogAssessment', module: PageDogAssessment }; + this.pages[hashPageDogAssessments] = { name: 'PageDogAssessments', module: PageDogAssessments }; // Legal this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', module: PageAccessibilityStatement }; this.pages[hashPageDataRetentionSchedule] = { name: 'PageDataRetentionSchedule', module: PageRetentionSchedule }; @@ -64,6 +68,8 @@ export default class Router { this.routes[hashPageDogLocations] = (isPopState = false) => this.navigateToHash(hashPageDogLocations, isPopState); this.routes[hashPageDogButtonIcons] = (isPopState = false) => this.navigateToHash(hashPageDogButtonIcons, isPopState); 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); // Legal this.routes[hashPageAccessibilityStatement] = (isPopState = false) => this.navigateToHash(hashPageAccessibilityStatement, isPopState); this.routes[hashPageDataRetentionSchedule] = (isPopState = false) => this.navigateToHash(hashPageDataRetentionSchedule, isPopState); diff --git a/templates/components/common/buttons/_buttons_save_cancel.html b/templates/components/common/buttons/_buttons_save_cancel.html index 60d260c..dfa49cc 100644 --- a/templates/components/common/buttons/_buttons_save_cancel.html +++ b/templates/components/common/buttons/_buttons_save_cancel.html @@ -12,38 +12,38 @@ {% elif block_id == 'button_clear_filters' %} {% elif block_id == 'buttons_table_default' %} -
+
-
- {% set block_id = 'button_apply_filters' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
- {#
- {% set block_id = 'button_add' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
- #} -
-
- {% set block_id = 'button_save' %} + {% set block_id = 'button_apply_filters' %} {% include 'components/common/buttons/_buttons_save_cancel.html' %}
{# -
- {% set block_id = 'button_cancel' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
+
+ {% set block_id = 'button_add' %} + {% include 'components/common/buttons/_buttons_save_cancel.html' %} +
#} -
-
-
- {% set block_id = 'button_cancel' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} +
+
+ {% set block_id = 'button_save' %} + {% include 'components/common/buttons/_buttons_save_cancel.html' %} +
+ {# +
+ {% set block_id = 'button_cancel' %} + {% include 'components/common/buttons/_buttons_save_cancel.html' %} +
+ #} +
+
+
+ {% set block_id = 'button_cancel' %} + {% include 'components/common/buttons/_buttons_save_cancel.html' %} +
-
{% elif block_id == 'container_buttons_save_cancel' %}
diff --git a/templates/components/common/buttons/_icon_add.html b/templates/components/common/buttons/_icon_add.html index 3ddafef..41411db 100644 --- a/templates/components/common/buttons/_icon_add.html +++ b/templates/components/common/buttons/_icon_add.html @@ -10,6 +10,7 @@ diff --git a/templates/components/common/buttons/_icon_trash.html b/templates/components/common/buttons/_icon_trash.html index 9691d52..06068b7 100644 --- a/templates/components/common/buttons/_icon_trash.html +++ b/templates/components/common/buttons/_icon_trash.html @@ -10,6 +10,7 @@ diff --git a/templates/components/dog/_preview_DDL_bribe.html b/templates/components/dog/_preview_DDL_bribe.html new file mode 100644 index 0000000..de9305c --- /dev/null +++ b/templates/components/dog/_preview_DDL_bribe.html @@ -0,0 +1,5 @@ + +{% set value_previous = '0' if is_blank_row else bribe_preview.id_bribe %} +{% set text_previous = '' if is_blank_row else bribe_preview.name %} + +
{{ text_previous }}
diff --git a/templates/components/dog/_preview_DDL_button_shape.html b/templates/components/dog/_preview_DDL_button_shape.html index 9dcc0b6..1c81606 100644 --- a/templates/components/dog/_preview_DDL_button_shape.html +++ b/templates/components/dog/_preview_DDL_button_shape.html @@ -1,5 +1,5 @@ -{% set value_previous = '0' if is_blank_row else button_shape.id_button_shape %} -{% set text_previous = '' if is_blank_row else button_shape.name %} +{% set value_previous = '0' if is_blank_row else button_shape_preview.id_button_shape %} +{% set text_previous = '' if is_blank_row else button_shape_preview.name %}
{{ text_previous }}
diff --git a/templates/components/dog/_preview_DDL_colour.html b/templates/components/dog/_preview_DDL_colour.html index b323d3f..e684143 100644 --- a/templates/components/dog/_preview_DDL_colour.html +++ b/templates/components/dog/_preview_DDL_colour.html @@ -1,5 +1,5 @@ -{% set value_previous = '0' if is_blank_row else colour.id_colour %} -{% set text_previous = '' if is_blank_row else colour.name %} +{% set value_previous = '0' if is_blank_row else colour_preview.id_colour %} +{% set text_previous = '' if is_blank_row else colour_preview.name %}
{{ text_previous }}
diff --git a/templates/components/dog/_preview_DDL_command.html b/templates/components/dog/_preview_DDL_command.html index 8545282..33a5dfd 100644 --- a/templates/components/dog/_preview_DDL_command.html +++ b/templates/components/dog/_preview_DDL_command.html @@ -1,5 +1,5 @@ -{% set value_previous = '0' if is_blank_row else command.id_command %} -{% set text_previous = '' if is_blank_row else command.name %} +{% set value_previous = '0' if is_blank_row else command_preview.id_command %} +{% set text_previous = '' if is_blank_row else command_preview.name %}
{{ text_previous }}
diff --git a/templates/components/dog/_preview_DDL_command_category.html b/templates/components/dog/_preview_DDL_command_category.html index dbd01b2..bdd7e90 100644 --- a/templates/components/dog/_preview_DDL_command_category.html +++ b/templates/components/dog/_preview_DDL_command_category.html @@ -1,5 +1,5 @@ -{% set value_previous = '0' if is_blank_row else command_category.id_command_category %} -{% set text_previous = '' if is_blank_row else command_category.name %} +{% set value_previous = '0' if is_blank_row else command_category_preview.id_command_category %} +{% set text_previous = '' if is_blank_row else command_category_preview.name %}
{{ text_previous }}
diff --git a/templates/components/dog/_preview_DDL_command_modality.html b/templates/components/dog/_preview_DDL_command_modality.html new file mode 100644 index 0000000..c9c05d7 --- /dev/null +++ b/templates/components/dog/_preview_DDL_command_modality.html @@ -0,0 +1,5 @@ + +{% set value_previous = '0' if is_blank_row else command_modality_preview.id_command_modality %} +{% set text_previous = '' if is_blank_row else command_modality_preview.name %} + +
{{ text_previous }}
diff --git a/templates/components/dog/_preview_DDL_distraction_intensity_level.html b/templates/components/dog/_preview_DDL_distraction_intensity_level.html new file mode 100644 index 0000000..2efc00a --- /dev/null +++ b/templates/components/dog/_preview_DDL_distraction_intensity_level.html @@ -0,0 +1,7 @@ + +{% with _attribute_text = '' if (attribute_text is not defined or attribute_text is none) else attribute_text %} + {% set value_previous = '0' if (is_blank_row or (intensity_level_preview is not defined) or (intensity_level_preview is none) or (intensity_level_preview.id_intensity_level is none)) else intensity_level_preview.id_intensity_level %} + {% set text_previous = '' if (is_blank_row or (intensity_level_preview is not defined) or (intensity_level_preview is none)) else model.format_null_string_as_blank(intensity_level_preview.name) %} + +
{{ text_previous }}
+{% endwith %} \ No newline at end of file diff --git a/templates/components/dog/_preview_DDL_distraction_type.html b/templates/components/dog/_preview_DDL_distraction_type.html new file mode 100644 index 0000000..437cc5a --- /dev/null +++ b/templates/components/dog/_preview_DDL_distraction_type.html @@ -0,0 +1,5 @@ + +{% set value_previous = '0' if is_blank_row else distraction_type_preview.id_distraction_type %} +{% set text_previous = '' if is_blank_row else distraction_type_preview.name %} + +
{{ text_previous }}
diff --git a/templates/components/dog/_preview_DDL_dog.html b/templates/components/dog/_preview_DDL_dog.html index 557a9f0..06e13db 100644 --- a/templates/components/dog/_preview_DDL_dog.html +++ b/templates/components/dog/_preview_DDL_dog.html @@ -1,5 +1,5 @@ -{% set value_previous = '0' if is_blank_row else dog.id_dog %} -{% set text_previous = '' if is_blank_row else dog.name %} +{% set value_previous = '0' if is_blank_row else dog_preview.id_dog %} +{% set text_previous = '' if is_blank_row else dog_preview.name %}
{{ text_previous }}
diff --git a/templates/components/dog/_preview_DDL_image.html b/templates/components/dog/_preview_DDL_image.html index 3dc6e8c..d0f5df0 100644 --- a/templates/components/dog/_preview_DDL_image.html +++ b/templates/components/dog/_preview_DDL_image.html @@ -1,7 +1,7 @@ {% with _attribute_text = '' if (attribute_text is not defined or attribute_text is none) else attribute_text %} - {% set value_previous = '0' if (is_blank_row or (image is not defined) or (image is none) or (image.id_image is none)) else image.id_image %} - {% set text_previous = '' if (is_blank_row or (image is not defined) or (image is none)) else model.format_null_string_as_blank(image.name) %} + {% set value_previous = '0' if (is_blank_row or (image_preview is not defined) or (image_preview is none) or (image_preview.id_image is none)) else image_preview.id_image %} + {% set text_previous = '' if (is_blank_row or (image_preview is not defined) or (image_preview is none)) else model.format_null_string_as_blank(image_preview.name) %}
{{ text_previous }}
{% endwith %} \ No newline at end of file diff --git a/templates/components/dog/_preview_DDL_lighting_level.html b/templates/components/dog/_preview_DDL_lighting_level.html new file mode 100644 index 0000000..6f8259c --- /dev/null +++ b/templates/components/dog/_preview_DDL_lighting_level.html @@ -0,0 +1,5 @@ + +{% set value_previous = '0' if is_blank_row else lighting_level_preview.id_lighting_level %} +{% set text_previous = '' if is_blank_row else lighting_level_preview.name %} + +
{{ text_previous }}
diff --git a/templates/components/dog/_preview_DDL_user.html b/templates/components/dog/_preview_DDL_user.html new file mode 100644 index 0000000..191c5a5 --- /dev/null +++ b/templates/components/dog/_preview_DDL_user.html @@ -0,0 +1,7 @@ + +{% with _attribute_text = '' if (attribute_text is not defined or attribute_text is none) else attribute_text %} + {% set value_previous = '0' if (is_blank_row or (user_preview is not defined) or (user_preview is none) or (user_preview.id_user is none)) else user_preview.id_user %} + {% set text_previous = '' if (is_blank_row or (user_preview is not defined) or (user_preview is none)) else model.format_null_string_as_blank(user_preview.get_name()) %} + +
{{ text_previous }}
+{% endwith %} \ No newline at end of file diff --git a/templates/components/dog/_preview_DDL_weather.html b/templates/components/dog/_preview_DDL_weather.html new file mode 100644 index 0000000..9e36721 --- /dev/null +++ b/templates/components/dog/_preview_DDL_weather.html @@ -0,0 +1,5 @@ + +{% set value_previous = '0' if is_blank_row else weather_preview.id_weather %} +{% set text_previous = '' if is_blank_row else weather_preview.name %} + +
{{ text_previous }}
diff --git a/templates/components/dog/_preview_table_assessment_response.html b/templates/components/dog/_preview_table_assessment_response.html new file mode 100644 index 0000000..af4606e --- /dev/null +++ b/templates/components/dog/_preview_table_assessment_response.html @@ -0,0 +1,11 @@ + + +
+ {% if is_blank_row or assessment_response_previews == none or assessment_response_previews | length == 0 %} + Add response + {% else %} + {% for assessment_response_preview in assessment_response_previews %} +
{{ assessment_response_preview.response_quality_metric.name }} - {{ assessment_response_preview.obedience_level.name }}
+ {% endfor %} + {% endif %} +
\ No newline at end of file diff --git a/templates/components/dog/_row_assessment.html b/templates/components/dog/_row_assessment.html new file mode 100644 index 0000000..0e9ad85 --- /dev/null +++ b/templates/components/dog/_row_assessment.html @@ -0,0 +1,63 @@ + +{% if is_blank_row %} + + + + + + {% include 'components/dog/_preview_DDL_weather.html' %} + + + {% include 'components/dog/_preview_DDL_lighting_level.html' %} + + + + + + {% include 'components/dog/_preview_DDL_location.html' %} + + {% set attribute_text = model.FLAG_USER_HANDLER %} + + {% include 'components/dog/_preview_DDL_user.html' %} + + {% include 'components/dog/_td_notes.html' %} + {% set active = True %} + {% include 'components/dog/_td_active.html' %} + +{% else %} + + + + + {% set weather_preview = assessment.weather %} + + {% include 'components/dog/_preview_DDL_weather.html' %} + + {% set lighting_level_preview = assessment.lighting_level %} + + {% include 'components/dog/_preview_DDL_lighting_level.html' %} + + + + + {% set location_preview = assessment.location %} + + {% include 'components/dog/_preview_DDL_location.html' %} + + {% set user_preview = assessment.user_handler %} + {% set attribute_text = model.FLAG_USER_HANDLER %} + + {% include 'components/dog/_preview_DDL_user.html' %} + + {% set notes = assessment.notes %} + {% include 'components/dog/_td_notes.html' %} + {% set active = assessment.active %} + {% include 'components/dog/_td_active.html' %} + +{% endif %} diff --git a/templates/components/dog/_row_assessment_command_modality_link.html b/templates/components/dog/_row_assessment_command_modality_link.html new file mode 100644 index 0000000..2bd0c06 --- /dev/null +++ b/templates/components/dog/_row_assessment_command_modality_link.html @@ -0,0 +1,137 @@ + +{% if is_blank_row %} + + + {% include 'components/dog/_preview_DDL_command_category.html' %} + + + {% include 'components/dog/_preview_DDL_command.html' %} + + + {% include 'components/dog/_preview_DDL_command_modality.html' %} + + + {% include 'components/dog/_preview_DDL_bribe.html' %} + + + + + + + + + + + + + + + + + + +
0
+ + {% include 'components/dog/_td_notes.html' %} + + {% include 'components/dog/_preview_table_assessment_response.html' %} + + {% set active = True %} + {% include 'components/dog/_td_active.html' %} + +{% else %} + + {% set command_preview = link.command %} + {% set command_category_preview = command_preview.command_category %} + + {% include 'components/dog/_preview_DDL_command_category.html' %} + + + {% include 'components/dog/_preview_DDL_command.html' %} + + {% set command_modality_preview = link.command_modality %} + + {% include 'components/dog/_preview_DDL_command_modality.html' %} + + {% set bribe_preview = link.bribe %} + + {% include 'components/dog/_preview_DDL_bribe.html' %} + + + + + + + + + + + + + + + + + + +
{{ link.trial_count }}
+ + {% set notes = link.notes %} + {% include 'components/dog/_td_notes.html' %} + + {% set assessment_response_previews = link.assessment_responses %} + {% include 'components/dog/_preview_table_assessment_response.html' %} + + {% set active = link.active %} + {% include 'components/dog/_td_active.html' %} + +{% endif %} diff --git a/templates/components/dog/_row_button_icon.html b/templates/components/dog/_row_button_icon.html index cfc4c61..0293e8b 100644 --- a/templates/components/dog/_row_button_icon.html +++ b/templates/components/dog/_row_button_icon.html @@ -2,7 +2,6 @@ {% if is_blank_row %} - {% set image = none %} {% include 'components/dog/_preview_DDL_image.html' %} @@ -15,7 +14,7 @@ {% else %} - {% set image = button_icon.image %} + {% set image_preview = button_icon.image %} {% include 'components/dog/_preview_DDL_image.html' %} diff --git a/templates/components/dog/_row_command.html b/templates/components/dog/_row_command.html index 8827c00..70a0c64 100644 --- a/templates/components/dog/_row_command.html +++ b/templates/components/dog/_row_command.html @@ -17,17 +17,13 @@ - - - + {% include 'components/dog/_td_notes.html' %} {% set active = True %} {% include 'components/dog/_td_active.html' %} {% else %} - {% set command_category = command.command_category %} + {% set command_category_preview = command.command_category %} {% include 'components/dog/_preview_DDL_command_category.html' %} @@ -48,13 +44,8 @@ - - - + {% set notes = command.notes %} + {% include 'components/dog/_td_notes.html' %} {% set active = command.active %} {% include 'components/dog/_td_active.html' %} diff --git a/templates/components/dog/_row_command_button_link.html b/templates/components/dog/_row_command_button_link.html index d537330..3c907c0 100644 --- a/templates/components/dog/_row_command_button_link.html +++ b/templates/components/dog/_row_command_button_link.html @@ -24,23 +24,23 @@ {% else %} - {% set command = link.command %} - {% set command_category = command.command_category %} + {% set command_preview = link.command %} + {% set command_category_preview = command_preview.command_category %} {% include 'components/dog/_preview_DDL_command_category.html' %} {% include 'components/dog/_preview_DDL_command.html' %} - {% set button_shape = link.button_shape %} + {% set button_shape_preview = link.button_shape %} {% include 'components/dog/_preview_DDL_button_shape.html' %} - {% set colour = link.colour %} + {% set colour_preview = link.colour %} {% include 'components/dog/_preview_DDL_colour.html' %} - {% set image = link.button_icon.image %} + {% set image_preview = link.button_icon.image %} {% include 'components/dog/_preview_DDL_image.html' %} diff --git a/templates/components/dog/_row_distraction.html b/templates/components/dog/_row_distraction.html new file mode 100644 index 0000000..de174f8 --- /dev/null +++ b/templates/components/dog/_row_distraction.html @@ -0,0 +1,93 @@ + +{% if is_blank_row %} + + + {% include 'components/dog/_preview_DDL_distraction_type.html' %} + + {% set attribute_text = model.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL %} + + {% include 'components/dog/_preview_DDL_distraction_intensity_level.html' %} + + {% set attribute_text = model.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT %} + + {% include 'components/dog/_preview_DDL_distraction_intensity_level.html' %} + + {% set attribute_text = model.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT %} + + {% include 'components/dog/_preview_DDL_distraction_intensity_level.html' %} + + {% set attribute_text = model.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND %} + + {% include 'components/dog/_preview_DDL_distraction_intensity_level.html' %} + + {% set attribute_text = model.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH %} + + {% include 'components/dog/_preview_DDL_distraction_intensity_level.html' %} + + + + + + + + {% include 'components/dog/_td_notes.html' %} + {% set active = True %} + {% include 'components/dog/_td_active.html' %} + +{% else %} + + {% set distraction_type_preview = distraction.distraction_type %} + + {% include 'components/dog/_preview_DDL_distraction_type.html' %} + + {% set intensity_level_preview = distraction.intensity_level_emotional %} + {% set attribute_text = model.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL %} + + {% include 'components/dog/_preview_DDL_distraction_intensity_level.html' %} + + {% set intensity_level_preview = distraction.intensity_level_scent %} + {% set attribute_text = model.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT %} + + {% include 'components/dog/_preview_DDL_distraction_intensity_level.html' %} + + {% set intensity_level_preview = distraction.intensity_level_sight %} + {% set attribute_text = model.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT %} + + {% include 'components/dog/_preview_DDL_distraction_intensity_level.html' %} + + {% set intensity_level_preview = distraction.intensity_level_sound %} + {% set attribute_text = model.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND %} + + {% include 'components/dog/_preview_DDL_distraction_intensity_level.html' %} + + {% set intensity_level_preview = distraction.intensity_level_touch %} + {% set attribute_text = model.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH %} + + {% include 'components/dog/_preview_DDL_distraction_intensity_level.html' %} + + + + + + + + {% set notes = distraction.notes %} + {% include 'components/dog/_td_notes.html' %} + {% set active = distraction.active %} + {% include 'components/dog/_td_active.html' %} + +{% endif %} \ No newline at end of file diff --git a/templates/components/dog/_row_dog_command_link.html b/templates/components/dog/_row_dog_command_link.html index 963b1ef..44be2d2 100644 --- a/templates/components/dog/_row_dog_command_link.html +++ b/templates/components/dog/_row_dog_command_link.html @@ -15,22 +15,18 @@ class="{{ model.FLAG_HAND_SIGNAL_DESCRIPTION }}" {{ model.ATTR_VALUE_CURRENT }} {{ model.ATTR_VALUE_PREVIOUS }} /> - - - + {% include 'components/dog/_td_notes.html' %} {% set active = True %} {% include 'components/dog/_td_active.html' %} {% else %} - {% set dog = link.dog %} + {% set dog_preview = link.dog %} {% include 'components/dog/_preview_DDL_dog.html' %} - {% set command = link.command %} - {% set command_category = command.command_category %} + {% set command_preview = link.command %} + {% set command_category_preview = command_preview.command_category %} {% include 'components/dog/_preview_DDL_command_category.html' %} @@ -44,13 +40,8 @@ {{ model.ATTR_VALUE_PREVIOUS }}="{{ model.format_null_string_as_blank(link.hand_signal_description)|escape }}" value="{{ model.format_null_string_as_blank(link.hand_signal_description) }}" /> - - - + {% set notes = link.notes %} + {% include 'components/dog/_td_notes.html' %} {% set active = link.active %} {% include 'components/dog/_td_active.html' %} diff --git a/templates/components/dog/_td_notes.html b/templates/components/dog/_td_notes.html new file mode 100644 index 0000000..a72e6b0 --- /dev/null +++ b/templates/components/dog/_td_notes.html @@ -0,0 +1,17 @@ + + +{% with _notes = none if (is_blank_row or notes is not defined) else notes %} + {% set value_formatted = model.format_null_string_as_blank(notes) %} + {% set value_previous = value_formatted | escape %} + + + + + +{% endwith %} diff --git a/templates/layouts/layout.html b/templates/layouts/layout.html index 1caf86c..e6dacff 100644 --- a/templates/layouts/layout.html +++ b/templates/layouts/layout.html @@ -38,7 +38,11 @@ + + +{% endblock %} \ No newline at end of file diff --git a/templates/pages/dog/_assessments.html b/templates/pages/dog/_assessments.html new file mode 100644 index 0000000..f95fcf0 --- /dev/null +++ b/templates/pages/dog/_assessments.html @@ -0,0 +1,113 @@ +{% extends 'layouts/layout.html' %} + +{% block page_body %} + + +
+ {{ model.form_filters.hidden_tag() }} +
+
+ +
+ {{ model.form_filters.id_weather.label }} + {{ model.form_filters.id_weather() }} + {% for error in model.form_filters.id_weather.errors %} +

{{ error }}

+ {% endfor %} +
+
+ {{ model.form_filters.id_lighting_level.label }} + {{ model.form_filters.id_lighting_level() }} + {% for error in model.form_filters.id_lighting_level.errors %} +

{{ error }}

+ {% endfor %} +
+
+ {{ model.form_filters.id_location.label }} + {{ model.form_filters.id_location() }} + {% for error in model.form_filters.id_location.errors %} +

{{ error }}

+ {% endfor %} +
+
+ {{ model.form_filters.id_user_handler.label }} + {{ model.form_filters.id_user_handler() }} + {% for error in model.form_filters.id_user_handler.errors %} +

{{ error }}

+ {% endfor %} +
+
+ {{ model.form_filters.active_only.label }} + {{ model.form_filters.active_only() }} + {% for error in model.form_filters.active_only.errors %} +

{{ error }}

+ {% endfor %} + {% set class_name = model.FLAG_FILTER + ' ' + model.FLAG_ACTIVE_ONLY + ' ' + model.FLAG_CHECKBOX %} + {% include 'components/common/buttons/_icon_checkbox.html' %} +
+
+
+ {% set block_id = 'buttons_table_default' %} + {% include 'components/common/buttons/_buttons_save_cancel.html' %} +
+ + + + + + + + + + + + + + + + {% set is_blank_row = False %} + {% for assessment in model.assessments %} + {% include 'components/dog/_row_assessment.html' %} + {% endfor %} + + {% set is_blank_row = True %} + {% include 'components/dog/_row_assessment.html' %} + +
DetailWeatherLighting LevelTemperature (°C)LocationHandlerNotes + {% set class_name = model.FLAG_ACTIVE %} + {% set attribute_text = '' %} + {% include 'components/common/buttons/_icon_add.html' %} +
+ + {% include 'components/common/temporary/_overlay_confirm.html' %} + {% include 'components/common/temporary/_overlay_error.html' %} + +
+ + + {% set class_name = '' %} + {% include 'components/common/buttons/_icon_trash.html' %} + + {% set class_name = model.FLAG_ACTIVE %} + {% set attribute_text = '' %} + {% include 'components/common/buttons/_icon_add.html' %} +
+ + + + +{% endblock %} \ No newline at end of file diff --git a/templates/pages/dog/_button_icons.html b/templates/pages/dog/_button_icons.html index f555ff5..1f2d5d2 100644 --- a/templates/pages/dog/_button_icons.html +++ b/templates/pages/dog/_button_icons.html @@ -29,7 +29,7 @@ {% include 'components/common/buttons/_buttons_save_cancel.html' %} - +
diff --git a/templates/pages/dog/_command_button_links.html b/templates/pages/dog/_command_button_links.html index 0040056..4766b42 100644 --- a/templates/pages/dog/_command_button_links.html +++ b/templates/pages/dog/_command_button_links.html @@ -71,7 +71,7 @@ {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
Image
+ diff --git a/templates/pages/dog/_command_categories.html b/templates/pages/dog/_command_categories.html index ee2b01f..0962ab1 100644 --- a/templates/pages/dog/_command_categories.html +++ b/templates/pages/dog/_command_categories.html @@ -29,7 +29,7 @@ {% include 'components/common/buttons/_buttons_save_cancel.html' %} - +
{# diff --git a/templates/pages/dog/_commands.html b/templates/pages/dog/_commands.html index d330541..c323429 100644 --- a/templates/pages/dog/_commands.html +++ b/templates/pages/dog/_commands.html @@ -36,7 +36,7 @@ {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
+
diff --git a/templates/pages/dog/_dog_command_links.html b/templates/pages/dog/_dog_command_links.html index 929c3cc..e11eab3 100644 --- a/templates/pages/dog/_dog_command_links.html +++ b/templates/pages/dog/_dog_command_links.html @@ -50,7 +50,7 @@ {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
Command Category
+ diff --git a/templates/pages/dog/_home.html b/templates/pages/dog/_home.html index f6ec21e..2798618 100644 --- a/templates/pages/dog/_home.html +++ b/templates/pages/dog/_home.html @@ -33,6 +33,21 @@
+ +
+ +
+ {# +
+ +
+
+ +
+
+ +
+ #} {% endblock %} \ No newline at end of file diff --git a/templates/pages/dog/_locations.html b/templates/pages/dog/_locations.html index e3673f1..70ec7ea 100644 --- a/templates/pages/dog/_locations.html +++ b/templates/pages/dog/_locations.html @@ -29,7 +29,7 @@ {% include 'components/common/buttons/_buttons_save_cancel.html' %} - +
diff --git a/todo.txt b/todo.txt index 2a17a07..7d76ce6 100644 --- a/todo.txt +++ b/todo.txt @@ -20,6 +20,10 @@ Features: - Company allow sharing of lookup tables, dogs, around employees - Company allow admin role to move dogs around - Get Many Stored Procedures - check they call all necessary clear_calc Stored Procedures +- Filter Response Quality Metric by Unit measurement - first need Unit measurement calc +- Add Is_Handler field to User table and filters +- Add Is_Default field to all Lookup tables +- Response Quality Metric - add field bigger value measured is better? Fix: diff --git a/webpack.config.js b/webpack.config.js index 51408f6..bf25ae7 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -93,6 +93,14 @@ module.exports = { path.resolve(__dirname, 'static/css/sections/dog.css'), path.resolve(__dirname, 'static/css/pages/dog/command_button_links.css') ], + dog_assessments: [ + path.resolve(__dirname, 'static/css/sections/dog.css'), + path.resolve(__dirname, 'static/css/pages/dog/assessments.css') + ], + dog_assessment: [ + path.resolve(__dirname, 'static/css/sections/dog.css'), + path.resolve(__dirname, 'static/css/pages/dog/assessment.css') + ], }, output: { filename: 'js/[name].bundle.js',
Parent