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":"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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/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