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":";AACA;IACI,kDAAkD;IAClD,6BAA6B;IAC7B;;;;;;KAMC;IACD;;;KAGC;IACD;;;;;;;;;;;KAWC;IACD;;;;KAIC;AACL;;AAEA;IACI,aAAa;IACb,sBAAsB;AAC1B;;AAEA;IACI,+CAA+C;IAC/C,yBAAyB;IACzB,oCAAoC;IACpC,kBAAkB;IAClB,UAAU;IACV,SAAS;IACT,SAAS;IACT,8GAA8G,EAAE,qBAAqB;IACrI,aAAa;IACb;uBACmB;AACvB;;AAEA;IACI,SAAS;AACb;;AAEA;IACI,wBAAwB;AAC5B;;AAEA;IACI,6BAA6B;IAC7B,gBAAgB;IAChB,cAAc;IACd,SAAS;IACT,SAAS;IACT,qBAAqB;IACrB,2BAA2B;IAC3B,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,WAAW;IACX,yBAAyB;AAC7B;;AAEA;IACI,aAAa;IACb,eAAe;IACf,mBAAmB;IACnB,uBAAuB;IACvB,kBAAkB;IAClB,WAAW;IACX,kBAAkB;IAClB,mCAAmC;AACvC;AACA;IACI,kBAAkB;IAClB,kBAAkB;IAClB,qBAAqB;AACzB;AACA;IACI,mBAAmB;IACnB,kBAAkB;AACtB;;AAEA,iBAAiB;AACjB;IACI,gBAAgB;IAChB,eAAe;IACf,eAAe;IACf,kBAAkB;AACtB;;AAEA,gBAAgB;AAChB;IACI,eAAe;IACf,eAAe;IACf,gBAAgB;AACpB;;AAEA,mCAAmC;AACnC;IACI,+CAA+C;IAC/C,kBAAkB;IAClB,WAAW;IACX,wBAAwB;IACxB,eAAe;IACf,mBAAmB;IACnB,uBAAuB;IACvB,kBAAkB;IAClB,oBAAoB;IACpB,kBAAkB;IAClB,mBAAmB;IACnB,eAAe;AACnB;;AAEA;IACI,oBAAoB;IACpB,4BAA4B;IAC5B,6BAA6B;AACjC;;AAEA;IACI,OAAO;IACP,WAAW;IACX,uBAAuB;IACvB,2BAA2B;IAC3B,sBAAsB;IACtB,qBAAqB;IACrB,4BAA4B;AAChC;;AAEA;IACI,aAAa;IACb,sBAAsB;IACtB,mBAAmB;IACnB,cAAc;AAClB;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,WAAW;IACX,eAAe;AACnB;;AAEA;IACI,gBAAgB;AACpB;;;AAGA;;;;;;;;;;;;;;;;CAgBC;;AAED;IACI,YAAY;IACZ,aAAa;IACb,eAAe;IACf,mBAAmB;IACnB,uBAAuB;IACvB,kBAAkB;AACtB;;AAEA;IACI,WAAW;IACX,kBAAkB;IAClB,aAAa;AACjB;;AAEA;;IAEI,sCAAsC;IACtC,YAAY;AAChB;;AAEA;IACI,WAAW;AACf;;;AAGA;IACI,cAAc;IACd,qBAAqB;AACzB;AACA;IACI,gBAAgB;IAChB,eAAe;AACnB;;;AAGA;IACI,sCAAsC;AAC1C;AACA;IACI,mCAAmC;AACvC;;;AAGA;IACI,mCAAmC;AACvC;;;;AAIA;IACI;QACI,kBAAkB;IACtB;IACA;;;;SAIK;AACT,C;AClPA;IACI,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,iBAAiB;IACjB,yBAAyB;IACzB,kBAAkB;AACtB;AACA;IACI,eAAe;AACnB;AACA;IACI,cAAc;IACd,UAAU;AACd;;AAEA;IACI,gCAAgC;IAChC,4BAA4B;IAC5B,uCAAuC;AAC3C;;AAEA;IACI,mCAAmC;AACvC;;AAEA;IACI,iBAAiB;IACjB,4BAA4B;AAChC;;AAEA;IACI,gCAAgC;AACpC;;AAEA;IACI,eAAe;AACnB;;;AAGA;;IAEI,WAAW;AACf,C;;;;;AC1CA;IACI,sCAAsC;AAC1C,C;;ACHA;IACI,kBAAkB;AACtB;;;ACFA;IACI,mCAAmC;AACvC;;AAEA;IACI,mCAAmC;AACvC;;AAEA;IACI,mCAAmC;IACnC,eAAe;AACnB;;AAEA;IACI,eAAe;IACf,WAAW;IACX,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,WAAW;AACf;;;;;;ACvBA,kBAAkB;AAClB;IACI;;KAEC;IACD,eAAe;IACf,YAAY;IACZ,iBAAiB;IACjB,yCAAyC;IACzC,sBAAsB;IACtB,kBAAkB;IAClB,iBAAiB;IACjB,YAAY;AAChB;AACA;IACI,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 = '