From 47360fbc1966a89f0b31025c720a2312b52d1bf4 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Wed, 13 Dec 2023 16:05:24 -0800 Subject: [PATCH 001/147] Initial check in for applicant profiles --- .../59a97f42b5f2_add_version_to_applicant.py | 30 ++ request-management-api/request_api/auth.py | 13 + .../models/FOIRequestApplicantMappings.py | 25 +- .../models/FOIRequestApplicants.py | 396 +++++++++++++++++- .../request_api/resources/__init__.py | 4 +- .../request_api/resources/foiapplicant.py | 93 ++++ .../request_api/services/applicantservice.py | 68 +++ 7 files changed, 621 insertions(+), 8 deletions(-) create mode 100644 request-management-api/migrations/versions/59a97f42b5f2_add_version_to_applicant.py create mode 100644 request-management-api/request_api/resources/foiapplicant.py create mode 100644 request-management-api/request_api/services/applicantservice.py diff --git a/request-management-api/migrations/versions/59a97f42b5f2_add_version_to_applicant.py b/request-management-api/migrations/versions/59a97f42b5f2_add_version_to_applicant.py new file mode 100644 index 000000000..d3abe9199 --- /dev/null +++ b/request-management-api/migrations/versions/59a97f42b5f2_add_version_to_applicant.py @@ -0,0 +1,30 @@ +"""add version to applicant + +Revision ID: 59a97f42b5f2 +Revises: 7fa7236d06fb +Create Date: 2023-12-11 18:12:59.955472 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '59a97f42b5f2' +down_revision = '7fa7236d06fb' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('FOIRequestApplicants', sa.Column('version', sa.Integer(), nullable=True)) + op.add_column('FOIRequestApplicantMappings', sa.Column('foirequestapplicant_version', sa.Integer(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('FOIRequestApplicants', 'version') + op.drop_column('FOIRequestApplicantMappings', 'foirequestapplicant_version') + # ### end Alembic commands ### diff --git a/request-management-api/request_api/auth.py b/request-management-api/request_api/auth.py index bacfb1607..386b68e03 100644 --- a/request-management-api/request_api/auth.py +++ b/request-management-api/request_api/auth.py @@ -144,6 +144,19 @@ def wrapper(*args, **kwargs): return wrapper return decorated + + @classmethod + def isiao(cls,func): + @wraps(func) + def decorated(type, id, field,*args, **kwargs): + usertype = AuthHelper.getusertype() + if(usertype == "iao"): + return func(type, id, field,*args, **kwargs) + else: + return "Unauthorized" , 401 + return decorated + + auth = ( Auth() ) diff --git a/request-management-api/request_api/models/FOIRequestApplicantMappings.py b/request-management-api/request_api/models/FOIRequestApplicantMappings.py index 877646a01..a2d284a36 100644 --- a/request-management-api/request_api/models/FOIRequestApplicantMappings.py +++ b/request-management-api/request_api/models/FOIRequestApplicantMappings.py @@ -5,6 +5,7 @@ from sqlalchemy.orm import relationship,backref from .default_method_result import DefaultMethodResult from .FOIRequests import FOIRequest +from sqlalchemy import and_, or_ class FOIRequestApplicantMapping(db.Model): # Name of the table in our database @@ -28,17 +29,33 @@ class FOIRequestApplicantMapping(db.Model): requestortype = relationship("RequestorType",backref=backref("RequestorTypes"),uselist=False) foirequestapplicantid = db.Column(db.Integer,ForeignKey('FOIRequestApplicants.foirequestapplicantid')) - foirequestapplicant = relationship("FOIRequestApplicant",backref=backref("FOIRequestApplicants"),uselist=False) + foirequestapplicant_version = db.Column(db.Integer, ForeignKey('FOIRequestApplicants.version')) + foirequestapplicant = relationship('FOIRequestApplicant', primaryjoin="and_(FOIRequestApplicant.foirequestapplicantid==FOIRequestApplicantMapping.foirequestapplicantid, " + "FOIRequestApplicant.version==FOIRequestApplicantMapping.foirequestapplicant_version)") - foirequest_id =db.Column(db.Integer, db.ForeignKey('FOIRequests.foirequestid')) - foirequestversion_id = db.Column(db.Integer, db.ForeignKey('FOIRequests.version')) + foirequest_id =db.Column(db.Integer, ForeignKey('FOIRequests.foirequestid')) + foirequestversion_id = db.Column(db.Integer, ForeignKey('FOIRequests.version')) foirequestkey = relationship("FOIRequest",foreign_keys="[FOIRequestApplicantMapping.foirequest_id]") foirequestversion = relationship("FOIRequest",foreign_keys="[FOIRequestApplicantMapping.foirequestversion_id]") @classmethod def getrequestapplicants(cls,foirequest_id,foirequestversion): + from .FOIRequestApplicants import FOIRequestApplicant requestapplicant_schema = FOIRequestApplicantMappingSchema(many=True) - _applicantinfos = db.session.query(FOIRequestApplicantMapping).filter(FOIRequestApplicantMapping.foirequest_id == foirequest_id , FOIRequestApplicantMapping.foirequestversion_id == foirequestversion).order_by(FOIRequestApplicantMapping.foirequestapplicantmappingid.asc()).all() + _applicantinfos = db.session.query(FOIRequestApplicantMapping + ).join( + FOIRequestApplicant, + and_( + FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, + or_( + FOIRequestApplicant.version == FOIRequestApplicantMapping.foirequestapplicant_version, + FOIRequestApplicantMapping.foirequestapplicant_version is None + ) + ) + ).filter( + FOIRequestApplicantMapping.foirequest_id == foirequest_id, + FOIRequestApplicantMapping.foirequestversion_id == foirequestversion + ).order_by(FOIRequestApplicantMapping.foirequestapplicantmappingid.asc()).all() applicantinfos = requestapplicant_schema.dump(_applicantinfos) return applicantinfos diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 7f4f8f1ad..edf66e47d 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -2,9 +2,14 @@ from sqlalchemy.sql.schema import ForeignKey, ForeignKeyConstraint from .db import db, ma from datetime import datetime -from sqlalchemy.orm import relationship,backref +from sqlalchemy.orm import relationship, backref, aliased from .default_method_result import DefaultMethodResult +from .FOIRequestApplicantMappings import FOIRequestApplicantMapping +from .ApplicantCategories import ApplicantCategory from .FOIRequests import FOIRequest +from .FOIRequestContactInformation import FOIRequestContactInformation +from .FOIRequestPersonalAttributes import FOIRequestPersonalAttribute +from sqlalchemy import and_, or_, asc, func class FOIRequestApplicant(db.Model): # Name of the table in our database @@ -25,6 +30,7 @@ class FOIRequestApplicant(db.Model): updated_at = db.Column(db.DateTime, nullable=True) createdby = db.Column(db.String(120), unique=False, nullable=True) updatedby = db.Column(db.String(120), unique=False, nullable=True) + version = db.Column(db.Integer, unique=False, nullable=True) @classmethod def saveapplicant(cls,firstname, lastname, middlename, businessname, alsoknownas, dob, userid): @@ -60,8 +66,392 @@ def saveapplicant(cls,firstname, lastname, middlename, businessname, alsoknownas db.session.add(applicant) db.session.commit() return DefaultMethodResult(True,'Applicant added',applicant.foirequestapplicantid) - + + # Search applicant by email + @classmethod + def getapplicantbyemail(cls, email): + from .FOIMinistryRequests import FOIMinistryRequest + + #for queue/dashboard + _session = db.session + + #aliase for getting contact info + contactemail = aliased(FOIRequestContactInformation) + contactaddress = aliased(FOIRequestContactInformation) + contacthomephone = aliased(FOIRequestContactInformation) + contactworkphone = aliased(FOIRequestContactInformation) + contactworkphone2 = aliased(FOIRequestContactInformation) + contactmobilephone = aliased(FOIRequestContactInformation) + contactother = aliased(FOIRequestContactInformation) + + #aliase for getting personal attributes + personalemployeenumber = aliased(FOIRequestPersonalAttribute) + personalcorrectionnumber = aliased(FOIRequestPersonalAttribute) + personalhealthnumber = aliased(FOIRequestPersonalAttribute) + + #max foirequest version + subquery_foirequest_maxversion = _session.query(FOIRequest.foirequestid, func.max(FOIRequest.version).label('max_version')).group_by(FOIRequest.foirequestid).subquery() + joincondition = [ + subquery_foirequest_maxversion.c.foirequestid == FOIRequest.foirequestid, + subquery_foirequest_maxversion.c.max_version == FOIRequest.version, + ] + + #generate query + selectedcolumns = [ + FOIRequestApplicant.foirequestapplicantid.label('foirequestapplicantid'), + FOIRequestApplicant.firstname.label('firstname'), + FOIRequestApplicant.middlename.label('middlename'), + FOIRequestApplicant.lastname.label('lastname'), + FOIRequestApplicant.alsoknownas.label('alsoknownas'), + FOIRequestApplicant.dob.label('dob'), + FOIRequestApplicant.businessname.label('businessname'), + FOIRequestApplicant.version.label('applicantversion'), + FOIRequest.foirequestid.label('foirequestid'), + FOIRequest.version.label('foirequestversion'), + FOIRequest.requesttype.label('requesttype'), + ApplicantCategory.name.label('applicantcategory'), + contactemail.contactinformation.label('email'), + contactaddress.contactinformation.label('address'), + contacthomephone.contactinformation.label('homephone'), + contactworkphone.contactinformation.label('workphone'), + contactworkphone2.contactinformation.label('workphone2'), + contactmobilephone.contactinformation.label('mobilephone'), + contactother.contactinformation.label('othercontactinfo'), + personalemployeenumber.attributevalue.label('employeenumber'), + personalcorrectionnumber.attributevalue.label('correctionnumber'), + personalhealthnumber.attributevalue.label('phn') + ] + + applicantprofile_schema = ApplicantProfileSchema(many=True) + query = _session.query( + *selectedcolumns + ).join( + FOIRequestApplicantMapping, + and_( + FOIRequestApplicantMapping.foirequest_id == FOIRequest.foirequestid, + FOIRequestApplicantMapping.foirequestversion_id == FOIRequest.version, + FOIRequestApplicantMapping.requestortypeid == 1), + ).join( + FOIRequestApplicant, + # FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid + and_( + FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, + or_( + FOIRequestApplicant.version == None, + FOIRequestApplicantMapping.foirequestapplicant_version == None, + FOIRequestApplicant.version == FOIRequestApplicantMapping.foirequestapplicant_version + ) + ) + ).join( + ApplicantCategory, + ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid + ).join( + subquery_foirequest_maxversion, + and_(*joincondition) + ).join( + FOIMinistryRequest, + and_( + FOIMinistryRequest.foirequest_id == FOIRequest.foirequestid, + FOIMinistryRequest.isactive == True) + ).join( + contactemail, + and_( + contactemail.foirequest_id == FOIRequest.foirequestid, + contactemail.foirequestversion_id == FOIRequest.version, + contactemail.contacttypeid == 1), + ).join( + contactaddress, + and_( + contactaddress.foirequest_id == FOIRequest.foirequestid, + contactaddress.foirequestversion_id == FOIRequest.version, + contactaddress.contacttypeid == 2, + contactaddress.contactinformation is not None), + isouter=True + ).join( + contacthomephone, + and_( + contacthomephone.foirequest_id == FOIRequest.foirequestid, + contacthomephone.foirequestversion_id == FOIRequest.version, + contacthomephone.contacttypeid == 3, + contacthomephone.contactinformation is not None), + isouter=True + ).join( + contactworkphone, + and_( + contactworkphone.foirequest_id == FOIRequest.foirequestid, + contactworkphone.foirequestversion_id == FOIRequest.version, + contactworkphone.contacttypeid == 4, + contactworkphone.contactinformation is not None), + isouter=True + ).join( + contactworkphone2, + and_( + contactworkphone2.foirequest_id == FOIRequest.foirequestid, + contactworkphone2.foirequestversion_id == FOIRequest.version, + contactworkphone2.contacttypeid == 5, + contactworkphone2.contactinformation is not None), + isouter=True + ).join( + contactmobilephone, + and_( + contactmobilephone.foirequest_id == FOIRequest.foirequestid, + contactmobilephone.foirequestversion_id == FOIRequest.version, + contactmobilephone.contacttypeid == 6, + contactmobilephone.contactinformation is not None), + isouter=True + ).join( + contactother, + and_( + contactother.foirequest_id == FOIRequest.foirequestid, + contactother.foirequestversion_id == FOIRequest.version, + contactother.contacttypeid == 7, + contactother.contactinformation is not None), + isouter=True + ).join( + personalemployeenumber, + and_( + personalemployeenumber.foirequest_id == FOIRequest.foirequestid, + personalemployeenumber.foirequestversion_id == FOIRequest.version, + personalemployeenumber.personalattributeid == 1, + personalemployeenumber.attributevalue is not None), + isouter=True + ).join( + personalcorrectionnumber, + and_( + personalcorrectionnumber.foirequest_id == FOIRequest.foirequestid, + personalcorrectionnumber.foirequestversion_id == FOIRequest.version, + personalcorrectionnumber.personalattributeid == 2, + personalcorrectionnumber.attributevalue is not None), + isouter=True + ).join( + personalhealthnumber, + and_( + personalhealthnumber.foirequest_id == FOIRequest.foirequestid, + personalhealthnumber.foirequestversion_id == FOIRequest.version, + personalhealthnumber.personalattributeid == 3, + personalhealthnumber.attributevalue is not None), + isouter=True + ).filter( + FOIMinistryRequest.requeststatusid != 3, + FOIRequest.isactive == True, + contactemail.contactinformation == email + ).order_by(FOIRequest.foirequestid.asc()) + + print("query: ", query) + # print("result: ", query.all()) + return applicantprofile_schema.dump(query.all()) + + + # Search applicant by keywords + @classmethod + def searchapplicant(cls, keywords): + from .FOIMinistryRequests import FOIMinistryRequest + + #for queue/dashboard + _session = db.session + + #aliase for getting contact info + contactemail = aliased(FOIRequestContactInformation) + contactaddress = aliased(FOIRequestContactInformation) + contacthomephone = aliased(FOIRequestContactInformation) + contactworkphone = aliased(FOIRequestContactInformation) + contactworkphone2 = aliased(FOIRequestContactInformation) + contactmobilephone = aliased(FOIRequestContactInformation) + contactother = aliased(FOIRequestContactInformation) + + #aliase for getting personal attributes + personalemployeenumber = aliased(FOIRequestPersonalAttribute) + personalcorrectionnumber = aliased(FOIRequestPersonalAttribute) + personalhealthnumber = aliased(FOIRequestPersonalAttribute) + + #max foirequest version + subquery_foirequest_maxversion = _session.query(FOIRequest.foirequestid, func.max(FOIRequest.version).label('max_version')).group_by(FOIRequest.foirequestid).subquery() + joincondition = [ + subquery_foirequest_maxversion.c.foirequestid == FOIRequest.foirequestid, + subquery_foirequest_maxversion.c.max_version == FOIRequest.version, + ] + + #generate query + selectedcolumns = [ + FOIRequestApplicant.foirequestapplicantid.label('foirequestapplicantid'), + FOIRequestApplicant.firstname.label('firstname'), + FOIRequestApplicant.middlename.label('middlename'), + FOIRequestApplicant.lastname.label('lastname'), + FOIRequestApplicant.alsoknownas.label('alsoknownas'), + FOIRequestApplicant.dob.label('dob'), + FOIRequestApplicant.businessname.label('businessname'), + FOIRequestApplicant.version.label('applicantversion'), + FOIRequest.foirequestid.label('foirequestid'), + FOIRequest.version.label('foirequestversion'), + FOIRequest.requesttype.label('requesttype'), + ApplicantCategory.name.label('applicantcategory'), + contactemail.contactinformation.label('email'), + contactaddress.contactinformation.label('address'), + contacthomephone.contactinformation.label('homephone'), + contactworkphone.contactinformation.label('workphone'), + contactworkphone2.contactinformation.label('workphone2'), + contactmobilephone.contactinformation.label('mobilephone'), + contactother.contactinformation.label('othercontactinfo'), + personalemployeenumber.attributevalue.label('employeenumber'), + personalcorrectionnumber.attributevalue.label('correctionnumber'), + personalhealthnumber.attributevalue.label('phn') + ] + + applicantprofile_schema = ApplicantProfileSchema(many=True) + query = _session.query( + *selectedcolumns + ).join( + FOIRequestApplicantMapping, + and_( + FOIRequestApplicantMapping.foirequest_id == FOIRequest.foirequestid, + FOIRequestApplicantMapping.foirequestversion_id == FOIRequest.version, + FOIRequestApplicantMapping.requestortypeid == 1), + ).join( + FOIRequestApplicant, + # FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid + and_( + FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, + or_( + FOIRequestApplicant.version == None, + FOIRequestApplicantMapping.foirequestapplicant_version == None, + FOIRequestApplicant.version == FOIRequestApplicantMapping.foirequestapplicant_version + ) + ) + ).join( + ApplicantCategory, + ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid + ).join( + subquery_foirequest_maxversion, + and_(*joincondition) + ).join( + FOIMinistryRequest, + and_( + FOIMinistryRequest.foirequest_id == FOIRequest.foirequestid, + FOIMinistryRequest.isactive == True) + ).join( + contactemail, + and_( + contactemail.foirequest_id == FOIRequest.foirequestid, + contactemail.foirequestversion_id == FOIRequest.version, + contactemail.contacttypeid == 1), + isouter=True + ).join( + contactaddress, + and_( + contactaddress.foirequest_id == FOIRequest.foirequestid, + contactaddress.foirequestversion_id == FOIRequest.version, + contactaddress.contacttypeid == 2, + contactaddress.contactinformation is not None), + isouter=True + ).join( + contacthomephone, + and_( + contacthomephone.foirequest_id == FOIRequest.foirequestid, + contacthomephone.foirequestversion_id == FOIRequest.version, + contacthomephone.contacttypeid == 3, + contacthomephone.contactinformation is not None), + isouter=True + ).join( + contactworkphone, + and_( + contactworkphone.foirequest_id == FOIRequest.foirequestid, + contactworkphone.foirequestversion_id == FOIRequest.version, + contactworkphone.contacttypeid == 4, + contactworkphone.contactinformation is not None), + isouter=True + ).join( + contactworkphone2, + and_( + contactworkphone2.foirequest_id == FOIRequest.foirequestid, + contactworkphone2.foirequestversion_id == FOIRequest.version, + contactworkphone2.contacttypeid == 5, + contactworkphone2.contactinformation is not None), + isouter=True + ).join( + contactmobilephone, + and_( + contactmobilephone.foirequest_id == FOIRequest.foirequestid, + contactmobilephone.foirequestversion_id == FOIRequest.version, + contactmobilephone.contacttypeid == 6, + contactmobilephone.contactinformation is not None), + isouter=True + ).join( + contactother, + and_( + contactother.foirequest_id == FOIRequest.foirequestid, + contactother.foirequestversion_id == FOIRequest.version, + contactother.contacttypeid == 7, + contactother.contactinformation is not None), + isouter=True + ).join( + personalemployeenumber, + and_( + personalemployeenumber.foirequest_id == FOIRequest.foirequestid, + personalemployeenumber.foirequestversion_id == FOIRequest.version, + personalemployeenumber.personalattributeid == 1, + personalemployeenumber.attributevalue is not None), + isouter=True + ).join( + personalcorrectionnumber, + and_( + personalcorrectionnumber.foirequest_id == FOIRequest.foirequestid, + personalcorrectionnumber.foirequestversion_id == FOIRequest.version, + personalcorrectionnumber.personalattributeid == 2, + personalcorrectionnumber.attributevalue is not None), + isouter=True + ).join( + personalhealthnumber, + and_( + personalhealthnumber.foirequest_id == FOIRequest.foirequestid, + personalhealthnumber.foirequestversion_id == FOIRequest.version, + personalhealthnumber.personalattributeid == 3, + personalhealthnumber.attributevalue is not None), + isouter=True + ).filter( + FOIMinistryRequest.requeststatusid != 3, + FOIRequest.isactive == True, + or_(*FOIRequestApplicant.getsearchfilters(keywords, contactemail, contacthomephone, contactworkphone, contactworkphone2, contactmobilephone)) + ).order_by(FOIRequest.foirequestid.asc()) + + # print("query: ", query) + # print("result: ", query.all()) + return applicantprofile_schema.dump(query.all()) + + + @classmethod + def getsearchfilters(cls, keywords, contactemail, contacthomephone, contactworkphone, contactworkphone2, contactmobilephone): + searchfilters = [] + if(len(keywords) > 0): + if(keywords['firstname'] is not None): + searchfilters.append(FOIRequestApplicant.firstname.ilike('%'+keywords['firstname']+'%')) + + if(keywords['lastname'] is not None): + searchfilters.append(FOIRequestApplicant.lastname.ilike('%'+keywords['lastname']+'%')) + + if(keywords['email'] is not None): + searchfilters.append(contactemail.contactinformation.ilike('%'+keywords['email']+'%')) + + if(keywords['homephone'] is not None): + searchfilters.append(contacthomephone.contactinformation.ilike('%'+keywords['homephone']+'%')) + + if(keywords['workphone'] is not None): + searchfilters.append(contactworkphone.contactinformation.ilike('%'+keywords['workphone']+'%')) + + if(keywords['workphone2'] is not None): + searchfilters.append(contactworkphone2.contactinformation.ilike('%'+keywords['workphone2']+'%')) + + if(keywords['mobilephone'] is not None): + searchfilters.append(contactmobilephone.contactinformation.ilike('%'+keywords['mobilephone']+'%')) + + return searchfilters + class FOIRequestApplicantSchema(ma.Schema): class Meta: fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob','businessname') - \ No newline at end of file + +class ApplicantProfileSchema(ma.Schema): + class Meta: + fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob', + 'businessname','applicantversion','foirequestid','foirequestversion','requesttype', + 'applicantcategory','email','address','homephone','workphone','workphone2','mobilephone', + 'othercontactinfo','employeenumber','correctionnumber','phn') diff --git a/request-management-api/request_api/resources/__init__.py b/request-management-api/request_api/resources/__init__.py index 403e0cb47..9eeaf75fa 100644 --- a/request-management-api/request_api/resources/__init__.py +++ b/request-management-api/request_api/resources/__init__.py @@ -49,6 +49,7 @@ from .foiworkflow import API as FOIWORKFLOW_API from .dashboardeventpagination import API as FOIEVENT_API from .foiuser import API as FOIUSER_API +from .foiapplicant import API as APPLICANT_API __all__ = ('API_BLUEPRINT') @@ -91,4 +92,5 @@ API.add_namespace(APPLICANTCORRESPONDENCE_API, '/api') API.add_namespace(FOIWORKFLOW_API, '/api') API.add_namespace(FOIEVENT_API, '/api') -API.add_namespace(FOIUSER_API, '/api') \ No newline at end of file +API.add_namespace(FOIUSER_API, '/api') +API.add_namespace(APPLICANT_API, '/api') \ No newline at end of file diff --git a/request-management-api/request_api/resources/foiapplicant.py b/request-management-api/request_api/resources/foiapplicant.py new file mode 100644 index 000000000..20142b4fd --- /dev/null +++ b/request-management-api/request_api/resources/foiapplicant.py @@ -0,0 +1,93 @@ +# Copyright © 2021 Province of British Columbia +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an 'AS IS' BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""API endpoints for managing a FOI Requests resource.""" + + +from flask import g, request +import flask +from flask_restx import Namespace, Resource, cors +from flask_expects_json import expects_json +from request_api.auth import auth +from request_api.tracer import Tracer +from request_api.utils.util import cors_preflight, allowedorigins +from request_api.exceptions import BusinessException, Error +from request_api.services.applicantservice import applicantservice +import json +from flask_cors import cross_origin +import request_api +from request_api.utils.cache import cache_filter, response_filter + +API = Namespace('FOIAssignee', description='Endpoints for FOI assignee management') +TRACER = Tracer.get_instance() + +"""Custom exception messages +""" +EXCEPTION_MESSAGE_BAD_REQUEST='Bad Request' +EXCEPTION_MESSAGE_NOT_FOUND='Not Found' + + +@cors_preflight('GET,OPTIONS') +@API.route('/foiapplicants/') +class FOIApplicants(Resource): + """Resource for retriving all FOI assignees.""" + + @staticmethod + @TRACER.trace() + @cross_origin(origins=allowedorigins()) + # @auth.require + # @auth.isiao + @cors_preflight('GET,OPTIONS') + def get(email=None): + print(email) + + if email is None or email == "": + return {'status': False, 'message':EXCEPTION_MESSAGE_BAD_REQUEST}, 400 + try: + result = applicantservice().getapplicantbyemail(email) + print("result-endpoint: ", result) + if result is not None: + return json.dumps(result), 200 + else: + return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 + except BusinessException as exception: + return {'status': exception.status_code, 'message':exception.message}, 500 + + +@cors_preflight('GET,OPTIONS') +@API.route('/foiapplicants/search') +class EventPagination(Resource): + """ Retrives the foi request based on the queue type. + """ + @staticmethod + @TRACER.trace() + @cross_origin(origins=allowedorigins()) + # @auth.require + # @auth.isiao + @cors_preflight('GET,OPTIONS') + def get(): + try: + _keywords = flask.request.args.get('keywords', None, type=str) + print(_keywords) + + result = [] + statuscode = 200 + if _keywords is None or _keywords == "": + result = applicantservice().searchapplicant(_keywords) + else: + statuscode = 401 + + return result, statuscode + except BusinessException as exception: + return {'status': exception.status_code, 'message':exception.message}, 500 + diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py new file mode 100644 index 000000000..59c890f28 --- /dev/null +++ b/request-management-api/request_api/services/applicantservice.py @@ -0,0 +1,68 @@ + +from os import stat +from re import VERBOSE +from request_api.models.FOIRequestApplicants import FOIRequestApplicant +from request_api.auth import AuthHelper +from dateutil import tz, parser +from flask import jsonify +from datetime import datetime as datetime2 +from request_api.utils.commons.datetimehandler import datetimehandler +import re + +class applicantservice: + """ FOI Event Dashboard + """ + + def getapplicantbyemail(self, email): + applicantqueue = [] + applicants = FOIRequestApplicant.getapplicantbyemail(email) + print('applicants: ', applicants) + if applicants is not None: + for applicant in applicants: + applicantqueue.append(self.__prepareapplicant(applicant)) + + return applicantqueue + + def searchapplicant(self, keywords): + applicantqueue = [] + applicants = FOIRequestApplicant.searchapplicant(keywords) + if applicants is not None: + for applicant in applicants: + applicantqueue.append(self.__prepareapplicant(applicant)) + + return applicantqueue + + def __validateandtransform(self, filterfields): + return self.__transformfilteringfields(filterfields) + + def __transformfilteringfields(self, filterfields): + return list(map(lambda x: x.replace('createdat', 'createdatformatted'), filterfields)) + + def __prepareapplicant(self, applicant): + return { + 'foirequestapplicantid': applicant["foirequestapplicantid"], + 'firstname': applicant["firstname"], + 'middlename': applicant["middlename"], + 'lastname': applicant["lastname"], + 'alsoknownas': applicant["alsoknownas"], + 'dob' : applicant["dob"], + #'createdat' : self.__formatedate(applicant["createdat)"], + 'businessname': applicant["businessname"], + # 'applicant': applicant["applicant"], + 'applicantversion': applicant["applicantversion"], + 'foirequestid': applicant["foirequestid"], + 'foirequestversion': applicant["foirequestversion"], + 'requesttype': applicant["requesttype"], + 'applicantcategory': applicant["applicantcategory"], + 'email':applicant["email"], + 'address': applicant["address"], + 'homephone': applicant["homephone"], + 'workphone': applicant["workphone"], + 'workphone2': applicant["workphone2"], + 'mobilephone': applicant["mobilephone"], + 'othercontactinfo':applicant["othercontactinfo"], + 'employeenumber': applicant["employeenumber"], + 'correctionnumber': applicant["correctionnumber"], + 'phn':applicant["phn"] + } + \ No newline at end of file From 07cb8443ee5d5e5559424bb5a201286e287205ab Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Thu, 14 Dec 2023 13:37:54 -0800 Subject: [PATCH 002/147] 1. update version to 1 2. prepare return values --- .../59a97f42b5f2_add_version_to_applicant.py | 5 ++- .../models/FOIRequestApplicantMappings.py | 16 ++----- .../models/FOIRequestApplicants.py | 16 +------ .../request_api/services/applicantservice.py | 42 ++++++++++--------- 4 files changed, 31 insertions(+), 48 deletions(-) diff --git a/request-management-api/migrations/versions/59a97f42b5f2_add_version_to_applicant.py b/request-management-api/migrations/versions/59a97f42b5f2_add_version_to_applicant.py index d3abe9199..9fd31fafb 100644 --- a/request-management-api/migrations/versions/59a97f42b5f2_add_version_to_applicant.py +++ b/request-management-api/migrations/versions/59a97f42b5f2_add_version_to_applicant.py @@ -18,8 +18,11 @@ def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.add_column('FOIRequestApplicants', sa.Column('version', sa.Integer(), nullable=True)) + op.add_column('FOIRequestApplicants', sa.Column('version', sa.Integer(), nullable=True, default=1)) op.add_column('FOIRequestApplicantMappings', sa.Column('foirequestapplicant_version', sa.Integer(), nullable=True)) + + op.execute('Update public."FOIRequestApplicants" set version = 1;') + op.execute('Update public."FOIRequestApplicantMappings" set foirequestapplicant_version = 1;') # ### end Alembic commands ### diff --git a/request-management-api/request_api/models/FOIRequestApplicantMappings.py b/request-management-api/request_api/models/FOIRequestApplicantMappings.py index a2d284a36..782a702ec 100644 --- a/request-management-api/request_api/models/FOIRequestApplicantMappings.py +++ b/request-management-api/request_api/models/FOIRequestApplicantMappings.py @@ -42,19 +42,9 @@ class FOIRequestApplicantMapping(db.Model): def getrequestapplicants(cls,foirequest_id,foirequestversion): from .FOIRequestApplicants import FOIRequestApplicant requestapplicant_schema = FOIRequestApplicantMappingSchema(many=True) - _applicantinfos = db.session.query(FOIRequestApplicantMapping - ).join( - FOIRequestApplicant, - and_( - FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, - or_( - FOIRequestApplicant.version == FOIRequestApplicantMapping.foirequestapplicant_version, - FOIRequestApplicantMapping.foirequestapplicant_version is None - ) - ) - ).filter( - FOIRequestApplicantMapping.foirequest_id == foirequest_id, - FOIRequestApplicantMapping.foirequestversion_id == foirequestversion + _applicantinfos = db.session.query(FOIRequestApplicantMapping).filter( + FOIRequestApplicantMapping.foirequest_id == foirequest_id, + FOIRequestApplicantMapping.foirequestversion_id == foirequestversion ).order_by(FOIRequestApplicantMapping.foirequestapplicantmappingid.asc()).all() applicantinfos = requestapplicant_schema.dump(_applicantinfos) return applicantinfos diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index edf66e47d..409debee6 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -136,11 +136,7 @@ def getapplicantbyemail(cls, email): # FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid and_( FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, - or_( - FOIRequestApplicant.version == None, - FOIRequestApplicantMapping.foirequestapplicant_version == None, - FOIRequestApplicant.version == FOIRequestApplicantMapping.foirequestapplicant_version - ) + FOIRequestApplicant.version == FOIRequestApplicantMapping.foirequestapplicant_version ) ).join( ApplicantCategory, @@ -237,8 +233,6 @@ def getapplicantbyemail(cls, email): contactemail.contactinformation == email ).order_by(FOIRequest.foirequestid.asc()) - print("query: ", query) - # print("result: ", query.all()) return applicantprofile_schema.dump(query.all()) @@ -311,11 +305,7 @@ def searchapplicant(cls, keywords): # FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid and_( FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, - or_( - FOIRequestApplicant.version == None, - FOIRequestApplicantMapping.foirequestapplicant_version == None, - FOIRequestApplicant.version == FOIRequestApplicantMapping.foirequestapplicant_version - ) + FOIRequestApplicant.version == FOIRequestApplicantMapping.foirequestapplicant_version ) ).join( ApplicantCategory, @@ -413,8 +403,6 @@ def searchapplicant(cls, keywords): or_(*FOIRequestApplicant.getsearchfilters(keywords, contactemail, contacthomephone, contactworkphone, contactworkphone2, contactmobilephone)) ).order_by(FOIRequest.foirequestid.asc()) - # print("query: ", query) - # print("result: ", query.all()) return applicantprofile_schema.dump(query.all()) diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index 59c890f28..55cd1730a 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -40,29 +40,31 @@ def __transformfilteringfields(self, filterfields): def __prepareapplicant(self, applicant): return { - 'foirequestapplicantid': applicant["foirequestapplicantid"], - 'firstname': applicant["firstname"], - 'middlename': applicant["middlename"], - 'lastname': applicant["lastname"], - 'alsoknownas': applicant["alsoknownas"], - 'dob' : applicant["dob"], + 'additionalPersonalInfo': { + 'alsoKnownAs': applicant["alsoknownas"], + 'birthDate': applicant["dob"], + 'personalHealthNumber': applicant["phn"], + }, + 'foiRequestApplicantID': applicant["foirequestapplicantid"], + 'firstName': applicant["firstname"], + 'middleName': applicant["middlename"], + 'lastName': applicant["lastname"], #'createdat' : self.__formatedate(applicant["createdat)"], - 'businessname': applicant["businessname"], + 'businessName': applicant["businessname"], # 'applicant': applicant["applicant"], - 'applicantversion': applicant["applicantversion"], - 'foirequestid': applicant["foirequestid"], - 'foirequestversion': applicant["foirequestversion"], - 'requesttype': applicant["requesttype"], - 'applicantcategory': applicant["applicantcategory"], + 'applicantVersion': applicant["applicantversion"], + 'foirequestID': applicant["foirequestid"], + 'foirequestVersion': applicant["foirequestversion"], + 'requestType': applicant["requesttype"], + 'category': applicant["applicantcategory"], 'email':applicant["email"], 'address': applicant["address"], - 'homephone': applicant["homephone"], - 'workphone': applicant["workphone"], - 'workphone2': applicant["workphone2"], - 'mobilephone': applicant["mobilephone"], - 'othercontactinfo':applicant["othercontactinfo"], - 'employeenumber': applicant["employeenumber"], - 'correctionnumber': applicant["correctionnumber"], - 'phn':applicant["phn"] + 'phonePrimary': applicant["homephone"], + 'workPhonePrimary': applicant["workphone"], + 'workPhoneSecondary': applicant["workphone2"], + 'phoneSecondary': applicant["mobilephone"], + 'otherContactInfo':applicant["othercontactinfo"], + 'publicServiceEmployeeNumber': applicant["employeenumber"], + 'correctionalServiceNumber': applicant["correctionnumber"], } \ No newline at end of file From 3e6abf63d08966ac6b0f9b5c53fd3cce9d703b21 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Thu, 14 Dec 2023 14:57:38 -0800 Subject: [PATCH 003/147] uncomment auth --- .../request_api/resources/foiapplicant.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/request-management-api/request_api/resources/foiapplicant.py b/request-management-api/request_api/resources/foiapplicant.py index 20142b4fd..682db49a1 100644 --- a/request-management-api/request_api/resources/foiapplicant.py +++ b/request-management-api/request_api/resources/foiapplicant.py @@ -45,8 +45,8 @@ class FOIApplicants(Resource): @staticmethod @TRACER.trace() @cross_origin(origins=allowedorigins()) - # @auth.require - # @auth.isiao + @auth.require + @auth.isiao @cors_preflight('GET,OPTIONS') def get(email=None): print(email) @@ -72,8 +72,8 @@ class EventPagination(Resource): @staticmethod @TRACER.trace() @cross_origin(origins=allowedorigins()) - # @auth.require - # @auth.isiao + @auth.require + @auth.isiao @cors_preflight('GET,OPTIONS') def get(): try: From 40c149142e61daf157519730c918ca8e0a9a4867 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 14 Dec 2023 14:58:43 -0800 Subject: [PATCH 004/147] initial commit for front end of applicant profile --- forms-flow-web/package.json | 1 + .../src/actions/FOI/foiActionConstants.js | 2 + .../src/actions/FOI/foiRequestActions.js | 6 + .../services/FOI/foiRequestServices.js | 91 +++ .../components/FOI/FOIAuthenticateRouting.jsx | 19 +- .../FOIRequest/AdditionalApplicantDetails.js | 4 +- .../FOI/FOIRequest/AddressContanctInfo.js | 26 +- .../FOI/FOIRequest/ApplicantDetails.js | 12 +- .../FOI/FOIRequest/ApplicantProfileModal.js | 552 ++++++++++++++++++ .../components/FOI/FOIRequest/FOIRequest.js | 44 +- .../components/FOI/FOIRequest/foirequest.scss | 38 ++ forms-flow-web/src/constants/constants.js | 2 +- .../src/modules/FOI/foiRequestsReducer.js | 2 + .../request_api/schemas/foirequestwrapper.py | 2 + .../foirequest/requestservicecreate.py | 35 +- 15 files changed, 802 insertions(+), 34 deletions(-) create mode 100644 forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js diff --git a/forms-flow-web/package.json b/forms-flow-web/package.json index 48573e06b..68168c50b 100644 --- a/forms-flow-web/package.json +++ b/forms-flow-web/package.json @@ -90,6 +90,7 @@ "react-helmet": "^6.1.0", "react-js-pagination": "^3.0.3", "react-loading-overlay": "^1.0.1", + "react-modal-resizable-draggable": "^0.1.6", "react-quill": "^1.3.5", "react-redux": "^7.2.4", "react-router-dom": "^5.1.2", diff --git a/forms-flow-web/src/actions/FOI/foiActionConstants.js b/forms-flow-web/src/actions/FOI/foiActionConstants.js index beaca7433..a4de0c74d 100644 --- a/forms-flow-web/src/actions/FOI/foiActionConstants.js +++ b/forms-flow-web/src/actions/FOI/foiActionConstants.js @@ -36,6 +36,8 @@ const FOI_ACTION_CONSTANTS = { CLEAR_MINISTRYVIEWREQUEST_DETAILS: "CLEAR_MINISTRYVIEWREQUEST_DETAILS", FOI_REQUEST_DUE_DATE: "FOI_REQUEST_DUE_DATE", + FOI_REQUEST_APPLICANT_PROFILE: "FOI_REQUEST_APPLICANT_PROFILE", + FOI_IS_REQUEST_UPDATED: "FOI_IS_REQUEST_UPDATED", FOI_REQUEST_DESCRIPTION_HISTORY: "FOI_REQUEST_DESCRIPTION_HISTORY", FOI_MINISTRY_REQUESTSLIST: "FOI_MINISTRY_REQUESTSLIST", diff --git a/forms-flow-web/src/actions/FOI/foiRequestActions.js b/forms-flow-web/src/actions/FOI/foiRequestActions.js index 8cb6826c1..2239937c5 100644 --- a/forms-flow-web/src/actions/FOI/foiRequestActions.js +++ b/forms-flow-web/src/actions/FOI/foiRequestActions.js @@ -128,6 +128,12 @@ export const setFOIMinistryViewRequestDetail = (data) => (dispatch) => { payload: data, }); }; +export const setFOIRequestApplicantProfile = (data) => (dispatch) => { + dispatch({ + type: FOI_ACTION_CONSTANTS.FOI_REQUEST_APPLICANT_PROFILE, + payload: data, + }); +}; export const setFOIPDFStitchedRecordForHarms = (data) => (dispatch) => { dispatch({ type: FOI_ACTION_CONSTANTS.FOI_PDF_STITCHED_RECORD_FOR_HARMS, diff --git a/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js b/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js index 30bd94e36..6ad3fcb6f 100644 --- a/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js +++ b/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js @@ -527,3 +527,94 @@ export const fetchRestrictedRequestCommentTagList = (requestid, ministryId, ...r } }; +export const fetchPotentialApplicants = async (firstname, lastname, email, phone, ...rest) => { + console.log("fetch applicants" + firstname) + console.log(firstname) + console.log(lastname) + + const done = fnDone(rest); + await new Promise(resolve => {setTimeout(resolve, 3000)}); + done(null, [ + { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35 }, + { id: 2, lastName: 'Lannister', firstName: 'Cersei', age: 42 }, + { id: 3, lastName: 'Lannister', firstName: 'Jaime', age: 45 }, + { id: 4, lastName: 'Stark', firstName: 'Arya', age: 16 }, + { id: 5, lastName: 'Targaryen', firstName: 'Daenerys', age: null }, + { id: 7, lastName: 'Clifford', firstName: 'Ferrara', age: 44 }, + { id: 8, lastName: 'Frances', firstName: 'Rossini', age: 36 }, + { id: 9, lastName: 'Roxie', firstName: 'Harvey', age: 65 }, + ]); + return; + // const apiUrlgetRequestDetails = replaceUrl(replaceUrl( + // API.FOI_MINISTRYVIEW_REQUEST_API, + // "", + // requestId + // ), "", ministryId); + // return (dispatch) => { + // httpGETRequest(apiUrlgetRequestDetails, {}, UserService.getToken()) + // .then((res) => { + // if (res.data) { + // const foiRequest = res.data; + // dispatch(clearMinistryViewRequestDetails({})); + // dispatch(setFOIMinistryViewRequestDetail(foiRequest)); + // dispatch(fetchFOIMinistryAssignedToList(foiRequest.selectedMinistries[0].code.toLowerCase())); + // dispatch(setFOILoader(false)); + // } else { + // dispatch(serviceActionError(res)); + // dispatch(setFOILoader(false)); + // throw new Error(`Error in fetching ministry request details for request# ${requestId} ministry# ${ministryId}`) + // } + // }) + // .catch((error) => { + // catchError(error, dispatch); + // }); + // }; +}; + +export const fetchApplicantInfo = async (firstname, ...rest) => { + + const done = fnDone(rest); + done(null, + { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35, email: 'jon.snow@gmail.com', + additionalPersonalInfo: {birthDate: "2023-12-07"}, + requestHistory: [{requestId: "EDU-2023-234345", receivedDate: "2023-12-07", currentState: "Open", requestDescription: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but als"}] + } + ); + return; + // const apiUrlgetRequestDetails = replaceUrl(replaceUrl( + // API.FOI_MINISTRYVIEW_REQUEST_API, + // "", + // requestId + // ), "", ministryId); + // return (dispatch) => { + // httpGETRequest(apiUrlgetRequestDetails, {}, UserService.getToken()) + // .then((res) => { + // if (res.data) { + // const foiRequest = res.data; + // dispatch(clearMinistryViewRequestDetails({})); + // dispatch(setFOIMinistryViewRequestDetail(foiRequest)); + // dispatch(fetchFOIMinistryAssignedToList(foiRequest.selectedMinistries[0].code.toLowerCase())); + // dispatch(setFOILoader(false)); + // } else { + // dispatch(serviceActionError(res)); + // dispatch(setFOILoader(false)); + // throw new Error(`Error in fetching ministry request details for request# ${requestId} ministry# ${ministryId}`) + // } + // }) + // .catch((error) => { + // catchError(error, dispatch); + // }); + // }; +}; + +export const fetchApplicantContactHistory = (...rest) => { + const done = fnDone(rest); + done(null, + [{ + field: "Email", + value: "a@b.ca", + date: "2023-12-11", + username: "foiintake@idir", + }] + ); +} \ No newline at end of file diff --git a/forms-flow-web/src/components/FOI/FOIAuthenticateRouting.jsx b/forms-flow-web/src/components/FOI/FOIAuthenticateRouting.jsx index 8b3f3d346..8ad114ee7 100644 --- a/forms-flow-web/src/components/FOI/FOIAuthenticateRouting.jsx +++ b/forms-flow-web/src/components/FOI/FOIAuthenticateRouting.jsx @@ -1,4 +1,4 @@ -import React, {useEffect}from "react"; +import React, {useEffect, useState}from "react"; import { Redirect, Route } from "react-router-dom"; import { useDispatch, useSelector } from "react-redux"; import "semantic-ui-css/semantic.min.css"; @@ -15,12 +15,21 @@ import { isMinistryLogin } from '../../helper/FOI/helper'; import UnAuthorized from "./UnAuthorized"; import Admin from "./Admin"; import Divisions from "./Admin/Divisions"; +import ApplicantProfileModal from "./FOIRequest/ApplicantProfileModal"; const FOIAuthenticateRouting = React.memo((props) => { const dispatch = useDispatch(); const isAuth = useSelector((state) => state.user.isAuthenticated); + + const [applicantProfileModalOpen, setApplicantProfileModalOpen] = useState(false); + const handleApplicantModalClose = () => { + setApplicantProfileModalOpen(false); + } + const openApplicantProfileModal = () => { + setApplicantProfileModalOpen(true); + } useEffect(()=>{ console.log('authenticate') @@ -51,13 +60,13 @@ const FOIAuthenticateRouting = React.memo((props) => { } - + - + @@ -72,6 +81,10 @@ const FOIAuthenticateRouting = React.memo((props) => { + ) : ( diff --git a/forms-flow-web/src/components/FOI/FOIRequest/AdditionalApplicantDetails.js b/forms-flow-web/src/components/FOI/FOIRequest/AdditionalApplicantDetails.js index 3a1e1b4e5..b5c55b678 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/AdditionalApplicantDetails.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/AdditionalApplicantDetails.js @@ -10,7 +10,7 @@ import AccordionDetails from '@material-ui/core/AccordionDetails'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -const AdditionalApplicantDetails = React.memo(({requestDetails, createSaveRequestObject, disableInput}) => { +const AdditionalApplicantDetails = React.memo(({requestDetails, createSaveRequestObject, disableInput, defaultExpanded}) => { /** * Addition Applicant details box in the UI * No mandatory fields here @@ -126,7 +126,7 @@ const AdditionalApplicantDetails = React.memo(({requestDetails, createSaveReques return (
- + } id="additionalApplicantDetails-header"> ADDITIONAL APPLICANT DETAILS diff --git a/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js b/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js index db057edbd..451b26fc6 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js @@ -9,7 +9,8 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import AccordionDetails from '@material-ui/core/AccordionDetails'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import {closeContactInfo} from '../FOIRequest/utils'; +import ApplicantProfileModal from "./ApplicantProfileModal"; +import { StateEnum } from "../../../constants/FOI/statusEnum"; const useStyles = makeStyles((_theme) => ({ row: { @@ -34,7 +35,8 @@ const AddressContactDetails = memo( handleContanctDetailsValue, handleEmailValidation, disableInput, - userDetail + defaultExpanded, + moreInfoAction, }) => { const classes = useStyles(); /** @@ -107,6 +109,13 @@ const AddressContactDetails = memo( //state management for email validation const [validation, setValidation] = React.useState({}); + // const [modalOpen, setModalOpen] = React.useState(false); + + + // const handleModalClose = () => { + // setModalOpen(false); + // } + React.useEffect(() => { setFieldValues(); const contanctDetailsObject = { @@ -289,12 +298,21 @@ const AddressContactDetails = memo( }; return (
- + } id="addressContactInfo-header"> ADDRESS AND CONTACT INFORMATION - + +
+ {moreInfoAction && } + {/* */} +
{ const useStyles = makeStyles({ @@ -227,11 +228,16 @@ const ApplicantDetails = React.memo( return (
- + } id="applicantDetails-header"> APPLICANT DETAILS +
+ {showHistory && } +
({ + root: { + "& .MuiTextField-root": { + margin: theme.spacing(1, "0px"), + }, + }, + disabledTitle: { + opacity: "0.3", + }, +})); + +const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { + const classes = useStyles(); + + let requestDetails = useSelector((state) => state.foiRequests.foiRequestDetail); + const dispatch = useDispatch(); + + console.log(requestDetails); + + const [searchText, setSearchText] = useState(""); + const [isLoading, setIsLoading] = useState(true); + const [rows, setRows] = useState([]); + const [selectedApplicant, setSelectedApplicant] = useState(false) + const [searchMode, setSearchMode] = useState("auto") + const [saveApplicantObject, setSaveApplicantObject] = React.useState({}) + const [showRequestHistory, setShowRequestHistory] = useState(false); + const [confirmationMessage, setConfirmationMessage] = useState(false); + const [createConfirmation, setCreateConfirmation] = useState(false); + const [isProfileDifferent, setIsProfileDifferent] = useState(false); + const [applicantHistory, setApplicantHistory] = useState(false); + + const columns = [ + { + field: 'firstName', + headerName: 'FIRST NAME', + flex: 1, + }, + { + field: 'middleName', + headerName: 'MIDDLE NAME', + flex: 1, + }, + { + field: 'lastName', + headerName: 'LAST NAME', + flex: 1, + }, + { + field: 'birthDate', + headerName: 'DATE OF BIRTH', + flex: 1, + }, + { + field: 'email', + headerName: 'EMAIL', + flex: 1, + }, + { + field: 'primaryPhone', + headerName: 'PRIMARY PHONE', + flex: 1, + }, + ]; + + + const requestHistoryColumns = [ + { + field: "requestId", + headerName: "REQUEST ID", + flex: 1, + }, + { + field: "currentState", + headerName: "CURRENT STATE", + flex: 1, + }, + { + field: "receivedDate", + headerName: "RECEIVED DATE", + flex: 1, + }, + { + field: "requestDescription", + headerName: "REQUEST DESRCIPTION", + flex: 3, + }, + ]; + + useEffect(() => { + if (modalOpen) { + setIsLoading(true); + if (requestDetails.currentState === StateEnum.intakeinprogress.name) { + fetchPotentialApplicants( + requestDetails.firstName, + requestDetails.lastName, + requestDetails.email, + requestDetails.primaryPhone, + (err, res) => { + setRows(res); + setIsLoading(false); + }) + } else { + fetchApplicantInfo(requestDetails.firstName, (err, res) => { + setSelectedApplicant(res); + }) + } + } + }, [modalOpen]) + + useEffect(() => { + setSaveApplicantObject({...selectedApplicant}) + for (let field in selectedApplicant) { + if (field === 'additionalPersonalInfo') { + if ((requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.DOB] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB]) || + (requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER])) { + setIsProfileDifferent(true); + break; + } + } else if (requestDetails[field] && selectedApplicant[field] !== requestDetails[field]) { + setIsProfileDifferent(true); + break; + } + } + }, [selectedApplicant]) + + const createSaveApplicantObject = (name, value, value2) => { + let newApplicantObj = {...saveApplicantObject} + if ([FOI_COMPONENT_CONSTANTS.DOB, FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER].includes(name)) { + newApplicantObj.additionalPersonalInfo[name] = value; + } else { + newApplicantObj[name] = value; + } + setSaveApplicantObject(newApplicantObj) + } + + const selectApplicantRow = (e) => { + fetchApplicantInfo(e.firstName, (err, res) => { + setSelectedApplicant(res); + }) + } + + const handleClose = () => { + setSearchText(""); + setIsLoading(true); + setRows([]); + setSelectedApplicant(false); + setConfirmationMessage(false); + setShowRequestHistory(false); + setApplicantHistory(false); + setCreateConfirmation(false); + handleModalClose(); + } + + const search = (rows) => { + return rows.filter(r => (r.firstName.toLowerCase().indexOf(searchText.toLowerCase()) > -1) || + (r.middleName?.toLowerCase().indexOf(searchText.toLowerCase()) > -1) || + (r.lastName.toLowerCase().indexOf(searchText.toLowerCase()) > -1) || + (r.birthDate?.toLowerCase().indexOf(searchText.toLowerCase()) > -1) || + (r.email?.toLowerCase().indexOf(searchText.toLowerCase()) > -1) || + (r.primaryPhone?.toLowerCase().indexOf(searchText.toLowerCase()) > -1) + ) + } + + const onSearchChange = (e) => { + if (searchMode === 'auto') { + setSearchText(e.target.value) + } + } + + const onSearchEnter = (e) => { + if (searchMode === 'manual' && e.key === 'Enter') { + console.log("search"); + } + } + + const selectProfile = () => { + if (_.isEqual(selectedApplicant, saveApplicantObject) || confirmationMessage) { + if (requestDetails.currentState === StateEnum.intakeinprogress.name) { + saveApplicantObject.applicantprofileid = 1; // fill in with actual id later + dispatch(setFOIRequestApplicantProfile(saveApplicantObject)); + } + // call save info api + handleClose() + } else { + setConfirmationMessage(true); + } + } + + const copyInfo = () => { + let updatedApplicant = {...selectedApplicant} + for (let field in selectedApplicant) { + if (field === 'additionalPersonalInfo') { + for (let infofield in requestDetails[field]) { + if (requestDetails[field][infofield] !== selectedApplicant[field][infofield]) { + updatedApplicant[field][infofield] = requestDetails[field][infofield]; + } + } + } else if (requestDetails[field] && selectedApplicant[field] !== requestDetails[field]) { + updatedApplicant[field] = requestDetails[field]; + } + } + setSaveApplicantObject(updatedApplicant); + setIsProfileDifferent(false); + } + + const showApplicantHistory = () => { + fetchApplicantContactHistory((err, res) => { + setApplicantHistory(res); + }) + } + + const back = () => { + if (applicantHistory) { + setApplicantHistory(false); + } else { + setSelectedApplicant(false); + } + } + + const cancel = () => { + if (createConfirmation) { + setCreateConfirmation(false); + } else { + handleClose(); + } + } + + const createProfile = () => { + if (!createConfirmation) { + setCreateConfirmation(true); + } else { + handleClose(); + } + } + + + return ( +
+ + + {selectedApplicant ? +

+ setShowRequestHistory(false)} + disableRipple + className={clsx("request-history-header applicant-profile-header", { + [classes.disabledTitle]: showRequestHistory + })} + > + Applicant Profile + + + setShowRequestHistory(true)} + disableRipple + className={clsx("request-history-header applicant-profile-header", { + [classes.disabledTitle]: !showRequestHistory + })} + > + Request History ({selectedApplicant.requestHistory.length}) + +

+ : +

+ Search Applicants +

+ } + + Close + + +
+
+ + {selectedApplicant ? + confirmationMessage ? +
Are you sure you would like to save changes for all open requests?

Please ensure you have checked the Request History to see the request(s) that will be affected.
+ : + (showRequestHistory ? + <> + + 'auto'} + getRowId={(row) => row.requestId} + /> + + : + applicantHistory ? + <> + {applicantHistory.map((entry, index) => { + return ( + } + aria-controls="panel1a-content" + > + {`APPLICANT CONTACT DETAILS`} + {entry.username} - {entry.date} + + +
+
+ {entry.field}: {entry.value} +
+
+
+
) + })} + + : + <> + {isProfileDifferent && + + Some of the fields in this profile do not match your original request. + + + } + {}} + handleApplicantDetailsValue={() => {}} + disableInput={false} + defaultExpanded={true} + showHistory={showApplicantHistory} + /> + {}} + handleContanctDetailsValue={() => {}} + handleEmailValidation={() => {}} + disableInput={false} + defaultExpanded={false} + /> + + ) + : + createConfirmation ? +
New Profile will be created automatically when request is moved to open state.

Please make any additional changes in Request Details.
+ : + <> +
+ Select an applicant to view their details. Or create a new profile + if applicant cannot be found. +
+ + + + + Search + + + + } + fullWidth + /> + + + + setSearchMode("manual")} + clicked={searchMode === "manual"} + /> + setSearchMode("auto")} + clicked={searchMode === "auto"} + /> + + + + + + + + } +
+
+ + {selectedApplicant ? + (confirmationMessage ? + <> + : + <>{!applicantHistory && } + + ): + <> + + } + +
+
+ ); + }); + +export default ApplicantProfileModal; \ No newline at end of file diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index d754731d2..c6ad8617d 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -73,6 +73,8 @@ import { isMandatoryField, isAxisSyncDisplayField, getUniqueIdentifier, + closeContactInfo, + closeApplicantDetails } from "./utils"; import { ConditionalComponent, @@ -89,6 +91,8 @@ import { UnsavedModal } from "../customComponents"; import { DISABLE_GATHERINGRECORDS_TAB } from "../../../constants/constants"; import _ from "lodash"; import { MinistryNeedsScanning } from "../../../constants/FOI/enum"; +import ApplicantProfileModal from "./ApplicantProfileModal"; +import { setFOIRequestDetail } from "../../../actions/FOI/foiRequestActions"; const useStyles = makeStyles((theme) => ({ root: { @@ -112,7 +116,7 @@ const useStyles = makeStyles((theme) => ({ }, })); -const FOIRequest = React.memo(({ userDetail }) => { +const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { const [_requestStatus, setRequestStatus] = React.useState( StateEnum.unopened.name ); @@ -154,6 +158,9 @@ const FOIRequest = React.memo(({ userDetail }) => { // let requestRecords = useSelector( // (state) => state.foiRequests.foiRequestRecords // ); + let requestApplicantProfile = useSelector( + (state) => state.foiRequests.foiRequestApplicantProfile + ) const [attachments, setAttachments] = useState(requestAttachments); const [comment, setComment] = useState([]); const [requestState, setRequestState] = useState(StateEnum.unopened.name); @@ -170,6 +177,8 @@ const FOIRequest = React.memo(({ userDetail }) => { dispatch(push(`/foi/dashboard`)); }; + + const returnToQueue = (e) => { if (unSavedRequest) { setUnsavedMessage( @@ -281,7 +290,9 @@ const FOIRequest = React.memo(({ userDetail }) => { dispatch(fetchApplicantCorrespondenceTemplates()); dispatch( fetchRedactedSections(ministryId, (_err, res) => { - setRedactedSections(res.sections); + if (!_err) { + setRedactedSections(res.sections); + } }) ); } @@ -327,6 +338,23 @@ const FOIRequest = React.memo(({ userDetail }) => { } }, [requestDetails]); + useEffect(() => { + if (requestApplicantProfile) { + let newRequestDetails = { ...saveRequestObject }; + for (let field in requestApplicantProfile) { + if (field === "additionalPersonalInfo") { + for (let infofield in requestApplicantProfile[field]) { + newRequestDetails[field][infofield] = + requestApplicantProfile[field][infofield]; + } + } else { + newRequestDetails[field] = requestApplicantProfile[field]; + } + } + dispatch(setFOIRequestDetail(newRequestDetails)) + } + }, [requestApplicantProfile]); + useEffect(() => { if (isIAORestricted) dispatch(fetchRestrictedRequestCommentTagList(requestId, ministryId)); @@ -1118,8 +1146,8 @@ const FOIRequest = React.memo(({ userDetail }) => { handleApplicantDetailsValue } createSaveRequestObject={createSaveRequestObject} - disableInput={disableInput} - userDetail={userDetail} + disableInput={disableInput || ministryId} + defaultExpanded={!closeApplicantDetails(userDetail, requestDetails?.requestType)} /> {requiredRequestDetailsValues.requestType.toLowerCase() === FOI_COMPONENT_CONSTANTS.REQUEST_TYPE_PERSONAL && ( @@ -1151,9 +1179,10 @@ const FOIRequest = React.memo(({ userDetail }) => { handleContactDetailsInitialValue } handleContanctDetailsValue={handleContanctDetailsValue} - disableInput={disableInput} + disableInput={disableInput || ministryId} handleEmailValidation={handleEmailValidation} - userDetail={userDetail} + defaultExpanded={!closeContactInfo(userDetail,requestDetails)} + moreInfoAction={openApplicantProfileModal} /> { )} {showDivisionalTracking && ( diff --git a/forms-flow-web/src/components/FOI/FOIRequest/foirequest.scss b/forms-flow-web/src/components/FOI/FOIRequest/foirequest.scss index 5a4bcc002..d05c931b4 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/foirequest.scss +++ b/forms-flow-web/src/components/FOI/FOIRequest/foirequest.scss @@ -164,4 +164,42 @@ height: fit-content; .foi-details-row-break { margin-bottom: 2em; +} + +.applicant-profile-modal { + z-index: 2000 !important; +} + +.search-applicants-header { + margin-left: 22px !important; +} + +.applicant-profile-header{ + font-size: 25px !important; + color: black; +} + +.flexible-modal-drag-area { + background: none !important; +} + +.flexible-modal-resizer { + position:absolute; + right:0; + bottom:0; + cursor:se-resize; + margin:5px; + border-bottom: none !important; + border-right: none !important; + background-size: 16px; + background-image: url("data:image/svg+xml,%3Csvg width='30' height='30' xmlns='http://www.w3.org/2000/svg' stroke='null' style='vector-effect: non-scaling-stroke;'%3E%3Cg id='Layer_1'%3E%3Ctitle%3ELayer 1%3C/title%3E%3Cellipse stroke='%23666666' ry='0.44882' rx='0.44882' id='svg_2' cy='28.93701' cx='18.62205' fill='none'/%3E%3Cellipse stroke='%23666666' ry='0.44882' rx='0.44882' id='svg_3' cy='19.01575' cx='28.38583' fill='none'/%3E%3Cline transform='rotate(45 23.4602 24.0105)' id='svg_4' y2='31.01042' x2='23.51658' y1='17.01051' x1='23.40384' stroke-width='2' stroke='%23666666' fill='none'/%3E%3Cline transform='rotate(45 19.7988 19.5616)' stroke='%23666666' id='svg_6' y2='32.63046' x2='19.85521' y1='6.49282' x1='19.74247' stroke-width='2' fill='none'/%3E%3Cellipse stroke='%23666666' ry='0.44882' rx='0.44882' id='svg_7' cy='10.27559' cx='28.93701' fill='none'/%3E%3Cellipse stroke='%23666666' ry='0.44882' rx='0.44882' id='svg_8' cy='28.77953' cx='10.66929' fill='none'/%3E%3Cline transform='rotate(45 15.4681 15.4671)' stroke='%23666666' id='svg_9' y2='34.10369' x2='15.52444' y1='-3.16948' x1='15.41171' stroke-width='2' fill='none'/%3E%3Cellipse stroke='%23666666' ry='0.44882' rx='0.44882' id='svg_10' cy='2.24409' cx='28.62205' fill='none'/%3E%3Cellipse stroke='%23666666' ry='0.44882' rx='0.44882' id='svg_11' cy='28.62205' cx='2.40158' fill='none'/%3E%3C/g%3E%3C/svg%3E"); +} + +#menu- { + z-index: 2300 !important; +} + +.btn-update-profile { + border: none; + background: none; } \ No newline at end of file diff --git a/forms-flow-web/src/constants/constants.js b/forms-flow-web/src/constants/constants.js index ab289438e..3a19df993 100644 --- a/forms-flow-web/src/constants/constants.js +++ b/forms-flow-web/src/constants/constants.js @@ -62,6 +62,6 @@ export const FOI_RECORD_FORMATS = `${(window._env_ && window._env_.REACT_APP_FOI export const RECORD_PROCESSING_HRS = (window._env_ && window._env_.REACT_APP_RECORD_PROCESSING_HRS) || process.env.REACT_APP_RECORD_PROCESSING_HRS || 4; -export const DISABLE_REDACT_WEBLINK = (window._env_ && window._env_.REACT_APP_DISABLE_REDACT_WEBLINK) || process.env.REACT_APP_DISABLE_REDACT_WEBLINK || false; +export const DISABLE_REDACT_WEBLINK = (window._env_ && window._env_.REACT_APP_DISABLE_REDACT_WEBLINK) || process.env.REACT_APP_DISABLE_REDACT_WEBLINK || 'false'; export const DISABLE_GATHERINGRECORDS_TAB = (window._env_ && window._env_.REACT_APP_DISABLE_GATHERINGRECORDS_TAB) || process.env.REACT_APP_DISABLE_GATHERINGRECORDS_TAB || 'false'; diff --git a/forms-flow-web/src/modules/FOI/foiRequestsReducer.js b/forms-flow-web/src/modules/FOI/foiRequestsReducer.js index 8dd27296b..3f2b3dc1a 100644 --- a/forms-flow-web/src/modules/FOI/foiRequestsReducer.js +++ b/forms-flow-web/src/modules/FOI/foiRequestsReducer.js @@ -201,6 +201,8 @@ const foiRequests = (state = initialState, action) => { return { ...state, foiRequestsCount: action.payload.count }; case FOI_ACTION_CONSTANTS.FOI_REQUEST_DETAIL: return { ...state, foiRequestDetail: action.payload }; + case FOI_ACTION_CONSTANTS.FOI_REQUEST_APPLICANT_PROFILE: + return { ...state, foiRequestApplicantProfile: action.payload }; case FOI_ACTION_CONSTANTS.FOI_REQUEST_DUE_DATE: return { ...state, diff --git a/request-management-api/request_api/schemas/foirequestwrapper.py b/request-management-api/request_api/schemas/foirequestwrapper.py index efdb027ac..5e829c84c 100644 --- a/request-management-api/request_api/schemas/foirequestwrapper.py +++ b/request-management-api/request_api/schemas/foirequestwrapper.py @@ -110,6 +110,8 @@ class Meta: # pylint: disable=too-few-public-methods correctionalServiceNumber = fields.Str(data_key="correctionalServiceNumber",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) publicServiceEmployeeNumber = fields.Str(data_key="publicServiceEmployeeNumber",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) isiaorestricted = fields.Bool(data_key="isiaorestricted") + + applicantprofileid = fields.Int(data_key="applicantprofileid",required=False,allow_none=True) selectedMinistries = fields.Nested(FOIMinistryRequestWrapperSchema, many=True) additionalPersonalInfo = fields.Nested(FOIAdditionallPersonalInfoWrapperSchema,required=False,allow_none=True) diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index 6d4b2142f..555c8570e 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -12,6 +12,7 @@ from request_api.models.FOIRequestContactInformation import FOIRequestContactInformation from request_api.models.FOIRequestPersonalAttributes import FOIRequestPersonalAttribute from request_api.models.FOIRequestApplicantMappings import FOIRequestApplicantMapping +from request_api.models.RequestorType import RequestorType import json class requestservicecreate: @@ -126,20 +127,26 @@ def __prepareapplicants(self, foirequestschema, userid): requestapplicantarr = [] selfalsoknownas=None selfdob=None - if foirequestschema.get("additionalPersonalInfo") is not None: - applicantinfo = foirequestschema.get("additionalPersonalInfo") - selfdob = applicantinfo["birthDate"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"birthDate","additionalPersonalInfo") else None - selfalsoknownas = applicantinfo["alsoKnownAs"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"alsoKnownAs","additionalPersonalInfo") else None - requestapplicantarr.append( - requestservicebuilder().createapplicant(foirequestschema.get("firstName"), - foirequestschema.get("lastName"), - "Self", - userid, - foirequestschema.get("middleName"), - foirequestschema.get("businessName"), - selfalsoknownas, - selfdob) - ) + if foirequestschema.get("additionalPersonalInfo") is not None and foirequestschema.get('requeststatusid') == 1: + if foirequestschema.get('applicantprofileid', None): + requestapplicant = FOIRequestApplicantMapping() + requestapplicant.foirequestapplicantid = foirequestschema['applicantprofileid'] + requestapplicant.requestortypeid = RequestorType().getrequestortype("Self")["requestortypeid"] + requestapplicantarr.append(requestapplicant) + else: + applicantinfo = foirequestschema.get("additionalPersonalInfo") + selfdob = applicantinfo["birthDate"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"birthDate","additionalPersonalInfo") else None + selfalsoknownas = applicantinfo["alsoKnownAs"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"alsoKnownAs","additionalPersonalInfo") else None + requestapplicantarr.append( + requestservicebuilder().createapplicant(foirequestschema.get("firstName"), + foirequestschema.get("lastName"), + "Self", + userid, + foirequestschema.get("middleName"), + foirequestschema.get("businessName"), + selfalsoknownas, + selfdob) + ) #Prepare additional applicants if foirequestschema.get("additionalPersonalInfo") is not None: From 31ffc19459893208e8e00e9bda68692b7aef214a Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Thu, 14 Dec 2023 15:13:07 -0800 Subject: [PATCH 005/147] bug fix --- request-management-api/request_api/auth.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/request-management-api/request_api/auth.py b/request-management-api/request_api/auth.py index 386b68e03..ff89ca2c9 100644 --- a/request-management-api/request_api/auth.py +++ b/request-management-api/request_api/auth.py @@ -148,10 +148,10 @@ def wrapper(*args, **kwargs): @classmethod def isiao(cls,func): @wraps(func) - def decorated(type, id, field,*args, **kwargs): + def decorated(*args, **kwargs): usertype = AuthHelper.getusertype() if(usertype == "iao"): - return func(type, id, field,*args, **kwargs) + return func(*args, **kwargs) else: return "Unauthorized" , 401 return decorated From ec681836aa2b30d376360d3a4fc08f218de4bc49 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Fri, 15 Dec 2023 13:03:09 -0800 Subject: [PATCH 006/147] aggregate search result --- .../models/FOIRequestApplicants.py | 82 +++++++++++++++---- .../request_api/resources/foiapplicant.py | 23 +++--- .../request_api/services/applicantservice.py | 38 +++++---- 3 files changed, 99 insertions(+), 44 deletions(-) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 409debee6..b9abcf876 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -9,7 +9,7 @@ from .FOIRequests import FOIRequest from .FOIRequestContactInformation import FOIRequestContactInformation from .FOIRequestPersonalAttributes import FOIRequestPersonalAttribute -from sqlalchemy import and_, or_, asc, func +from sqlalchemy import and_, or_, func, case class FOIRequestApplicant(db.Model): # Name of the table in our database @@ -122,8 +122,7 @@ def getapplicantbyemail(cls, email): personalhealthnumber.attributevalue.label('phn') ] - applicantprofile_schema = ApplicantProfileSchema(many=True) - query = _session.query( + subquery_all = _session.query( *selectedcolumns ).join( FOIRequestApplicantMapping, @@ -231,9 +230,35 @@ def getapplicantbyemail(cls, email): FOIMinistryRequest.requeststatusid != 3, FOIRequest.isactive == True, contactemail.contactinformation == email - ).order_by(FOIRequest.foirequestid.asc()) + ).order_by(FOIRequest.foirequestid.desc()).subquery() + + query_aggregate = _session.query( + subquery_all.c.foirequestapplicantid, + func.array_agg(subquery_all.c.firstname).label('firstname'), + func.array_agg(subquery_all.c.middlename).label('middlename'), + func.array_agg(subquery_all.c.lastname).label('lastname'), + func.array_agg(subquery_all.c.alsoknownas).label('alsoknownas'), + func.array_agg(subquery_all.c.dob).label('dob'), + func.array_agg(subquery_all.c.businessname).label('businessname'), + subquery_all.c.applicantversion, + func.array_agg(subquery_all.c.foirequestid).label('foirequestid'), + func.array_agg(subquery_all.c.foirequestversion).label('foirequestversion'), + func.array_agg(subquery_all.c.requesttype).label('requesttype'), + func.array_agg(subquery_all.c.applicantcategory).label('applicantcategory'), + func.array_agg(subquery_all.c.email).label('email'), + func.array_agg(subquery_all.c.address).label('address'), + func.array_agg(subquery_all.c.homephone).label('homephone'), + func.array_agg(subquery_all.c.workphone).label('workphone'), + func.array_agg(subquery_all.c.workphone2).label('workphone2'), + func.array_agg(subquery_all.c.mobilephone).label('mobilephone'), + func.array_agg(subquery_all.c.othercontactinfo).label('othercontactinfo'), + func.array_agg(subquery_all.c.employeenumber).label('employeenumber'), + func.array_agg(subquery_all.c.correctionnumber).label('correctionnumber'), + func.array_agg(subquery_all.c.phn).label('phn') + ).group_by(subquery_all.c.foirequestapplicantid, subquery_all.c.applicantversion) - return applicantprofile_schema.dump(query.all()) + applicantprofile_schema = ApplicantProfileSchema(many=True) + return applicantprofile_schema.dump(query_aggregate.all()) # Search applicant by keywords @@ -291,8 +316,7 @@ def searchapplicant(cls, keywords): personalhealthnumber.attributevalue.label('phn') ] - applicantprofile_schema = ApplicantProfileSchema(many=True) - query = _session.query( + subquery_all = _session.query( *selectedcolumns ).join( FOIRequestApplicantMapping, @@ -401,34 +425,60 @@ def searchapplicant(cls, keywords): FOIMinistryRequest.requeststatusid != 3, FOIRequest.isactive == True, or_(*FOIRequestApplicant.getsearchfilters(keywords, contactemail, contacthomephone, contactworkphone, contactworkphone2, contactmobilephone)) - ).order_by(FOIRequest.foirequestid.asc()) + ).order_by(FOIRequest.foirequestid.desc()).subquery() + + query_aggregate = _session.query( + subquery_all.c.foirequestapplicantid, + func.array_agg(subquery_all.c.firstname).label('firstname'), + func.array_agg(subquery_all.c.middlename).label('middlename'), + func.array_agg(subquery_all.c.lastname).label('lastname'), + func.array_agg(subquery_all.c.alsoknownas).label('alsoknownas'), + func.array_agg(subquery_all.c.dob).label('dob'), + func.array_agg(subquery_all.c.businessname).label('businessname'), + subquery_all.c.applicantversion, + func.array_agg(subquery_all.c.foirequestid).label('foirequestid'), + func.array_agg(subquery_all.c.foirequestversion).label('foirequestversion'), + func.array_agg(subquery_all.c.requesttype).label('requesttype'), + func.array_agg(subquery_all.c.applicantcategory).label('applicantcategory'), + func.array_agg(subquery_all.c.email).label('email'), + func.array_agg(subquery_all.c.address).label('address'), + func.array_agg(subquery_all.c.homephone).label('homephone'), + func.array_agg(subquery_all.c.workphone).label('workphone'), + func.array_agg(subquery_all.c.workphone2).label('workphone2'), + func.array_agg(subquery_all.c.mobilephone).label('mobilephone'), + func.array_agg(subquery_all.c.othercontactinfo).label('othercontactinfo'), + func.array_agg(subquery_all.c.employeenumber).label('employeenumber'), + func.array_agg(subquery_all.c.correctionnumber).label('correctionnumber'), + func.array_agg(subquery_all.c.phn).label('phn') + ).group_by(subquery_all.c.foirequestapplicantid, subquery_all.c.applicantversion) - return applicantprofile_schema.dump(query.all()) + applicantprofile_schema = ApplicantProfileSchema(many=True) + return applicantprofile_schema.dump(query_aggregate.all()) @classmethod def getsearchfilters(cls, keywords, contactemail, contacthomephone, contactworkphone, contactworkphone2, contactmobilephone): searchfilters = [] if(len(keywords) > 0): - if(keywords['firstname'] is not None): + if('firstname' in keywords): searchfilters.append(FOIRequestApplicant.firstname.ilike('%'+keywords['firstname']+'%')) - if(keywords['lastname'] is not None): + if('lastname' in keywords): searchfilters.append(FOIRequestApplicant.lastname.ilike('%'+keywords['lastname']+'%')) - if(keywords['email'] is not None): + if('email' in keywords): searchfilters.append(contactemail.contactinformation.ilike('%'+keywords['email']+'%')) - if(keywords['homephone'] is not None): + if('homephone' in keywords): searchfilters.append(contacthomephone.contactinformation.ilike('%'+keywords['homephone']+'%')) - if(keywords['workphone'] is not None): + if('workphone' in keywords): searchfilters.append(contactworkphone.contactinformation.ilike('%'+keywords['workphone']+'%')) - if(keywords['workphone2'] is not None): + if('workphone2' in keywords): searchfilters.append(contactworkphone2.contactinformation.ilike('%'+keywords['workphone2']+'%')) - if(keywords['mobilephone'] is not None): + if('mobilephone' in keywords): searchfilters.append(contactmobilephone.contactinformation.ilike('%'+keywords['mobilephone']+'%')) return searchfilters diff --git a/request-management-api/request_api/resources/foiapplicant.py b/request-management-api/request_api/resources/foiapplicant.py index 682db49a1..1bc0cfa11 100644 --- a/request-management-api/request_api/resources/foiapplicant.py +++ b/request-management-api/request_api/resources/foiapplicant.py @@ -55,7 +55,6 @@ def get(email=None): return {'status': False, 'message':EXCEPTION_MESSAGE_BAD_REQUEST}, 400 try: result = applicantservice().getapplicantbyemail(email) - print("result-endpoint: ", result) if result is not None: return json.dumps(result), 200 else: @@ -64,7 +63,7 @@ def get(email=None): return {'status': exception.status_code, 'message':exception.message}, 500 -@cors_preflight('GET,OPTIONS') +@cors_preflight('POST,OPTIONS') @API.route('/foiapplicants/search') class EventPagination(Resource): """ Retrives the foi request based on the queue type. @@ -74,20 +73,20 @@ class EventPagination(Resource): @cross_origin(origins=allowedorigins()) @auth.require @auth.isiao - @cors_preflight('GET,OPTIONS') - def get(): + @cors_preflight('POST,OPTIONS') + def post(): try: - _keywords = flask.request.args.get('keywords', None, type=str) - print(_keywords) + requestjson = request.get_json() + _keywords = requestjson['keywords'] - result = [] - statuscode = 200 if _keywords is None or _keywords == "": - result = applicantservice().searchapplicant(_keywords) + return {'status': False, 'message':EXCEPTION_MESSAGE_BAD_REQUEST}, 400 else: - statuscode = 401 - - return result, statuscode + result = applicantservice().searchapplicant(_keywords) + if result is not None: + return json.dumps(result), 200 + else: + return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 except BusinessException as exception: return {'status': exception.status_code, 'message':exception.message}, 500 diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index 55cd1730a..fd2d7ebe7 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -38,33 +38,39 @@ def __validateandtransform(self, filterfields): def __transformfilteringfields(self, filterfields): return list(map(lambda x: x.replace('createdat', 'createdatformatted'), filterfields)) + def __first_not_null(self, list): + for item in list: + if item is not None: + return item + return None + def __prepareapplicant(self, applicant): return { 'additionalPersonalInfo': { - 'alsoKnownAs': applicant["alsoknownas"], - 'birthDate': applicant["dob"], - 'personalHealthNumber': applicant["phn"], + 'alsoKnownAs': self.__first_not_null(applicant["alsoknownas"]), + 'birthDate': self.__first_not_null(applicant["dob"]), + 'personalHealthNumber': self.__first_not_null(applicant["phn"]), }, 'foiRequestApplicantID': applicant["foirequestapplicantid"], - 'firstName': applicant["firstname"], - 'middleName': applicant["middlename"], - 'lastName': applicant["lastname"], + 'firstName': self.__first_not_null(applicant["firstname"]), + 'middleName': self.__first_not_null(applicant["middlename"]), + 'lastName': self.__first_not_null(applicant["lastname"]), #'createdat' : self.__formatedate(applicant["createdat)"], - 'businessName': applicant["businessname"], + 'businessName': self.__first_not_null(applicant["businessname"]), # 'applicant': applicant["applicant"], 'applicantVersion': applicant["applicantversion"], 'foirequestID': applicant["foirequestid"], 'foirequestVersion': applicant["foirequestversion"], 'requestType': applicant["requesttype"], 'category': applicant["applicantcategory"], - 'email':applicant["email"], - 'address': applicant["address"], - 'phonePrimary': applicant["homephone"], - 'workPhonePrimary': applicant["workphone"], - 'workPhoneSecondary': applicant["workphone2"], - 'phoneSecondary': applicant["mobilephone"], - 'otherContactInfo':applicant["othercontactinfo"], - 'publicServiceEmployeeNumber': applicant["employeenumber"], - 'correctionalServiceNumber': applicant["correctionnumber"], + 'email': self.__first_not_null(applicant["email"]), + 'address': self.__first_not_null(applicant["address"]), + 'phonePrimary': self.__first_not_null(applicant["homephone"]), + 'workPhonePrimary': self.__first_not_null(applicant["workphone"]), + 'workPhoneSecondary': self.__first_not_null(applicant["workphone2"]), + 'phoneSecondary': self.__first_not_null(applicant["mobilephone"]), + 'otherContactInfo': self.__first_not_null(applicant["othercontactinfo"]), + 'publicServiceEmployeeNumber': self.__first_not_null(applicant["employeenumber"]), + 'correctionalServiceNumber': self.__first_not_null(applicant["correctionnumber"]), } \ No newline at end of file From b3312967006de90650ff89841ed5b7915e444b21 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Fri, 15 Dec 2023 16:04:36 -0800 Subject: [PATCH 007/147] bug fix --- .../request_api/models/FOIRequestApplicants.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index b9abcf876..ca51f2bf1 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -103,7 +103,7 @@ def getapplicantbyemail(cls, email): FOIRequestApplicant.middlename.label('middlename'), FOIRequestApplicant.lastname.label('lastname'), FOIRequestApplicant.alsoknownas.label('alsoknownas'), - FOIRequestApplicant.dob.label('dob'), + func.to_char(FOIRequestApplicant.dob, 'YYYY-MM-DD').label('dob'), FOIRequestApplicant.businessname.label('businessname'), FOIRequestApplicant.version.label('applicantversion'), FOIRequest.foirequestid.label('foirequestid'), @@ -227,7 +227,7 @@ def getapplicantbyemail(cls, email): personalhealthnumber.attributevalue is not None), isouter=True ).filter( - FOIMinistryRequest.requeststatusid != 3, + # FOIMinistryRequest.requeststatusid != 3, FOIRequest.isactive == True, contactemail.contactinformation == email ).order_by(FOIRequest.foirequestid.desc()).subquery() @@ -297,7 +297,7 @@ def searchapplicant(cls, keywords): FOIRequestApplicant.middlename.label('middlename'), FOIRequestApplicant.lastname.label('lastname'), FOIRequestApplicant.alsoknownas.label('alsoknownas'), - FOIRequestApplicant.dob.label('dob'), + func.to_char(FOIRequestApplicant.dob, 'YYYY-MM-DD').label('dob'), FOIRequestApplicant.businessname.label('businessname'), FOIRequestApplicant.version.label('applicantversion'), FOIRequest.foirequestid.label('foirequestid'), @@ -422,7 +422,7 @@ def searchapplicant(cls, keywords): personalhealthnumber.attributevalue is not None), isouter=True ).filter( - FOIMinistryRequest.requeststatusid != 3, + # FOIMinistryRequest.requeststatusid != 3, FOIRequest.isactive == True, or_(*FOIRequestApplicant.getsearchfilters(keywords, contactemail, contacthomephone, contactworkphone, contactworkphone2, contactmobilephone)) ).order_by(FOIRequest.foirequestid.desc()).subquery() From 26c9ccf2769c349b904ba416b584c76b97e7f3a9 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Dec 2023 10:09:45 -0800 Subject: [PATCH 008/147] intermediate commit for backend code saving changes to all open requests for an applicant --- .../src/apiManager/endpoints/index.js | 2 + .../services/FOI/foiRequestServices.js | 75 +++++++++---------- .../FOI/FOIRequest/ApplicantProfileModal.js | 17 ++--- .../components/FOI/FOIRequest/foirequest.scss | 4 + .../request_api/models/FOIMinistryRequests.py | 9 +++ .../models/FOIRequestApplicants.py | 59 ++++++++++++++- .../request_api/resources/foiapplicant.py | 23 ++++++ .../request_api/schemas/foirequestwrapper.py | 2 +- .../request_api/services/applicantservice.py | 17 ++++- .../foirequest/requestservicecreate.py | 4 +- 10 files changed, 158 insertions(+), 54 deletions(-) diff --git a/forms-flow-web/src/apiManager/endpoints/index.js b/forms-flow-web/src/apiManager/endpoints/index.js index 111ee62ec..3f31e4366 100644 --- a/forms-flow-web/src/apiManager/endpoints/index.js +++ b/forms-flow-web/src/apiManager/endpoints/index.js @@ -38,6 +38,8 @@ const API = { FOI_GET_MINISTRY_REQUEST_WATCHERS: `${FOI_BASE_API_URL}/api/foiwatcher/ministryrequest/`, FOI_GET_CLOSING_REASONS: `${FOI_BASE_API_URL}/api/foiflow/closereasons`, FOI_POST_OSS_HEADER: `${FOI_BASE_API_URL}/api/foiflow/oss/authheader`, + + FOI_GET_REQUEST_APPLICANTS: `${FOI_BASE_API_URL}/api/foiapplicants/`, FOI_GET_PROGRAMAREADIVISIONS: `${FOI_BASE_API_URL}/api/foiadmin/divisions`, FOI_POST_PROGRAMAREADIVISION: `${FOI_BASE_API_URL}/api/foiadmin/division`, diff --git a/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js b/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js index 6ad3fcb6f..f6462492a 100644 --- a/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js +++ b/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js @@ -527,48 +527,43 @@ export const fetchRestrictedRequestCommentTagList = (requestid, ministryId, ...r } }; -export const fetchPotentialApplicants = async (firstname, lastname, email, phone, ...rest) => { - console.log("fetch applicants" + firstname) - console.log(firstname) - console.log(lastname) +export const fetchPotentialApplicants = (firstname, lastname, email, phone, ...rest) => { + // console.log("fetch applicants" + firstname) + // console.log(firstname) + // console.log(lastname) const done = fnDone(rest); - await new Promise(resolve => {setTimeout(resolve, 3000)}); - done(null, [ - { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35 }, - { id: 2, lastName: 'Lannister', firstName: 'Cersei', age: 42 }, - { id: 3, lastName: 'Lannister', firstName: 'Jaime', age: 45 }, - { id: 4, lastName: 'Stark', firstName: 'Arya', age: 16 }, - { id: 5, lastName: 'Targaryen', firstName: 'Daenerys', age: null }, - { id: 7, lastName: 'Clifford', firstName: 'Ferrara', age: 44 }, - { id: 8, lastName: 'Frances', firstName: 'Rossini', age: 36 }, - { id: 9, lastName: 'Roxie', firstName: 'Harvey', age: 65 }, - ]); - return; - // const apiUrlgetRequestDetails = replaceUrl(replaceUrl( - // API.FOI_MINISTRYVIEW_REQUEST_API, - // "", - // requestId - // ), "", ministryId); - // return (dispatch) => { - // httpGETRequest(apiUrlgetRequestDetails, {}, UserService.getToken()) - // .then((res) => { - // if (res.data) { - // const foiRequest = res.data; - // dispatch(clearMinistryViewRequestDetails({})); - // dispatch(setFOIMinistryViewRequestDetail(foiRequest)); - // dispatch(fetchFOIMinistryAssignedToList(foiRequest.selectedMinistries[0].code.toLowerCase())); - // dispatch(setFOILoader(false)); - // } else { - // dispatch(serviceActionError(res)); - // dispatch(setFOILoader(false)); - // throw new Error(`Error in fetching ministry request details for request# ${requestId} ministry# ${ministryId}`) - // } - // }) - // .catch((error) => { - // catchError(error, dispatch); - // }); - // }; + // await new Promise(resolve => {setTimeout(resolve, 3000)}); + // done(null, [ + // { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35 }, + // { id: 2, lastName: 'Lannister', firstName: 'Cersei', age: 42 }, + // { id: 3, lastName: 'Lannister', firstName: 'Jaime', age: 45 }, + // { id: 4, lastName: 'Stark', firstName: 'Arya', age: 16 }, + // { id: 5, lastName: 'Targaryen', firstName: 'Daenerys', age: null }, + // { id: 7, lastName: 'Clifford', firstName: 'Ferrara', age: 44 }, + // { id: 8, lastName: 'Frances', firstName: 'Rossini', age: 36 }, + // { id: 9, lastName: 'Roxie', firstName: 'Harvey', age: 65 }, + // ]); + // return; + const apiUrlgetRequestDetails = replaceUrl( + API.FOI_GET_REQUEST_APPLICANTS, + "", + email + ); + return (dispatch) => { + httpGETRequest(apiUrlgetRequestDetails, {}, UserService.getToken()) + .then((res) => { + if (res.data) { + done(null, res.data) + } else { + dispatch(serviceActionError(res)); + throw new Error(`Error in fetching potential applicants`) + } + }) + .catch((error) => { + catchError(error, dispatch); + }); + }; }; export const fetchApplicantInfo = async (firstname, ...rest) => { diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index 5c9264a70..ed01bfb19 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -86,6 +86,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { field: 'birthDate', headerName: 'DATE OF BIRTH', flex: 1, + valueGetter: (params) => params.row?.additionalPersonalInfo?.birthDate }, { field: 'email', @@ -127,7 +128,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { if (modalOpen) { setIsLoading(true); if (requestDetails.currentState === StateEnum.intakeinprogress.name) { - fetchPotentialApplicants( + dispatch(fetchPotentialApplicants( requestDetails.firstName, requestDetails.lastName, requestDetails.email, @@ -135,7 +136,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { (err, res) => { setRows(res); setIsLoading(false); - }) + })) } else { fetchApplicantInfo(requestDetails.firstName, (err, res) => { setSelectedApplicant(res); @@ -171,9 +172,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } const selectApplicantRow = (e) => { - fetchApplicantInfo(e.firstName, (err, res) => { - setSelectedApplicant(res); - }) + setSelectedApplicant(e.row); } const handleClose = () => { @@ -213,7 +212,6 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const selectProfile = () => { if (_.isEqual(selectedApplicant, saveApplicantObject) || confirmationMessage) { if (requestDetails.currentState === StateEnum.intakeinprogress.name) { - saveApplicantObject.applicantprofileid = 1; // fill in with actual id later dispatch(setFOIRequestApplicantProfile(saveApplicantObject)); } // call save info api @@ -228,7 +226,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { for (let field in selectedApplicant) { if (field === 'additionalPersonalInfo') { for (let infofield in requestDetails[field]) { - if (requestDetails[field][infofield] !== selectedApplicant[field][infofield]) { + if (requestDetails[field][infofield] && requestDetails[field][infofield] !== selectedApplicant[field][infofield]) { updatedApplicant[field][infofield] = requestDetails[field][infofield]; } } @@ -315,7 +313,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { [classes.disabledTitle]: !showRequestHistory })} > - Request History ({selectedApplicant.requestHistory.length}) + Request History ({selectedApplicant.foirequestID.length}) : @@ -489,7 +487,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { { headerHeight={50} loading={isLoading} onRowClick={selectApplicantRow} + getRowId={(row) => row.foiRequestApplicantID} /> diff --git a/forms-flow-web/src/components/FOI/FOIRequest/foirequest.scss b/forms-flow-web/src/components/FOI/FOIRequest/foirequest.scss index d05c931b4..6b2a8f1f4 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/foirequest.scss +++ b/forms-flow-web/src/components/FOI/FOIRequest/foirequest.scss @@ -202,4 +202,8 @@ height: fit-content; .btn-update-profile { border: none; background: none; +} + +.foi-applicant-data-grid .MuiDataGrid-cellContent{ + text-transform: none !important; } \ No newline at end of file diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index cd6e2a8e9..89b896383 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -221,6 +221,15 @@ def getrequestById(cls,ministryrequestid): request_schema = FOIMinistryRequestSchema(many=True) query = db.session.query(FOIMinistryRequest).filter_by(foiministryrequestid=ministryrequestid).order_by(FOIMinistryRequest.version.asc()) return request_schema.dump(query) + + @classmethod + def getopenrequestsbyrequestId(cls,requestids): + selectedcolumns = [FOIMinistryRequest.foirequest_id, FOIMinistryRequest.foiministryrequestid] + query = db.session.query(selectedcolumns).distinct(FOIMinistryRequest.foiministryrequestid).filter_by(and_( + FOIMinistryRequest.foirequest_id.in_(requestids), + FOIMinistryRequest.requeststatusid != 3 + )).order_by(FOIMinistryRequest.version.asc()) + return [r._asdict() for r in query] @classmethod def getrequeststatusById(cls,ministryrequestid): diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index ca51f2bf1..2c847ac74 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -78,11 +78,17 @@ def getapplicantbyemail(cls, email): #aliase for getting contact info contactemail = aliased(FOIRequestContactInformation) contactaddress = aliased(FOIRequestContactInformation) + contactaddress2 = aliased(FOIRequestContactInformation) contacthomephone = aliased(FOIRequestContactInformation) contactworkphone = aliased(FOIRequestContactInformation) contactworkphone2 = aliased(FOIRequestContactInformation) contactmobilephone = aliased(FOIRequestContactInformation) contactother = aliased(FOIRequestContactInformation) + + city = aliased(FOIRequestContactInformation) + province = aliased(FOIRequestContactInformation) + postal = aliased(FOIRequestContactInformation) + country = aliased(FOIRequestContactInformation) #aliase for getting personal attributes personalemployeenumber = aliased(FOIRequestPersonalAttribute) @@ -112,11 +118,16 @@ def getapplicantbyemail(cls, email): ApplicantCategory.name.label('applicantcategory'), contactemail.contactinformation.label('email'), contactaddress.contactinformation.label('address'), + contactaddress2.contactinformation.label('address2'), contacthomephone.contactinformation.label('homephone'), contactworkphone.contactinformation.label('workphone'), contactworkphone2.contactinformation.label('workphone2'), contactmobilephone.contactinformation.label('mobilephone'), contactother.contactinformation.label('othercontactinfo'), + city.contactinformation.label('city'), + province.contactinformation.label('province'), + postal.contactinformation.label('postal'), + country.contactinformation.label('country'), personalemployeenumber.attributevalue.label('employeenumber'), personalcorrectionnumber.attributevalue.label('correctionnumber'), personalhealthnumber.attributevalue.label('phn') @@ -160,7 +171,17 @@ def getapplicantbyemail(cls, email): contactaddress.foirequest_id == FOIRequest.foirequestid, contactaddress.foirequestversion_id == FOIRequest.version, contactaddress.contacttypeid == 2, - contactaddress.contactinformation is not None), + contactaddress.contactinformation is not None, + contactaddress.dataformat == 'address'), + isouter=True + ).join( + contactaddress2, + and_( + contactaddress2.foirequest_id == FOIRequest.foirequestid, + contactaddress2.foirequestversion_id == FOIRequest.version, + contactaddress2.contacttypeid == 2, + contactaddress2.contactinformation is not None, + contactaddress2.dataformat == 'addressSecondary'), isouter=True ).join( contacthomephone, @@ -202,6 +223,42 @@ def getapplicantbyemail(cls, email): contactother.contacttypeid == 7, contactother.contactinformation is not None), isouter=True + ).join( + city, + and_( + city.foirequest_id == FOIRequest.foirequestid, + city.foirequestversion_id == FOIRequest.version, + city.contacttypeid == 2, + city.contactinformation is not None, + city.format == 'city'), + isouter=True + ).join( + province, + and_( + province.foirequest_id == FOIRequest.foirequestid, + province.foirequestversion_id == FOIRequest.version, + province.contacttypeid == 2, + province.contactinformation is not None, + city.format == 'province'), + isouter=True + ).join( + country, + and_( + country.foirequest_id == FOIRequest.foirequestid, + country.foirequestversion_id == FOIRequest.version, + country.contacttypeid == 2, + country.contactinformation is not None, + city.format == 'country'), + isouter=True + ).join( + postal, + and_( + postal.foirequest_id == FOIRequest.foirequestid, + postal.foirequestversion_id == FOIRequest.version, + postal.contacttypeid == 2, + postal.contactinformation is not None, + city.format == 'postal'), + isouter=True ).join( personalemployeenumber, and_( diff --git a/request-management-api/request_api/resources/foiapplicant.py b/request-management-api/request_api/resources/foiapplicant.py index 1bc0cfa11..c191c6d9d 100644 --- a/request-management-api/request_api/resources/foiapplicant.py +++ b/request-management-api/request_api/resources/foiapplicant.py @@ -27,6 +27,7 @@ from flask_cors import cross_origin import request_api from request_api.utils.cache import cache_filter, response_filter +from request_api.schemas.foiapplicant import FOIRequestApplicantSchema API = Namespace('FOIAssignee', description='Endpoints for FOI assignee management') TRACER = Tracer.get_instance() @@ -90,3 +91,25 @@ def post(): except BusinessException as exception: return {'status': exception.status_code, 'message':exception.message}, 500 +@cors_preflight('POST,OPTIONS') +@API.route('/foiapplicants/save') +class EventPagination(Resource): + """ Saves applicant info and request specific contact info for all open requests associated to an applicant + """ + @staticmethod + @TRACER.trace() + @cross_origin(origins=allowedorigins()) + @auth.require + @auth.isiao + @cors_preflight('POST,OPTIONS') + def post(): + try: + applicant = FOIRequestApplicantSchema.load(request.get_json()) + result = applicantservice().saveapplicantinfo(applicant) + if result is not None: + return json.dumps(result), 200 + else: + return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 + except BusinessException as exception: + return {'status': exception.status_code, 'message':exception.message}, 500 + diff --git a/request-management-api/request_api/schemas/foirequestwrapper.py b/request-management-api/request_api/schemas/foirequestwrapper.py index 5e829c84c..f099230f0 100644 --- a/request-management-api/request_api/schemas/foirequestwrapper.py +++ b/request-management-api/request_api/schemas/foirequestwrapper.py @@ -111,7 +111,7 @@ class Meta: # pylint: disable=too-few-public-methods publicServiceEmployeeNumber = fields.Str(data_key="publicServiceEmployeeNumber",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) isiaorestricted = fields.Bool(data_key="isiaorestricted") - applicantprofileid = fields.Int(data_key="applicantprofileid",required=False,allow_none=True) + foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) selectedMinistries = fields.Nested(FOIMinistryRequestWrapperSchema, many=True) additionalPersonalInfo = fields.Nested(FOIAdditionallPersonalInfoWrapperSchema,required=False,allow_none=True) diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index fd2d7ebe7..551fb10ff 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -2,11 +2,14 @@ from os import stat from re import VERBOSE from request_api.models.FOIRequestApplicants import FOIRequestApplicant +from request_api.models.FOIMinistryRequests import FOIMinistryRequest +from request_api.services.requestservice import requestservicegetter, requestservicecreate from request_api.auth import AuthHelper from dateutil import tz, parser from flask import jsonify from datetime import datetime as datetime2 from request_api.utils.commons.datetimehandler import datetimehandler +from request_api.models.default_method_result import DefaultMethodResult import re class applicantservice: @@ -31,6 +34,18 @@ def searchapplicant(self, keywords): applicantqueue.append(self.__prepareapplicant(applicant)) return applicantqueue + + def saveapplicantinfo(self, applicantschema): + requests = FOIMinistryRequest.getopenrequestsbyrequestId(applicantschema['foirequestID']) + for request in requests: + requestschema = requestservicegetter().getrequest(request['foirequest_id'], request['foiministryrequestid']) + requestschema.update(applicantschema) + responseschema = requestservicecreate().saverequestversion( + requestschema, request['foirequest_id'], request['foiministryrequestid'], AuthHelper.getuserid() + ) + if not responseschema.success: + return responseschema + return DefaultMethodResult(True,'Applicant Info Updated',applicantschema['foiRequestApplicantID']) def __validateandtransform(self, filterfields): return self.__transformfilteringfields(filterfields) @@ -62,7 +77,7 @@ def __prepareapplicant(self, applicant): 'foirequestID': applicant["foirequestid"], 'foirequestVersion': applicant["foirequestversion"], 'requestType': applicant["requesttype"], - 'category': applicant["applicantcategory"], + # 'category': applicant["applicantcategory"], 'email': self.__first_not_null(applicant["email"]), 'address': self.__first_not_null(applicant["address"]), 'phonePrimary': self.__first_not_null(applicant["homephone"]), diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index 555c8570e..e33828807 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -128,9 +128,9 @@ def __prepareapplicants(self, foirequestschema, userid): selfalsoknownas=None selfdob=None if foirequestschema.get("additionalPersonalInfo") is not None and foirequestschema.get('requeststatusid') == 1: - if foirequestschema.get('applicantprofileid', None): + if foirequestschema.get('foiRequestApplicantID', None): requestapplicant = FOIRequestApplicantMapping() - requestapplicant.foirequestapplicantid = foirequestschema['applicantprofileid'] + requestapplicant.foirequestapplicantid = foirequestschema['foiRequestApplicantID'] requestapplicant.requestortypeid = RequestorType().getrequestortype("Self")["requestortypeid"] requestapplicantarr.append(requestapplicant) else: From dd4ee25776e6295efd00f5a7a87482a6abe7c1d6 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Dec 2023 10:47:42 -0800 Subject: [PATCH 009/147] add missing applicant schema file --- .../request_api/schemas/foiapplicant.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 request-management-api/request_api/schemas/foiapplicant.py diff --git a/request-management-api/request_api/schemas/foiapplicant.py b/request-management-api/request_api/schemas/foiapplicant.py new file mode 100644 index 000000000..517d9bb93 --- /dev/null +++ b/request-management-api/request_api/schemas/foiapplicant.py @@ -0,0 +1,39 @@ +from marshmallow import EXCLUDE, Schema, fields, validate +from request_api.utils.constants import MAX_EXCEPTION_MESSAGE, BLANK_EXCEPTION_MESSAGE +from request_api.schemas.foirequestwrapper import FOIAdditionallPersonalInfoWrapperSchema + +class FOIRequestApplicantSchema(Schema): + + class Meta: # pylint: disable=too-few-public-methods + """Exclude unknown fields in the deserialized output.""" + + unknown = EXCLUDE + firstName = fields.Str(data_key="firstName", required=True,validate=[validate.Length(min=1, error=BLANK_EXCEPTION_MESSAGE, max=50)]) + middleName = fields.Str(data_key="middleName",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) + lastName = fields.Str(data_key="lastName", required=True,validate=[validate.Length(min=1, error=BLANK_EXCEPTION_MESSAGE, max=50)]) + email = fields.Str(data_key="email",allow_none=True, validate=[validate.Length(max=120, error=MAX_EXCEPTION_MESSAGE)]) + businessName = fields.Str(data_key="businessName",allow_none=True, validate=[validate.Length(max=255, error=MAX_EXCEPTION_MESSAGE)]) + + phonePrimary = fields.Str(data_key="phonePrimary",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) + workPhonePrimary = fields.Str(data_key="workPhonePrimary",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) + phoneSecondary = fields.Str(data_key="phoneSecondary",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) + workPhoneSecondary = fields.Str(data_key="workPhoneSecondary",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) + address = fields.Str(data_key="address",allow_none=True, validate=[validate.Length(max=120, error=MAX_EXCEPTION_MESSAGE)]) + addressSecondary = fields.Str(data_key="addressSecondary",allow_none=True, validate=[validate.Length(max=120, error=MAX_EXCEPTION_MESSAGE)]) + city = fields.Str(data_key="city",allow_none=True, validate=[validate.Length(max=120, error=MAX_EXCEPTION_MESSAGE)]) + province = fields.Str(data_key="province",allow_none=True, validate=[validate.Length(max=120, error=MAX_EXCEPTION_MESSAGE)]) + postal = fields.Str(data_key="postal",allow_none=True, validate=[validate.Length(max=10, error=MAX_EXCEPTION_MESSAGE)]) + country = fields.Str(data_key="country",allow_none=True) + # correctionalServiceNumber = fields.Str(data_key="correctionalServiceNumber",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) + # publicServiceEmployeeNumber = fields.Str(data_key="publicServiceEmployeeNumber",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) + + + foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) + + foirequestID = fields.List(fields.Int(),data_key="foirequestID",required=True,allow_none=False) + + + additionalPersonalInfo = fields.Nested(FOIAdditionallPersonalInfoWrapperSchema,required=False,allow_none=True) + + + \ No newline at end of file From 16865d2767be24e6cd2a8dea6fb6e987ef291662 Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Tue, 19 Dec 2023 14:27:38 -0500 Subject: [PATCH 010/147] small fix for search applicant --- .../request_api/models/FOIRequestApplicants.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 2c847ac74..8ac66cdf1 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -35,6 +35,7 @@ class FOIRequestApplicant(db.Model): @classmethod def saveapplicant(cls,firstname, lastname, middlename, businessname, alsoknownas, dob, userid): dbquery = db.session.query(FOIRequestApplicant) + # check the applicantid instead of firstname and lastname dbquery = dbquery.filter_by(firstname=firstname) applicant = dbquery.filter_by(lastname=lastname) if (applicant.count() > 0): @@ -230,7 +231,7 @@ def getapplicantbyemail(cls, email): city.foirequestversion_id == FOIRequest.version, city.contacttypeid == 2, city.contactinformation is not None, - city.format == 'city'), + city.dataformat == 'city'), isouter=True ).join( province, @@ -239,7 +240,7 @@ def getapplicantbyemail(cls, email): province.foirequestversion_id == FOIRequest.version, province.contacttypeid == 2, province.contactinformation is not None, - city.format == 'province'), + city.dataformat == 'province'), isouter=True ).join( country, @@ -248,7 +249,7 @@ def getapplicantbyemail(cls, email): country.foirequestversion_id == FOIRequest.version, country.contacttypeid == 2, country.contactinformation is not None, - city.format == 'country'), + city.dataformat == 'country'), isouter=True ).join( postal, @@ -257,7 +258,7 @@ def getapplicantbyemail(cls, email): postal.foirequestversion_id == FOIRequest.version, postal.contacttypeid == 2, postal.contactinformation is not None, - city.format == 'postal'), + city.dataformat == 'postal'), isouter=True ).join( personalemployeenumber, From d4aab09609fb9e5f06b40dbffa79c119de2bd0b0 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Dec 2023 17:43:23 -0800 Subject: [PATCH 011/147] 2nd intermediate commit for save applicant profile fixed front end bug with general requests --- .../src/apiManager/endpoints/index.js | 1 + .../services/FOI/foiRequestServices.js | 22 ++++++++++++++++++- .../FOI/FOIRequest/ApplicantProfileModal.js | 15 ++++++++----- .../request_api/models/FOIMinistryRequests.py | 4 ++-- .../models/FOIRequestApplicants.py | 8 +++---- .../request_api/resources/foiapplicant.py | 10 ++++----- .../request_api/services/applicantservice.py | 13 +++++++++-- 7 files changed, 54 insertions(+), 19 deletions(-) diff --git a/forms-flow-web/src/apiManager/endpoints/index.js b/forms-flow-web/src/apiManager/endpoints/index.js index 3f31e4366..2ed298394 100644 --- a/forms-flow-web/src/apiManager/endpoints/index.js +++ b/forms-flow-web/src/apiManager/endpoints/index.js @@ -40,6 +40,7 @@ const API = { FOI_POST_OSS_HEADER: `${FOI_BASE_API_URL}/api/foiflow/oss/authheader`, FOI_GET_REQUEST_APPLICANTS: `${FOI_BASE_API_URL}/api/foiapplicants/`, + FOI_SAVE_REQUEST_APPLICANT_INFO: `${FOI_BASE_API_URL}/api/foiapplicants/save`, FOI_GET_PROGRAMAREADIVISIONS: `${FOI_BASE_API_URL}/api/foiadmin/divisions`, FOI_POST_PROGRAMAREADIVISION: `${FOI_BASE_API_URL}/api/foiadmin/division`, diff --git a/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js b/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js index f6462492a..563acf7e5 100644 --- a/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js +++ b/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js @@ -612,4 +612,24 @@ export const fetchApplicantContactHistory = (...rest) => { username: "foiintake@idir", }] ); -} \ No newline at end of file +} + +export const saveApplicantInfo = (applicant, ...rest) => { + const done = fnDone(rest); + const apiUrlgetRequestDetails = API.FOI_SAVE_REQUEST_APPLICANT_INFO; + return (dispatch) => { + httpPOSTRequest(apiUrlgetRequestDetails, applicant, UserService.getToken()) + .then((res) => { + if (res.data) { + dispatch(setRestrictedReqTaglist(res.data)); + done(null, res.data); + } else { + dispatch(serviceActionError(res)); + throw new Error(`Error in saving applicant`); + } + }) + .catch((error) => { + catchError(error, dispatch); + }); + } +}; \ No newline at end of file diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index ed01bfb19..d5ff602b4 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -16,7 +16,7 @@ import SearchIcon from "@material-ui/icons/Search"; import InputAdornment from "@mui/material/InputAdornment"; import InputBase from "@mui/material/InputBase"; import Grid from "@mui/material/Grid"; -import { fetchPotentialApplicants, fetchApplicantInfo, fetchApplicantContactHistory } from "../../../apiManager/services/FOI/foiRequestServices"; +import { fetchPotentialApplicants, fetchApplicantInfo, fetchApplicantContactHistory, saveApplicantInfo } from "../../../apiManager/services/FOI/foiRequestServices"; import AddressContactDetails from "./AddressContanctInfo"; import ApplicantDetails from "./ApplicantDetails" import AdditionalApplicantDetails from "./AdditionalApplicantDetails"; @@ -148,7 +148,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { useEffect(() => { setSaveApplicantObject({...selectedApplicant}) for (let field in selectedApplicant) { - if (field === 'additionalPersonalInfo') { + if (field === 'additionalPersonalInfo' && requestDetails.requestType === 'personal') { if ((requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.DOB] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB]) || (requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER])) { setIsProfileDifferent(true); @@ -214,8 +214,13 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { if (requestDetails.currentState === StateEnum.intakeinprogress.name) { dispatch(setFOIRequestApplicantProfile(saveApplicantObject)); } - // call save info api - handleClose() + // set loading screen + dispatch(saveApplicantInfo(saveApplicantObject, (err, res) => { + if (!err) { + // unset loading screen + handleClose(); + } + })); } else { setConfirmationMessage(true); } @@ -224,7 +229,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const copyInfo = () => { let updatedApplicant = {...selectedApplicant} for (let field in selectedApplicant) { - if (field === 'additionalPersonalInfo') { + if (field === 'additionalPersonalInfo' && requestDetails.requestType === 'personal') { for (let infofield in requestDetails[field]) { if (requestDetails[field][infofield] && requestDetails[field][infofield] !== selectedApplicant[field][infofield]) { updatedApplicant[field][infofield] = requestDetails[field][infofield]; diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index 89b896383..c784dfed6 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -225,10 +225,10 @@ def getrequestById(cls,ministryrequestid): @classmethod def getopenrequestsbyrequestId(cls,requestids): selectedcolumns = [FOIMinistryRequest.foirequest_id, FOIMinistryRequest.foiministryrequestid] - query = db.session.query(selectedcolumns).distinct(FOIMinistryRequest.foiministryrequestid).filter_by(and_( + query = db.session.query(*selectedcolumns).distinct(FOIMinistryRequest.foiministryrequestid).filter( FOIMinistryRequest.foirequest_id.in_(requestids), FOIMinistryRequest.requeststatusid != 3 - )).order_by(FOIMinistryRequest.version.asc()) + ).order_by(FOIMinistryRequest.foiministryrequestid.asc(), FOIMinistryRequest.version.asc()) return [r._asdict() for r in query] @classmethod diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 2c847ac74..bc36eaa6b 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -230,7 +230,7 @@ def getapplicantbyemail(cls, email): city.foirequestversion_id == FOIRequest.version, city.contacttypeid == 2, city.contactinformation is not None, - city.format == 'city'), + city.dataformat == 'city'), isouter=True ).join( province, @@ -239,7 +239,7 @@ def getapplicantbyemail(cls, email): province.foirequestversion_id == FOIRequest.version, province.contacttypeid == 2, province.contactinformation is not None, - city.format == 'province'), + city.dataformat == 'province'), isouter=True ).join( country, @@ -248,7 +248,7 @@ def getapplicantbyemail(cls, email): country.foirequestversion_id == FOIRequest.version, country.contacttypeid == 2, country.contactinformation is not None, - city.format == 'country'), + city.dataformat == 'country'), isouter=True ).join( postal, @@ -257,7 +257,7 @@ def getapplicantbyemail(cls, email): postal.foirequestversion_id == FOIRequest.version, postal.contacttypeid == 2, postal.contactinformation is not None, - city.format == 'postal'), + city.dataformat == 'postal'), isouter=True ).join( personalemployeenumber, diff --git a/request-management-api/request_api/resources/foiapplicant.py b/request-management-api/request_api/resources/foiapplicant.py index c191c6d9d..0ff131d71 100644 --- a/request-management-api/request_api/resources/foiapplicant.py +++ b/request-management-api/request_api/resources/foiapplicant.py @@ -18,7 +18,7 @@ import flask from flask_restx import Namespace, Resource, cors from flask_expects_json import expects_json -from request_api.auth import auth +from request_api.auth import auth, AuthHelper from request_api.tracer import Tracer from request_api.utils.util import cors_preflight, allowedorigins from request_api.exceptions import BusinessException, Error @@ -104,10 +104,10 @@ class EventPagination(Resource): @cors_preflight('POST,OPTIONS') def post(): try: - applicant = FOIRequestApplicantSchema.load(request.get_json()) - result = applicantservice().saveapplicantinfo(applicant) - if result is not None: - return json.dumps(result), 200 + applicant = FOIRequestApplicantSchema().load(request.get_json()) + result = applicantservice().saveapplicantinfo(applicant, AuthHelper.getuserid()) + if result.success: + return {'status': result.success, 'message':result.message,'id':result.identifier} , 200 else: return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 except BusinessException as exception: diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index 551fb10ff..799d58bcc 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -35,13 +35,22 @@ def searchapplicant(self, keywords): return applicantqueue - def saveapplicantinfo(self, applicantschema): + def saveapplicantinfo(self, applicantschema, userid): + FOIRequestApplicant.saveapplicant( + applicantschema['firstName'], + applicantschema['lastName'], + applicantschema['middleName'], + applicantschema['businessName'], + applicantschema.get('additionalPersonalInfo', None).get('alsoKnownAs', None), + applicantschema.get('additionalPersonalInfo', None).get('birthDate', None), + userid + ) # replace with applicant id once new save function is written requests = FOIMinistryRequest.getopenrequestsbyrequestId(applicantschema['foirequestID']) for request in requests: requestschema = requestservicegetter().getrequest(request['foirequest_id'], request['foiministryrequestid']) requestschema.update(applicantschema) responseschema = requestservicecreate().saverequestversion( - requestschema, request['foirequest_id'], request['foiministryrequestid'], AuthHelper.getuserid() + requestschema, request['foirequest_id'], request['foiministryrequestid'], userid ) if not responseschema.success: return responseschema From dd68f54f19688ae0858a70ca6a48ed11696a7942 Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Wed, 20 Dec 2023 11:45:14 -0500 Subject: [PATCH 012/147] comments added --- .../src/components/FOI/FOIRequest/ApplicantProfileModal.js | 1 + .../request_api/models/FOIRequestApplicants.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index ed01bfb19..45c241bfb 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -148,6 +148,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { useEffect(() => { setSaveApplicantObject({...selectedApplicant}) for (let field in selectedApplicant) { + // Ignore comparison of additional fields like DOB if it is a general request if (field === 'additionalPersonalInfo') { if ((requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.DOB] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB]) || (requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER])) { diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 8ac66cdf1..088d3ad88 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -35,7 +35,7 @@ class FOIRequestApplicant(db.Model): @classmethod def saveapplicant(cls,firstname, lastname, middlename, businessname, alsoknownas, dob, userid): dbquery = db.session.query(FOIRequestApplicant) - # check the applicantid instead of firstname and lastname + ### check the applicantid instead of firstname and lastname dbquery = dbquery.filter_by(firstname=firstname) applicant = dbquery.filter_by(lastname=lastname) if (applicant.count() > 0): From 2c2a03e8fa9f6fedc03db04791532e5057dcefbd Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Wed, 20 Dec 2023 12:30:57 -0500 Subject: [PATCH 013/147] fix related to show applicant details --- .../src/components/FOI/FOIRequest/ApplicantProfileModal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index d5ff602b4..b8f09d752 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -148,7 +148,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { useEffect(() => { setSaveApplicantObject({...selectedApplicant}) for (let field in selectedApplicant) { - if (field === 'additionalPersonalInfo' && requestDetails.requestType === 'personal') { + if (field === 'additionalPersonalInfo' && requestDetails[field] && requestDetails.requestType === 'personal') { if ((requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.DOB] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB]) || (requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER])) { setIsProfileDifferent(true); From 81d2fa83ed78271db8459887e5484ffd3704b333 Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Fri, 22 Dec 2023 14:06:50 -0500 Subject: [PATCH 014/147] integrated keyword serch --- .../src/apiManager/endpoints/index.js | 1 + .../FOI/foiApplicantProfileService.js | 138 ++++++++++++++++++ .../services/FOI/foiRequestServices.js | 107 -------------- .../FOI/FOIRequest/ApplicantProfileModal.js | 56 ++++++- .../models/FOIRequestApplicants.py | 61 +++++++- .../request_api/resources/foiapplicant.py | 2 - .../request_api/services/applicantservice.py | 4 + 7 files changed, 254 insertions(+), 115 deletions(-) create mode 100644 forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js diff --git a/forms-flow-web/src/apiManager/endpoints/index.js b/forms-flow-web/src/apiManager/endpoints/index.js index 2ed298394..d13c7fd7b 100644 --- a/forms-flow-web/src/apiManager/endpoints/index.js +++ b/forms-flow-web/src/apiManager/endpoints/index.js @@ -41,6 +41,7 @@ const API = { FOI_GET_REQUEST_APPLICANTS: `${FOI_BASE_API_URL}/api/foiapplicants/`, FOI_SAVE_REQUEST_APPLICANT_INFO: `${FOI_BASE_API_URL}/api/foiapplicants/save`, + FOI_REQUEST_APPLICANTS_SEARCH_KEYWORDS: `${FOI_BASE_API_URL}/api/foiapplicants/search`, FOI_GET_PROGRAMAREADIVISIONS: `${FOI_BASE_API_URL}/api/foiadmin/divisions`, FOI_POST_PROGRAMAREADIVISION: `${FOI_BASE_API_URL}/api/foiadmin/division`, diff --git a/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js b/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js new file mode 100644 index 000000000..6fbe6d932 --- /dev/null +++ b/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js @@ -0,0 +1,138 @@ +import { + httpPOSTRequest, + httpGETRequest, +} from "../../httpRequestHandler"; +import API from "../../endpoints"; +import { + serviceActionError, + setRestrictedReqTaglist +} from "../../../actions/FOI/foiRequestActions"; +import { catchError, fnDone} from './foiServicesUtil'; +import UserService from "../../../services/UserService"; +import { replaceUrl } from "../../../helper/FOI/helper"; + +export const fetchPotentialApplicants = (firstname, lastname, email, phone, ...rest) => { + // console.log("fetch applicants" + firstname) + // console.log(firstname) + // console.log(lastname) + + const done = fnDone(rest); + // await new Promise(resolve => {setTimeout(resolve, 3000)}); + // done(null, [ + // { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35 }, + // { id: 2, lastName: 'Lannister', firstName: 'Cersei', age: 42 }, + // { id: 3, lastName: 'Lannister', firstName: 'Jaime', age: 45 }, + // { id: 4, lastName: 'Stark', firstName: 'Arya', age: 16 }, + // { id: 5, lastName: 'Targaryen', firstName: 'Daenerys', age: null }, + // { id: 7, lastName: 'Clifford', firstName: 'Ferrara', age: 44 }, + // { id: 8, lastName: 'Frances', firstName: 'Rossini', age: 36 }, + // { id: 9, lastName: 'Roxie', firstName: 'Harvey', age: 65 }, + // ]); + // return; + const apiUrlgetRequestDetails = replaceUrl( + API.FOI_GET_REQUEST_APPLICANTS, + "", + email + ); + return (dispatch) => { + httpGETRequest(apiUrlgetRequestDetails, {}, UserService.getToken()) + .then((res) => { + if (res.data) { + done(null, res.data) + } else { + dispatch(serviceActionError(res)); + throw new Error(`Error in fetching potential applicants`) + } + }) + .catch((error) => { + catchError(error, dispatch); + }); + }; +}; + +export const fetchApplicantInfo = async (firstname, ...rest) => { + + const done = fnDone(rest); + done(null, + { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35, email: 'jon.snow@gmail.com', + additionalPersonalInfo: {birthDate: "2023-12-07"}, + requestHistory: [{requestId: "EDU-2023-234345", receivedDate: "2023-12-07", currentState: "Open", requestDescription: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but als"}] + } + ); + return; + // const apiUrlgetRequestDetails = replaceUrl(replaceUrl( + // API.FOI_MINISTRYVIEW_REQUEST_API, + // "", + // requestId + // ), "", ministryId); + // return (dispatch) => { + // httpGETRequest(apiUrlgetRequestDetails, {}, UserService.getToken()) + // .then((res) => { + // if (res.data) { + // const foiRequest = res.data; + // dispatch(clearMinistryViewRequestDetails({})); + // dispatch(setFOIMinistryViewRequestDetail(foiRequest)); + // dispatch(fetchFOIMinistryAssignedToList(foiRequest.selectedMinistries[0].code.toLowerCase())); + // dispatch(setFOILoader(false)); + // } else { + // dispatch(serviceActionError(res)); + // dispatch(setFOILoader(false)); + // throw new Error(`Error in fetching ministry request details for request# ${requestId} ministry# ${ministryId}`) + // } + // }) + // .catch((error) => { + // catchError(error, dispatch); + // }); + // }; +}; + +export const fetchApplicantContactHistory = (...rest) => { + const done = fnDone(rest); + done(null, + [{ + field: "Email", + value: "a@b.ca", + date: "2023-12-11", + username: "foiintake@idir", + }] + ); +} + +export const saveApplicantInfo = (applicant, ...rest) => { + const done = fnDone(rest); + const apiUrlgetRequestDetails = API.FOI_SAVE_REQUEST_APPLICANT_INFO; + return (dispatch) => { + httpPOSTRequest(apiUrlgetRequestDetails, applicant, UserService.getToken()) + .then((res) => { + if (res.data) { + dispatch(setRestrictedReqTaglist(res.data)); + done(null, res.data); + } else { + dispatch(serviceActionError(res)); + throw new Error(`Error in saving applicant`); + } + }) + .catch((error) => { + catchError(error, dispatch); + }); + } +}; + +export const fetchApplicantProfileByKeyword = (keywords, ...rest) => { + const done = fnDone(rest); + const apiUrl = API.FOI_REQUEST_APPLICANTS_SEARCH_KEYWORDS; + return (dispatch) => { + httpPOSTRequest(apiUrl, keywords, UserService.getToken()) + .then((res) => { + if (res.data) { + done(null, res.data) + } else { + dispatch(serviceActionError(res)); + throw new Error(`Error in fetching potential applicants`) + } + }) + .catch((error) => { + catchError(error, dispatch); + }); + } +}; \ No newline at end of file diff --git a/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js b/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js index 563acf7e5..e607d67cb 100644 --- a/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js +++ b/forms-flow-web/src/apiManager/services/FOI/foiRequestServices.js @@ -525,111 +525,4 @@ export const fetchRestrictedRequestCommentTagList = (requestid, ministryId, ...r catchError(error, dispatch); }); } -}; - -export const fetchPotentialApplicants = (firstname, lastname, email, phone, ...rest) => { - // console.log("fetch applicants" + firstname) - // console.log(firstname) - // console.log(lastname) - - const done = fnDone(rest); - // await new Promise(resolve => {setTimeout(resolve, 3000)}); - // done(null, [ - // { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35 }, - // { id: 2, lastName: 'Lannister', firstName: 'Cersei', age: 42 }, - // { id: 3, lastName: 'Lannister', firstName: 'Jaime', age: 45 }, - // { id: 4, lastName: 'Stark', firstName: 'Arya', age: 16 }, - // { id: 5, lastName: 'Targaryen', firstName: 'Daenerys', age: null }, - // { id: 7, lastName: 'Clifford', firstName: 'Ferrara', age: 44 }, - // { id: 8, lastName: 'Frances', firstName: 'Rossini', age: 36 }, - // { id: 9, lastName: 'Roxie', firstName: 'Harvey', age: 65 }, - // ]); - // return; - const apiUrlgetRequestDetails = replaceUrl( - API.FOI_GET_REQUEST_APPLICANTS, - "", - email - ); - return (dispatch) => { - httpGETRequest(apiUrlgetRequestDetails, {}, UserService.getToken()) - .then((res) => { - if (res.data) { - done(null, res.data) - } else { - dispatch(serviceActionError(res)); - throw new Error(`Error in fetching potential applicants`) - } - }) - .catch((error) => { - catchError(error, dispatch); - }); - }; -}; - -export const fetchApplicantInfo = async (firstname, ...rest) => { - - const done = fnDone(rest); - done(null, - { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35, email: 'jon.snow@gmail.com', - additionalPersonalInfo: {birthDate: "2023-12-07"}, - requestHistory: [{requestId: "EDU-2023-234345", receivedDate: "2023-12-07", currentState: "Open", requestDescription: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but als"}] - } - ); - return; - // const apiUrlgetRequestDetails = replaceUrl(replaceUrl( - // API.FOI_MINISTRYVIEW_REQUEST_API, - // "", - // requestId - // ), "", ministryId); - // return (dispatch) => { - // httpGETRequest(apiUrlgetRequestDetails, {}, UserService.getToken()) - // .then((res) => { - // if (res.data) { - // const foiRequest = res.data; - // dispatch(clearMinistryViewRequestDetails({})); - // dispatch(setFOIMinistryViewRequestDetail(foiRequest)); - // dispatch(fetchFOIMinistryAssignedToList(foiRequest.selectedMinistries[0].code.toLowerCase())); - // dispatch(setFOILoader(false)); - // } else { - // dispatch(serviceActionError(res)); - // dispatch(setFOILoader(false)); - // throw new Error(`Error in fetching ministry request details for request# ${requestId} ministry# ${ministryId}`) - // } - // }) - // .catch((error) => { - // catchError(error, dispatch); - // }); - // }; -}; - -export const fetchApplicantContactHistory = (...rest) => { - const done = fnDone(rest); - done(null, - [{ - field: "Email", - value: "a@b.ca", - date: "2023-12-11", - username: "foiintake@idir", - }] - ); -} - -export const saveApplicantInfo = (applicant, ...rest) => { - const done = fnDone(rest); - const apiUrlgetRequestDetails = API.FOI_SAVE_REQUEST_APPLICANT_INFO; - return (dispatch) => { - httpPOSTRequest(apiUrlgetRequestDetails, applicant, UserService.getToken()) - .then((res) => { - if (res.data) { - dispatch(setRestrictedReqTaglist(res.data)); - done(null, res.data); - } else { - dispatch(serviceActionError(res)); - throw new Error(`Error in saving applicant`); - } - }) - .catch((error) => { - catchError(error, dispatch); - }); - } }; \ No newline at end of file diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index b8f09d752..cf3c4671b 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -16,7 +16,7 @@ import SearchIcon from "@material-ui/icons/Search"; import InputAdornment from "@mui/material/InputAdornment"; import InputBase from "@mui/material/InputBase"; import Grid from "@mui/material/Grid"; -import { fetchPotentialApplicants, fetchApplicantInfo, fetchApplicantContactHistory, saveApplicantInfo } from "../../../apiManager/services/FOI/foiRequestServices"; +import { fetchPotentialApplicants, fetchApplicantInfo, fetchApplicantContactHistory, saveApplicantInfo, fetchApplicantProfileByKeyword } from "../../../apiManager/services/FOI/foiApplicantProfileService"; import AddressContactDetails from "./AddressContanctInfo"; import ApplicantDetails from "./ApplicantDetails" import AdditionalApplicantDetails from "./AdditionalApplicantDetails"; @@ -34,6 +34,7 @@ import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; import { StateEnum } from "../../../constants/FOI/statusEnum"; import { setFOIRequestApplicantProfile } from "../../../actions/FOI/foiRequestActions"; +import { toast } from "react-toastify"; const useStyles = makeStyles((theme) => ({ root: { @@ -203,9 +204,60 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } } + const createKeywordJSON = (keyword) => { + const keywordJSON = { + "keywords": {} + } + const mobileNumberRegex = /^(\+\d{1,3}[-.●]?)?\(?\d{3}\)?[-.●]?\d{3}[-.●]?\d{4}$/; + const stringRegex = /^[A-Za-z0-9\s.@!#$%^&*()\-_=+[\]{};:'",<.>/?\\|]+$/; + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + const isValidEmail = emailRegex.test(keyword); + const isValidNumber = mobileNumberRegex.test(keyword); + const isValidString = stringRegex.test(keyword) + if (isValidEmail) { + keywordJSON.keywords["email"] = keyword; + } + if (isValidNumber) { + keywordJSON.keywords["homephone"] = keyword; + keywordJSON.keywords["workphone"] = keyword; + keywordJSON.keywords["workphone2"] = keyword; + keywordJSON.keywords["mobilephone"] = keyword; + } + if (isValidString) { + keywordJSON.keywords["firstname"] = keyword; + keywordJSON.keywords["lastname"] = keyword; + keywordJSON.keywords["email"] = keyword; + } + return keywordJSON; + } + const onSearchEnter = (e) => { if (searchMode === 'manual' && e.key === 'Enter') { - console.log("search"); + const keywordJSON = createKeywordJSON(e.target.value) + setIsLoading(true); + dispatch(fetchApplicantProfileByKeyword( + keywordJSON, + (err, res) => { + if (!err) { + setRows(res); + setIsLoading(false); + } + else { + toast.error( + "Temporarily unable to fetch applicant profiles. Please try again in a few minutes.", + { + position: "top-right", + autoClose: 3000, + hideProgressBar: true, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + } + ); + } + + })) } } diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 088d3ad88..f1b0e292c 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -240,7 +240,7 @@ def getapplicantbyemail(cls, email): province.foirequestversion_id == FOIRequest.version, province.contacttypeid == 2, province.contactinformation is not None, - city.dataformat == 'province'), + province.dataformat == 'province'), isouter=True ).join( country, @@ -249,7 +249,7 @@ def getapplicantbyemail(cls, email): country.foirequestversion_id == FOIRequest.version, country.contacttypeid == 2, country.contactinformation is not None, - city.dataformat == 'country'), + country.dataformat == 'country'), isouter=True ).join( postal, @@ -258,7 +258,7 @@ def getapplicantbyemail(cls, email): postal.foirequestversion_id == FOIRequest.version, postal.contacttypeid == 2, postal.contactinformation is not None, - city.dataformat == 'postal'), + postal.dataformat == 'postal'), isouter=True ).join( personalemployeenumber, @@ -305,6 +305,10 @@ def getapplicantbyemail(cls, email): func.array_agg(subquery_all.c.applicantcategory).label('applicantcategory'), func.array_agg(subquery_all.c.email).label('email'), func.array_agg(subquery_all.c.address).label('address'), + func.array_agg(subquery_all.c.city).label('city'), + func.array_agg(subquery_all.c.province).label('province'), + func.array_agg(subquery_all.c.postal).label('postal'), + func.array_agg(subquery_all.c.country).label('country'), func.array_agg(subquery_all.c.homephone).label('homephone'), func.array_agg(subquery_all.c.workphone).label('workphone'), func.array_agg(subquery_all.c.workphone2).label('workphone2'), @@ -336,6 +340,11 @@ def searchapplicant(cls, keywords): contactmobilephone = aliased(FOIRequestContactInformation) contactother = aliased(FOIRequestContactInformation) + city = aliased(FOIRequestContactInformation) + province = aliased(FOIRequestContactInformation) + postal = aliased(FOIRequestContactInformation) + country = aliased(FOIRequestContactInformation) + #aliase for getting personal attributes personalemployeenumber = aliased(FOIRequestPersonalAttribute) personalcorrectionnumber = aliased(FOIRequestPersonalAttribute) @@ -364,6 +373,10 @@ def searchapplicant(cls, keywords): ApplicantCategory.name.label('applicantcategory'), contactemail.contactinformation.label('email'), contactaddress.contactinformation.label('address'), + city.contactinformation.label('city'), + province.contactinformation.label('province'), + postal.contactinformation.label('postal'), + country.contactinformation.label('country'), contacthomephone.contactinformation.label('homephone'), contactworkphone.contactinformation.label('workphone'), contactworkphone2.contactinformation.label('workphone2'), @@ -455,6 +468,42 @@ def searchapplicant(cls, keywords): contactother.contacttypeid == 7, contactother.contactinformation is not None), isouter=True + ).join( + city, + and_( + city.foirequest_id == FOIRequest.foirequestid, + city.foirequestversion_id == FOIRequest.version, + city.contacttypeid == 2, + city.contactinformation is not None, + city.dataformat == 'city'), + isouter=True + ).join( + province, + and_( + province.foirequest_id == FOIRequest.foirequestid, + province.foirequestversion_id == FOIRequest.version, + province.contacttypeid == 2, + province.contactinformation is not None, + province.dataformat == 'province'), + isouter=True + ).join( + country, + and_( + country.foirequest_id == FOIRequest.foirequestid, + country.foirequestversion_id == FOIRequest.version, + country.contacttypeid == 2, + country.contactinformation is not None, + country.dataformat == 'country'), + isouter=True + ).join( + postal, + and_( + postal.foirequest_id == FOIRequest.foirequestid, + postal.foirequestversion_id == FOIRequest.version, + postal.contacttypeid == 2, + postal.contactinformation is not None, + postal.dataformat == 'postal'), + isouter=True ).join( personalemployeenumber, and_( @@ -500,6 +549,10 @@ def searchapplicant(cls, keywords): func.array_agg(subquery_all.c.applicantcategory).label('applicantcategory'), func.array_agg(subquery_all.c.email).label('email'), func.array_agg(subquery_all.c.address).label('address'), + func.array_agg(subquery_all.c.city).label('city'), + func.array_agg(subquery_all.c.province).label('province'), + func.array_agg(subquery_all.c.postal).label('postal'), + func.array_agg(subquery_all.c.country).label('country'), func.array_agg(subquery_all.c.homephone).label('homephone'), func.array_agg(subquery_all.c.workphone).label('workphone'), func.array_agg(subquery_all.c.workphone2).label('workphone2'), @@ -549,5 +602,5 @@ class ApplicantProfileSchema(ma.Schema): class Meta: fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob', 'businessname','applicantversion','foirequestid','foirequestversion','requesttype', - 'applicantcategory','email','address','homephone','workphone','workphone2','mobilephone', + 'applicantcategory','email','address','city','province','postal','country','homephone','workphone','workphone2','mobilephone', 'othercontactinfo','employeenumber','correctionnumber','phn') diff --git a/request-management-api/request_api/resources/foiapplicant.py b/request-management-api/request_api/resources/foiapplicant.py index 0ff131d71..05fb4ff8d 100644 --- a/request-management-api/request_api/resources/foiapplicant.py +++ b/request-management-api/request_api/resources/foiapplicant.py @@ -50,8 +50,6 @@ class FOIApplicants(Resource): @auth.isiao @cors_preflight('GET,OPTIONS') def get(email=None): - print(email) - if email is None or email == "": return {'status': False, 'message':EXCEPTION_MESSAGE_BAD_REQUEST}, 400 try: diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index 799d58bcc..ed5cdaeb3 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -89,6 +89,10 @@ def __prepareapplicant(self, applicant): # 'category': applicant["applicantcategory"], 'email': self.__first_not_null(applicant["email"]), 'address': self.__first_not_null(applicant["address"]), + 'city': self.__first_not_null(applicant["city"]), + 'province': self.__first_not_null(applicant["province"]), + 'postal': self.__first_not_null(applicant["postal"]), + 'country': self.__first_not_null(applicant["country"]), 'phonePrimary': self.__first_not_null(applicant["homephone"]), 'workPhonePrimary': self.__first_not_null(applicant["workphone"]), 'workPhoneSecondary': self.__first_not_null(applicant["workphone2"]), From 09fcb80a63cb10a7233db6854b9b48ebe2f0b237 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Fri, 5 Jan 2024 22:43:42 -0800 Subject: [PATCH 015/147] save and update all open requests --- ...9a97f42b5f2_add_profileid_to_applicant.py} | 13 +- .../request_api/models/FOIMinistryRequests.py | 24 ++++ .../models/FOIRequestApplicantMappings.py | 4 +- .../models/FOIRequestApplicants.py | 119 ++++++++++-------- .../request_api/resources/foiapplicant.py | 19 +++ .../request_api/schemas/foiapplicant.py | 3 - .../request_api/services/applicantservice.py | 5 +- .../foirequest/requestservicebuilder.py | 2 +- .../foirequest/requestservicecreate.py | 4 +- 9 files changed, 124 insertions(+), 69 deletions(-) rename request-management-api/migrations/versions/{59a97f42b5f2_add_version_to_applicant.py => 59a97f42b5f2_add_profileid_to_applicant.py} (50%) diff --git a/request-management-api/migrations/versions/59a97f42b5f2_add_version_to_applicant.py b/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py similarity index 50% rename from request-management-api/migrations/versions/59a97f42b5f2_add_version_to_applicant.py rename to request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py index 9fd31fafb..54f46603a 100644 --- a/request-management-api/migrations/versions/59a97f42b5f2_add_version_to_applicant.py +++ b/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py @@ -7,7 +7,7 @@ """ from alembic import op import sqlalchemy as sa - +from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision = '59a97f42b5f2' @@ -18,16 +18,13 @@ def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.add_column('FOIRequestApplicants', sa.Column('version', sa.Integer(), nullable=True, default=1)) - op.add_column('FOIRequestApplicantMappings', sa.Column('foirequestapplicant_version', sa.Integer(), nullable=True)) - - op.execute('Update public."FOIRequestApplicants" set version = 1;') - op.execute('Update public."FOIRequestApplicantMappings" set foirequestapplicant_version = 1;') + op.add_column('FOIRequestApplicants', sa.Column('applicantprofileid', sa.String(length=120), nullable=True)) + #op.add_column('FOIRequestApplicants', sa.Column('isactive', sa.Boolean, unique=False, nullable=True, default=True)) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('FOIRequestApplicants', 'version') - op.drop_column('FOIRequestApplicantMappings', 'foirequestapplicant_version') + op.drop_column('FOIRequestApplicants', 'applicantprofileid') + #op.drop_column('FOIRequestApplicants', 'isactive') # ### end Alembic commands ### diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index c784dfed6..2f10afbf2 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -230,6 +230,30 @@ def getopenrequestsbyrequestId(cls,requestids): FOIMinistryRequest.requeststatusid != 3 ).order_by(FOIMinistryRequest.foiministryrequestid.asc(), FOIMinistryRequest.version.asc()) return [r._asdict() for r in query] + + @classmethod + def getopenrequestsbyapplicantid(cls,applicantid): + selectedcolumns = [FOIMinistryRequest.foirequest_id, FOIMinistryRequest.foiministryrequestid] + query = db.session.query( + *selectedcolumns + ).distinct( + FOIMinistryRequest.foiministryrequestid + ).join( + FOIRequestApplicantMapping, + and_( + FOIRequestApplicantMapping.foirequest_id == FOIMinistryRequest.foirequest_id, + FOIRequestApplicantMapping.foirequestversion_id == FOIMinistryRequest.foirequestversion_id, + FOIRequestApplicantMapping.requestortypeid == RequestorType['applicant'].value) + ).join( + FOIRequestApplicant, + FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, + ).filter( + FOIRequestApplicant.foirequestapplicantid == applicantid, + FOIMinistryRequest.requeststatusid != 3 + ).order_by( + FOIMinistryRequest.foiministryrequestid.asc(), + FOIMinistryRequest.version.asc()) + return [r._asdict() for r in query] @classmethod def getrequeststatusById(cls,ministryrequestid): diff --git a/request-management-api/request_api/models/FOIRequestApplicantMappings.py b/request-management-api/request_api/models/FOIRequestApplicantMappings.py index 782a702ec..74cdeef90 100644 --- a/request-management-api/request_api/models/FOIRequestApplicantMappings.py +++ b/request-management-api/request_api/models/FOIRequestApplicantMappings.py @@ -29,9 +29,7 @@ class FOIRequestApplicantMapping(db.Model): requestortype = relationship("RequestorType",backref=backref("RequestorTypes"),uselist=False) foirequestapplicantid = db.Column(db.Integer,ForeignKey('FOIRequestApplicants.foirequestapplicantid')) - foirequestapplicant_version = db.Column(db.Integer, ForeignKey('FOIRequestApplicants.version')) - foirequestapplicant = relationship('FOIRequestApplicant', primaryjoin="and_(FOIRequestApplicant.foirequestapplicantid==FOIRequestApplicantMapping.foirequestapplicantid, " - "FOIRequestApplicant.version==FOIRequestApplicantMapping.foirequestapplicant_version)") + foirequestapplicant = relationship("FOIRequestApplicant",backref=backref("FOIRequestApplicants"),uselist=False) foirequest_id =db.Column(db.Integer, ForeignKey('FOIRequests.foirequestid')) foirequestversion_id = db.Column(db.Integer, ForeignKey('FOIRequests.version')) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index f1b0e292c..080773792 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -10,6 +10,7 @@ from .FOIRequestContactInformation import FOIRequestContactInformation from .FOIRequestPersonalAttributes import FOIRequestPersonalAttribute from sqlalchemy import and_, or_, func, case +import uuid class FOIRequestApplicant(db.Model): # Name of the table in our database @@ -17,7 +18,6 @@ class FOIRequestApplicant(db.Model): # Defining the columns foirequestapplicantid = db.Column(db.Integer, primary_key=True,autoincrement=True) - firstname = db.Column(db.String(50), unique=False, nullable=True) middlename = db.Column(db.String(50), unique=False, nullable=True) lastname = db.Column(db.String(50), unique=False, nullable=True) @@ -30,43 +30,64 @@ class FOIRequestApplicant(db.Model): updated_at = db.Column(db.DateTime, nullable=True) createdby = db.Column(db.String(120), unique=False, nullable=True) updatedby = db.Column(db.String(120), unique=False, nullable=True) - version = db.Column(db.Integer, unique=False, nullable=True) + applicantprofileid = db.Column(db.String(120), unique=False, nullable=True) @classmethod - def saveapplicant(cls,firstname, lastname, middlename, businessname, alsoknownas, dob, userid): - dbquery = db.session.query(FOIRequestApplicant) - ### check the applicantid instead of firstname and lastname - dbquery = dbquery.filter_by(firstname=firstname) - applicant = dbquery.filter_by(lastname=lastname) - if (applicant.count() > 0): - _applicant = { - FOIRequestApplicant.updatedby: userid, - FOIRequestApplicant.updated_at: datetime.now(), - FOIRequestApplicant.middlename: middlename, - FOIRequestApplicant.businessname: businessname, - FOIRequestApplicant.alsoknownas: alsoknownas - } - if dob is not None and dob != "": - _applicant[FOIRequestApplicant.dob] = dob - else: - _applicant[FOIRequestApplicant.dob] = None - applicant.update(_applicant) - return DefaultMethodResult(True,'Applicant updated',applicant.first().foirequestapplicantid) + def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknownas, dob, userid): + applicant = FOIRequestApplicant() + applicant.createdby = userid + applicant.firstname = firstname + applicant.lastname = lastname + applicant.middlename = middlename + applicant.businessname = businessname + applicant.alsoknownas = alsoknownas + if dob is not None and dob != "": + applicant.dob = dob else: - applicant = FOIRequestApplicant() - applicant.createdby = userid - applicant.firstname = firstname - applicant.lastname = lastname - applicant.middlename = middlename - applicant.businessname = businessname - applicant.alsoknownas = alsoknownas + applicant.dob = None + db.session.add(applicant) + db.session.commit() + return DefaultMethodResult(True,'Applicant added',applicant.foirequestapplicantid) + + @classmethod + def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, middlename, businessname, alsoknownas, dob, userid): + applicant_query = db.session.query( + FOIRequestApplicant + ).filter_by( + foirequestapplicantid = foirequestapplicantid + ) + applicant = applicant_query.first() + + # create an applicant profile id if it's not set + if(applicant.applicantprofileid is None): + # applicant.isactive = False + applicant_query.update({FOIRequestApplicant.applicantprofileid:str(uuid.uuid4())}) + + if( + applicant.firstname != firstname + or applicant.lastname != lastname + or applicant.middlename != middlename + or applicant.businessname != businessname + or applicant.alsoknownas != alsoknownas + or applicant.dob != dob + ): + _applicant = FOIRequestApplicant() + _applicant.createdby = userid + _applicant.firstname = firstname + _applicant.lastname = lastname + _applicant.middlename = middlename + _applicant.businessname = businessname + _applicant.alsoknownas = alsoknownas + _applicant.applicantprofileid = applicant.applicantprofileid if dob is not None and dob != "": - applicant.dob = dob + _applicant.dob = dob else: - applicant.dob = None - db.session.add(applicant) + _applicant.dob = None + db.session.add(_applicant) db.session.commit() - return DefaultMethodResult(True,'Applicant added',applicant.foirequestapplicantid) + return DefaultMethodResult(True,'Applicant profile updated',_applicant.foirequestapplicantid) + else: + return DefaultMethodResult(True,'No update',applicant.foirequestapplicantid) # Search applicant by email @classmethod @@ -112,7 +133,6 @@ def getapplicantbyemail(cls, email): FOIRequestApplicant.alsoknownas.label('alsoknownas'), func.to_char(FOIRequestApplicant.dob, 'YYYY-MM-DD').label('dob'), FOIRequestApplicant.businessname.label('businessname'), - FOIRequestApplicant.version.label('applicantversion'), FOIRequest.foirequestid.label('foirequestid'), FOIRequest.version.label('foirequestversion'), FOIRequest.requesttype.label('requesttype'), @@ -144,11 +164,11 @@ def getapplicantbyemail(cls, email): FOIRequestApplicantMapping.requestortypeid == 1), ).join( FOIRequestApplicant, - # FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid - and_( - FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, - FOIRequestApplicant.version == FOIRequestApplicantMapping.foirequestapplicant_version - ) + FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid + # and_( + # FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, + # FOIRequestApplicant.isactive != False + # ) ).join( ApplicantCategory, ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid @@ -298,7 +318,6 @@ def getapplicantbyemail(cls, email): func.array_agg(subquery_all.c.alsoknownas).label('alsoknownas'), func.array_agg(subquery_all.c.dob).label('dob'), func.array_agg(subquery_all.c.businessname).label('businessname'), - subquery_all.c.applicantversion, func.array_agg(subquery_all.c.foirequestid).label('foirequestid'), func.array_agg(subquery_all.c.foirequestversion).label('foirequestversion'), func.array_agg(subquery_all.c.requesttype).label('requesttype'), @@ -317,7 +336,7 @@ def getapplicantbyemail(cls, email): func.array_agg(subquery_all.c.employeenumber).label('employeenumber'), func.array_agg(subquery_all.c.correctionnumber).label('correctionnumber'), func.array_agg(subquery_all.c.phn).label('phn') - ).group_by(subquery_all.c.foirequestapplicantid, subquery_all.c.applicantversion) + ).group_by(subquery_all.c.foirequestapplicantid) applicantprofile_schema = ApplicantProfileSchema(many=True) return applicantprofile_schema.dump(query_aggregate.all()) @@ -366,7 +385,6 @@ def searchapplicant(cls, keywords): FOIRequestApplicant.alsoknownas.label('alsoknownas'), func.to_char(FOIRequestApplicant.dob, 'YYYY-MM-DD').label('dob'), FOIRequestApplicant.businessname.label('businessname'), - FOIRequestApplicant.version.label('applicantversion'), FOIRequest.foirequestid.label('foirequestid'), FOIRequest.version.label('foirequestversion'), FOIRequest.requesttype.label('requesttype'), @@ -397,11 +415,11 @@ def searchapplicant(cls, keywords): FOIRequestApplicantMapping.requestortypeid == 1), ).join( FOIRequestApplicant, - # FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid - and_( - FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, - FOIRequestApplicant.version == FOIRequestApplicantMapping.foirequestapplicant_version - ) + FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid + # and_( + # FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, + # FOIRequestApplicant.isactive != False + # ) ).join( ApplicantCategory, ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid @@ -542,7 +560,6 @@ def searchapplicant(cls, keywords): func.array_agg(subquery_all.c.alsoknownas).label('alsoknownas'), func.array_agg(subquery_all.c.dob).label('dob'), func.array_agg(subquery_all.c.businessname).label('businessname'), - subquery_all.c.applicantversion, func.array_agg(subquery_all.c.foirequestid).label('foirequestid'), func.array_agg(subquery_all.c.foirequestversion).label('foirequestversion'), func.array_agg(subquery_all.c.requesttype).label('requesttype'), @@ -561,7 +578,7 @@ def searchapplicant(cls, keywords): func.array_agg(subquery_all.c.employeenumber).label('employeenumber'), func.array_agg(subquery_all.c.correctionnumber).label('correctionnumber'), func.array_agg(subquery_all.c.phn).label('phn') - ).group_by(subquery_all.c.foirequestapplicantid, subquery_all.c.applicantversion) + ).group_by(subquery_all.c.foirequestapplicantid) applicantprofile_schema = ApplicantProfileSchema(many=True) return applicantprofile_schema.dump(query_aggregate.all()) @@ -601,6 +618,6 @@ class Meta: class ApplicantProfileSchema(ma.Schema): class Meta: fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob', - 'businessname','applicantversion','foirequestid','foirequestversion','requesttype', - 'applicantcategory','email','address','city','province','postal','country','homephone','workphone','workphone2','mobilephone', - 'othercontactinfo','employeenumber','correctionnumber','phn') + 'businessname','foirequestid','foirequestversion','requesttype','applicantcategory', + 'email','address','city','province','postal','country','homephone','workphone', + 'workphone2','mobilephone','othercontactinfo','employeenumber','correctionnumber','phn') diff --git a/request-management-api/request_api/resources/foiapplicant.py b/request-management-api/request_api/resources/foiapplicant.py index 05fb4ff8d..9f039e5f3 100644 --- a/request-management-api/request_api/resources/foiapplicant.py +++ b/request-management-api/request_api/resources/foiapplicant.py @@ -111,3 +111,22 @@ def post(): except BusinessException as exception: return {'status': exception.status_code, 'message':exception.message}, 500 +@cors_preflight('POST,OPTIONS') +@API.route('/foiapplicants/testsave') +class EventPagination(Resource): + """ Saves applicant info and request specific contact info for all open requests associated to an applicant + """ + @staticmethod + @TRACER.trace() + @cross_origin(origins=allowedorigins()) + @cors_preflight('POST,OPTIONS') + def post(): + try: + applicant = FOIRequestApplicantSchema().load(request.get_json()) + result = applicantservice().saveapplicantinfo(applicant, AuthHelper.getuserid()) + if result.success: + return {'status': result.success, 'message':result.message,'id':result.identifier} , 200 + else: + return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 + except BusinessException as exception: + return {'status': exception.status_code, 'message':exception.message}, 500 \ No newline at end of file diff --git a/request-management-api/request_api/schemas/foiapplicant.py b/request-management-api/request_api/schemas/foiapplicant.py index 517d9bb93..cd62b8140 100644 --- a/request-management-api/request_api/schemas/foiapplicant.py +++ b/request-management-api/request_api/schemas/foiapplicant.py @@ -27,13 +27,10 @@ class Meta: # pylint: disable=too-few-public-methods # correctionalServiceNumber = fields.Str(data_key="correctionalServiceNumber",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) # publicServiceEmployeeNumber = fields.Str(data_key="publicServiceEmployeeNumber",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) - foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) foirequestID = fields.List(fields.Int(),data_key="foirequestID",required=True,allow_none=False) - additionalPersonalInfo = fields.Nested(FOIAdditionallPersonalInfoWrapperSchema,required=False,allow_none=True) - \ No newline at end of file diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index ed5cdaeb3..5eb5985bf 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -36,7 +36,8 @@ def searchapplicant(self, keywords): return applicantqueue def saveapplicantinfo(self, applicantschema, userid): - FOIRequestApplicant.saveapplicant( + applicant = FOIRequestApplicant.updateapplicantprofile( + applicantschema['foiRequestApplicantID'], applicantschema['firstName'], applicantschema['lastName'], applicantschema['middleName'], @@ -46,6 +47,8 @@ def saveapplicantinfo(self, applicantschema, userid): userid ) # replace with applicant id once new save function is written requests = FOIMinistryRequest.getopenrequestsbyrequestId(applicantschema['foirequestID']) + applicantschema['foiRequestApplicantID'] = applicant.identifier + # requests = FOIMinistryRequest.getopenrequestsbyapplicantid(applicantschema['foiRequestApplicantID']) for request in requests: requestschema = requestservicegetter().getrequest(request['foirequest_id'], request['foiministryrequestid']) requestschema.update(applicantschema) diff --git a/request-management-api/request_api/services/foirequest/requestservicebuilder.py b/request-management-api/request_api/services/foirequest/requestservicebuilder.py index 4f6db7aa5..0f214e3ba 100644 --- a/request-management-api/request_api/services/foirequest/requestservicebuilder.py +++ b/request-management-api/request_api/services/foirequest/requestservicebuilder.py @@ -109,7 +109,7 @@ def createcontactinformation(self,dataformat, name, value, contacttypes, userid) def createapplicant(self,firstname, lastname, appltcategory, userid, middlename = None,businessname = None, alsoknownas = None, dob = None): requestapplicant = FOIRequestApplicantMapping() - _applicant = FOIRequestApplicant().saveapplicant(firstname, lastname, middlename, businessname, alsoknownas, dob, userid) + _applicant = FOIRequestApplicant().createapplicant(firstname, lastname, middlename, businessname, alsoknownas, dob, userid) requestapplicant.foirequestapplicantid = _applicant.identifier if appltcategory is not None: requestertype = RequestorType().getrequestortype(appltcategory) diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index e33828807..cec25115b 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -61,7 +61,7 @@ def saverequestversion(self,foirequestschema, foirequestid , ministryid, userid) else: return _foirequest self.__disablewatchers(ministryid, foirequestschema, userid) - result = self.saverequest(foirequestschema, userid, foirequestid,ministryid,filenumber,activeversion,_foirequest["foirawrequestid"],_foirequest["wfinstanceid"]) + result = self.saverequest(foirequestschema, userid, foirequestid,ministryid,filenumber,activeversion,_foirequest["foirawrequestid"],_foirequest["wfinstanceid"]) if result.success == True: FOIMinistryRequest.deActivateFileNumberVersion(ministryid, filenumber, userid) return result @@ -127,7 +127,7 @@ def __prepareapplicants(self, foirequestschema, userid): requestapplicantarr = [] selfalsoknownas=None selfdob=None - if foirequestschema.get("additionalPersonalInfo") is not None and foirequestschema.get('requeststatusid') == 1: + if foirequestschema.get("additionalPersonalInfo") is not None and foirequestschema.get('requeststatusid') == 1: if foirequestschema.get('foiRequestApplicantID', None): requestapplicant = FOIRequestApplicantMapping() requestapplicant.foirequestapplicantid = foirequestschema['foiRequestApplicantID'] From 83816e5193b381503d7b44b7b9143afb60d3a859 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Mon, 8 Jan 2024 19:35:58 -0800 Subject: [PATCH 016/147] 1. get applicant history 2. get applicant requests --- .../models/FOIRequestApplicants.py | 312 +++++++++++++++++- .../request_api/resources/foiapplicant.py | 61 +++- .../request_api/services/applicantservice.py | 110 +++++- 3 files changed, 463 insertions(+), 20 deletions(-) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 080773792..149c6931f 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -9,6 +9,7 @@ from .FOIRequests import FOIRequest from .FOIRequestContactInformation import FOIRequestContactInformation from .FOIRequestPersonalAttributes import FOIRequestPersonalAttribute +from .FOIRequestStatus import FOIRequestStatus from sqlalchemy import and_, or_, func, case import uuid @@ -126,6 +127,8 @@ def getapplicantbyemail(cls, email): #generate query selectedcolumns = [ + FOIRequestApplicant.applicantprofileid.label('applicantprofileid'), + func.to_char(FOIRequestApplicantMapping.created_at, 'YYYY-MM-DD HH24:MI:SS').label('updatedat'), FOIRequestApplicant.foirequestapplicantid.label('foirequestapplicantid'), FOIRequestApplicant.firstname.label('firstname'), FOIRequestApplicant.middlename.label('middlename'), @@ -311,6 +314,8 @@ def getapplicantbyemail(cls, email): ).order_by(FOIRequest.foirequestid.desc()).subquery() query_aggregate = _session.query( + func.array_agg(subquery_all.c.applicantprofileid).label('applicantprofileid'), + func.array_agg(subquery_all.c.updatedat).label('updatedat'), subquery_all.c.foirequestapplicantid, func.array_agg(subquery_all.c.firstname).label('firstname'), func.array_agg(subquery_all.c.middlename).label('middlename'), @@ -378,6 +383,8 @@ def searchapplicant(cls, keywords): #generate query selectedcolumns = [ + FOIRequestApplicant.applicantprofileid.label('applicantprofileid'), + func.to_char(FOIRequestApplicantMapping.created_at, 'YYYY-MM-DD HH24:MI:SS').label('updatedat'), FOIRequestApplicant.foirequestapplicantid.label('foirequestapplicantid'), FOIRequestApplicant.firstname.label('firstname'), FOIRequestApplicant.middlename.label('middlename'), @@ -553,6 +560,8 @@ def searchapplicant(cls, keywords): ).order_by(FOIRequest.foirequestid.desc()).subquery() query_aggregate = _session.query( + func.array_agg(subquery_all.c.applicantprofileid).label('applicantprofileid'), + func.array_agg(subquery_all.c.updatedat).label('updatedat'), subquery_all.c.foirequestapplicantid, func.array_agg(subquery_all.c.firstname).label('firstname'), func.array_agg(subquery_all.c.middlename).label('middlename'), @@ -611,13 +620,312 @@ def getsearchfilters(cls, keywords, contactemail, contacthomephone, contactworkp return searchfilters + + # applicant history + @classmethod + def getapplicanthistory(cls, applicantid): + #for queue/dashboard + _session = db.session + + applicantprofile = aliased(FOIRequestApplicant) + + #aliase for getting contact info + contactemail = aliased(FOIRequestContactInformation) + contactaddress = aliased(FOIRequestContactInformation) + contactaddress2 = aliased(FOIRequestContactInformation) + contacthomephone = aliased(FOIRequestContactInformation) + contactworkphone = aliased(FOIRequestContactInformation) + contactworkphone2 = aliased(FOIRequestContactInformation) + contactmobilephone = aliased(FOIRequestContactInformation) + contactother = aliased(FOIRequestContactInformation) + + city = aliased(FOIRequestContactInformation) + province = aliased(FOIRequestContactInformation) + postal = aliased(FOIRequestContactInformation) + country = aliased(FOIRequestContactInformation) + + #aliase for getting personal attributes + personalemployeenumber = aliased(FOIRequestPersonalAttribute) + personalcorrectionnumber = aliased(FOIRequestPersonalAttribute) + personalhealthnumber = aliased(FOIRequestPersonalAttribute) + + #generate query + selectedcolumns = [ + applicantprofile.applicantprofileid.label('applicantprofileid'), + func.to_char(FOIRequestApplicantMapping.created_at, 'YYYY-MM-DD HH24:MI:SS').label('updatedat'), + FOIRequestApplicant.foirequestapplicantid.label('foirequestapplicantid'), + FOIRequestApplicant.firstname.label('firstname'), + FOIRequestApplicant.middlename.label('middlename'), + FOIRequestApplicant.lastname.label('lastname'), + FOIRequestApplicant.alsoknownas.label('alsoknownas'), + func.to_char(FOIRequestApplicant.dob, 'YYYY-MM-DD').label('dob'), + FOIRequestApplicant.businessname.label('businessname'), + FOIRequest.foirequestid.label('foirequestid'), + FOIRequest.version.label('foirequestversion'), + FOIRequest.requesttype.label('requesttype'), + ApplicantCategory.name.label('applicantcategory'), + contactemail.contactinformation.label('email'), + contactaddress.contactinformation.label('address'), + contactaddress2.contactinformation.label('address2'), + contacthomephone.contactinformation.label('homephone'), + contactworkphone.contactinformation.label('workphone'), + contactworkphone2.contactinformation.label('workphone2'), + contactmobilephone.contactinformation.label('mobilephone'), + contactother.contactinformation.label('othercontactinfo'), + city.contactinformation.label('city'), + province.contactinformation.label('province'), + postal.contactinformation.label('postal'), + country.contactinformation.label('country'), + personalemployeenumber.attributevalue.label('employeenumber'), + personalcorrectionnumber.attributevalue.label('correctionnumber'), + personalhealthnumber.attributevalue.label('phn') + ] + + query_all = _session.query( + *selectedcolumns + ).join( + applicantprofile, + or_( + and_( + applicantprofile.foirequestapplicantid == applicantid, + applicantprofile.applicantprofileid == FOIRequestApplicant.applicantprofileid + ), + and_( + FOIRequestApplicant.foirequestapplicantid == applicantid, + applicantprofile.applicantprofileid.is_(None) + ) + ) + ).join( + FOIRequestApplicantMapping, + and_( + FOIRequestApplicantMapping.requestortypeid == 1, + FOIRequestApplicantMapping.foirequestapplicantid == FOIRequestApplicant.foirequestapplicantid) + ).join( + FOIRequest, + and_( + FOIRequest.foirequestid == FOIRequestApplicantMapping.foirequest_id, + FOIRequest.version == FOIRequestApplicantMapping.foirequestversion_id) + ).join( + ApplicantCategory, + ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid + ).join( + contactemail, + and_( + contactemail.foirequest_id == FOIRequest.foirequestid, + contactemail.foirequestversion_id == FOIRequest.version, + contactemail.contacttypeid == 1), + ).join( + contactaddress, + and_( + contactaddress.foirequest_id == FOIRequest.foirequestid, + contactaddress.foirequestversion_id == FOIRequest.version, + contactaddress.contacttypeid == 2, + contactaddress.contactinformation is not None, + contactaddress.dataformat == 'address'), + isouter=True + ).join( + contactaddress2, + and_( + contactaddress2.foirequest_id == FOIRequest.foirequestid, + contactaddress2.foirequestversion_id == FOIRequest.version, + contactaddress2.contacttypeid == 2, + contactaddress2.contactinformation is not None, + contactaddress2.dataformat == 'addressSecondary'), + isouter=True + ).join( + contacthomephone, + and_( + contacthomephone.foirequest_id == FOIRequest.foirequestid, + contacthomephone.foirequestversion_id == FOIRequest.version, + contacthomephone.contacttypeid == 3, + contacthomephone.contactinformation is not None), + isouter=True + ).join( + contactworkphone, + and_( + contactworkphone.foirequest_id == FOIRequest.foirequestid, + contactworkphone.foirequestversion_id == FOIRequest.version, + contactworkphone.contacttypeid == 4, + contactworkphone.contactinformation is not None), + isouter=True + ).join( + contactworkphone2, + and_( + contactworkphone2.foirequest_id == FOIRequest.foirequestid, + contactworkphone2.foirequestversion_id == FOIRequest.version, + contactworkphone2.contacttypeid == 5, + contactworkphone2.contactinformation is not None), + isouter=True + ).join( + contactmobilephone, + and_( + contactmobilephone.foirequest_id == FOIRequest.foirequestid, + contactmobilephone.foirequestversion_id == FOIRequest.version, + contactmobilephone.contacttypeid == 6, + contactmobilephone.contactinformation is not None), + isouter=True + ).join( + contactother, + and_( + contactother.foirequest_id == FOIRequest.foirequestid, + contactother.foirequestversion_id == FOIRequest.version, + contactother.contacttypeid == 7, + contactother.contactinformation is not None), + isouter=True + ).join( + city, + and_( + city.foirequest_id == FOIRequest.foirequestid, + city.foirequestversion_id == FOIRequest.version, + city.contacttypeid == 2, + city.contactinformation is not None, + city.dataformat == 'city'), + isouter=True + ).join( + province, + and_( + province.foirequest_id == FOIRequest.foirequestid, + province.foirequestversion_id == FOIRequest.version, + province.contacttypeid == 2, + province.contactinformation is not None, + province.dataformat == 'province'), + isouter=True + ).join( + country, + and_( + country.foirequest_id == FOIRequest.foirequestid, + country.foirequestversion_id == FOIRequest.version, + country.contacttypeid == 2, + country.contactinformation is not None, + country.dataformat == 'country'), + isouter=True + ).join( + postal, + and_( + postal.foirequest_id == FOIRequest.foirequestid, + postal.foirequestversion_id == FOIRequest.version, + postal.contacttypeid == 2, + postal.contactinformation is not None, + postal.dataformat == 'postal'), + isouter=True + ).join( + personalemployeenumber, + and_( + personalemployeenumber.foirequest_id == FOIRequest.foirequestid, + personalemployeenumber.foirequestversion_id == FOIRequest.version, + personalemployeenumber.personalattributeid == 1, + personalemployeenumber.attributevalue is not None), + isouter=True + ).join( + personalcorrectionnumber, + and_( + personalcorrectionnumber.foirequest_id == FOIRequest.foirequestid, + personalcorrectionnumber.foirequestversion_id == FOIRequest.version, + personalcorrectionnumber.personalattributeid == 2, + personalcorrectionnumber.attributevalue is not None), + isouter=True + ).join( + personalhealthnumber, + and_( + personalhealthnumber.foirequest_id == FOIRequest.foirequestid, + personalhealthnumber.foirequestversion_id == FOIRequest.version, + personalhealthnumber.personalattributeid == 3, + personalhealthnumber.attributevalue is not None), + isouter=True + ).filter( + FOIRequest.isactive == True + ).order_by(FOIRequestApplicantMapping.created_at.desc()) + + # print("query_applicant_history", query_all) + + applicantprofile_schema = ApplicantProfileSchema(many=True) + return applicantprofile_schema.dump(query_all.all()) + + + # requests by applicant id + @classmethod + def getapplicantrequests(cls, applicantid): + from .FOIMinistryRequests import FOIMinistryRequest + + #for queue/dashboard + _session = db.session + + applicantprofile = aliased(FOIRequestApplicant) + + #max foirequest version + subquery_foirequest_maxversion = _session.query(FOIRequest.foirequestid, func.max(FOIRequest.version).label('max_version')).group_by(FOIRequest.foirequestid).subquery() + joincondition = [ + subquery_foirequest_maxversion.c.foirequestid == FOIRequest.foirequestid, + subquery_foirequest_maxversion.c.max_version == FOIRequest.version, + ] + + #generate query + selectedcolumns = [ + FOIRequestApplicant.applicantprofileid.label('applicantprofileid'), + FOIRequestApplicant.foirequestapplicantid.label('foirequestapplicantid'), + FOIMinistryRequest.axisrequestid, + FOIRequestStatus.name.label('requeststatus'), + func.to_char(FOIRequest.receiveddate, 'YYYY-MM-DD HH24:MI:SS').label('receiveddate'), + FOIMinistryRequest.description + ] + + query_all = _session.query( + *selectedcolumns + ).distinct( + FOIRequest.foirequestid + ).join( + applicantprofile, + or_( + and_( + applicantprofile.foirequestapplicantid == applicantid, + applicantprofile.applicantprofileid == FOIRequestApplicant.applicantprofileid + ), + and_( + FOIRequestApplicant.foirequestapplicantid == applicantid, + applicantprofile.applicantprofileid.is_(None) + ) + ) + ).join( + FOIRequestApplicantMapping, + and_( + FOIRequestApplicantMapping.requestortypeid == 1, + FOIRequestApplicantMapping.foirequestapplicantid == FOIRequestApplicant.foirequestapplicantid) + ).join( + FOIRequest, + and_( + FOIRequest.foirequestid == FOIRequestApplicantMapping.foirequest_id, + FOIRequest.version == FOIRequestApplicantMapping.foirequestversion_id, + FOIRequest.isactive == True) + ).join( + subquery_foirequest_maxversion, + and_(*joincondition) + ).join( + FOIMinistryRequest, + and_( + FOIMinistryRequest.foirequest_id == FOIRequest.foirequestid, + FOIMinistryRequest.isactive == True) + ).join( + FOIRequestStatus, + FOIRequestStatus.requeststatusid == FOIMinistryRequest.requeststatusid + ).order_by(FOIRequest.foirequestid.desc()) + + # print('query_all', query_all) + + applicantrequest_schema = ApplicantRequestSchema(many=True) + return applicantrequest_schema.dump(query_all.all()) + + class FOIRequestApplicantSchema(ma.Schema): class Meta: fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob','businessname') class ApplicantProfileSchema(ma.Schema): class Meta: - fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob', - 'businessname','foirequestid','foirequestversion','requesttype','applicantcategory', + fields = ('applicantprofileid','updatedat','foirequestapplicantid','firstname','middlename','lastname', + 'alsoknownas','dob','businessname','foirequestid','foirequestversion','requesttype','applicantcategory', 'email','address','city','province','postal','country','homephone','workphone', 'workphone2','mobilephone','othercontactinfo','employeenumber','correctionnumber','phn') + +class ApplicantRequestSchema(ma.Schema): + class Meta: + fields = ('applicantprofileid','foirequestapplicantid','axisrequestid','requeststatus','receiveddate','description') \ No newline at end of file diff --git a/request-management-api/request_api/resources/foiapplicant.py b/request-management-api/request_api/resources/foiapplicant.py index 9f039e5f3..d7b62084a 100644 --- a/request-management-api/request_api/resources/foiapplicant.py +++ b/request-management-api/request_api/resources/foiapplicant.py @@ -88,7 +88,8 @@ def post(): return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 except BusinessException as exception: return {'status': exception.status_code, 'message':exception.message}, 500 - + + @cors_preflight('POST,OPTIONS') @API.route('/foiapplicants/save') class EventPagination(Resource): @@ -110,23 +111,51 @@ def post(): return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 except BusinessException as exception: return {'status': exception.status_code, 'message':exception.message}, 500 - -@cors_preflight('POST,OPTIONS') -@API.route('/foiapplicants/testsave') -class EventPagination(Resource): - """ Saves applicant info and request specific contact info for all open requests associated to an applicant - """ + + +@cors_preflight('GET,OPTIONS') +@API.route('/foiapplicants/history/') +class FOIApplicants(Resource): + """Resource for retriving all FOI assignees.""" + @staticmethod @TRACER.trace() @cross_origin(origins=allowedorigins()) - @cors_preflight('POST,OPTIONS') - def post(): + @auth.require + @auth.isiao + @cors_preflight('GET,OPTIONS') + def get(applicantid=None): + if applicantid is None or applicantid == 0: + return {'status': False, 'message':EXCEPTION_MESSAGE_BAD_REQUEST}, 400 try: - applicant = FOIRequestApplicantSchema().load(request.get_json()) - result = applicantservice().saveapplicantinfo(applicant, AuthHelper.getuserid()) - if result.success: - return {'status': result.success, 'message':result.message,'id':result.identifier} , 200 + result = applicantservice().getapplicanthistory(applicantid) + if result is not None: + return json.dumps(result), 200 else: - return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 - except BusinessException as exception: - return {'status': exception.status_code, 'message':exception.message}, 500 \ No newline at end of file + return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 + except BusinessException as exception: + return {'status': exception.status_code, 'message':exception.message}, 500 + + +@cors_preflight('GET,OPTIONS') +@API.route('/foiapplicants/requests/') +class FOIApplicants(Resource): + """Resource for retriving all FOI assignees.""" + + @staticmethod + @TRACER.trace() + @cross_origin(origins=allowedorigins()) + @auth.require + @auth.isiao + @cors_preflight('GET,OPTIONS') + def get(applicantid=None): + if applicantid is None or applicantid == 0: + return {'status': False, 'message':EXCEPTION_MESSAGE_BAD_REQUEST}, 400 + try: + result = applicantservice().getapplicantrequests(applicantid) + if result is not None: + return json.dumps(result), 200 + else: + return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 + except BusinessException as exception: + return {'status': exception.status_code, 'message':exception.message}, 500 \ No newline at end of file diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index 5eb5985bf..c0f0a10a9 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -29,6 +29,7 @@ def getapplicantbyemail(self, email): def searchapplicant(self, keywords): applicantqueue = [] applicants = FOIRequestApplicant.searchapplicant(keywords) + print('applicants: ', applicants) if applicants is not None: for applicant in applicants: applicantqueue.append(self.__prepareapplicant(applicant)) @@ -85,7 +86,6 @@ def __prepareapplicant(self, applicant): #'createdat' : self.__formatedate(applicant["createdat)"], 'businessName': self.__first_not_null(applicant["businessname"]), # 'applicant': applicant["applicant"], - 'applicantVersion': applicant["applicantversion"], 'foirequestID': applicant["foirequestid"], 'foirequestVersion': applicant["foirequestversion"], 'requestType': applicant["requesttype"], @@ -104,4 +104,110 @@ def __prepareapplicant(self, applicant): 'publicServiceEmployeeNumber': self.__first_not_null(applicant["employeenumber"]), 'correctionalServiceNumber': self.__first_not_null(applicant["correctionnumber"]), } - \ No newline at end of file + + def getapplicanthistory(self, applicantid): + applicantqueue = [] + + # order by update date desc + applicants = FOIRequestApplicant.getapplicanthistory(applicantid) + print('applicants: ', applicants) + if applicants is not None: + newer = self.__prepareapplicantforcomparing(applicants[0]) + updatedat = applicants[0]['updatedat'] + for applicant in applicants: + cur = self.__prepareapplicantforcomparing(applicant) + if(cur != newer): + applicantqueue.append(self.__prepareapplicanthistory(applicant, updatedat)) + newer = cur + + updatedat = applicant['updatedat'] + + applicantqueue.append(self.__prepareapplicanthistory(applicant, updatedat)) + + return applicantqueue + + def __prepareapplicantforcomparing(self, applicant): + return { + 'alsoKnownAs': applicant["alsoknownas"], + 'birthDate': applicant["dob"], + 'personalHealthNumber': applicant["phn"], + # 'foiRequestApplicantID': applicant["foirequestapplicantid"], + # 'applicantProfileID': applicant["applicantprofileid"], + # 'updatedat': applicant['updatedat'], + 'firstName': applicant["firstname"], + 'middleName': applicant["middlename"], + 'lastName': applicant["lastname"], + 'businessName': applicant["businessname"], + # 'foirequestID': applicant["foirequestid"], + # 'foirequestVersion': applicant["foirequestversion"], + # 'requestType': applicant["requesttype"], + 'email': applicant["email"], + 'address': applicant["address"], + 'city': applicant["city"], + 'province': applicant["province"], + 'postal': applicant["postal"], + 'country': applicant["country"], + 'phonePrimary': applicant["homephone"], + 'workPhonePrimary': applicant["workphone"], + 'workPhoneSecondary': applicant["workphone2"], + 'phoneSecondary': applicant["mobilephone"], + 'otherContactInfo': applicant["othercontactinfo"], + 'publicServiceEmployeeNumber': applicant["employeenumber"], + 'correctionalServiceNumber': applicant["correctionnumber"], + } + + def __prepareapplicanthistory(self, applicant, updatedat): + return { + updatedat: { + 'additionalPersonalInfo': { + 'alsoKnownAs': applicant["alsoknownas"], + 'birthDate': applicant["dob"], + 'personalHealthNumber': applicant["phn"], + }, + 'foiRequestApplicantID': applicant["foirequestapplicantid"], + 'applicantProfileID': applicant["applicantprofileid"], + 'updatedat': applicant['updatedat'], + 'firstName': applicant["firstname"], + 'middleName': applicant["middlename"], + 'lastName': applicant["lastname"], + 'businessName': applicant["businessname"], + 'foirequestID': applicant["foirequestid"], + 'foirequestVersion': applicant["foirequestversion"], + 'requestType': applicant["requesttype"], + 'email': applicant["email"], + 'address': applicant["address"], + 'city': applicant["city"], + 'province': applicant["province"], + 'postal': applicant["postal"], + 'country': applicant["country"], + 'phonePrimary': applicant["homephone"], + 'workPhonePrimary': applicant["workphone"], + 'workPhoneSecondary': applicant["workphone2"], + 'phoneSecondary': applicant["mobilephone"], + 'otherContactInfo': applicant["othercontactinfo"], + 'publicServiceEmployeeNumber': applicant["employeenumber"], + 'correctionalServiceNumber': applicant["correctionnumber"], + } + } + + def getapplicantrequests(self, applicantid): + requestqueue = [] + + # order by update date desc + requests = FOIRequestApplicant.getapplicantrequests(applicantid) + print('requests: ', requests) + if requests is not None: + for request in requests: + requestqueue.append(self.__preparerequest(request)) + + return requestqueue + + def __preparerequest(self, request): + return { + 'applicantprofileid': request["applicantprofileid"], + 'foirequestapplicantid': request["foirequestapplicantid"], + 'axisrequestid': request["axisrequestid"], + 'requeststatus': request["requeststatus"], + 'receiveddate': request["receiveddate"], + 'description': request["description"], + } \ No newline at end of file From 5b8e4578d72352f49e254d57c233405181edb092 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Wed, 10 Jan 2024 15:53:32 -0800 Subject: [PATCH 017/147] bug fix: save request created new applicant --- .../foirequest/requestservicecreate.py | 42 ++++++++++--------- .../foirequest/requestservicegetter.py | 11 +++-- 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index cec25115b..f1689010b 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -128,25 +128,27 @@ def __prepareapplicants(self, foirequestschema, userid): selfalsoknownas=None selfdob=None if foirequestschema.get("additionalPersonalInfo") is not None and foirequestschema.get('requeststatusid') == 1: - if foirequestschema.get('foiRequestApplicantID', None): - requestapplicant = FOIRequestApplicantMapping() - requestapplicant.foirequestapplicantid = foirequestschema['foiRequestApplicantID'] - requestapplicant.requestortypeid = RequestorType().getrequestortype("Self")["requestortypeid"] - requestapplicantarr.append(requestapplicant) - else: - applicantinfo = foirequestschema.get("additionalPersonalInfo") - selfdob = applicantinfo["birthDate"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"birthDate","additionalPersonalInfo") else None - selfalsoknownas = applicantinfo["alsoKnownAs"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"alsoKnownAs","additionalPersonalInfo") else None - requestapplicantarr.append( - requestservicebuilder().createapplicant(foirequestschema.get("firstName"), - foirequestschema.get("lastName"), - "Self", - userid, - foirequestschema.get("middleName"), - foirequestschema.get("businessName"), - selfalsoknownas, - selfdob) - ) + applicantinfo = foirequestschema.get("additionalPersonalInfo") + selfdob = applicantinfo["birthDate"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"birthDate","additionalPersonalInfo") else None + selfalsoknownas = applicantinfo["alsoKnownAs"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"alsoKnownAs","additionalPersonalInfo") else None + + # if foirequestschema.get('foiRequestApplicantID') is None and foirequestschema.get('requeststatusid') == 1: + if foirequestschema.get('foiRequestApplicantID') is not None: + requestapplicant = FOIRequestApplicantMapping() + requestapplicant.foirequestapplicantid = foirequestschema['foiRequestApplicantID'] + requestapplicant.requestortypeid = RequestorType().getrequestortype("Self")["requestortypeid"] + requestapplicantarr.append(requestapplicant) + else: + requestapplicantarr.append( + requestservicebuilder().createapplicant(foirequestschema.get("firstName"), + foirequestschema.get("lastName"), + "Self", + userid, + foirequestschema.get("middleName"), + foirequestschema.get("businessName"), + selfalsoknownas, + selfdob) + ) #Prepare additional applicants if foirequestschema.get("additionalPersonalInfo") is not None: @@ -172,7 +174,7 @@ def __prepareapplicants(self, foirequestschema, userid): None, self.__getkeyvalue(addlapplicantinfo,"anotherAlsoKnownAs"), self.__getkeyvalue(addlapplicantinfo,"anotherBirthDate") ) - ) + ) return requestapplicantarr def __disablewatchers(self, ministryid, requestschema, userid): diff --git a/request-management-api/request_api/services/foirequest/requestservicegetter.py b/request-management-api/request_api/services/foirequest/requestservicegetter.py index e5ae2c249..aea1580d4 100644 --- a/request-management-api/request_api/services/foirequest/requestservicegetter.py +++ b/request-management-api/request_api/services/foirequest/requestservicegetter.py @@ -45,9 +45,10 @@ def getrequest(self,foirequestid,foiministryrequestid): dobraw = applicant['foirequestapplicant.dob'] dob = parse(dobraw).strftime(self.__genericdateformat()) if dobraw is not None else '' alsoknownas = applicant['foirequestapplicant.alsoknownas'] + foirequestapplicantid = applicant['foirequestapplicant.foirequestapplicantid'] requestortypeid = applicant['requestortype.requestortypeid'] if requestortypeid == 1: - baserequestinfo.update(self.__prepareapplicant(firstname, middlename, lastname, businessname)) + baserequestinfo.update(self.__prepareapplicant(foirequestapplicantid, firstname, middlename, lastname, businessname)) additionalpersonalinfo.update(self.__prepareadditionalpersonalinfo(requestortypeid, firstname, middlename, lastname, dob, alsoknownas)) baserequestdetails, additionalpersonalinfodetails = self.preparepersonalattributes(foirequestid, request['version']) @@ -91,9 +92,10 @@ def getrequestdetailsforministry(self,foirequestid,foiministryrequestid, authmem lastname = applicant['foirequestapplicant.lastname'] dobraw = applicant['foirequestapplicant.dob'] dob = parse(dobraw).strftime(self.__genericdateformat()) if dobraw is not None else '' + foirequestapplicantid = applicant['foirequestapplicant.foirequestapplicantid'] requestortypeid = applicant['requestortype.requestortypeid'] if requestortypeid == 1: - baserequestinfo.update(self.__prepareapplicant(firstname, middlename, lastname)) + baserequestinfo.update(self.__prepareapplicant(foirequestapplicantid, firstname, middlename, lastname)) additionalpersonalinfo.update(self.__prepareadditionalpersonalinfo(requestortypeid, firstname, middlename, lastname, dob)) baserequestdetails, additionalpersonalinfodetails = self.preparepersonalattributes(foirequestid, request['version']) baserequestinfo.update(baserequestdetails) @@ -227,12 +229,13 @@ def getministryrequest(self, foiministryrequestid): def __genericdateformat(self): return '%Y-%m-%d' - def __prepareapplicant(self,firstname= None, middlename= None, lastname= None, businessname= None): + def __prepareapplicant(self, foirequestapplicantid=None, firstname= None, middlename= None, lastname= None, businessname= None): return { 'firstName': firstname, 'middleName': middlename, 'lastName': lastname, - 'businessName': businessname, + 'businessName': businessname, + 'foiRequestApplicantID': foirequestapplicantid } def __prepareadditionalpersonalinfo(self, requestortypeid, firstname= None, middlename= None, lastname= None, dob= None, alsoknownas= None): From 99492a207e147bc68c5400d3df15f0d8ec515909 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Wed, 10 Jan 2024 17:02:55 -0800 Subject: [PATCH 018/147] applicant history only return differences --- .../request_api/services/applicantservice.py | 71 +++++++++---------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index c0f0a10a9..ed171bdf8 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -117,13 +117,10 @@ def getapplicanthistory(self, applicantid): for applicant in applicants: cur = self.__prepareapplicantforcomparing(applicant) if(cur != newer): - applicantqueue.append(self.__prepareapplicanthistory(applicant, updatedat)) + applicantqueue.append({ updatedat: dict(set(cur.items()) - set(newer.items())) }) newer = cur - updatedat = applicant['updatedat'] - applicantqueue.append(self.__prepareapplicanthistory(applicant, updatedat)) - return applicantqueue def __prepareapplicantforcomparing(self, applicant): @@ -156,39 +153,39 @@ def __prepareapplicantforcomparing(self, applicant): 'correctionalServiceNumber': applicant["correctionnumber"], } - def __prepareapplicanthistory(self, applicant, updatedat): - return { - updatedat: { - 'additionalPersonalInfo': { - 'alsoKnownAs': applicant["alsoknownas"], - 'birthDate': applicant["dob"], - 'personalHealthNumber': applicant["phn"], - }, - 'foiRequestApplicantID': applicant["foirequestapplicantid"], - 'applicantProfileID': applicant["applicantprofileid"], - 'updatedat': applicant['updatedat'], - 'firstName': applicant["firstname"], - 'middleName': applicant["middlename"], - 'lastName': applicant["lastname"], - 'businessName': applicant["businessname"], - 'foirequestID': applicant["foirequestid"], - 'foirequestVersion': applicant["foirequestversion"], - 'requestType': applicant["requesttype"], - 'email': applicant["email"], - 'address': applicant["address"], - 'city': applicant["city"], - 'province': applicant["province"], - 'postal': applicant["postal"], - 'country': applicant["country"], - 'phonePrimary': applicant["homephone"], - 'workPhonePrimary': applicant["workphone"], - 'workPhoneSecondary': applicant["workphone2"], - 'phoneSecondary': applicant["mobilephone"], - 'otherContactInfo': applicant["othercontactinfo"], - 'publicServiceEmployeeNumber': applicant["employeenumber"], - 'correctionalServiceNumber': applicant["correctionnumber"], - } - } + # def __prepareapplicanthistory(self, applicant, updatedat): + # return { + # updatedat: { + # 'additionalPersonalInfo': { + # 'alsoKnownAs': applicant["alsoknownas"], + # 'birthDate': applicant["dob"], + # 'personalHealthNumber': applicant["phn"], + # }, + # 'foiRequestApplicantID': applicant["foirequestapplicantid"], + # 'applicantProfileID': applicant["applicantprofileid"], + # 'updatedat': applicant['updatedat'], + # 'firstName': applicant["firstname"], + # 'middleName': applicant["middlename"], + # 'lastName': applicant["lastname"], + # 'businessName': applicant["businessname"], + # 'foirequestID': applicant["foirequestid"], + # 'foirequestVersion': applicant["foirequestversion"], + # 'requestType': applicant["requesttype"], + # 'email': applicant["email"], + # 'address': applicant["address"], + # 'city': applicant["city"], + # 'province': applicant["province"], + # 'postal': applicant["postal"], + # 'country': applicant["country"], + # 'phonePrimary': applicant["homephone"], + # 'workPhonePrimary': applicant["workphone"], + # 'workPhoneSecondary': applicant["workphone2"], + # 'phoneSecondary': applicant["mobilephone"], + # 'otherContactInfo': applicant["othercontactinfo"], + # 'publicServiceEmployeeNumber': applicant["employeenumber"], + # 'correctionalServiceNumber': applicant["correctionnumber"], + # } + # } def getapplicantrequests(self, applicantid): requestqueue = [] From 2e84083cd138e10919adf503b795b7d4d2f9e762 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 11 Jan 2024 15:36:32 -0800 Subject: [PATCH 019/147] integrating history and request endpoints for applicant profile --- .../FOI/FOIRequest/ApplicantProfileModal.js | 45 ++++++++++++------- .../models/FOIRequestApplicants.py | 4 +- .../request_api/services/applicantservice.py | 45 ++++++++++--------- 3 files changed, 55 insertions(+), 39 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index cf3c4671b..12f56d682 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -16,7 +16,7 @@ import SearchIcon from "@material-ui/icons/Search"; import InputAdornment from "@mui/material/InputAdornment"; import InputBase from "@mui/material/InputBase"; import Grid from "@mui/material/Grid"; -import { fetchPotentialApplicants, fetchApplicantInfo, fetchApplicantContactHistory, saveApplicantInfo, fetchApplicantProfileByKeyword } from "../../../apiManager/services/FOI/foiApplicantProfileService"; +import { fetchPotentialApplicants, fetchApplicantInfo, fetchApplicantContactHistory, saveApplicantInfo, fetchApplicantProfileByKeyword, fetchApplicantRequests } from "../../../apiManager/services/FOI/foiApplicantProfileService"; import AddressContactDetails from "./AddressContanctInfo"; import ApplicantDetails from "./ApplicantDetails" import AdditionalApplicantDetails from "./AdditionalApplicantDetails"; @@ -104,24 +104,24 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const requestHistoryColumns = [ { - field: "requestId", + field: "filenumber", headerName: "REQUEST ID", flex: 1, }, { - field: "currentState", + field: "requeststatus", headerName: "CURRENT STATE", flex: 1, }, { - field: "receivedDate", + field: "receiveddate", headerName: "RECEIVED DATE", flex: 1, }, { - field: "requestDescription", + field: "description", headerName: "REQUEST DESRCIPTION", - flex: 3, + flex: 2, }, ]; @@ -296,9 +296,9 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } const showApplicantHistory = () => { - fetchApplicantContactHistory((err, res) => { + dispatch(fetchApplicantContactHistory(selectedApplicant.foiRequestApplicantID, (err, res) => { setApplicantHistory(res); - }) + })) } const back = () => { @@ -325,6 +325,17 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } } + const toggleRequestHistory = () => { + if (!selectedApplicant.requestHistory) { + dispatch(fetchApplicantRequests(selectedApplicant.foiRequestApplicantID, (err, res) => { + setSelectedApplicant({...selectedApplicant, requestHistory: res}); + setShowRequestHistory(true) + })) + } else { + setShowRequestHistory(true) + } + } + return (
@@ -364,13 +375,13 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { orientation="vertical" /> setShowRequestHistory(true)} + onClick={toggleRequestHistory} disableRipple className={clsx("request-history-header applicant-profile-header", { [classes.disabledTitle]: !showRequestHistory })} > - Request History ({selectedApplicant.foirequestID.length}) + Request History ({selectedApplicant?.foirequestID?.length}) : @@ -391,7 +402,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { : (showRequestHistory ? <> - + { loading={isLoading} onRowClick={selectApplicantRow} getRowHeight={() => 'auto'} - getRowId={(row) => row.requestId} + getRowId={(row) => row.filenumber} /> : @@ -414,13 +425,15 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { aria-controls="panel1a-content" > {`APPLICANT CONTACT DETAILS`} - {entry.username} - {entry.date} + {entry.createdby} - {entry.updatedat}
-
- {entry.field}: {entry.value} -
+ {Object.keys(entry.fields).map((field) => +
+ {field}: {entry.fields[field]} +
+ )}
) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 149c6931f..928edae88 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -921,11 +921,11 @@ class Meta: class ApplicantProfileSchema(ma.Schema): class Meta: - fields = ('applicantprofileid','updatedat','foirequestapplicantid','firstname','middlename','lastname', + fields = ('applicantprofileid','updatedat','createdby','foirequestapplicantid','firstname','middlename','lastname', 'alsoknownas','dob','businessname','foirequestid','foirequestversion','requesttype','applicantcategory', 'email','address','city','province','postal','country','homephone','workphone', 'workphone2','mobilephone','othercontactinfo','employeenumber','correctionnumber','phn') class ApplicantRequestSchema(ma.Schema): class Meta: - fields = ('applicantprofileid','foirequestapplicantid','axisrequestid','requeststatus','receiveddate','description') \ No newline at end of file + fields = ('applicantprofileid','foirequestapplicantid','axisrequestid','filenumber', 'requeststatus','receiveddate','description') \ No newline at end of file diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index ed171bdf8..efb54f377 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -114,43 +114,45 @@ def getapplicanthistory(self, applicantid): if applicants is not None: newer = self.__prepareapplicantforcomparing(applicants[0]) updatedat = applicants[0]['updatedat'] + createdby = applicants[0]['createdby'] for applicant in applicants: cur = self.__prepareapplicantforcomparing(applicant) if(cur != newer): - applicantqueue.append({ updatedat: dict(set(cur.items()) - set(newer.items())) }) + applicantqueue.append({ "updatedat": updatedat, "createdby": createdby, "fields": dict(set(cur.items()) - set(newer.items()))}) newer = cur updatedat = applicant['updatedat'] + createdby = applicant['createdby'] return applicantqueue def __prepareapplicantforcomparing(self, applicant): return { - 'alsoKnownAs': applicant["alsoknownas"], - 'birthDate': applicant["dob"], - 'personalHealthNumber': applicant["phn"], + 'Also Known As': applicant["alsoknownas"], + 'Birth Date': applicant["dob"], + 'Personal Health Number': applicant["phn"], # 'foiRequestApplicantID': applicant["foirequestapplicantid"], # 'applicantProfileID': applicant["applicantprofileid"], # 'updatedat': applicant['updatedat'], - 'firstName': applicant["firstname"], - 'middleName': applicant["middlename"], - 'lastName': applicant["lastname"], - 'businessName': applicant["businessname"], + 'First Name': applicant["firstname"], + 'Middle Name': applicant["middlename"], + 'Last Name': applicant["lastname"], + 'Organization': applicant["businessname"], # 'foirequestID': applicant["foirequestid"], # 'foirequestVersion': applicant["foirequestversion"], # 'requestType': applicant["requesttype"], - 'email': applicant["email"], - 'address': applicant["address"], - 'city': applicant["city"], - 'province': applicant["province"], - 'postal': applicant["postal"], - 'country': applicant["country"], - 'phonePrimary': applicant["homephone"], - 'workPhonePrimary': applicant["workphone"], - 'workPhoneSecondary': applicant["workphone2"], - 'phoneSecondary': applicant["mobilephone"], - 'otherContactInfo': applicant["othercontactinfo"], - 'publicServiceEmployeeNumber': applicant["employeenumber"], - 'correctionalServiceNumber': applicant["correctionnumber"], + 'Email': applicant["email"], + 'Address': applicant["address"], + 'City': applicant["city"], + 'Province': applicant["province"], + 'Postal Code': applicant["postal"], + 'Country': applicant["country"], + 'Home Phone': applicant["homephone"], + 'Work Phone': applicant["workphone"], + 'Alternative Phone': applicant["workphone2"], + 'Mobile Phone': applicant["mobilephone"], + 'Other Contact Info': applicant["othercontactinfo"], + 'Employee Number': applicant["employeenumber"], + 'Corrections Number': applicant["correctionnumber"], } # def __prepareapplicanthistory(self, applicant, updatedat): @@ -204,6 +206,7 @@ def __preparerequest(self, request): 'applicantprofileid': request["applicantprofileid"], 'foirequestapplicantid': request["foirequestapplicantid"], 'axisrequestid': request["axisrequestid"], + 'filenumber': request["filenumber"], 'requeststatus': request["requeststatus"], 'receiveddate': request["receiveddate"], 'description': request["description"], From 9db77c2e7e09b561224f00c280e5b5a6e296e6dd Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Thu, 11 Jan 2024 15:48:10 -0800 Subject: [PATCH 020/147] remove logs --- .../request_api/services/applicantservice.py | 44 ------------------- 1 file changed, 44 deletions(-) diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index ed171bdf8..beb9d3700 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -19,7 +19,6 @@ class applicantservice: def getapplicantbyemail(self, email): applicantqueue = [] applicants = FOIRequestApplicant.getapplicantbyemail(email) - print('applicants: ', applicants) if applicants is not None: for applicant in applicants: applicantqueue.append(self.__prepareapplicant(applicant)) @@ -29,7 +28,6 @@ def getapplicantbyemail(self, email): def searchapplicant(self, keywords): applicantqueue = [] applicants = FOIRequestApplicant.searchapplicant(keywords) - print('applicants: ', applicants) if applicants is not None: for applicant in applicants: applicantqueue.append(self.__prepareapplicant(applicant)) @@ -110,7 +108,6 @@ def getapplicanthistory(self, applicantid): # order by update date desc applicants = FOIRequestApplicant.getapplicanthistory(applicantid) - print('applicants: ', applicants) if applicants is not None: newer = self.__prepareapplicantforcomparing(applicants[0]) updatedat = applicants[0]['updatedat'] @@ -128,16 +125,10 @@ def __prepareapplicantforcomparing(self, applicant): 'alsoKnownAs': applicant["alsoknownas"], 'birthDate': applicant["dob"], 'personalHealthNumber': applicant["phn"], - # 'foiRequestApplicantID': applicant["foirequestapplicantid"], - # 'applicantProfileID': applicant["applicantprofileid"], - # 'updatedat': applicant['updatedat'], 'firstName': applicant["firstname"], 'middleName': applicant["middlename"], 'lastName': applicant["lastname"], 'businessName': applicant["businessname"], - # 'foirequestID': applicant["foirequestid"], - # 'foirequestVersion': applicant["foirequestversion"], - # 'requestType': applicant["requesttype"], 'email': applicant["email"], 'address': applicant["address"], 'city': applicant["city"], @@ -153,46 +144,11 @@ def __prepareapplicantforcomparing(self, applicant): 'correctionalServiceNumber': applicant["correctionnumber"], } - # def __prepareapplicanthistory(self, applicant, updatedat): - # return { - # updatedat: { - # 'additionalPersonalInfo': { - # 'alsoKnownAs': applicant["alsoknownas"], - # 'birthDate': applicant["dob"], - # 'personalHealthNumber': applicant["phn"], - # }, - # 'foiRequestApplicantID': applicant["foirequestapplicantid"], - # 'applicantProfileID': applicant["applicantprofileid"], - # 'updatedat': applicant['updatedat'], - # 'firstName': applicant["firstname"], - # 'middleName': applicant["middlename"], - # 'lastName': applicant["lastname"], - # 'businessName': applicant["businessname"], - # 'foirequestID': applicant["foirequestid"], - # 'foirequestVersion': applicant["foirequestversion"], - # 'requestType': applicant["requesttype"], - # 'email': applicant["email"], - # 'address': applicant["address"], - # 'city': applicant["city"], - # 'province': applicant["province"], - # 'postal': applicant["postal"], - # 'country': applicant["country"], - # 'phonePrimary': applicant["homephone"], - # 'workPhonePrimary': applicant["workphone"], - # 'workPhoneSecondary': applicant["workphone2"], - # 'phoneSecondary': applicant["mobilephone"], - # 'otherContactInfo': applicant["othercontactinfo"], - # 'publicServiceEmployeeNumber': applicant["employeenumber"], - # 'correctionalServiceNumber': applicant["correctionnumber"], - # } - # } - def getapplicantrequests(self, applicantid): requestqueue = [] # order by update date desc requests = FOIRequestApplicant.getapplicantrequests(applicantid) - print('requests: ', requests) if requests is not None: for request in requests: requestqueue.append(self.__preparerequest(request)) From e9cc806dcd7d62a96eb50fdb7e5c1ed80ae4a575 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 11 Jan 2024 15:36:32 -0800 Subject: [PATCH 021/147] integrating history and request endpoints for applicant profile --- .../FOI/foiApplicantProfileService.js | 60 ++++++++++++++++--- .../FOI/FOIRequest/ApplicantProfileModal.js | 45 +++++++++----- .../models/FOIRequestApplicants.py | 8 ++- .../request_api/services/applicantservice.py | 45 +++++++------- 4 files changed, 110 insertions(+), 48 deletions(-) diff --git a/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js b/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js index 6fbe6d932..f3ec2f7db 100644 --- a/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js +++ b/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js @@ -86,18 +86,62 @@ export const fetchApplicantInfo = async (firstname, ...rest) => { // }; }; -export const fetchApplicantContactHistory = (...rest) => { +export const fetchApplicantContactHistory = (applicantid, ...rest) => { + // const done = fnDone(rest); + // done(null, + // [{ + // field: "Email", + // value: "a@b.ca", + // date: "2023-12-11", + // username: "foiintake@idir", + // }] + // ); + const done = fnDone(rest); - done(null, - [{ - field: "Email", - value: "a@b.ca", - date: "2023-12-11", - username: "foiintake@idir", - }] + const apiUrl = replaceUrl( + API.FOI_GET_APPLICANT_HISTORY, + "", + applicantid ); + return (dispatch) => { + httpGETRequest(apiUrl, {}, UserService.getToken()) + .then((res) => { + if (res.data) { + done(null, res.data) + } else { + dispatch(serviceActionError(res)); + throw new Error(`Error in fetching potential applicants`) + } + }) + .catch((error) => { + catchError(error, dispatch); + }); + } } +export const fetchApplicantRequests = (applicantid, ...rest) => { + const done = fnDone(rest); + const apiUrl = replaceUrl( + API.FOI_GET_APPLICANT_REQUEST_HISTORY, + "", + applicantid + ); + return (dispatch) => { + httpGETRequest(apiUrl, {}, UserService.getToken()) + .then((res) => { + if (res.data) { + done(null, res.data) + } else { + dispatch(serviceActionError(res)); + throw new Error(`Error in fetching potential applicants`) + } + }) + .catch((error) => { + catchError(error, dispatch); + }); + } +}; + export const saveApplicantInfo = (applicant, ...rest) => { const done = fnDone(rest); const apiUrlgetRequestDetails = API.FOI_SAVE_REQUEST_APPLICANT_INFO; diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index cf3c4671b..12f56d682 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -16,7 +16,7 @@ import SearchIcon from "@material-ui/icons/Search"; import InputAdornment from "@mui/material/InputAdornment"; import InputBase from "@mui/material/InputBase"; import Grid from "@mui/material/Grid"; -import { fetchPotentialApplicants, fetchApplicantInfo, fetchApplicantContactHistory, saveApplicantInfo, fetchApplicantProfileByKeyword } from "../../../apiManager/services/FOI/foiApplicantProfileService"; +import { fetchPotentialApplicants, fetchApplicantInfo, fetchApplicantContactHistory, saveApplicantInfo, fetchApplicantProfileByKeyword, fetchApplicantRequests } from "../../../apiManager/services/FOI/foiApplicantProfileService"; import AddressContactDetails from "./AddressContanctInfo"; import ApplicantDetails from "./ApplicantDetails" import AdditionalApplicantDetails from "./AdditionalApplicantDetails"; @@ -104,24 +104,24 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const requestHistoryColumns = [ { - field: "requestId", + field: "filenumber", headerName: "REQUEST ID", flex: 1, }, { - field: "currentState", + field: "requeststatus", headerName: "CURRENT STATE", flex: 1, }, { - field: "receivedDate", + field: "receiveddate", headerName: "RECEIVED DATE", flex: 1, }, { - field: "requestDescription", + field: "description", headerName: "REQUEST DESRCIPTION", - flex: 3, + flex: 2, }, ]; @@ -296,9 +296,9 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } const showApplicantHistory = () => { - fetchApplicantContactHistory((err, res) => { + dispatch(fetchApplicantContactHistory(selectedApplicant.foiRequestApplicantID, (err, res) => { setApplicantHistory(res); - }) + })) } const back = () => { @@ -325,6 +325,17 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } } + const toggleRequestHistory = () => { + if (!selectedApplicant.requestHistory) { + dispatch(fetchApplicantRequests(selectedApplicant.foiRequestApplicantID, (err, res) => { + setSelectedApplicant({...selectedApplicant, requestHistory: res}); + setShowRequestHistory(true) + })) + } else { + setShowRequestHistory(true) + } + } + return (
@@ -364,13 +375,13 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { orientation="vertical" /> setShowRequestHistory(true)} + onClick={toggleRequestHistory} disableRipple className={clsx("request-history-header applicant-profile-header", { [classes.disabledTitle]: !showRequestHistory })} > - Request History ({selectedApplicant.foirequestID.length}) + Request History ({selectedApplicant?.foirequestID?.length}) : @@ -391,7 +402,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { : (showRequestHistory ? <> - + { loading={isLoading} onRowClick={selectApplicantRow} getRowHeight={() => 'auto'} - getRowId={(row) => row.requestId} + getRowId={(row) => row.filenumber} /> : @@ -414,13 +425,15 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { aria-controls="panel1a-content" > {`APPLICANT CONTACT DETAILS`} - {entry.username} - {entry.date} + {entry.createdby} - {entry.updatedat}
-
- {entry.field}: {entry.value} -
+ {Object.keys(entry.fields).map((field) => +
+ {field}: {entry.fields[field]} +
+ )}
) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 149c6931f..25371fb52 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -663,6 +663,7 @@ def getapplicanthistory(cls, applicantid): FOIRequest.foirequestid.label('foirequestid'), FOIRequest.version.label('foirequestversion'), FOIRequest.requesttype.label('requesttype'), + FOIRequest.createdby.label('createdby'), ApplicantCategory.name.label('applicantcategory'), contactemail.contactinformation.label('email'), contactaddress.contactinformation.label('address'), @@ -864,8 +865,9 @@ def getapplicantrequests(cls, applicantid): FOIRequestApplicant.applicantprofileid.label('applicantprofileid'), FOIRequestApplicant.foirequestapplicantid.label('foirequestapplicantid'), FOIMinistryRequest.axisrequestid, + FOIMinistryRequest.filenumber, FOIRequestStatus.name.label('requeststatus'), - func.to_char(FOIRequest.receiveddate, 'YYYY-MM-DD HH24:MI:SS').label('receiveddate'), + func.to_char(FOIRequest.receiveddate, 'MON DD YYYY').label('receiveddate'), FOIMinistryRequest.description ] @@ -921,11 +923,11 @@ class Meta: class ApplicantProfileSchema(ma.Schema): class Meta: - fields = ('applicantprofileid','updatedat','foirequestapplicantid','firstname','middlename','lastname', + fields = ('applicantprofileid','updatedat','createdby','foirequestapplicantid','firstname','middlename','lastname', 'alsoknownas','dob','businessname','foirequestid','foirequestversion','requesttype','applicantcategory', 'email','address','city','province','postal','country','homephone','workphone', 'workphone2','mobilephone','othercontactinfo','employeenumber','correctionnumber','phn') class ApplicantRequestSchema(ma.Schema): class Meta: - fields = ('applicantprofileid','foirequestapplicantid','axisrequestid','requeststatus','receiveddate','description') \ No newline at end of file + fields = ('applicantprofileid','foirequestapplicantid','axisrequestid','filenumber', 'requeststatus','receiveddate','description') \ No newline at end of file diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index ed171bdf8..efb54f377 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -114,43 +114,45 @@ def getapplicanthistory(self, applicantid): if applicants is not None: newer = self.__prepareapplicantforcomparing(applicants[0]) updatedat = applicants[0]['updatedat'] + createdby = applicants[0]['createdby'] for applicant in applicants: cur = self.__prepareapplicantforcomparing(applicant) if(cur != newer): - applicantqueue.append({ updatedat: dict(set(cur.items()) - set(newer.items())) }) + applicantqueue.append({ "updatedat": updatedat, "createdby": createdby, "fields": dict(set(cur.items()) - set(newer.items()))}) newer = cur updatedat = applicant['updatedat'] + createdby = applicant['createdby'] return applicantqueue def __prepareapplicantforcomparing(self, applicant): return { - 'alsoKnownAs': applicant["alsoknownas"], - 'birthDate': applicant["dob"], - 'personalHealthNumber': applicant["phn"], + 'Also Known As': applicant["alsoknownas"], + 'Birth Date': applicant["dob"], + 'Personal Health Number': applicant["phn"], # 'foiRequestApplicantID': applicant["foirequestapplicantid"], # 'applicantProfileID': applicant["applicantprofileid"], # 'updatedat': applicant['updatedat'], - 'firstName': applicant["firstname"], - 'middleName': applicant["middlename"], - 'lastName': applicant["lastname"], - 'businessName': applicant["businessname"], + 'First Name': applicant["firstname"], + 'Middle Name': applicant["middlename"], + 'Last Name': applicant["lastname"], + 'Organization': applicant["businessname"], # 'foirequestID': applicant["foirequestid"], # 'foirequestVersion': applicant["foirequestversion"], # 'requestType': applicant["requesttype"], - 'email': applicant["email"], - 'address': applicant["address"], - 'city': applicant["city"], - 'province': applicant["province"], - 'postal': applicant["postal"], - 'country': applicant["country"], - 'phonePrimary': applicant["homephone"], - 'workPhonePrimary': applicant["workphone"], - 'workPhoneSecondary': applicant["workphone2"], - 'phoneSecondary': applicant["mobilephone"], - 'otherContactInfo': applicant["othercontactinfo"], - 'publicServiceEmployeeNumber': applicant["employeenumber"], - 'correctionalServiceNumber': applicant["correctionnumber"], + 'Email': applicant["email"], + 'Address': applicant["address"], + 'City': applicant["city"], + 'Province': applicant["province"], + 'Postal Code': applicant["postal"], + 'Country': applicant["country"], + 'Home Phone': applicant["homephone"], + 'Work Phone': applicant["workphone"], + 'Alternative Phone': applicant["workphone2"], + 'Mobile Phone': applicant["mobilephone"], + 'Other Contact Info': applicant["othercontactinfo"], + 'Employee Number': applicant["employeenumber"], + 'Corrections Number': applicant["correctionnumber"], } # def __prepareapplicanthistory(self, applicant, updatedat): @@ -204,6 +206,7 @@ def __preparerequest(self, request): 'applicantprofileid': request["applicantprofileid"], 'foirequestapplicantid': request["foirequestapplicantid"], 'axisrequestid': request["axisrequestid"], + 'filenumber': request["filenumber"], 'requeststatus': request["requeststatus"], 'receiveddate': request["receiveddate"], 'description': request["description"], From 89c354f129319c76160c03e776d8bb32313b5258 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 12 Jan 2024 11:43:56 -0800 Subject: [PATCH 022/147] fetch applicant by id for open state onwards minor integration fixes --- .../src/apiManager/endpoints/index.js | 3 + .../FOI/foiApplicantProfileService.js | 57 ++-- .../FOI/FOIRequest/ApplicantProfileModal.js | 27 +- .../models/FOIRequestApplicants.py | 259 ++++++++++++++++++ .../request_api/resources/foiapplicant.py | 23 ++ .../request_api/services/applicantservice.py | 6 + 6 files changed, 328 insertions(+), 47 deletions(-) diff --git a/forms-flow-web/src/apiManager/endpoints/index.js b/forms-flow-web/src/apiManager/endpoints/index.js index d13c7fd7b..b30abb030 100644 --- a/forms-flow-web/src/apiManager/endpoints/index.js +++ b/forms-flow-web/src/apiManager/endpoints/index.js @@ -42,6 +42,9 @@ const API = { FOI_GET_REQUEST_APPLICANTS: `${FOI_BASE_API_URL}/api/foiapplicants/`, FOI_SAVE_REQUEST_APPLICANT_INFO: `${FOI_BASE_API_URL}/api/foiapplicants/save`, FOI_REQUEST_APPLICANTS_SEARCH_KEYWORDS: `${FOI_BASE_API_URL}/api/foiapplicants/search`, + FOI_GET_APPLICANT_HISTORY: `${FOI_BASE_API_URL}/api/foiapplicants/history/`, + FOI_GET_APPLICANT_REQUEST_HISTORY: `${FOI_BASE_API_URL}/api/foiapplicants/requests/`, + FOI_GET_APPLICANT_INFO: `${FOI_BASE_API_URL}/api/foiapplicants/applicantid/`, FOI_GET_PROGRAMAREADIVISIONS: `${FOI_BASE_API_URL}/api/foiadmin/divisions`, FOI_POST_PROGRAMAREADIVISION: `${FOI_BASE_API_URL}/api/foiadmin/division`, diff --git a/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js b/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js index f3ec2f7db..9801e1024 100644 --- a/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js +++ b/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js @@ -50,40 +50,35 @@ export const fetchPotentialApplicants = (firstname, lastname, email, phone, ...r }; }; -export const fetchApplicantInfo = async (firstname, ...rest) => { +export const fetchApplicantInfo = (applicantid, ...rest) => { const done = fnDone(rest); - done(null, - { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35, email: 'jon.snow@gmail.com', - additionalPersonalInfo: {birthDate: "2023-12-07"}, - requestHistory: [{requestId: "EDU-2023-234345", receivedDate: "2023-12-07", currentState: "Open", requestDescription: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but als"}] - } + // done(null, + // { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35, email: 'jon.snow@gmail.com', + // additionalPersonalInfo: {birthDate: "2023-12-07"}, + // requestHistory: [{requestId: "EDU-2023-234345", receivedDate: "2023-12-07", currentState: "Open", requestDescription: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but als"}] + // } + // ); + // return; + const apiUrl = replaceUrl( + API.FOI_GET_APPLICANT_INFO, + "", + applicantid ); - return; - // const apiUrlgetRequestDetails = replaceUrl(replaceUrl( - // API.FOI_MINISTRYVIEW_REQUEST_API, - // "", - // requestId - // ), "", ministryId); - // return (dispatch) => { - // httpGETRequest(apiUrlgetRequestDetails, {}, UserService.getToken()) - // .then((res) => { - // if (res.data) { - // const foiRequest = res.data; - // dispatch(clearMinistryViewRequestDetails({})); - // dispatch(setFOIMinistryViewRequestDetail(foiRequest)); - // dispatch(fetchFOIMinistryAssignedToList(foiRequest.selectedMinistries[0].code.toLowerCase())); - // dispatch(setFOILoader(false)); - // } else { - // dispatch(serviceActionError(res)); - // dispatch(setFOILoader(false)); - // throw new Error(`Error in fetching ministry request details for request# ${requestId} ministry# ${ministryId}`) - // } - // }) - // .catch((error) => { - // catchError(error, dispatch); - // }); - // }; + return (dispatch) => { + httpGETRequest(apiUrl, {}, UserService.getToken()) + .then((res) => { + if (res.data) { + done(null, res.data) + } else { + dispatch(serviceActionError(res)); + throw new Error(`Error in fetching applicant info for applicant id # ${applicantid}`) + } + }) + .catch((error) => { + catchError(error, dispatch); + }); + }; }; export const fetchApplicantContactHistory = (applicantid, ...rest) => { diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index 12f56d682..7f058ff5f 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -139,9 +139,9 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { setIsLoading(false); })) } else { - fetchApplicantInfo(requestDetails.firstName, (err, res) => { + dispatch(fetchApplicantInfo(requestDetails.foiRequestApplicantID, (err, res) => { setSelectedApplicant(res); - }) + })) } } }, [modalOpen]) @@ -173,7 +173,10 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } const selectApplicantRow = (e) => { - setSelectedApplicant(e.row); + dispatch(fetchApplicantRequests(e.row.foiRequestApplicantID, (err, res) => { + setSelectedApplicant({...e.row, requestHistory: res}); + setIsLoading(false); + })) } const handleClose = () => { @@ -304,8 +307,11 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const back = () => { if (applicantHistory) { setApplicantHistory(false); + } else if (requestDetails.currentState === StateEnum.intakeinprogress.name) { + handleClose(); } else { setSelectedApplicant(false); + setShowRequestHistory(false); } } @@ -325,17 +331,6 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } } - const toggleRequestHistory = () => { - if (!selectedApplicant.requestHistory) { - dispatch(fetchApplicantRequests(selectedApplicant.foiRequestApplicantID, (err, res) => { - setSelectedApplicant({...selectedApplicant, requestHistory: res}); - setShowRequestHistory(true) - })) - } else { - setShowRequestHistory(true) - } - } - return (
@@ -375,13 +370,13 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { orientation="vertical" /> setShowRequestHistory(true)} disableRipple className={clsx("request-history-header applicant-profile-header", { [classes.disabledTitle]: !showRequestHistory })} > - Request History ({selectedApplicant?.foirequestID?.length}) + Request History ({selectedApplicant?.requestHistory?.length}) : diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 25371fb52..3c30b0269 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -90,6 +90,265 @@ def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, midd else: return DefaultMethodResult(True,'No update',applicant.foirequestapplicantid) + # Search applicant by id + @classmethod + def getapplicantbyid(cls, applicantid): + from .FOIMinistryRequests import FOIMinistryRequest + + #for queue/dashboard + _session = db.session + + #aliase for getting contact info + contactemail = aliased(FOIRequestContactInformation) + contactaddress = aliased(FOIRequestContactInformation) + contactaddress2 = aliased(FOIRequestContactInformation) + contacthomephone = aliased(FOIRequestContactInformation) + contactworkphone = aliased(FOIRequestContactInformation) + contactworkphone2 = aliased(FOIRequestContactInformation) + contactmobilephone = aliased(FOIRequestContactInformation) + contactother = aliased(FOIRequestContactInformation) + + city = aliased(FOIRequestContactInformation) + province = aliased(FOIRequestContactInformation) + postal = aliased(FOIRequestContactInformation) + country = aliased(FOIRequestContactInformation) + + #aliase for getting personal attributes + personalemployeenumber = aliased(FOIRequestPersonalAttribute) + personalcorrectionnumber = aliased(FOIRequestPersonalAttribute) + personalhealthnumber = aliased(FOIRequestPersonalAttribute) + + #max foirequest version + subquery_foirequest_maxversion = _session.query(FOIRequest.foirequestid, func.max(FOIRequest.version).label('max_version')).group_by(FOIRequest.foirequestid).subquery() + joincondition = [ + subquery_foirequest_maxversion.c.foirequestid == FOIRequest.foirequestid, + subquery_foirequest_maxversion.c.max_version == FOIRequest.version, + ] + + #generate query + selectedcolumns = [ + FOIRequestApplicant.applicantprofileid.label('applicantprofileid'), + func.to_char(FOIRequestApplicantMapping.created_at, 'YYYY-MM-DD HH24:MI:SS').label('updatedat'), + FOIRequestApplicant.foirequestapplicantid.label('foirequestapplicantid'), + FOIRequestApplicant.firstname.label('firstname'), + FOIRequestApplicant.middlename.label('middlename'), + FOIRequestApplicant.lastname.label('lastname'), + FOIRequestApplicant.alsoknownas.label('alsoknownas'), + func.to_char(FOIRequestApplicant.dob, 'YYYY-MM-DD').label('dob'), + FOIRequestApplicant.businessname.label('businessname'), + FOIRequest.foirequestid.label('foirequestid'), + FOIRequest.version.label('foirequestversion'), + FOIRequest.requesttype.label('requesttype'), + ApplicantCategory.name.label('applicantcategory'), + contactemail.contactinformation.label('email'), + contactaddress.contactinformation.label('address'), + contactaddress2.contactinformation.label('address2'), + contacthomephone.contactinformation.label('homephone'), + contactworkphone.contactinformation.label('workphone'), + contactworkphone2.contactinformation.label('workphone2'), + contactmobilephone.contactinformation.label('mobilephone'), + contactother.contactinformation.label('othercontactinfo'), + city.contactinformation.label('city'), + province.contactinformation.label('province'), + postal.contactinformation.label('postal'), + country.contactinformation.label('country'), + personalemployeenumber.attributevalue.label('employeenumber'), + personalcorrectionnumber.attributevalue.label('correctionnumber'), + personalhealthnumber.attributevalue.label('phn') + ] + + subquery_all = _session.query( + *selectedcolumns + ).join( + FOIRequestApplicantMapping, + and_( + FOIRequestApplicantMapping.foirequest_id == FOIRequest.foirequestid, + FOIRequestApplicantMapping.foirequestversion_id == FOIRequest.version, + FOIRequestApplicantMapping.requestortypeid == 1), + ).join( + FOIRequestApplicant, + FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid + # and_( + # FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, + # FOIRequestApplicant.isactive != False + # ) + ).join( + ApplicantCategory, + ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid + ).join( + subquery_foirequest_maxversion, + and_(*joincondition) + ).join( + FOIMinistryRequest, + and_( + FOIMinistryRequest.foirequest_id == FOIRequest.foirequestid, + FOIMinistryRequest.isactive == True) + ).join( + contactemail, + and_( + contactemail.foirequest_id == FOIRequest.foirequestid, + contactemail.foirequestversion_id == FOIRequest.version, + contactemail.contacttypeid == 1), + ).join( + contactaddress, + and_( + contactaddress.foirequest_id == FOIRequest.foirequestid, + contactaddress.foirequestversion_id == FOIRequest.version, + contactaddress.contacttypeid == 2, + contactaddress.contactinformation is not None, + contactaddress.dataformat == 'address'), + isouter=True + ).join( + contactaddress2, + and_( + contactaddress2.foirequest_id == FOIRequest.foirequestid, + contactaddress2.foirequestversion_id == FOIRequest.version, + contactaddress2.contacttypeid == 2, + contactaddress2.contactinformation is not None, + contactaddress2.dataformat == 'addressSecondary'), + isouter=True + ).join( + contacthomephone, + and_( + contacthomephone.foirequest_id == FOIRequest.foirequestid, + contacthomephone.foirequestversion_id == FOIRequest.version, + contacthomephone.contacttypeid == 3, + contacthomephone.contactinformation is not None), + isouter=True + ).join( + contactworkphone, + and_( + contactworkphone.foirequest_id == FOIRequest.foirequestid, + contactworkphone.foirequestversion_id == FOIRequest.version, + contactworkphone.contacttypeid == 4, + contactworkphone.contactinformation is not None), + isouter=True + ).join( + contactworkphone2, + and_( + contactworkphone2.foirequest_id == FOIRequest.foirequestid, + contactworkphone2.foirequestversion_id == FOIRequest.version, + contactworkphone2.contacttypeid == 5, + contactworkphone2.contactinformation is not None), + isouter=True + ).join( + contactmobilephone, + and_( + contactmobilephone.foirequest_id == FOIRequest.foirequestid, + contactmobilephone.foirequestversion_id == FOIRequest.version, + contactmobilephone.contacttypeid == 6, + contactmobilephone.contactinformation is not None), + isouter=True + ).join( + contactother, + and_( + contactother.foirequest_id == FOIRequest.foirequestid, + contactother.foirequestversion_id == FOIRequest.version, + contactother.contacttypeid == 7, + contactother.contactinformation is not None), + isouter=True + ).join( + city, + and_( + city.foirequest_id == FOIRequest.foirequestid, + city.foirequestversion_id == FOIRequest.version, + city.contacttypeid == 2, + city.contactinformation is not None, + city.dataformat == 'city'), + isouter=True + ).join( + province, + and_( + province.foirequest_id == FOIRequest.foirequestid, + province.foirequestversion_id == FOIRequest.version, + province.contacttypeid == 2, + province.contactinformation is not None, + province.dataformat == 'province'), + isouter=True + ).join( + country, + and_( + country.foirequest_id == FOIRequest.foirequestid, + country.foirequestversion_id == FOIRequest.version, + country.contacttypeid == 2, + country.contactinformation is not None, + country.dataformat == 'country'), + isouter=True + ).join( + postal, + and_( + postal.foirequest_id == FOIRequest.foirequestid, + postal.foirequestversion_id == FOIRequest.version, + postal.contacttypeid == 2, + postal.contactinformation is not None, + postal.dataformat == 'postal'), + isouter=True + ).join( + personalemployeenumber, + and_( + personalemployeenumber.foirequest_id == FOIRequest.foirequestid, + personalemployeenumber.foirequestversion_id == FOIRequest.version, + personalemployeenumber.personalattributeid == 1, + personalemployeenumber.attributevalue is not None), + isouter=True + ).join( + personalcorrectionnumber, + and_( + personalcorrectionnumber.foirequest_id == FOIRequest.foirequestid, + personalcorrectionnumber.foirequestversion_id == FOIRequest.version, + personalcorrectionnumber.personalattributeid == 2, + personalcorrectionnumber.attributevalue is not None), + isouter=True + ).join( + personalhealthnumber, + and_( + personalhealthnumber.foirequest_id == FOIRequest.foirequestid, + personalhealthnumber.foirequestversion_id == FOIRequest.version, + personalhealthnumber.personalattributeid == 3, + personalhealthnumber.attributevalue is not None), + isouter=True + ).filter( + # FOIMinistryRequest.requeststatusid != 3, + FOIRequest.isactive == True, + FOIRequestApplicant.foirequestapplicantid == applicantid + ).order_by(FOIRequest.foirequestid.desc()).subquery() + + query_aggregate = _session.query( + func.array_agg(subquery_all.c.applicantprofileid).label('applicantprofileid'), + func.array_agg(subquery_all.c.updatedat).label('updatedat'), + subquery_all.c.foirequestapplicantid, + func.array_agg(subquery_all.c.firstname).label('firstname'), + func.array_agg(subquery_all.c.middlename).label('middlename'), + func.array_agg(subquery_all.c.lastname).label('lastname'), + func.array_agg(subquery_all.c.alsoknownas).label('alsoknownas'), + func.array_agg(subquery_all.c.dob).label('dob'), + func.array_agg(subquery_all.c.businessname).label('businessname'), + func.array_agg(subquery_all.c.foirequestid).label('foirequestid'), + func.array_agg(subquery_all.c.foirequestversion).label('foirequestversion'), + func.array_agg(subquery_all.c.requesttype).label('requesttype'), + func.array_agg(subquery_all.c.applicantcategory).label('applicantcategory'), + func.array_agg(subquery_all.c.email).label('email'), + func.array_agg(subquery_all.c.address).label('address'), + func.array_agg(subquery_all.c.city).label('city'), + func.array_agg(subquery_all.c.province).label('province'), + func.array_agg(subquery_all.c.postal).label('postal'), + func.array_agg(subquery_all.c.country).label('country'), + func.array_agg(subquery_all.c.homephone).label('homephone'), + func.array_agg(subquery_all.c.workphone).label('workphone'), + func.array_agg(subquery_all.c.workphone2).label('workphone2'), + func.array_agg(subquery_all.c.mobilephone).label('mobilephone'), + func.array_agg(subquery_all.c.othercontactinfo).label('othercontactinfo'), + func.array_agg(subquery_all.c.employeenumber).label('employeenumber'), + func.array_agg(subquery_all.c.correctionnumber).label('correctionnumber'), + func.array_agg(subquery_all.c.phn).label('phn') + ).group_by(subquery_all.c.foirequestapplicantid) + + + print("query_by_id", query_aggregate) + + applicantprofile_schema = ApplicantProfileSchema() + return applicantprofile_schema.dump(query_aggregate.first()) + # Search applicant by email @classmethod def getapplicantbyemail(cls, email): diff --git a/request-management-api/request_api/resources/foiapplicant.py b/request-management-api/request_api/resources/foiapplicant.py index d7b62084a..a8ce90e33 100644 --- a/request-management-api/request_api/resources/foiapplicant.py +++ b/request-management-api/request_api/resources/foiapplicant.py @@ -157,5 +157,28 @@ def get(applicantid=None): return json.dumps(result), 200 else: return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 + except BusinessException as exception: + return {'status': exception.status_code, 'message':exception.message}, 500 + +@cors_preflight('GET,OPTIONS') +@API.route('/foiapplicants/applicantid/') +class FOIApplicants(Resource): + """Resource for retriving applicant by id""" + + @staticmethod + @TRACER.trace() + @cross_origin(origins=allowedorigins()) + @auth.require + @auth.isiao + @cors_preflight('GET,OPTIONS') + def get(applicantid=None): + if applicantid is None or applicantid == 0: + return {'status': False, 'message':EXCEPTION_MESSAGE_BAD_REQUEST}, 400 + try: + result = applicantservice().getapplicantbyid(applicantid) + if result is not None: + return json.dumps(result), 200 + else: + return {'status': False, 'message':EXCEPTION_MESSAGE_NOT_FOUND}, 404 except BusinessException as exception: return {'status': exception.status_code, 'message':exception.message}, 500 \ No newline at end of file diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index efb54f377..54f69c0ba 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -25,6 +25,12 @@ def getapplicantbyemail(self, email): applicantqueue.append(self.__prepareapplicant(applicant)) return applicantqueue + + def getapplicantbyid(self, applicantid): + applicant = FOIRequestApplicant.getapplicantbyid(applicantid) + applicant = self.__prepareapplicant(applicant) + applicant['requestHistory'] = self.getapplicantrequests(applicantid) + return applicant def searchapplicant(self, keywords): applicantqueue = [] From 1b756733b53c3326adcd1ff14f3eb030dcb8d613 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Mon, 15 Jan 2024 14:52:49 -0800 Subject: [PATCH 023/147] 1. add category id to applicant table 2. bug fix: compare the null and empty value before save applicant --- .../ba218164248e_add_category_to_applicant.py | 28 +++++++++++ .../models/FOIRequestApplicants.py | 50 +++++++++++-------- .../request_api/services/applicantservice.py | 1 + 3 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py diff --git a/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py b/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py new file mode 100644 index 000000000..007bec8a4 --- /dev/null +++ b/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py @@ -0,0 +1,28 @@ +"""add category to applicant + +Revision ID: ba218164248e +Revises: 59a97f42b5f2 +Create Date: 2024-01-15 13:09:57.278888 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ba218164248e' +down_revision = '59a97f42b5f2' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('FOIRequestApplicants', sa.Column('applicantcategoryid', sa.Integer(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('FOIRequestApplicants', 'applicantcategoryid') + # ### end Alembic commands ### \ No newline at end of file diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 3c30b0269..1ac675099 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -18,7 +18,7 @@ class FOIRequestApplicant(db.Model): __tablename__ = 'FOIRequestApplicants' # Defining the columns foirequestapplicantid = db.Column(db.Integer, primary_key=True,autoincrement=True) - + firstname = db.Column(db.String(50), unique=False, nullable=True) middlename = db.Column(db.String(50), unique=False, nullable=True) lastname = db.Column(db.String(50), unique=False, nullable=True) @@ -26,7 +26,8 @@ class FOIRequestApplicant(db.Model): alsoknownas = db.Column(db.String(50), unique=False, nullable=True) dob = db.Column(db.DateTime, unique=False, nullable=True) businessname = db.Column(db.String(255), unique=False, nullable=True) - + applicantcategoryid = db.Column(db.Integer, unique=False, nullable=True) + created_at = db.Column(db.DateTime, default=datetime.now) updated_at = db.Column(db.DateTime, nullable=True) createdby = db.Column(db.String(120), unique=False, nullable=True) @@ -51,7 +52,7 @@ def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknow return DefaultMethodResult(True,'Applicant added',applicant.foirequestapplicantid) @classmethod - def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, middlename, businessname, alsoknownas, dob, userid): + def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, userid): applicant_query = db.session.query( FOIRequestApplicant ).filter_by( @@ -64,28 +65,21 @@ def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, midd # applicant.isactive = False applicant_query.update({FOIRequestApplicant.applicantprofileid:str(uuid.uuid4())}) - if( - applicant.firstname != firstname - or applicant.lastname != lastname - or applicant.middlename != middlename - or applicant.businessname != businessname - or applicant.alsoknownas != alsoknownas - or applicant.dob != dob - ): + applicantfromform = FOIRequestApplicant().prepareapplicantforcomparing(firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid) + applicantfromdb = FOIRequestApplicant().prepareapplicantforcomparing(applicant.firstname, applicant.lastname, applicant.middlename, applicant.businessname, applicant.alsoknownas, applicant.dob, applicant.applicantcategoryid) + if applicantfromform != applicantfromdb: _applicant = FOIRequestApplicant() _applicant.createdby = userid - _applicant.firstname = firstname - _applicant.lastname = lastname - _applicant.middlename = middlename - _applicant.businessname = businessname - _applicant.alsoknownas = alsoknownas + _applicant.firstname = applicantfromform.firstname + _applicant.lastname = applicantfromform.lastname + _applicant.middlename = applicantfromform.middlename + _applicant.businessname = applicantfromform.businessname + _applicant.alsoknownas = applicantfromform.alsoknownas + _applicant.dob = applicantfromform.dob _applicant.applicantprofileid = applicant.applicantprofileid - if dob is not None and dob != "": - _applicant.dob = dob - else: - _applicant.dob = None + _applicant.applicantcategoryid = applicantfromform.applicantcategoryid db.session.add(_applicant) - db.session.commit() + db.session.commit() return DefaultMethodResult(True,'Applicant profile updated',_applicant.foirequestapplicantid) else: return DefaultMethodResult(True,'No update',applicant.foirequestapplicantid) @@ -107,7 +101,7 @@ def getapplicantbyid(cls, applicantid): contactworkphone2 = aliased(FOIRequestContactInformation) contactmobilephone = aliased(FOIRequestContactInformation) contactother = aliased(FOIRequestContactInformation) - + city = aliased(FOIRequestContactInformation) province = aliased(FOIRequestContactInformation) postal = aliased(FOIRequestContactInformation) @@ -1175,6 +1169,18 @@ def getapplicantrequests(cls, applicantid): applicantrequest_schema = ApplicantRequestSchema(many=True) return applicantrequest_schema.dump(query_all.all()) + @classmethod + def prepareapplicantforcomparing(cls, firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid): + return { + 'firstname': firstname if firstname is not None or firstname != '' else None, + 'lastname': lastname if lastname is not None or lastname != '' else None, + 'middlename': middlename if middlename is not None or middlename != '' else None, + 'businessname': businessname if businessname is not None or businessname != '' else None, + 'alsoknownas': alsoknownas if alsoknownas is not None or alsoknownas != '' else None, + 'dob': dob if dob is not None or dob != '' else None, + 'applicantcategoryid': applicantcategoryid if applicantcategoryid is not None or alsoknownas != 0 else None, + } + class FOIRequestApplicantSchema(ma.Schema): class Meta: diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index 84255796c..867509294 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -49,6 +49,7 @@ def saveapplicantinfo(self, applicantschema, userid): applicantschema['businessName'], applicantschema.get('additionalPersonalInfo', None).get('alsoKnownAs', None), applicantschema.get('additionalPersonalInfo', None).get('birthDate', None), + applicantschema['applicantCategoryID'], userid ) # replace with applicant id once new save function is written requests = FOIMinistryRequest.getopenrequestsbyrequestId(applicantschema['foirequestID']) From 0c52cc0e03f833bc826f0eb2c69dddb19ac1a9a6 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 Jan 2024 12:04:07 -0800 Subject: [PATCH 024/147] minor ux improvements for loading and saving applicant info in modal after moving to open state --- .../FOI/foiApplicantProfileService.js | 4 ++- .../FOI/FOIRequest/ApplicantProfileModal.js | 24 ++++++++++-------- .../components/FOI/FOIRequest/FOIRequest.js | 25 +++++++++++-------- .../request_api/services/applicantservice.py | 1 + 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js b/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js index 9801e1024..5ca7c4647 100644 --- a/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js +++ b/forms-flow-web/src/apiManager/services/FOI/foiApplicantProfileService.js @@ -5,7 +5,8 @@ import { import API from "../../endpoints"; import { serviceActionError, - setRestrictedReqTaglist + setRestrictedReqTaglist, + setFOILoader } from "../../../actions/FOI/foiRequestActions"; import { catchError, fnDone} from './foiServicesUtil'; import UserService from "../../../services/UserService"; @@ -145,6 +146,7 @@ export const saveApplicantInfo = (applicant, ...rest) => { .then((res) => { if (res.data) { dispatch(setRestrictedReqTaglist(res.data)); + dispatch(setFOILoader(false)); done(null, res.data); } else { dispatch(serviceActionError(res)); diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index 7f058ff5f..313fa018a 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -33,8 +33,9 @@ import AccordionDetails from '@material-ui/core/AccordionDetails'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; import { StateEnum } from "../../../constants/FOI/statusEnum"; -import { setFOIRequestApplicantProfile } from "../../../actions/FOI/foiRequestActions"; +import { setFOIRequestApplicantProfile, setFOILoader } from "../../../actions/FOI/foiRequestActions"; import { toast } from "react-toastify"; +import Loading from "../../../containers/Loading"; const useStyles = makeStyles((theme) => ({ root: { @@ -138,9 +139,11 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { setRows(res); setIsLoading(false); })) - } else { + } else { + setSelectedApplicant(true); dispatch(fetchApplicantInfo(requestDetails.foiRequestApplicantID, (err, res) => { setSelectedApplicant(res); + setIsLoading(false); })) } } @@ -149,9 +152,9 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { useEffect(() => { setSaveApplicantObject({...selectedApplicant}) for (let field in selectedApplicant) { - if (field === 'additionalPersonalInfo' && requestDetails[field] && requestDetails.requestType === 'personal') { - if ((requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.DOB] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB]) || - (requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER])) { + if (field === 'additionalPersonalInfo') { + if (requestDetails[field] && requestDetails.requestType === 'personal' && ((requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.DOB] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB]) || + (requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER]))) { setIsProfileDifferent(true); break; } @@ -265,15 +268,14 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } const selectProfile = () => { - if (_.isEqual(selectedApplicant, saveApplicantObject) || confirmationMessage) { - if (requestDetails.currentState === StateEnum.intakeinprogress.name) { - dispatch(setFOIRequestApplicantProfile(saveApplicantObject)); - } + if (_.isEqual(selectedApplicant, saveApplicantObject) || confirmationMessage) { + handleClose(); // set loading screen + dispatch(setFOILoader(true)); dispatch(saveApplicantInfo(saveApplicantObject, (err, res) => { if (!err) { // unset loading screen - handleClose(); + dispatch(setFOIRequestApplicantProfile(saveApplicantObject)); } })); } else { @@ -435,7 +437,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { })} : - <> + isLoading ? : <> {isProfileDifferent && Some of the fields in this profile do not match your original request. diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index c6ad8617d..767c70189 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -339,19 +339,24 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { }, [requestDetails]); useEffect(() => { - if (requestApplicantProfile) { - let newRequestDetails = { ...saveRequestObject }; - for (let field in requestApplicantProfile) { - if (field === "additionalPersonalInfo") { - for (let infofield in requestApplicantProfile[field]) { - newRequestDetails[field][infofield] = - requestApplicantProfile[field][infofield]; + if (requestApplicantProfile) { + if (requestDetails.currentState === StateEnum.intakeinprogress.name) { + let newRequestDetails = { ...saveRequestObject }; + for (let field in requestApplicantProfile) { + if (field === "additionalPersonalInfo") { + newRequestDetails["additionalPersonalInfo"] = newRequestDetails["additionalPersonalInfo"] || {} + for (let infofield in requestApplicantProfile[field]) { + newRequestDetails[field][infofield] = + requestApplicantProfile[field][infofield]; + } + } else { + newRequestDetails[field] = requestApplicantProfile[field]; } - } else { - newRequestDetails[field] = requestApplicantProfile[field]; } + dispatch(setFOIRequestDetail(newRequestDetails)) + } else { + handleSaveRequest(requestDetails.currentState, false, ""); } - dispatch(setFOIRequestDetail(newRequestDetails)) } }, [requestApplicantProfile]); diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index 54f69c0ba..d72ccd7c9 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -30,6 +30,7 @@ def getapplicantbyid(self, applicantid): applicant = FOIRequestApplicant.getapplicantbyid(applicantid) applicant = self.__prepareapplicant(applicant) applicant['requestHistory'] = self.getapplicantrequests(applicantid) + applicant.pop('requestType') return applicant def searchapplicant(self, keywords): From 91b62986c623361c61dcda2275cf55fd7961dd7c Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 16 Jan 2024 16:22:04 -0800 Subject: [PATCH 025/147] 1. update search to search all history 2. bug fix: compare dob 3. return applicant category --- .../models/FOIRequestApplicants.py | 60 +++++++++++++++---- .../request_api/services/applicantservice.py | 3 +- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 1ac675099..109d4fadf 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -371,6 +371,9 @@ def getapplicantbyemail(cls, email): personalcorrectionnumber = aliased(FOIRequestPersonalAttribute) personalhealthnumber = aliased(FOIRequestPersonalAttribute) + #aliase for search + searchcontactemail = aliased(FOIRequestContactInformation) + #max foirequest version subquery_foirequest_maxversion = _session.query(FOIRequest.foirequestid, func.max(FOIRequest.version).label('max_version')).group_by(FOIRequest.foirequestid).subquery() joincondition = [ @@ -412,6 +415,8 @@ def getapplicantbyemail(cls, email): subquery_all = _session.query( *selectedcolumns + ).distinct( + FOIRequest.foirequestid ).join( FOIRequestApplicantMapping, and_( @@ -560,12 +565,18 @@ def getapplicantbyemail(cls, email): personalhealthnumber.personalattributeid == 3, personalhealthnumber.attributevalue is not None), isouter=True + ).join( + searchcontactemail, + and_( + searchcontactemail.foirequest_id == FOIRequest.foirequestid, + searchcontactemail.contacttypeid == 1, + searchcontactemail.contactinformation == email), ).filter( # FOIMinistryRequest.requeststatusid != 3, - FOIRequest.isactive == True, - contactemail.contactinformation == email + FOIRequest.isactive == True + # searchcontactemail.contactinformation == email ).order_by(FOIRequest.foirequestid.desc()).subquery() - + query_aggregate = _session.query( func.array_agg(subquery_all.c.applicantprofileid).label('applicantprofileid'), func.array_agg(subquery_all.c.updatedat).label('updatedat'), @@ -627,6 +638,11 @@ def searchapplicant(cls, keywords): personalcorrectionnumber = aliased(FOIRequestPersonalAttribute) personalhealthnumber = aliased(FOIRequestPersonalAttribute) + #aliase for search + searchapplicant = aliased(FOIRequestApplicant) + searchapplicantmapping = aliased(FOIRequestApplicantMapping) + searchcontactinfo = aliased(FOIRequestContactInformation) + #max foirequest version subquery_foirequest_maxversion = _session.query(FOIRequest.foirequestid, func.max(FOIRequest.version).label('max_version')).group_by(FOIRequest.foirequestid).subquery() joincondition = [ @@ -667,6 +683,8 @@ def searchapplicant(cls, keywords): subquery_all = _session.query( *selectedcolumns + ).distinct( + FOIRequest.foirequestid ).join( FOIRequestApplicantMapping, and_( @@ -806,10 +824,26 @@ def searchapplicant(cls, keywords): personalhealthnumber.personalattributeid == 3, personalhealthnumber.attributevalue is not None), isouter=True + ).join( + searchapplicantmapping, + and_( + searchapplicantmapping.foirequest_id == FOIRequest.foirequestid, + searchapplicantmapping.requestortypeid == 1), + isouter=True + ).join( + searchapplicant, + searchapplicant.foirequestapplicantid == searchapplicantmapping.foirequestapplicantid, + isouter=True + ).join( + searchcontactinfo, + and_( + searchcontactinfo.foirequest_id == FOIRequest.foirequestid, + contacthomephone.contactinformation is not None), + isouter=True ).filter( # FOIMinistryRequest.requeststatusid != 3, FOIRequest.isactive == True, - or_(*FOIRequestApplicant.getsearchfilters(keywords, contactemail, contacthomephone, contactworkphone, contactworkphone2, contactmobilephone)) + or_(*FOIRequestApplicant.getsearchfilters(searchapplicant, searchcontactinfo, keywords, contactemail, contacthomephone, contactworkphone, contactworkphone2, contactmobilephone)) ).order_by(FOIRequest.foirequestid.desc()).subquery() query_aggregate = _session.query( @@ -847,29 +881,29 @@ def searchapplicant(cls, keywords): @classmethod - def getsearchfilters(cls, keywords, contactemail, contacthomephone, contactworkphone, contactworkphone2, contactmobilephone): + def getsearchfilters(cls, searchapplicant, searchcontactinfo, keywords, contactemail, contacthomephone, contactworkphone, contactworkphone2, contactmobilephone): searchfilters = [] if(len(keywords) > 0): if('firstname' in keywords): - searchfilters.append(FOIRequestApplicant.firstname.ilike('%'+keywords['firstname']+'%')) + searchfilters.append(searchapplicant.firstname.ilike('%'+keywords['firstname']+'%')) if('lastname' in keywords): - searchfilters.append(FOIRequestApplicant.lastname.ilike('%'+keywords['lastname']+'%')) + searchfilters.append(searchapplicant.lastname.ilike('%'+keywords['lastname']+'%')) if('email' in keywords): - searchfilters.append(contactemail.contactinformation.ilike('%'+keywords['email']+'%')) + searchfilters.append(searchcontactinfo.contactinformation.ilike('%'+keywords['email']+'%')) if('homephone' in keywords): - searchfilters.append(contacthomephone.contactinformation.ilike('%'+keywords['homephone']+'%')) + searchfilters.append(searchcontactinfo.contactinformation.ilike('%'+keywords['homephone']+'%')) if('workphone' in keywords): - searchfilters.append(contactworkphone.contactinformation.ilike('%'+keywords['workphone']+'%')) + searchfilters.append(searchcontactinfo.contactinformation.ilike('%'+keywords['workphone']+'%')) if('workphone2' in keywords): - searchfilters.append(contactworkphone2.contactinformation.ilike('%'+keywords['workphone2']+'%')) + searchfilters.append(searchcontactinfo.contactinformation.ilike('%'+keywords['workphone2']+'%')) if('mobilephone' in keywords): - searchfilters.append(contactmobilephone.contactinformation.ilike('%'+keywords['mobilephone']+'%')) + searchfilters.append(searchcontactinfo.contactinformation.ilike('%'+keywords['mobilephone']+'%')) return searchfilters @@ -1177,7 +1211,7 @@ def prepareapplicantforcomparing(cls, firstname, lastname, middlename, businessn 'middlename': middlename if middlename is not None or middlename != '' else None, 'businessname': businessname if businessname is not None or businessname != '' else None, 'alsoknownas': alsoknownas if alsoknownas is not None or alsoknownas != '' else None, - 'dob': dob if dob is not None or dob != '' else None, + 'dob': datetime.strptime(dob, "%Y-%m-%d") if dob is not None or dob != '' else None, 'applicantcategoryid': applicantcategoryid if applicantcategoryid is not None or alsoknownas != 0 else None, } diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index 867509294..a85c72087 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -94,7 +94,7 @@ def __prepareapplicant(self, applicant): 'foirequestID': applicant["foirequestid"], 'foirequestVersion': applicant["foirequestversion"], 'requestType': applicant["requesttype"], - # 'category': applicant["applicantcategory"], + 'category': applicant["applicantcategory"], 'email': self.__first_not_null(applicant["email"]), 'address': self.__first_not_null(applicant["address"]), 'city': self.__first_not_null(applicant["city"]), @@ -151,6 +151,7 @@ def __prepareapplicantforcomparing(self, applicant): 'Other Contact Info': applicant["othercontactinfo"], 'Employee Number': applicant["employeenumber"], 'Corrections Number': applicant["correctionnumber"], + 'Applicant Category': applicant["applicantcategory"], } def getapplicantrequests(self, applicantid): From 91b8d3dca9df9880cb4b31bc4bc099c2eba49e04 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 17 Jan 2024 15:46:10 -0800 Subject: [PATCH 026/147] fix different dob data type causing update bug add aka field to profile modal --- .../FOI/FOIRequest/ApplicantDetails.js | 22 +++++++++++++++++++ .../FOI/FOIRequest/ApplicantProfileModal.js | 19 ++++++++++------ .../constants/FOI/foiComponentConstants.js | 1 + .../models/FOIRequestApplicants.py | 2 +- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantDetails.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantDetails.js index 728018def..9c01c5efb 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantDetails.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantDetails.js @@ -106,6 +106,9 @@ const ApplicantDetails = React.memo( defaultValue: "Select Category", }) ); + const [alsoKnownAsText, setAlsoKnownAs] = React.useState( + validateFields(requestDetails?.additionalPersonalInfo, FOI_COMPONENT_CONSTANTS.ALSO_KNOWN_AS) + ); //handle initial value for required field validation React.useEffect(() => { @@ -213,6 +216,14 @@ const ApplicantDetails = React.memo( ); }; + const handleAlsoKnownAsChange = (e) => { + setAlsoKnownAs(e.target.value); + createSaveRequestObject( + FOI_COMPONENT_CONSTANTS.ALSO_KNOWN_AS, + e.target.value + ); + }; + //generate the menu items for the category const menuItems = category.map((item) => { return ( @@ -307,6 +318,17 @@ const ApplicantDetails = React.memo( > {menuItems} + {showHistory && }
diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index 313fa018a..c101b074c 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -153,10 +153,13 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { setSaveApplicantObject({...selectedApplicant}) for (let field in selectedApplicant) { if (field === 'additionalPersonalInfo') { - if (requestDetails[field] && requestDetails.requestType === 'personal' && ((requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.DOB] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.DOB]) || - (requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] && selectedApplicant[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER] !== requestDetails[field][FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER]))) { - setIsProfileDifferent(true); - break; + if (requestDetails[field] && requestDetails.requestType === 'personal') { + for (let additionalField in requestDetails[field]) { + if (requestDetails[field][additionalField] && selectedApplicant[field][additionalField] !== requestDetails[field][additionalField]) { + setIsProfileDifferent(true); + break; + } + } } } else if (requestDetails[field] && selectedApplicant[field] !== requestDetails[field]) { setIsProfileDifferent(true); @@ -167,8 +170,10 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const createSaveApplicantObject = (name, value, value2) => { let newApplicantObj = {...saveApplicantObject} - if ([FOI_COMPONENT_CONSTANTS.DOB, FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER].includes(name)) { - newApplicantObj.additionalPersonalInfo[name] = value; + if ([FOI_COMPONENT_CONSTANTS.DOB, FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER, FOI_COMPONENT_CONSTANTS.ALSO_KNOWN_AS].includes(name)) { + let additionalPersonalInfo = {...newApplicantObj.additionalPersonalInfo} + additionalPersonalInfo[name] = value + newApplicantObj.additionalPersonalInfo = additionalPersonalInfo; } else { newApplicantObj[name] = value; } @@ -591,7 +596,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { <>{!applicantHistory && } diff --git a/forms-flow-web/src/constants/FOI/foiComponentConstants.js b/forms-flow-web/src/constants/FOI/foiComponentConstants.js index b8fbb45c8..2d0cd5918 100644 --- a/forms-flow-web/src/constants/FOI/foiComponentConstants.js +++ b/forms-flow-web/src/constants/FOI/foiComponentConstants.js @@ -49,6 +49,7 @@ const FOI_COMPONENT_CONSTANTS = { PERSONAL_HEALTH_NUMBER: "personalHealthNumber", CORRECTIONS_NUMBER: "correctionalServiceNumber", DOB: "birthDate", + ALSO_KNOWN_AS: "alsoKnownAs", EMPLOYEE_NUMBER: "publicServiceEmployeeNumber", IDENTITY_VERIFIED: "identityVerified", diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 3c30b0269..6171d9127 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -70,7 +70,7 @@ def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, midd or applicant.middlename != middlename or applicant.businessname != businessname or applicant.alsoknownas != alsoknownas - or applicant.dob != dob + or applicant.dob != datetime.strptime(dob, "%Y-%m-%d") ): _applicant = FOIRequestApplicant() _applicant.createdby = userid From 63889c43c921e333b5db79567a95a4c351f937c8 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Thu, 18 Jan 2024 11:45:36 -0800 Subject: [PATCH 027/147] save categoryid to applicant table --- .../request_api/models/FOIRequestApplicants.py | 5 +++-- .../services/foirequest/requestservicebuilder.py | 4 ++-- .../services/foirequest/requestservicecreate.py | 9 ++++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 109d4fadf..12e388acc 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -35,7 +35,7 @@ class FOIRequestApplicant(db.Model): applicantprofileid = db.Column(db.String(120), unique=False, nullable=True) @classmethod - def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknownas, dob, userid): + def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, userid): applicant = FOIRequestApplicant() applicant.createdby = userid applicant.firstname = firstname @@ -43,8 +43,9 @@ def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknow applicant.middlename = middlename applicant.businessname = businessname applicant.alsoknownas = alsoknownas + applicant.applicantcategoryid = applicantcategoryid if dob is not None and dob != "": - applicant.dob = dob + applicant.dob = datetime.strptime(dob, "%Y-%m-%d") else: applicant.dob = None db.session.add(applicant) diff --git a/request-management-api/request_api/services/foirequest/requestservicebuilder.py b/request-management-api/request_api/services/foirequest/requestservicebuilder.py index 0f214e3ba..1a812b827 100644 --- a/request-management-api/request_api/services/foirequest/requestservicebuilder.py +++ b/request-management-api/request_api/services/foirequest/requestservicebuilder.py @@ -107,9 +107,9 @@ def createcontactinformation(self,dataformat, name, value, contacttypes, userid) contactinformation.contacttypeid =contacttype["contacttypeid"] return contactinformation - def createapplicant(self,firstname, lastname, appltcategory, userid, middlename = None,businessname = None, alsoknownas = None, dob = None): + def createapplicant(self,firstname, lastname, appltcategory, userid, middlename = None, businessname = None, alsoknownas = None, dob = None, applicantcategoryid = None): requestapplicant = FOIRequestApplicantMapping() - _applicant = FOIRequestApplicant().createapplicant(firstname, lastname, middlename, businessname, alsoknownas, dob, userid) + _applicant = FOIRequestApplicant().createapplicant(firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, userid) requestapplicant.foirequestapplicantid = _applicant.identifier if appltcategory is not None: requestertype = RequestorType().getrequestortype(appltcategory) diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index f1689010b..1a7cb8a2f 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -39,8 +39,8 @@ def saverequest(self,foirequestschema, userid, foirequestid=None, ministryid=Non openfoirequest.deliverymodeid = requestserviceconfigurator().getvalueof("deliveryMode",foirequestschema.get("deliveryMode")) if requestservicebuilder().isNotBlankorNone(foirequestschema,"receivedMode","main") == True: openfoirequest.receivedmodeid = requestserviceconfigurator().getvalueof("receivedMode",foirequestschema.get("receivedMode")) - if requestservicebuilder().isNotBlankorNone(foirequestschema,"category","main") == True: - openfoirequest.applicantcategoryid = requestserviceconfigurator().getvalueof("category",foirequestschema.get("category")) + # if requestservicebuilder().isNotBlankorNone(foirequestschema,"category","main") == True: + # openfoirequest.applicantcategoryid = requestserviceconfigurator().getvalueof("category",foirequestschema.get("category")) openfoirequest.personalAttributes = self._prearepersonalattributes(foirequestschema, userid) openfoirequest.requestApplicants = self.__prepareapplicants(foirequestschema, userid) if foirequestid is not None: @@ -127,10 +127,12 @@ def __prepareapplicants(self, foirequestschema, userid): requestapplicantarr = [] selfalsoknownas=None selfdob=None + selfcategoryid=None if foirequestschema.get("additionalPersonalInfo") is not None and foirequestschema.get('requeststatusid') == 1: applicantinfo = foirequestschema.get("additionalPersonalInfo") selfdob = applicantinfo["birthDate"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"birthDate","additionalPersonalInfo") else None selfalsoknownas = applicantinfo["alsoKnownAs"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"alsoKnownAs","additionalPersonalInfo") else None + selfcategoryid = requestserviceconfigurator().getvalueof("category",foirequestschema.get("category")) if requestservicebuilder().isNotBlankorNone(foirequestschema,"category","main") else None # if foirequestschema.get('foiRequestApplicantID') is None and foirequestschema.get('requeststatusid') == 1: if foirequestschema.get('foiRequestApplicantID') is not None: @@ -147,7 +149,8 @@ def __prepareapplicants(self, foirequestschema, userid): foirequestschema.get("middleName"), foirequestschema.get("businessName"), selfalsoknownas, - selfdob) + selfdob, + selfcategoryid) ) #Prepare additional applicants From d89e1be222fa89d6b9aa1f0a72e8f2b9941127de Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 19 Jan 2024 14:16:53 -0800 Subject: [PATCH 028/147] add additional logic to only show profile modal before open state disable state change in intake in progress until after profile has been chosen get latest profile applicant id before saving request to applicant association during transition to open state --- .../components/FOI/FOIAuthenticateRouting.jsx | 2 +- .../FOI/FOIRequest/AddressContanctInfo.js | 13 +++-- .../FOI/FOIRequest/ApplicantProfileModal.js | 47 ++++++++++++++----- .../components/FOI/FOIRequest/FOIRequest.js | 4 +- .../MinistryReview/MinistryReview.js | 2 +- .../FOI/customComponents/StateDropDown.js | 4 +- .../FOI/customComponents/statedropdown.scss | 4 ++ .../models/FOIRequestApplicants.py | 35 ++++++++------ .../request_api/schemas/foiapplicant.py | 1 + .../request_api/services/applicantservice.py | 13 ++--- .../foirequest/requestservicecreate.py | 4 +- 11 files changed, 87 insertions(+), 42 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIAuthenticateRouting.jsx b/forms-flow-web/src/components/FOI/FOIAuthenticateRouting.jsx index 8ad114ee7..5eefd6e29 100644 --- a/forms-flow-web/src/components/FOI/FOIAuthenticateRouting.jsx +++ b/forms-flow-web/src/components/FOI/FOIAuthenticateRouting.jsx @@ -63,7 +63,7 @@ const FOIAuthenticateRouting = React.memo((props) => { - + diff --git a/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js b/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js index 451b26fc6..60807d59a 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js @@ -305,9 +305,16 @@ const AddressContactDetails = memo(
- {moreInfoAction && } + {moreInfoAction && + + } {/* ({ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const classes = useStyles(); + const isAddRequest = window.location.href.indexOf(FOI_COMPONENT_CONSTANTS.ADDREQUEST) > -1; + let requestDetails = useSelector((state) => state.foiRequests.foiRequestDetail); const dispatch = useDispatch(); @@ -60,13 +62,14 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const [isLoading, setIsLoading] = useState(true); const [rows, setRows] = useState([]); const [selectedApplicant, setSelectedApplicant] = useState(false) - const [searchMode, setSearchMode] = useState("auto") + const [searchMode, setSearchMode] = useState(isAddRequest ? "manual" : "auto") const [saveApplicantObject, setSaveApplicantObject] = React.useState({}) const [showRequestHistory, setShowRequestHistory] = useState(false); const [confirmationMessage, setConfirmationMessage] = useState(false); const [createConfirmation, setCreateConfirmation] = useState(false); const [isProfileDifferent, setIsProfileDifferent] = useState(false); const [applicantHistory, setApplicantHistory] = useState(false); + const [requestHistory, setRequestHistory] = useState(false); const columns = [ { @@ -129,7 +132,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { useEffect(() => { if (modalOpen) { setIsLoading(true); - if (requestDetails.currentState === StateEnum.intakeinprogress.name) { + if (!requestDetails.stateTransition?.filter(s => s.status === StateEnum.open.name).length > 0) { dispatch(fetchPotentialApplicants( requestDetails.firstName, requestDetails.lastName, @@ -142,7 +145,9 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } else { setSelectedApplicant(true); dispatch(fetchApplicantInfo(requestDetails.foiRequestApplicantID, (err, res) => { - setSelectedApplicant(res); + const {requestHistory, ...selectedApplicant} = res + setSelectedApplicant(selectedApplicant); + setRequestHistory(requestHistory) setIsLoading(false); })) } @@ -152,9 +157,10 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { useEffect(() => { setSaveApplicantObject({...selectedApplicant}) for (let field in selectedApplicant) { + console.log(field) if (field === 'additionalPersonalInfo') { if (requestDetails[field] && requestDetails.requestType === 'personal') { - for (let additionalField in requestDetails[field]) { + for (let additionalField in selectedApplicant[field]) { if (requestDetails[field][additionalField] && selectedApplicant[field][additionalField] !== requestDetails[field][additionalField]) { setIsProfileDifferent(true); break; @@ -182,7 +188,8 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const selectApplicantRow = (e) => { dispatch(fetchApplicantRequests(e.row.foiRequestApplicantID, (err, res) => { - setSelectedApplicant({...e.row, requestHistory: res}); + setSelectedApplicant(e.row) + setRequestHistory(res); setIsLoading(false); })) } @@ -192,10 +199,14 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { setIsLoading(true); setRows([]); setSelectedApplicant(false); - setConfirmationMessage(false); + setSearchMode(isAddRequest ? "manual" : "auto") + setSaveApplicantObject({}) setShowRequestHistory(false); - setApplicantHistory(false); + setConfirmationMessage(false); setCreateConfirmation(false); + setIsProfileDifferent(false); + setApplicantHistory(false); + setRequestHistory(false); handleModalClose(); } @@ -273,7 +284,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } const selectProfile = () => { - if (_.isEqual(selectedApplicant, saveApplicantObject) || confirmationMessage) { + if (confirmationMessage) { handleClose(); // set loading screen dispatch(setFOILoader(true)); @@ -283,6 +294,9 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { dispatch(setFOIRequestApplicantProfile(saveApplicantObject)); } })); + } else if (_.isEqual(selectedApplicant, saveApplicantObject)) { + handleClose(); + dispatch(setFOIRequestApplicantProfile(saveApplicantObject)); } else { setConfirmationMessage(true); } @@ -314,11 +328,12 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const back = () => { if (applicantHistory) { setApplicantHistory(false); - } else if (requestDetails.currentState === StateEnum.intakeinprogress.name) { + } else if (requestDetails.stateTransition?.filter(s => s.status === StateEnum.open.name).length > 0) { handleClose(); } else { setSelectedApplicant(false); setShowRequestHistory(false); + setIsProfileDifferent(false); } } @@ -338,6 +353,14 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } } + const isSaveDisabled = () => { + if (!requestDetails.stateTransition?.filter(s => s.status === StateEnum.open.name).length > 0) { + return isProfileDifferent + } else { + return _.isEqual(selectedApplicant, saveApplicantObject) + } + } + return (
@@ -383,7 +406,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { [classes.disabledTitle]: !showRequestHistory })} > - Request History ({selectedApplicant?.requestHistory?.length}) + Request History ({requestHistory?.length}) : @@ -407,7 +430,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { { <>{!applicantHistory && } diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index 767c70189..f61135e2e 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -340,7 +340,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { useEffect(() => { if (requestApplicantProfile) { - if (requestDetails.currentState === StateEnum.intakeinprogress.name) { + if (!ministryId) { let newRequestDetails = { ...saveRequestObject }; for (let field in requestApplicantProfile) { if (field === "additionalPersonalInfo") { @@ -936,7 +936,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { isMinistryCoordinator={false} isValidationError={isValidationError} requestType={requestDetails?.requestType} - isDivisionalCoordinator={false} + disabled={requestDetails.currentState === StateEnum.intakeinprogress.name && !requestDetails.foiRequestApplicantID} />
diff --git a/forms-flow-web/src/components/FOI/FOIRequest/MinistryReview/MinistryReview.js b/forms-flow-web/src/components/FOI/FOIRequest/MinistryReview/MinistryReview.js index 6b779db48..db2df4ab3 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/MinistryReview/MinistryReview.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/MinistryReview/MinistryReview.js @@ -550,7 +550,7 @@ const MinistryReview = React.memo(({ userDetail }) => { isMinistryCoordinator={true} isValidationError={isValidationError} requestType={requestDetails?.requestType} - isDivisionalCoordinator={IsDivisionalCoordinator()} + disabled={IsDivisionalCoordinator()} /> ); diff --git a/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js b/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js index c2a637b52..bb6fcdbb0 100644 --- a/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js +++ b/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js @@ -21,7 +21,7 @@ const StateDropDown = ({ stateTransition, updateStateDropDown, requestType, - isDivisionalCoordinator, + disabled, }) => { const _isMinistryCoordinator = isMinistryCoordinator; @@ -247,7 +247,7 @@ const StateDropDown = ({ input={} variant="outlined" fullWidth - disabled={isDivisionalCoordinator} + disabled={disabled} > {menuItems} diff --git a/forms-flow-web/src/components/FOI/customComponents/statedropdown.scss b/forms-flow-web/src/components/FOI/customComponents/statedropdown.scss index f38a748e4..90c49b102 100644 --- a/forms-flow-web/src/components/FOI/customComponents/statedropdown.scss +++ b/forms-flow-web/src/components/FOI/customComponents/statedropdown.scss @@ -5,6 +5,10 @@ margin-bottom: 10px; } +#foi-status-dropdown.Mui-disabled { + cursor: not-allowed; +} + .foi-state-dropdown .MuiOutlinedInput-root { color: white !important; } diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 109d4fadf..aff0b3f5c 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -65,24 +65,31 @@ def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, midd # applicant.isactive = False applicant_query.update({FOIRequestApplicant.applicantprofileid:str(uuid.uuid4())}) - applicantfromform = FOIRequestApplicant().prepareapplicantforcomparing(firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid) + applicantfromform = FOIRequestApplicant().prepareapplicantforcomparing(firstname, lastname, middlename, businessname, alsoknownas, datetime.strptime(dob, "%Y-%m-%d"), applicantcategoryid) applicantfromdb = FOIRequestApplicant().prepareapplicantforcomparing(applicant.firstname, applicant.lastname, applicant.middlename, applicant.businessname, applicant.alsoknownas, applicant.dob, applicant.applicantcategoryid) if applicantfromform != applicantfromdb: _applicant = FOIRequestApplicant() _applicant.createdby = userid - _applicant.firstname = applicantfromform.firstname - _applicant.lastname = applicantfromform.lastname - _applicant.middlename = applicantfromform.middlename - _applicant.businessname = applicantfromform.businessname - _applicant.alsoknownas = applicantfromform.alsoknownas - _applicant.dob = applicantfromform.dob + _applicant.firstname = applicantfromform['firstname'] + _applicant.lastname = applicantfromform['lastname'] + _applicant.middlename = applicantfromform['middlename'] + _applicant.businessname = applicantfromform['businessname'] + _applicant.alsoknownas = applicantfromform['alsoknownas'] + _applicant.dob = applicantfromform['dob'] _applicant.applicantprofileid = applicant.applicantprofileid - _applicant.applicantcategoryid = applicantfromform.applicantcategoryid + _applicant.applicantcategoryid = applicantfromform['applicantcategoryid'] db.session.add(_applicant) db.session.commit() return DefaultMethodResult(True,'Applicant profile updated',_applicant.foirequestapplicantid) else: return DefaultMethodResult(True,'No update',applicant.foirequestapplicantid) + + @classmethod + def getlatestprofilebyapplicantid(cls, applicantid): + schema = FOIRequestApplicantSchema(many=False) + sq = db.session.query(FOIRequestApplicant.applicantprofileid).filter_by(foirequestapplicantid=applicantid) + query = db.session.query(FOIRequestApplicant).filter(FOIRequestApplicant.applicantprofileid.in_(sq)).order_by(FOIRequestApplicant.foirequestapplicantid.desc()).first() + return schema.dump(query) # Search applicant by id @classmethod @@ -168,7 +175,7 @@ def getapplicantbyid(cls, applicantid): # ) ).join( ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid + ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid ).join( subquery_foirequest_maxversion, and_(*joincondition) @@ -432,7 +439,7 @@ def getapplicantbyemail(cls, email): # ) ).join( ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid + ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid ).join( subquery_foirequest_maxversion, and_(*joincondition) @@ -700,7 +707,7 @@ def searchapplicant(cls, keywords): # ) ).join( ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid + ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid ).join( subquery_foirequest_maxversion, and_(*joincondition) @@ -1211,14 +1218,14 @@ def prepareapplicantforcomparing(cls, firstname, lastname, middlename, businessn 'middlename': middlename if middlename is not None or middlename != '' else None, 'businessname': businessname if businessname is not None or businessname != '' else None, 'alsoknownas': alsoknownas if alsoknownas is not None or alsoknownas != '' else None, - 'dob': datetime.strptime(dob, "%Y-%m-%d") if dob is not None or dob != '' else None, - 'applicantcategoryid': applicantcategoryid if applicantcategoryid is not None or alsoknownas != 0 else None, + 'dob': dob if dob is not None or dob != '' else None, + 'applicantcategoryid': applicantcategoryid if applicantcategoryid is not None or applicantcategoryid != 0 else None, } class FOIRequestApplicantSchema(ma.Schema): class Meta: - fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob','businessname') + fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob','businessname', 'applicantcategoryid', 'applicantprofileid') class ApplicantProfileSchema(ma.Schema): class Meta: diff --git a/request-management-api/request_api/schemas/foiapplicant.py b/request-management-api/request_api/schemas/foiapplicant.py index cd62b8140..0ab27f44f 100644 --- a/request-management-api/request_api/schemas/foiapplicant.py +++ b/request-management-api/request_api/schemas/foiapplicant.py @@ -13,6 +13,7 @@ class Meta: # pylint: disable=too-few-public-methods lastName = fields.Str(data_key="lastName", required=True,validate=[validate.Length(min=1, error=BLANK_EXCEPTION_MESSAGE, max=50)]) email = fields.Str(data_key="email",allow_none=True, validate=[validate.Length(max=120, error=MAX_EXCEPTION_MESSAGE)]) businessName = fields.Str(data_key="businessName",allow_none=True, validate=[validate.Length(max=255, error=MAX_EXCEPTION_MESSAGE)]) + category = fields.Str(data_key="category", required=True,validate=[validate.Length(min=1, error=BLANK_EXCEPTION_MESSAGE)]) phonePrimary = fields.Str(data_key="phonePrimary",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) workPhonePrimary = fields.Str(data_key="workPhonePrimary",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index e9003c739..4929351de 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -3,6 +3,7 @@ from re import VERBOSE from request_api.models.FOIRequestApplicants import FOIRequestApplicant from request_api.models.FOIMinistryRequests import FOIMinistryRequest +from request_api.models.ApplicantCategories import ApplicantCategory from request_api.services.requestservice import requestservicegetter, requestservicecreate from request_api.auth import AuthHelper from dateutil import tz, parser @@ -29,7 +30,6 @@ def getapplicantbyid(self, applicantid): applicant = FOIRequestApplicant.getapplicantbyid(applicantid) applicant = self.__prepareapplicant(applicant) applicant['requestHistory'] = self.getapplicantrequests(applicantid) - applicant.pop('requestType') return applicant def searchapplicant(self, keywords): @@ -42,6 +42,7 @@ def searchapplicant(self, keywords): return applicantqueue def saveapplicantinfo(self, applicantschema, userid): + categoryid = ApplicantCategory().getapplicantcategory(applicantschema['category'])["applicantcategoryid"] applicant = FOIRequestApplicant.updateapplicantprofile( applicantschema['foiRequestApplicantID'], applicantschema['firstName'], @@ -50,7 +51,7 @@ def saveapplicantinfo(self, applicantschema, userid): applicantschema['businessName'], applicantschema.get('additionalPersonalInfo', None).get('alsoKnownAs', None), applicantschema.get('additionalPersonalInfo', None).get('birthDate', None), - applicantschema['applicantCategoryID'], + categoryid, userid ) # replace with applicant id once new save function is written requests = FOIMinistryRequest.getopenrequestsbyrequestId(applicantschema['foirequestID']) @@ -92,10 +93,10 @@ def __prepareapplicant(self, applicant): #'createdat' : self.__formatedate(applicant["createdat)"], 'businessName': self.__first_not_null(applicant["businessname"]), # 'applicant': applicant["applicant"], - 'foirequestID': applicant["foirequestid"], - 'foirequestVersion': applicant["foirequestversion"], - 'requestType': applicant["requesttype"], - 'category': applicant["applicantcategory"], + # 'foirequestID': applicant["foirequestid"], + # 'foirequestVersion': applicant["foirequestversion"], + # 'requestType': applicant["requesttype"], + 'category': self.__first_not_null(applicant["applicantcategory"]), 'email': self.__first_not_null(applicant["email"]), 'address': self.__first_not_null(applicant["address"]), 'city': self.__first_not_null(applicant["city"]), diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index f1689010b..196fb01ec 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -12,6 +12,7 @@ from request_api.models.FOIRequestContactInformation import FOIRequestContactInformation from request_api.models.FOIRequestPersonalAttributes import FOIRequestPersonalAttribute from request_api.models.FOIRequestApplicantMappings import FOIRequestApplicantMapping +from request_api.models.FOIRequestApplicants import FOIRequestApplicant from request_api.models.RequestorType import RequestorType import json @@ -134,8 +135,9 @@ def __prepareapplicants(self, foirequestschema, userid): # if foirequestschema.get('foiRequestApplicantID') is None and foirequestschema.get('requeststatusid') == 1: if foirequestschema.get('foiRequestApplicantID') is not None: + applicant = FOIRequestApplicant().getlatestprofilebyapplicantid(foirequestschema['foiRequestApplicantID']) requestapplicant = FOIRequestApplicantMapping() - requestapplicant.foirequestapplicantid = foirequestschema['foiRequestApplicantID'] + requestapplicant.foirequestapplicantid = applicant['foirequestapplicantid'] requestapplicant.requestortypeid = RequestorType().getrequestortype("Self")["requestortypeid"] requestapplicantarr.append(requestapplicant) else: From 0a5826528b93af53b008a1f47755f3541ca50908 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Fri, 19 Jan 2024 16:07:06 -0800 Subject: [PATCH 029/147] 1. categoryid in applicant table 2. get request by applicantid --- .../ba218164248e_add_category_to_applicant.py | 17 +++++++++++++ .../request_api/models/FOIMinistryRequests.py | 25 +++++++++++++++---- .../models/FOIRequestApplicantMappings.py | 4 +-- .../models/FOIRequestApplicants.py | 14 ++++++----- .../request_api/models/FOIRequests.py | 7 +++--- .../request_api/schemas/foiapplicant.py | 5 +--- .../request_api/schemas/foirequest.py | 11 ++++---- .../request_api/services/applicantservice.py | 8 ++++-- .../foirequest/requestservicecreate.py | 4 ++- .../foirequest/requestservicegetter.py | 21 +++++++++++----- .../requestserviceministrybuilder.py | 2 +- 11 files changed, 82 insertions(+), 36 deletions(-) diff --git a/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py b/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py index 007bec8a4..1c474582c 100644 --- a/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py +++ b/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py @@ -19,10 +19,27 @@ def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.add_column('FOIRequestApplicants', sa.Column('applicantcategoryid', sa.Integer(), nullable=True)) + op.create_foreign_key(None, 'FOIRequestApplicants', 'ApplicantCategories', ['applicantcategoryid'], ['applicantcategoryid']) + + op.execute( + ''' + UPDATE public."FOIRequestApplicants" + set applicantcategoryid = subquery.applicantcategoryid + from ( + select public."FOIRequestApplicantMappings".foirequestapplicantid, public."FOIRequests".applicantcategoryid + from public."FOIRequestApplicantMappings" + join public."FOIRequests" on public."FOIRequests".foirequestid = public."FOIRequestApplicantMappings".foirequest_id and public."FOIRequests".version = public."FOIRequestApplicantMappings".foirequestversion_id + group by public."FOIRequestApplicantMappings".foirequestapplicantid, public."FOIRequests".applicantcategoryid + ) as subquery + where public."FOIRequestApplicants".foirequestapplicantid = subquery.foirequestapplicantid + ''' + ) + # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'FOIRequestApplicants', type_='foreignkey') op.drop_column('FOIRequestApplicants', 'applicantcategoryid') # ### end Alembic commands ### \ No newline at end of file diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index 2f10afbf2..4a95cd121 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -177,6 +177,7 @@ def getrequests(cls, group = None): ministryrequest =ministryrequest_schema.dump(_session.query(FOIMinistryRequest).filter(FOIMinistryRequest.foiministryrequestid == _requestid).order_by(FOIMinistryRequest.version.desc()).first()) parentrequest = _session.query(FOIRequest).filter(FOIRequest.foirequestid == ministryrequest['foirequest_id'] and FOIRequest.version == ministryrequest['foirequestversion_id']).order_by(FOIRequest.version.desc()).first() requestapplicants = FOIRequestApplicantMapping.getrequestapplicants(ministryrequest['foirequest_id'],ministryrequest['foirequestversion_id']) + print("requestapplicants", requestapplicants) _receiveddate = parentrequest.receiveddate _request["firstName"] = requestapplicants[0]['foirequestapplicant.firstname'] _request["lastName"] = requestapplicants[0]['foirequestapplicant.lastname'] @@ -198,7 +199,8 @@ def getrequests(cls, group = None): _request["version"] = ministryrequest['version'] _request["id"] = parentrequest.foirequestid _request["ministryrequestid"] = ministryrequest['foiministryrequestid'] - _request["applicantcategory"]=parentrequest.applicantcategory.name + # _request["applicantcategory"]=parentrequest.applicantcategory.name + _request["applicantcategory"]=requestapplicants[0]['foirequestapplicant.applicantcategory.name'] _request["identityverified"] = ministryrequest['identityverified'] _requests.append(_request) @@ -233,7 +235,17 @@ def getopenrequestsbyrequestId(cls,requestids): @classmethod def getopenrequestsbyapplicantid(cls,applicantid): + _session = db.session + selectedcolumns = [FOIMinistryRequest.foirequest_id, FOIMinistryRequest.foiministryrequestid] + + #subquery for getting latest version & proper group/team for FOIMinistryRequest + subquery_applicant_maxid = _session.query(FOIRequestApplicant.applicantprofileid, func.max(FOIRequestApplicant.foirequestapplicantid).label('max_id')).group_by(FOIRequestApplicant.applicantprofileid).subquery() + joincondition_applicant = [ + subquery_applicant_maxid.c.applicantprofileid == FOIRequestApplicant.applicantprofileid, + subquery_applicant_maxid.c.max_id == FOIRequestApplicantMapping.foirequestapplicantid, + ] + query = db.session.query( *selectedcolumns ).distinct( @@ -246,9 +258,12 @@ def getopenrequestsbyapplicantid(cls,applicantid): FOIRequestApplicantMapping.requestortypeid == RequestorType['applicant'].value) ).join( FOIRequestApplicant, - FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid, - ).filter( FOIRequestApplicant.foirequestapplicantid == applicantid, + ).join( + subquery_applicant_maxid, + and_(*joincondition_applicant) + ).filter( + # FOIRequestApplicant.foirequestapplicantid == applicantid, FOIMinistryRequest.requeststatusid != 3 ).order_by( FOIMinistryRequest.foiministryrequestid.asc(), @@ -552,7 +567,7 @@ def getrequestssubquery(cls, groups, filterfields, keyword, additionalfilter, us isouter=True ).join( ApplicantCategory, - and_(ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid, ApplicantCategory.isactive == True) + and_(ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid, ApplicantCategory.isactive == True) ).join( ProgramArea, FOIMinistryRequest.programareaid == ProgramArea.programareaid @@ -1071,7 +1086,7 @@ def getbasequery(cls, iaoassignee, ministryassignee, userid=None, requestby='IAO isouter=True ).join( ApplicantCategory, - and_(ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid, ApplicantCategory.isactive == True) + and_(ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid, ApplicantCategory.isactive == True) ).join( ProgramArea, FOIMinistryRequest.programareaid == ProgramArea.programareaid diff --git a/request-management-api/request_api/models/FOIRequestApplicantMappings.py b/request-management-api/request_api/models/FOIRequestApplicantMappings.py index 74cdeef90..7313e1f1a 100644 --- a/request-management-api/request_api/models/FOIRequestApplicantMappings.py +++ b/request-management-api/request_api/models/FOIRequestApplicantMappings.py @@ -44,10 +44,10 @@ def getrequestapplicants(cls,foirequest_id,foirequestversion): FOIRequestApplicantMapping.foirequest_id == foirequest_id, FOIRequestApplicantMapping.foirequestversion_id == foirequestversion ).order_by(FOIRequestApplicantMapping.foirequestapplicantmappingid.asc()).all() - applicantinfos = requestapplicant_schema.dump(_applicantinfos) + applicantinfos = requestapplicant_schema.dump(_applicantinfos) return applicantinfos class FOIRequestApplicantMappingSchema(ma.Schema): class Meta: - fields = ('foirequestapplicantmappingid','foirequest.foirequestid','foirequest.version','requestortype.requestortypeid','requestortype.name','foirequestapplicant.foirequestapplicantid','foirequestapplicant.firstname','foirequestapplicant.lastname','foirequestapplicant.middlename','foirequestapplicant.alsoknownas','foirequestapplicant.dob','foirequestapplicant.businessname') + fields = ('foirequestapplicantmappingid','foirequest.foirequestid','foirequest.version','requestortype.requestortypeid','requestortype.name','foirequestapplicant.foirequestapplicantid','foirequestapplicant.firstname','foirequestapplicant.lastname','foirequestapplicant.middlename','foirequestapplicant.alsoknownas','foirequestapplicant.dob','foirequestapplicant.businessname','foirequestapplicant.applicantcategory.applicantcategoryid','foirequestapplicant.applicantcategory.name') \ No newline at end of file diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 12e388acc..8d8890b63 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -26,7 +26,9 @@ class FOIRequestApplicant(db.Model): alsoknownas = db.Column(db.String(50), unique=False, nullable=True) dob = db.Column(db.DateTime, unique=False, nullable=True) businessname = db.Column(db.String(255), unique=False, nullable=True) - applicantcategoryid = db.Column(db.Integer, unique=False, nullable=True) + # applicantcategoryid = db.Column(db.Integer, unique=False, nullable=True) + applicantcategoryid = db.Column(db.Integer, ForeignKey('ApplicantCategories.applicantcategoryid'), nullable=True) + applicantcategory = relationship("ApplicantCategory", backref=backref("ApplicantCategories"), uselist=False) created_at = db.Column(db.DateTime, default=datetime.now) updated_at = db.Column(db.DateTime, nullable=True) @@ -169,7 +171,7 @@ def getapplicantbyid(cls, applicantid): # ) ).join( ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid + ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid ).join( subquery_foirequest_maxversion, and_(*joincondition) @@ -433,7 +435,7 @@ def getapplicantbyemail(cls, email): # ) ).join( ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid + ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid ).join( subquery_foirequest_maxversion, and_(*joincondition) @@ -701,7 +703,7 @@ def searchapplicant(cls, keywords): # ) ).join( ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid + ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid ).join( subquery_foirequest_maxversion, and_(*joincondition) @@ -996,7 +998,7 @@ def getapplicanthistory(cls, applicantid): FOIRequest.version == FOIRequestApplicantMapping.foirequestversion_id) ).join( ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid + ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid ).join( contactemail, and_( @@ -1219,7 +1221,7 @@ def prepareapplicantforcomparing(cls, firstname, lastname, middlename, businessn class FOIRequestApplicantSchema(ma.Schema): class Meta: - fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob','businessname') + fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob','businessname','applicantcategory.applicantcategoryid','applicantcategory.name') class ApplicantProfileSchema(ma.Schema): class Meta: diff --git a/request-management-api/request_api/models/FOIRequests.py b/request-management-api/request_api/models/FOIRequests.py index fcd9ea81a..b84aacf6a 100644 --- a/request-management-api/request_api/models/FOIRequests.py +++ b/request-management-api/request_api/models/FOIRequests.py @@ -32,8 +32,8 @@ class FOIRequest(db.Model): #ForeignKey References - applicantcategoryid = db.Column(db.Integer,ForeignKey('ApplicantCategories.applicantcategoryid')) - applicantcategory = relationship("ApplicantCategory",backref=backref("ApplicantCategories"),uselist=False) + # applicantcategoryid = db.Column(db.Integer,ForeignKey('ApplicantCategories.applicantcategoryid')) + # applicantcategory = relationship("ApplicantCategory",backref=backref("ApplicantCategories"),uselist=False) deliverymodeid = db.Column(db.Integer,ForeignKey('DeliveryModes.deliverymodeid')) deliverymode = relationship("DeliveryMode",backref=backref("DeliveryModes"),uselist=False) @@ -121,6 +121,5 @@ class FOIRequestsSchema(ma.Schema): class Meta: fields = ('foirequestid','version','foirawrequestid','requesttype','receiveddate','initialdescription', 'initialrecordSearchFromDate','initialrecordsearchtodate','receivedmode.receivedmodeid', - 'deliverymode.deliverymodeid','receivedmode.name','deliverymode.name', - 'applicantcategory.applicantcategoryid','applicantcategory.name','wfinstanceid','ministryRequests') + 'deliverymode.deliverymodeid','receivedmode.name','deliverymode.name','wfinstanceid','ministryRequests') \ No newline at end of file diff --git a/request-management-api/request_api/schemas/foiapplicant.py b/request-management-api/request_api/schemas/foiapplicant.py index cd62b8140..4d7f10b60 100644 --- a/request-management-api/request_api/schemas/foiapplicant.py +++ b/request-management-api/request_api/schemas/foiapplicant.py @@ -28,9 +28,6 @@ class Meta: # pylint: disable=too-few-public-methods # publicServiceEmployeeNumber = fields.Str(data_key="publicServiceEmployeeNumber",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) - foirequestID = fields.List(fields.Int(),data_key="foirequestID",required=True,allow_none=False) - additionalPersonalInfo = fields.Nested(FOIAdditionallPersonalInfoWrapperSchema,required=False,allow_none=True) - - \ No newline at end of file + applicantCategoryID = fields.Int(data_key="applicantCategoryID",required=False,allow_none=True) \ No newline at end of file diff --git a/request-management-api/request_api/schemas/foirequest.py b/request-management-api/request_api/schemas/foirequest.py index 239f320db..e96c4d2c0 100644 --- a/request-management-api/request_api/schemas/foirequest.py +++ b/request-management-api/request_api/schemas/foirequest.py @@ -47,11 +47,12 @@ class Meta: # pylint: disable=too-few-public-methods unknown = EXCLUDE firstname = fields.Str(data_key="firstName") - middlename = fields.Str(data_key="middleName") - lastname = fields.Str(data_key="lastName") - alsoknownas = fields.Str(data_key="alsoKnownAs") - dob = fields.Date(data_key="dob") - businessname = fields.Str(data_key="businessName") + middlename = fields.Str(data_key="middleName") + lastname = fields.Str(data_key="lastName") + alsoknownas = fields.Str(data_key="alsoKnownAs") + dob = fields.Date(data_key="dob") + businessname = fields.Str(data_key="businessName") + applicantcategoryid = fields.Int(data_key="applicantCategoryID") class FOIRequestApplicantSchema(Schema): class Meta: # pylint: disable=too-few-public-methods diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index e9003c739..510b90400 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -11,6 +11,7 @@ from request_api.utils.commons.datetimehandler import datetimehandler from request_api.models.default_method_result import DefaultMethodResult import re +from request_api.services.foirequest.requestserviceconfigurator import requestserviceconfigurator class applicantservice: """ FOI Event Dashboard @@ -42,6 +43,7 @@ def searchapplicant(self, keywords): return applicantqueue def saveapplicantinfo(self, applicantschema, userid): + print("applicantschema", applicantschema) applicant = FOIRequestApplicant.updateapplicantprofile( applicantschema['foiRequestApplicantID'], applicantschema['firstName'], @@ -50,10 +52,12 @@ def saveapplicantinfo(self, applicantschema, userid): applicantschema['businessName'], applicantschema.get('additionalPersonalInfo', None).get('alsoKnownAs', None), applicantschema.get('additionalPersonalInfo', None).get('birthDate', None), - applicantschema['applicantCategoryID'], + requestserviceconfigurator().getvalueof("category",applicantschema['category']), userid ) # replace with applicant id once new save function is written - requests = FOIMinistryRequest.getopenrequestsbyrequestId(applicantschema['foirequestID']) + # requests = FOIMinistryRequest.getopenrequestsbyrequestId(applicantschema['foirequestID']) + requests = FOIMinistryRequest.getopenrequestsbyapplicantid(applicantschema['foiRequestApplicantID']) + print("requests", requests) applicantschema['foiRequestApplicantID'] = applicant.identifier # requests = FOIMinistryRequest.getopenrequestsbyapplicantid(applicantschema['foiRequestApplicantID']) for request in requests: diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index 1a7cb8a2f..72713938a 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -7,7 +7,7 @@ from request_api.services.watcherservice import watcherservice from request_api.services.foirequest.requestservicebuilder import requestservicebuilder from request_api.services.foirequest.requestserviceministrybuilder import requestserviceministrybuilder -from request_api.services.foirequest.requestserviceconfigurator import requestserviceconfigurator +from request_api.services.foirequest.requestserviceconfigurator import requestserviceconfigurator from request_api.models.PersonalInformationAttributes import PersonalInformationAttribute from request_api.models.FOIRequestContactInformation import FOIRequestContactInformation from request_api.models.FOIRequestPersonalAttributes import FOIRequestPersonalAttribute @@ -128,11 +128,13 @@ def __prepareapplicants(self, foirequestschema, userid): selfalsoknownas=None selfdob=None selfcategoryid=None + print("foirequestschema", foirequestschema) if foirequestschema.get("additionalPersonalInfo") is not None and foirequestschema.get('requeststatusid') == 1: applicantinfo = foirequestschema.get("additionalPersonalInfo") selfdob = applicantinfo["birthDate"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"birthDate","additionalPersonalInfo") else None selfalsoknownas = applicantinfo["alsoKnownAs"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"alsoKnownAs","additionalPersonalInfo") else None selfcategoryid = requestserviceconfigurator().getvalueof("category",foirequestschema.get("category")) if requestservicebuilder().isNotBlankorNone(foirequestschema,"category","main") else None + print("selfcategoryid", selfcategoryid) # if foirequestschema.get('foiRequestApplicantID') is None and foirequestschema.get('requeststatusid') == 1: if foirequestschema.get('foiRequestApplicantID') is not None: diff --git a/request-management-api/request_api/services/foirequest/requestservicegetter.py b/request-management-api/request_api/services/foirequest/requestservicegetter.py index aea1580d4..ee3add1a0 100644 --- a/request-management-api/request_api/services/foirequest/requestservicegetter.py +++ b/request-management-api/request_api/services/foirequest/requestservicegetter.py @@ -47,8 +47,11 @@ def getrequest(self,foirequestid,foiministryrequestid): alsoknownas = applicant['foirequestapplicant.alsoknownas'] foirequestapplicantid = applicant['foirequestapplicant.foirequestapplicantid'] requestortypeid = applicant['requestortype.requestortypeid'] + categoryid = applicant['foirequestapplicant.applicantcategory.applicantcategoryid'] + category = applicant['foirequestapplicant.applicantcategory.name'] + if requestortypeid == 1: - baserequestinfo.update(self.__prepareapplicant(foirequestapplicantid, firstname, middlename, lastname, businessname)) + baserequestinfo.update(self.__prepareapplicant(foirequestapplicantid, firstname, middlename, lastname, businessname, categoryid, category)) additionalpersonalinfo.update(self.__prepareadditionalpersonalinfo(requestortypeid, firstname, middlename, lastname, dob, alsoknownas)) baserequestdetails, additionalpersonalinfodetails = self.preparepersonalattributes(foirequestid, request['version']) @@ -94,8 +97,12 @@ def getrequestdetailsforministry(self,foirequestid,foiministryrequestid, authmem dob = parse(dobraw).strftime(self.__genericdateformat()) if dobraw is not None else '' foirequestapplicantid = applicant['foirequestapplicant.foirequestapplicantid'] requestortypeid = applicant['requestortype.requestortypeid'] + categoryid = applicant['foirequestapplicant.applicantcategory.applicantcategoryid'] + category = applicant['foirequestapplicant.applicantcategory.name'] + businessname = None + if requestortypeid == 1: - baserequestinfo.update(self.__prepareapplicant(foirequestapplicantid, firstname, middlename, lastname)) + baserequestinfo.update(self.__prepareapplicant(foirequestapplicantid, firstname, middlename, lastname, businessname, categoryid, category)) additionalpersonalinfo.update(self.__prepareadditionalpersonalinfo(requestortypeid, firstname, middlename, lastname, dob)) baserequestdetails, additionalpersonalinfodetails = self.preparepersonalattributes(foirequestid, request['version']) baserequestinfo.update(baserequestdetails) @@ -161,8 +168,8 @@ def __preparebaseinfo(self,request,foiministryrequestid,requestministry,requestm 'originalDueDate': parse(requestministry['originalldd']).strftime(self.__genericdateformat()) if requestministry['originalldd'] is not None else parse(requestministry['duedate']).strftime(self.__genericdateformat()), 'programareaid':requestministry['programarea.programareaid'], 'bcgovcode':requestministry['programarea.bcgovcode'], - 'category':request['applicantcategory.name'], - 'categoryid':request['applicantcategory.applicantcategoryid'], + # 'category':'', + # 'categoryid':0, 'assignedministrygroup':requestministry["assignedministrygroup"], 'assignedministryperson':requestministry["assignedministryperson"], 'selectedMinistries':[{'code':requestministry['programarea.bcgovcode'],'id':requestministry['foiministryrequestid'],'name':requestministry['programarea.name'],'selected':'true'}], @@ -229,13 +236,15 @@ def getministryrequest(self, foiministryrequestid): def __genericdateformat(self): return '%Y-%m-%d' - def __prepareapplicant(self, foirequestapplicantid=None, firstname= None, middlename= None, lastname= None, businessname= None): + def __prepareapplicant(self, foirequestapplicantid=None, firstname=None, middlename=None, lastname=None, businessname=None, applicantcategoryid=None, applicantcategory=None): return { 'firstName': firstname, 'middleName': middlename, 'lastName': lastname, 'businessName': businessname, - 'foiRequestApplicantID': foirequestapplicantid + 'foiRequestApplicantID': foirequestapplicantid, + 'categoryid': applicantcategoryid, + 'category': applicantcategory } def __prepareadditionalpersonalinfo(self, requestortypeid, firstname= None, middlename= None, lastname= None, dob= None, alsoknownas= None): diff --git a/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py b/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py index f35af8e74..7928588b7 100644 --- a/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py +++ b/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py @@ -29,7 +29,7 @@ def createfoirequestfromobject(self, foiobject, userid): foirequest.receiveddate = foiobject['receiveddate'] if 'receiveddate' in foiobject else None foirequest.requesttype = foiobject['requesttype'] foirequest.wfinstanceid = foiobject['wfinstanceid'] - foirequest.applicantcategoryid = foiobject["applicantcategory.applicantcategoryid"] + # foirequest.applicantcategoryid = foiobject["applicantcategory.applicantcategoryid"] foirequest.deliverymodeid = foiobject["deliverymode.deliverymodeid"] foirequest.receivedmodeid = foiobject["receivedmode.receivedmodeid"] foirequest.createdby = userid From 351d8ac38261b4212c54550358609fd39b283d30 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Fri, 19 Jan 2024 16:46:09 -0800 Subject: [PATCH 030/147] bug fix --- .../request_api/models/FOIRequestApplicants.py | 4 ++-- request-management-api/request_api/schemas/foiapplicant.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index e62b12e42..f2c715717 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -68,7 +68,7 @@ def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, midd # applicant.isactive = False applicant_query.update({FOIRequestApplicant.applicantprofileid:str(uuid.uuid4())}) - applicantfromform = FOIRequestApplicant().prepareapplicantforcomparing(firstname, lastname, middlename, businessname, alsoknownas, datetime.strptime(dob, "%Y-%m-%d"), applicantcategoryid) + applicantfromform = FOIRequestApplicant().prepareapplicantforcomparing(firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid) applicantfromdb = FOIRequestApplicant().prepareapplicantforcomparing(applicant.firstname, applicant.lastname, applicant.middlename, applicant.businessname, applicant.alsoknownas, applicant.dob, applicant.applicantcategoryid) if applicantfromform != applicantfromdb: _applicant = FOIRequestApplicant() @@ -1221,7 +1221,7 @@ def prepareapplicantforcomparing(cls, firstname, lastname, middlename, businessn 'middlename': middlename if middlename is not None or middlename != '' else None, 'businessname': businessname if businessname is not None or businessname != '' else None, 'alsoknownas': alsoknownas if alsoknownas is not None or alsoknownas != '' else None, - 'dob': dob if dob is not None or dob != '' else None, + 'dob': datetime.strptime(dob, "%Y-%m-%d") if dob is not None and dob != '' else None, 'applicantcategoryid': applicantcategoryid if applicantcategoryid is not None or applicantcategoryid != 0 else None, } diff --git a/request-management-api/request_api/schemas/foiapplicant.py b/request-management-api/request_api/schemas/foiapplicant.py index f420b07cb..1eeef1292 100644 --- a/request-management-api/request_api/schemas/foiapplicant.py +++ b/request-management-api/request_api/schemas/foiapplicant.py @@ -29,6 +29,6 @@ class Meta: # pylint: disable=too-few-public-methods # publicServiceEmployeeNumber = fields.Str(data_key="publicServiceEmployeeNumber",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) - foirequestID = fields.List(fields.Int(),data_key="foirequestID",required=True,allow_none=False) + foirequestID = fields.List(fields.Int(),data_key="foirequestID",required=False,allow_none=False) additionalPersonalInfo = fields.Nested(FOIAdditionallPersonalInfoWrapperSchema,required=False,allow_none=True) applicantCategoryID = fields.Int(data_key="applicantCategoryID",required=False,allow_none=True) \ No newline at end of file From 4bef1a2e577160ddacb30bf23acbd776e640f5bb Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Fri, 19 Jan 2024 16:56:35 -0800 Subject: [PATCH 031/147] bug fix --- .../request_api/models/FOIMinistryRequests.py | 1 - request-management-api/request_api/schemas/foiapplicant.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index 4a95cd121..3233f4716 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -177,7 +177,6 @@ def getrequests(cls, group = None): ministryrequest =ministryrequest_schema.dump(_session.query(FOIMinistryRequest).filter(FOIMinistryRequest.foiministryrequestid == _requestid).order_by(FOIMinistryRequest.version.desc()).first()) parentrequest = _session.query(FOIRequest).filter(FOIRequest.foirequestid == ministryrequest['foirequest_id'] and FOIRequest.version == ministryrequest['foirequestversion_id']).order_by(FOIRequest.version.desc()).first() requestapplicants = FOIRequestApplicantMapping.getrequestapplicants(ministryrequest['foirequest_id'],ministryrequest['foirequestversion_id']) - print("requestapplicants", requestapplicants) _receiveddate = parentrequest.receiveddate _request["firstName"] = requestapplicants[0]['foirequestapplicant.firstname'] _request["lastName"] = requestapplicants[0]['foirequestapplicant.lastname'] diff --git a/request-management-api/request_api/schemas/foiapplicant.py b/request-management-api/request_api/schemas/foiapplicant.py index 1eeef1292..a54c62dd1 100644 --- a/request-management-api/request_api/schemas/foiapplicant.py +++ b/request-management-api/request_api/schemas/foiapplicant.py @@ -31,4 +31,4 @@ class Meta: # pylint: disable=too-few-public-methods foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) foirequestID = fields.List(fields.Int(),data_key="foirequestID",required=False,allow_none=False) additionalPersonalInfo = fields.Nested(FOIAdditionallPersonalInfoWrapperSchema,required=False,allow_none=True) - applicantCategoryID = fields.Int(data_key="applicantCategoryID",required=False,allow_none=True) \ No newline at end of file + category = fields.Int(data_key="category",required=False,allow_none=True) \ No newline at end of file From d1684e9ce0f2892fc0c069b3ddbc502a9df4646f Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Fri, 19 Jan 2024 16:58:06 -0800 Subject: [PATCH 032/147] remove debug code --- request-management-api/request_api/services/applicantservice.py | 1 - .../request_api/services/foirequest/requestservicecreate.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index 155fb2855..dae384165 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -56,7 +56,6 @@ def saveapplicantinfo(self, applicantschema, userid): ) # replace with applicant id once new save function is written # requests = FOIMinistryRequest.getopenrequestsbyrequestId(applicantschema['foirequestID']) requests = FOIMinistryRequest.getopenrequestsbyapplicantid(applicantschema['foiRequestApplicantID']) - print("requests", requests) applicantschema['foiRequestApplicantID'] = applicant.identifier # requests = FOIMinistryRequest.getopenrequestsbyapplicantid(applicantschema['foiRequestApplicantID']) for request in requests: diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index 144a58a62..4563aa746 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -129,13 +129,11 @@ def __prepareapplicants(self, foirequestschema, userid): selfalsoknownas=None selfdob=None selfcategoryid=None - print("foirequestschema", foirequestschema) if foirequestschema.get("additionalPersonalInfo") is not None and foirequestschema.get('requeststatusid') == 1: applicantinfo = foirequestschema.get("additionalPersonalInfo") selfdob = applicantinfo["birthDate"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"birthDate","additionalPersonalInfo") else None selfalsoknownas = applicantinfo["alsoKnownAs"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"alsoKnownAs","additionalPersonalInfo") else None selfcategoryid = requestserviceconfigurator().getvalueof("category",foirequestschema.get("category")) if requestservicebuilder().isNotBlankorNone(foirequestschema,"category","main") else None - print("selfcategoryid", selfcategoryid) # if foirequestschema.get('foiRequestApplicantID') is None and foirequestschema.get('requeststatusid') == 1: if foirequestschema.get('foiRequestApplicantID') is not None: From e3902cfb2ddcea3978267d5c723f8bbadbafc80f Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Fri, 19 Jan 2024 17:11:56 -0800 Subject: [PATCH 033/147] bug fix --- .../request_api/models/FOIRequestApplicants.py | 3 ++- request-management-api/request_api/schemas/foiapplicant.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index f2c715717..c70e5e406 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -68,6 +68,7 @@ def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, midd # applicant.isactive = False applicant_query.update({FOIRequestApplicant.applicantprofileid:str(uuid.uuid4())}) + dob = datetime.strptime(dob, "%Y-%m-%d") if dob is not None and dob != '' else None applicantfromform = FOIRequestApplicant().prepareapplicantforcomparing(firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid) applicantfromdb = FOIRequestApplicant().prepareapplicantforcomparing(applicant.firstname, applicant.lastname, applicant.middlename, applicant.businessname, applicant.alsoknownas, applicant.dob, applicant.applicantcategoryid) if applicantfromform != applicantfromdb: @@ -1221,7 +1222,7 @@ def prepareapplicantforcomparing(cls, firstname, lastname, middlename, businessn 'middlename': middlename if middlename is not None or middlename != '' else None, 'businessname': businessname if businessname is not None or businessname != '' else None, 'alsoknownas': alsoknownas if alsoknownas is not None or alsoknownas != '' else None, - 'dob': datetime.strptime(dob, "%Y-%m-%d") if dob is not None and dob != '' else None, + 'dob': dob if dob is not None and dob != '' else None, 'applicantcategoryid': applicantcategoryid if applicantcategoryid is not None or applicantcategoryid != 0 else None, } diff --git a/request-management-api/request_api/schemas/foiapplicant.py b/request-management-api/request_api/schemas/foiapplicant.py index a54c62dd1..e802f1748 100644 --- a/request-management-api/request_api/schemas/foiapplicant.py +++ b/request-management-api/request_api/schemas/foiapplicant.py @@ -31,4 +31,4 @@ class Meta: # pylint: disable=too-few-public-methods foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) foirequestID = fields.List(fields.Int(),data_key="foirequestID",required=False,allow_none=False) additionalPersonalInfo = fields.Nested(FOIAdditionallPersonalInfoWrapperSchema,required=False,allow_none=True) - category = fields.Int(data_key="category",required=False,allow_none=True) \ No newline at end of file + category = fields.Str(data_key="category",allow_none=True) \ No newline at end of file From cfb25e2bb5b65b3206492e0f273260e96c2a4101 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 23 Jan 2024 00:58:08 -0800 Subject: [PATCH 034/147] bug fix --- .../request_api/models/FOIMinistryRequests.py | 8 ++-- .../models/FOIRequestApplicantMappings.py | 45 ++++++++++++++++++- .../foirequest/requestservicecreate.py | 7 ++- .../foirequest/requestservicegetter.py | 40 ++++++++--------- .../requestserviceministrybuilder.py | 4 +- 5 files changed, 72 insertions(+), 32 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index 3233f4716..dac8bc5cd 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -176,10 +176,10 @@ def getrequests(cls, group = None): ministryrequest =ministryrequest_schema.dump(_session.query(FOIMinistryRequest).filter(FOIMinistryRequest.foiministryrequestid == _requestid).order_by(FOIMinistryRequest.version.desc()).first()) parentrequest = _session.query(FOIRequest).filter(FOIRequest.foirequestid == ministryrequest['foirequest_id'] and FOIRequest.version == ministryrequest['foirequestversion_id']).order_by(FOIRequest.version.desc()).first() - requestapplicants = FOIRequestApplicantMapping.getrequestapplicants(ministryrequest['foirequest_id'],ministryrequest['foirequestversion_id']) + requestapplicants = FOIRequestApplicantMapping.getrequestapplicantinfos(ministryrequest['foirequest_id'],ministryrequest['foirequestversion_id']) _receiveddate = parentrequest.receiveddate - _request["firstName"] = requestapplicants[0]['foirequestapplicant.firstname'] - _request["lastName"] = requestapplicants[0]['foirequestapplicant.lastname'] + _request["firstName"] = requestapplicants[0]['firstname'] + _request["lastName"] = requestapplicants[0]['lastname'] _request["requestType"] = parentrequest.requesttype _request["idNumber"] = ministryrequest['filenumber'] _request["axisRequestId"] = ministryrequest['axisrequestid'] @@ -199,7 +199,7 @@ def getrequests(cls, group = None): _request["id"] = parentrequest.foirequestid _request["ministryrequestid"] = ministryrequest['foiministryrequestid'] # _request["applicantcategory"]=parentrequest.applicantcategory.name - _request["applicantcategory"]=requestapplicants[0]['foirequestapplicant.applicantcategory.name'] + _request["applicantcategory"]=requestapplicants[0]['applicantcategory'] _request["identityverified"] = ministryrequest['identityverified'] _requests.append(_request) diff --git a/request-management-api/request_api/models/FOIRequestApplicantMappings.py b/request-management-api/request_api/models/FOIRequestApplicantMappings.py index 7313e1f1a..412a1d8a5 100644 --- a/request-management-api/request_api/models/FOIRequestApplicantMappings.py +++ b/request-management-api/request_api/models/FOIRequestApplicantMappings.py @@ -5,7 +5,9 @@ from sqlalchemy.orm import relationship,backref from .default_method_result import DefaultMethodResult from .FOIRequests import FOIRequest -from sqlalchemy import and_, or_ +from sqlalchemy import and_, or_, func +from .ApplicantCategories import ApplicantCategory +from .RequestorType import RequestorType class FOIRequestApplicantMapping(db.Model): # Name of the table in our database @@ -46,8 +48,47 @@ def getrequestapplicants(cls,foirequest_id,foirequestversion): ).order_by(FOIRequestApplicantMapping.foirequestapplicantmappingid.asc()).all() applicantinfos = requestapplicant_schema.dump(_applicantinfos) return applicantinfos - + + @classmethod + def getrequestapplicantinfos(cls,foirequest_id,foirequestversion): + from .FOIRequestApplicants import FOIRequestApplicant + _applicantinfos = db.session.query(*[ + FOIRequestApplicantMapping.foirequestapplicantmappingid, + FOIRequestApplicantMapping.foirequest_id.label('foirequestid'), + FOIRequestApplicantMapping.foirequestversion_id.label('version'), + FOIRequestApplicantMapping.requestortypeid.label('requestortypeid'), + RequestorType.name.label('requestortype'), + FOIRequestApplicant.foirequestapplicantid.label('foirequestapplicantid'), + FOIRequestApplicant.firstname.label('firstname'), + FOIRequestApplicant.lastname.label('lastname'), + FOIRequestApplicant.middlename.label('middlename'), + FOIRequestApplicant.alsoknownas.label('alsoknownas'), + FOIRequestApplicant.dob.label('dob'), + FOIRequestApplicant.businessname.label('businessname'), + ApplicantCategory.applicantcategoryid.label('applicantcategoryid'), + ApplicantCategory.name.label('applicantcategory'), + ]).join( + FOIRequestApplicant, + FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid + ).join( + ApplicantCategory, + ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid + ).join( + RequestorType, + RequestorType.requestortypeid == FOIRequestApplicantMapping.requestortypeid + ).filter( + FOIRequestApplicantMapping.foirequest_id == foirequest_id, + FOIRequestApplicantMapping.foirequestversion_id == foirequestversion + ).order_by(FOIRequestApplicantMapping.foirequestapplicantmappingid.asc()).all() + requestapplicant_schema = FOIRequestApplicantInfoSchema(many=True) + applicantinfos = requestapplicant_schema.dump(_applicantinfos) + return applicantinfos + class FOIRequestApplicantMappingSchema(ma.Schema): class Meta: fields = ('foirequestapplicantmappingid','foirequest.foirequestid','foirequest.version','requestortype.requestortypeid','requestortype.name','foirequestapplicant.foirequestapplicantid','foirequestapplicant.firstname','foirequestapplicant.lastname','foirequestapplicant.middlename','foirequestapplicant.alsoknownas','foirequestapplicant.dob','foirequestapplicant.businessname','foirequestapplicant.applicantcategory.applicantcategoryid','foirequestapplicant.applicantcategory.name') + +class FOIRequestApplicantInfoSchema(ma.Schema): + class Meta: + fields = ('foirequestapplicantmappingid','foirequestid','version','requestortypeid','requestortype','foirequestapplicantid','firstname','lastname','middlename','alsoknownas','dob','businessname','applicantcategoryid','applicantcategory') \ No newline at end of file diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index 4563aa746..e3a046e66 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -70,7 +70,7 @@ def saverequestversion(self,foirequestschema, foirequestid , ministryid, userid) def saveministryrequestversion(self,ministryrequestschema, foirequestid , ministryid, userid, usertype = None): _foirequest = FOIRequest().getrequest(foirequestid) _foiministryrequest = FOIMinistryRequest().getrequestbyministryrequestid(ministryid) - _foirequestapplicant = FOIRequestApplicantMapping().getrequestapplicants(foirequestid,_foirequest["version"]) + _foirequestapplicant = FOIRequestApplicantMapping().getrequestapplicantinfos(foirequestid,_foirequest["version"]) _foirequestcontact = FOIRequestContactInformation().getrequestcontactinformation(foirequestid,_foirequest["version"]) _foirequestpersonalattrbs = FOIRequestPersonalAttribute().getrequestpersonalattributes(foirequestid,_foirequest["version"]) foiministryrequestarr = [] @@ -128,12 +128,11 @@ def __prepareapplicants(self, foirequestschema, userid): requestapplicantarr = [] selfalsoknownas=None selfdob=None - selfcategoryid=None - if foirequestschema.get("additionalPersonalInfo") is not None and foirequestschema.get('requeststatusid') == 1: + selfcategoryid = requestserviceconfigurator().getvalueof("category",foirequestschema.get("category")) if requestservicebuilder().isNotBlankorNone(foirequestschema,"category","main") == True else None + if foirequestschema.get("additionalPersonalInfo") is not None: applicantinfo = foirequestschema.get("additionalPersonalInfo") selfdob = applicantinfo["birthDate"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"birthDate","additionalPersonalInfo") else None selfalsoknownas = applicantinfo["alsoKnownAs"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"alsoKnownAs","additionalPersonalInfo") else None - selfcategoryid = requestserviceconfigurator().getvalueof("category",foirequestschema.get("category")) if requestservicebuilder().isNotBlankorNone(foirequestschema,"category","main") else None # if foirequestschema.get('foiRequestApplicantID') is None and foirequestschema.get('requeststatusid') == 1: if foirequestschema.get('foiRequestApplicantID') is not None: diff --git a/request-management-api/request_api/services/foirequest/requestservicegetter.py b/request-management-api/request_api/services/foirequest/requestservicegetter.py index ee3add1a0..538dc1487 100644 --- a/request-management-api/request_api/services/foirequest/requestservicegetter.py +++ b/request-management-api/request_api/services/foirequest/requestservicegetter.py @@ -24,7 +24,7 @@ def getrequest(self,foirequestid,foiministryrequestid): request = FOIRequest.getrequest(foirequestid) requestministry = FOIMinistryRequest.getrequestbyministryrequestid(foiministryrequestid) requestcontactinformation = FOIRequestContactInformation.getrequestcontactinformation(foirequestid,request['version']) - requestapplicants = FOIRequestApplicantMapping.getrequestapplicants(foirequestid,request['version']) + requestapplicants = FOIRequestApplicantMapping.getrequestapplicantinfos(foirequestid,request['version']) requestministrydivisions = FOIMinistryRequestDivision.getdivisions(foiministryrequestid,requestministry['version']) iaorestrictrequestdetails = FOIRestrictedMinistryRequest.getrestricteddetails(ministryrequestid=foiministryrequestid,type='iao') @@ -38,17 +38,17 @@ def getrequest(self,foirequestid,foiministryrequestid): additionalpersonalinfo ={} for applicant in requestapplicants: - firstname = applicant['foirequestapplicant.firstname'] - middlename = applicant['foirequestapplicant.middlename'] - lastname = applicant['foirequestapplicant.lastname'] - businessname = applicant['foirequestapplicant.businessname'] - dobraw = applicant['foirequestapplicant.dob'] + firstname = applicant['firstname'] + middlename = applicant['middlename'] + lastname = applicant['lastname'] + businessname = applicant['businessname'] + dobraw = applicant['dob'] dob = parse(dobraw).strftime(self.__genericdateformat()) if dobraw is not None else '' - alsoknownas = applicant['foirequestapplicant.alsoknownas'] - foirequestapplicantid = applicant['foirequestapplicant.foirequestapplicantid'] - requestortypeid = applicant['requestortype.requestortypeid'] - categoryid = applicant['foirequestapplicant.applicantcategory.applicantcategoryid'] - category = applicant['foirequestapplicant.applicantcategory.name'] + alsoknownas = applicant['alsoknownas'] + foirequestapplicantid = applicant['foirequestapplicantid'] + requestortypeid = applicant['requestortypeid'] + categoryid = applicant['applicantcategoryid'] + category = applicant['applicantcategory'] if requestortypeid == 1: baserequestinfo.update(self.__prepareapplicant(foirequestapplicantid, firstname, middlename, lastname, businessname, categoryid, category)) @@ -87,18 +87,18 @@ def getrequestdetailsforministry(self,foirequestid,foiministryrequestid, authmem baserequestinfo = self.__preparebaseinfo(request,foiministryrequestid,requestministry,requestministrydivisions) if request['requesttype'] == 'personal': - requestapplicants = FOIRequestApplicantMapping.getrequestapplicants(foirequestid,request['version']) + requestapplicants = FOIRequestApplicantMapping.getrequestapplicantinfos(foirequestid,request['version']) additionalpersonalinfo ={} for applicant in requestapplicants: - firstname = applicant['foirequestapplicant.firstname'] - middlename = applicant['foirequestapplicant.middlename'] - lastname = applicant['foirequestapplicant.lastname'] - dobraw = applicant['foirequestapplicant.dob'] + firstname = applicant['firstname'] + middlename = applicant['middlename'] + lastname = applicant['lastname'] + dobraw = applicant['dob'] dob = parse(dobraw).strftime(self.__genericdateformat()) if dobraw is not None else '' - foirequestapplicantid = applicant['foirequestapplicant.foirequestapplicantid'] - requestortypeid = applicant['requestortype.requestortypeid'] - categoryid = applicant['foirequestapplicant.applicantcategory.applicantcategoryid'] - category = applicant['foirequestapplicant.applicantcategory.name'] + foirequestapplicantid = applicant['foirequestapplicantid'] + requestortypeid = applicant['requestortypeid'] + categoryid = applicant['applicantcategoryid'] + category = applicant['applicantcategory'] businessname = None if requestortypeid == 1: diff --git a/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py b/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py index 7928588b7..d0943bb84 100644 --- a/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py +++ b/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py @@ -148,8 +148,8 @@ def createfoirequestappplicantfromobject(self, requestapplicants, requestid, ver applicantmapping = FOIRequestApplicantMapping() applicantmapping.foirequest_id = requestid applicantmapping.foirequestversion_id = version - applicantmapping.foirequestapplicantid = requestapplicant["foirequestapplicant.foirequestapplicantid"] - applicantmapping.requestortypeid = requestapplicant["requestortype.requestortypeid"] + applicantmapping.foirequestapplicantid = requestapplicant["foirequestapplicantid"] + applicantmapping.requestortypeid = requestapplicant["requestortypeid"] applicantmapping.createdby = userid requestapplicantarr.append(applicantmapping) return requestapplicantarr From 2e22b664f9bea5ec6ab5fb51c67bd9e7042e3c45 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 23 Jan 2024 12:36:38 -0800 Subject: [PATCH 035/147] bug fix --- .../models/FOIRequestApplicants.py | 26 +++++++++++++++---- .../request_api/services/applicantservice.py | 3 +-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index c70e5e406..dc1c2076e 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -10,7 +10,7 @@ from .FOIRequestContactInformation import FOIRequestContactInformation from .FOIRequestPersonalAttributes import FOIRequestPersonalAttribute from .FOIRequestStatus import FOIRequestStatus -from sqlalchemy import and_, or_, func, case +from sqlalchemy import and_, or_, func, text import uuid class FOIRequestApplicant(db.Model): @@ -56,17 +56,33 @@ def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknow @classmethod def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, userid): + + applicantprofile = aliased(FOIRequestApplicant) + applicant_query = db.session.query( FOIRequestApplicant - ).filter_by( - foirequestapplicantid = foirequestapplicantid + ).join( + applicantprofile, + or_( + and_( + applicantprofile.foirequestapplicantid == foirequestapplicantid, + applicantprofile.applicantprofileid == FOIRequestApplicant.applicantprofileid + ), + and_( + FOIRequestApplicant.foirequestapplicantid == foirequestapplicantid, + applicantprofile.applicantprofileid.is_(None) + ) + ) ) - applicant = applicant_query.first() + applicant = applicant_query.order_by(FOIRequestApplicant.foirequestapplicantid.desc()).first() # create an applicant profile id if it's not set if(applicant.applicantprofileid is None): # applicant.isactive = False - applicant_query.update({FOIRequestApplicant.applicantprofileid:str(uuid.uuid4())}) + sql = """update "FOIRequestApplicants" set applicantprofileid = :profileid, updatedby = :userid, updated_at = now() + where foirequestapplicantid = :foirequestapplicantid""" + db.session.execute(text(sql), {'profileid': str(uuid.uuid4()), 'userid':userid, 'foirequestapplicantid': foirequestapplicantid}) + db.session.commit() dob = datetime.strptime(dob, "%Y-%m-%d") if dob is not None and dob != '' else None applicantfromform = FOIRequestApplicant().prepareapplicantforcomparing(firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid) diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index dae384165..a5d20f243 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -55,9 +55,8 @@ def saveapplicantinfo(self, applicantschema, userid): userid ) # replace with applicant id once new save function is written # requests = FOIMinistryRequest.getopenrequestsbyrequestId(applicantschema['foirequestID']) - requests = FOIMinistryRequest.getopenrequestsbyapplicantid(applicantschema['foiRequestApplicantID']) applicantschema['foiRequestApplicantID'] = applicant.identifier - # requests = FOIMinistryRequest.getopenrequestsbyapplicantid(applicantschema['foiRequestApplicantID']) + requests = FOIMinistryRequest.getopenrequestsbyapplicantid(applicantschema['foiRequestApplicantID']) for request in requests: requestschema = requestservicegetter().getrequest(request['foirequest_id'], request['foiministryrequestid']) requestschema.update(applicantschema) From 1bcf64a7533d0da6bbf2af3cd42fb2399e9a61f8 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 23 Jan 2024 13:41:56 -0800 Subject: [PATCH 036/147] add yellow warning color for fields in profile that are different from request fix user trapped with no possible action bug for create new profile --- .../FOIRequest/AdditionalApplicantDetails.js | 15 ++++++++++++- .../FOI/FOIRequest/AddressContanctInfo.js | 21 +++++++++++++++++++ .../FOI/FOIRequest/ApplicantDetails.js | 16 ++++++++++++++ .../FOI/FOIRequest/ApplicantProfileModal.js | 20 ++++++++++++++---- .../foirequest/requestservicecreate.py | 2 +- 5 files changed, 68 insertions(+), 6 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/AdditionalApplicantDetails.js b/forms-flow-web/src/components/FOI/FOIRequest/AdditionalApplicantDetails.js index b5c55b678..220cb52f2 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/AdditionalApplicantDetails.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/AdditionalApplicantDetails.js @@ -10,7 +10,7 @@ import AccordionDetails from '@material-ui/core/AccordionDetails'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -const AdditionalApplicantDetails = React.memo(({requestDetails, createSaveRequestObject, disableInput, defaultExpanded}) => { +const AdditionalApplicantDetails = React.memo(({requestDetails, createSaveRequestObject, disableInput, defaultExpanded, warning}) => { /** * Addition Applicant details box in the UI * No mandatory fields here @@ -24,6 +24,15 @@ const AdditionalApplicantDetails = React.memo(({requestDetails, createSaveReques }, accordionSummary: { flexDirection: 'row-reverse' + }, + warning: { + '& fieldset': { + borderColor: '#ed6c02 !important' + }, + '& label': { + color: '#ed6c02 !important' + } + } }); const classes = useStyles(); @@ -140,6 +149,7 @@ const AdditionalApplicantDetails = React.memo(({requestDetails, createSaveReques inputProps={{ "aria-labelledby": "personalHealthNumber-label"}} InputLabelProps={{ shrink: true, }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER) && classes.warning} value={personalHealthNumberText} onChange={handlePersonalHealthNumber} fullWidth @@ -156,6 +166,7 @@ const AdditionalApplicantDetails = React.memo(({requestDetails, createSaveReques shrink: true, }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.DOB) && classes.warning} fullWidth disabled={disableInput} /> @@ -179,6 +190,7 @@ const AdditionalApplicantDetails = React.memo(({requestDetails, createSaveReques inputProps={{ "aria-labelledby": "correctionsNumber-label"}} InputLabelProps={{ shrink: true, }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.CORRECTIONS_NUMBER) && classes.warning} value={correctionsNumberText} onChange={handleCorrectionsNumber} fullWidth @@ -191,6 +203,7 @@ const AdditionalApplicantDetails = React.memo(({requestDetails, createSaveReques InputLabelProps={{ shrink: true, }} variant="outlined" value={employeeNumberText} + className={warning && warning(FOI_COMPONENT_CONSTANTS.EMPLOYEE_NUMBER) && classes.warning} onChange={handleEmployeeNumber} fullWidth disabled={disableInput} diff --git a/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js b/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js index 60807d59a..8752825bb 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js @@ -23,6 +23,15 @@ const useStyles = makeStyles((_theme) => ({ }, accordionSummary: { flexDirection: 'row-reverse' + }, + warning: { + '& fieldset': { + borderColor: '#ed6c02 !important' + }, + '& label': { + color: '#ed6c02 !important' + } + } })); @@ -37,6 +46,7 @@ const AddressContactDetails = memo( disableInput, defaultExpanded, moreInfoAction, + warning }) => { const classes = useStyles(); /** @@ -328,6 +338,7 @@ const AddressContactDetails = memo( InputLabelProps={{ shrink: true }} value={emailText} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.APPLICANT_EMAIL) && classes.warning} fullWidth required={true} disabled={disableInput} @@ -349,6 +360,7 @@ const AddressContactDetails = memo( label="Home Phone" InputLabelProps={{ shrink: true }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.HOME_PHONE) && classes.warning} value={homePhoneText} onChange={handleHomePhoneChange} fullWidth @@ -362,6 +374,7 @@ const AddressContactDetails = memo( label="Mobile Phone" InputLabelProps={{ shrink: true }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.MOBILE_PHONE) && classes.warning} value={mobilePhoneText} onChange={handleMobilePhoneChange} fullWidth @@ -375,6 +388,7 @@ const AddressContactDetails = memo( label="Work Phone" InputLabelProps={{ shrink: true }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.WORK_PHONE_PRIMARY) && classes.warning} value={workPhonePrimaryText} onChange={handleWorkPhonePrimaryChange} fullWidth @@ -388,6 +402,7 @@ const AddressContactDetails = memo( label="Alternative Phone" InputLabelProps={{ shrink: true }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.WORK_PHONE_SECONDARY) && classes.warning} value={workPhoneSecondaryText} onChange={handleWorkPhoneSecondarChange} fullWidth @@ -403,6 +418,7 @@ const AddressContactDetails = memo( label="Street Address" InputLabelProps={{ shrink: true }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.STREET_ADDRESS_PRIMARY) && classes.warning} value={streetAddressText} onChange={handleStreetAddressChange} fullWidth @@ -418,6 +434,7 @@ const AddressContactDetails = memo( label="Secondary Street Address" InputLabelProps={{ shrink: true }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.STREET_ADDRESS_SECONDARY) && classes.warning} value={secondaryStreetAddressText} onChange={handleScondaryStreetAddressChange} fullWidth @@ -431,6 +448,7 @@ const AddressContactDetails = memo( label="City" InputLabelProps={{ shrink: true }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.CITY) && classes.warning} value={CityText} onChange={handleCityChange} fullWidth @@ -446,6 +464,7 @@ const AddressContactDetails = memo( label="Province" InputLabelProps={{ shrink: true }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.PROVINCE) && classes.warning} value={ProvinceText} onChange={handleProvinceChange} fullWidth @@ -461,6 +480,7 @@ const AddressContactDetails = memo( label="Country" InputLabelProps={{ shrink: true }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.COUNTRY) && classes.warning} value={CountryText} onChange={handleCountryChange} fullWidth @@ -476,6 +496,7 @@ const AddressContactDetails = memo( label="Postal Code" InputLabelProps={{ shrink: true }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.POSTALCODE) && classes.warning} value={PostalText} onChange={handlePostalChange} inputProps={{ maxLength: 6 }} diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantDetails.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantDetails.js index 9c01c5efb..c51a165d7 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantDetails.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantDetails.js @@ -23,6 +23,7 @@ const ApplicantDetails = React.memo( requestStatus, defaultExpanded, showHistory, + warning }) => { const useStyles = makeStyles({ @@ -33,6 +34,15 @@ const ApplicantDetails = React.memo( }, accordionSummary: { flexDirection: 'row-reverse' + }, + warning: { + '& fieldset': { + borderColor: '#ed6c02 !important' + }, + '& label': { + color: '#ed6c02 !important' + } + } }); const classes = useStyles(); @@ -257,6 +267,7 @@ const ApplicantDetails = React.memo( inputProps={{ "aria-labelledby": "firstName-label"}} InputLabelProps={{ shrink: true }} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.APPLICANT_FIRST_NAME) && classes.warning} value={applicantFirstNameText} fullWidth onChange={handleFirtNameChange} @@ -271,6 +282,7 @@ const ApplicantDetails = React.memo( InputLabelProps={{ shrink: true }} value={applicantMiddleNameText} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.APPLICANT_MIDDLE_NAME) && classes.warning} fullWidth disabled={disableInput} onChange={handleMiddleNameChange} @@ -282,6 +294,7 @@ const ApplicantDetails = React.memo( InputLabelProps={{ shrink: true }} value={applicantLastNameText} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.APPLICANT_LAST_NAME) && classes.warning} fullWidth onChange={handleLastNameChange} required={true} @@ -296,6 +309,7 @@ const ApplicantDetails = React.memo( inputProps={{ "aria-labelledby": "organization-label"}} InputLabelProps={{ shrink: true }} value={organizationText} + className={warning && warning(FOI_COMPONENT_CONSTANTS.ORGANIZATION) && classes.warning} variant="outlined" fullWidth disabled={disableInput} @@ -311,6 +325,7 @@ const ApplicantDetails = React.memo( onChange={handleCategoryOnChange} input={} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.FOI_CATEGORY) && classes.warning} fullWidth required disabled={disableInput || disableFieldForMinistryRequest} @@ -325,6 +340,7 @@ const ApplicantDetails = React.memo( InputLabelProps={{ shrink: true }} value={alsoKnownAsText} variant="outlined" + className={warning && warning(FOI_COMPONENT_CONSTANTS.ALSO_KNOWN_AS) && classes.warning} fullWidth disabled={disableInput} onChange={handleAlsoKnownAsChange} diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index ffa373c5a..e765b0fbb 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -349,6 +349,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { if (!createConfirmation) { setCreateConfirmation(true); } else { + dispatch(setFOIRequestApplicantProfile({foiRequestApplicantID: -1})); handleClose(); } } @@ -361,6 +362,14 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } } + const warning = (field) => { + if ([FOI_COMPONENT_CONSTANTS.DOB, FOI_COMPONENT_CONSTANTS.PERSONAL_HEALTH_NUMBER, FOI_COMPONENT_CONSTANTS.ALSO_KNOWN_AS].includes(field)) { + return requestDetails.additionalPersonalInfo?.[field] && requestDetails.additionalPersonalInfo[field] !== saveApplicantObject?.additionalPersonalInfo[field] + } else { + return requestDetails[field] && requestDetails[field] !== saveApplicantObject?.[field] + } + } + return (
@@ -481,6 +490,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { disableInput={false} defaultExpanded={true} showHistory={showApplicantHistory} + warning={warning} /> { handleEmailValidation={() => {}} disableInput={false} defaultExpanded={false} + warning={warning} /> ) : diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index 4563aa746..bc1926a36 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -136,7 +136,7 @@ def __prepareapplicants(self, foirequestschema, userid): selfcategoryid = requestserviceconfigurator().getvalueof("category",foirequestschema.get("category")) if requestservicebuilder().isNotBlankorNone(foirequestschema,"category","main") else None # if foirequestschema.get('foiRequestApplicantID') is None and foirequestschema.get('requeststatusid') == 1: - if foirequestschema.get('foiRequestApplicantID') is not None: + if foirequestschema.get('foiRequestApplicantID', 0) > 0: applicant = FOIRequestApplicant().getlatestprofilebyapplicantid(foirequestschema['foiRequestApplicantID']) requestapplicant = FOIRequestApplicantMapping() requestapplicant.foirequestapplicantid = applicant['foirequestapplicantid'] From 5f77f919edfb00df3aac7669687432b76da5d37e Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 23 Jan 2024 16:59:59 -0800 Subject: [PATCH 037/147] save changes for all intake in progress requests associated to applicants --- .../FOI/FOIRequest/ApplicantProfileModal.js | 2 +- .../request_api/models/FOIRawRequests.py | 12 +++++++++++- .../request_api/services/applicantservice.py | 16 ++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index e765b0fbb..480697762 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -432,7 +432,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { {selectedApplicant ? confirmationMessage ? -
Are you sure you would like to save changes for all open requests?

Please ensure you have checked the Request History to see the request(s) that will be affected.
+
Are you sure you would like to save changes for all open and intake in progress requests associated with this profile?

Please ensure you have checked the Request History to see the request(s) that will be affected.
: (showRequestHistory ? <> diff --git a/request-management-api/request_api/models/FOIRawRequests.py b/request-management-api/request_api/models/FOIRawRequests.py index 9a0169647..05c01c2c2 100644 --- a/request-management-api/request_api/models/FOIRawRequests.py +++ b/request-management-api/request_api/models/FOIRawRequests.py @@ -328,6 +328,16 @@ def get_request(cls,requestid): request = db.session.query(FOIRawRequest).filter_by(requestid=requestid).order_by(FOIRawRequest.version.desc()).first() return request_schema.dump(request) + @classmethod + def getrawrequestsbyapplicantid(cls,applicantid): + request_schema = FOIRawRequestSchema(many=True) + query = db.session.query(FOIRawRequest).distinct(FOIRawRequest.requestid).join( + FOIAssignee, FOIAssignee.username == FOIRawRequest.assignedto + ).filter( + FOIRawRequest.requestrawdata['foiRequestApplicantID'].astext.cast(db.Integer)==applicantid + ).order_by(FOIRawRequest.requestid, FOIRawRequest.version.desc()).all() + return request_schema.dump(query) + @classmethod def getLastStatusUpdateDate(cls,requestid,status): lastupdatedate = None @@ -1022,4 +1032,4 @@ def getlatestsection5pendings(cls): class FOIRawRequestSchema(ma.Schema): class Meta: - fields = ('requestid', 'requestrawdata', 'status','notes','created_at','wfinstanceid','version','updated_at','assignedgroup','assignedto','updatedby','createdby','sourceofsubmission','ispiiredacted','assignee.firstname','assignee.lastname', 'axisrequestid', 'axissyncdate', 'linkedrequests', 'closedate','isiaorestricted') \ No newline at end of file + fields = ('requestid', 'requestrawdata', 'status','notes','created_at','wfinstanceid','version','updated_at','assignedgroup','assignedto','updatedby','createdby','sourceofsubmission','ispiiredacted','assignee.firstname','assignee.middlename', 'assignee.lastname', 'axisrequestid', 'axissyncdate', 'linkedrequests', 'closedate','isiaorestricted') \ No newline at end of file diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index dae384165..8633cd495 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -3,8 +3,10 @@ from re import VERBOSE from request_api.models.FOIRequestApplicants import FOIRequestApplicant from request_api.models.FOIMinistryRequests import FOIMinistryRequest +from request_api.models.FOIRawRequests import FOIRawRequest from request_api.models.ApplicantCategories import ApplicantCategory from request_api.services.requestservice import requestservicegetter, requestservicecreate +from request_api.services.rawrequestservice import rawrequestservice from request_api.auth import AuthHelper from dateutil import tz, parser from flask import jsonify @@ -66,6 +68,20 @@ def saveapplicantinfo(self, applicantschema, userid): ) if not responseschema.success: return responseschema + rawrequests = FOIRawRequest.getrawrequestsbyapplicantid(applicantschema['foiRequestApplicantID']) + for rawrequest in rawrequests: + rawrequest['requestrawdata'].update(applicantschema) + rawrequestservice().saverawrequestversion( + rawrequest['requestrawdata'], + rawrequest['requestid'], + rawrequest['assignedgroup'], + rawrequest['assignedto'], + rawrequest['status'], + userid, + rawrequest['assignee.firstname'], + rawrequest['assignee.middlename'], + rawrequest['assignee.lastname'] + ) return DefaultMethodResult(True,'Applicant Info Updated',applicantschema['foiRequestApplicantID']) def __validateandtransform(self, filterfields): From 17339f014da531b44aa5abc19ca4cb5a625d1d03 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 24 Jan 2024 14:50:24 -0800 Subject: [PATCH 038/147] get raw requests as part of applicant request history separate update for additional personal info as it was being overwritten due to being nested search for all previous applicant ids when updating raw requests update any previous applicant ids in raw request when saving applicant info --- .../request_api/models/FOIRawRequests.py | 6 +++++- .../request_api/services/applicantservice.py | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/request-management-api/request_api/models/FOIRawRequests.py b/request-management-api/request_api/models/FOIRawRequests.py index 05c01c2c2..63ff03841 100644 --- a/request-management-api/request_api/models/FOIRawRequests.py +++ b/request-management-api/request_api/models/FOIRawRequests.py @@ -14,6 +14,7 @@ from .FOIMinistryRequests import FOIMinistryRequest from .FOIRawRequestWatchers import FOIRawRequestWatcher +from .FOIRequestApplicants import FOIRequestApplicant from .FOIAssignees import FOIAssignee import logging from dateutil import parser @@ -331,10 +332,13 @@ def get_request(cls,requestid): @classmethod def getrawrequestsbyapplicantid(cls,applicantid): request_schema = FOIRawRequestSchema(many=True) + applicant_subquery = db.session.query(FOIRequestApplicant.applicantprofileid).filter(FOIRequestApplicant.foirequestapplicantid == applicantid).subquery() + subquery_applicant_id_list = db.session.query(FOIRequestApplicant.foirequestapplicantid).filter(applicant_subquery.c.applicantprofileid == FOIRequestApplicant.applicantprofileid).subquery() query = db.session.query(FOIRawRequest).distinct(FOIRawRequest.requestid).join( FOIAssignee, FOIAssignee.username == FOIRawRequest.assignedto ).filter( - FOIRawRequest.requestrawdata['foiRequestApplicantID'].astext.cast(db.Integer)==applicantid + FOIRawRequest.requestrawdata['foiRequestApplicantID'].astext.cast(db.Integer).in_(subquery_applicant_id_list), + FOIRawRequest.status.notin_(['Archived', 'Closed']) ).order_by(FOIRawRequest.requestid, FOIRawRequest.version.desc()).all() return request_schema.dump(query) diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index 8633cd495..aec22d27f 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -70,7 +70,9 @@ def saveapplicantinfo(self, applicantschema, userid): return responseschema rawrequests = FOIRawRequest.getrawrequestsbyapplicantid(applicantschema['foiRequestApplicantID']) for rawrequest in rawrequests: + additionalPersonalInfo = rawrequest['requestrawdata'].get('additionalPersonalInfo', {}).update(applicantschema.get('additionalPersonalInfo', {})) rawrequest['requestrawdata'].update(applicantschema) + rawrequest['requestrawdata']['additionalPersonalInfo'] = additionalPersonalInfo rawrequestservice().saverawrequestversion( rawrequest['requestrawdata'], rawrequest['requestid'], @@ -182,6 +184,11 @@ def getapplicantrequests(self, applicantid): for request in requests: requestqueue.append(self.__preparerequest(request)) + rawrequests = FOIRawRequest.getrawrequestsbyapplicantid(applicantid) + if rawrequests is not None: + for request in rawrequests: + requestqueue.append(self.__preparerawrequest(request)) + return requestqueue def __preparerequest(self, request): @@ -193,4 +200,14 @@ def __preparerequest(self, request): 'requeststatus': request["requeststatus"], 'receiveddate': request["receiveddate"], 'description': request["description"], + } + + def __preparerawrequest(self, request): + return { + 'foirequestapplicantid': request["requestrawdata"]['foiRequestApplicantID'], + 'axisrequestid': request["axisrequestid"], + 'filenumber': 'U-00' + str(request["requestid"]), + 'requeststatus': request["status"], + 'receiveddate': request["requestrawdata"]["receivedDate"], + 'description': request["requestrawdata"]["description"], } \ No newline at end of file From 2f1a40e0d0edefeb99091047ee6d643a1c65f394 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 24 Jan 2024 15:25:11 -0800 Subject: [PATCH 039/147] disable open state only instead of entire dropdown if user has not selected profile --- .../components/FOI/FOIRequest/AddressContanctInfo.js | 7 +++---- .../FOI/FOIRequest/ApplicantProfileModal.js | 7 ++++--- .../src/components/FOI/FOIRequest/FOIRequest.js | 1 - forms-flow-web/src/components/FOI/FOIRequest/utils.js | 4 ++++ .../components/FOI/customComponents/StateDropDown.js | 11 ++++++++--- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js b/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js index 8752825bb..331554b1f 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js @@ -9,8 +9,7 @@ import AccordionSummary from '@material-ui/core/AccordionSummary'; import AccordionDetails from '@material-ui/core/AccordionDetails'; import Typography from '@material-ui/core/Typography'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import ApplicantProfileModal from "./ApplicantProfileModal"; -import { StateEnum } from "../../../constants/FOI/statusEnum"; +import { isBeforeOpen } from "./utils"; const useStyles = makeStyles((_theme) => ({ row: { @@ -320,9 +319,9 @@ const AddressContactDetails = memo( type="button" className={`btn btn-link btn-description-history`} onClick={moreInfoAction} - style={(requestDetails.currentState === StateEnum.intakeinprogress.name && !requestDetails.foiRequestApplicantID) ? {color: "#9E2929"} : {}} + style={(isBeforeOpen(requestDetails) && !requestDetails.foiRequestApplicantID) ? {color: "#9E2929"} : {}} > - {(!requestDetails.stateTransition?.filter(s => s.status === StateEnum.open.name).length > 0) && 'Search' } Applicant Profiles + {(isBeforeOpen(requestDetails)) && 'Search' } Applicant Profiles } {/* ({ root: { @@ -132,7 +133,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { useEffect(() => { if (modalOpen) { setIsLoading(true); - if (!requestDetails.stateTransition?.filter(s => s.status === StateEnum.open.name).length > 0) { + if (isBeforeOpen(requestDetails)) { dispatch(fetchPotentialApplicants( requestDetails.firstName, requestDetails.lastName, @@ -328,7 +329,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const back = () => { if (applicantHistory) { setApplicantHistory(false); - } else if (requestDetails.stateTransition?.filter(s => s.status === StateEnum.open.name).length > 0) { + } else if (!isBeforeOpen(requestDetails)) { handleClose(); } else { setSelectedApplicant(false); @@ -355,7 +356,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { } const isSaveDisabled = () => { - if (!requestDetails.stateTransition?.filter(s => s.status === StateEnum.open.name).length > 0) { + if (isBeforeOpen(requestDetails)) { return isProfileDifferent } else { return _.isEqual(selectedApplicant, saveApplicantObject) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index f61135e2e..ccd1df7aa 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -936,7 +936,6 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { isMinistryCoordinator={false} isValidationError={isValidationError} requestType={requestDetails?.requestType} - disabled={requestDetails.currentState === StateEnum.intakeinprogress.name && !requestDetails.foiRequestApplicantID} />
diff --git a/forms-flow-web/src/components/FOI/FOIRequest/utils.js b/forms-flow-web/src/components/FOI/FOIRequest/utils.js index f4aa33500..ddf6bf5d9 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/utils.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/utils.js @@ -58,6 +58,10 @@ const getcfrDaysRemainingText = (_cfrDaysRemaining) => { return`CFR Due in ${_cfrDaysRemaining} Days` }; +export const isBeforeOpen = (requestDetails) => { + return !requestDetails.stateTransition?.filter(s => s.status === StateEnum.open.name).length > 0; +}; + export const getExtensionsCountText = (extensions) => { if (!extensions || extensions.length < 1) { return `Extensions 0`; diff --git a/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js b/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js index bb6fcdbb0..333a8d824 100644 --- a/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js +++ b/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js @@ -11,6 +11,7 @@ import { import { useSelector } from "react-redux"; import FOI_COMPONENT_CONSTANTS from "../../../constants/FOI/foiComponentConstants"; +import { isBeforeOpen } from "../FOIRequest/utils"; const StateDropDown = ({ requestState = StateEnum.unopened.name, @@ -207,12 +208,16 @@ const StateDropDown = ({ return []; } }; - const getDisableMenuItem = (index) => { + const getDisableMenuItem = (index, status) => { if (index === 0) { return false; } - return isValidationError || requestState === StateEnum.unopened.name; + return isValidationError || requestState === StateEnum.unopened.name || + (isBeforeOpen(requestDetails) + && status === 'Open' + && !requestDetails.foiRequestApplicantID + ); }; const statusList = getStatusList(); const menuItems = @@ -220,7 +225,7 @@ const StateDropDown = ({ statusList.map((item, index) => { return ( Date: Wed, 24 Jan 2024 17:06:38 -0800 Subject: [PATCH 040/147] migrate latest categoryid to applicant table --- .../versions/ba218164248e_add_category_to_applicant.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py b/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py index 1c474582c..73a28fdab 100644 --- a/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py +++ b/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py @@ -27,9 +27,13 @@ def upgrade(): set applicantcategoryid = subquery.applicantcategoryid from ( select public."FOIRequestApplicantMappings".foirequestapplicantid, public."FOIRequests".applicantcategoryid - from public."FOIRequestApplicantMappings" + from ( + select max(public."FOIRequestApplicantMappings".foirequestapplicantmappingid) as foirequestapplicantmappingid + from public."FOIRequestApplicantMappings" + group by public."FOIRequestApplicantMappings".foirequestapplicantid + ) as maxmappingid + join public."FOIRequestApplicantMappings" on public."FOIRequestApplicantMappings".foirequestapplicantmappingid = maxmappingid.foirequestapplicantmappingid join public."FOIRequests" on public."FOIRequests".foirequestid = public."FOIRequestApplicantMappings".foirequest_id and public."FOIRequests".version = public."FOIRequestApplicantMappings".foirequestversion_id - group by public."FOIRequestApplicantMappings".foirequestapplicantid, public."FOIRequests".applicantcategoryid ) as subquery where public."FOIRequestApplicants".foirequestapplicantid = subquery.foirequestapplicantid ''' From 033df00b8fbe975e0fd40f8beeea28df6e66b641 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 25 Jan 2024 15:36:57 -0800 Subject: [PATCH 041/147] minor ux improvements --- .../FOI/FOIRequest/ApplicantProfileModal.js | 29 +++++++++++-------- .../components/FOI/FOIRequest/foirequest.scss | 6 ++++ .../models/FOIRequestApplicants.py | 4 ++- .../request_api/services/applicantservice.py | 3 ++ 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index 9ec25b617..7c81a3bff 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -112,6 +112,16 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { field: "filenumber", headerName: "REQUEST ID", flex: 1, + renderCell: (params) => { + return + + {params.row.filenumber} + + + } }, { field: "requeststatus", @@ -357,7 +367,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const isSaveDisabled = () => { if (isBeforeOpen(requestDetails)) { - return isProfileDifferent + return false } else { return _.isEqual(selectedApplicant, saveApplicantObject) } @@ -373,7 +383,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { return ( -
+
{
- + {selectedApplicant ? confirmationMessage ?
Are you sure you would like to save changes for all open and intake in progress requests associated with this profile?

Please ensure you have checked the Request History to see the request(s) that will be affected.
: (showRequestHistory ? <> - + 'auto'} @@ -593,18 +604,12 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { - + Date: Fri, 26 Jan 2024 13:15:28 -0800 Subject: [PATCH 042/147] fix get profile by applicant id when profile id has not been created yet --- .../src/components/FOI/FOIRequest/ApplicantProfileModal.js | 4 ++-- .../request_api/models/FOIRequestApplicants.py | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index 7c81a3bff..3c4359d4c 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -109,7 +109,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { const requestHistoryColumns = [ { - field: "filenumber", + field: "axisrequestid", headerName: "REQUEST ID", flex: 1, renderCell: (params) => { @@ -118,7 +118,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { "/foi/foirequests/" + params.row.requestid + "/ministryrequest/" + params.row.ministryrequestid : "/foi/reviewrequest/" + params.row.requestid } target="_blank"> - {params.row.filenumber} + {params.row.axisrequestid} } diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 9596a03b8..255f59a0e 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -107,8 +107,10 @@ def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, midd @classmethod def getlatestprofilebyapplicantid(cls, applicantid): schema = FOIRequestApplicantSchema(many=False) - sq = db.session.query(FOIRequestApplicant.applicantprofileid).filter_by(foirequestapplicantid=applicantid) - query = db.session.query(FOIRequestApplicant).filter(FOIRequestApplicant.applicantprofileid.in_(sq)).order_by(FOIRequestApplicant.foirequestapplicantid.desc()).first() + sq = db.session.query(FOIRequestApplicant).filter_by(foirequestapplicantid=applicantid).first() + if not sq.applicantprofileid: + return schema.dump(sq) + query = db.session.query(FOIRequestApplicant).filter(FOIRequestApplicant.applicantprofileid == sq.applicantprofileid).order_by(FOIRequestApplicant.foirequestapplicantid.desc()).first() return schema.dump(query) # Search applicant by id From a6f5dea40b8798431322ed059dc77e8a7800f49d Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Fri, 26 Jan 2024 17:17:43 -0800 Subject: [PATCH 043/147] bug fix --- .../ba218164248e_add_category_to_applicant.py | 18 +++++++++++++ .../request_api/models/FOIMinistryRequests.py | 26 ++++++++++++------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py b/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py index 73a28fdab..df4acd841 100644 --- a/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py +++ b/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py @@ -30,12 +30,30 @@ def upgrade(): from ( select max(public."FOIRequestApplicantMappings".foirequestapplicantmappingid) as foirequestapplicantmappingid from public."FOIRequestApplicantMappings" + where public."FOIRequestApplicantMappings".requestortypeid = 1 group by public."FOIRequestApplicantMappings".foirequestapplicantid ) as maxmappingid join public."FOIRequestApplicantMappings" on public."FOIRequestApplicantMappings".foirequestapplicantmappingid = maxmappingid.foirequestapplicantmappingid join public."FOIRequests" on public."FOIRequests".foirequestid = public."FOIRequestApplicantMappings".foirequest_id and public."FOIRequests".version = public."FOIRequestApplicantMappings".foirequestversion_id ) as subquery where public."FOIRequestApplicants".foirequestapplicantid = subquery.foirequestapplicantid + and public."FOIRequestApplicants".foirequestapplicantid not in ( + select foirequestapplicantid from ( + select foirequestapplicantid, count(applicantcategoryid) c from ( + select + public."FOIRequestApplicantMappings".foirequestapplicantid, + public."FOIRequests".applicantcategoryid + from public."FOIRequestApplicantMappings" + join public."FOIRequests" on + public."FOIRequests".foirequestid = public."FOIRequestApplicantMappings".foirequest_id + and public."FOIRequests".version = public."FOIRequestApplicantMappings".foirequestversion_id + where public."FOIRequestApplicantMappings".requestortypeid = 1 + group by public."FOIRequestApplicantMappings".foirequestapplicantid, public."FOIRequests".applicantcategoryid + ) as subquery2 + group by foirequestapplicantid + -- order by count(applicantcategoryid) desc, foirequestapplicantid + ) as subquery1 where c > 1 + ) ''' ) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index dac8bc5cd..40311402a 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -238,29 +238,35 @@ def getopenrequestsbyapplicantid(cls,applicantid): selectedcolumns = [FOIMinistryRequest.foirequest_id, FOIMinistryRequest.foiministryrequestid] + #aliase for getting applicants by profileid + applicant = aliased(FOIRequestApplicant) + #subquery for getting latest version & proper group/team for FOIMinistryRequest - subquery_applicant_maxid = _session.query(FOIRequestApplicant.applicantprofileid, func.max(FOIRequestApplicant.foirequestapplicantid).label('max_id')).group_by(FOIRequestApplicant.applicantprofileid).subquery() - joincondition_applicant = [ - subquery_applicant_maxid.c.applicantprofileid == FOIRequestApplicant.applicantprofileid, - subquery_applicant_maxid.c.max_id == FOIRequestApplicantMapping.foirequestapplicantid, + subquery_ministry_maxversion = _session.query(FOIMinistryRequest.foirequest_id, func.max(FOIMinistryRequest.foirequestversion_id).label('max_version')).group_by(FOIMinistryRequest.foirequest_id).subquery() + joincondition_ministry = [ + subquery_ministry_maxversion.c.foirequest_id == FOIRequestApplicantMapping.foirequest_id, + subquery_ministry_maxversion.c.max_version == FOIRequestApplicantMapping.foirequestversion_id, ] query = db.session.query( *selectedcolumns ).distinct( FOIMinistryRequest.foiministryrequestid + ).join( + applicant, + applicant.foirequestapplicantid == applicantid, + ).join( + FOIRequestApplicant, + FOIRequestApplicant.applicantprofileid == applicant.applicantprofileid, ).join( FOIRequestApplicantMapping, and_( + FOIRequestApplicantMapping.foirequestapplicantid == FOIRequestApplicant.foirequestapplicantid, FOIRequestApplicantMapping.foirequest_id == FOIMinistryRequest.foirequest_id, - FOIRequestApplicantMapping.foirequestversion_id == FOIMinistryRequest.foirequestversion_id, FOIRequestApplicantMapping.requestortypeid == RequestorType['applicant'].value) ).join( - FOIRequestApplicant, - FOIRequestApplicant.foirequestapplicantid == applicantid, - ).join( - subquery_applicant_maxid, - and_(*joincondition_applicant) + subquery_ministry_maxversion, + and_(*joincondition_ministry) ).filter( # FOIRequestApplicant.foirequestapplicantid == applicantid, FOIMinistryRequest.requeststatusid != 3 From 76768c67dec70aa692ce7a31a384ad98b49d4af2 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Mon, 29 Jan 2024 12:02:36 -0800 Subject: [PATCH 044/147] fix migration conflicts --- .../versions/59a97f42b5f2_add_profileid_to_applicant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py b/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py index 54f46603a..add4b87fc 100644 --- a/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py +++ b/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. revision = '59a97f42b5f2' -down_revision = '7fa7236d06fb' +down_revision = 'b4da31675bd0' branch_labels = None depends_on = None From 0977b4bf905b0beb0dfb76be7ee9adcee25a7588 Mon Sep 17 00:00:00 2001 From: nkan-aot2 <156717133+nkan-aot2@users.noreply.github.com> Date: Mon, 29 Jan 2024 14:39:33 -0800 Subject: [PATCH 045/147] Fix overwritten status enum update in merge --- .../request_api/models/FOIRawRequests.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/request-management-api/request_api/models/FOIRawRequests.py b/request-management-api/request_api/models/FOIRawRequests.py index 332c9278f..8bda3b5a7 100644 --- a/request-management-api/request_api/models/FOIRawRequests.py +++ b/request-management-api/request_api/models/FOIRawRequests.py @@ -877,14 +877,14 @@ def getfilterforrequeststate(cls, params, includeclosed): #request state: unopened, call for records, etc. requeststatecondition = [] for state in params['requeststate']: - if(state == '3'): + if(state == StateName.closed.name): requeststatecondition.append(FOIRawRequest.status == StateName.closed.value) includeclosed = True - elif(state == '4'): + elif(state == StateName.redirect.name): requeststatecondition.append(FOIRawRequest.status == StateName.redirect.value) - elif(state == '5'): + elif(state == StateName.unopened.name): requeststatecondition.append(FOIRawRequest.status == StateName.unopened.value) - elif(state == '6'): + elif(state == StateName.intakeinprogress.name): requeststatecondition.append(FOIRawRequest.status == StateName.intakeinprogress.value) if(len(requeststatecondition) == 0): @@ -1055,4 +1055,4 @@ def getlatestsection5pendings(cls): class FOIRawRequestSchema(ma.Schema): class Meta: - fields = ('requestid', 'requestrawdata', 'status', 'requeststatuslabel', 'notes','created_at','wfinstanceid','version','updated_at','assignedgroup','assignedto','updatedby','createdby','sourceofsubmission','ispiiredacted','assignee.firstname','assignee.lastname', 'axisrequestid', 'axissyncdate', 'linkedrequests', 'closedate','isiaorestricted') \ No newline at end of file + fields = ('requestid', 'requestrawdata', 'status', 'requeststatuslabel', 'notes','created_at','wfinstanceid','version','updated_at','assignedgroup','assignedto','updatedby','createdby','sourceofsubmission','ispiiredacted','assignee.firstname','assignee.lastname', 'axisrequestid', 'axissyncdate', 'linkedrequests', 'closedate','isiaorestricted') From 20fcefd411888f45b1a5f304a9de358357bd8bb7 Mon Sep 17 00:00:00 2001 From: nkan-aot2 <156717133+nkan-aot2@users.noreply.github.com> Date: Tue, 30 Jan 2024 11:41:00 -0800 Subject: [PATCH 046/147] get full state transition list for raw requests --- .../request_api/services/rawrequest/rawrequestservicegetter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/request-management-api/request_api/services/rawrequest/rawrequestservicegetter.py b/request-management-api/request_api/services/rawrequest/rawrequestservicegetter.py index b8b1cf870..f6d11284f 100644 --- a/request-management-api/request_api/services/rawrequest/rawrequestservicegetter.py +++ b/request-management-api/request_api/services/rawrequest/rawrequestservicegetter.py @@ -64,8 +64,7 @@ def getrawrequestforid(self, requestid): request['requestrawdata']['currentState'] = request['status'] request['requestrawdata']['requeststatuslabel'] = request['requeststatuslabel'] request['requestrawdata']['lastStatusUpdateDate'] = FOIRawRequest.getLastStatusUpdateDate(requestid, request['status']).strftime(self.__generaldateformat()) - if request['requeststatuslabel'] == StateName.closed.name: - request['requestrawdata']['stateTransition']= FOIRawRequest.getstatesummary(requestid) + request['requestrawdata']['stateTransition']= FOIRawRequest.getstatesummary(requestid) request['requestrawdata']['wfinstanceid'] = request['wfinstanceid'] request['requestrawdata']['closedate']= self.__getclosedate(request['closedate']) request['requestrawdata']['isiaorestricted']= request['isiaorestricted'] if request['isiaorestricted'] is not None else False From 3a8ab8e1cd876afc703fd1d4452d1c362afec5b0 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 30 Jan 2024 11:54:28 -0800 Subject: [PATCH 047/147] disable click on request history --- forms-flow-web/src/apiManager/httpRequestHandler/index.js | 2 +- .../src/components/FOI/FOIRequest/ApplicantProfileModal.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forms-flow-web/src/apiManager/httpRequestHandler/index.js b/forms-flow-web/src/apiManager/httpRequestHandler/index.js index ca6dcea9b..48cf87b76 100644 --- a/forms-flow-web/src/apiManager/httpRequestHandler/index.js +++ b/forms-flow-web/src/apiManager/httpRequestHandler/index.js @@ -4,7 +4,7 @@ import UserService from "../../services/UserService"; export const httpGETRequest = (url, data, token, isBearer = true) => { return axios.get(url, { params: data, - timeout: 60000, + timeout: 300000, headers: { Authorization: isBearer ? `Bearer ${token || UserService.getToken()}` diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index 3c4359d4c..47d0c2c2a 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -456,7 +456,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { headerHeight={50} hideFooter={true} loading={isLoading} - onRowClick={selectApplicantRow} + // onRowClick={selectApplicantRow} getRowHeight={() => 'auto'} getRowId={(row) => row.filenumber} /> From a9ebe827d9b2cffd1f079f7cf6f1366751da1ce8 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 30 Jan 2024 14:29:14 -0800 Subject: [PATCH 048/147] bug fix: request history show archived raw requests --- .../request_api/models/FOIRawRequests.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/request-management-api/request_api/models/FOIRawRequests.py b/request-management-api/request_api/models/FOIRawRequests.py index 2078801d8..1118a9ac4 100644 --- a/request-management-api/request_api/models/FOIRawRequests.py +++ b/request-management-api/request_api/models/FOIRawRequests.py @@ -339,12 +339,23 @@ def getrawrequestsbyapplicantid(cls,applicantid): request_schema = FOIRawRequestSchema(many=True) applicant_subquery = db.session.query(FOIRequestApplicant.applicantprofileid).filter(FOIRequestApplicant.foirequestapplicantid == applicantid).subquery() subquery_applicant_id_list = db.session.query(FOIRequestApplicant.foirequestapplicantid).filter(applicant_subquery.c.applicantprofileid == FOIRequestApplicant.applicantprofileid).subquery() + + #subquery for getting the latest version + subquery_maxversion = db.sessio.query(FOIRawRequest.requestid, func.max(FOIRawRequest.version).label('max_version')).group_by(FOIRawRequest.requestid).subquery() + joincondition = [ + subquery_maxversion.c.requestid == FOIRawRequest.requestid, + subquery_maxversion.c.max_version == FOIRawRequest.version, + ] + query = db.session.query(FOIRawRequest).distinct(FOIRawRequest.requestid).join( FOIAssignee, FOIAssignee.username == FOIRawRequest.assignedto + ).join( + subquery_maxversion, + and_(*joincondition) ).filter( FOIRawRequest.requestrawdata['foiRequestApplicantID'].astext.cast(db.Integer).in_(subquery_applicant_id_list), FOIRawRequest.status.notin_(['Archived', 'Closed']) - ).order_by(FOIRawRequest.requestid, FOIRawRequest.version.desc()).all() + ).order_by(FOIRawRequest.requestid.desc()).all() return request_schema.dump(query) @classmethod From 7bc026acc4f0eb946292fddf43868ff8ce0478b1 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 30 Jan 2024 14:31:42 -0800 Subject: [PATCH 049/147] revert local configuration --- forms-flow-web/src/apiManager/httpRequestHandler/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forms-flow-web/src/apiManager/httpRequestHandler/index.js b/forms-flow-web/src/apiManager/httpRequestHandler/index.js index 48cf87b76..ca6dcea9b 100644 --- a/forms-flow-web/src/apiManager/httpRequestHandler/index.js +++ b/forms-flow-web/src/apiManager/httpRequestHandler/index.js @@ -4,7 +4,7 @@ import UserService from "../../services/UserService"; export const httpGETRequest = (url, data, token, isBearer = true) => { return axios.get(url, { params: data, - timeout: 300000, + timeout: 60000, headers: { Authorization: isBearer ? `Bearer ${token || UserService.getToken()}` From e9a1d64fb93d7f9252f9d17aaa99056cad11ad03 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 30 Jan 2024 14:43:09 -0800 Subject: [PATCH 050/147] typo --- request-management-api/request_api/models/FOIRawRequests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/models/FOIRawRequests.py b/request-management-api/request_api/models/FOIRawRequests.py index 1118a9ac4..2ce37405c 100644 --- a/request-management-api/request_api/models/FOIRawRequests.py +++ b/request-management-api/request_api/models/FOIRawRequests.py @@ -341,7 +341,7 @@ def getrawrequestsbyapplicantid(cls,applicantid): subquery_applicant_id_list = db.session.query(FOIRequestApplicant.foirequestapplicantid).filter(applicant_subquery.c.applicantprofileid == FOIRequestApplicant.applicantprofileid).subquery() #subquery for getting the latest version - subquery_maxversion = db.sessio.query(FOIRawRequest.requestid, func.max(FOIRawRequest.version).label('max_version')).group_by(FOIRawRequest.requestid).subquery() + subquery_maxversion = db.session.query(FOIRawRequest.requestid, func.max(FOIRawRequest.version).label('max_version')).group_by(FOIRawRequest.requestid).subquery() joincondition = [ subquery_maxversion.c.requestid == FOIRawRequest.requestid, subquery_maxversion.c.max_version == FOIRawRequest.version, From 03a48bc019f497b85cc30b83fc64cc95c3fe4baa Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 30 Jan 2024 15:22:06 -0800 Subject: [PATCH 051/147] fix recevie date format --- .../request_api/models/FOIRequestApplicants.py | 3 --- .../request_api/services/applicantservice.py | 4 +++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 255f59a0e..aa1cb40fd 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -366,9 +366,6 @@ def getapplicantbyid(cls, applicantid): func.array_agg(subquery_all.c.phn).label('phn') ).group_by(subquery_all.c.foirequestapplicantid) - - print("query_by_id", query_aggregate) - applicantprofile_schema = ApplicantProfileSchema() return applicantprofile_schema.dump(query_aggregate.first()) diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index 23de73d92..da51cbb55 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -14,6 +14,7 @@ from request_api.utils.commons.datetimehandler import datetimehandler from request_api.models.default_method_result import DefaultMethodResult import re +import maya class applicantservice: """ FOI Event Dashboard @@ -210,6 +211,7 @@ def __preparerawrequest(self, request): 'filenumber': 'U-00' + str(request["requestid"]), 'requestid': request["requestid"], 'requeststatus': request["status"], - 'receiveddate': request["requestrawdata"]["receivedDate"], + 'receiveddate': maya.parse(request["requestrawdata"]["receivedDate"]).datetime(to_timezone='America/Vancouver', naive=False).strftime('%^b %d %Y'), + # 'receiveddate': request["requestrawdata"]["receivedDate"], 'description': request["requestrawdata"]["description"], } \ No newline at end of file From 60abb45bfa7a316cb64066fafed72c36dc80cecb Mon Sep 17 00:00:00 2001 From: nkan-aot2 <156717133+nkan-aot2@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:22:55 -0800 Subject: [PATCH 052/147] fix title for different modal states --- .../FOI/FOIRequest/ApplicantProfileModal.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index 47d0c2c2a..03a65ac1d 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -396,7 +396,11 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { {selectedApplicant ?

- Saving Changes to Applicant Profile : + applicantHistory ? + <>Applicant History : + <> setShowRequestHistory(false)} disableRipple className={clsx("request-history-header applicant-profile-header", { @@ -427,11 +431,11 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { })} > Request History ({requestHistory?.length}) - + }

:

- Search Applicants + {createConfirmation ? <>Create New Profile : <>Search Applicants}

} @@ -661,4 +665,4 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { ); }); -export default ApplicantProfileModal; \ No newline at end of file +export default ApplicantProfileModal; From 319cf8bc7c7618a33ed034929f6d84964f8d6aca Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 30 Jan 2024 16:40:12 -0800 Subject: [PATCH 053/147] fix applicant info being editable in request form after profile has been selected in intake state --- forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index ef77e8425..00f950a45 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -1259,7 +1259,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { handleApplicantDetailsValue } createSaveRequestObject={createSaveRequestObject} - disableInput={disableInput || ministryId} + disableInput={disableInput || requestDetails?.foiRequestApplicantID > 0} defaultExpanded={!closeApplicantDetails(userDetail, requestDetails?.requestType)} /> {requiredRequestDetailsValues.requestType.toLowerCase() === @@ -1292,7 +1292,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { handleContactDetailsInitialValue } handleContanctDetailsValue={handleContanctDetailsValue} - disableInput={disableInput || ministryId} + disableInput={disableInput || requestDetails?.foiRequestApplicantID > 0} handleEmailValidation={handleEmailValidation} defaultExpanded={!closeContactInfo(userDetail,requestDetails)} moreInfoAction={openApplicantProfileModal} @@ -1340,7 +1340,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { 0} defaultExpanded={true} /> )} From 731b07120b3d1065332773f5c13eec80a387049f Mon Sep 17 00:00:00 2001 From: nkan-aot2 <156717133+nkan-aot2@users.noreply.github.com> Date: Wed, 7 Feb 2024 11:17:27 -0800 Subject: [PATCH 054/147] test application fee receipt failure --- request-management-api/request_api/resources/fee.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/resources/fee.py b/request-management-api/request_api/resources/fee.py index ee2b24cf2..7b4e7eeea 100644 --- a/request-management-api/request_api/resources/fee.py +++ b/request-management-api/request_api/resources/fee.py @@ -132,7 +132,7 @@ def post(request_id: int, payment_id: int): return Response( response= response.content, - status= response.status_code, + status= 400, #response.status_code, headers= dict(response.headers) ) From 3365cff34618d0027535dc4dae6297b6f45aa13f Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 10:22:22 -0800 Subject: [PATCH 055/147] generate report of unopened unactioned reqeusts and their potential matches --- docker-compose.yml | 4 + .../migrations/versions/d42a1cf67c5c_.py | 35 ++++ .../request_api/models/FOIRawRequests.py | 71 ++++++++ .../request_api/models/UnopenedReport.py | 22 +++ .../request_api/resources/request.py | 21 ++- .../services/email/senderservice.py | 4 +- .../request_api/services/emailservice.py | 3 +- .../services/unopenedreportservice.py | 153 ++++++++++++++++++ request-management-api/requirements.txt | 1 + sample.env | 7 +- 10 files changed, 316 insertions(+), 5 deletions(-) create mode 100644 request-management-api/migrations/versions/d42a1cf67c5c_.py create mode 100644 request-management-api/request_api/models/UnopenedReport.py create mode 100644 request-management-api/request_api/services/unopenedreportservice.py diff --git a/docker-compose.yml b/docker-compose.yml index 77423470b..3bcafd591 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -110,6 +110,10 @@ services: - EVENT_QUEUE_PDFSTITCH_LARGE_FILE_STREAMKEY=${EVENT_QUEUE_PDFSTITCH_LARGE_FILE_STREAMKEY} - STREAM_SEPARATION_FILE_SIZE_LIMIT=${STREAM_SEPARATION_FILE_SIZE_LIMIT} - MUTE_NOTIFICATION=${MUTE_NOTIFICATION} + - UNOPENED_REPORT_CUTOFF_DAYS=${UNOPENED_REPORT_CUTOFF_DAYS} + - UNOPENED_REPORT_WAIT_DAYS=${UNOPENED_REPORT_WAIT_DAYS} + - UNOPENED_REPORT_JARO_CUTOFF=${UNOPENED_REPORT_JARO_CUTOFF} + - UNOPENED_REPORT_EMAIL_RECIPIENT=${UNOPENED_REPORT_EMAIL_RECIPIENT} #- LOG_ROOT=${LOG_ROOT} #- LOG_BASIC=${LOG_BASIC} #- LOG_TRACING=${LOG_TRACING} diff --git a/request-management-api/migrations/versions/d42a1cf67c5c_.py b/request-management-api/migrations/versions/d42a1cf67c5c_.py new file mode 100644 index 000000000..39aec13f4 --- /dev/null +++ b/request-management-api/migrations/versions/d42a1cf67c5c_.py @@ -0,0 +1,35 @@ +"""empty message + +Revision ID: d42a1cf67c5c +Revises: ba218164248e +Create Date: 2024-02-08 12:40:33.968711 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision = 'd42a1cf67c5c' +down_revision = 'ba218164248e' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('UnopenedReport', + sa.Column('id', sa.Integer(), primary_key=True, autoincrement=True, nullable=False), + sa.Column('rawrequestid', sa.Integer(), nullable=False), + sa.Column('date', sa.DateTime(), nullable=True), + sa.Column('rank', sa.Integer(), nullable=False), + sa.Column('potentialmatches', postgresql.JSON(astext_type=sa.Text()), nullable=True) + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.execute('DROP TABLE IF EXISTS public."UnopenedReport";') + + # ### end Alembic commands ### diff --git a/request-management-api/request_api/models/FOIRawRequests.py b/request-management-api/request_api/models/FOIRawRequests.py index 2ce37405c..f217d5a3b 100644 --- a/request-management-api/request_api/models/FOIRawRequests.py +++ b/request-management-api/request_api/models/FOIRawRequests.py @@ -1098,6 +1098,77 @@ def getlatestsection5pendings(cls): finally: db.session.close() return section5pendings + + @classmethod + def getunopenedunactionedrequests(cls, startdate, enddate): + try: + requests = [] + sql = '''select rr.created_at, rr.requestrawdata, rr.requestid, p.status from public."FOIRawRequests" rr + join ( + select max(version) as version, requestid from public."FOIRawRequests" + group by requestid + ) mv on mv.requestid = rr.requestid and mv.version = rr.version + join ( + select request_id, max(payment_id) from public."Payments" + where fee_code_id = 1 + group by request_id + order by request_id + ) mp + join public."Payments" p on p.payment_id = mp.max + where status = 'Unopened' and rr.version = 1 and created_at > :cutoffdate and created_at < :enddate + order by rr.requestid ''' + rs = db.session.execute(text(sql), {'startdate': startdate, 'enddate': enddate}) + for row in rs: + requests.append({ + "requestid": row["requestid"], + "created_at": row["created_at"], + "requestrawdata": row["requestrawdata"], + "paymentstatus": row["status"] + }) + except Exception as ex: + logging.error(ex) + raise ex + finally: + db.session.close() + return requests + + @classmethod + def getpotentialactionedmatches(cls, request): + try: + requests = [] + sql = '''select rr.created_at, rr.* from public."FOIRawRequests" rr + join ( + select max(version) as version, requestid from public."FOIRawRequests" + group by requestid + ) mv on mv.requestid = rr.requestid and mv.version = rr.version + where status = 'Intake in Progress' and ( + requestrawdata->>'lastName' ilike :lastName + or requestrawdata->>'firstName' ilike :firstName + or requestrawdata->>'email' ilike :email + or requestrawdata->>'address' ilike :address + or requestrawdata->>'phonePrimary' ilike :phonePrimary + or requestrawdata->>'postal' ilike :postal + ) and substring(rr.requestrawdata->>'receivedDateUF', 1, 10) = :receiveddate + order by requestid desc, version desc ''' + rs = db.session.execute(text(sql), { + 'lastName': request['requestrawdata']['contactInfo']['lastName'], + 'firstName': request['requestrawdata']['contactInfo']['firstName'], + 'email': request['requestrawdata']['contactInfoOptions']['email'], + 'address': request['requestrawdata']['contactInfoOptions']['address'], + 'phonePrimary': request['requestrawdata']['contactInfoOptions']['phonePrimary'], + 'postal': request['requestrawdata']['contactInfoOptions']['postal'], + 'receiveddate': request['requestrawdata']['receivedDateUF'][0:10], + }) + for row in rs: + requests.append({"requestid": row["requestid"], "created_at": row["created_at"], "requestrawdata": row["requestrawdata"]}) + except Exception as ex: + logging.error(ex) + raise ex + finally: + db.session.close() + return requests + + class FOIRawRequestSchema(ma.Schema): class Meta: diff --git a/request-management-api/request_api/models/UnopenedReport.py b/request-management-api/request_api/models/UnopenedReport.py new file mode 100644 index 000000000..dd8a75f43 --- /dev/null +++ b/request-management-api/request_api/models/UnopenedReport.py @@ -0,0 +1,22 @@ +from .db import db, ma +from .default_method_result import DefaultMethodResult +from sqlalchemy.orm import relationship,backref +from datetime import datetime +from sqlalchemy import text +from sqlalchemy.dialects.postgresql import JSON +import json + +class UnopenedReport(db.Model): + __tablename__ = 'UnopenedReport' + # Defining the columns + id = db.Column(db.Integer, primary_key=True,autoincrement=True) + rawrequestid = db.Column(db.Text, unique=False, nullable=False) + date = db.Column(db.Text, unique=False, nullable=False) + rank = db.Column(db.Text, unique=False, nullable=False) + potentialmatches = db.Column(JSON, unique=False, nullable=False) + + @classmethod + def insert(cls, row): + db.session.add(row) + db.session.commit() + return DefaultMethodResult(True,'Report Row added',row.rawrequestid) \ No newline at end of file diff --git a/request-management-api/request_api/resources/request.py b/request-management-api/request_api/resources/request.py index fcec8a2e5..335a4fac8 100644 --- a/request-management-api/request_api/resources/request.py +++ b/request-management-api/request_api/resources/request.py @@ -25,6 +25,7 @@ from request_api.services.rawrequestservice import rawrequestservice from request_api.services.documentservice import documentservice from request_api.services.eventservice import eventservice +from request_api.services.unopenedreportservice import unopenedreportservice from request_api.utils.enums import StateName import json import asyncio @@ -323,4 +324,22 @@ def post(requestid=None): except ValueError: return {'status': 500, 'message':"Invalid Request"}, 400 except BusinessException as exception: - return {'status': exception.status_code, 'message':exception.message}, 500 \ No newline at end of file + return {'status': exception.status_code, 'message':exception.message}, 500 + +@cors_preflight('POST,OPTIONS') +@API.route('/foirawrequest/unopenedreport') +class FOIRawRequestReport(Resource): + """Generates report of unopened requests that have not been actioned in over X amount of days""" + + + @staticmethod + @TRACER.trace() + @cross_origin(origins=allowedorigins()) + @auth.require + def post(): + try: + result = unopenedreportservice().generateunopenedreport() + # responsecode = 200 if result.success == True else 500 + return {'status': True, 'message': result} , 200 + except BusinessException as exception: + return {'status': exception.status_code, 'message':exception.message}, 500 \ No newline at end of file diff --git a/request-management-api/request_api/services/email/senderservice.py b/request-management-api/request_api/services/email/senderservice.py index d15069ca7..4c5034e4a 100644 --- a/request-management-api/request_api/services/email/senderservice.py +++ b/request-management-api/request_api/services/email/senderservice.py @@ -30,12 +30,12 @@ class senderservice: """ - def send(self, servicekey, content, _messageattachmentlist, requestjson): + def send(self, subject, content, _messageattachmentlist, requestjson): logging.debug("Begin: Send email for request = "+json.dumps(requestjson)) msg = MIMEMultipart() msg['From'] = MAIL_FROM_ADDRESS msg['To'] = requestjson["email"] - msg['Subject'] = templateconfig().getsubject(servicekey, requestjson) + msg['Subject'] = subject part = MIMEText(content, "html") msg.attach(part) # Add Attachment and Set mail headers diff --git a/request-management-api/request_api/services/emailservice.py b/request-management-api/request_api/services/emailservice.py index 2d16c7c35..6df55855c 100644 --- a/request-management-api/request_api/services/emailservice.py +++ b/request-management-api/request_api/services/emailservice.py @@ -34,7 +34,8 @@ def send(self, servicename, requestid, ministryrequestid, emailschema): servicename = _templatename.upper() if _templatename else "" _messageattachmentlist = self.__get_attachments(ministryrequestid, emailschema, servicename) self.__pre_send_correspondence_audit(requestid, ministryrequestid,emailschema, content, templateconfig().isnotreceipt(servicename), _messageattachmentlist) - return senderservice().send(servicename, _messagepart, _messageattachmentlist, requestjson) + subject = templateconfig().getsubject(servicename, requestjson) + return senderservice().send(subject, _messagepart, _messageattachmentlist, requestjson) except Exception as ex: logging.exception(ex) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py new file mode 100644 index 000000000..f57cced92 --- /dev/null +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -0,0 +1,153 @@ + +from request_api.models.FOIRawRequests import FOIRawRequest +from request_api.models.UnopenedReport import UnopenedReport +from request_api.services.email.senderservice import senderservice +from os import getenv +from datetime import timedelta, date +from jaro import jaro_winkler_metric +import json +import logging +from math import inf + +class unopenedreportservice: + """ + This service generates a report of unopened unactioned requests + + """ + + dayscutoff = getenv('UNOPENED_REPORT_CUTOFF_DAYS', 10) + waitdays = getenv('UNOPENED_REPORT_WAIT_DAYS', 5) + jarocutoff = getenv('UNOPENED_REPORT_JARO_CUTOFF', 0.8) + reportemail = getenv('UNOPENED_REPORT_EMAIL_RECIPIENT') + + + def generateunopenedreport(self): + startdate = date.today() - timedelta(days=self.dayscutoff) + enddate = startdate + timedelta(days=self.waitdays) + requests = FOIRawRequest.getunopenedunactionedrequests(str(startdate), str(enddate)) + alerts = [] + for request in requests: + potentialmatches = FOIRawRequest.getpotentialactionedmatches(request) + if len(potentialmatches) == 0: + alert = UnopenedReport() + alert.rawrequestid = request['requestid'] + alert.date = date.today() + alert.rank = 1 + UnopenedReport.insert(alert) + alerts.append({"request": request, "rank": 1}) + else: + highscore = 0 + for match in potentialmatches: + match['score'] = jaro_winkler_metric( + request['requestrawdata']['descriptionTimeframe']['description'].replace('\n', ' ').replace('\t', ' '), + match['requestrawdata']['description'] + ) + if match['score'] > highscore: + highscore = match['score'] + alert = UnopenedReport() + alert.rawrequestid = request['requestid'] + alert.date = date.today() + alert.rank = 2 + alert.potentialmatches = {"highscore": round(highscore, 2), "matches": [{ + "requestid": m["requestrawdata"]['axisRequestId'], + "similarity": round(m['score'], 2) + } for m in potentialmatches]} + UnopenedReport.insert(alert) + alerts.append({"request": request, "rank": 2, "potentialmatches": alert.potentialmatches}) + alerts.sort(key=lambda a : a.get('potentialmatches', {'highscore': 0})['highscore']) + senderservice().send( + subject="Intake Unopened Request Report: " + date.today(), + content=self.generateemailhtml(alerts), + _messageattachmentlist=[], + requestjson={"email": self.reportemail, "topic": "Unopened Report"} + ) + return alerts + + + def generateemailhtml(self, alerts): + emailhtml = """ +

Unopened Report - 2024/02/05

+ +

This is a report for unopened requests in the past 10 days that have not yet been actioned.

+

Rank 1: Very likely to be unactioned — unable to find a request with any matching applicant info

+ + + + + + + + + """ + for alert in alerts: + if alert.get('potentialmatches', False): + emailhtml += ''' + + + + + + + + ''' + else: + firstrank2 = True + if firstrank2: + emailhtml += """
Unopened IDApplicant First NameApplicant Last NamePayment StatusDescription
U-000''' + alert['request']['requestid'] + '''''' + alert['request']['requestrawdata']['contactInfo']['lastName'] + '''''' + alert['request']['requestrawdata']['contactInfo']['firstName'] + '''''' + alert['request']['paymentstatus'] + '''''' + alert['request']['requestrawdata']['descriptionTimeframe']['description'][0:99] + '''...
+

Rank 2: Possibly unactioned — requests found but some applicant info is mismatching — please double check

+ + + + + + + + + + """ + firstrank2 = False + emailhtml += ''' + + + + + + + + + ''' + + + # def isrank2match(self, request, match): + # diff = 0 + # for k, v in request['requestrawdata']['contactInfo'].items(): + # if v and match['requestrawdata'].get(k, False) != v: + # diff += 1 + # if diff > self.diffcutoff: + # return False + # for k, v in request['requestrawdata']['contactInfoOptions'].items(): + # if v and match['requestrawdata'].get(k, False) != v: + # diff += 1 + # if diff > self.diffcutoff: + # return False + # print("rank 2 match") + # return True + + # def isrank1match(self, request, match): + # print(request['requestrawdata']['receivedDateUF'][0:10]) + # print(match['requestrawdata']['receivedDateUF'][0:10]) + # match = (((request['requestrawdata']['contactInfo']['firstName'] == match['requestrawdata']['firstName'] + # and request['requestrawdata']['contactInfo']['lastName'] == match['requestrawdata']['lastName']) + # or request['requestrawdata']['contactInfoOptions']['email'] == match['requestrawdata']['email'] + # or request['requestrawdata']['contactInfoOptions']['phonePrimary'] == match['requestrawdata']['phonePrimary'] + # or request['requestrawdata']['contactInfoOptions']['postal'] == match['requestrawdata']['postal'] + # ) + # and request['requestrawdata']['receivedDateUF'][0:10] == match['requestrawdata']['receivedDateUF'][0:10]) + # if match: + # print("rank 1 match") + # return match diff --git a/request-management-api/requirements.txt b/request-management-api/requirements.txt index abc1dec44..ddc56c845 100644 --- a/request-management-api/requirements.txt +++ b/request-management-api/requirements.txt @@ -36,6 +36,7 @@ gunicorn==20.1.0 idna==2.10 itsdangerous==2.0.1 jaeger-client==4.4.0 +jaro-winkler==2.0.3 jsonschema==3.2.0 marshmallow-sqlalchemy==0.23.1 marshmallow==3.0.0rc7 diff --git a/sample.env b/sample.env index b0f5583d4..d8a2ab0fd 100644 --- a/sample.env +++ b/sample.env @@ -159,4 +159,9 @@ DISABLE_REDACT_WEBLINK=false DISABLE_GATHERINGRECORDS_TAB=false KC_SRC_ACC_TOKEN_EXPIRY=60 -MUTE_NOTIFICATION={"MCF": {"request_types": ["Personal"], "state_exceptions": ["Call For Records", "Ministry Sign Off"], "type_exceptions":["Reply User Comments", "Tagged User Comments"]}} \ No newline at end of file +MUTE_NOTIFICATION={"MCF": {"request_types": ["Personal"], "state_exceptions": ["Call For Records", "Ministry Sign Off"], "type_exceptions":["Reply User Comments", "Tagged User Comments"]}} + +UNOPENED_REPORT_CUTOFF_DAYS=10 +UNOPENED_REPORT_WAIT_DAYS=5 +UNOPENED_REPORT_JARO_CUTOFF=0.8 +UNOPENED_REPORT_EMAIL_RECIPIENT= \ No newline at end of file From 56c2837e59430b0f7683d77d13b0514aeb47cdf7 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Thu, 8 Feb 2024 12:25:05 -0800 Subject: [PATCH 056/147] remove debug code --- .../src/components/FOI/FOIRequest/ApplicantProfileModal.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index 03a65ac1d..0a3ab52e5 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -57,9 +57,7 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { let requestDetails = useSelector((state) => state.foiRequests.foiRequestDetail); const dispatch = useDispatch(); - console.log(requestDetails); - - const [searchText, setSearchText] = useState(""); + const [searchText, setSearchText] = useState(""); const [isLoading, setIsLoading] = useState(true); const [rows, setRows] = useState([]); const [selectedApplicant, setSelectedApplicant] = useState(false) @@ -168,7 +166,6 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { useEffect(() => { setSaveApplicantObject({...selectedApplicant}) for (let field in selectedApplicant) { - console.log(field) if (field === 'additionalPersonalInfo') { if (requestDetails[field] && requestDetails.requestType === 'personal') { for (let additionalField in selectedApplicant[field]) { From e21f553cd3fb4c28a31d93aecd2a69dbd0b80a7a Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 13:35:52 -0800 Subject: [PATCH 057/147] fix env data type issue --- .../request_api/services/unopenedreportservice.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index f57cced92..685c47cf5 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -22,8 +22,8 @@ class unopenedreportservice: def generateunopenedreport(self): - startdate = date.today() - timedelta(days=self.dayscutoff) - enddate = startdate + timedelta(days=self.waitdays) + startdate = date.today() - timedelta(days=int(self.dayscutoff)) + enddate = startdate + timedelta(days=int(self.waitdays)) requests = FOIRawRequest.getunopenedunactionedrequests(str(startdate), str(enddate)) alerts = [] for request in requests: @@ -79,6 +79,7 @@ def generateemailhtml(self, alerts): """ + firstrank2 = True for alert in alerts: if alert.get('potentialmatches', False): emailhtml += ''' @@ -91,7 +92,6 @@ def generateemailhtml(self, alerts): ''' else: - firstrank2 = True if firstrank2: emailhtml += """
Unopened IDApplicant First NameApplicant Last NamePayment StatusPotential MatchesDescription
U-000''' + alert['request']['requestid'] + '''''' + alert['request']['requestrawdata']['contactInfo']['lastName'] + '''''' + alert['request']['requestrawdata']['contactInfo']['firstName'] + '''''' + alert['request']['paymentstatus'] + ''' + ''' + for m in alert['potentialmatches']: + emailhtml += (m['requestid'] + " - similarity: " + m['similarity'] + "
") + emailhtml = emailhtml[:4] + emailhtml += '''
''' + alert['request']['requestrawdata']['descriptionTimeframe']['description'][0:99] + '''...
Description

Rank 2: Possibly unactioned — requests found but some applicant info is mismatching — please double check

@@ -106,6 +106,8 @@ def generateemailhtml(self, alerts): """ firstrank2 = False + if alert['potentialmatches']['highscore'] < float(self.jarocutoff): + break emailhtml += ''' U-000''' + alert['request']['requestid'] + ''' From 3aabd1becd5e43dea0687f82e95b1382b561c14d Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 13:35:52 -0800 Subject: [PATCH 058/147] fix env data type issue fix query param --- .../request_api/models/FOIRawRequests.py | 2 +- .../request_api/services/unopenedreportservice.py | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/request-management-api/request_api/models/FOIRawRequests.py b/request-management-api/request_api/models/FOIRawRequests.py index f217d5a3b..2f8344316 100644 --- a/request-management-api/request_api/models/FOIRawRequests.py +++ b/request-management-api/request_api/models/FOIRawRequests.py @@ -1115,7 +1115,7 @@ def getunopenedunactionedrequests(cls, startdate, enddate): order by request_id ) mp join public."Payments" p on p.payment_id = mp.max - where status = 'Unopened' and rr.version = 1 and created_at > :cutoffdate and created_at < :enddate + where status = 'Unopened' and rr.version = 1 and created_at > :startdate and created_at < :enddate order by rr.requestid ''' rs = db.session.execute(text(sql), {'startdate': startdate, 'enddate': enddate}) for row in rs: diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index f57cced92..685c47cf5 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -22,8 +22,8 @@ class unopenedreportservice: def generateunopenedreport(self): - startdate = date.today() - timedelta(days=self.dayscutoff) - enddate = startdate + timedelta(days=self.waitdays) + startdate = date.today() - timedelta(days=int(self.dayscutoff)) + enddate = startdate + timedelta(days=int(self.waitdays)) requests = FOIRawRequest.getunopenedunactionedrequests(str(startdate), str(enddate)) alerts = [] for request in requests: @@ -79,6 +79,7 @@ def generateemailhtml(self, alerts): Description """ + firstrank2 = True for alert in alerts: if alert.get('potentialmatches', False): emailhtml += ''' @@ -91,7 +92,6 @@ def generateemailhtml(self, alerts): ''' else: - firstrank2 = True if firstrank2: emailhtml += """

Rank 2: Possibly unactioned — requests found but some applicant info is mismatching — please double check

@@ -106,6 +106,8 @@ def generateemailhtml(self, alerts): """ firstrank2 = False + if alert['potentialmatches']['highscore'] < float(self.jarocutoff): + break emailhtml += ''' U-000''' + alert['request']['requestid'] + ''' From d8d2b64a425cdd67b6c50fd965661e685a4cc0ef Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 14:30:13 -0800 Subject: [PATCH 059/147] fix missing join condition in query --- request-management-api/request_api/models/FOIRawRequests.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/request-management-api/request_api/models/FOIRawRequests.py b/request-management-api/request_api/models/FOIRawRequests.py index 2f8344316..849e017e3 100644 --- a/request-management-api/request_api/models/FOIRawRequests.py +++ b/request-management-api/request_api/models/FOIRawRequests.py @@ -1108,13 +1108,13 @@ def getunopenedunactionedrequests(cls, startdate, enddate): select max(version) as version, requestid from public."FOIRawRequests" group by requestid ) mv on mv.requestid = rr.requestid and mv.version = rr.version - join ( + left join ( select request_id, max(payment_id) from public."Payments" where fee_code_id = 1 group by request_id order by request_id - ) mp - join public."Payments" p on p.payment_id = mp.max + ) mp on mp.request_id = rr.requestid + left join public."Payments" p on p.payment_id = mp.max where status = 'Unopened' and rr.version = 1 and created_at > :startdate and created_at < :enddate order by rr.requestid ''' rs = db.session.execute(text(sql), {'startdate': startdate, 'enddate': enddate}) From 12b9476d061acb11570d709a174ca9051910d768 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Thu, 8 Feb 2024 14:50:46 -0800 Subject: [PATCH 060/147] not displaying limit message is limit set to 0 --- .../src/components/FOI/customComponents/Records/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forms-flow-web/src/components/FOI/customComponents/Records/index.js b/forms-flow-web/src/components/FOI/customComponents/Records/index.js index a29c297d6..baaa3c5ef 100644 --- a/forms-flow-web/src/components/FOI/customComponents/Records/index.js +++ b/forms-flow-web/src/components/FOI/customComponents/Records/index.js @@ -2146,8 +2146,8 @@ export const RecordsLog = ({ To download records:{" "}
  • at least one record must be selected
  • -
  • download size limit is {displaySizeLimit()}
  • -
  • download records limit is {RECORD_DOWNLOAD_LIMIT}
  • + {RECORD_DOWNLOAD_LIMIT>0 && (
  • download size limit is {displaySizeLimit()}
  • )} + {RECORD_DOWNLOAD_LIMIT>0 && (
  • download records limit is {RECORD_DOWNLOAD_LIMIT}
  • )}
) : ( From e7baf48e6dd78b52af5b99ca3b817f6c27286bf1 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Thu, 8 Feb 2024 14:53:19 -0800 Subject: [PATCH 061/147] format --- .../src/components/FOI/FOIRequest/ApplicantProfileModal.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js index 0a3ab52e5..9566ffeb7 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/ApplicantProfileModal.js @@ -56,8 +56,8 @@ const ApplicantProfileModal = React.memo(({modalOpen, handleModalClose}) => { let requestDetails = useSelector((state) => state.foiRequests.foiRequestDetail); const dispatch = useDispatch(); - - const [searchText, setSearchText] = useState(""); + + const [searchText, setSearchText] = useState(""); const [isLoading, setIsLoading] = useState(true); const [rows, setRows] = useState([]); const [selectedApplicant, setSelectedApplicant] = useState(false) From 15c5eb86b6b1edac065a79bfd539e2feb7d72162 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Thu, 8 Feb 2024 15:01:04 -0800 Subject: [PATCH 062/147] bug fix --- .../src/components/FOI/customComponents/Records/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forms-flow-web/src/components/FOI/customComponents/Records/index.js b/forms-flow-web/src/components/FOI/customComponents/Records/index.js index baaa3c5ef..2788bf674 100644 --- a/forms-flow-web/src/components/FOI/customComponents/Records/index.js +++ b/forms-flow-web/src/components/FOI/customComponents/Records/index.js @@ -2146,7 +2146,7 @@ export const RecordsLog = ({ To download records:{" "}
  • at least one record must be selected
  • - {RECORD_DOWNLOAD_LIMIT>0 && (
  • download size limit is {displaySizeLimit()}
  • )} + {RECORD_DOWNLOAD_SIZE_LIMIT>0 && (
  • download size limit is {displaySizeLimit()}
  • )} {RECORD_DOWNLOAD_LIMIT>0 && (
  • download records limit is {RECORD_DOWNLOAD_LIMIT}
  • )}
From a6767ccbb0be0c2206fbd3134e046d7e2f7dad80 Mon Sep 17 00:00:00 2001 From: nkan-aot2 <156717133+nkan-aot2@users.noreply.github.com> Date: Thu, 8 Feb 2024 15:19:31 -0800 Subject: [PATCH 063/147] fix query --- request-management-api/request_api/models/FOIRawRequests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/models/FOIRawRequests.py b/request-management-api/request_api/models/FOIRawRequests.py index 3410212d1..748dba417 100644 --- a/request-management-api/request_api/models/FOIRawRequests.py +++ b/request-management-api/request_api/models/FOIRawRequests.py @@ -1115,7 +1115,7 @@ def getunopenedunactionedrequests(cls, startdate, enddate): order by request_id ) mp on mp.request_id = rr.requestid left join public."Payments" p on p.payment_id = mp.max - where status = 'Unopened' and rr.version = 1 and created_at > :startdate and created_at < :enddate + where rr.status = 'Unopened' and rr.version = 1 and created_at > :startdate and created_at < :enddate order by rr.requestid ''' rs = db.session.execute(text(sql), {'startdate': startdate, 'enddate': enddate}) for row in rs: From 0e19ce5f2dac4a3cc54199fdd74a5a52ac8e61f9 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 15:41:12 -0800 Subject: [PATCH 064/147] fix date data format --- .../request_api/services/unopenedreportservice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index 685c47cf5..7f2ac0067 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -56,7 +56,7 @@ def generateunopenedreport(self): alerts.append({"request": request, "rank": 2, "potentialmatches": alert.potentialmatches}) alerts.sort(key=lambda a : a.get('potentialmatches', {'highscore': 0})['highscore']) senderservice().send( - subject="Intake Unopened Request Report: " + date.today(), + subject="Intake Unopened Request Report: " + str(date.today()), content=self.generateemailhtml(alerts), _messageattachmentlist=[], requestjson={"email": self.reportemail, "topic": "Unopened Report"} @@ -66,7 +66,7 @@ def generateunopenedreport(self): def generateemailhtml(self, alerts): emailhtml = """ -

Unopened Report - 2024/02/05

+

Unopened Report - """ + str(date.today()) + """

This is a report for unopened requests in the past 10 days that have not yet been actioned.

Rank 1: Very likely to be unactioned — unable to find a request with any matching applicant info

From 4a7aa1311a65e4817ee216d83d8f278d612ff8ca Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 16:04:22 -0800 Subject: [PATCH 065/147] fix missing return statement --- .../request_api/services/unopenedreportservice.py | 1 + 1 file changed, 1 insertion(+) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index 7f2ac0067..e78806d4e 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -123,6 +123,7 @@ def generateemailhtml(self, alerts): ''' + alert['request']['requestrawdata']['descriptionTimeframe']['description'][0:99] + '''... ''' + return emailhtml # def isrank2match(self, request, match): From c0ba5d03602c7216a83f8359a3647fa91186c900 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 16:40:59 -0800 Subject: [PATCH 066/147] fix comparator --- .../request_api/services/unopenedreportservice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index e78806d4e..fe61dd87e 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -106,7 +106,7 @@ def generateemailhtml(self, alerts): """ firstrank2 = False - if alert['potentialmatches']['highscore'] < float(self.jarocutoff): + if alert['potentialmatches']['highscore'] > float(self.jarocutoff): break emailhtml += ''' From 11557c07929f0b20bef9fc374ce4c3d3dad30816 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 16:45:28 -0800 Subject: [PATCH 067/147] fix query enddate calculation --- .../request_api/services/unopenedreportservice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index fe61dd87e..af4ee6665 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -23,7 +23,7 @@ class unopenedreportservice: def generateunopenedreport(self): startdate = date.today() - timedelta(days=int(self.dayscutoff)) - enddate = startdate + timedelta(days=int(self.waitdays)) + enddate = date.today() - timedelta(days=int(self.waitdays)) requests = FOIRawRequest.getunopenedunactionedrequests(str(startdate), str(enddate)) alerts = [] for request in requests: From 1d0747b542e94bdaf4ab1ae44d28daa6cd05ce15 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 16:50:03 -0800 Subject: [PATCH 068/147] add debug statements --- .../request_api/services/unopenedreportservice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index af4ee6665..68da34195 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -80,6 +80,7 @@ def generateemailhtml(self, alerts): """ firstrank2 = True + print(alerts) for alert in alerts: if alert.get('potentialmatches', False): emailhtml += ''' @@ -106,6 +107,7 @@ def generateemailhtml(self, alerts): """ firstrank2 = False + print(alert) if alert['potentialmatches']['highscore'] > float(self.jarocutoff): break emailhtml += ''' From 10d4762fdec1d3c4f305c64223731a2708bdf47a Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 17:07:30 -0800 Subject: [PATCH 069/147] fix if condition in email loop --- .../request_api/services/unopenedreportservice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index 68da34195..71d086872 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -68,7 +68,7 @@ def generateemailhtml(self, alerts): emailhtml = """

Unopened Report - """ + str(date.today()) + """

-

This is a report for unopened requests in the past 10 days that have not yet been actioned.

+

This is a report for unopened requests in the past """ + self.dayscutoff + """ days that have not yet been actioned.

Rank 1: Very likely to be unactioned — unable to find a request with any matching applicant info

@@ -82,7 +82,7 @@ def generateemailhtml(self, alerts): firstrank2 = True print(alerts) for alert in alerts: - if alert.get('potentialmatches', False): + if alert.get('potentialmatches') == None: emailhtml += ''' From d9e78d4689eaff686571e20c5f86101a5287f793 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 17:30:07 -0800 Subject: [PATCH 070/147] fix request id data type --- .../request_api/services/unopenedreportservice.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index 71d086872..4aa0052cb 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -85,7 +85,7 @@ def generateemailhtml(self, alerts): if alert.get('potentialmatches') == None: emailhtml += ''' - + @@ -112,14 +112,14 @@ def generateemailhtml(self, alerts): break emailhtml += ''' - + From 0fc521d5c6d0bc2e43199075f6f0f88f57f60d05 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 17:59:37 -0800 Subject: [PATCH 071/147] fix payment status none type --- .../request_api/services/unopenedreportservice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index 4aa0052cb..0579409e1 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -88,7 +88,7 @@ def generateemailhtml(self, alerts): - + ''' @@ -115,7 +115,7 @@ def generateemailhtml(self, alerts): - + - + ''' @@ -115,7 +115,7 @@ def generateemailhtml(self, alerts): - + From 53e63992f8f64957a2bac18928d102874d7d7c13 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 9 Feb 2024 11:59:48 -0800 Subject: [PATCH 074/147] fix similarity data type v2 --- .../request_api/services/unopenedreportservice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index 94e13fa7d..93a146cb6 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -118,8 +118,8 @@ def generateemailhtml(self, alerts): From d620cf68bb5d2f8ec835a77ffe1ba322f3d89dc0 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 9 Feb 2024 12:02:43 -0800 Subject: [PATCH 075/147] fix substring index --- .../request_api/services/unopenedreportservice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index 93a146cb6..1bcc9e85f 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -120,7 +120,7 @@ def generateemailhtml(self, alerts): ''' for m in alert['potentialmatches']['matches']: emailhtml += (m['requestid'] + " - similarity: " + str(m['similarity']) + "
") - emailhtml = emailhtml[:4] + emailhtml = emailhtml[:-4] emailhtml += '''
From 38220cc23f99d3ab144005d8d82e26291b97850f Mon Sep 17 00:00:00 2001 From: nkan-aot2 <156717133+nkan-aot2@users.noreply.github.com> Date: Mon, 12 Feb 2024 09:21:35 -0800 Subject: [PATCH 076/147] revert changes for testing receipt failure --- request-management-api/request_api/resources/fee.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/resources/fee.py b/request-management-api/request_api/resources/fee.py index 7b4e7eeea..ee2b24cf2 100644 --- a/request-management-api/request_api/resources/fee.py +++ b/request-management-api/request_api/resources/fee.py @@ -132,7 +132,7 @@ def post(request_id: int, payment_id: int): return Response( response= response.content, - status= 400, #response.status_code, + status= response.status_code, headers= dict(response.headers) ) From aa46f229769e8e8d541a0882d5930e8fff18c216 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Wed, 28 Feb 2024 14:15:51 -0800 Subject: [PATCH 077/147] axis sync api return axisapplicantid --- .../MCS.FOI.AXISIntegration.DAL/RequestsDA.cs | 3 ++- .../MCS.FOI.AXISIntegration.DataModels/AXISRequest.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs index 12ce38682..2ca298332 100644 --- a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs +++ b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs @@ -63,6 +63,7 @@ public AXISRequest GetAXISRequest(string request) axisRequest.ApplicantLastName = Convert.ToString(row["lastName"]); axisRequest.BusinessName = Convert.ToString(row["businessName"]); + axisRequest.AXISApplicantID = Convert.ToString(row["axisApplicantID"]); axisRequest.Address = Convert.ToString(row["address"]); axisRequest.AddressSecondary = Convert.ToString(row["addressSecondary"]); axisRequest.City = Convert.ToString(row["city"]); @@ -134,7 +135,7 @@ private DataTable GetAxisRequestData(string request) (SELECT terminology.vcTerminology from tblTerminologyLookup terminology WHERE terminology.iLabelID = deliveryModes.iLabelID and terminology.tiLocaleID = 1) as deliveryMode, (SELECT terminology.vcTerminology from tblTerminologyLookup terminology WHERE terminology.iLabelID = countries.iLabelID and terminology.tiLocaleID = 1) as country, (SELECT terminology.vcTerminology from tblTerminologyLookup terminology WHERE terminology.iLabelID = states.iLabelID and terminology.tiLocaleID = 1) as province, - requesters.vcAddress1 as [address], requesters.vcAddress2 as addressSecondary, requesters.vcCity as city, requesters.vcZipCode as postal, + requesters.iRequesterID as axisApplicantID, requesters.vcAddress1 as [address], requesters.vcAddress2 as addressSecondary, requesters.vcCity as city, requesters.vcZipCode as postal, requesters.vcHome as phonePrimary, requesters.vcMobile as phoneSecondary, requesters.vcWork1 as workPhonePrimary, diff --git a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DataModels/AXISRequest.cs b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DataModels/AXISRequest.cs index 3c8feb896..ad924ebfb 100644 --- a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DataModels/AXISRequest.cs +++ b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DataModels/AXISRequest.cs @@ -73,7 +73,8 @@ public class AXISRequest [DataMember(Name = "lastName")] public string ApplicantLastName { get; set; } - + [DataMember(Name = "axisApplicantID")] + public string AXISApplicantID { get; set; } [DataMember(Name = "businessName")] public string BusinessName { get; set; } From 11394a4f425b5850062b2babf3a638fc27af6772 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Wed, 28 Feb 2024 15:53:37 -0800 Subject: [PATCH 078/147] add missing parts in group by --- .../MCS.FOI.AXISIntegration.DAL/RequestsDA.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs index 2ca298332..d5051ede5 100644 --- a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs +++ b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs @@ -183,7 +183,7 @@ LEFT OUTER JOIN dbo.TBLREQUESTCUSTOMFIELDS requestfields WITH (NOLOCK) ON reques GROUP BY requests.sdtReceivedDate, requests.sdtTargetDate, requests.sdtOriginalTargetDate, requests.vcDescription, requests.sdtRqtDescFromdate, requests.sdtRqtDescTodate, requests.sdtRequestedDate, office.OFFICE_CODE, requesterTypes.vcDescription, receivedModes.iLabelID, deliveryModes.iLabelID, countries.iLabelID, states.iLabelID, - requesters.vcAddress1, requesters.vcAddress2, requesters.vcCity, requesters.vcZipCode, + requesters.iRequesterID, requesters.vcAddress1, requesters.vcAddress2, requesters.vcCity, requesters.vcZipCode, requesters.vcHome, requesters.vcMobile, requesters.vcWork1, requesters.vcWork2, requesters.vcFirstName, requesters.vcLastName, requesters.vcMiddleName, requests.iRequestID, requesters.vcCompany, requesters.vcEmailID, onbehalf.vcFirstName, onbehalf.vcLastName, onbehalf.vcMiddleName, requestTypes.iLabelID, requests.vcVisibleRequestID, requests.tiOfficeID, office.OFFICE_ID,requestorfields.CUSTOMFIELD35, REPLACE(requestfields.CUSTOMFIELD33, CHAR(160), ' '),requestfields.CUSTOMFIELD75"; From 68ece2d5eca7ef885416bb02edc65c8c3b5042ed Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 28 Feb 2024 15:55:38 -0800 Subject: [PATCH 079/147] initial commit for axis sync applicant profile - add axis applicant id to backend api request object schema - save axis applicant id when creating or updating applicant - add profile id guid when creating new profile - disable applicant related fields in front end --- .../FOI/FOIRequest/AddressContanctInfo.js | 8 ++----- .../components/FOI/FOIRequest/FOIRequest.js | 6 +++--- .../FOI/customComponents/StateDropDown.js | 2 +- .../models/FOIRequestApplicants.py | 17 +++++++++++++-- .../request_api/schemas/foirequestwrapper.py | 1 + .../foirequest/requestservicebuilder.py | 4 ++-- .../foirequest/requestservicecreate.py | 21 ++++++++++++++++--- request-management-api/requirements.txt | 6 +++--- 8 files changed, 45 insertions(+), 20 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js b/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js index 331554b1f..d882a28e2 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/AddressContanctInfo.js @@ -314,7 +314,7 @@ const AddressContactDetails = memo(
- {moreInfoAction && + {/* {moreInfoAction && // comment back in after axis decommission - } - {/* */} + } */}
diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index 00f950a45..ca2a398c1 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -1259,7 +1259,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { handleApplicantDetailsValue } createSaveRequestObject={createSaveRequestObject} - disableInput={disableInput || requestDetails?.foiRequestApplicantID > 0} + disableInput={disableInput || true /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} defaultExpanded={!closeApplicantDetails(userDetail, requestDetails?.requestType)} /> {requiredRequestDetailsValues.requestType.toLowerCase() === @@ -1292,7 +1292,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { handleContactDetailsInitialValue } handleContanctDetailsValue={handleContanctDetailsValue} - disableInput={disableInput || requestDetails?.foiRequestApplicantID > 0} + disableInput={disableInput || true /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} handleEmailValidation={handleEmailValidation} defaultExpanded={!closeContactInfo(userDetail,requestDetails)} moreInfoAction={openApplicantProfileModal} @@ -1340,7 +1340,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { 0} + disableInput={disableInput || true /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} defaultExpanded={true} /> )} diff --git a/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js b/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js index 333a8d824..2a9749a67 100644 --- a/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js +++ b/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js @@ -216,7 +216,7 @@ const StateDropDown = ({ return isValidationError || requestState === StateEnum.unopened.name || (isBeforeOpen(requestDetails) && status === 'Open' - && !requestDetails.foiRequestApplicantID + //&& !requestDetails.foiRequestApplicantID comment back in after axis decomission ); }; const statusList = getStatusList(); diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index aa1cb40fd..9a5e4ba83 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -35,9 +35,10 @@ class FOIRequestApplicant(db.Model): createdby = db.Column(db.String(120), unique=False, nullable=True) updatedby = db.Column(db.String(120), unique=False, nullable=True) applicantprofileid = db.Column(db.String(120), unique=False, nullable=True) + axisapplicantid = db.Column(db.Integer, nullable=True) @classmethod - def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, userid): + def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, axisapplicantid, userid): applicant = FOIRequestApplicant() applicant.createdby = userid applicant.firstname = firstname @@ -46,6 +47,8 @@ def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknow applicant.businessname = businessname applicant.alsoknownas = alsoknownas applicant.applicantcategoryid = applicantcategoryid + applicant.applicantprofileid = str(uuid.uuid4()) + applicant.axisapplicantid = axisapplicantid if dob is not None and dob != "": applicant.dob = datetime.strptime(dob, "%Y-%m-%d") else: @@ -55,7 +58,7 @@ def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknow return DefaultMethodResult(True,'Applicant added',applicant.foirequestapplicantid) @classmethod - def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, userid): + def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, axisapplicantid, userid): applicantprofile = aliased(FOIRequestApplicant) @@ -97,6 +100,7 @@ def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, midd _applicant.alsoknownas = applicantfromform['alsoknownas'] _applicant.dob = applicantfromform['dob'] _applicant.applicantprofileid = applicant.applicantprofileid + _applicant.axisapplicantid = axisapplicantid _applicant.applicantcategoryid = applicantfromform['applicantcategoryid'] db.session.add(_applicant) db.session.commit() @@ -112,6 +116,15 @@ def getlatestprofilebyapplicantid(cls, applicantid): return schema.dump(sq) query = db.session.query(FOIRequestApplicant).filter(FOIRequestApplicant.applicantprofileid == sq.applicantprofileid).order_by(FOIRequestApplicant.foirequestapplicantid.desc()).first() return schema.dump(query) + + @classmethod + def getlatestprofilebyaxisapplicantid(cls, axisapplicantid): + schema = FOIRequestApplicantSchema(many=False) + sq = db.session.query(FOIRequestApplicant).filter_by(axisapplicantid=axisapplicantid).first() + if not sq.applicantprofileid: + return schema.dump(sq) + query = db.session.query(FOIRequestApplicant).filter(FOIRequestApplicant.applicantprofileid == sq.applicantprofileid).order_by(FOIRequestApplicant.foirequestapplicantid.desc()).first() + return schema.dump(query) # Search applicant by id @classmethod diff --git a/request-management-api/request_api/schemas/foirequestwrapper.py b/request-management-api/request_api/schemas/foirequestwrapper.py index 34209ac4d..d52c4135b 100644 --- a/request-management-api/request_api/schemas/foirequestwrapper.py +++ b/request-management-api/request_api/schemas/foirequestwrapper.py @@ -141,6 +141,7 @@ class Meta: # pylint: disable=too-few-public-methods isiaorestricted = fields.Bool(data_key="isiaorestricted") foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) + axisapplicantid = fields.Int(data_key="axisApplicantID",required=True,allow_none=False) isoipcreview = fields.Bool(data_key="isoipcreview") selectedMinistries = fields.Nested(FOIMinistryRequestWrapperSchema, many=True) diff --git a/request-management-api/request_api/services/foirequest/requestservicebuilder.py b/request-management-api/request_api/services/foirequest/requestservicebuilder.py index 6b28811ce..64e8f1a61 100644 --- a/request-management-api/request_api/services/foirequest/requestservicebuilder.py +++ b/request-management-api/request_api/services/foirequest/requestservicebuilder.py @@ -126,9 +126,9 @@ def createcontactinformation(self,dataformat, name, value, contacttypes, userid) contactinformation.contacttypeid =contacttype["contacttypeid"] return contactinformation - def createapplicant(self,firstname, lastname, appltcategory, userid, middlename = None, businessname = None, alsoknownas = None, dob = None, applicantcategoryid = None): + def createapplicant(self,firstname, lastname, appltcategory, userid, middlename = None, businessname = None, alsoknownas = None, dob = None, applicantcategoryid = None, axisapplicantid = None): requestapplicant = FOIRequestApplicantMapping() - _applicant = FOIRequestApplicant().createapplicant(firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, userid) + _applicant = FOIRequestApplicant().createapplicant(firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, axisapplicantid, userid) requestapplicant.foirequestapplicantid = _applicant.identifier if appltcategory is not None: requestertype = RequestorType().getrequestortype(appltcategory) diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index 278469e46..5c107ca05 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -135,11 +135,25 @@ def __prepareapplicants(self, foirequestschema, userid): selfdob = applicantinfo["birthDate"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"birthDate","additionalPersonalInfo") else None selfalsoknownas = applicantinfo["alsoKnownAs"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"alsoKnownAs","additionalPersonalInfo") else None + applicant = FOIRequestApplicant().getlatestprofilebyaxisapplicantid(foirequestschema['foiRequestApplicantID']) # temporary for axis sync, remove after axis decommissioned + foirequestschema['foiRequestApplicantID'] = applicant.get('foirequestapplicantid', 0) # temporary for axis sync, remove after axis decommissioned # if foirequestschema.get('foiRequestApplicantID') is None and foirequestschema.get('requeststatusid') == 1: if foirequestschema.get('foiRequestApplicantID', 0) > 0: - applicant = FOIRequestApplicant().getlatestprofilebyapplicantid(foirequestschema['foiRequestApplicantID']) + applicant = FOIRequestApplicant.updateapplicantprofile( # temporary for axis sync, remove after axis decommissioned + foirequestschema['foiRequestApplicantID'], + foirequestschema['firstName'], + foirequestschema['lastName'], + foirequestschema.get("middleName"), + foirequestschema.get("businessName"), + selfdob, + selfalsoknownas, + applicant['applicantprofileid'], + foirequestschema['axisapplicantid'], + userid + ) + # applicant = FOIRequestApplicant().getlatestprofilebyapplicantid(foirequestschema['foiRequestApplicantID']) comment back in after axis decommission requestapplicant = FOIRequestApplicantMapping() - requestapplicant.foirequestapplicantid = applicant['foirequestapplicantid'] + requestapplicant.foirequestapplicantid = applicant.identifier # = applicant['foirequestapplicantid'] comment back in after axis decommission requestapplicant.requestortypeid = RequestorType().getrequestortype("Self")["requestortypeid"] requestapplicantarr.append(requestapplicant) else: @@ -152,7 +166,8 @@ def __prepareapplicants(self, foirequestschema, userid): foirequestschema.get("businessName"), selfalsoknownas, selfdob, - selfcategoryid) + selfcategoryid, + foirequestschema['axisapplicantid']) ) #Prepare additional applicants diff --git a/request-management-api/requirements.txt b/request-management-api/requirements.txt index ddc56c845..6debf8925 100644 --- a/request-management-api/requirements.txt +++ b/request-management-api/requirements.txt @@ -52,7 +52,7 @@ python-dotenv==0.16.0 python-editor==1.0.4 python-jose==3.2.0 pytz==2021.1 -requests==2.25.1 +requests==2.31.0 rsa==4.7.2 sentry-sdk==1.0.0 six==1.15.0 @@ -66,9 +66,9 @@ maya==0.6.1 pyjwt==2.1.0 aws-requests-auth==0.4.3 holidays==0.12 -Flask-SocketIO==5.1.0 +Flask-SocketIO==5.3.6 Flask-Login==0.5.0 -eventlet==0.33.3 +eventlet==0.35.2 uritemplate.py==3.0.2 urllib3==1.26.15 ndg-httpsclient From 1958bd317c3b405d5845940a51d1d5d12171722e Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 29 Feb 2024 16:13:07 -0800 Subject: [PATCH 080/147] only disable applicant fields if axis applicant id is set --- forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index ca2a398c1..34c71f31a 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -1259,7 +1259,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { handleApplicantDetailsValue } createSaveRequestObject={createSaveRequestObject} - disableInput={disableInput || true /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} + disableInput={disableInput || requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} defaultExpanded={!closeApplicantDetails(userDetail, requestDetails?.requestType)} /> {requiredRequestDetailsValues.requestType.toLowerCase() === @@ -1292,7 +1292,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { handleContactDetailsInitialValue } handleContanctDetailsValue={handleContanctDetailsValue} - disableInput={disableInput || true /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} + disableInput={disableInput || requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} handleEmailValidation={handleEmailValidation} defaultExpanded={!closeContactInfo(userDetail,requestDetails)} moreInfoAction={openApplicantProfileModal} @@ -1340,7 +1340,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { 0 comment back in after axis decommission*/} + disableInput={disableInput || requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} defaultExpanded={true} /> )} From 877caeeb33da0b90d3aad75444c948da6f3bef0c Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 1 Mar 2024 16:52:35 -0800 Subject: [PATCH 081/147] fix bugs with previous commit --- .../components/FOI/customComponents/StateDropDown.js | 10 +++++----- .../request_api/models/FOIRequestApplicants.py | 4 ++-- .../request_api/schemas/foirequestwrapper.py | 2 +- .../services/foirequest/requestservicecreate.py | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js b/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js index 2a9749a67..b045e78a5 100644 --- a/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js +++ b/forms-flow-web/src/components/FOI/customComponents/StateDropDown.js @@ -213,11 +213,11 @@ const StateDropDown = ({ return false; } - return isValidationError || requestState === StateEnum.unopened.name || - (isBeforeOpen(requestDetails) - && status === 'Open' - //&& !requestDetails.foiRequestApplicantID comment back in after axis decomission - ); + return isValidationError || requestState === StateEnum.unopened.name + // || (isBeforeOpen(requestDetails) ////comment back in after axis decomission + // && status === 'Open' + // && !requestDetails.foiRequestApplicantID + // ); }; const statusList = getStatusList(); const menuItems = diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index 9a5e4ba83..ab8b8bbd8 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -121,7 +121,7 @@ def getlatestprofilebyapplicantid(cls, applicantid): def getlatestprofilebyaxisapplicantid(cls, axisapplicantid): schema = FOIRequestApplicantSchema(many=False) sq = db.session.query(FOIRequestApplicant).filter_by(axisapplicantid=axisapplicantid).first() - if not sq.applicantprofileid: + if sq is None or (not sq.applicantprofileid): return schema.dump(sq) query = db.session.query(FOIRequestApplicant).filter(FOIRequestApplicant.applicantprofileid == sq.applicantprofileid).order_by(FOIRequestApplicant.foirequestapplicantid.desc()).first() return schema.dump(query) @@ -1259,7 +1259,7 @@ def prepareapplicantforcomparing(cls, firstname, lastname, middlename, businessn class FOIRequestApplicantSchema(ma.Schema): class Meta: - fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob','businessname','applicantcategory.applicantcategoryid','applicantcategory.name') + fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob','businessname','applicantcategory.applicantcategoryid','applicantcategory.name', 'applicantprofileid') class ApplicantProfileSchema(ma.Schema): class Meta: diff --git a/request-management-api/request_api/schemas/foirequestwrapper.py b/request-management-api/request_api/schemas/foirequestwrapper.py index d52c4135b..e7c53f5eb 100644 --- a/request-management-api/request_api/schemas/foirequestwrapper.py +++ b/request-management-api/request_api/schemas/foirequestwrapper.py @@ -141,7 +141,7 @@ class Meta: # pylint: disable=too-few-public-methods isiaorestricted = fields.Bool(data_key="isiaorestricted") foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) - axisapplicantid = fields.Int(data_key="axisApplicantID",required=True,allow_none=False) + axisapplicantid = fields.Int(data_key="axisApplicantID",required=False,allow_none=True) isoipcreview = fields.Bool(data_key="isoipcreview") selectedMinistries = fields.Nested(FOIMinistryRequestWrapperSchema, many=True) diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index 5c107ca05..462bc5756 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -135,7 +135,7 @@ def __prepareapplicants(self, foirequestschema, userid): selfdob = applicantinfo["birthDate"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"birthDate","additionalPersonalInfo") else None selfalsoknownas = applicantinfo["alsoKnownAs"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"alsoKnownAs","additionalPersonalInfo") else None - applicant = FOIRequestApplicant().getlatestprofilebyaxisapplicantid(foirequestschema['foiRequestApplicantID']) # temporary for axis sync, remove after axis decommissioned + applicant = FOIRequestApplicant().getlatestprofilebyaxisapplicantid(foirequestschema.get('axisapplicantid', 0)) # temporary for axis sync, remove after axis decommissioned foirequestschema['foiRequestApplicantID'] = applicant.get('foirequestapplicantid', 0) # temporary for axis sync, remove after axis decommissioned # if foirequestschema.get('foiRequestApplicantID') is None and foirequestschema.get('requeststatusid') == 1: if foirequestschema.get('foiRequestApplicantID', 0) > 0: @@ -147,8 +147,8 @@ def __prepareapplicants(self, foirequestschema, userid): foirequestschema.get("businessName"), selfdob, selfalsoknownas, - applicant['applicantprofileid'], - foirequestschema['axisapplicantid'], + None, + foirequestschema.get('axisapplicantid', None), userid ) # applicant = FOIRequestApplicant().getlatestprofilebyapplicantid(foirequestschema['foiRequestApplicantID']) comment back in after axis decommission @@ -167,7 +167,7 @@ def __prepareapplicants(self, foirequestschema, userid): selfalsoknownas, selfdob, selfcategoryid, - foirequestschema['axisapplicantid']) + foirequestschema.get('axisapplicantid', None),) ) #Prepare additional applicants From cc9454f52a2b22045f270de78b2b1504951a6df6 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Mon, 4 Mar 2024 21:27:08 -0800 Subject: [PATCH 082/147] FOIMOD-2956: 1. remove categoryid from applicant table 2. add axisapplicantid to applicant table --- .../ba218164248e_add_category_to_applicant.py | 67 ------------------- ..._add_axisapplicantid_to_applicant_table.py | 24 +++++++ .../migrations/versions/d42a1cf67c5c_.py | 2 +- .../request_api/models/FOIMinistryRequests.py | 8 +-- .../models/FOIRequestApplicantMappings.py | 14 +--- .../models/FOIRequestApplicants.py | 54 ++++++++------- .../request_api/models/FOIRequests.py | 7 +- .../request_api/schemas/foiapplicant.py | 3 +- .../request_api/schemas/foirequest.py | 1 - .../request_api/services/applicantservice.py | 7 +- .../foirequest/requestservicebuilder.py | 4 +- .../foirequest/requestservicecreate.py | 8 +-- .../foirequest/requestservicegetter.py | 19 +++--- .../requestserviceministrybuilder.py | 2 +- request-management-api/requirements.txt | 6 +- 15 files changed, 87 insertions(+), 139 deletions(-) delete mode 100644 request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py create mode 100644 request-management-api/migrations/versions/c590239f1b2f_add_axisapplicantid_to_applicant_table.py diff --git a/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py b/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py deleted file mode 100644 index df4acd841..000000000 --- a/request-management-api/migrations/versions/ba218164248e_add_category_to_applicant.py +++ /dev/null @@ -1,67 +0,0 @@ -"""add category to applicant - -Revision ID: ba218164248e -Revises: 59a97f42b5f2 -Create Date: 2024-01-15 13:09:57.278888 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = 'ba218164248e' -down_revision = '59a97f42b5f2' -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column('FOIRequestApplicants', sa.Column('applicantcategoryid', sa.Integer(), nullable=True)) - op.create_foreign_key(None, 'FOIRequestApplicants', 'ApplicantCategories', ['applicantcategoryid'], ['applicantcategoryid']) - - op.execute( - ''' - UPDATE public."FOIRequestApplicants" - set applicantcategoryid = subquery.applicantcategoryid - from ( - select public."FOIRequestApplicantMappings".foirequestapplicantid, public."FOIRequests".applicantcategoryid - from ( - select max(public."FOIRequestApplicantMappings".foirequestapplicantmappingid) as foirequestapplicantmappingid - from public."FOIRequestApplicantMappings" - where public."FOIRequestApplicantMappings".requestortypeid = 1 - group by public."FOIRequestApplicantMappings".foirequestapplicantid - ) as maxmappingid - join public."FOIRequestApplicantMappings" on public."FOIRequestApplicantMappings".foirequestapplicantmappingid = maxmappingid.foirequestapplicantmappingid - join public."FOIRequests" on public."FOIRequests".foirequestid = public."FOIRequestApplicantMappings".foirequest_id and public."FOIRequests".version = public."FOIRequestApplicantMappings".foirequestversion_id - ) as subquery - where public."FOIRequestApplicants".foirequestapplicantid = subquery.foirequestapplicantid - and public."FOIRequestApplicants".foirequestapplicantid not in ( - select foirequestapplicantid from ( - select foirequestapplicantid, count(applicantcategoryid) c from ( - select - public."FOIRequestApplicantMappings".foirequestapplicantid, - public."FOIRequests".applicantcategoryid - from public."FOIRequestApplicantMappings" - join public."FOIRequests" on - public."FOIRequests".foirequestid = public."FOIRequestApplicantMappings".foirequest_id - and public."FOIRequests".version = public."FOIRequestApplicantMappings".foirequestversion_id - where public."FOIRequestApplicantMappings".requestortypeid = 1 - group by public."FOIRequestApplicantMappings".foirequestapplicantid, public."FOIRequests".applicantcategoryid - ) as subquery2 - group by foirequestapplicantid - -- order by count(applicantcategoryid) desc, foirequestapplicantid - ) as subquery1 where c > 1 - ) - ''' - ) - - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.drop_constraint(None, 'FOIRequestApplicants', type_='foreignkey') - op.drop_column('FOIRequestApplicants', 'applicantcategoryid') - # ### end Alembic commands ### \ No newline at end of file diff --git a/request-management-api/migrations/versions/c590239f1b2f_add_axisapplicantid_to_applicant_table.py b/request-management-api/migrations/versions/c590239f1b2f_add_axisapplicantid_to_applicant_table.py new file mode 100644 index 000000000..cacd7a41a --- /dev/null +++ b/request-management-api/migrations/versions/c590239f1b2f_add_axisapplicantid_to_applicant_table.py @@ -0,0 +1,24 @@ +"""add axisapplicantid to applicant table + +Revision ID: c590239f1b2f +Revises: d42a1cf67c5c +Create Date: 2024-02-29 22:51:55.709923 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c590239f1b2f' +down_revision = 'd42a1cf67c5c' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('FOIRequestApplicants', sa.Column('axisapplicantid', sa.Integer(), nullable=True)) + + +def downgrade(): + op.drop_column('FOIRequestApplicants', 'axisapplicantid') diff --git a/request-management-api/migrations/versions/d42a1cf67c5c_.py b/request-management-api/migrations/versions/d42a1cf67c5c_.py index 39aec13f4..e303eb81e 100644 --- a/request-management-api/migrations/versions/d42a1cf67c5c_.py +++ b/request-management-api/migrations/versions/d42a1cf67c5c_.py @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. revision = 'd42a1cf67c5c' -down_revision = 'ba218164248e' +down_revision = '59a97f42b5f2' branch_labels = None depends_on = None diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index 259e16a62..0b1b697f2 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -206,9 +206,9 @@ def getrequests(cls, group = None): _request["version"] = ministryrequest['version'] _request["id"] = parentrequest.foirequestid _request["ministryrequestid"] = ministryrequest['foiministryrequestid'] - # _request["applicantcategory"]=parentrequest.applicantcategory.name - _request["applicantcategory"]=requestapplicants[0]['applicantcategory'] + _request["applicantcategory"]= parentrequest.applicantcategory.name _request["identityverified"] = ministryrequest['identityverified'] + _request["axisApplicantID"] = requestapplicants[0]['axisapplicantid'] _requests.append(_request) return _requests @@ -597,7 +597,7 @@ def getrequestssubquery(cls, groups, filterfields, keyword, additionalfilter, us isouter=True ).join( ApplicantCategory, - and_(ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid, ApplicantCategory.isactive == True) + and_(ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid, ApplicantCategory.isactive == True) ).join( ProgramArea, FOIMinistryRequest.programareaid == ProgramArea.programareaid @@ -1160,7 +1160,7 @@ def getbasequery(cls, iaoassignee, ministryassignee, userid=None, requestby='IAO isouter=True ).join( ApplicantCategory, - and_(ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid, ApplicantCategory.isactive == True) + and_(ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid, ApplicantCategory.isactive == True) ).join( ProgramArea, FOIMinistryRequest.programareaid == ProgramArea.programareaid diff --git a/request-management-api/request_api/models/FOIRequestApplicantMappings.py b/request-management-api/request_api/models/FOIRequestApplicantMappings.py index 412a1d8a5..eada089c3 100644 --- a/request-management-api/request_api/models/FOIRequestApplicantMappings.py +++ b/request-management-api/request_api/models/FOIRequestApplicantMappings.py @@ -3,10 +3,7 @@ from .db import db, ma from datetime import datetime from sqlalchemy.orm import relationship,backref -from .default_method_result import DefaultMethodResult -from .FOIRequests import FOIRequest from sqlalchemy import and_, or_, func -from .ApplicantCategories import ApplicantCategory from .RequestorType import RequestorType class FOIRequestApplicantMapping(db.Model): @@ -40,7 +37,6 @@ class FOIRequestApplicantMapping(db.Model): @classmethod def getrequestapplicants(cls,foirequest_id,foirequestversion): - from .FOIRequestApplicants import FOIRequestApplicant requestapplicant_schema = FOIRequestApplicantMappingSchema(many=True) _applicantinfos = db.session.query(FOIRequestApplicantMapping).filter( FOIRequestApplicantMapping.foirequest_id == foirequest_id, @@ -65,14 +61,10 @@ def getrequestapplicantinfos(cls,foirequest_id,foirequestversion): FOIRequestApplicant.alsoknownas.label('alsoknownas'), FOIRequestApplicant.dob.label('dob'), FOIRequestApplicant.businessname.label('businessname'), - ApplicantCategory.applicantcategoryid.label('applicantcategoryid'), - ApplicantCategory.name.label('applicantcategory'), + FOIRequestApplicant.axisapplicantid.label('axisapplicantid'), ]).join( FOIRequestApplicant, FOIRequestApplicant.foirequestapplicantid == FOIRequestApplicantMapping.foirequestapplicantid - ).join( - ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid ).join( RequestorType, RequestorType.requestortypeid == FOIRequestApplicantMapping.requestortypeid @@ -86,9 +78,9 @@ def getrequestapplicantinfos(cls,foirequest_id,foirequestversion): class FOIRequestApplicantMappingSchema(ma.Schema): class Meta: - fields = ('foirequestapplicantmappingid','foirequest.foirequestid','foirequest.version','requestortype.requestortypeid','requestortype.name','foirequestapplicant.foirequestapplicantid','foirequestapplicant.firstname','foirequestapplicant.lastname','foirequestapplicant.middlename','foirequestapplicant.alsoknownas','foirequestapplicant.dob','foirequestapplicant.businessname','foirequestapplicant.applicantcategory.applicantcategoryid','foirequestapplicant.applicantcategory.name') + fields = ('foirequestapplicantmappingid','foirequest.foirequestid','foirequest.version','requestortype.requestortypeid','requestortype.name','foirequestapplicant.foirequestapplicantid','foirequestapplicant.firstname','foirequestapplicant.lastname','foirequestapplicant.middlename','foirequestapplicant.alsoknownas','foirequestapplicant.dob','foirequestapplicant.businessname') class FOIRequestApplicantInfoSchema(ma.Schema): class Meta: - fields = ('foirequestapplicantmappingid','foirequestid','version','requestortypeid','requestortype','foirequestapplicantid','firstname','lastname','middlename','alsoknownas','dob','businessname','applicantcategoryid','applicantcategory') + fields = ('foirequestapplicantmappingid','foirequestid','version','requestortypeid','requestortype','foirequestapplicantid','firstname','lastname','middlename','alsoknownas','dob','businessname','axisapplicantid') \ No newline at end of file diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index aa1cb40fd..bf26d7663 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -26,9 +26,6 @@ class FOIRequestApplicant(db.Model): alsoknownas = db.Column(db.String(50), unique=False, nullable=True) dob = db.Column(db.DateTime, unique=False, nullable=True) businessname = db.Column(db.String(255), unique=False, nullable=True) - # applicantcategoryid = db.Column(db.Integer, unique=False, nullable=True) - applicantcategoryid = db.Column(db.Integer, ForeignKey('ApplicantCategories.applicantcategoryid'), nullable=True) - applicantcategory = relationship("ApplicantCategory", backref=backref("ApplicantCategories"), uselist=False) created_at = db.Column(db.DateTime, default=datetime.now) updated_at = db.Column(db.DateTime, nullable=True) @@ -36,8 +33,10 @@ class FOIRequestApplicant(db.Model): updatedby = db.Column(db.String(120), unique=False, nullable=True) applicantprofileid = db.Column(db.String(120), unique=False, nullable=True) + axisapplicantid = db.Column(db.Integer, unique=False, nullable=True) + @classmethod - def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, userid): + def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknownas, dob, axisapplicantid, userid): applicant = FOIRequestApplicant() applicant.createdby = userid applicant.firstname = firstname @@ -45,7 +44,7 @@ def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknow applicant.middlename = middlename applicant.businessname = businessname applicant.alsoknownas = alsoknownas - applicant.applicantcategoryid = applicantcategoryid + applicant.axisapplicantid = axisapplicantid if dob is not None and dob != "": applicant.dob = datetime.strptime(dob, "%Y-%m-%d") else: @@ -55,7 +54,7 @@ def createapplicant(cls, firstname, lastname, middlename, businessname, alsoknow return DefaultMethodResult(True,'Applicant added',applicant.foirequestapplicantid) @classmethod - def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, userid): + def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, middlename, businessname, alsoknownas, dob, axisapplicantid, userid): applicantprofile = aliased(FOIRequestApplicant) @@ -85,8 +84,8 @@ def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, midd db.session.commit() dob = datetime.strptime(dob, "%Y-%m-%d") if dob is not None and dob != '' else None - applicantfromform = FOIRequestApplicant().prepareapplicantforcomparing(firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid) - applicantfromdb = FOIRequestApplicant().prepareapplicantforcomparing(applicant.firstname, applicant.lastname, applicant.middlename, applicant.businessname, applicant.alsoknownas, applicant.dob, applicant.applicantcategoryid) + applicantfromform = FOIRequestApplicant().prepareapplicantforcomparing(firstname, lastname, middlename, businessname, alsoknownas, dob, axisapplicantid) + applicantfromdb = FOIRequestApplicant().prepareapplicantforcomparing(applicant.firstname, applicant.lastname, applicant.middlename, applicant.businessname, applicant.alsoknownas, applicant.dob, applicant.axisapplicantid) if applicantfromform != applicantfromdb: _applicant = FOIRequestApplicant() _applicant.createdby = userid @@ -97,7 +96,7 @@ def updateapplicantprofile(cls, foirequestapplicantid, firstname, lastname, midd _applicant.alsoknownas = applicantfromform['alsoknownas'] _applicant.dob = applicantfromform['dob'] _applicant.applicantprofileid = applicant.applicantprofileid - _applicant.applicantcategoryid = applicantfromform['applicantcategoryid'] + _applicant.axisapplicantid = applicantfromform['axisapplicantid'] db.session.add(_applicant) db.session.commit() return DefaultMethodResult(True,'Applicant profile updated',_applicant.foirequestapplicantid) @@ -177,7 +176,8 @@ def getapplicantbyid(cls, applicantid): country.contactinformation.label('country'), personalemployeenumber.attributevalue.label('employeenumber'), personalcorrectionnumber.attributevalue.label('correctionnumber'), - personalhealthnumber.attributevalue.label('phn') + personalhealthnumber.attributevalue.label('phn'), + FOIRequestApplicant.axisapplicantid.label('axisapplicantid') ] subquery_all = _session.query( @@ -197,7 +197,7 @@ def getapplicantbyid(cls, applicantid): # ) ).join( ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid + ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid ).join( subquery_foirequest_maxversion, and_(*joincondition) @@ -363,7 +363,8 @@ def getapplicantbyid(cls, applicantid): func.array_agg(subquery_all.c.othercontactinfo).label('othercontactinfo'), func.array_agg(subquery_all.c.employeenumber).label('employeenumber'), func.array_agg(subquery_all.c.correctionnumber).label('correctionnumber'), - func.array_agg(subquery_all.c.phn).label('phn') + func.array_agg(subquery_all.c.phn).label('phn'), + func.array_agg(subquery_all.c.axisapplicantid).label('axisapplicantid') ).group_by(subquery_all.c.foirequestapplicantid) applicantprofile_schema = ApplicantProfileSchema() @@ -436,7 +437,8 @@ def getapplicantbyemail(cls, email): country.contactinformation.label('country'), personalemployeenumber.attributevalue.label('employeenumber'), personalcorrectionnumber.attributevalue.label('correctionnumber'), - personalhealthnumber.attributevalue.label('phn') + personalhealthnumber.attributevalue.label('phn'), + FOIRequestApplicant.axisapplicantid.label('axisapplicantid') ] subquery_all = _session.query( @@ -458,7 +460,7 @@ def getapplicantbyemail(cls, email): # ) ).join( ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid + ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid ).join( subquery_foirequest_maxversion, and_(*joincondition) @@ -630,7 +632,8 @@ def getapplicantbyemail(cls, email): func.array_agg(subquery_all.c.othercontactinfo).label('othercontactinfo'), func.array_agg(subquery_all.c.employeenumber).label('employeenumber'), func.array_agg(subquery_all.c.correctionnumber).label('correctionnumber'), - func.array_agg(subquery_all.c.phn).label('phn') + func.array_agg(subquery_all.c.phn).label('phn'), + func.array_agg(subquery_all.c.axisapplicantid).label('axisapplicantid') ).group_by(subquery_all.c.foirequestapplicantid) applicantprofile_schema = ApplicantProfileSchema(many=True) @@ -704,7 +707,8 @@ def searchapplicant(cls, keywords): contactother.contactinformation.label('othercontactinfo'), personalemployeenumber.attributevalue.label('employeenumber'), personalcorrectionnumber.attributevalue.label('correctionnumber'), - personalhealthnumber.attributevalue.label('phn') + personalhealthnumber.attributevalue.label('phn'), + FOIRequestApplicant.axisapplicantid.label('axisapplicantid') ] subquery_all = _session.query( @@ -726,7 +730,7 @@ def searchapplicant(cls, keywords): # ) ).join( ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid + ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid ).join( subquery_foirequest_maxversion, and_(*joincondition) @@ -899,7 +903,8 @@ def searchapplicant(cls, keywords): func.array_agg(subquery_all.c.othercontactinfo).label('othercontactinfo'), func.array_agg(subquery_all.c.employeenumber).label('employeenumber'), func.array_agg(subquery_all.c.correctionnumber).label('correctionnumber'), - func.array_agg(subquery_all.c.phn).label('phn') + func.array_agg(subquery_all.c.phn).label('phn'), + func.array_agg(subquery_all.c.axisapplicantid).label('axisapplicantid') ).group_by(subquery_all.c.foirequestapplicantid) applicantprofile_schema = ApplicantProfileSchema(many=True) @@ -992,7 +997,8 @@ def getapplicanthistory(cls, applicantid): country.contactinformation.label('country'), personalemployeenumber.attributevalue.label('employeenumber'), personalcorrectionnumber.attributevalue.label('correctionnumber'), - personalhealthnumber.attributevalue.label('phn') + personalhealthnumber.attributevalue.label('phn'), + FOIRequestApplicant.axisapplicantid.label('axisapplicantid') ] query_all = _session.query( @@ -1021,7 +1027,7 @@ def getapplicanthistory(cls, applicantid): FOIRequest.version == FOIRequestApplicantMapping.foirequestversion_id) ).join( ApplicantCategory, - ApplicantCategory.applicantcategoryid == FOIRequestApplicant.applicantcategoryid + ApplicantCategory.applicantcategoryid == FOIRequest.applicantcategoryid ).join( contactemail, and_( @@ -1232,7 +1238,7 @@ def getapplicantrequests(cls, applicantid): return applicantrequest_schema.dump(query_all.all()) @classmethod - def prepareapplicantforcomparing(cls, firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid): + def prepareapplicantforcomparing(cls, firstname, lastname, middlename, businessname, alsoknownas, dob, axisapplicantid): return { 'firstname': firstname if firstname is not None or firstname != '' else None, 'lastname': lastname if lastname is not None or lastname != '' else None, @@ -1240,20 +1246,20 @@ def prepareapplicantforcomparing(cls, firstname, lastname, middlename, businessn 'businessname': businessname if businessname is not None or businessname != '' else None, 'alsoknownas': alsoknownas if alsoknownas is not None or alsoknownas != '' else None, 'dob': dob if dob is not None and dob != '' else None, - 'applicantcategoryid': applicantcategoryid if applicantcategoryid is not None or applicantcategoryid != 0 else None, + 'axisapplicantid': axisapplicantid if axisapplicantid is not None and axisapplicantid != 0 else None, } class FOIRequestApplicantSchema(ma.Schema): class Meta: - fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob','businessname','applicantcategory.applicantcategoryid','applicantcategory.name') + fields = ('foirequestapplicantid','firstname','middlename','lastname','alsoknownas','dob','businessname','axisapplicantid') class ApplicantProfileSchema(ma.Schema): class Meta: fields = ('applicantprofileid','updatedat','createdby','foirequestapplicantid','firstname','middlename','lastname', 'alsoknownas','dob','businessname','foirequestid','foirequestversion','requesttype','applicantcategory', 'email','address','city','province','postal','country','homephone','workphone', - 'workphone2','mobilephone','othercontactinfo','employeenumber','correctionnumber','phn') + 'workphone2','mobilephone','othercontactinfo','employeenumber','correctionnumber','phn','axisapplicantid') class ApplicantRequestSchema(ma.Schema): class Meta: diff --git a/request-management-api/request_api/models/FOIRequests.py b/request-management-api/request_api/models/FOIRequests.py index b84aacf6a..fcd9ea81a 100644 --- a/request-management-api/request_api/models/FOIRequests.py +++ b/request-management-api/request_api/models/FOIRequests.py @@ -32,8 +32,8 @@ class FOIRequest(db.Model): #ForeignKey References - # applicantcategoryid = db.Column(db.Integer,ForeignKey('ApplicantCategories.applicantcategoryid')) - # applicantcategory = relationship("ApplicantCategory",backref=backref("ApplicantCategories"),uselist=False) + applicantcategoryid = db.Column(db.Integer,ForeignKey('ApplicantCategories.applicantcategoryid')) + applicantcategory = relationship("ApplicantCategory",backref=backref("ApplicantCategories"),uselist=False) deliverymodeid = db.Column(db.Integer,ForeignKey('DeliveryModes.deliverymodeid')) deliverymode = relationship("DeliveryMode",backref=backref("DeliveryModes"),uselist=False) @@ -121,5 +121,6 @@ class FOIRequestsSchema(ma.Schema): class Meta: fields = ('foirequestid','version','foirawrequestid','requesttype','receiveddate','initialdescription', 'initialrecordSearchFromDate','initialrecordsearchtodate','receivedmode.receivedmodeid', - 'deliverymode.deliverymodeid','receivedmode.name','deliverymode.name','wfinstanceid','ministryRequests') + 'deliverymode.deliverymodeid','receivedmode.name','deliverymode.name', + 'applicantcategory.applicantcategoryid','applicantcategory.name','wfinstanceid','ministryRequests') \ No newline at end of file diff --git a/request-management-api/request_api/schemas/foiapplicant.py b/request-management-api/request_api/schemas/foiapplicant.py index e802f1748..4ebf7de5f 100644 --- a/request-management-api/request_api/schemas/foiapplicant.py +++ b/request-management-api/request_api/schemas/foiapplicant.py @@ -13,7 +13,6 @@ class Meta: # pylint: disable=too-few-public-methods lastName = fields.Str(data_key="lastName", required=True,validate=[validate.Length(min=1, error=BLANK_EXCEPTION_MESSAGE, max=50)]) email = fields.Str(data_key="email",allow_none=True, validate=[validate.Length(max=120, error=MAX_EXCEPTION_MESSAGE)]) businessName = fields.Str(data_key="businessName",allow_none=True, validate=[validate.Length(max=255, error=MAX_EXCEPTION_MESSAGE)]) - category = fields.Str(data_key="category", required=True,validate=[validate.Length(min=1, error=BLANK_EXCEPTION_MESSAGE)]) phonePrimary = fields.Str(data_key="phonePrimary",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) workPhonePrimary = fields.Str(data_key="workPhonePrimary",allow_none=True, validate=[validate.Length(max=50, error=MAX_EXCEPTION_MESSAGE)]) @@ -31,4 +30,4 @@ class Meta: # pylint: disable=too-few-public-methods foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) foirequestID = fields.List(fields.Int(),data_key="foirequestID",required=False,allow_none=False) additionalPersonalInfo = fields.Nested(FOIAdditionallPersonalInfoWrapperSchema,required=False,allow_none=True) - category = fields.Str(data_key="category",allow_none=True) \ No newline at end of file + axisApplicantID = fields.Int(data_key="axisApplicantID",required=False,allow_none=True) \ No newline at end of file diff --git a/request-management-api/request_api/schemas/foirequest.py b/request-management-api/request_api/schemas/foirequest.py index e96c4d2c0..840ce241e 100644 --- a/request-management-api/request_api/schemas/foirequest.py +++ b/request-management-api/request_api/schemas/foirequest.py @@ -52,7 +52,6 @@ class Meta: # pylint: disable=too-few-public-methods alsoknownas = fields.Str(data_key="alsoKnownAs") dob = fields.Date(data_key="dob") businessname = fields.Str(data_key="businessName") - applicantcategoryid = fields.Int(data_key="applicantCategoryID") class FOIRequestApplicantSchema(Schema): class Meta: # pylint: disable=too-few-public-methods diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index da51cbb55..a8ffde66a 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -4,7 +4,6 @@ from request_api.models.FOIRequestApplicants import FOIRequestApplicant from request_api.models.FOIMinistryRequests import FOIMinistryRequest from request_api.models.FOIRawRequests import FOIRawRequest -from request_api.models.ApplicantCategories import ApplicantCategory from request_api.services.requestservice import requestservicegetter, requestservicecreate from request_api.services.rawrequestservice import rawrequestservice from request_api.auth import AuthHelper @@ -45,7 +44,6 @@ def searchapplicant(self, keywords): return applicantqueue def saveapplicantinfo(self, applicantschema, userid): - categoryid = ApplicantCategory().getapplicantcategory(applicantschema['category'])["applicantcategoryid"] applicant = FOIRequestApplicant.updateapplicantprofile( applicantschema['foiRequestApplicantID'], applicantschema['firstName'], @@ -54,7 +52,7 @@ def saveapplicantinfo(self, applicantschema, userid): applicantschema['businessName'], applicantschema.get('additionalPersonalInfo', None).get('alsoKnownAs', None), applicantschema.get('additionalPersonalInfo', None).get('birthDate', None), - categoryid, + applicantschema['axisApplicantID'], userid ) # replace with applicant id once new save function is written # requests = FOIMinistryRequest.getopenrequestsbyrequestId(applicantschema['foirequestID']) @@ -129,6 +127,7 @@ def __prepareapplicant(self, applicant): 'otherContactInfo': self.__first_not_null(applicant["othercontactinfo"]), 'publicServiceEmployeeNumber': self.__first_not_null(applicant["employeenumber"]), 'correctionalServiceNumber': self.__first_not_null(applicant["correctionnumber"]), + 'axisApplilcantID': self.__first_not_null(applicant["axisApplicantID"]), } def getapplicanthistory(self, applicantid): @@ -172,7 +171,7 @@ def __prepareapplicantforcomparing(self, applicant): 'Other Contact Info': applicant["othercontactinfo"], 'Employee Number': applicant["employeenumber"], 'Corrections Number': applicant["correctionnumber"], - 'Applicant Category': applicant["applicantcategory"], + # 'Applicant Category': applicant["applicantcategory"], } def getapplicantrequests(self, applicantid): diff --git a/request-management-api/request_api/services/foirequest/requestservicebuilder.py b/request-management-api/request_api/services/foirequest/requestservicebuilder.py index 6b28811ce..0e544e3d4 100644 --- a/request-management-api/request_api/services/foirequest/requestservicebuilder.py +++ b/request-management-api/request_api/services/foirequest/requestservicebuilder.py @@ -126,9 +126,9 @@ def createcontactinformation(self,dataformat, name, value, contacttypes, userid) contactinformation.contacttypeid =contacttype["contacttypeid"] return contactinformation - def createapplicant(self,firstname, lastname, appltcategory, userid, middlename = None, businessname = None, alsoknownas = None, dob = None, applicantcategoryid = None): + def createapplicant(self,firstname, lastname, appltcategory, userid, middlename = None, businessname = None, alsoknownas = None, dob = None): requestapplicant = FOIRequestApplicantMapping() - _applicant = FOIRequestApplicant().createapplicant(firstname, lastname, middlename, businessname, alsoknownas, dob, applicantcategoryid, userid) + _applicant = FOIRequestApplicant().createapplicant(firstname, lastname, middlename, businessname, alsoknownas, dob, userid) requestapplicant.foirequestapplicantid = _applicant.identifier if appltcategory is not None: requestertype = RequestorType().getrequestortype(appltcategory) diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index 278469e46..8c5db6be8 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -41,8 +41,8 @@ def saverequest(self,foirequestschema, userid, foirequestid=None, ministryid=Non openfoirequest.deliverymodeid = requestserviceconfigurator().getvalueof("deliveryMode",foirequestschema.get("deliveryMode")) if requestservicebuilder().isNotBlankorNone(foirequestschema,"receivedMode","main") == True: openfoirequest.receivedmodeid = requestserviceconfigurator().getvalueof("receivedMode",foirequestschema.get("receivedMode")) - # if requestservicebuilder().isNotBlankorNone(foirequestschema,"category","main") == True: - # openfoirequest.applicantcategoryid = requestserviceconfigurator().getvalueof("category",foirequestschema.get("category")) + if requestservicebuilder().isNotBlankorNone(foirequestschema,"category","main") == True: + openfoirequest.applicantcategoryid = requestserviceconfigurator().getvalueof("category",foirequestschema.get("category")) openfoirequest.personalAttributes = self._prearepersonalattributes(foirequestschema, userid) openfoirequest.requestApplicants = self.__prepareapplicants(foirequestschema, userid) if foirequestid is not None: @@ -129,7 +129,6 @@ def __prepareapplicants(self, foirequestschema, userid): requestapplicantarr = [] selfalsoknownas=None selfdob=None - selfcategoryid = requestserviceconfigurator().getvalueof("category",foirequestschema.get("category")) if requestservicebuilder().isNotBlankorNone(foirequestschema,"category","main") == True else None if foirequestschema.get("additionalPersonalInfo") is not None: applicantinfo = foirequestschema.get("additionalPersonalInfo") selfdob = applicantinfo["birthDate"] if requestservicebuilder().isNotBlankorNone(foirequestschema,"birthDate","additionalPersonalInfo") else None @@ -151,8 +150,7 @@ def __prepareapplicants(self, foirequestschema, userid): foirequestschema.get("middleName"), foirequestschema.get("businessName"), selfalsoknownas, - selfdob, - selfcategoryid) + selfdob) ) #Prepare additional applicants diff --git a/request-management-api/request_api/services/foirequest/requestservicegetter.py b/request-management-api/request_api/services/foirequest/requestservicegetter.py index a599c2d18..78b6c9ef8 100644 --- a/request-management-api/request_api/services/foirequest/requestservicegetter.py +++ b/request-management-api/request_api/services/foirequest/requestservicegetter.py @@ -50,11 +50,10 @@ def getrequest(self,foirequestid,foiministryrequestid): alsoknownas = applicant['alsoknownas'] foirequestapplicantid = applicant['foirequestapplicantid'] requestortypeid = applicant['requestortypeid'] - categoryid = applicant['applicantcategoryid'] - category = applicant['applicantcategory'] + axisapplicantid = applicant['axisapplicantid'] if requestortypeid == 1: - baserequestinfo.update(self.__prepareapplicant(foirequestapplicantid, firstname, middlename, lastname, businessname, categoryid, category)) + baserequestinfo.update(self.__prepareapplicant(foirequestapplicantid, firstname, middlename, lastname, businessname, axisapplicantid)) additionalpersonalinfo.update(self.__prepareadditionalpersonalinfo(requestortypeid, firstname, middlename, lastname, dob, alsoknownas)) baserequestdetails, additionalpersonalinfodetails = self.preparepersonalattributes(foirequestid, request['version']) @@ -100,12 +99,11 @@ def getrequestdetailsforministry(self,foirequestid,foiministryrequestid, authmem dob = parse(dobraw).strftime(self.__genericdateformat()) if dobraw is not None else '' foirequestapplicantid = applicant['foirequestapplicantid'] requestortypeid = applicant['requestortypeid'] - categoryid = applicant['applicantcategoryid'] - category = applicant['applicantcategory'] businessname = None + axisapplicantid = applicant['axisapplicantid'] if requestortypeid == 1: - baserequestinfo.update(self.__prepareapplicant(foirequestapplicantid, firstname, middlename, lastname, businessname, categoryid, category)) + baserequestinfo.update(self.__prepareapplicant(foirequestapplicantid, firstname, middlename, lastname, businessname, axisapplicantid)) additionalpersonalinfo.update(self.__prepareadditionalpersonalinfo(requestortypeid, firstname, middlename, lastname, dob)) baserequestdetails, additionalpersonalinfodetails = self.preparepersonalattributes(foirequestid, request['version']) baserequestinfo.update(baserequestdetails) @@ -171,8 +169,8 @@ def __preparebaseinfo(self,request,foiministryrequestid,requestministry,requestm 'originalDueDate': parse(requestministry['originalldd']).strftime(self.__genericdateformat()) if requestministry['originalldd'] is not None else parse(requestministry['duedate']).strftime(self.__genericdateformat()), 'programareaid':requestministry['programarea.programareaid'], 'bcgovcode':requestministry['programarea.bcgovcode'], - # 'category':'', - # 'categoryid':0, + 'category':request['applicantcategory.name'], + 'categoryid':request['applicantcategory.applicantcategoryid'], 'assignedministrygroup':requestministry["assignedministrygroup"], 'assignedministryperson':requestministry["assignedministryperson"], 'selectedMinistries':[{'code':requestministry['programarea.bcgovcode'],'id':requestministry['foiministryrequestid'],'name':requestministry['programarea.name'],'selected':'true'}], @@ -287,15 +285,14 @@ def hasreopened(self, requestid): return True return False - def __prepareapplicant(self, foirequestapplicantid=None, firstname=None, middlename=None, lastname=None, businessname=None, applicantcategoryid=None, applicantcategory=None): + def __prepareapplicant(self, foirequestapplicantid=None, firstname=None, middlename=None, lastname=None, businessname=None, axisapplicantid=None): return { 'firstName': firstname, 'middleName': middlename, 'lastName': lastname, 'businessName': businessname, 'foiRequestApplicantID': foirequestapplicantid, - 'categoryid': applicantcategoryid, - 'category': applicantcategory + 'axisApplicantID': axisapplicantid } def __prepareadditionalpersonalinfo(self, requestortypeid, firstname= None, middlename= None, lastname= None, dob= None, alsoknownas= None): diff --git a/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py b/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py index b1e53b50d..842d7405b 100644 --- a/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py +++ b/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py @@ -31,7 +31,7 @@ def createfoirequestfromobject(self, foiobject, userid): foirequest.receiveddate = foiobject['receiveddate'] if 'receiveddate' in foiobject else None foirequest.requesttype = foiobject['requesttype'] foirequest.wfinstanceid = foiobject['wfinstanceid'] - # foirequest.applicantcategoryid = foiobject["applicantcategory.applicantcategoryid"] + foirequest.applicantcategoryid = foiobject["applicantcategory.applicantcategoryid"] foirequest.deliverymodeid = foiobject["deliverymode.deliverymodeid"] foirequest.receivedmodeid = foiobject["receivedmode.receivedmodeid"] foirequest.createdby = userid diff --git a/request-management-api/requirements.txt b/request-management-api/requirements.txt index ddc56c845..6debf8925 100644 --- a/request-management-api/requirements.txt +++ b/request-management-api/requirements.txt @@ -52,7 +52,7 @@ python-dotenv==0.16.0 python-editor==1.0.4 python-jose==3.2.0 pytz==2021.1 -requests==2.25.1 +requests==2.31.0 rsa==4.7.2 sentry-sdk==1.0.0 six==1.15.0 @@ -66,9 +66,9 @@ maya==0.6.1 pyjwt==2.1.0 aws-requests-auth==0.4.3 holidays==0.12 -Flask-SocketIO==5.1.0 +Flask-SocketIO==5.3.6 Flask-Login==0.5.0 -eventlet==0.33.3 +eventlet==0.35.2 uritemplate.py==3.0.2 urllib3==1.26.15 ndg-httpsclient From 03537f2249aff2ec9dafca53ef4b242a2242c26c Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Mon, 4 Mar 2024 21:45:43 -0800 Subject: [PATCH 083/147] FOIMOD-2956: lowercase axisapplicantid --- .../request_api/models/FOIMinistryRequests.py | 2 +- request-management-api/request_api/schemas/foiapplicant.py | 2 +- .../request_api/schemas/foirequestwrapper.py | 2 +- .../request_api/services/applicantservice.py | 4 ++-- .../request_api/services/foirequest/requestservicegetter.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index 0b1b697f2..b6939a54f 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -208,7 +208,7 @@ def getrequests(cls, group = None): _request["ministryrequestid"] = ministryrequest['foiministryrequestid'] _request["applicantcategory"]= parentrequest.applicantcategory.name _request["identityverified"] = ministryrequest['identityverified'] - _request["axisApplicantID"] = requestapplicants[0]['axisapplicantid'] + _request["axisapplicantid"] = requestapplicants[0]['axisapplicantid'] _requests.append(_request) return _requests diff --git a/request-management-api/request_api/schemas/foiapplicant.py b/request-management-api/request_api/schemas/foiapplicant.py index 4ebf7de5f..f26d8d8d6 100644 --- a/request-management-api/request_api/schemas/foiapplicant.py +++ b/request-management-api/request_api/schemas/foiapplicant.py @@ -30,4 +30,4 @@ class Meta: # pylint: disable=too-few-public-methods foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) foirequestID = fields.List(fields.Int(),data_key="foirequestID",required=False,allow_none=False) additionalPersonalInfo = fields.Nested(FOIAdditionallPersonalInfoWrapperSchema,required=False,allow_none=True) - axisApplicantID = fields.Int(data_key="axisApplicantID",required=False,allow_none=True) \ No newline at end of file + axisapplicantid = fields.Int(data_key="axisapplicantid",required=False,allow_none=True) \ No newline at end of file diff --git a/request-management-api/request_api/schemas/foirequestwrapper.py b/request-management-api/request_api/schemas/foirequestwrapper.py index e7c53f5eb..e077b0817 100644 --- a/request-management-api/request_api/schemas/foirequestwrapper.py +++ b/request-management-api/request_api/schemas/foirequestwrapper.py @@ -141,7 +141,7 @@ class Meta: # pylint: disable=too-few-public-methods isiaorestricted = fields.Bool(data_key="isiaorestricted") foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) - axisapplicantid = fields.Int(data_key="axisApplicantID",required=False,allow_none=True) + axisapplicantid = fields.Int(data_key="axisapplicantid",required=False,allow_none=True) isoipcreview = fields.Bool(data_key="isoipcreview") selectedMinistries = fields.Nested(FOIMinistryRequestWrapperSchema, many=True) diff --git a/request-management-api/request_api/services/applicantservice.py b/request-management-api/request_api/services/applicantservice.py index a8ffde66a..c552f0a44 100644 --- a/request-management-api/request_api/services/applicantservice.py +++ b/request-management-api/request_api/services/applicantservice.py @@ -52,7 +52,7 @@ def saveapplicantinfo(self, applicantschema, userid): applicantschema['businessName'], applicantschema.get('additionalPersonalInfo', None).get('alsoKnownAs', None), applicantschema.get('additionalPersonalInfo', None).get('birthDate', None), - applicantschema['axisApplicantID'], + applicantschema['axisapplicantid'], userid ) # replace with applicant id once new save function is written # requests = FOIMinistryRequest.getopenrequestsbyrequestId(applicantschema['foirequestID']) @@ -127,7 +127,7 @@ def __prepareapplicant(self, applicant): 'otherContactInfo': self.__first_not_null(applicant["othercontactinfo"]), 'publicServiceEmployeeNumber': self.__first_not_null(applicant["employeenumber"]), 'correctionalServiceNumber': self.__first_not_null(applicant["correctionnumber"]), - 'axisApplilcantID': self.__first_not_null(applicant["axisApplicantID"]), + 'axisapplicantid': self.__first_not_null(applicant["axisapplicantid"]), } def getapplicanthistory(self, applicantid): diff --git a/request-management-api/request_api/services/foirequest/requestservicegetter.py b/request-management-api/request_api/services/foirequest/requestservicegetter.py index 78b6c9ef8..7527f9148 100644 --- a/request-management-api/request_api/services/foirequest/requestservicegetter.py +++ b/request-management-api/request_api/services/foirequest/requestservicegetter.py @@ -292,7 +292,7 @@ def __prepareapplicant(self, foirequestapplicantid=None, firstname=None, middlen 'lastName': lastname, 'businessName': businessname, 'foiRequestApplicantID': foirequestapplicantid, - 'axisApplicantID': axisapplicantid + 'axisapplicantid': axisapplicantid } def __prepareadditionalpersonalinfo(self, requestortypeid, firstname= None, middlename= None, lastname= None, dob= None, alsoknownas= None): From 61c9929132acc77f91396419b6cf71ddc54fffc3 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 5 Mar 2024 00:01:44 -0800 Subject: [PATCH 084/147] FOIMOD-2956: bug fix --- .../request_api/services/foirequest/requestservicecreate.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/request-management-api/request_api/services/foirequest/requestservicecreate.py b/request-management-api/request_api/services/foirequest/requestservicecreate.py index dd6aad0b4..447483b53 100644 --- a/request-management-api/request_api/services/foirequest/requestservicecreate.py +++ b/request-management-api/request_api/services/foirequest/requestservicecreate.py @@ -144,9 +144,8 @@ def __prepareapplicants(self, foirequestschema, userid): foirequestschema['lastName'], foirequestschema.get("middleName"), foirequestschema.get("businessName"), - selfdob, selfalsoknownas, - None, + selfdob, foirequestschema.get('axisapplicantid', None), userid ) From 5a0b36ae02de04f958dbac82b8baf2f188ec8bf3 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 5 Mar 2024 00:18:27 -0800 Subject: [PATCH 085/147] FOIMOD-2956: bug fix --- request-management-api/request_api/schemas/foirequestwrapper.py | 2 +- .../request_api/services/foirequest/requestservicegetter.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/request-management-api/request_api/schemas/foirequestwrapper.py b/request-management-api/request_api/schemas/foirequestwrapper.py index e077b0817..e7c53f5eb 100644 --- a/request-management-api/request_api/schemas/foirequestwrapper.py +++ b/request-management-api/request_api/schemas/foirequestwrapper.py @@ -141,7 +141,7 @@ class Meta: # pylint: disable=too-few-public-methods isiaorestricted = fields.Bool(data_key="isiaorestricted") foiRequestApplicantID = fields.Int(data_key="foiRequestApplicantID",required=False,allow_none=True) - axisapplicantid = fields.Int(data_key="axisapplicantid",required=False,allow_none=True) + axisapplicantid = fields.Int(data_key="axisApplicantID",required=False,allow_none=True) isoipcreview = fields.Bool(data_key="isoipcreview") selectedMinistries = fields.Nested(FOIMinistryRequestWrapperSchema, many=True) diff --git a/request-management-api/request_api/services/foirequest/requestservicegetter.py b/request-management-api/request_api/services/foirequest/requestservicegetter.py index 7527f9148..78b6c9ef8 100644 --- a/request-management-api/request_api/services/foirequest/requestservicegetter.py +++ b/request-management-api/request_api/services/foirequest/requestservicegetter.py @@ -292,7 +292,7 @@ def __prepareapplicant(self, foirequestapplicantid=None, firstname=None, middlen 'lastName': lastname, 'businessName': businessname, 'foiRequestApplicantID': foirequestapplicantid, - 'axisapplicantid': axisapplicantid + 'axisApplicantID': axisapplicantid } def __prepareadditionalpersonalinfo(self, requestortypeid, firstname= None, middlename= None, lastname= None, dob= None, alsoknownas= None): From 7d3ab11fd5a6d74cd82f64489b6f49179db17534 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Wed, 6 Mar 2024 17:19:19 -0800 Subject: [PATCH 086/147] FOIMOD-2956: sync axisapplicantid for ongoing requests --- .../src/components/FOI/FOIRequest/FOIRequest.js | 1 + .../src/constants/FOI/axisSyncDisplayFields.js | 4 +++- .../request_api/models/FOIRequestApplicants.py | 10 +++++----- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index 34c71f31a..2abbfe774 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -434,6 +434,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { typeof data["linkedRequests"] == "string" ? JSON.parse(data["linkedRequests"]) : data["linkedRequests"]; + data["axisApplicantID"] = ("axisApplicantID" in data) ? parseInt(data["axisApplicantID"]) : null; setAxisSyncedData(data); let axisDataUpdated = checkIfAxisDataUpdated(data); if (axisDataUpdated) { diff --git a/forms-flow-web/src/constants/FOI/axisSyncDisplayFields.js b/forms-flow-web/src/constants/FOI/axisSyncDisplayFields.js index f435ee8a9..ca4c1e761 100644 --- a/forms-flow-web/src/constants/FOI/axisSyncDisplayFields.js +++ b/forms-flow-web/src/constants/FOI/axisSyncDisplayFields.js @@ -42,7 +42,9 @@ const AXIS_SYNC_DISPLAY_FIELDS = { requestPageCount: "Total number of pages", subjectCode: "Subject Code", linkedRequests: "Linked Requests", - identityVerified:"Identity Verified" + identityVerified:"Identity Verified", + + axisApplicantID:"AXIS Applicant ID" }; export default AXIS_SYNC_DISPLAY_FIELDS; diff --git a/request-management-api/request_api/models/FOIRequestApplicants.py b/request-management-api/request_api/models/FOIRequestApplicants.py index cebaae25a..8d0e469e3 100644 --- a/request-management-api/request_api/models/FOIRequestApplicants.py +++ b/request-management-api/request_api/models/FOIRequestApplicants.py @@ -1250,11 +1250,11 @@ def getapplicantrequests(cls, applicantid): @classmethod def prepareapplicantforcomparing(cls, firstname, lastname, middlename, businessname, alsoknownas, dob, axisapplicantid): return { - 'firstname': firstname if firstname is not None or firstname != '' else None, - 'lastname': lastname if lastname is not None or lastname != '' else None, - 'middlename': middlename if middlename is not None or middlename != '' else None, - 'businessname': businessname if businessname is not None or businessname != '' else None, - 'alsoknownas': alsoknownas if alsoknownas is not None or alsoknownas != '' else None, + 'firstname': firstname if firstname is not None and firstname != '' else None, + 'lastname': lastname if lastname is not None and lastname != '' else None, + 'middlename': middlename if middlename is not None and middlename != '' else None, + 'businessname': businessname if businessname is not None and businessname != '' else None, + 'alsoknownas': alsoknownas if alsoknownas is not None and alsoknownas != '' else None, 'dob': dob if dob is not None and dob != '' else None, 'axisapplicantid': axisapplicantid if axisapplicantid is not None and axisapplicantid != 0 else None, } From 10be2bbd81f23382a0dbf22ced506e475607c16b Mon Sep 17 00:00:00 2001 From: Milos Despotovic Date: Wed, 10 Apr 2024 12:11:06 -0700 Subject: [PATCH 087/147] Add records ready for review to enum and request filters --- .../request_api/models/FOIMinistryRequests.py | 4 ++-- request-management-api/request_api/utils/enums.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index 11df05b8e..80787c307 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -174,7 +174,7 @@ def getrequests(cls, group = None): elif (group in ProcessingTeamWithKeycloackGroup.list()): _ministryrequestids = _session.query(distinct(FOIMinistryRequest.foiministryrequestid)).filter(and_(FOIMinistryRequest.isactive == True), and_(and_(FOIMinistryRequest.assignedgroup == group),and_(FOIMinistryRequest.requeststatuslabel.in_([StateName.open.name,StateName.callforrecords.name,StateName.closed.name,StateName.recordsreview.name,StateName.feeestimate.name,StateName.consult.name,StateName.ministrysignoff.value,StateName.onhold.name,StateName.response.name,StateName.peerreview.name,StateName.tagging.name,StateName.readytoscan.name])))).all() else: - _ministryrequestids = _session.query(distinct(FOIMinistryRequest.foiministryrequestid)).filter(and_(FOIMinistryRequest.isactive == True), or_(and_(FOIMinistryRequest.assignedgroup == group),and_(FOIMinistryRequest.assignedministrygroup == group,or_(FOIMinistryRequest.requeststatuslabel.in_([StateName.callforrecords.name,StateName.recordsreview.name,StateName.feeestimate.name,StateName.consult.name,StateName.ministrysignoff.name,StateName.onhold.name,StateName.deduplication.name,StateName.harmsassessment.name,StateName.response.name,StateName.peerreview.name,StateName.tagging.name,StateName.readytoscan.name]))))).all() + _ministryrequestids = _session.query(distinct(FOIMinistryRequest.foiministryrequestid)).filter(and_(FOIMinistryRequest.isactive == True), or_(and_(FOIMinistryRequest.assignedgroup == group),and_(FOIMinistryRequest.assignedministrygroup == group,or_(FOIMinistryRequest.requeststatuslabel.in_([StateName.callforrecords.name,StateName.recordsreview.name,StateName.recordsreadyforreview.name,StateName.feeestimate.name,StateName.consult.name,StateName.ministrysignoff.name,StateName.onhold.name,StateName.deduplication.name,StateName.harmsassessment.name,StateName.response.name,StateName.peerreview.name,StateName.tagging.name,StateName.readytoscan.name]))))).all() _requests = [] ministryrequest_schema = FOIMinistryRequestSchema() @@ -733,7 +733,7 @@ def getgroupfilters(cls, groups): ) ) ) - statusfilter = FOIMinistryRequest.requeststatuslabel.in_([StateName.callforrecords.name,StateName.recordsreview.name,StateName.feeestimate.name,StateName.consult.name,StateName.ministrysignoff.name,StateName.onhold.name,StateName.deduplication.name,StateName.harmsassessment.name,StateName.response.name,StateName.peerreview.name,StateName.tagging.name,StateName.readytoscan.name]) + statusfilter = FOIMinistryRequest.requeststatuslabel.in_([StateName.callforrecords.name,StateName.recordsreview.name,StateName.recordsreadyforreview.name,StateName.feeestimate.name,StateName.consult.name,StateName.ministrysignoff.name,StateName.onhold.name,StateName.deduplication.name,StateName.harmsassessment.name,StateName.response.name,StateName.peerreview.name,StateName.tagging.name,StateName.readytoscan.name]) ministryfilter = and_( FOIMinistryRequest.isactive == True, FOIRequestStatus.isactive == True, diff --git a/request-management-api/request_api/utils/enums.py b/request-management-api/request_api/utils/enums.py index becdb9d9e..356b347e1 100644 --- a/request-management-api/request_api/utils/enums.py +++ b/request-management-api/request_api/utils/enums.py @@ -157,6 +157,7 @@ class StateName(Enum): response = "Response" feeestimate = "Fee Estimate" recordsreview = "Records Review" + recordsreadyforreview = "Records Ready for Review" archived = "Archived" peerreview = "Peer Review" tagging = "Tagging" From 1f96b2e08cfa92744499a965b51980a09f3f0a5c Mon Sep 17 00:00:00 2001 From: Milos Despotovic Date: Wed, 10 Apr 2024 12:12:27 -0700 Subject: [PATCH 088/147] Add records ready for review state to filter --- .../request_api/models/FOIMinistryRequests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index 80787c307..67584efcd 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -1193,7 +1193,7 @@ def advancedsearch(cls, params, userid, isministryrestrictedfilemanager = False) groupfilter.append(FOIMinistryRequest.assignedministrygroup == group) #ministry advanced search show cfr onwards - statefilter = FOIMinistryRequest.requeststatuslabel.in_([StateName.callforrecords.name,StateName.closed.name,StateName.recordsreview.name,StateName.feeestimate.name,StateName.consult.name,StateName.ministrysignoff.name,StateName.onhold.name,StateName.deduplication.name,StateName.harmsassessment.name,StateName.response.name,StateName.peerreview.name,StateName.tagging.name,StateName.readytoscan.name]) + statefilter = FOIMinistryRequest.requeststatuslabel.in_([StateName.callforrecords.name,StateName.closed.name,StateName.recordsreview.name,StateName.recordsreadyforreview.name,StateName.feeestimate.name,StateName.consult.name,StateName.ministrysignoff.name,StateName.onhold.name,StateName.deduplication.name,StateName.harmsassessment.name,StateName.response.name,StateName.peerreview.name,StateName.tagging.name,StateName.readytoscan.name]) ministry_queue = FOIMinistryRequest.advancedsearchsubquery(params, iaoassignee, ministryassignee, userid, 'Ministry', False, isministryrestrictedfilemanager).filter(and_(or_(*groupfilter), statefilter)) From 53d6e259f2202a7ed4e8b3850b1b01784f410756 Mon Sep 17 00:00:00 2001 From: Shivakumar Date: Mon, 15 Apr 2024 06:55:14 -0700 Subject: [PATCH 089/147] Added RTT and notification for RTT attachments --- .../src/constants/FOI/statusEnum.js | 7 ++++ .../io/redis_stream/reader/notification.py | 3 ++ .../request_api/resources/foiextension.py | 1 + .../request_api/services/documentservice.py | 12 ++++++ .../request_api/services/events/assignment.py | 1 + .../request_api/services/events/attachment.py | 38 +++++++++++++++++++ .../request_api/services/eventservice.py | 11 ++++++ 7 files changed, 73 insertions(+) create mode 100644 request-management-api/request_api/services/events/attachment.py diff --git a/forms-flow-web/src/constants/FOI/statusEnum.js b/forms-flow-web/src/constants/FOI/statusEnum.js index 7849aa74e..8b15ca80a 100644 --- a/forms-flow-web/src/constants/FOI/statusEnum.js +++ b/forms-flow-web/src/constants/FOI/statusEnum.js @@ -413,6 +413,13 @@ const AttachmentCategories = Object.freeze({ bgcolor: "#595959", type: ["tag"], }, + { + name: "rrt", + tags: ["rrt"], + display: "RRT", + bgcolor: "#003366", + type: ["tag"], + }, { // transition: Response -> On hold name: "response-onhold", diff --git a/notification-manager/notification_api/io/redis_stream/reader/notification.py b/notification-manager/notification_api/io/redis_stream/reader/notification.py index 37976c203..4e732c6b7 100644 --- a/notification-manager/notification_api/io/redis_stream/reader/notification.py +++ b/notification-manager/notification_api/io/redis_stream/reader/notification.py @@ -39,6 +39,7 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): while True: logging.info("Reading stream...") messages = stream.read(last_id=last_id, block=BLOCK_TIME) + print("messages: ",messages) if messages: for message_id, message in messages: print(f"processing {message_id}::{message}") @@ -51,10 +52,12 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): logging.info(f"finished processing {message_id}") else: logging.debug(f"No new messages after ID: {last_id}") + print(f"No new messages after ID: {last_id}") def handlemessage(message_id, message): logging.info(f"processing {message_id}::{message}") + print(f"processing {message_id}::{message}") if message is not None: _message = json.dumps({str(key): str(value) for (key, value) in message.items()}) _message = _message.replace("b'","'").replace("'",'') diff --git a/request-management-api/request_api/resources/foiextension.py b/request-management-api/request_api/resources/foiextension.py index ddb8280ac..5b998ab7b 100644 --- a/request-management-api/request_api/resources/foiextension.py +++ b/request-management-api/request_api/resources/foiextension.py @@ -26,6 +26,7 @@ from request_api.exceptions import BusinessException, Error from request_api.services.extensionservice import extensionservice from request_api.schemas.foiextension import FOIRequestExtensionSchema +from request_api.services.eventservice import eventservice import asyncio import json diff --git a/request-management-api/request_api/services/documentservice.py b/request-management-api/request_api/services/documentservice.py index 3fd2c72d1..85e1d24ea 100644 --- a/request-management-api/request_api/services/documentservice.py +++ b/request-management-api/request_api/services/documentservice.py @@ -9,6 +9,7 @@ from request_api.schemas.foidocument import CreateDocumentSchema from request_api.services.external.storageservice import storageservice from request_api.models.FOIApplicantCorrespondenceAttachments import FOIApplicantCorrespondenceAttachment +from request_api.services.eventservice import eventservice from request_api.utils.enums import RequestType import logging @@ -45,6 +46,9 @@ def getrequestdocumentsbyrole(self, requestid, requesttype, isministrymember): def createrequestdocument(self, requestid, documentschema, userid, requesttype): if requesttype == "ministryrequest": + print("ministryrequest document") + print("requestid", requestid) + print("requesttype", requesttype) return self.createministryrequestdocument(requestid, documentschema, userid) else: return self.createrawrequestdocument(requestid, documentschema, userid) @@ -91,6 +95,14 @@ def copyrequestdocuments(self, ministryrequestid, documents, userid): def createministryrequestdocument(self, ministryrequestid, documentschema, userid): version = self.__getversionforrequest(ministryrequestid, "ministryrequest") + print("DOCUMENT SCHEMA IS \n" , documentschema['documents']) + for document in documentschema['documents']: + if 'rrt' in document['category']: + #Create notification event for RRT document + eventservice().attachmentevent(ministryrequestid, document, userid, "add") + #if 'rrt' in documentschema['documents']['category']: + #Create notification event for RRT document + # eventservice().posteventforextension(ministryrequestid, '', userid, '' , "add") return FOIMinistryRequestDocument.createdocuments(ministryrequestid, version, documentschema['documents'], userid) def createrawrequestdocument(self, requestid, documentschema, userid): diff --git a/request-management-api/request_api/services/events/assignment.py b/request-management-api/request_api/services/events/assignment.py index 538317aba..a8260f101 100644 --- a/request-management-api/request_api/services/events/assignment.py +++ b/request-management-api/request_api/services/events/assignment.py @@ -17,6 +17,7 @@ class assignmentevent: """ def createassignmentevent(self, requestid, requesttype, userid, isministryuser,assigneename,username): + print('createassignmentevent') changeresp = self.__haschanged(requestid, requesttype) ischanged = changeresp['ischanged'] previousassignee = changeresp['previous'] diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py new file mode 100644 index 000000000..c344affb8 --- /dev/null +++ b/request-management-api/request_api/services/events/attachment.py @@ -0,0 +1,38 @@ + +from request_api.services.commons.duecalculator import duecalculator +from request_api.services.notificationservice import notificationservice +from request_api.services.commentservice import commentservice +from request_api.models.FOIMinistryRequests import FOIMinistryRequest +from request_api.models.FOIRequestComments import FOIRequestComment +from request_api.models.NotificationTypes import NotificationType +from request_api.exceptions import BusinessException +from request_api.models.default_method_result import DefaultMethodResult +from flask import current_app + +class attachmentevent(): + """ FOI Attachment Event management service + + """ + def createattachmentevent(self, ministryrequestid, document, userid, event): + try: + message = None + notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) + print(f'#### The notification type is {notificationtype}') + self.__createnotification(message, 'foiministryrequestid', notificationtype) + return DefaultMethodResult(True, message, '') + except BusinessException as exception: + current_app.logger.error("%s,%s" % ('Attachment upload notification error', exception.message)) + return DefaultMethodResult(False,'Attachemnt notifications failed') + + def __createnotification(self, message, requestid, notificationtype): + if message is not None: + return notificationservice().createremindernotification({"message" : message}, requestid, "ministryrequest", notificationtype, self.__defaultuserid()) + + def notificationmessage(self, type): + return f"{type} Attachment Uploaded" + + def __notificationtype(self): + return "Attachment Upload Event" + + def __defaultuserid(self): + return "System" \ No newline at end of file diff --git a/request-management-api/request_api/services/eventservice.py b/request-management-api/request_api/services/eventservice.py index 96ba48dcc..182efa27a 100644 --- a/request-management-api/request_api/services/eventservice.py +++ b/request-management-api/request_api/services/eventservice.py @@ -13,6 +13,7 @@ from request_api.services.events.oipcduedate import oipcduedateevent from request_api.services.events.extension import extensionevent from request_api.services.events.cfrfeeform import cfrfeeformevent +from request_api.services.events.attachment import attachmentevent from request_api.services.events.payment import paymentevent from request_api.services.events.email import emailevent from request_api.services.events.section5pending import section5pendingevent @@ -32,6 +33,7 @@ async def postevent(self, requestid, requesttype, userid, username, isministryus self.posteventsync(requestid, requesttype, userid, username, isministryuser,assigneename) def posteventsync(self, requestid, requesttype, userid, username, isministryuser,assigneename=''): + print("\n ..... postevent is triggered ...... \n") try: stateeventresponse = stateevent().createstatetransitionevent(requestid, requesttype, userid, username) divisioneventresponse = divisionevent().createdivisionevent(requestid, requesttype, userid) @@ -58,6 +60,15 @@ def posteventforaxisextension(self, ministryrequestid, extensionids, userid, use current_app.logger.error("FOI Notification failed for event for extension= %s" % (extensionid)) except BusinessException as exception: self.__logbusinessexception(exception) + + def attachmentevent(self, ministryrequestid, document, userid, event): + try: + print("Creating rtt notification event") + attachmenteventresponse = attachmentevent().createattachmentevent(ministryrequestid, document, userid, event) + if attachmenteventresponse.success == False: + current_app.logger.error("FOI Notification failed for event for attachment= %s" % (document['category'])) + except BusinessException as exception: + self.__logbusinessexception(exception) def postreminderevent(self): try: From ff51bf067e384d3a2da2f0ca98a7415b0546a79c Mon Sep 17 00:00:00 2001 From: Shivakumar Date: Mon, 15 Apr 2024 07:55:21 -0700 Subject: [PATCH 090/147] remove printf statements --- .../notification_api/io/redis_stream/reader/notification.py | 3 --- request-management-api/request_api/resources/foiextension.py | 1 - .../request_api/services/events/assignment.py | 1 - 3 files changed, 5 deletions(-) diff --git a/notification-manager/notification_api/io/redis_stream/reader/notification.py b/notification-manager/notification_api/io/redis_stream/reader/notification.py index 4e732c6b7..37976c203 100644 --- a/notification-manager/notification_api/io/redis_stream/reader/notification.py +++ b/notification-manager/notification_api/io/redis_stream/reader/notification.py @@ -39,7 +39,6 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): while True: logging.info("Reading stream...") messages = stream.read(last_id=last_id, block=BLOCK_TIME) - print("messages: ",messages) if messages: for message_id, message in messages: print(f"processing {message_id}::{message}") @@ -52,12 +51,10 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): logging.info(f"finished processing {message_id}") else: logging.debug(f"No new messages after ID: {last_id}") - print(f"No new messages after ID: {last_id}") def handlemessage(message_id, message): logging.info(f"processing {message_id}::{message}") - print(f"processing {message_id}::{message}") if message is not None: _message = json.dumps({str(key): str(value) for (key, value) in message.items()}) _message = _message.replace("b'","'").replace("'",'') diff --git a/request-management-api/request_api/resources/foiextension.py b/request-management-api/request_api/resources/foiextension.py index 5b998ab7b..ddb8280ac 100644 --- a/request-management-api/request_api/resources/foiextension.py +++ b/request-management-api/request_api/resources/foiextension.py @@ -26,7 +26,6 @@ from request_api.exceptions import BusinessException, Error from request_api.services.extensionservice import extensionservice from request_api.schemas.foiextension import FOIRequestExtensionSchema -from request_api.services.eventservice import eventservice import asyncio import json diff --git a/request-management-api/request_api/services/events/assignment.py b/request-management-api/request_api/services/events/assignment.py index a8260f101..538317aba 100644 --- a/request-management-api/request_api/services/events/assignment.py +++ b/request-management-api/request_api/services/events/assignment.py @@ -17,7 +17,6 @@ class assignmentevent: """ def createassignmentevent(self, requestid, requesttype, userid, isministryuser,assigneename,username): - print('createassignmentevent') changeresp = self.__haschanged(requestid, requesttype) ischanged = changeresp['ischanged'] previousassignee = changeresp['previous'] From 70756e4ef0ecc74445a4f5d1e1788c650080ca07 Mon Sep 17 00:00:00 2001 From: Shivakumar Date: Mon, 15 Apr 2024 08:07:38 -0700 Subject: [PATCH 091/147] Added attachment upload event to the json files --- notification-manager/common/notificationtypes.json | 4 ++++ request-management-api/common/notificationtypes.json | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/notification-manager/common/notificationtypes.json b/notification-manager/common/notificationtypes.json index b111c5974..b66dab844 100644 --- a/notification-manager/common/notificationtypes.json +++ b/notification-manager/common/notificationtypes.json @@ -86,5 +86,9 @@ "oipcduereminder": { "name": "OIPC Due Reminder", "notificationtypelabel": "oipcduereminder" + }, + "attachmentuploadevent" { + "name": "Attachment Upload Event", + "notificationtypelabel": "attachmentuploadevent" } } diff --git a/request-management-api/common/notificationtypes.json b/request-management-api/common/notificationtypes.json index b111c5974..b66dab844 100644 --- a/request-management-api/common/notificationtypes.json +++ b/request-management-api/common/notificationtypes.json @@ -86,5 +86,9 @@ "oipcduereminder": { "name": "OIPC Due Reminder", "notificationtypelabel": "oipcduereminder" + }, + "attachmentuploadevent" { + "name": "Attachment Upload Event", + "notificationtypelabel": "attachmentuploadevent" } } From 4dbd1eb5842c276d8c7de79b84ddb9b61f29ce25 Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Mon, 15 Apr 2024 09:00:35 -0700 Subject: [PATCH 092/147] Added the migration script for attachement upload event --- .../common/notificationtypes.json | 2 +- .../common/notificationtypes.json | 2 +- .../versions/e698b39da6bd_add_rtt_tag.py | 22 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 request-management-api/migrations/versions/e698b39da6bd_add_rtt_tag.py diff --git a/notification-manager/common/notificationtypes.json b/notification-manager/common/notificationtypes.json index b66dab844..45d03cda3 100644 --- a/notification-manager/common/notificationtypes.json +++ b/notification-manager/common/notificationtypes.json @@ -87,7 +87,7 @@ "name": "OIPC Due Reminder", "notificationtypelabel": "oipcduereminder" }, - "attachmentuploadevent" { + "attachmentuploadevent": { "name": "Attachment Upload Event", "notificationtypelabel": "attachmentuploadevent" } diff --git a/request-management-api/common/notificationtypes.json b/request-management-api/common/notificationtypes.json index b66dab844..45d03cda3 100644 --- a/request-management-api/common/notificationtypes.json +++ b/request-management-api/common/notificationtypes.json @@ -87,7 +87,7 @@ "name": "OIPC Due Reminder", "notificationtypelabel": "oipcduereminder" }, - "attachmentuploadevent" { + "attachmentuploadevent": { "name": "Attachment Upload Event", "notificationtypelabel": "attachmentuploadevent" } diff --git a/request-management-api/migrations/versions/e698b39da6bd_add_rtt_tag.py b/request-management-api/migrations/versions/e698b39da6bd_add_rtt_tag.py new file mode 100644 index 000000000..9864dfd4f --- /dev/null +++ b/request-management-api/migrations/versions/e698b39da6bd_add_rtt_tag.py @@ -0,0 +1,22 @@ +"""Add RTT tag + +Revision ID: e698b39da6bd +Revises: 6646acda32fe +Create Date: 2024-04-15 08:17:20.554269 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'e698b39da6bd' +down_revision = '6646acda32fe' +branch_labels = None +depends_on = None + +def upgrade(): + op.execute('INSERT INTO public."NotificationTypes"(name, description, isactive,notificationtypelabel ) VALUES (\'Attachment Upload Event\', \'Attachment Upload Event\', true, \'attachmentuploadevent\');') + +def downgrade(): + op.execute('DELETE FROM public."NotificationTypes" WHERE name = \'Attachment Upload Event\';') \ No newline at end of file From ea139b6e284145e53fae47f1f7cace1065dabda7 Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Mon, 15 Apr 2024 14:40:43 -0700 Subject: [PATCH 093/147] Updated notification code to include RRT message --- .../request_api/services/documentservice.py | 3 ++- .../request_api/services/events/attachment.py | 10 ++++------ .../request_api/services/eventservice.py | 5 ++--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/request-management-api/request_api/services/documentservice.py b/request-management-api/request_api/services/documentservice.py index 85e1d24ea..5a0f21c64 100644 --- a/request-management-api/request_api/services/documentservice.py +++ b/request-management-api/request_api/services/documentservice.py @@ -99,7 +99,8 @@ def createministryrequestdocument(self, ministryrequestid, documentschema, useri for document in documentschema['documents']: if 'rrt' in document['category']: #Create notification event for RRT document - eventservice().attachmentevent(ministryrequestid, document, userid, "add") + message = f'RRT Uploaded on FOI Request {ministryrequestid}' + eventservice().attachmentevent(ministryrequestid, document, userid, "add", message) #if 'rrt' in documentschema['documents']['category']: #Create notification event for RRT document # eventservice().posteventforextension(ministryrequestid, '', userid, '' , "add") diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py index c344affb8..6f5f86022 100644 --- a/request-management-api/request_api/services/events/attachment.py +++ b/request-management-api/request_api/services/events/attachment.py @@ -13,20 +13,18 @@ class attachmentevent(): """ FOI Attachment Event management service """ - def createattachmentevent(self, ministryrequestid, document, userid, event): + def createattachmentevent(self, ministryrequestid, message, userid, event): try: - message = None notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) - print(f'#### The notification type is {notificationtype}') - self.__createnotification(message, 'foiministryrequestid', notificationtype) + self.__createnotification(message, ministryrequestid, notificationtype, userid) return DefaultMethodResult(True, message, '') except BusinessException as exception: current_app.logger.error("%s,%s" % ('Attachment upload notification error', exception.message)) return DefaultMethodResult(False,'Attachemnt notifications failed') - def __createnotification(self, message, requestid, notificationtype): + def __createnotification(self, message, requestid, notificationtype, userid): if message is not None: - return notificationservice().createremindernotification({"message" : message}, requestid, "ministryrequest", notificationtype, self.__defaultuserid()) + return notificationservice().createnotification({"message" : message}, requestid, "ministryrequest", notificationtype, userid) def notificationmessage(self, type): return f"{type} Attachment Uploaded" diff --git a/request-management-api/request_api/services/eventservice.py b/request-management-api/request_api/services/eventservice.py index 182efa27a..817405e8b 100644 --- a/request-management-api/request_api/services/eventservice.py +++ b/request-management-api/request_api/services/eventservice.py @@ -61,10 +61,9 @@ def posteventforaxisextension(self, ministryrequestid, extensionids, userid, use except BusinessException as exception: self.__logbusinessexception(exception) - def attachmentevent(self, ministryrequestid, document, userid, event): + def attachmentevent(self, ministryrequestid, document, userid, event, message): try: - print("Creating rtt notification event") - attachmenteventresponse = attachmentevent().createattachmentevent(ministryrequestid, document, userid, event) + attachmenteventresponse = attachmentevent().createattachmentevent(ministryrequestid, message , userid, event) if attachmenteventresponse.success == False: current_app.logger.error("FOI Notification failed for event for attachment= %s" % (document['category'])) except BusinessException as exception: From b89bae498e2e0c86fcd96be4f39c91c7cc407ed7 Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Mon, 15 Apr 2024 14:42:43 -0700 Subject: [PATCH 094/147] Remove all print statements --- .../request_api/services/documentservice.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/request-management-api/request_api/services/documentservice.py b/request-management-api/request_api/services/documentservice.py index 5a0f21c64..70171c588 100644 --- a/request-management-api/request_api/services/documentservice.py +++ b/request-management-api/request_api/services/documentservice.py @@ -46,9 +46,6 @@ def getrequestdocumentsbyrole(self, requestid, requesttype, isministrymember): def createrequestdocument(self, requestid, documentschema, userid, requesttype): if requesttype == "ministryrequest": - print("ministryrequest document") - print("requestid", requestid) - print("requesttype", requesttype) return self.createministryrequestdocument(requestid, documentschema, userid) else: return self.createrawrequestdocument(requestid, documentschema, userid) @@ -95,7 +92,6 @@ def copyrequestdocuments(self, ministryrequestid, documents, userid): def createministryrequestdocument(self, ministryrequestid, documentschema, userid): version = self.__getversionforrequest(ministryrequestid, "ministryrequest") - print("DOCUMENT SCHEMA IS \n" , documentschema['documents']) for document in documentschema['documents']: if 'rrt' in document['category']: #Create notification event for RRT document From 8b5b9dd4ec3f0329e7f4a90a3c2f9b78dced2706 Mon Sep 17 00:00:00 2001 From: Milos Despotovic Date: Mon, 15 Apr 2024 19:10:03 -0700 Subject: [PATCH 095/147] Remove custom unassigned queue for separate IAO teams --- .../src/components/FOI/Dashboard/IAO/Queue.js | 9 +----- .../components/FOI/Dashboard/IAO/columns.js | 28 +------------------ 2 files changed, 2 insertions(+), 35 deletions(-) diff --git a/forms-flow-web/src/components/FOI/Dashboard/IAO/Queue.js b/forms-flow-web/src/components/FOI/Dashboard/IAO/Queue.js index 53a359234..c074d3485 100644 --- a/forms-flow-web/src/components/FOI/Dashboard/IAO/Queue.js +++ b/forms-flow-web/src/components/FOI/Dashboard/IAO/Queue.js @@ -69,14 +69,7 @@ const Queue = ({ userDetail, tableInfo }) => { ); }, [rowsState, sortModel, keyword, requestFilter]); - let columns; - if (requestFilter == 'unassignedRequests') { - columns = tableInfo?.columns.concat(tableInfo.unassignedQueueColumns) - } else { - columns = tableInfo?.columns - } - - const columnsRef = React.useRef(columns || []); + const columnsRef = React.useRef(tableInfo?.columns || []); const requestFilterChange = (filter) => { if (filter === requestFilter) { diff --git a/forms-flow-web/src/components/FOI/Dashboard/IAO/columns.js b/forms-flow-web/src/components/FOI/Dashboard/IAO/columns.js index b55bdb979..213b3dd1d 100644 --- a/forms-flow-web/src/components/FOI/Dashboard/IAO/columns.js +++ b/forms-flow-web/src/components/FOI/Dashboard/IAO/columns.js @@ -237,38 +237,12 @@ const FlexTeamColumns = [ } ]; -const unassignedQueueColumns = [ - { - field: "onBehalfFormatted", - headerName: "ON BEHALF", - headerAlign: "left", - flex: 0.5, - valueGetter: (params) => - params.row.onBehalfFormatted === undefined ? "N/A" : params.row.onBehalfFormatted, - }, - { - field: "extensions", - headerName: "EXT.", - headerAlign: "left", - flex: 0.5, - valueGetter: (params) => - params.row.extensions === undefined ? "N/A" : params.row.extensions, - }, - { - field: "requestPageCount", - headerName: "PAGES", - headerAlign: "left", - flex: 0.5, - } -]; - const defaultTableInfo = { sort: [ { field: "defaultSorting", sort: "asc" }, // { field: "duedate", sort: "asc" } ], - noAssignedClassName: "not-assigned", - unassignedQueueColumns: unassignedQueueColumns + noAssignedClassName: "not-assigned" }; const getTableInfo = (userGroups) => { From 3cb5d8690a97631caa4c765f0e1d8a9c36bb530d Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Thu, 18 Apr 2024 14:11:28 -0700 Subject: [PATCH 096/147] Added comment and scanning team notifcation for attachement service --- .../request_api/services/documentservice.py | 13 +++++------- .../request_api/services/events/attachment.py | 21 ++++++++++++++++++- .../request_api/services/eventservice.py | 8 ------- .../notifications/notificationuser.py | 19 +++++++++++++++-- 4 files changed, 42 insertions(+), 19 deletions(-) diff --git a/request-management-api/request_api/services/documentservice.py b/request-management-api/request_api/services/documentservice.py index 70171c588..0ea4a4947 100644 --- a/request-management-api/request_api/services/documentservice.py +++ b/request-management-api/request_api/services/documentservice.py @@ -11,6 +11,7 @@ from request_api.models.FOIApplicantCorrespondenceAttachments import FOIApplicantCorrespondenceAttachment from request_api.services.eventservice import eventservice from request_api.utils.enums import RequestType +from request_api.services.events.attachment import attachmentevent import logging import json @@ -92,14 +93,6 @@ def copyrequestdocuments(self, ministryrequestid, documents, userid): def createministryrequestdocument(self, ministryrequestid, documentschema, userid): version = self.__getversionforrequest(ministryrequestid, "ministryrequest") - for document in documentschema['documents']: - if 'rrt' in document['category']: - #Create notification event for RRT document - message = f'RRT Uploaded on FOI Request {ministryrequestid}' - eventservice().attachmentevent(ministryrequestid, document, userid, "add", message) - #if 'rrt' in documentschema['documents']['category']: - #Create notification event for RRT document - # eventservice().posteventforextension(ministryrequestid, '', userid, '' , "add") return FOIMinistryRequestDocument.createdocuments(ministryrequestid, version, documentschema['documents'], userid) def createrawrequestdocument(self, requestid, documentschema, userid): @@ -145,6 +138,10 @@ def uploadpersonaldocuments(self, requestid, attachments): attachmentlist.append(attachmentresponse) documentschema = CreateDocumentSchema().load({'documents': attachmentlist}) + for document in documentschema['documents']: + # Add attachment event here as we need to pass in the document + # to the event service to identify if the document is an RRT document. + attachmenteventresponse = attachmentevent().createattachmentevent(requestid, userid, document) return self.createrequestdocument(requestid, documentschema, None, "rawrequest") def getattachments(self, requestid, requesttype, category): diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py index 6f5f86022..c2e5b59a8 100644 --- a/request-management-api/request_api/services/events/attachment.py +++ b/request-management-api/request_api/services/events/attachment.py @@ -13,10 +13,15 @@ class attachmentevent(): """ FOI Attachment Event management service """ - def createattachmentevent(self, ministryrequestid, message, userid, event): + def createattachmentevent(self, ministryrequestid, userid, document): try: + if 'rrt' in document['category']: + #Create notification event for RRT document + print(f"RRT Uploaded on FOI Request {ministryrequestid}") + message = f'RRT Uploaded on FOI Request {ministryrequestid}' notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) self.__createnotification(message, ministryrequestid, notificationtype, userid) + self.__createcomment(ministryrequestid, message) return DefaultMethodResult(True, message, '') except BusinessException as exception: current_app.logger.error("%s,%s" % ('Attachment upload notification error', exception.message)) @@ -26,6 +31,20 @@ def __createnotification(self, message, requestid, notificationtype, userid): if message is not None: return notificationservice().createnotification({"message" : message}, requestid, "ministryrequest", notificationtype, userid) + def __createcomment(self, ministryrequestid, message): + if message is not None: + _comment = self.__preparecomment(ministryrequestid, message) + return commentservice().createcomments(_comment, self.__defaultuserid(), 2) + + def __preparecomment(self, ministryrequestid, message): + _comment = dict() + _comment['comment'] = message + _comment['ministryrequestid'] = ministryrequestid + _comment['version'] = None + _comment['taggedusers'] = None + _comment['parentcommentid'] = None + return _comment + def notificationmessage(self, type): return f"{type} Attachment Uploaded" diff --git a/request-management-api/request_api/services/eventservice.py b/request-management-api/request_api/services/eventservice.py index 817405e8b..71c715c70 100644 --- a/request-management-api/request_api/services/eventservice.py +++ b/request-management-api/request_api/services/eventservice.py @@ -61,14 +61,6 @@ def posteventforaxisextension(self, ministryrequestid, extensionids, userid, use except BusinessException as exception: self.__logbusinessexception(exception) - def attachmentevent(self, ministryrequestid, document, userid, event, message): - try: - attachmenteventresponse = attachmentevent().createattachmentevent(ministryrequestid, message , userid, event) - if attachmenteventresponse.success == False: - current_app.logger.error("FOI Notification failed for event for attachment= %s" % (document['category'])) - except BusinessException as exception: - self.__logbusinessexception(exception) - def postreminderevent(self): try: cfreventresponse = cfrdateevent().createdueevent() diff --git a/request-management-api/request_api/services/notifications/notificationuser.py b/request-management-api/request_api/services/notifications/notificationuser.py index 5f810690a..2a43ed301 100644 --- a/request-management-api/request_api/services/notifications/notificationuser.py +++ b/request-management-api/request_api/services/notifications/notificationuser.py @@ -15,6 +15,9 @@ class notificationuser: def getnotificationusers(self, notificationtype, requesttype, userid, foirequest, requestjson=None): notificationusers = [] + print("notificationtype", notificationtype) + print("requesttype", requesttype) + print("foirequest", foirequest) if 'User Assignment Removal' == notificationtype: _users = self.__getassignees(foirequest, requesttype, notificationtype, requestjson) elif 'Assignment' in notificationtype: @@ -26,7 +29,9 @@ def getnotificationusers(self, notificationtype, requesttype, userid, foirequest elif 'Group Members' in notificationtype: _users = self.__getgroupmembers(foirequest["assignedministrygroup"]) elif 'Watcher' in notificationtype: - _users = self.__getwatchers(notificationtype, foirequest, requesttype, requestjson) + _users = self.__getwatchers(notificationtype, foirequest, requesttype, requestjson) + elif 'Attachment Upload Event' in notificationtype: + _users = self.__getscanningteam() else: _users = self.__getassignees(foirequest, requesttype, notificationtype) + self.__getwatchers(notificationtype, foirequest, requesttype) for user in _users: @@ -130,4 +135,14 @@ def __getgroupmembers(self,groupid): notificationusers.append({"userid":user["username"], "usertype":notificationusertypelabel}) return notificationusers return [] - \ No newline at end of file + + def __getscanningteam(self): + notificationusers = [] + print("Sending notification to scanning team") + notificationusertypelabel = notificationconfig().getnotificationusertypelabel("Group Members") + usergroupfromkeycloak= KeycloakAdminService().getmembersbygroupname("scanningteam") + if usergroupfromkeycloak is not None and len(usergroupfromkeycloak) > 0: + for user in usergroupfromkeycloak[0].get("members"): + notificationusers.append({"userid":user["username"], "usertype":notificationusertypelabel}) + return notificationusers + return [] \ No newline at end of file From 038c1b6be32c5054abb106e78376755837d0090b Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Mon, 22 Apr 2024 06:31:23 -0700 Subject: [PATCH 097/147] Fix RRT indententation --- .../request_api/services/events/attachment.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py index c2e5b59a8..485651003 100644 --- a/request-management-api/request_api/services/events/attachment.py +++ b/request-management-api/request_api/services/events/attachment.py @@ -18,11 +18,12 @@ def createattachmentevent(self, ministryrequestid, userid, document): if 'rrt' in document['category']: #Create notification event for RRT document print(f"RRT Uploaded on FOI Request {ministryrequestid}") - message = f'RRT Uploaded on FOI Request {ministryrequestid}' - notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) - self.__createnotification(message, ministryrequestid, notificationtype, userid) - self.__createcomment(ministryrequestid, message) - return DefaultMethodResult(True, message, '') + #message = f'RRT Uploaded on FOI Request {ministryrequestid}' + message = self.notificationmessage('RRT', ministryrequestid) + notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) + self.__createnotification(message, ministryrequestid, notificationtype, userid) + self.__createcomment(ministryrequestid, message) + return DefaultMethodResult(True, message, '') except BusinessException as exception: current_app.logger.error("%s,%s" % ('Attachment upload notification error', exception.message)) return DefaultMethodResult(False,'Attachemnt notifications failed') @@ -45,8 +46,8 @@ def __preparecomment(self, ministryrequestid, message): _comment['parentcommentid'] = None return _comment - def notificationmessage(self, type): - return f"{type} Attachment Uploaded" + def notificationmessage(self, type, ministryrequestid): + return f"{type} Attachment Uploaded on FOI Request {ministryrequestid}" def __notificationtype(self): return "Attachment Upload Event" From db5f194548ba2cc3e3a45ad53fa02a8624901bc6 Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Tue, 23 Apr 2024 08:44:10 -0700 Subject: [PATCH 098/147] Updated RRT flow and fixes --- .../models/FOIMinistryRequestDocuments.py | 2 +- .../models/FOIRawRequestDocuments.py | 2 +- .../request_api/resources/foidocument.py | 9 ++++++++ .../request_api/services/events/attachment.py | 21 ++++++++----------- .../request_api/services/eventservice.py | 8 +++++++ 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequestDocuments.py b/request-management-api/request_api/models/FOIMinistryRequestDocuments.py index 3acdb80f2..adead5584 100644 --- a/request-management-api/request_api/models/FOIMinistryRequestDocuments.py +++ b/request-management-api/request_api/models/FOIMinistryRequestDocuments.py @@ -101,7 +101,7 @@ def createdocuments(cls,ministryrequestid,ministryrequestversion, documents, use newdocuments.append(FOIMinistryRequestDocument(documentpath=document["documentpath"], version='1', filename=document["filename"], category=document["category"], isactive=True, foiministryrequest_id=ministryrequestid, foiministryrequestversion_id=ministryrequestversion, created_at=createdat, createdby=createuserid)) db.session.add_all(newdocuments) db.session.commit() - return DefaultMethodResult(True,'Documents created') + return DefaultMethodResult(True,'Documents created',None, ministryrequestversion) @classmethod def createdocument(cls,ministryrequestid,ministryrequestversion, document, userid): diff --git a/request-management-api/request_api/models/FOIRawRequestDocuments.py b/request-management-api/request_api/models/FOIRawRequestDocuments.py index 465e3a2cf..0b39941d9 100644 --- a/request-management-api/request_api/models/FOIRawRequestDocuments.py +++ b/request-management-api/request_api/models/FOIRawRequestDocuments.py @@ -65,7 +65,7 @@ def createdocuments(cls,requestid,requestversion, documents, userid): newdocuments.append(FOIRawRequestDocument(documentpath=document["documentpath"], version='1', filename=document["filename"], category=document["category"], isactive=True, foirequest_id=requestid, foirequestversion_id=requestversion, created_at=createdat, createdby=createuserid)) db.session.add_all(newdocuments) db.session.commit() - return DefaultMethodResult(True,'Documents created') + return DefaultMethodResult(True,'Documents created', None, requestversion) @classmethod diff --git a/request-management-api/request_api/resources/foidocument.py b/request-management-api/request_api/resources/foidocument.py index 83e0d6ccd..65d46a7d3 100644 --- a/request-management-api/request_api/resources/foidocument.py +++ b/request-management-api/request_api/resources/foidocument.py @@ -23,6 +23,7 @@ from request_api.utils.util import cors_preflight, allowedorigins from request_api.exceptions import BusinessException, Error from request_api.services.documentservice import documentservice +from request_api.services.eventservice import eventservice from request_api.schemas.foidocument import CreateDocumentSchema, RenameDocumentSchema, ReplaceDocumentSchema, ReclassifyDocumentSchema import json from marshmallow import Schema, fields, validate, ValidationError @@ -73,6 +74,14 @@ def post(requestid, requesttype): requestjson = request.get_json() documentschema = CreateDocumentSchema().load(requestjson) result = documentservice().createrequestdocument(requestid, documentschema, AuthHelper.getuserid(), requesttype) + # Add the RRT event here + print("THe version output is") + print(result.args[0]) + ministryversion = result.args[0] + for document in documentschema['documents']: + # Add attachment event here as we need to pass in the document + # to the event service to identify if the document is an RRT document. + eventservice().attachmenteventservice(requestid, document, AuthHelper.getuserid(), ministryversion) return {'status': result.success, 'message':result.message} , 200 except ValidationError as err: return {'status': False, 'message': str(err)}, 400 diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py index 485651003..7ac534d91 100644 --- a/request-management-api/request_api/services/events/attachment.py +++ b/request-management-api/request_api/services/events/attachment.py @@ -13,7 +13,7 @@ class attachmentevent(): """ FOI Attachment Event management service """ - def createattachmentevent(self, ministryrequestid, userid, document): + def createattachmentevent(self, ministryrequestid, userid, document, ministryversion): try: if 'rrt' in document['category']: #Create notification event for RRT document @@ -22,8 +22,8 @@ def createattachmentevent(self, ministryrequestid, userid, document): message = self.notificationmessage('RRT', ministryrequestid) notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) self.__createnotification(message, ministryrequestid, notificationtype, userid) - self.__createcomment(ministryrequestid, message) - return DefaultMethodResult(True, message, '') + self.__createcomment(ministryrequestid, message, ministryversion, userid) + return DefaultMethodResult(True, message, '') except BusinessException as exception: current_app.logger.error("%s,%s" % ('Attachment upload notification error', exception.message)) return DefaultMethodResult(False,'Attachemnt notifications failed') @@ -32,16 +32,16 @@ def __createnotification(self, message, requestid, notificationtype, userid): if message is not None: return notificationservice().createnotification({"message" : message}, requestid, "ministryrequest", notificationtype, userid) - def __createcomment(self, ministryrequestid, message): + def __createcomment(self, ministryrequestid, message, ministryversion, userid): if message is not None: - _comment = self.__preparecomment(ministryrequestid, message) - return commentservice().createcomments(_comment, self.__defaultuserid(), 2) + _comment = self.__preparecomment(ministryrequestid, message, ministryversion) + return commentservice().createcomments(_comment, userid, 2) - def __preparecomment(self, ministryrequestid, message): + def __preparecomment(self, ministryrequestid, message, ministryversion): _comment = dict() _comment['comment'] = message _comment['ministryrequestid'] = ministryrequestid - _comment['version'] = None + _comment['version'] = ministryversion _comment['taggedusers'] = None _comment['parentcommentid'] = None return _comment @@ -50,7 +50,4 @@ def notificationmessage(self, type, ministryrequestid): return f"{type} Attachment Uploaded on FOI Request {ministryrequestid}" def __notificationtype(self): - return "Attachment Upload Event" - - def __defaultuserid(self): - return "System" \ No newline at end of file + return "Attachment Upload Event" \ No newline at end of file diff --git a/request-management-api/request_api/services/eventservice.py b/request-management-api/request_api/services/eventservice.py index 71c715c70..c818b2886 100644 --- a/request-management-api/request_api/services/eventservice.py +++ b/request-management-api/request_api/services/eventservice.py @@ -142,5 +142,13 @@ def __posteventforsanctioncfrfeeform(self, ministryrequestid, userid, username): cfrfeeeventresponse = cfrfeeformevent().createstatetransitionevent(ministryrequestid, userid, username) if cfrfeeeventresponse.success == False: current_app.logger.error("FOI Notification failed for event for CFRFEEFORM= %s" % (ministryrequestid)) + except BusinessException as exception: + self.__logbusinessexception(exception) + + def attachmenteventservice(self, ministryrequestid, document, userid, ministryversion): + try: + attachmenteventresponse = attachmentevent().createattachmentevent(ministryrequestid, userid, document, ministryversion) + if attachmenteventresponse.success == False: + current_app.logger.error("FOI Notification failed for event for attachment= %s" % (document['category'])) except BusinessException as exception: self.__logbusinessexception(exception) \ No newline at end of file From 4f7bd02aa8ea53e2252d3ef17da42328a9fec1fa Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Tue, 23 Apr 2024 08:50:17 -0700 Subject: [PATCH 099/147] Remove RRT and call it from the parent --- .../request_api/services/documentservice.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/request-management-api/request_api/services/documentservice.py b/request-management-api/request_api/services/documentservice.py index 0ea4a4947..6767aba29 100644 --- a/request-management-api/request_api/services/documentservice.py +++ b/request-management-api/request_api/services/documentservice.py @@ -138,10 +138,6 @@ def uploadpersonaldocuments(self, requestid, attachments): attachmentlist.append(attachmentresponse) documentschema = CreateDocumentSchema().load({'documents': attachmentlist}) - for document in documentschema['documents']: - # Add attachment event here as we need to pass in the document - # to the event service to identify if the document is an RRT document. - attachmenteventresponse = attachmentevent().createattachmentevent(requestid, userid, document) return self.createrequestdocument(requestid, documentschema, None, "rawrequest") def getattachments(self, requestid, requesttype, category): From 233720c701ff16b4ee594a580a2e807d34467c22 Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Tue, 23 Apr 2024 22:05:10 -0700 Subject: [PATCH 100/147] Remove comments --- .../request_api/services/documentservice.py | 1 - .../request_api/services/events/attachment.py | 2 -- .../request_api/services/notifications/notificationuser.py | 4 ---- 3 files changed, 7 deletions(-) diff --git a/request-management-api/request_api/services/documentservice.py b/request-management-api/request_api/services/documentservice.py index 6767aba29..b1e1c335d 100644 --- a/request-management-api/request_api/services/documentservice.py +++ b/request-management-api/request_api/services/documentservice.py @@ -11,7 +11,6 @@ from request_api.models.FOIApplicantCorrespondenceAttachments import FOIApplicantCorrespondenceAttachment from request_api.services.eventservice import eventservice from request_api.utils.enums import RequestType -from request_api.services.events.attachment import attachmentevent import logging import json diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py index 7ac534d91..4be187db0 100644 --- a/request-management-api/request_api/services/events/attachment.py +++ b/request-management-api/request_api/services/events/attachment.py @@ -17,8 +17,6 @@ def createattachmentevent(self, ministryrequestid, userid, document, ministryver try: if 'rrt' in document['category']: #Create notification event for RRT document - print(f"RRT Uploaded on FOI Request {ministryrequestid}") - #message = f'RRT Uploaded on FOI Request {ministryrequestid}' message = self.notificationmessage('RRT', ministryrequestid) notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) self.__createnotification(message, ministryrequestid, notificationtype, userid) diff --git a/request-management-api/request_api/services/notifications/notificationuser.py b/request-management-api/request_api/services/notifications/notificationuser.py index 2a43ed301..4017d2a60 100644 --- a/request-management-api/request_api/services/notifications/notificationuser.py +++ b/request-management-api/request_api/services/notifications/notificationuser.py @@ -15,9 +15,6 @@ class notificationuser: def getnotificationusers(self, notificationtype, requesttype, userid, foirequest, requestjson=None): notificationusers = [] - print("notificationtype", notificationtype) - print("requesttype", requesttype) - print("foirequest", foirequest) if 'User Assignment Removal' == notificationtype: _users = self.__getassignees(foirequest, requesttype, notificationtype, requestjson) elif 'Assignment' in notificationtype: @@ -138,7 +135,6 @@ def __getgroupmembers(self,groupid): def __getscanningteam(self): notificationusers = [] - print("Sending notification to scanning team") notificationusertypelabel = notificationconfig().getnotificationusertypelabel("Group Members") usergroupfromkeycloak= KeycloakAdminService().getmembersbygroupname("scanningteam") if usergroupfromkeycloak is not None and len(usergroupfromkeycloak) > 0: From 8a93e29d62b9e5a35a04463bfc952cb2d99761d2 Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Fri, 26 Apr 2024 14:14:52 -0700 Subject: [PATCH 101/147] Fixed comments --- .../models/FOIMinistryRequestDocuments.py | 2 +- .../models/FOIRawRequestDocuments.py | 2 +- .../request_api/resources/foidocument.py | 9 +-------- .../request_api/services/events/attachment.py | 18 ++++++++++-------- .../request_api/services/eventservice.py | 4 ++-- .../services/notifications/notificationuser.py | 14 ++------------ 6 files changed, 17 insertions(+), 32 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequestDocuments.py b/request-management-api/request_api/models/FOIMinistryRequestDocuments.py index adead5584..3acdb80f2 100644 --- a/request-management-api/request_api/models/FOIMinistryRequestDocuments.py +++ b/request-management-api/request_api/models/FOIMinistryRequestDocuments.py @@ -101,7 +101,7 @@ def createdocuments(cls,ministryrequestid,ministryrequestversion, documents, use newdocuments.append(FOIMinistryRequestDocument(documentpath=document["documentpath"], version='1', filename=document["filename"], category=document["category"], isactive=True, foiministryrequest_id=ministryrequestid, foiministryrequestversion_id=ministryrequestversion, created_at=createdat, createdby=createuserid)) db.session.add_all(newdocuments) db.session.commit() - return DefaultMethodResult(True,'Documents created',None, ministryrequestversion) + return DefaultMethodResult(True,'Documents created') @classmethod def createdocument(cls,ministryrequestid,ministryrequestversion, document, userid): diff --git a/request-management-api/request_api/models/FOIRawRequestDocuments.py b/request-management-api/request_api/models/FOIRawRequestDocuments.py index 0b39941d9..465e3a2cf 100644 --- a/request-management-api/request_api/models/FOIRawRequestDocuments.py +++ b/request-management-api/request_api/models/FOIRawRequestDocuments.py @@ -65,7 +65,7 @@ def createdocuments(cls,requestid,requestversion, documents, userid): newdocuments.append(FOIRawRequestDocument(documentpath=document["documentpath"], version='1', filename=document["filename"], category=document["category"], isactive=True, foirequest_id=requestid, foirequestversion_id=requestversion, created_at=createdat, createdby=createuserid)) db.session.add_all(newdocuments) db.session.commit() - return DefaultMethodResult(True,'Documents created', None, requestversion) + return DefaultMethodResult(True,'Documents created') @classmethod diff --git a/request-management-api/request_api/resources/foidocument.py b/request-management-api/request_api/resources/foidocument.py index 65d46a7d3..3a0455176 100644 --- a/request-management-api/request_api/resources/foidocument.py +++ b/request-management-api/request_api/resources/foidocument.py @@ -74,14 +74,7 @@ def post(requestid, requesttype): requestjson = request.get_json() documentschema = CreateDocumentSchema().load(requestjson) result = documentservice().createrequestdocument(requestid, documentschema, AuthHelper.getuserid(), requesttype) - # Add the RRT event here - print("THe version output is") - print(result.args[0]) - ministryversion = result.args[0] - for document in documentschema['documents']: - # Add attachment event here as we need to pass in the document - # to the event service to identify if the document is an RRT document. - eventservice().attachmenteventservice(requestid, document, AuthHelper.getuserid(), ministryversion) + eventservice().attachmenteventservice(requestid, documentschema['documents'], AuthHelper.getuserid()) return {'status': result.success, 'message':result.message} , 200 except ValidationError as err: return {'status': False, 'message': str(err)}, 400 diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py index 4be187db0..09b7452c1 100644 --- a/request-management-api/request_api/services/events/attachment.py +++ b/request-management-api/request_api/services/events/attachment.py @@ -13,15 +13,17 @@ class attachmentevent(): """ FOI Attachment Event management service """ - def createattachmentevent(self, ministryrequestid, userid, document, ministryversion): + def createattachmentevent(self, ministryrequestid, userid, documents): try: - if 'rrt' in document['category']: - #Create notification event for RRT document - message = self.notificationmessage('RRT', ministryrequestid) - notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) - self.__createnotification(message, ministryrequestid, notificationtype, userid) - self.__createcomment(ministryrequestid, message, ministryversion, userid) - return DefaultMethodResult(True, message, '') + for document in documents: + if 'rrt' in document['category']: + #Create notification event for RRT document + ministryversion = FOIMinistryRequest.getversionforrequest(ministryrequestid) + message = self.notificationmessage('RRT', ministryrequestid) + notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) + self.__createnotification(message, ministryrequestid, notificationtype, userid) + self.__createcomment(ministryrequestid, message, ministryversion, userid) + return DefaultMethodResult(True, message, '') except BusinessException as exception: current_app.logger.error("%s,%s" % ('Attachment upload notification error', exception.message)) return DefaultMethodResult(False,'Attachemnt notifications failed') diff --git a/request-management-api/request_api/services/eventservice.py b/request-management-api/request_api/services/eventservice.py index c818b2886..5876e6236 100644 --- a/request-management-api/request_api/services/eventservice.py +++ b/request-management-api/request_api/services/eventservice.py @@ -145,9 +145,9 @@ def __posteventforsanctioncfrfeeform(self, ministryrequestid, userid, username): except BusinessException as exception: self.__logbusinessexception(exception) - def attachmenteventservice(self, ministryrequestid, document, userid, ministryversion): + def attachmenteventservice(self, ministryrequestid, document, userid): try: - attachmenteventresponse = attachmentevent().createattachmentevent(ministryrequestid, userid, document, ministryversion) + attachmenteventresponse = attachmentevent().createattachmentevent(ministryrequestid, userid, document) if attachmenteventresponse.success == False: current_app.logger.error("FOI Notification failed for event for attachment= %s" % (document['category'])) except BusinessException as exception: diff --git a/request-management-api/request_api/services/notifications/notificationuser.py b/request-management-api/request_api/services/notifications/notificationuser.py index 4017d2a60..b33440ae7 100644 --- a/request-management-api/request_api/services/notifications/notificationuser.py +++ b/request-management-api/request_api/services/notifications/notificationuser.py @@ -28,7 +28,7 @@ def getnotificationusers(self, notificationtype, requesttype, userid, foirequest elif 'Watcher' in notificationtype: _users = self.__getwatchers(notificationtype, foirequest, requesttype, requestjson) elif 'Attachment Upload Event' in notificationtype: - _users = self.__getscanningteam() + _users = self.__getgroupmembers("scanningteam") else: _users = self.__getassignees(foirequest, requesttype, notificationtype) + self.__getwatchers(notificationtype, foirequest, requesttype) for user in _users: @@ -122,7 +122,7 @@ def __preparetaggeduser(self, data): for entry in data: taggedusers.append({"userid":entry["username"], "usertype":notificationconfig().getnotificationusertypelabel("comment tagged user")}) return taggedusers - + def __getgroupmembers(self,groupid): notificationusers = [] notificationusertypelabel = notificationconfig().getnotificationusertypelabel("Group Members") @@ -132,13 +132,3 @@ def __getgroupmembers(self,groupid): notificationusers.append({"userid":user["username"], "usertype":notificationusertypelabel}) return notificationusers return [] - - def __getscanningteam(self): - notificationusers = [] - notificationusertypelabel = notificationconfig().getnotificationusertypelabel("Group Members") - usergroupfromkeycloak= KeycloakAdminService().getmembersbygroupname("scanningteam") - if usergroupfromkeycloak is not None and len(usergroupfromkeycloak) > 0: - for user in usergroupfromkeycloak[0].get("members"): - notificationusers.append({"userid":user["username"], "usertype":notificationusertypelabel}) - return notificationusers - return [] \ No newline at end of file From 443aa5e8e894f28d2bf4aa701c70d660fd6aad38 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 26 Apr 2024 15:06:27 -0700 Subject: [PATCH 102/147] temp reorder migrations --- request-management-api/migrations/versions/932d6dae5570_.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/migrations/versions/932d6dae5570_.py b/request-management-api/migrations/versions/932d6dae5570_.py index 426eef4f9..9f52846ac 100644 --- a/request-management-api/migrations/versions/932d6dae5570_.py +++ b/request-management-api/migrations/versions/932d6dae5570_.py @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. revision = '932d6dae5570' -down_revision = 'd42a1cf67c5c' +down_revision = 'c590239f1b2f' branch_labels = None depends_on = None From 1498d9a52bc59cf44c27382d09034f4b1164f10e Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Mon, 29 Apr 2024 12:35:43 -0700 Subject: [PATCH 103/147] Fix for RAW request --- .../request_api/resources/foidocument.py | 2 +- .../request_api/services/events/attachment.py | 35 ++++++++++++++----- .../request_api/services/eventservice.py | 6 ++-- .../notifications/notificationuser.py | 14 ++++++-- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/request-management-api/request_api/resources/foidocument.py b/request-management-api/request_api/resources/foidocument.py index 3a0455176..e8443479e 100644 --- a/request-management-api/request_api/resources/foidocument.py +++ b/request-management-api/request_api/resources/foidocument.py @@ -74,7 +74,7 @@ def post(requestid, requesttype): requestjson = request.get_json() documentschema = CreateDocumentSchema().load(requestjson) result = documentservice().createrequestdocument(requestid, documentschema, AuthHelper.getuserid(), requesttype) - eventservice().attachmenteventservice(requestid, documentschema['documents'], AuthHelper.getuserid()) + eventservice().attachmenteventservice(requestid, documentschema['documents'], AuthHelper.getuserid(), requesttype) return {'status': result.success, 'message':result.message} , 200 except ValidationError as err: return {'status': False, 'message': str(err)}, 400 diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py index 09b7452c1..cecf3c731 100644 --- a/request-management-api/request_api/services/events/attachment.py +++ b/request-management-api/request_api/services/events/attachment.py @@ -4,6 +4,7 @@ from request_api.services.commentservice import commentservice from request_api.models.FOIMinistryRequests import FOIMinistryRequest from request_api.models.FOIRequestComments import FOIRequestComment +from request_api.models.FOIRawRequests import FOIRawRequest from request_api.models.NotificationTypes import NotificationType from request_api.exceptions import BusinessException from request_api.models.default_method_result import DefaultMethodResult @@ -13,34 +14,40 @@ class attachmentevent(): """ FOI Attachment Event management service """ - def createattachmentevent(self, ministryrequestid, userid, documents): + def createattachmentevent(self, ministryrequestid, userid, documents, requesttype): try: for document in documents: if 'rrt' in document['category']: #Create notification event for RRT document - ministryversion = FOIMinistryRequest.getversionforrequest(ministryrequestid) + ministryversion = self.__getversionforrequest(ministryrequestid, requesttype) message = self.notificationmessage('RRT', ministryrequestid) notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) - self.__createnotification(message, ministryrequestid, notificationtype, userid) - self.__createcomment(ministryrequestid, message, ministryversion, userid) + ret = self.__createnotification(message, ministryrequestid, notificationtype, userid, requesttype) + comment = self.__createcomment(ministryrequestid, message, ministryversion, userid, requesttype) return DefaultMethodResult(True, message, '') + return DefaultMethodResult(True, '' , '') except BusinessException as exception: current_app.logger.error("%s,%s" % ('Attachment upload notification error', exception.message)) return DefaultMethodResult(False,'Attachemnt notifications failed') - def __createnotification(self, message, requestid, notificationtype, userid): + def __createnotification(self, message, requestid, notificationtype, userid, requesttype): if message is not None: - return notificationservice().createnotification({"message" : message}, requestid, "ministryrequest", notificationtype, userid) + return notificationservice().createnotification({"message" : message}, requestid, requesttype , notificationtype, userid) - def __createcomment(self, ministryrequestid, message, ministryversion, userid): + def __createcomment(self, ministryrequestid, message, ministryversion, userid, requesttype): if message is not None: _comment = self.__preparecomment(ministryrequestid, message, ministryversion) - return commentservice().createcomments(_comment, userid, 2) + print("comment ", _comment) + if requesttype == "ministryrequest": + return commentservice().createcomments(_comment, userid, 2) + else: + return commentservice().createrawrequestcomment(_comment, userid, 2) def __preparecomment(self, ministryrequestid, message, ministryversion): _comment = dict() _comment['comment'] = message _comment['ministryrequestid'] = ministryrequestid + _comment['requestid'] = ministryrequestid _comment['version'] = ministryversion _comment['taggedusers'] = None _comment['parentcommentid'] = None @@ -50,4 +57,14 @@ def notificationmessage(self, type, ministryrequestid): return f"{type} Attachment Uploaded on FOI Request {ministryrequestid}" def __notificationtype(self): - return "Attachment Upload Event" \ No newline at end of file + return "Attachment Upload Event" + + def __getversionforrequest(self, requestid, requesttype): + """ Returns the active version of the request id based on type. + """ + if requesttype == "ministryrequest": + document = FOIMinistryRequest.getversionforrequest(requestid) + else: + document = FOIRawRequest.getversionforrequest(requestid) + if document: + return document[0] \ No newline at end of file diff --git a/request-management-api/request_api/services/eventservice.py b/request-management-api/request_api/services/eventservice.py index 5876e6236..43491405b 100644 --- a/request-management-api/request_api/services/eventservice.py +++ b/request-management-api/request_api/services/eventservice.py @@ -145,9 +145,11 @@ def __posteventforsanctioncfrfeeform(self, ministryrequestid, userid, username): except BusinessException as exception: self.__logbusinessexception(exception) - def attachmenteventservice(self, ministryrequestid, document, userid): + def attachmenteventservice(self, ministryrequestid, document, userid, requesttype): try: - attachmenteventresponse = attachmentevent().createattachmentevent(ministryrequestid, userid, document) + attachmenteventresponse = attachmentevent().createattachmentevent(ministryrequestid, userid, document, requesttype) + print("attachmenteventresponse") + print(attachmenteventresponse) if attachmenteventresponse.success == False: current_app.logger.error("FOI Notification failed for event for attachment= %s" % (document['category'])) except BusinessException as exception: diff --git a/request-management-api/request_api/services/notifications/notificationuser.py b/request-management-api/request_api/services/notifications/notificationuser.py index b33440ae7..4017d2a60 100644 --- a/request-management-api/request_api/services/notifications/notificationuser.py +++ b/request-management-api/request_api/services/notifications/notificationuser.py @@ -28,7 +28,7 @@ def getnotificationusers(self, notificationtype, requesttype, userid, foirequest elif 'Watcher' in notificationtype: _users = self.__getwatchers(notificationtype, foirequest, requesttype, requestjson) elif 'Attachment Upload Event' in notificationtype: - _users = self.__getgroupmembers("scanningteam") + _users = self.__getscanningteam() else: _users = self.__getassignees(foirequest, requesttype, notificationtype) + self.__getwatchers(notificationtype, foirequest, requesttype) for user in _users: @@ -122,7 +122,7 @@ def __preparetaggeduser(self, data): for entry in data: taggedusers.append({"userid":entry["username"], "usertype":notificationconfig().getnotificationusertypelabel("comment tagged user")}) return taggedusers - + def __getgroupmembers(self,groupid): notificationusers = [] notificationusertypelabel = notificationconfig().getnotificationusertypelabel("Group Members") @@ -132,3 +132,13 @@ def __getgroupmembers(self,groupid): notificationusers.append({"userid":user["username"], "usertype":notificationusertypelabel}) return notificationusers return [] + + def __getscanningteam(self): + notificationusers = [] + notificationusertypelabel = notificationconfig().getnotificationusertypelabel("Group Members") + usergroupfromkeycloak= KeycloakAdminService().getmembersbygroupname("scanningteam") + if usergroupfromkeycloak is not None and len(usergroupfromkeycloak) > 0: + for user in usergroupfromkeycloak[0].get("members"): + notificationusers.append({"userid":user["username"], "usertype":notificationusertypelabel}) + return notificationusers + return [] \ No newline at end of file From 2b6b37c24d5bbc8c7d948aae70d144489eecfad0 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 29 Apr 2024 19:50:15 -0700 Subject: [PATCH 104/147] fix migration order --- request-management-api/migrations/versions/d42a1cf67c5c_.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/migrations/versions/d42a1cf67c5c_.py b/request-management-api/migrations/versions/d42a1cf67c5c_.py index 4a61359be..8fb6b535b 100644 --- a/request-management-api/migrations/versions/d42a1cf67c5c_.py +++ b/request-management-api/migrations/versions/d42a1cf67c5c_.py @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. revision = 'd42a1cf67c5c' -down_revision = 'b4da31675bd0' +down_revision = '59a97f42b5f2' branch_labels = None depends_on = None From b85c23d36e3624bc40814354f3693c78ff864e35 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 30 Apr 2024 10:48:34 -0700 Subject: [PATCH 105/147] push correct order of migrations for dev --- .../versions/59a97f42b5f2_add_profileid_to_applicant.py | 2 +- request-management-api/migrations/versions/932d6dae5570_.py | 2 +- .../c590239f1b2f_add_axisapplicantid_to_applicant_table.py | 2 +- request-management-api/migrations/versions/d42a1cf67c5c_.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py b/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py index add4b87fc..688398a8d 100644 --- a/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py +++ b/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. revision = '59a97f42b5f2' -down_revision = 'b4da31675bd0' +down_revision = '7bc099abf5cc' branch_labels = None depends_on = None diff --git a/request-management-api/migrations/versions/932d6dae5570_.py b/request-management-api/migrations/versions/932d6dae5570_.py index 9f52846ac..426eef4f9 100644 --- a/request-management-api/migrations/versions/932d6dae5570_.py +++ b/request-management-api/migrations/versions/932d6dae5570_.py @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. revision = '932d6dae5570' -down_revision = 'c590239f1b2f' +down_revision = 'd42a1cf67c5c' branch_labels = None depends_on = None diff --git a/request-management-api/migrations/versions/c590239f1b2f_add_axisapplicantid_to_applicant_table.py b/request-management-api/migrations/versions/c590239f1b2f_add_axisapplicantid_to_applicant_table.py index cacd7a41a..883da9391 100644 --- a/request-management-api/migrations/versions/c590239f1b2f_add_axisapplicantid_to_applicant_table.py +++ b/request-management-api/migrations/versions/c590239f1b2f_add_axisapplicantid_to_applicant_table.py @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. revision = 'c590239f1b2f' -down_revision = 'd42a1cf67c5c' +down_revision = '59a97f42b5f2' branch_labels = None depends_on = None diff --git a/request-management-api/migrations/versions/d42a1cf67c5c_.py b/request-management-api/migrations/versions/d42a1cf67c5c_.py index 8fb6b535b..4a61359be 100644 --- a/request-management-api/migrations/versions/d42a1cf67c5c_.py +++ b/request-management-api/migrations/versions/d42a1cf67c5c_.py @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. revision = 'd42a1cf67c5c' -down_revision = '59a97f42b5f2' +down_revision = 'b4da31675bd0' branch_labels = None depends_on = None From 3d610d79848362b87cc5f9dfe958427f02047a0b Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Tue, 30 Apr 2024 14:02:21 -0700 Subject: [PATCH 106/147] Changes to include contentype in cronjob. --- .../syncaxispagedetails.yaml | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 openshift/templates/cronjob/syncaxispagedetails/syncaxispagedetails.yaml diff --git a/openshift/templates/cronjob/syncaxispagedetails/syncaxispagedetails.yaml b/openshift/templates/cronjob/syncaxispagedetails/syncaxispagedetails.yaml new file mode 100644 index 000000000..0218f1dc5 --- /dev/null +++ b/openshift/templates/cronjob/syncaxispagedetails/syncaxispagedetails.yaml @@ -0,0 +1,45 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: syncaxispagedetails +spec: + schedule: "0 13 * * *" + concurrencyPolicy: "Allow" + suspend: false + successfulJobsHistoryLimit: 3 + failedJobsHistoryLimit: 1 + jobTemplate: + spec: + template: + metadata: + creationTimestamp: null + spec: + containers: + - name: syncaxispagedetails + command: + - /bin/sh + - '-c' + env: + - name: KEYCLOAK_ADMIN_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: ${SECRET_NAME} + key: KEYCLOAK_ADMIN_CLIENT_SECRET + - name: AXISSYNC_PAGEINFO + valueFrom: + secretKeyRef: + name: ${SECRET_NAME} + key: AXISSYNC_PAGEINFO + imagePullPolicy: Always + terminationMessagePolicy: File + image: busybox + args: + - > + token=$(echo "$a" | wget -qO- --header="Content-Type: + application/x-www-form-urlencoded" --post-data + "grant_type=client_credentials&client_id=foi-lob-api&client_secret=${KEYCLOAK_ADMIN_CLIENT_SECRET}" + ${KEYCLOAK_URL} + | sed -n 's/.*"access_token":"\([^"]*\).*/\1/p' ) && wget -O- + --post-data ${AXISSYNC_PAGEINFO} --header "Content-Type:application/json" --header "Authorization: Bearer ${token}" + ${REQUEST_MANAGEMENT_API_URL}/api/foiaxis/sync/pageinfo + restartPolicy: OnFailure \ No newline at end of file From 26b35bdee55b369a34534720dd12d53f75899834 Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Wed, 1 May 2024 08:23:27 -0700 Subject: [PATCH 107/147] Updated PR comments --- .../models/FOIRawRequestComments.py | 2 ++ .../request_api/models/FOIRequestComments.py | 2 +- .../request_api/resources/foidocument.py | 3 +- .../request_api/services/commentservice.py | 2 +- .../request_api/services/events/attachment.py | 35 ++++++++----------- .../request_api/services/eventservice.py | 4 +-- .../notifications/notificationuser.py | 14 ++------ 7 files changed, 23 insertions(+), 39 deletions(-) diff --git a/request-management-api/request_api/models/FOIRawRequestComments.py b/request-management-api/request_api/models/FOIRawRequestComments.py index 39fef8291..2b0639864 100644 --- a/request-management-api/request_api/models/FOIRawRequestComments.py +++ b/request-management-api/request_api/models/FOIRawRequestComments.py @@ -35,8 +35,10 @@ def savecomment(cls, commenttypeid, foirequestcomment, version, userid) -> Defau parentcommentid = foirequestcomment["parentcommentid"] if 'parentcommentid' in foirequestcomment else None taggedusers = foirequestcomment["taggedusers"] if 'taggedusers' in foirequestcomment else None newcomment = FOIRawRequestComment(commenttypeid=commenttypeid, requestid=foirequestcomment["requestid"], version=version, comment=foirequestcomment["comment"], parentcommentid=parentcommentid, isactive=True, createdby=userid,taggedusers=taggedusers) + print(newcomment.commentid) db.session.add(newcomment) db.session.commit() + return DefaultMethodResult(True, 'Comment added', newcomment.commentid) @classmethod diff --git a/request-management-api/request_api/models/FOIRequestComments.py b/request-management-api/request_api/models/FOIRequestComments.py index 17834d777..6c69f3fca 100644 --- a/request-management-api/request_api/models/FOIRequestComments.py +++ b/request-management-api/request_api/models/FOIRequestComments.py @@ -36,7 +36,7 @@ def savecomment(cls, commenttypeid, foirequestcomment, version, userid,commentcr _createddate = datetime2.now().isoformat() if commentcreatedate is None else commentcreatedate newcomment = FOIRequestComment(commenttypeid=commenttypeid, ministryrequestid=foirequestcomment["ministryrequestid"], version=version, comment=foirequestcomment["comment"], parentcommentid=parentcommentid, isactive=True, created_at=_createddate, createdby=userid,taggedusers=taggedusers) db.session.add(newcomment) - db.session.commit() + db.session.commit() return DefaultMethodResult(True,'Comment added',newcomment.commentid) @classmethod diff --git a/request-management-api/request_api/resources/foidocument.py b/request-management-api/request_api/resources/foidocument.py index e8443479e..3cfd2648d 100644 --- a/request-management-api/request_api/resources/foidocument.py +++ b/request-management-api/request_api/resources/foidocument.py @@ -74,7 +74,8 @@ def post(requestid, requesttype): requestjson = request.get_json() documentschema = CreateDocumentSchema().load(requestjson) result = documentservice().createrequestdocument(requestid, documentschema, AuthHelper.getuserid(), requesttype) - eventservice().attachmenteventservice(requestid, documentschema['documents'], AuthHelper.getuserid(), requesttype) + if result.success == True: + eventservice().attachmenteventservice(requestid, documentschema['documents'], AuthHelper.getuserid(), requesttype) return {'status': result.success, 'message':result.message} , 200 except ValidationError as err: return {'status': False, 'message': str(err)}, 400 diff --git a/request-management-api/request_api/services/commentservice.py b/request-management-api/request_api/services/commentservice.py index c0785b0f2..f0b11b1ab 100644 --- a/request-management-api/request_api/services/commentservice.py +++ b/request-management-api/request_api/services/commentservice.py @@ -30,7 +30,7 @@ def createministryrequestcomment(self, data, userid, type=1): return FOIRequestComment.savecomment(type, data, version, userid) def createrawrequestcomment(self, data, userid, type=1): - version = FOIRawRequest.getversionforrequest(data["requestid"]) + version = FOIRawRequest.getversionforrequest(data["requestid"]) return FOIRawRequestComment.savecomment(type, data, version, userid) def createcomments(self, data, userid, type=2): diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py index cecf3c731..192598f89 100644 --- a/request-management-api/request_api/services/events/attachment.py +++ b/request-management-api/request_api/services/events/attachment.py @@ -14,18 +14,19 @@ class attachmentevent(): """ FOI Attachment Event management service """ - def createattachmentevent(self, ministryrequestid, userid, documents, requesttype): + def createattachmentevent(self, requestid, userid, documents, requesttype): try: for document in documents: if 'rrt' in document['category']: #Create notification event for RRT document - ministryversion = self.__getversionforrequest(ministryrequestid, requesttype) - message = self.notificationmessage('RRT', ministryrequestid) + ministryversion = self.__getversionforrequest(requestid, requesttype) + message = self.notificationmessage('RRT', requestid) notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) - ret = self.__createnotification(message, ministryrequestid, notificationtype, userid, requesttype) - comment = self.__createcomment(ministryrequestid, message, ministryversion, userid, requesttype) - return DefaultMethodResult(True, message, '') - return DefaultMethodResult(True, '' , '') + ret = self.__createnotification(message, requestid, notificationtype, userid, requesttype) + comment = self.__createcomment(requestid, message, ministryversion, userid, requesttype) + print('comment created') + return DefaultMethodResult(True, 'Attachment notification succedded', requestid) # ad the request id to the message + return DefaultMethodResult(True, 'No RTT attachment found' , requestid) except BusinessException as exception: current_app.logger.error("%s,%s" % ('Attachment upload notification error', exception.message)) return DefaultMethodResult(False,'Attachemnt notifications failed') @@ -34,25 +35,17 @@ def __createnotification(self, message, requestid, notificationtype, userid, req if message is not None: return notificationservice().createnotification({"message" : message}, requestid, requesttype , notificationtype, userid) - def __createcomment(self, ministryrequestid, message, ministryversion, userid, requesttype): - if message is not None: - _comment = self.__preparecomment(ministryrequestid, message, ministryversion) - print("comment ", _comment) + def __createcomment(self, requestid, message, ministryversion, userid, requesttype): + print('create comment') + if message is not None: + print(message) if requesttype == "ministryrequest": + _comment = {"ministryrequestid": requestid, "version": ministryversion, "comment": message} return commentservice().createcomments(_comment, userid, 2) else: + _comment = {"requestid": requestid, "version": ministryversion, "comment": message} return commentservice().createrawrequestcomment(_comment, userid, 2) - def __preparecomment(self, ministryrequestid, message, ministryversion): - _comment = dict() - _comment['comment'] = message - _comment['ministryrequestid'] = ministryrequestid - _comment['requestid'] = ministryrequestid - _comment['version'] = ministryversion - _comment['taggedusers'] = None - _comment['parentcommentid'] = None - return _comment - def notificationmessage(self, type, ministryrequestid): return f"{type} Attachment Uploaded on FOI Request {ministryrequestid}" diff --git a/request-management-api/request_api/services/eventservice.py b/request-management-api/request_api/services/eventservice.py index 43491405b..189f67a7f 100644 --- a/request-management-api/request_api/services/eventservice.py +++ b/request-management-api/request_api/services/eventservice.py @@ -33,7 +33,6 @@ async def postevent(self, requestid, requesttype, userid, username, isministryus self.posteventsync(requestid, requesttype, userid, username, isministryuser,assigneename) def posteventsync(self, requestid, requesttype, userid, username, isministryuser,assigneename=''): - print("\n ..... postevent is triggered ...... \n") try: stateeventresponse = stateevent().createstatetransitionevent(requestid, requesttype, userid, username) divisioneventresponse = divisionevent().createdivisionevent(requestid, requesttype, userid) @@ -148,9 +147,8 @@ def __posteventforsanctioncfrfeeform(self, ministryrequestid, userid, username): def attachmenteventservice(self, ministryrequestid, document, userid, requesttype): try: attachmenteventresponse = attachmentevent().createattachmentevent(ministryrequestid, userid, document, requesttype) - print("attachmenteventresponse") - print(attachmenteventresponse) if attachmenteventresponse.success == False: current_app.logger.error("FOI Notification failed for event for attachment= %s" % (document['category'])) + return attachmenteventresponse except BusinessException as exception: self.__logbusinessexception(exception) \ No newline at end of file diff --git a/request-management-api/request_api/services/notifications/notificationuser.py b/request-management-api/request_api/services/notifications/notificationuser.py index 4017d2a60..36694991f 100644 --- a/request-management-api/request_api/services/notifications/notificationuser.py +++ b/request-management-api/request_api/services/notifications/notificationuser.py @@ -28,7 +28,7 @@ def getnotificationusers(self, notificationtype, requesttype, userid, foirequest elif 'Watcher' in notificationtype: _users = self.__getwatchers(notificationtype, foirequest, requesttype, requestjson) elif 'Attachment Upload Event' in notificationtype: - _users = self.__getscanningteam() + _users = self.__getgroupmembers('scanningteam') + self.__getassignees(foirequest, requesttype, notificationtype) + self.__getwatchers(notificationtype, foirequest, requesttype, requestjson) else: _users = self.__getassignees(foirequest, requesttype, notificationtype) + self.__getwatchers(notificationtype, foirequest, requesttype) for user in _users: @@ -131,14 +131,4 @@ def __getgroupmembers(self,groupid): for user in usergroupfromkeycloak[0].get("members"): notificationusers.append({"userid":user["username"], "usertype":notificationusertypelabel}) return notificationusers - return [] - - def __getscanningteam(self): - notificationusers = [] - notificationusertypelabel = notificationconfig().getnotificationusertypelabel("Group Members") - usergroupfromkeycloak= KeycloakAdminService().getmembersbygroupname("scanningteam") - if usergroupfromkeycloak is not None and len(usergroupfromkeycloak) > 0: - for user in usergroupfromkeycloak[0].get("members"): - notificationusers.append({"userid":user["username"], "usertype":notificationusertypelabel}) - return notificationusers - return [] \ No newline at end of file + return [] \ No newline at end of file From 160352b013be32c073716d60f164f3b3961fd7f0 Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Wed, 1 May 2024 08:30:27 -0700 Subject: [PATCH 108/147] remove print statements --- .../request_api/models/FOIRawRequestComments.py | 1 - request-management-api/request_api/models/FOIRequestComments.py | 2 +- request-management-api/request_api/services/commentservice.py | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/request-management-api/request_api/models/FOIRawRequestComments.py b/request-management-api/request_api/models/FOIRawRequestComments.py index 2b0639864..d4d798415 100644 --- a/request-management-api/request_api/models/FOIRawRequestComments.py +++ b/request-management-api/request_api/models/FOIRawRequestComments.py @@ -35,7 +35,6 @@ def savecomment(cls, commenttypeid, foirequestcomment, version, userid) -> Defau parentcommentid = foirequestcomment["parentcommentid"] if 'parentcommentid' in foirequestcomment else None taggedusers = foirequestcomment["taggedusers"] if 'taggedusers' in foirequestcomment else None newcomment = FOIRawRequestComment(commenttypeid=commenttypeid, requestid=foirequestcomment["requestid"], version=version, comment=foirequestcomment["comment"], parentcommentid=parentcommentid, isactive=True, createdby=userid,taggedusers=taggedusers) - print(newcomment.commentid) db.session.add(newcomment) db.session.commit() diff --git a/request-management-api/request_api/models/FOIRequestComments.py b/request-management-api/request_api/models/FOIRequestComments.py index 6c69f3fca..17834d777 100644 --- a/request-management-api/request_api/models/FOIRequestComments.py +++ b/request-management-api/request_api/models/FOIRequestComments.py @@ -36,7 +36,7 @@ def savecomment(cls, commenttypeid, foirequestcomment, version, userid,commentcr _createddate = datetime2.now().isoformat() if commentcreatedate is None else commentcreatedate newcomment = FOIRequestComment(commenttypeid=commenttypeid, ministryrequestid=foirequestcomment["ministryrequestid"], version=version, comment=foirequestcomment["comment"], parentcommentid=parentcommentid, isactive=True, created_at=_createddate, createdby=userid,taggedusers=taggedusers) db.session.add(newcomment) - db.session.commit() + db.session.commit() return DefaultMethodResult(True,'Comment added',newcomment.commentid) @classmethod diff --git a/request-management-api/request_api/services/commentservice.py b/request-management-api/request_api/services/commentservice.py index f0b11b1ab..c0785b0f2 100644 --- a/request-management-api/request_api/services/commentservice.py +++ b/request-management-api/request_api/services/commentservice.py @@ -30,7 +30,7 @@ def createministryrequestcomment(self, data, userid, type=1): return FOIRequestComment.savecomment(type, data, version, userid) def createrawrequestcomment(self, data, userid, type=1): - version = FOIRawRequest.getversionforrequest(data["requestid"]) + version = FOIRawRequest.getversionforrequest(data["requestid"]) return FOIRawRequestComment.savecomment(type, data, version, userid) def createcomments(self, data, userid, type=2): From 2cf1d0e88af6c74e700820d31584e13ac53d4594 Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Wed, 1 May 2024 08:31:29 -0700 Subject: [PATCH 109/147] fix print --- .../request_api/models/FOIRawRequestComments.py | 1 - 1 file changed, 1 deletion(-) diff --git a/request-management-api/request_api/models/FOIRawRequestComments.py b/request-management-api/request_api/models/FOIRawRequestComments.py index d4d798415..39fef8291 100644 --- a/request-management-api/request_api/models/FOIRawRequestComments.py +++ b/request-management-api/request_api/models/FOIRawRequestComments.py @@ -37,7 +37,6 @@ def savecomment(cls, commenttypeid, foirequestcomment, version, userid) -> Defau newcomment = FOIRawRequestComment(commenttypeid=commenttypeid, requestid=foirequestcomment["requestid"], version=version, comment=foirequestcomment["comment"], parentcommentid=parentcommentid, isactive=True, createdby=userid,taggedusers=taggedusers) db.session.add(newcomment) db.session.commit() - return DefaultMethodResult(True, 'Comment added', newcomment.commentid) @classmethod From 1271f8717c2d842c9c08f7937f7f309d7f2e1b90 Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Wed, 1 May 2024 08:33:09 -0700 Subject: [PATCH 110/147] remove print --- .../request_api/services/events/attachment.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py index 192598f89..6b65c3b66 100644 --- a/request-management-api/request_api/services/events/attachment.py +++ b/request-management-api/request_api/services/events/attachment.py @@ -36,9 +36,7 @@ def __createnotification(self, message, requestid, notificationtype, userid, req return notificationservice().createnotification({"message" : message}, requestid, requesttype , notificationtype, userid) def __createcomment(self, requestid, message, ministryversion, userid, requesttype): - print('create comment') if message is not None: - print(message) if requesttype == "ministryrequest": _comment = {"ministryrequestid": requestid, "version": ministryversion, "comment": message} return commentservice().createcomments(_comment, userid, 2) From 6e829c3708c49939e5d2d9b365be2a87ce72a333 Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Wed, 1 May 2024 09:16:42 -0700 Subject: [PATCH 111/147] remove print --- request-management-api/request_api/services/events/attachment.py | 1 - 1 file changed, 1 deletion(-) diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py index 6b65c3b66..f7eba1b1e 100644 --- a/request-management-api/request_api/services/events/attachment.py +++ b/request-management-api/request_api/services/events/attachment.py @@ -24,7 +24,6 @@ def createattachmentevent(self, requestid, userid, documents, requesttype): notificationtype = NotificationType().getnotificationtypeid(self.__notificationtype()) ret = self.__createnotification(message, requestid, notificationtype, userid, requesttype) comment = self.__createcomment(requestid, message, ministryversion, userid, requesttype) - print('comment created') return DefaultMethodResult(True, 'Attachment notification succedded', requestid) # ad the request id to the message return DefaultMethodResult(True, 'No RTT attachment found' , requestid) except BusinessException as exception: From e2e580277f6590044fdd6cfbe428ee3ebbac0c27 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Wed, 1 May 2024 12:59:11 -0700 Subject: [PATCH 112/147] Changes to ignore closed requests. --- .../request_api/models/FOIMinistryRequests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index dd99682c0..6d7500659 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -1442,7 +1442,7 @@ def getrequest_by_pgmarea_type(cls,programarea, requesttype): sql = """select fr.axisrequestid, fr.foiministryrequestid, fr."version", fr.axispagecount, fr.axislanpagecount from "FOIMinistryRequests" fr join "FOIRequests" f ON fr.foirequest_id = f.foirequestid and fr.foirequestversion_id = f."version" - where programareaid = :programarea and f.requesttype = :requesttype and fr.isactive = true + where programareaid = :programarea and f.requesttype = :requesttype and fr.isactive = true and requeststatusid not in (3) order by fr.created_at ;""" rs = db.session.execute(text(sql), {'programarea': programarea, 'requesttype': requesttype}) for row in rs: From b4bcffb01b5b09944a58394664c17593e953b23e Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Wed, 1 May 2024 14:21:36 -0700 Subject: [PATCH 113/147] changed to refer mastertable. --- .../request_api/models/FOIMinistryRequests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index 6d7500659..c5bb5f26b 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -1442,7 +1442,8 @@ def getrequest_by_pgmarea_type(cls,programarea, requesttype): sql = """select fr.axisrequestid, fr.foiministryrequestid, fr."version", fr.axispagecount, fr.axislanpagecount from "FOIMinistryRequests" fr join "FOIRequests" f ON fr.foirequest_id = f.foirequestid and fr.foirequestversion_id = f."version" - where programareaid = :programarea and f.requesttype = :requesttype and fr.isactive = true and requeststatusid not in (3) + join "FOIRequestStatuses" fs2 on fr.requeststatusid = fs2.requeststatusid + where programareaid = :programarea and f.requesttype = :requesttype and fr.isactive = true and lower(fs2.statuslabel) <> 'closed' order by fr.created_at ;""" rs = db.session.execute(text(sql), {'programarea': programarea, 'requesttype': requesttype}) for row in rs: From 29592bb9417b244f198dda55830cdf6d0bcd63ec Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Wed, 1 May 2024 14:25:01 -0700 Subject: [PATCH 114/147] Changes to run at 10UTC. --- .../cronjob/syncaxispagedetails/syncaxispagedetails.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openshift/templates/cronjob/syncaxispagedetails/syncaxispagedetails.yaml b/openshift/templates/cronjob/syncaxispagedetails/syncaxispagedetails.yaml index 0218f1dc5..cca41a472 100644 --- a/openshift/templates/cronjob/syncaxispagedetails/syncaxispagedetails.yaml +++ b/openshift/templates/cronjob/syncaxispagedetails/syncaxispagedetails.yaml @@ -3,7 +3,7 @@ kind: CronJob metadata: name: syncaxispagedetails spec: - schedule: "0 13 * * *" + schedule: "0 10 * * *" concurrencyPolicy: "Allow" suspend: false successfulJobsHistoryLimit: 3 From 0b2d1d3d87fde34e5b1d20e9a506201363ec682d Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Thu, 2 May 2024 13:46:35 -0400 Subject: [PATCH 115/147] cronjob.yaml --- .../syncaxispagedetails/restart-pods.yaml | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 openshift/templates/cronjob/syncaxispagedetails/restart-pods.yaml diff --git a/openshift/templates/cronjob/syncaxispagedetails/restart-pods.yaml b/openshift/templates/cronjob/syncaxispagedetails/restart-pods.yaml new file mode 100644 index 000000000..93707d922 --- /dev/null +++ b/openshift/templates/cronjob/syncaxispagedetails/restart-pods.yaml @@ -0,0 +1,30 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: restart-pods + namespace: d7abee-xxxx +spec: + schedule: "0 3 * * *" + timeZone: America/Vancouver + concurrencyPolicy: Allow + successfulJobsHistoryLimit: 5 + failedJobsHistoryLimit: 5 + jobTemplate: + spec: + template: + spec: + containers: + - name: restart-pods + image: openshift/origin-cli:latest + command: + - "sh" + - "-c" + - | + oc patch dc/notification-manager -p "{\"spec\":{\"replicas\": 0}}" + sleep 30s + oc rollout latest notification-manager + sleep 30s + oc patch dc/notification-manager -p "{\"spec\":{\"replicas\": 1}}" + sleep 30s + + restartPolicy: OnFailure From 127a87901b1b668a06ae4e09d8a76aedeffe621b Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Thu, 2 May 2024 14:03:39 -0400 Subject: [PATCH 116/147] orderid updated in full receipt --- .../cfr_fee_payment_receipt_full.docx | Bin 28179 -> 28268 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/request-management-api/request_api/receipt_templates/cfr_fee_payment_receipt_full.docx b/request-management-api/request_api/receipt_templates/cfr_fee_payment_receipt_full.docx index ce94723df45c983d59dbf80cc0523bf6735a3767..19c03932d9f391cff9096c4deadd71c07806ec62 100644 GIT binary patch delta 18463 zcmZs>18^Wg*EO7EV{>C|Y-_^}Hnwfs&V(B$8{4*R+qS*2{pWd~`c(B-&FPxyzI|^` z&FSfxz9()S^xryYH8d2k=<@xiGA0N}f+Q#i3J3^@tF40(gORPFv$e5}6TO?Y)jw@b z$2HDcAAaQ{{$i~XMQ)@Ty91H7k?&P3C8Of)GUT^XlJyg468o|73@i8JkHQTpVZn{_04~il2fn_d%@?$(x{i2Y=__@ zc3x*>DWBEZpswVAVDO8aCVAikQ9q}!T?+bUN<8y^hsF=#hadeO4Z@)pqUI2eqdxJ| z%w*2|5^gE6jf4ecoYG041Op!t+U-%XB}p}N`zDUJ1`zaECozzRtB zAnLL_??M_%DW$HBOkq#$aHQXmWhJO*g6rIwaWT%fRL|XkB~ka+-6D&f;I)m!4H?20 zB=uwy<257Pm4k`%-fHL)1T=mlhX|7sYh=|${Z(=RZ)0H?Xp{w0N&(K10t>%JjDwu3Cu+il$ zhgwQ=Gl)oF$1P_gU8cG~Bf;rLe#gl_NN*>Ry?P@B$8W@o0u?&xeVf1CJyPZ82zgUm z49$?)@R~=8>sdjIk2)_c`#{ zxu<}(Q6$@ChP;@^1ik!2d@FQC-)n#26=un0<-->l`jvNISYPXtx5nJ#A3H&R!7$d! zkz?imk!@0JVh5bkE4V4EjN%1GB$WS==3eKTQMQ3D>(5!PaxUY)G0VoPmfh5 zunj(M-IQZN^=Pu8$3azLh1QI8_i4G=qYeOM8|ui17=oXzt?J5d7{=Tw&wiL#Z_Q#$umvfx3dHLPJSSNo2db`EssZqJO?S&HKH6WGo+tm{_BV={VUY9m` z#uLkQ>mf-dxfP*#?DNzUYfE*0A|?|vRrGM!Cf*D-4boO5Kob`LiEktov^8$G8Y@6G z5uet&>6*`P7sUBO+%oUxk52){z+@mtRAeE7=y6p;J4z z%mA8w=A9UaasHMwHMkuoo7$M^G5Ok`c>b5ogj&X#C6LbLE?uc<`VG;M9S_*O#E6T8 zHJ5+RbUuU&U%F-aUaU*{?P4vvu4g=rdCwjtqRxF6Np42(?chRnQh?C~O~ub}2p1+X zEOyF@c8>XNxzBULdr;kI!=ny&OU!Uk%6O4u>$AnRBBnNlg(aC{tg?45e^<*O0*4!C zK)Gpormke-V%g0u^BD$hU=Wz0KD+v^vf5D(ri zYp$Gg6ygSR79PaOsI!T(dJ`@C=Osc$@ul*1F*q`U#`Fu4?Zmu&rh|Z64nEYuu@x@V z{0{}W>>sW~;ON4^qq;K#`jg<7mZ@Yu?41X}UOp{G$fIjYn1PJn-)@0AB{f~!JG%_2 zXNI%iV;cK{YE@o+B74ct3|%i)tNTz=ndMM|nVa}$mO2gP3Qpu*9h^p=;W%uxi&HHG z%rk{OSsw+2jpr)=Htgy{sINI+Ns^742!qT^Fwu|5BFRUL%NB@I(r$lF~B5sB2jZV0j!L)p1qmoz6|!X7&0(o71j--a#4UF@eiME%*RMJ z4I)2q&T>QGI&)j{sSmGU&k${lJSD8{%dE9|i#+kU@Qm84V_ zX~Y^5k-sk}GN0L~Wx0pn!u0Mt0(lu%o_l{Wx0CO1;Iw;J9uY~1s+^*w+inx1TksPb z(u~nq9fBY9@AzF)8Quh=S%9ORa9(`&ED5krC=^?kQ45u;GJLC)jI^S%x4C2dU8?;g zyim);Mpqg`r$~Y#5;pzmyn|8bkD}ipiNyN3_8{6aoj3$McCRV>hIOM&RW|+|`My}0 zHF$y@Wk8(1q-UhM=W)D*YA!dib8yQe?x&9pYZa0)yf@l}anw^Yj(_v0+?>gUH zXVbB7!gBQ_tJ7v+Sp<^tlX@0?XcdSktN7-GfB1?qZ_#e$J9+1yvghELe~MsbU>KqN z!Q)`tQBBoN?p>(Uj+YzNef=*Gg50w6bEw!29FM~1l*096MYNM!Y%q)ZBbp=flh3Sp z`n__DyCZgJNRnR?>@$j~3t?#>b<*WlT{M~vU5JTRqP}pob_7)o7UQ}ntrR%7lr>dI z!QA#fNm%s}H{|keti(-?V(Zs+J7x&jJKJw<_*b_gbMGZEh27*OH0Q`a;a`&U99NxO zY!l~1b4(bF$4)z0mErZ%<1dW$vBLUfp%Pvnqw))Fmb@y4Adcqq@JNwru~%>p*Y<04 z$AY4?#V>8emT2Vw@?7%###(^!&Qm}URM=GpFIDuMij@#`J{cwN5;?57$(zSVKY(8` zpj&9vK?hEp(M`1R2l74)&jn1yu^we1s5!=B{dx9aSxwhkvSWmdDxW2G+fNuVWp zf@|gn--u!H22k4y&aIWTg>qy*o=MG>m(&*$djG*VY-JpxAz;spg?ucNco59l#QKF} zz+2%qI_ zSc^m%3*vvRqD^&2>5;l_nMb7xH!Yf3kYJJEFwzFuw4}_%jf{iG<=$4skC$Wp*`t>5 z#DyTY*f4{LOEa!Tmtrpq_cjjuF%#}jn6l-SOzjvW9M|&XmC6A$-wnyvPCYc^8(%1d z`5CuVXeY)*!T^fT$V}9?C5RN}LSG-O{qpuCCZs9jYoAb{_U5I=?3apY3Zg6R{k?(D zUKRMv=ul{qEd5b(4uY|03NZ6cGFL&!T-|@pAKjdnoYyrR0))$iX++EJvhqKjz&_?q z+$72{MW$RQtGECQUfmPv%SU6PnY7*H#%Kg3FIp0I{T?$t1b)>?@?o`-lrR5 zt6GD?VXKZbmrm3~lm#j(x|e<}3u;Wy^>b>vQ3@p`mc>9B13|kFBB~s#MeZUPgdF?? z}b)AIQFl<6u6dHwS6Xv>Sl21<~g%upwc`NW32 z*k|{d2hPYkLsAqy`4MDihH?Y3ewYIVw%vW=wl}eassGfAXMUgB55;1T7xvJK)$P|H zMxfQocEJOijD!mMj?D&C=Sh0-Aat5uwQ4_yX1OY}UlyPLmg*anTcoS-dM>G;3k5?x zkH)PlQo7Y47C zsbY>@JS-prNzDsV03Lx~U}X`&XvhbaV{!d$Ik1P|(Cosk_Y<5}>7@^73Wl~9;E|0rxT+k!(Stvyc~ z1UJ|LWpHCWGN$$J>hX;-Nuk4wk@b$vx^|deXnAEX^bh3SsK_n6wc4VN5D}XWquz|b z<+kgCLg%X3{DGbTbr8G7JAWlXWsDow;CxKdj%?WC%Wf{OK0LZ?jWF@@MM3;N^qhFH zByIl&7?qQ{r2%4Zmy^23^aIr`&7F9>e>!J?|2lUrc|@dcU#)cD`GBg+>oB3CU^Gmd zLsoQAL&Mg~Q{zcw7(&c%y)#3;Ksl(D;Zj<^h}2AuSueS0VhfM6yWc`R)b(7Yr)J6s zyUCNkY+irNP#eB|LkW(!HjdbGOf-(@B2+MnU@-K;-W$XEBw9{j;`?0FHesBl?fVe| zlsQp&x|cQ|f6^F3mf^5F&DF3!>JAGR1?~pLX@qa3stUiUpoijK;CFT4wN|R=jeq@q zxeQ?iD?Yc;>gG37Gn=2y1)!@zlIt;{K!>CW%P)F0dj?Ibf=?7t+%?rm<1_c3&puXd zMNWO&1G+vw4m=&%Es{$c8ng52Eiur5(o-ADtc--hZQ-m-F_0>-D`karoA9N|&Ql9& z@DmSD%(`!bmPki+Mb@$u&xZ4}*5vyXI@Pg_M+m>0%LeGTiT2g14`4=!`2vYA%z{Fw zqYQcNh+X>vahKG2jx@vgZmtJ9{Z&mhd|{P?KIxKqH+`k1tO ze(BrpeKM-j2viG8AaW@Atw9K?W$u=5@K4_jTHeWu@@*z9{!$XlMY*m5@PbhpeT3K# z&k2GKTH}$7x!Hj0VxMNaZpid709B%7b-qBXbpFFZVUwP3s1SB&W@@WbYYvf}hYpro z(&~qvS@jw}Ya2DKgHS?IH#j$w+h(DNz`aW|#f!Z|f;SfReWONN+N^D@SwKNk*ENva zvu}RhITz&uX_%O=`s;}SGx%r7s1w#5!tD+r2f0_@_Zmrc^#m-!mTI^WjPkw0+lkDQ zku58r#IcACS}bmFqZB%E4?MT3D9Z6Gb3ggNcI-Ys|E1_Urg0*7cft1Et^9hcF`go0 zS^ks4Q-9CuexfJ}iNX?qLJ``0GU5Gb0nymAgEMyNo1-ly%cvb z*XT5i9#U?2YE1gkomQ>bC=+fpQbGX8Wba8H-?vqT~&}}D)%Jk`r_=(cBbbQ#JeQ^YS`!*;z|92qn~|> zLsjoVRo{6d(wGg5Pw~>K1Cz&ci$Y6%333KTH0F;wB(SAP*OeJXMsLY=Hm1DieyM>q ztGxdk1V~^A_wiOo86d>>jv{JuN}gOLTYzL@g4&t+;FjsHv$z-6OyYM_F%DgB_-~l6 zn<h=QLoDW9o#8^^d?vJWfzAMA9KNV+978$)LuPG(m1Wy#rR!5$$?g^+e41dVp z-UXOMPO|~D9Yjo|nkt7kDJMHu)~g9D{-mWc2~w3T(s>yt5ljk=7jfb*Xk+)>EE%o8 z`QH)#1bsIFBEBa&hpjXc8de(dexpw%S(@w4>@8-N9P%GOLK$p5tT1@nNj?vTQK#4V zNl%J_Accsitb-ci8P$0D_}N|W+F7-RdxhVWri2BYW?`X>#l_o(N~zma_frn{B_2A= z?-IYz6-LgdG=K?MzR#pZ9NQ;`NRVSy7=N7 zSQ!A7PIKdj#0M{VKL4LC#fW1fb0hhxy}!EoO^n_u37YJiiY@xr<8IHk?S8%?qRxS> zlW6Q=(9yODKRe9uIze@u;SLAH?$m#}&;b^n$D})=`kX^pO&qF|#2#t{J0#J{Je@k3 z-oMV_WGK6Fqq6iRT`wZagpesru28`@9g8?6~)dmYy(QRUolzzNly?&i3uN@(-6UkJ4Xi4~WEj~h|l zrw8DJR8oow>sJYE+0{T5Gc3{iOk*;IOC-yxZh`)1dVd3vll%rAmt&4qH%Q(f0%9E}M@$KX1jy05p$vfF^qOGBBq zn;TEfI5%oR$u=(X`g1o4UU=Y5ALN_QJCo)&S=@fKco-S>Z7Ei_b)WYexqeS#c+5X$ zQ_Rg#aG@MTY`+JQEz(i{+~Mb`!O%S%BEmrq_{cK(1pkDsq5Ko^UWWLW_&#$i1wzv37Ixcogk=cw#k5y%2D4w1bO zqjgA3gp2W?*NMSX7z?sw4lA?AM`lyjo^b8sV=G--}6j`(5R}KdCQ^JR*rEx6RTykn4~S{Q{rzxOyRh}AzR8XAH5{-)BG+hPif2c`{7 zFaGKY{BuD^k%JEUg&z28B~F4Uw;|&a=H}bHPms`%4{N!eeg?iBtQ>3t@lYZP;-B$u zSlYI1Gw|U`M%cDuH%1G@^io8#pRh*C&SG`;`845a(Ig_;vj%un7qN+ZVi|k=t^Y&g zZ5c|)$oH}b-(O!e4uz03JH`dRc&u*1SjF`B<`E^V{ENm+1X5}si^)`Kx}u{zH|uw;Z;1>EwJ|7{PTTT)ThCfmYb$a8a{xa?Tf~uga8aM^r z*!5)&6hR8(cjLum{)fgY@V=}6T<}&|Dl8`5Rq=uw{SZ7CyQ2;0K{yEmLv}TSJvkrY z5(goR`t0rrK#$-Mq;hOx2T?|X=K$G87$k-MU+3$rS9XV+|ZfYP!=%J7WWcA!1CsnUiz$}H3PD14W> z4eL+OKQQ}|s za{tuK?sE;3^$6l&N(+{~(?P0eTA8F{!IQkIeupS_KfZ#a*d2m>Tf*jkRwU>Apu)X-RTg{Vj(A5({gZ_cAAnz?<;}e8r}s zMMjc0umF&SqBXnN%%ReK^fm)d@s8@fOx`PNMg$PP%^?>-zQZtQpxvR_5dd`dTm7&U9?9@!7vnOvF_auJ#+Kv@F{Bw(*jzRKC zrKEf_FC+an{Q}BKp2^9a!2!3PkMm3lF+iH61=u{S@@(fBw zWSxtDE2oC>Tit&8|z@vfxdrG7J@3n~^$^v=rYnd91 zi=oB^b~(RyZk2jNVLpahk95tG)-7*m&fiHD{p{FS>iyoc(0Gs_BKBgTYk2vf{vdxS zu5v@DN5mAE|IMD>z>C&;>b5V64{Nykh~yPCv!3-#22eGK-7m43_h4|CT z5<@YAN>OBZeE#@*o6uCU)o}W`{qriew%M z$Xx&I5f4NAuoEy7RQDM4Q|#}x#|rxAXGr}UBA|Ewm4J7*!6Fa~lA9#i zK?)47CtHvhvjbcD#rVChwe#4ct5{d(6o=DdiPm;9@tQZBS!JQX+DcW45Eb~o7kHo& zM-|nKFCHu1S09CV-D&o=QxDeSIS%3q*efNZ6!(LHY?;wOv>nU=&td<<#lD zG+-23SSr@o-_kPF!JtjJe}Smo3uy`8laBluHys z3sgcng$vN@tT-91o9HLLBskr0q#h|$`7+lL#rk--dY>@L*4;bEC@5!X><0&`tc~Qq zsRx8f5AHZvUY*BOquomNev0A1A2)v!6ituVJY7Zmlwi=5Hd6g~;r3qqU6!EPxLZ`2 zznJ=@6`7>^N<86LffX=AflR1Xq2_Mf8**56T!Z35^bDyJ3j2<6H(>IVcyLle#iTZT zQ-Rtu5izwvf=Tv1dvPJt8VR7_f8^sweUucSsYBB$M)y&r?($j>*|9`{g95WKpjjUY zrP3k~HD;{K9vf-4G3Vgj7>VlA(k}WG46z7)Y6Z6t<1VziIOe_i*!&sF29$Q4I6(sj zGpwt&2%+5m4u$t`3ZwJPF=_kIuZ@4Af}KkyC`4~2sIw8?8WbWnKNmeCEB#Z{pfYh*QD`y{wpkP?YBy0WkxQE} zqFENcJY6iVvCFm>X@QZxMPOSzv{wjCM0qR37wHXSm@W?Nw%n!kQ=&955i$kP3gZ&W zK#4cDq-IrwbAUJf#G-}b;PWhpXcBDXYCgDg4-D(}f2k`m6PzPBAz7BcHY(<{kskK= z(EedWzZU&>x_T8rM&*+b(@Xw|hl5YdE!aqA#AkVwi1x(Bt0l@b?hsXBsnjJ7V$x%Vj_ylJ+!~#1O#t zk@$Q83plFBb-lUd=|<`Nx=^SwsY(>18o(}eZFYSYO%BA)Lqbgvvl;FsmOKv>}iKT~$z@~#GqXX}TdEM6^K()=w2lm|K0U>2X zAPdy5?mqoRTaifxJapQM4iw%*u2#S!x`eBgCG6+v*P&v)yoR(`mY{D3@nrbAzP^_b~>& zmd4%H-mQ(BvNS6lS8cYi=UxkEwtMzF@0G|cgp&>VNjA;;TR!a!VDK|_C&Ku%nauUb z@Do@Ug;HwDnIX_7oV$7Ghg#;~nH2o9b%1Pn%yUpjdT{;OCj7b!Pu~H1V@qA6Kd873 z6{Ur>Ek0L{SNK{XNOu&g+L(5zZqezyYO085*u?1`?8OwEs5^Nfk#Zw-;>E{bHB`AS zMPX@ZQ$uTJKDIIVG*;S)j;3J-omH_DgADA}Q2m=Z4=bWo%f#dRGf|$zc-_ul27cha zIw+7X7x4`>PQ3YPw*qA@N-z9hQSwEN8=0*Zd|3d>Rkz*R$@1vmq8cp3I05P@DPVjo zRXIS@?HYD$-+t~DiZ3*Yu&{DyMA0-1gt12qVt0QT6(2s^137hSZWoA);vi@Ry4;sS4|Ey}dJsTG#TvVYYfm6lznP`N zZZ`(xLx|11ta-&iM5O2FNA|-R2767NHGm!C`ple?HDMsyf#V1oa^C!2)9E?I`}~d% zg!EyS8frF{vMw2B>}}nJY#Ectv+&p&aau?DUGDBY?uX(lfQUGs`&A$|s%f-=xQ|i! z>ZfRZD^esk;lImHeMqUKxjuh*?-pXwdFpJObl7Au*Cv^5HVHhFUMOk5Z6w-`bfdgz zSf#rddS}g5tyXrfFD;%(!yF3WOcKSJ1USFzLW_N}z)v*!ZNBCZ`nvM{T6*4CwQ$j5 z8??^3%Qi+~)_njWZQrQi-tfy-UQ4dU13Z=+S#j(5hp5$pa z@a~kCWbjswb1<&$i$G;GP~AufVKDxH%8-=mw{NIxEVDNKxX1+j@VyTij*DL*0QXqe z3Cq*BwrEU;%96Nbn!y@x-QQ>SG$4r@s>n-a4?dQTb5PscVNDczQ;eJ`qmHz4BHtV7 zRre1or;40isih&AG%&l;swV;7dTmhDVDe9XwJTA`;ba$9mg-MK};svc~-#nUw*a8?F2>OCv-cg}c>h;rQIEcx( zzwvqQ-HL|=#}W`mvc4v{z;=IJF#)mI@C@wtSVtbTASG-?N>l}6`!xepSS<~BvWQjk zP$`9YQH9ZKAEK5a=J};r!-yS^AJkl_P|UkNUoIkqk@p%0!h+2vMmiEc%O5&3_96D0j$;tuv>vY}knO zk@KL1f9;4#?W*39PPPzm9l>Kq6fo@gAWPqPxPlzrGhh{tT)09L65^#K3w=E}g-%=)zspmV zDI_Qxi(C;qtq3CuSQ6ifpym)DkWBS?gNTh!Yd{;CjW$ETj1^kWv!ODLKtw&o=NH!x ztL6kBYNA&|^DhX;U~X^lOSD95BE!jCCl4x2W1XYdKn>x{FV#Rv!$+F`bIh5(@9!ja z8yrHBC%_5fyoMHiPee}nQl-M|QEeijPJ-)1!URXcG!X3oKYkP=p^9^6+QQ5m1U>`^ z3y$nGK5Ok3rIPygeM^NB?|1V*6{os|KFv^)^UEqzfOd(<%v698_rHiV2O$gm&5fY` zJ^M_Y6fd3&OTYY4`ogmaZO< z_@{48q8v{ryP12X0cVd_|8A6#mY(!0OE9mwFq#T9A61R(atG(>z@UmwjtcaQW^Ub+O0!kmy<2XEG=D&?0rs401!^q-9v$b4o%BJyt*F zu~feU_k9y@=F4-gjkM=8`&kT6uK6=CeI(n_ov@jvNiRl78w=|MXA~Sus4q*pdW3?` z13dXpaGEcs)7GFT&3wvfV`qoKGgq}{Z4Ku2a~aNP4@sbT1_^8Dn8l=62u{rwPc_4X zI-&gxjH+Co%nnEl@(`=#9`(Oyoy*Lkf0)$so>m&yzU-wC;zb5g2UM z(Wh=A;@2Kmc--HwO>XPwRH==qie=|Q@lzFWPY$)ErT1w80n9ox5v1{3S8NjllVl9c3ZYd4 zd%u2%6-~S-kJqu4Ec+LfdvGNa5M;(_$S?ylFd)XX^ll?b3mmyDg(9$I{n3aEMYJ1W zGWNbyAn5~la8dU9SWtqqht=RiT$Y@)HJmiJBE~b*Y92KkIA?GvSJmt}T4XAdsZS z?sd!f&koc0EQ)S_)Qe_&QF6Z=@nU=rIq~o( z?4OuY_v{qGi*{?q;OI>GUEDnRT|cpQhBo*~pX?u_L44NVVYZ^%_`6>1AB!CMFFyXA z4{c*VErHT(n?i&X0#5IXOnh8&3d_>g)6Wi)jl|MJp@~?5N~ATTH5K0 z-f`2zG?4}D`Y={Xvm?@tV}BQ~`WTD$VC!$&i5SM!jK_nJSKHCG=?RDMG0%+^cw5zU zmR@S-CI#6OEW;obQtof)thN#2;!Ql#&n(itC`ZaY4OJ_|{L19m=r-XOL2G#q`+dojo;~w#tz?=k@t*&fhfb%_XL6TAGZ1X-tiHI8e{CTaLH;M? zu@xLgXC0kZ@#Lg}LgKhP%t9JwX&W1Z6EGzE0Uuq|u4Xf92V3sf!>aZzpyY2+8ZCp+ zgW5Hii`uo|BS-carH(Hd*T8Fzo;af+r5dH=7g)Z4OQ|OJEuu?k$Um}6`agxLXdhSt z$amWKEC~D$;G6bAjb6^1RFB|uihs}z3k2MO>5wf+t5(<#&UIu%Vxi~sAb5`HeT<34 zcA^1EqJ3!zLUCUR1?e`1CxwrTfTI`k3lOoE-x-j!jcoMsF+g6po^)LK-*edN9}=_i zw*r=yYoMayjhEVM6c5$8D^KQk-Vz3_yXJy$qFL*;fI%mZZrn2MT)>!jKqBu}-H~g_voq6;!RBE-f3J3Z}^6o#k=IWc{M7#I2B!V4lvYA*O zd`g%p_eNa@O|mA^DJY3vM;-WhCHvLbf8oJR`EI99fwz30=7(;GN8FdUxxbrl>%F7q z#avpp0rxD-20^mcFhlnS5Dinc@#ceIh-gg$G!YwE^7Qri9{YpecM!`AcPw!v+~nq^ zw`{JmzU@_E$G=i;j}Vs59xC8u`hfX+8FU$U@jRKy>nk|b3fjHJy=|wx-|&;%HvQY+ z`@i8wg=OrOBpehWkH|R;>|z~ArdMF2pqs5A*bnSiU`Jn#XvD5ZR7grezFN7qe`kNg z_%ZGGGgrZmM9vSkzXJ?IVcHKCLp2 zkR=d={vSAH3xfZYBL>4SM)pHg3K4*!7S0C42=RoV&i`+i|M*?tXS+jEqKt-9qP#>a z{=54H|NmwDKV$iCaHVW8`>Oxt6Zjverv^JA0zo&;U*PkDrTP#4JIwz#Dg-t1Bdn6x zum42&jL#Fz21yB0&99!@@>;QC;{4yu5@M)Y3xi zikYqZDGevL{mZFOAplutRR7qb zh7*bCxitL=>c}Kl9UF~McuXayRT?Jj>&Vv3Yf4`qo za5ywinHzxY)~}K6nMlg~r|2jgoJjPLj!dI#`I_Xau(S<;g9}=_)K|rQ>VG=0vDq~4 zvws!y#un>VC1dl=D+);^qKLyX5nXY9su;kRrSpGWJN$3+dCM=$5$pfU+`g`W{{JVW zH}VhKZj$UnY^qYq_1oPGv6j-|r(iUnQ86C@KhquUL`%vQ=rQ255reLy~ zC|8wV+}bzp=%yzGf30a!?UHS$(YnIJJ^Afc_~a#TyV&|Be42%Bp-JHrS%vZY&5E89 zWakS4hPp~U@@Q)6)!xgsQOq8U6t)Ua;+ClC#A%?=~y~orr||)P-Ef&%dUa^PmYi z<>t#?OptW8@XiPLWHVk^n=0Q%?n(&XTUE10)gL@-#0TgYD!=JPEZ%!kwAI^49Py_t zA_bdkx6J!g;65iVp3QhfFYYDCd0J)moKU8W*WINN29!~pT(0(AcY6mHO5@kd&Rw{u z*4kZ~*HQoTwB*%(<<{1(W>5-ON)z#NOQHa~veNM^)l3DvnEEP~`SZ+Q{EqXUSG~<7 zl4gwuHuHq;j|(#1;oi~pi@b6Q(`34TwK2U|c4Zwu!lt|uWfU}|D>@fzZp3q|%q@@S z*wSrSM{MHI8{?%czY3LJb;RgyO<9R{ZXTxDrai*`qpn;*k#i-7i&)sW#xC!FSe)XQ z)8V;ToLWTxt;nybY4olIDAUa(IMOB|p3-N;nP`yz5YHT6xr|JR6ged^;c+I^C#$pW zRA^Fbt3z2oj|qn?*}sab)Sv)Z(Uc2l&X)GPMX8kIr50sRtNZ%W*7BA(RA2Ps#)3o^ zYO|g+2`Q2+o$p%@3$!GvOm`QVBtj>Ms}9`s>xy+j1*RT+mn5 zjkxFAWE<#t4K{XFx>%i?Xb!bYv6`myyGk|HI<^)HHrW>GB69rOM9P2wO$MNZK@Nn% z_F?;lxfkDLDcJPL8LEN1p1M}(`tm`gK<1f9!Z}COsL@4;<9_Cb&ZTuwM9C!5V7{98 zviDoq%u>pHCH;i&H6(Su&#Xz?;}>(n=hVv{&jnR^y>A_2Ytk`YYx5HjD&aOKGfJ<{ z*U^$Bf=q7NB$Ka&bAi!oYi#LT)vUut)U|KNYz)Gvb0}pdJ&mUYd_dBf^i2TeeM!m= zbza!DhoZfs3a^dF2>Y!m!-B^ z+VM-N)BGI-1pR+099)g#j;s)Xf63C(bBte-9kI7y%13LfA@MkiwS+_rXmfoO+Vzco zYuY!I0h_s-vzod3G=)I+>;m3>1=+!rB9ff`pXO6fK$e zs%YCP)UCNc!|8TpC-Ykh=Ud}CU9FWAY#Bh#;4*iEDV2h(F#A26;ix!(d|aOGe;h+y zQlAE=3}f)mxB(u#q_b+YOe!=Mi`_Im#o8An~d>21XK1sWkb3+8t!p#BEvMVnUD% zklhHI7pB-ml;vUi;DdL7^V+ZP2Jz@J_5|ccnE@R3(Y<*f$W`qphx-gt6MtU!0ICpd zZa96+0}bQP?Z(~{y4sP~0ws(TN6A{*zovv>RiJIEWd)izaW*(zG(Fgj)hX6B=@rgx z9{2tDICw*hLH4K|uZ{_}m#H0WJ1%ob=}YX(yxPefn0W13E45ERJR*|+n zH$}!w!Yr6x{SYR>i5U3ZPu*)YJTh~f9Xq+tgZZtLS7!hocp#9bL;h_KOH$2Upl_uu zc+^cP0U8zD<4g`b%lm8TM(hxMLdeqNeM={W3HdYP%v6C^i2TF1hp~AwhfmN99t{g& zt64|x9mvpxCcWmYrK^2)!aiISc~c1;!iu){51!--cwvGk_JuA8cu8Vw(y)yKJ6MBy zKJW96L*CI^$l~i<>kv8mJY13eA9eG8<&Xc7;Kcb#Ln4AC8<`t^@$>F0V~+|FM`Vo- zw8v}PrZJ-bxuiJfC%V8L7oBCLE}5?^ahVIRcm<7O>cMG@u@=0!bhY9WTq~!UQ_1&r zKfirSPukPk!gD)0FPW7Jn@2Joek>+pHZ(|j;m>5pl-!zw42Mrrn4ahVqGUNg&}yU7 zg8thRnc*%hZk{2cMCDhu_%E(S7Ik?5G_FMn57$k(&DZe0u97}vAA{X$Ou{7USK$A* z3y0ntys{OU`Ml?X{-i5&xE?=ZcJ)^9TF4#ta^AH)?bke}hI$FDGQD!<^t9uK!pv$u zag7$rURg6|ONv}heG(ubr)2)yhSOw~8%`Lur(U+`Zaln65SSDt z8S6Jy2`P2`ws~{7tv|xbIMR^!di~-9$C8@4*K`|B^wTb|d(e01*V&V=Ui*2pZdaYK zpxGva>3ri`**#nM&6lt*zb*8Jfh)Sa{d9I1Q*p=s!>YHno~dc+ELo;_=5683UjZlC z&Q4sb;l$bX_AdV$r=WzTD_gg42Wmf`vH8=D)w>d->bDDv8ZUYA)i&(RvwMD-+nPJ0 z@&jMpSLbm3KD+n6mSPIKx|)|>zP0M6>YcAw1wV3h3{&iT9Cvt{vrKvfb2Zyq=JYua z5?KEA3UgWr9@cm4KIx}%a^s9=Exu)jWlDv9JYA(qR#*RS6Al-iTah#;>-|Ktd*;)B zR=O)aZz(-{Q2=W9^gtAmu=mL z>kI03HOBo1rZ(6rTu?HEtY|cj&feq!EJ0J5Hpe6?G1mJxgHoXHAAaEYJyV?y?*^CY zu{)2r{OKt7wY)8rnR(0V*#7Mg68yyVZ-2M+KWCY1cK@{1jmC|O0xi3go0tOjtZcdU z9;~__1xjFV(ZODj=iA#wIz9&&((#!Uk<;H>8QzTy6)`jzWUMyJiW672I%j8%@j|VifJk{x2 zEFmAs?sjW4tMjMkDThj>&Miu|xLB>NwjuZS3Sags-{l`~zk2wxL6%0yer>)LFTMvG zzYeRLn$37MHeBb(y5xi18+3!u= z?h=!)f2j-93!FGXh4ZA2%JtM5@5@t!KFxa=|J8k=&6W@QKc0H+G-=Amo=H!xSa5YM ze0;e-um)>o#D7(KGiVX?qsM<*n`NQ`Dal6!uY zkNTk$&j~jc+`QhuN&NiHs#X5|{a-E%dv?ygeoloOw&7#&$N#>s(vv2IQb8ul^slYisET>;$+8p)0?S4xom&&F_$y>LI9FzT? zTc2%mr|R#eMrS+y)7pINIo35kQ|f8T35b#Vuy;}K^_%fkYx*0%ELj1}-ijyWfBIWz z+mto+uUTQM6+N5p$6-c;p3BJ=Z|w%v1weZ7M<#rwP=mlQ>PD{ ziu+m;dc!>aPQBmTXZKUA`}e()iL5O1r*Z5$A@-%-+oWR3(g&9VYK;42LR|Pe_PB2C z)_OBJCZ#!9Wm{BaL@Kvwn|Aij$h0J^JHZ$i#!)fM>FB?6ciThTZ>q?)hP@Z>` zPfP0Q1m0BV3(3+#ZjsVkme?M%oiojM}7*JT&xWc~AhGPg=*-kLS*(o}2z3eB~+)$&pIxj#!;8ovH360)WfAzw53Y?du!?PTt3560D#L$aNi+-)ZZ+KNwJpDiE_ zpGcJgEonvucP8J;wqp#NESclLm^L{oM_U>(oX)_&kF1no+2jQ|O48_!E`*ZI$#-+q zWl$?Uge(ICUp%l1RFOuMM(B=NI5|F7MFyUcfJ@*&>sAp!A!YLXTpK3S^vQQ~4cM$R GK{5cjembrI delta 18328 zcmZtt18`=~6F-c`+}PYC8{4*xC$_V(t!I->Hnwfswr$(C{pS1r{`bA8TXjBNQ*)+q zW_oI-y8E23gT}3cR>MFe<}kk!`(c5AxJ!eApn$~fSfByVb+w)Hnj3uuRF4Fj0lGzx zyw0?w{R3WZSG(MCrTiN!C$dv4gPez~Q0&_}W|m)1ze2)5_5BGbm>NATjp%2Etxo1< zUk!*qZ>EMk7@MDB=c9TRuzJawvE6g<$ zYhr0~5g3T>#$8g!4py=ymh|gQDF!%)OJfd;xPA|!gc3oAZ=JHjO9fQ-QH9Bvgg z$R0ij6oi~=YPbtpY1~=03K-NUR8g%464)yWiwL0OtZ(dgDXE8ml(}kbZB{-8=Y%>a z;eei`ynLR?rHKhg3*KbL{t?NiB*c*XVbn+WRA#U&QGyY^zA`#Nj zOh5c|emtsAs|M*#aq(A8sX`k6=oyxPDgwi?tEMBD%Q2ssP-=op9DU@jo0$SePtToUZa$pG*_popq?ts}u_H20j7o&cf6^S$52;5ei%2uh7{3loh@ z2Bc~d!}~OOqdvQN}WcwZ?3nN~bL*_?-X)aXDLpqs9&ipa#0 z{49u;DmC-{@WrjJoHgUee658kEXSAjCB{d$b6Km=?J+vv&M5>t>9!e5TV*J-|-WA-=KPH^P~nN~YQGh_qhL7F|@z4{31@6f*E%HYre*#L;E< z9~~1rE3LM98y(NRg75Tw;UvkhT9|$l_peDjWo+J>JVqHQB?=dxU14YA>kU|CEsw%L ziwhVQ!0Yc40hQ5TP!)PS?6d($NlU9={)WyOqBG7%VQA6`Q>P{@gj_j1VX-~^3U%7- z-N%V~Ha^6|n4%D&8)*l&r&GYa?zTvP8aqYs6-Vs zVzF!=?5I*#1i}^7%wv7aSa)=Z5(VS-tYWt&-AZz=d1{g4>RA&Vcs-PN!0mN;hSfnu2!yPzOEE%4* zW(Q;^%dOao$#Itkz@dKj+CO2vNcl|qux*o1FcqEhP^_qaSbwKe(2g7~+Ez$zpsI_v zeLKDqsJGi(h2a#>Ie!5Q0S^1{Cu8-b@Lv6?9syY5gX6GQymS#E%n90Cz8^_?4dkPw zhT{e?ADG=;{+B+6;-9n{l7n+;ap*p%opfi8*Y=4{8wM-~x>yUj?3X z7edUphsNB4^+<{-t2U*-k|-spbTKJ!2orB6z58BD)on12TE zL5t*l4lw{hPCuMC(<|qQRjYRt^x|P~7%0fa?As(Zhh!R|wN$f^q!yM|siP!3u$*>z z7k?b%5`hhwlqVPQs5ujPpcISNCJ9IHVGoCnTBOwbZJ9)&T&vKzlvelo$$DJlq1YIS znDOmco!qSejS{fW$R{gO#AtQ?Yp(6azi}%xgC`VIjnuVH;9ZLSZCpp@L$F4F)I3z@ zK?@NRy9nQ%MK9>#N>U!kb~e zTDDOXI#p#_NcKGZnOT?ppH{?qHEj7^DNVrktp7Y|s_b(}=cMmIN@@)|rPtY1hx7G< z7xucS6GeV4udrVIyxU?XEp6>#cv>Z)EgmhBaVpdp-@evgRm@e%%h4Ov818Zqv%E(T zeCRU?A~ImUpM+ID5cRkg0gR@~z;YlN^nB}7aihc4N%l&wi|N^|>N0LK&AqEbr8~+8 zazDGu4RU9VHn{TD`c%MErgD>XkJYj&&Y`g_FkJlzNqR8H|2DYZMI&LLAedmdIaCx6 z7Yl*m59=B_q%2)48jijIT@9u>=4DU4NgYs|;wKOSB}Wcmb$cRTLsQm;IiUACGr+cuWj41AFUh$_D#qIi_@h|tapC{ z;6p%xXcQ=MMr|*yQ!fAbR|n_wCtHX)@;vVENEqlX0E=v`(IPmQzi^k{lJ3zYK#nLF z*G&ln?5C$FvmC`8)E3rWOP1-T$(_y=pA9gx0mP3MrP)d0&6e|swC?Y0+*snG1jNtP z%4Lt-kb3nU)>hia5{lD#)gsYg4xaTSar#_PF#}Cr$CcwTv2cWy!FkN}q`MJc3?e}# z+HBC*=Vb8x>`7RuTx+;nmc)y6$uboM`7yAgy#WaLvs93o5kKd44wavt{av>0Kn7qt zE1phDnh5A+q*IY$uzxs)Z_?QZ<7A6EbOA-uWL_2~_*9`LUP4 zMKuIvow>~%2+)`Hr$?>+m|m=jP`)<7c>@y{g3+rb>>%?PW?nO8XeaQIbs|-py)bj%rUnuQly1q*np|UIq0lKk? zzNHv9FO5Y8{+V7`MzwqPW-&kUk?C)ZVwHo2>dIO`MIM}9(nWFUiwyfjo_}dM4J}cF zCyu?crHK{tkvtMHWty0*3LpDms~<*QDIB9K0=*joRhZNo@^j8@pB)+%4@Gk5h!_M0 zRCII(%>Jcv5P*d^rvCS!tG0+QTaqFWToA=lQ6jm6raz~dFjRHi<5lsU@4l`ls006( zT%8vaZcV-+gmtKOCaxjOvnCa z+q0}X^vJR9z?Z|}%@%Y7@qP8#UWVSv-d#izS*M#q{8g^Yjcn1Hw`=wqZY;S46lTI< zHCY@PBkA~aPaEP|Q|9Eefu8?UL)QG`7;f1~-9t@Iv83O9V9+P^v3#7xS)nz3p&ZcPC^wbNg5o&qA3-B;`WEL4{;_zW0UW#dg|+m^EUWGyLnw}_ zChEW-fZzM}1cO?D$R76i)%eOq9SzUFbeMIpR0z#Tx4W?3`QA%V87$W_gNs#x8(_Xk zT1?gFxrNGxnZ%`&|PI%YJ} z?f#s=5-MWyt;PPr1M3Q(+?Y5xV+Ha#k#_4hwt&%!469*sG0b`uQ!LdYWEbbCMK+S+ z6v9Rvf_1mm>d_kI*YI!8=MpB(6Q~IwxAMb%TrXWZm@A0yN8Xq!)VF#Y;J~l)Y6YyA zca0QKl*URKGXSeRv)g}wYS$WQRd^Ex`;p;TH`I4@lvYSBj|yb4}cRD+d{FY)Icxknck4 zK34mvmfB^XxB56$`V4V9P;>JHQL2u;vJ5C@S-vlSKkxofp=J3Z^(kGaCq?* z@u%5&fftze)B<}VxYC~MCyIL4pf(&$ONtvhs1~q`hME;Eo!#l?UqvJcpDg^wr?=2Z z*Os{6Ju^BZJu|vTK`4+R^zO_bGy58po5XXplzz{tk0*DPN#)fGeq<_D=QICoic{Nh zzQ@Osh8WKPN2eQ@YOBMlKNBsqqn<2V#dXpf@K2=%6bN|qNRJ%-9emxR#5pSk zLwXqa+cYHv7VGb_>?sIJDmUZokTU5d>USR_5}A7jA$)k&{|lKb5}&jumX1_-qS*OBaWBx9`!1qJd}_@+zJn0C^QoC9Zr7L>ZN11^VV4Ri5AHhDyLc zxCSjALBq>&{T!bVwFcUu)&|sNi@qk?uGTRpF(UD~W#)!i5-V;?up)NM_Ib}1 z$a2t2^5`FDkGt80|H%*5)gIl2@ z=l))IO-mw6?g)dd5M&l^z;Gqbgs!s3z*ssFf+l{xV80w<6j}-}CJ~B5Pd*3` zw_QL8DF$rS+X+w0DqBf~Rc)$_T>ITGcDx_kuec;XvDsDPuwPQJfaT3s9zlfs^L_LN zLgqNaG^o3}-amA`vnfP1YDsm?yP6vs!))Mx)i-ja{noI<4ANUnD-tAUm5CE87z-b| zXbbWYQ(c18WT5<{r?+h5;1+n}zZWP+ko;xaZof;mxxdiTdP%cYk!x0$h|3% z4y{&4fy9ke?())n2V@Rorm#PpAsHtR`#o{}`4od>9pus!t6pd^B3fuzUxcFF17*~t z&MrSUCD!VFSs6a*KmAUz)VgD%^;F8S)s^Jj#~kfZZRa4=z-ptp>vFYaOc~s`LAAdq zYuRr|j=EXwm4l`sLf`M>?$|Qgs4PX90P$j6HQ1KD6gxpNKR$3ET)TJjI=ZG+i}w z4#L{=yG;3K1H@W**-AjqmS!F~tF4;|)@9Nhn(7#<>hfussca83Af<6vs;Hz{F)6SC z!LMNK!y0i1@k7ysX$2=c*oRI66urZo1Rq%3%7sfIfoDs6s-Z{Y=rKI^rP5H$S%~Ygo?550Rg7zLl)eG&uAC8@XrAO+v#2& zp;o;uNe2&R4xKcaxXvL~E&_iT>UHPpDhRiddX`)j8U0!}_THGEQw@v+;YIm68BDwU zE=lIQm%th!z1;wPOAXnkoho6MI6r)DJRwe@u(oV_{wHXjh%wY$&YZfQe(XovTZLF+uaCLc4p9eNp{A zhfBT8#B3Mb-|$h4HRLsB5snm6MjC7bRy`>mryFdB&o!l9(CKc>%0T^dms-LB8o4j~ z$RiDe15mM=ga?b@1I77fYfzANnnFnVB!V`3B#X+GI=cEybD-*e{|%|+Fk}x8V#KOV zgr~m-tw%Q)s;ixzU+|mkD=#ngsAA-|th+D(V{L`>FWbn3^3BOyH}lXoF&k~6zVt$jU_U!`wh z%CCVyw}-@baDP$YRP28swJx%s809db#@$Dn*Rkz6^#-&sir->PpvDe}=G{6fEXlII zTgf?APB>J`!H%$|e30VB*4L5(`&>Z$Z6aIv2V3uTWVnCio#eu@&eOj*$x2Qo0_CuK z)M~NBIwC~)N6ZiITd3D-U8SDW$$wQ?712 zl|{hO7g(I440>HSVH6lFIi@FRJQxTFUK}YgB@o7bcUksa7Ez9(N$wRSG&+L(m@(G+ zyy*(g$S^P*64QJSj+zYdf!Uk*+#iPA})0$V$kN$5Oqd!Djv@zS5#Z^3hdsxOe4 z3K-c(Nn2H~6t4*n&yU>l3saS|^{2QD0#)}4I0Mr}u!Hp$b8a26y1U`^_p_oFSS#SK3B>CK|ZD|(RI4e^K2YV}a z4dlDd1vC(=-DkY179J3m^abqRgEttlZQufOKPz9FeMF$NCcm6js8()8jMRaE#e2v7 z{;_@rE>a?rHfEx>L8DuXOG6b7YFpl0UaodeK26>~gfZes>DBPFLZ09n*5q-^;mbOZ zb5T73^<#5`l8>?mKEkFPNW>WZi;Ur@Q2`3^oj)7*!Gp%Z0bNVw2{6Okt~*LOCqM`e z++}Y|!FBL)O1$TqVw}5BKMU=R%s%Ku)d{Z4(4%Yi>X~lBXC+x^1LY*M-%7jOmCJ9a z63j+vqEDi(nZ;#LZpazfClgC>J4H&`8?(<#=2JE@wC`IZIOV0;tzx!azMRUcr62pHz{-5%2V_M2Q)Dnpo9N=>8s@ zi};yZaB~Wk#E$L4waBa>T`0{>-(;W zH-Ton3XiehZixX8@||4*0dcc)G+{8cHL{`*ZnzS3a05He z2AtwAx>!~6v>`>qDgi|JsY7z@x(N3B2z1~b_yU%5fG=|=wi@mD9+w2g?6RQ+Klvd$ zB_Ly{(Ao;V-j>W*@A!;sBpv7>bzdngf$vEROAKKoIV2dffIU#*@hczf4wSQ4DY zL_%$GcaD9WiJ5ZvP^drKuzA&CxLXmSG0F>|a!`JPszLX>;m!v;yN3D2GO38afDvu^ zD~te&40n#6f?P1nCV-RmPSqxHs1q-HHXB#xs$P#{sx8X@23V*FZn>aynn0{ z#F2pH@RCBF>l{{%Z@=A913}~kR$bAkEZ5C{F03vd8Jqk0?5qDCx~scg>t{T6NJX4+ zzmK_o%4|SI#96oHrDVnGLGWVF!bNrgVanmt$7C~BV?wqlTXWEusx9R@Qg*;!gknEm z0T&2s0ZE=OT+xj$j-+wyT;BbWMm|Fjvq^E<(v$Hl7CwJjBmA6mpx3|(e8j$Jun7r# z<81k>iZO2*lQz`fZmJ0b6q8g&3O6%R6je#S6+IoZBqJRWLMrIl1b@H>lsB zuc{Zb90%r~17~Gj@Yu6|>x7>8M0K4(YI}hZuGFrlz;Q{iSAIQNJIP()JBiVGJ)0#X z@W&f|_v&u2zEHb;>S7?2DbI?7RXcA1EP)+cl}nAf3YHw8LH=ku<@-j<-<<2i9C@_& zU~>1LGKW2`)fUZbp~EzS3g@2`n;RVW?1*{w@3&5QQUq^b~{;G3ttf75hyrvd=9-@s=PhR1Dar?tTwQ z@ac<@;n1SI!3jsO50?xmC`<}vYR6+1a$>dmyG}?nJWbH3l-H(2$gI>LxTi-HTq>4& z|EnV|eJKjK-zYWbo3E6{dM06+fM$i&EJ+nK(h>c`$~_*szxv%*_9sZX5y90i>7u#; zx1L`Q)7R!Nl4@#LYxGUIWD;`W)bL(^63j;>$1k%l#nrUwkM&RXcudxlL(KIFl#XN3 zlU_Af&9-%Kvf&t|$~sk%Sn}#f|1wJXvCHn)Sp#MuHBnI%=5~Lq@Krh@4`Bn)(x%KC zkJ=#V+RkezmiIO)M5L(C7FX0_hAg0PiUbu3Lx=0Kfwf_Pz}1=`vfBofSD2@h7H;r- zP%xi+;~$zEuNox97Diu4Ss;Pyxu4zN5>S=mzGM1O?Q$CCMvXm~vf62cm`$wt{C-_c zn}}Ip-w|SO6##!O6cZTPSfRDMvMzIJuz{%Z5nVO~d55}#&Q12~^RYXyzYT)Kf6q`T zPM#x5QDUcZz2UIf~53i_rPcid!AT1cI% z&}m-*-Fss-!EY{?!LcGheXf_cY<aOH^#VA&=fOXX0P=;7|FE)HaA}s z8Xk_O@KY<ftX2Wg(0!w^@}5<8kFpQzTJRVNB^s$9+$|%7RbI{9jGc5T#Ti9LXc3L5KQZt>DAJ z`(xsZnuT zh^0X=8dQ-mZ@6--@q~~hqk<&rK?KA4{n8R~m4|0?O1DKs>ZApk3srwA^21Hj52KG2 zO0Hl{xEg(#xX#YP=|dIixP7rc8?GRRCUiv9y4822L>o@Yn}v0hCT|9))=?ik*HQ0@ zKBQav-@xkfFVCWw?DL-=dt3iIX%4U*I{IKhK%6!IKlZGd-S;{3fA*}-hGQNlW@lEZ z5A^60EYYWK+&JzJzLJv^c{09@CFWtKg+JKDYf}0bR_7c1WBjAMBa-hcgRb9Y4Fo*< zB*}m8rH;}SBqVCDr@GdMVi-k8;T;@j;-(5R|DgVaHUv7l&Ai>!xtTo%g!hvEL6M&p zy8<=s(5L@;n47x$Oh)xvkgxsZePHlJlb-9OH2Z`YVC0Ds$=d!Ab$;2ij)Ago>8O7K)quw30ra@AK7FMjSx1nf+5&{uMlJGSNLEN;fGi~k-v+4&B3 z95%pJ=CU6<)^6@T9JDC&?E%z1qZ4R4^wJB9nvHv_c&KkAQ z#X0y%%ovFRWB8m2e0;ZP-J8T1bu$c6+RMHpNkEt4pasg+B9*-=B4GfwzHJ(YgC_b5k~PIx!{ zh>XV|0o>9f`uEh?_yt5EEnv|1>y*9+B9dhB7dtP+pgr*u$k$YGFT;z3bJkc(6(pgt zXA*6Wbc*anQFJ$rxVV8=XrXkU9=)j($^j6N_ijAPFSF{O7M4kh@I#7VxxqYm&>nZD zfP(9lZ70bCd%NW?nzVgC^*B-389-rNW?4utV7J~gHbCiyR@k_e9N$pdp`Dz3XTwCq zQ1l3f456jjoLweoDtrV^l-P}m(YX?}t0l!Tte0xQ6h4qX?|pCxg}i|p9P-#xi5mE( zCxxLXm2Ry{o@mhibAhd?hmx8>O!>Tz&L>z=6)!PZ_A_BbL$bk{?TW!iQd9r0mj+ff zj;6-H4MsW&`2hEb^EWYt2?0iUqD#b_`OvoLuLM3DgNWRyYfy!jk}&b19X_~IGXbOb z3U+vCLyo;@lY6MCF>#V+?<4_ddsbjXT)`2IKg5@1-GHFaQ$cGPk4D-VI4t<*O{8u{ zx>Y$r_Ne$w4@M2KCSHCmb<((XuwP@#J-Ip2UpXT+&zYmrviLc39~C+TY2$6lNV67g zC{s{Ca(57Hhnyyy2D@@-iT-=lrSu~u^Kw7o=FuAZVqW2{wJMO!gfjN5_#e=WfYaoC zyIF9jc$)`bHPAb8p19X5%Lubgb%QpfR)yTIg5HSAQ*IWu3dhc*Zu|YwU4$2t!vn-G z@)a8ARc~Sz>>Ii|BqT^TW?Mr(v?F?-$wdPd7YW(%(^BT-`xRt~0 z#JM9BYB1%QOgS+TCR%l;gh*g0g~))CmGI)-6)LgQif@35a~%S4f&?tAvxxFPPl@5k zXdBp+snwPPPG32sp+x7rbmOy>C5L5jBx^%;Pylx5oGYUleW@3~*;WsB?A#>dy3G{b zqjUjcg`1aDBEe?ECXRdl6)X3QSBBuY)ahW4oq%hF{Im98%pju6w6m>uOJ{MPp>5+hDNjARCBAC0j0_;H z_;2{f13eHajxldvsN1*)*5a9fY-Q`~rOJMcu#U}(eBYV!PwCADX&3oOw^BO0lZeFU zZ^u1%O&{b|J+c9Et6(6S;r89fuN~!3$(ji|)-NslB@mGnR)aOL4{S(R_)u4 zGKo%O0(LEI_5=!bYu1>qDCKFL!2Wxm7oH!#F2{wCtL>8?v>`Y)>hR^_+R^e{IMzC6 zt-U^^s&6_BELt15lbBUu2aS{LRl|nU3MfNusYvU8P!9bL7}Ex()&u6`Myp`u2j_a( zdRTVAGiNrGDJR%vH6NbmXT?(JN6*JQ7;+StV0Yq(49K)7#ZW%7mg__>ER}Yd(Zgtm==(_%#Xv7*j0Nuu_Y->F>ToUl=0vAp#Pi>Ch zYVo@8X4~@8tr~&mM?S6GT|z)PCGk4o*3Qbyu)xy}=z@)Ty~L74emma{=p#l%ZFH_1 zS3fSd!ZNLt#`_m}G`|3oOr`&O+Ne}=4f?YmF&32jEGtdWiEoACSj&FGMWJV5x?RTO z3BO_xQe7LMkXMd7YijDOhK7A^WHniv79Oaz>e$5eSzF355P*qGJ+*i( z33IcI{&?&A3cCkEC1(z|^C=`C zKek8zWZ?s~bN?cmC@B5-%$OXj3~gIDV>ZCgXQ0q%I)T}K$nVd76Xvp`Qu=;6zx(6NMQQ@r?XWB4ZzBa^D zDEW*d5wl(6-LPiPIVnh)l@jU*C3`Rq5j#&3OBo9^lWtrYP9p2W9S$8VD2iwJX{_cw zdo%d=>5AiuyJmfiS=CgednfjSq1M{7M-{r18r*bEXcjEr{KKYm7)-~jIE@}?cpiP_ z(V+(7)5oCIvESGW8YxH<%J0nQwnn3ovA31Ghve`q+({{k#&un5sa^oKTV_Ir4|jd>C6kR4+ou%@^;dU(171iGg%0W55S&~k10mh zEhx{cpcjf`lrC-UiO90SW;%2@R&3$JF~UFh^=&RiJjgYcc*=<)Lo12me+TzYH&5U^ z2Sjmz?v8bHLA7mjX)eF@|uX~8eNX8xhBRgwyd#4wj2~O ze+}`wopspCGQ-&l_|%s*Qlzsr)D0!PK$)erA7>-6i|JVmYl`n@JB5UBR=O^_He8Hv zZQLVz>UM%ARxl?jjbi#sjW4)g+D5P0~{%W3CL;Itl>bz!BLiI5BK-3>}?-Si62!1 zyS_*}f)?N5$wj``QPBq}=7L+>ho8;s`r(T>cI@Z`z9`2xXg5dVLt>3pwWvDYYC7s$;!;;6DBo2eIlPdT0PpMRI_!=e+VQvE1 zo0gylx*;f`vY2Re?v0YLG?H!N32{L5hFQyQn{!E-8P{{a{tokcEcq*lzWfO}x+Pv$LtmsEWxBC3h z61Y$>X(h$>HYEOyH}Bp@{0r&=ntcotevIN%ai*ZqPcgS{5P#}vd<3IZvnnEzTO~f? zemnuLfOJ6UUAyNh44;&6y|l0b8Gc3JG?r9=Cu=w_(i12VlZX{@cn%eC50jKOjb3I+ zvY!--b5}Vwca}sykTBIwshi~e992y3kJ}gJ0l%#fE$4tSu8fdzy>dSxzMi7~5FslQ zYhle)pzspfTkJN@PYF>EbM)Q*U-%E&!Y0x)52WEm?gEmWXzpy}`0V8K{sCdZ+5D2E zJMNuiieV_LNT{%6L2HLVr;se&*gy8XNU^~;5DRgDLzH=*l58*mz5?WPY`$LwsId?m zcyl1qFcGe}CF-S2a+EzROcUncb3S4))vfT1gHg54RQt&qtd#*=*oX&z}hPYk|eAC zk|-~Wpt(P91X}4nvanwgQ=h_aC1N9w zn`1dvJnG_W?NIjbp=oAD|#8-JX$09k&bp%h9G}CRgcG;$BZ?NuF_&6!p9hy3H zU6})CF1KlxE)AcT*XvjYp~54UuXCC{MhzZ4>~m^D9<2$p%-@C4(ByQ?9dk$E<>Xiw z<{pa%n`?`I+8!$OWp>t?T11h5dG~bvijc=9y!X8iyy6A6%~N%1WJOz}5SeI4^@nyek&%(1}b62$KwOB+g?D17J$fB78Z~_n-Xa$@=^bt$uxh zgDA>?L!j4b%V>hZ1-Y`61|x!ibcV)t%25Ch(#}mzU9E>IS>ymsj;p_e18B>ogk=B@ z>-t^IF<>q*q0pi%YZiCNGNe-y+w1lqfc>T|;K=MT3!U`fUD(JD$DEYtT`~nNuszw^ zv)RXmKV&p?A6Cjko`Ia9KHd9kL*VP?;x4V$Q_2DdR#2~VWH)T2v~xMdwQ^K&Yck#EYA$wfdw(8rFS1mTHwfK zDHMYv>qja&RZg@8E#mA(0U0-Xg&gAK2nQ#&aMJMK8^=YIp^elxrWH(48G#eyDt+)I zGL;fj%hy>E4YiuL`0F*2A6ff6(KeKhWfB7yTkT2u1BwNv!p3X}mr#?5)?EZEHSDJ5$~C{{3G(lQCADRcx(T54jOMnW>8=^XzJK>-gBC zp+n1uCsEA7mC@PnSUuTD`BS>3Tl5MWs*#^(HmpDwpA~-7I*T4u2Yx_%s=jm&_?+X% z(&<#|OJUUNNjr=vN}^K+LBC$B_tYLm>Nri!o)L3G5h@-~prefen?V$+Il0}}hJDgv z@KPgodYzk5zb4?bG54h?mVE6(V5^jp9nYw9WZ-D8E`?cAi=0E>s5OyG=zKzoT>e7| zF8}rzVJ%Z9bRpJsWv3Jx*7!lO3ra<0^eg6WpFhh68={&J$d8qE=aWkmhnfm17 zt2aJT$dWI2y%8z({-l{$K3h1gNL$VcfjJe~r(dz8{#eKw)0WDdth;-2kh-(}hfD}3 z%RAXrV;1ptwPGM!I&nh=w5b$+3+iZpNdpISMhdk?hzvo~xqmtI3~@xn8NBT9(Ex|e zq=j?KB&WuO9^*BJlbD z171}Vv|0i6z?$mN&UHiES^U_;$IL}?-B5Zkn8CZf@uF;=7a)4bzg#^=hv;%})n_pC zD3pR>MkJW2f;h1B444q66Q)<^&7zk>r&YXd>F(ECwgU-Q{f~pcpFfyc6Vu$y@Q~$h zBKP!%mKZL2y;H2Mvk(veswCTHUn8jfSSYgwwzDy~`?ZATq_oq&Ved7yNW0}kHvV$g zI>7WHj>#XjLSA3ExPMoAi}lEJwM8@e+L?v#DdaoBcct5_OIYX80swLx^jnSzvL`mN*RnDeybor^#5T3H!ce=X`U;h|rE6xBX70XvY9fheWl^2G2Nbj;a6_ zBbqYeh-vaewf*PGn137ztVkO}aVJhuu3xZIY=z4V3Q?n|o;T(Tg&@{Xrn`!or(*Yt$muM^z04HD`eEqfj{0wzmDpitzya zvf%*y#?~MDJa^E&=S9pJj)Rxd9$D~f+c(EGE=)e1M#bca$(DNlk| zRMyEg_`XZ%{)SU4VpAfVjy{8D(Ray1f z%0Af5*f(f26_&M)-V~M#?pBndmZ4Lt<)WeJ_)*?ZqgUyf#_C*kX0* z-GPfoVik%Z^m`h5bbl6cFj;J0414wxheTu2{9!3LOzm}AP<%ii;XlUrha;s@PrWBL z(1@&+I&Iq|;ts?v-#KX7txG^6~zi^OB%1Z_e2 z%N(POpAfqq-_tS@ft{Ye4&&VD{|k&>TL|c()98Q8zXAvFu3ZSG?vB9LL2O1j77T=O z&Wdl@#uKcHvEn9$BJsdCAPI_*;{;R@fp93rf{?p)t-<_XtVxu*O)Ecl)%h~q&XKyDO>rN>K9p_oTzK(S zn?@&aKeYpBCbM!Ue-aXwy$mwKXy=EQky#Fzx}=rah6w6Dzn`>zVezy3?29Cg+Y!&R zDT4^$P{S^&$iM1rCPKuu$MGvPkqIq$%qIERNHPA%yeHGeNP3W?G7{zl>-Di1MCJdE z>Y7@~;FmTtNND>j_W7i&pa#HQjtwPlTad=xRoF@U9Xd@#xw-^1^S+hR|7Nw$a{1&Ptd%2nX<5 zvS69X#OxvKk=Vy{I!%bF71VlF8>e;a5%$zH#(7WMUPYExSV}K$CilKpC3E;TCEvoq ziNsdfi=V}|-#yTC>>jRL$RA{Q^&KM3y@n{C9g;@~ zq%3L+schYVHdN}ADxdv&@Hm|>YH>MGC{*}3Ug~&NnXKIklcTova3BCNuCLtUSt)Q) z=KdO~=O-w1IRLyh*zRj5lYv6it*?UsXIfUtBo{_H-)J0cc_fry$V+m4WVlxj$hiHk=H>>4z8E~N`tZ%&qA|Jr>zuggD8G!N(A zA!p1I)Y;%H)5PRy)g13&ZghoI()%Rt>myJ{@Zy%he($k<1)lxr#`L5Ig-<>2b>6 zD{Z#sU0_?|`ukV&+Ak~wz{q{vsTKv$nXXh?eX(ljEfP>lnNprLZ#Z`{aj|ojCgW2* za?qP=xuWo15fwMq(CVps2cR!lVsSXbF6cjuUUF<_TvcxOEXUR$dvcFkc+=HA)tyme z;raf3x0c{^qev@>u*TM*Oh2`C4daepHC)?#R)2x6eDmrQaD{t@IjGpPk-GrwsYvRY z$D;fb$Khq~gR_IUq&~Nzxgm6cSP^PX{kgGOI#2aew1oaXczn_JxR76~b3lHnIe4^O zDIAx5U)Nob>6JTfb)f)GS>Y`2D_h;mtLtEVI*tX+&c(j7M{J6lw|5 z?nqws+4V9+ra-vvC6sL3okU6H;JGop@TE+_Nju~M^ga}eB;+Jmwa!5M0g%--_CWq3 z6#qIuZl9nu;NDTv%vDCn(P5JIQkUe+NA3m7k~1E#8G-h-prC^V6Y<)18u+UGvhnqQ z#{psCU!I(dzl&_l;{NCm0A-@){;Q{v^bVqYvaufWP+hC6FBg=A4>Q=gB)2u*kw9;g z8!H;}s80g~uxA(W?a#^%rs)6v%uC^~v}^R|!PBxV+#e4_+vZj&q&9YBbL!&n>)8TR{O0#DP=~bzM zYnl#5(emFr=_>(ba7N4i4rZ=|U_{P5vM>0dTJ)OIS1PTTDyig~G*nHZWG<6%9Yv~B zIjW`Op@0GvEA6OlIt65MB_A38Lwxol_=Jng)H;Nn z$LR;lDuN)dR#quuc$`M>%WYCpyq9?l@&6{_}CDz-8;?AlcWNnN_Mh>)gk zuqxfSH@YC~W+K<MA_5E~KW^g2{fHmk~g%?s*(a@&rou2lGH4-m1 zLWOcFfUL1Elo;SMpqNJYUGSx@lfFrNa|7ocPrX;0& zJ&JGf;AP%0t66|yIw&}iYwhlDzhaoX|AUlsVYGNXGCTSInwfHc(^J83;fv~R7}X9l ze3VS^x>+ZYe9y=!;^y-YITGo&3M;NX{u66t+i)@`jAzji_w@^-y>&D@G=I66>8$i@ zx8`{6apCCo-jG>qycG^c^FKJsD);7G!2aK#r{}zXypCl{&UU8&eHFnCpXN=eS-Vqy zMMp@RtHCzq)UE|>qVp2My?cah%F;!4)pu@DxMjeesrE>1j_|?LhYho`@_dW~3cb6N zYuruBBh8)L@)HuWuUWYAa~}J6IIDG*2g}XG4wcQj&4hNR|9rfww`Vs;ncyqSe`Z-0 zSBiI8emJwiu;5?|gWwZ$H6a7Tw)m#y&Au6`9WrT$RIT66_DD)!)NLXBapk-1zA^kJ zAL|dX8Xpv1-JEat`LtV7{vpXiTcdvr%Fp*2&i1!kVlF3HQ+xkS?~e4OKk>dlQXc<& zld>rOskU(aJ6@YD=I`D$rz`cEJ9_xWNqG&sLWXJeb_*x?LF&% z=aXA=FJ0@Gyu~+{kCnYi^!Pics%@gPO;m2~`dfW@SE*n7^pln64qN6=;xS+J>DmI{ z$kQUNjE-_1apFs3mb|c)|IPeF@^s3b*D6Mzjd!Xy1|2760!J=N)h%kfG1=?Ri^Ifb{4^}UY zdbvtiM8=twX^E)?k5f&8ZbqV?S;qy+eDS^Qx2gRVUncYiicQq`bn<|Dcx8q2;~7Fm-XGTgYYuqh z_TzrVOJViB=N8YfdO5LB|HQ7&{(ARste|C^oR6Cl$6kyoiQ4rW0{>nb$ z&gL6_vs|>Nt+=(~)WY1bD0RzVn{9!H3JR-p_U~)HTY7Wb@?T%>o%#G>hUAUAw^wvC z|5&i*=7g-!NlZOk)*Ah7voW2om**+C$YAY-YX{n76en2!`zL$5^7R3C)`bUz)N)P; zERGJAdcv@nL)%CCOv$x=C8e*nTVv~&tK5nHY1P!ZMelSrSH7SR_uJNJu1Px|{Sx@U zJtI5yllZ*Ziw{@LF*UH#Rr;|0rT^I%LJ7USPUcxGb)om~B&9vfQLp0IlUBm^=IAf6 z%HCCyo8BtynIQQ4`0CR_QzIK{OZ>Dom9|Z*54?0cVRwX$UtM=d!^N0GANZ;#tdBdY zT(2*AR`d579;+1wHp*X~xxQ}&ZiMt<6F>GXDC5SXua)X03~u%8H<&w2Zp{ri`9N_U zzry0Lt^xK1J4`kAbuz5Xlr9p8;}kxrGy7!AR_=?R-CTROirXEGnU-97bhT&0gBXj6 zCz&4=mtW?5xbg7rqxCb^7Hyu~elsggy}ZooasR5&Xltv)4F^jcZ#;Pa@TBQCySK;J z%gtloymS8wi#Ky8WLn9;nq9-ZN#u62NR-S=qbaHfsmaDUc8nU6i*g(oEhcZy(UwLGg)=blBNPHz z6_bDFC`rTHPGSrUA}I2@lg)C~WzcIngpxyXlPhyoq~XO7usQ^-a7F-^$vbjYWZ+o| exSkZWmJ|U_B~Sj5Yr}LWZL(RO0o$VtkPHAlZ1vUv From a63231593bd86880c9d0edc9247485a850e9937f Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Fri, 3 May 2024 13:33:53 -0400 Subject: [PATCH 117/147] added commentsversion in notification manager --- .../notification_api/dao/models/FOIRequestComments.py | 7 ++++--- .../notification_api/services/commentservice.py | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/notification-manager/notification_api/dao/models/FOIRequestComments.py b/notification-manager/notification_api/dao/models/FOIRequestComments.py index 6565a80c7..bf06b1286 100644 --- a/notification-manager/notification_api/dao/models/FOIRequestComments.py +++ b/notification-manager/notification_api/dao/models/FOIRequestComments.py @@ -20,6 +20,7 @@ class Meta: # pylint: disable=too-few-public-methods createdby = fields.Str(data_key="createdby") created_at = fields.Str(data_key="created_at") commenttypeid = fields.Int(data_key="commenttypeid") + commentsversion = fields.Int(data_key="commentsversion") @classmethod @@ -35,10 +36,10 @@ def savecomment(cls, commenttypeid, foirequestcomment, userid): cursor = conn.cursor() cursor.execute('INSERT INTO public."FOIRequestComments" (parentcommentid, ministryrequestid, "version", commenttypeid, \ - comment, taggedusers, isactive, createdby, created_at) \ - VALUES(%s::integer,%s::integer, %s::integer, %s::integer,%s,%s,%s::boolean,%s,%s) RETURNING commentid', + comment, taggedusers, isactive, createdby, created_at, commentsversion) \ + VALUES(%s::integer,%s::integer, %s::integer, %s::integer,%s,%s,%s::boolean,%s,%s,%s::integer) RETURNING commentid', (parentcommentid, int(data["ministryrequestid"]), int(data["version"]), commenttypeid, - str(data["comment"]), taggedusers, True, userid, datetime.now())) + str(data["comment"]), taggedusers, True, userid, datetime.now(), data["commentsversion"])) conn.commit() id_of_new_row = cursor.fetchone()[0] cursor.close() diff --git a/notification-manager/notification_api/services/commentservice.py b/notification-manager/notification_api/services/commentservice.py index 9d114f3e3..5155ff1b8 100644 --- a/notification-manager/notification_api/services/commentservice.py +++ b/notification-manager/notification_api/services/commentservice.py @@ -29,6 +29,7 @@ def __preparecomment(self, foirequest, comment): _comment.version = foirequest["version"] _comment.taggedusers = None _comment.parentcommentid = None + _comment.commentsversion = 1 return _comment From ef8173666da34b6256853741acb16eb1a26810d7 Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Mon, 6 May 2024 14:06:37 -0400 Subject: [PATCH 118/147] bug fixed related to ministry request advancedsearch --- .../request_api/models/FOIMinistryRequests.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index c5bb5f26b..b0d99ba9f 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -1060,17 +1060,17 @@ def getbasequery(cls, iaoassignee, ministryassignee, userid=None, requestby='IAO axispagecount = case ([ (FOIMinistryRequest.axispagecount.isnot(None), FOIMinistryRequest.axispagecount) ], - else_= literal("0").label("axispagecount") + else_= literal("0") ) axislanpagecount = case ([ (FOIMinistryRequest.axislanpagecount.isnot(None), FOIMinistryRequest.axislanpagecount) ], - else_= literal("0").label("axislanpagecount") + else_= literal("0") ) recordspagecount = case ([ (FOIMinistryRequest.recordspagecount.isnot(None), FOIMinistryRequest.recordspagecount) ], - else_= literal("0").label("recordspagecount") + else_= literal("0") ) requestpagecount = case([ (and_(FOIMinistryRequest.axispagecount.isnot(None), FOIMinistryRequest.recordspagecount.isnot(None), cast(axispagecount, Integer) > cast(recordspagecount, Integer)), @@ -1113,9 +1113,9 @@ def getbasequery(cls, iaoassignee, ministryassignee, userid=None, requestby='IAO cast(FOIMinistryRequest.filenumber, String).label('idNumber'), cast(FOIMinistryRequest.axisrequestid, String).label('axisRequestId'), cast(requestpagecount, Integer).label('requestpagecount'), - axispagecount, - axislanpagecount, - recordspagecount, + cast(axispagecount, Integer).label('axispagecount'), + cast(axislanpagecount, Integer).label('axislanpagecount'), + cast(recordspagecount, Integer).label('recordspagecount'), FOIMinistryRequest.foiministryrequestid.label('ministryrequestid'), FOIMinistryRequest.assignedministrygroup.label('assignedministrygroup'), FOIMinistryRequest.assignedministryperson.label('assignedministryperson'), From c7da91cd351ea3b134d0f6a853b8e261dd0a0256 Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Mon, 6 May 2024 14:16:44 -0400 Subject: [PATCH 119/147] bug fixed related to ministry request advancedsearch --- .../request_api/models/FOIMinistryRequests.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index b0d99ba9f..6a53fa68b 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -1113,9 +1113,9 @@ def getbasequery(cls, iaoassignee, ministryassignee, userid=None, requestby='IAO cast(FOIMinistryRequest.filenumber, String).label('idNumber'), cast(FOIMinistryRequest.axisrequestid, String).label('axisRequestId'), cast(requestpagecount, Integer).label('requestpagecount'), - cast(axispagecount, Integer).label('axispagecount'), - cast(axislanpagecount, Integer).label('axislanpagecount'), - cast(recordspagecount, Integer).label('recordspagecount'), + axispagecount.label('axispagecount'), + axislanpagecount.label('axislanpagecount'), + recordspagecount.label('recordspagecount'), FOIMinistryRequest.foiministryrequestid.label('ministryrequestid'), FOIMinistryRequest.assignedministrygroup.label('assignedministrygroup'), FOIMinistryRequest.assignedministryperson.label('assignedministryperson'), From a29c20eb44f30e96a15fd911d078b96e52e38844 Mon Sep 17 00:00:00 2001 From: JieunSon96 Date: Tue, 7 May 2024 08:17:03 -0700 Subject: [PATCH 120/147] add spell check on draft.js & react-quill --- .../Comments/AddCommentField.js | 1 + .../customComponents/Comments/InputField.js | 1 + .../ContactApplicant/index.tsx | 20 ++++++++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/forms-flow-web/src/components/FOI/customComponents/Comments/AddCommentField.js b/forms-flow-web/src/components/FOI/customComponents/Comments/AddCommentField.js index 666836667..206a1c46d 100644 --- a/forms-flow-web/src/components/FOI/customComponents/Comments/AddCommentField.js +++ b/forms-flow-web/src/components/FOI/customComponents/Comments/AddCommentField.js @@ -217,6 +217,7 @@ const AddCommentField = ({ cancellor, parentId, add, fullnameList , restrictedRe handlePastedText={_handlePastedText} handleKeyCommand={_handleKeyCommand} plugins={plugins} + spellCheck={true} /> { + // If the ref is not null, set up the Quill instance + if (ref) { + const quill = ref.getEditor(); + + // Enable spellcheck for the Quill editor + quill.root.setAttribute('spellcheck', true); + + // Store the Quill ref in the current variable + quillRef.current = ref; + } + }, []); + const handleTemplateChange = (e: React.ChangeEvent) => { setCurrentTemplate(+e.target.value) const templateVariables = getTemplateVariables(requestDetails, templates[+e.target.value]); @@ -384,6 +401,7 @@ export const ContactApplicant = ({ value={editorValue} onChange={setEditorValue} modules={quillModules} + ref={handleRef} /> {files.map((file: any, index: number) => (
From b9b99c9664d67a72da67843ace16d1a619d1fc73 Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Tue, 7 May 2024 13:21:34 -0400 Subject: [PATCH 121/147] queue pagecount issue updated --- .../request_api/models/FOIMinistryRequests.py | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index 6a53fa68b..bc3eb90dc 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -444,26 +444,26 @@ def getrequestssubquery(cls, groups, filterfields, keyword, additionalfilter, us axispagecount = case ([ (FOIMinistryRequest.axispagecount.isnot(None), FOIMinistryRequest.axispagecount) ], - else_= literal("0").label("axispagecount") + else_= literal("0") ) axislanpagecount = case ([ (FOIMinistryRequest.axislanpagecount.isnot(None), FOIMinistryRequest.axislanpagecount) ], - else_= literal("0").label("axislanpagecount") + else_= literal("0") ) recordspagecount = case ([ (FOIMinistryRequest.recordspagecount.isnot(None), FOIMinistryRequest.recordspagecount) ], - else_= literal("0").label("recordspagecount") + else_= literal("0") ) requestpagecount = case([ - (and_(FOIMinistryRequest.axispagecount.isnot(None), FOIMinistryRequest.recordspagecount.isnot(None), cast(axispagecount, Integer) > cast(recordspagecount, Integer)), - FOIMinistryRequest.axispagecount), - (and_(FOIMinistryRequest.recordspagecount.isnot(None)), - FOIMinistryRequest.recordspagecount), - (and_(FOIMinistryRequest.axispagecount.isnot(None)), - FOIMinistryRequest.axispagecount), + (and_(axispagecount.isnot(None), recordspagecount.isnot(None), cast(axispagecount, Integer) > cast(recordspagecount, Integer)), + axispagecount), + (and_(recordspagecount.isnot(None)), + recordspagecount), + (and_(axispagecount.isnot(None)), + axispagecount), ], else_= literal("0")) @@ -499,9 +499,9 @@ def getrequestssubquery(cls, groups, filterfields, keyword, additionalfilter, us cast(FOIMinistryRequest.filenumber, String).label('idNumber'), cast(FOIMinistryRequest.axisrequestid, String).label('axisRequestId'), cast(requestpagecount, Integer).label('requestpagecount'), - axispagecount, - axislanpagecount, - recordspagecount, + axispagecount.label("axispagecount"), + axislanpagecount.label("axislanpagecount"), + recordspagecount.label("recordspagecount"), FOIMinistryRequest.foiministryrequestid.label('ministryrequestid'), FOIMinistryRequest.assignedministrygroup.label('assignedministrygroup'), FOIMinistryRequest.assignedministryperson.label('assignedministryperson'), @@ -712,12 +712,12 @@ def findfield(cls, x, iaoassignee, ministryassignee): else_= literal("0").label("recordspagecount") ) requestpagecount = case([ - (and_(FOIMinistryRequest.axispagecount.isnot(None), FOIMinistryRequest.recordspagecount.isnot(None), cast(axispagecount, Integer) > cast(recordspagecount, Integer)), - FOIMinistryRequest.axispagecount), - (and_(FOIMinistryRequest.recordspagecount.isnot(None)), - FOIMinistryRequest.recordspagecount), - (and_(FOIMinistryRequest.axispagecount.isnot(None)), - FOIMinistryRequest.axispagecount), + (and_(axispagecount.isnot(None), recordspagecount.isnot(None), cast(axispagecount, Integer) > cast(recordspagecount, Integer)), + axispagecount), + (and_(recordspagecount.isnot(None)), + recordspagecount), + (and_(axispagecount.isnot(None)), + axispagecount), ], else_= literal("0")).label('requestpagecount') @@ -1073,12 +1073,12 @@ def getbasequery(cls, iaoassignee, ministryassignee, userid=None, requestby='IAO else_= literal("0") ) requestpagecount = case([ - (and_(FOIMinistryRequest.axispagecount.isnot(None), FOIMinistryRequest.recordspagecount.isnot(None), cast(axispagecount, Integer) > cast(recordspagecount, Integer)), - FOIMinistryRequest.axispagecount), - (and_(FOIMinistryRequest.recordspagecount.isnot(None)), - FOIMinistryRequest.recordspagecount), - (and_(FOIMinistryRequest.axispagecount.isnot(None)), - FOIMinistryRequest.axispagecount), + (and_(axispagecount.isnot(None), recordspagecount.isnot(None), cast(axispagecount, Integer) > cast(recordspagecount, Integer)), + axispagecount), + (and_(recordspagecount.isnot(None)), + recordspagecount), + (and_(axispagecount.isnot(None)), + axispagecount), ], else_= literal("0")) From 538577b220db0112877a10cbfdf2393e7b3842af Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Tue, 7 May 2024 15:30:50 -0400 Subject: [PATCH 122/147] pagecount changes --- .../request_api/models/FOIMinistryRequests.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index bc3eb90dc..dc5c6dbd7 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -444,17 +444,17 @@ def getrequestssubquery(cls, groups, filterfields, keyword, additionalfilter, us axispagecount = case ([ (FOIMinistryRequest.axispagecount.isnot(None), FOIMinistryRequest.axispagecount) ], - else_= literal("0") + else_= literal("0").label("axispagecount") ) axislanpagecount = case ([ (FOIMinistryRequest.axislanpagecount.isnot(None), FOIMinistryRequest.axislanpagecount) ], - else_= literal("0") + else_= literal("0").label("axislanpagecount") ) recordspagecount = case ([ (FOIMinistryRequest.recordspagecount.isnot(None), FOIMinistryRequest.recordspagecount) ], - else_= literal("0") + else_= literal("0").label("recordspagecount") ) requestpagecount = case([ @@ -706,6 +706,11 @@ def findfield(cls, x, iaoassignee, ministryassignee): ], else_= literal("0").label("axispagecount") ) + axislanpagecount = case ([ + (FOIMinistryRequest.axislanpagecount.isnot(None), FOIMinistryRequest.axislanpagecount) + ], + else_= literal("0").label("axislanpagecount") + ) recordspagecount = case ([ (FOIMinistryRequest.recordspagecount.isnot(None), FOIMinistryRequest.recordspagecount) ], @@ -748,6 +753,7 @@ def findfield(cls, x, iaoassignee, ministryassignee): 'ministry': func.upper(ProgramArea.bcgovcode), 'requestpagecount': requestpagecount, 'axispagecount': axispagecount, + 'axislanpagecount': axislanpagecount, 'recordspagecount': recordspagecount, 'closedate': FOIMinistryRequest.closedate, 'subjectcode': SubjectCode.name, @@ -1060,17 +1066,17 @@ def getbasequery(cls, iaoassignee, ministryassignee, userid=None, requestby='IAO axispagecount = case ([ (FOIMinistryRequest.axispagecount.isnot(None), FOIMinistryRequest.axispagecount) ], - else_= literal("0") + else_= literal("0").label("axispagecount") ) axislanpagecount = case ([ (FOIMinistryRequest.axislanpagecount.isnot(None), FOIMinistryRequest.axislanpagecount) ], - else_= literal("0") + else_= literal("0").label("axislanpagecount") ) recordspagecount = case ([ (FOIMinistryRequest.recordspagecount.isnot(None), FOIMinistryRequest.recordspagecount) ], - else_= literal("0") + else_= literal("0").label("recordspagecount") ) requestpagecount = case([ (and_(axispagecount.isnot(None), recordspagecount.isnot(None), cast(axispagecount, Integer) > cast(recordspagecount, Integer)), From 2bb4d14c08314c3e7c8fc5b9b963d3a04a4ef3b3 Mon Sep 17 00:00:00 2001 From: JieunSon96 Date: Tue, 7 May 2024 15:54:25 -0700 Subject: [PATCH 123/147] remove react-loading-overlay dependency --- forms-flow-web/package-lock.json | 3799 ++++++++++++++++-------------- forms-flow-web/package.json | 1 - 2 files changed, 2033 insertions(+), 1767 deletions(-) diff --git a/forms-flow-web/package-lock.json b/forms-flow-web/package-lock.json index 6de439ff9..e6851873e 100644 --- a/forms-flow-web/package-lock.json +++ b/forms-flow-web/package-lock.json @@ -22,6 +22,7 @@ "@testing-library/user-event": "^12.1.10", "@material-ui/icons": "^4.11.2", "redux-logger": "^3.0.6", + "react-modal-resizable-draggable": "^0.1.6", "@mui/x-data-grid": "^5.2.2", "@material-ui/pickers": "^3.3.10", "bootstrap": "^4.6.0", @@ -41,6 +42,7 @@ "date-fns": "^2.23.0", "@mui/material": "^5.3.1", "@mui/icons-material": "^5.4.1", + "react-js-pagination": "^3.0.3", "@emotion/styled": "^11.6.0", "@testing-library/react": "^12.0.0", "typescript": "^4.7.2", @@ -120,14 +122,15 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -323,11 +326,11 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -386,12 +389,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -417,11 +420,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.3.tgz", - "integrity": "sha512-mT3LiSt9tZWCdx1pl7q4Q5tNo6gdZbvJel286ZHGuj6LQQXjWNAh8qiF9d+LogvNUI+D7eLkTnj605d1zoazfg==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", "dependencies": { - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "@types/prop-types": "^15.7.11", "prop-types": "^15.8.1", "react-is": "^18.2.0" @@ -443,17 +446,17 @@ } } }, - "node_modules/react-datepicker/node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -558,10 +561,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@emotion/css/node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/terser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", - "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -606,14 +614,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -689,9 +689,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "funding": [ { "type": "opencollective", @@ -707,9 +707,9 @@ } ], "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -724,12 +724,27 @@ "postcss": "^8.1.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", + "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -819,9 +834,9 @@ } }, "node_modules/@restart/hooks": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.15.tgz", - "integrity": "sha512-cZFXYTxbpzYcieq/mBwSyXgqnGMHoBVh3J7MU0CCoIB4NRZxV9/TuwTBAaLMqpNhC3zTPMCgkQ5Ey07L02Xmcw==", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", "dependencies": { "dequal": "^2.0.3" }, @@ -894,16 +909,16 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dependencies": { "colorette": "^2.0.10", "http-proxy-middleware": "^2.0.3", "p-retry": "^4.5.0", "@types/express": "^4.17.13", "compression": "^1.7.4", - "webpack-dev-middleware": "^5.3.1", + "webpack-dev-middleware": "^5.3.4", "launch-editor": "^2.6.0", "html-entities": "^2.3.2", "ansi-html-community": "^0.0.8", @@ -973,11 +988,6 @@ "date-fns": "^2.0.0" } }, - "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -1022,6 +1032,11 @@ "node": ">=4" } }, + "node_modules/@testing-library/react/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/jsonpath": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", @@ -1059,12 +1074,15 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1090,9 +1108,9 @@ "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -1203,12 +1221,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1265,9 +1283,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -1284,14 +1302,6 @@ "node": ">=0.10.0" } }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -1374,9 +1384,9 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -1400,9 +1410,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", - "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz", + "integrity": "sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -1413,7 +1423,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { @@ -1461,28 +1471,16 @@ } }, "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", "dependencies": { - "is-date-object": "^1.0.5", - "regexp.prototype.flags": "^1.5.1", - "object-keys": "^1.1.1", "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "which-collection": "^1.0.1", - "get-intrinsic": "^1.2.2", - "object-is": "^1.1.5", - "is-shared-array-buffer": "^1.0.2", - "object.assign": "^4.1.4", - "which-boxed-primitive": "^1.0.2", + "is-date-object": "^1.0.5", "is-regex": "^1.1.4", - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "side-channel": "^1.0.4", - "isarray": "^2.0.5", - "es-get-iterator": "^1.1.3", - "which-typed-array": "^1.1.13" + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" }, "engines": { "node": ">= 0.4" @@ -1613,17 +1611,6 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^2.1.1" - } - }, "node_modules/coa/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1660,11 +1647,11 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1674,14 +1661,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/css-prefers-color-scheme": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", @@ -2023,9 +2002,9 @@ } }, "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/async": { "version": "3.2.5", @@ -2033,22 +2012,25 @@ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "engines": { "node": ">= 0.4" }, @@ -2064,14 +2046,6 @@ "node": ">= 0.6" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/jspdf": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", @@ -2173,9 +2147,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001576", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", - "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", + "version": "1.0.30001616", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz", + "integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==", "funding": [ { "type": "opencollective", @@ -2192,9 +2166,9 @@ ] }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dependencies": { "ignore": "^5.2.0", "eslint-scope": "^7.2.2", @@ -2221,7 +2195,7 @@ "chalk": "^4.0.0", "debug": "^4.3.2", "ajv": "^6.12.4", - "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/config-array": "^0.11.14", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "esutils": "^2.0.2", @@ -2233,7 +2207,7 @@ "find-up": "^5.0.0", "optionator": "^0.9.3", "escape-string-regexp": "^4.0.0", - "@eslint/js": "8.56.0" + "@eslint/js": "8.57.0" }, "bin": { "eslint": "bin/eslint.js" @@ -2251,24 +2225,25 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -2277,25 +2252,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" - }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -2380,11 +2351,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2409,6 +2380,14 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, "node_modules/@csstools/postcss-oklab-function": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", @@ -2429,9 +2408,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } @@ -2540,9 +2519,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", - "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "dependencies": { "@emotion/hash": "^0.9.1", "@emotion/memoize": "^0.8.1", @@ -2590,6 +2569,20 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -2640,9 +2633,9 @@ } }, "node_modules/socket.io-client": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.3.tgz", - "integrity": "sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -2665,20 +2658,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -2687,19 +2666,6 @@ "node": "*" } }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2733,9 +2699,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dependencies": { "debug": "^3.2.7" }, @@ -2943,9 +2909,9 @@ } }, "node_modules/@emotion/react": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", - "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -3013,9 +2979,9 @@ } }, "node_modules/@fortawesome/free-solid-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", - "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", "hasInstallScript": true, "engines": { "node": ">=6" @@ -3154,13 +3120,13 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -3185,9 +3151,9 @@ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==" + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" }, "node_modules/postcss-initial": { "version": "4.0.1", @@ -3234,13 +3200,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -3356,9 +3323,9 @@ } }, "node_modules/cssdb": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.10.0.tgz", - "integrity": "sha512-yGZ5tmA57gWh/uvdQBHs45wwFY0IBh3ypABk5sEubPBPSzXzkNgsWReqx7gdx6uhC+QoFBe+V8JwBB9/hQ6cIA==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", "funding": [ { "type": "opencollective", @@ -3411,14 +3378,14 @@ "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" }, "node_modules/jest-diff/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/jest-watch-typeahead/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", @@ -3434,9 +3401,9 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", @@ -3597,13 +3564,13 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3677,9 +3644,9 @@ } }, "node_modules/dompurify": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", - "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.2.tgz", + "integrity": "sha512-5vSyvxRAb45EoWwAktUT3AYqAwXK4FL7si22Cgj46U6ICsj/YJczCN+Bk7WNABIQmpWRymGfslMhrRUZkQNnqA==", "optional": true }, "node_modules/@emotion/core/node_modules/@emotion/sheet": { @@ -3788,15 +3755,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", + "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-syntax-jsx": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -3837,6 +3804,21 @@ "node": ">=12.0.0" } }, + "node_modules/react-modal-resizable-draggable": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/react-modal-resizable-draggable/-/react-modal-resizable-draggable-0.1.6.tgz", + "integrity": "sha512-xNpmEE47WtlCQpFOiqcyZ/3e/PzPO7iIMoKHugNLWm53U1y4OCRwlOqSX7IzdjceE8bEnLmf5vJDt/pNJf/+HA==", + "dependencies": { + "react": "^17.0.0", + "react-dom": "^17.0.1", + "react-icons": "^4.2.0", + "react-motion": "^0.5.2", + "react-transition-group": "^4.4.1" + }, + "peerDependencies": { + "react": "^17.0.1" + } + }, "node_modules/postcss-image-set-function": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", @@ -3896,9 +3878,12 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -4029,6 +4014,22 @@ "entities": "^2.0.0" } }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jest-diff/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -4041,11 +4042,11 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", - "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4080,22 +4081,22 @@ } }, "node_modules/@mui/styles": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.15.3.tgz", - "integrity": "sha512-yePvO+0z35a1Cm7sXy3rL6F1oEJSiDFcQ/4Mkn/MHttwfBbbi7higBbUsBkuLPGoy40EiIUF+Tr+UoNW296/bA==", + "version": "5.15.16", + "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.15.16.tgz", + "integrity": "sha512-WDv0M69fdfG8yJ5bmR8K81u+a7N/akSyVswKUavz//09EGS2cjPtInJspskMQNpZl2ReC5x/YEmkL+i5/PnmtA==", "dependencies": { "jss-plugin-props-sort": "^10.10.0", - "@mui/types": "^7.2.12", - "@mui/private-theming": "^5.15.3", + "@mui/types": "^7.2.14", + "@mui/private-theming": "^5.15.14", "jss-plugin-default-unit": "^10.10.0", - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "jss-plugin-nested": "^10.10.0", "jss-plugin-rule-value-function": "^10.10.0", "jss-plugin-camel-case": "^10.10.0", - "clsx": "^2.0.0", + "clsx": "^2.1.0", "@emotion/hash": "^0.9.1", - "@mui/utils": "^5.15.3", - "csstype": "^3.1.2", + "@mui/utils": "^5.15.14", + "csstype": "^3.1.3", "jss-plugin-vendor-prefixer": "^10.10.0", "jss": "^10.10.0", "jss-plugin-global": "^10.10.0", @@ -4177,12 +4178,15 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4241,9 +4245,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.22.5", @@ -4396,9 +4400,9 @@ } }, "node_modules/react-dropdown-select": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/react-dropdown-select/-/react-dropdown-select-4.11.0.tgz", - "integrity": "sha512-L4sMYLI5SGNWG88jib50nBo17qBsu28eyawUwW5xHSoKc0k8JsUk1Cim8NOU7UxvLpUAi8EMSGJt7hfvtQ6sTQ==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/react-dropdown-select/-/react-dropdown-select-4.11.2.tgz", + "integrity": "sha512-UeodiYuUWRD+LjU0IMZivJUKU6/QjjRA7Bwo3Zjebiex/t6AGMpcLzHnb4doNdOf6O4kWGqnpsL5xNgtlEicyw==", "dependencies": { "@emotion/react": "11.11.0", "@emotion/styled": "11.11.0" @@ -4439,9 +4443,9 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -4453,13 +4457,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -4552,15 +4556,16 @@ "integrity": "sha512-io974va+Qyu+UfuVX3UIAgJlxLhAMx9Y8VMfh+IG00Js7hXQo1qNQuwSiSa0xxco0SVgx5HWNkaiCcV+aZ8WPw==" }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4583,12 +4588,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -4617,22 +4622,22 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "engines": { "node": ">=6.9.0" } @@ -4672,11 +4677,11 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -4724,12 +4729,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -4760,18 +4765,15 @@ } }, "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/hpack.js/node_modules/string_decoder": { @@ -4890,15 +4892,15 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", - "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dependencies": { "is-glob": "^4.0.3", "resolve": "^1.22.2", "arg": "^5.0.2", "@alloc/quick-lru": "^5.2.0", - "jiti": "^1.19.1", + "jiti": "^1.21.0", "lilconfig": "^2.1.0", "normalize-path": "^3.0.0", "postcss": "^8.4.23", @@ -4942,9 +4944,9 @@ } }, "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4998,21 +5000,10 @@ "postcss": "^8.4" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", "funding": [ { "type": "opencollective", @@ -5028,7 +5019,7 @@ } ], "dependencies": { - "escalade": "^3.1.1", + "escalade": "^3.1.2", "picocolors": "^1.0.0" }, "bin": { @@ -5060,13 +5051,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -5101,9 +5092,9 @@ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -5111,13 +5102,41 @@ "postcss": "^8.1.0" } }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", - "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.4", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -5133,13 +5152,13 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.3.tgz", - "integrity": "sha512-+d5XZCTeemOO/vBfWGEeHgTm8fjU1Psdgm+xAw+uegycO2EnoA/EfGSaG5UwZ6g3b66y48Mkxi35AggShMr88w==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", "dependencies": { - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -5177,13 +5196,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5202,6 +5225,19 @@ "@types/yargs-parser": "*" } }, + "node_modules/react-js-pagination/node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cssstyle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", @@ -5214,12 +5250,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -5229,14 +5265,14 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.625", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.625.tgz", - "integrity": "sha512-DENMhh3MFgaPDoXWrVIqSPInQoLImywfCwrSmVl3cf9QHzoZSiutHwGaB/Ql3VkqcQV30rzgdM+BjKqBAJxo5Q==" + "version": "1.4.757", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz", + "integrity": "sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw==" }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -5250,20 +5286,20 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/@mui/system/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -5353,15 +5389,13 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.13.tgz", + "integrity": "sha512-odZVYXly+JwzYri9rKqqUAk0cY6zLpv4dxoKinhoJNShV36Gpxf+CyDIILJ4tYsJ1ZxIWs233Y39iVnynvDA/g==", "dependencies": { "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", "schema-utils": "^3.0.0", @@ -5376,7 +5410,7 @@ "sockjs-client": "^1.4.0", "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", + "webpack-dev-server": "3.x || 4.x || 5.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, @@ -5479,11 +5513,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -5493,20 +5527,20 @@ } }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -5614,12 +5648,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -5640,19 +5674,19 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/@mui/material": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.3.tgz", - "integrity": "sha512-DODBBMouyq1B5f3YkEWL9vO8pGCxuEGqtfpltF6peMJzz/78tJFyLQsDas9MNLC/8AdFu2BQdkK7wox5UBPTAA==", - "dependencies": { - "@babel/runtime": "^7.23.6", - "@mui/base": "5.0.0-beta.30", - "@mui/core-downloads-tracker": "^5.15.3", - "@mui/system": "^5.15.3", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", + "version": "5.15.16", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.16.tgz", + "integrity": "sha512-ery2hFReewko9gpDBqOr2VmXwQG9ifXofPhGzIx09/b9JqCQC/06kZXZDGGrOTpIddK9HlIf4yrS+G70jPAzUQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40", + "@mui/core-downloads-tracker": "^5.15.16", + "@mui/system": "^5.15.15", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", "@types/react-transition-group": "^4.4.10", - "clsx": "^2.0.0", - "csstype": "^3.1.2", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^18.2.0", "react-transition-group": "^4.4.5" @@ -5743,11 +5777,11 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -5772,13 +5806,15 @@ "dev": true }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5795,6 +5831,17 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", + "dependencies": { + "inherits": "~2.0.0" + }, + "engines": { + "node": "0.4 || >=0.5.8" + } + }, "node_modules/stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -5809,9 +5856,9 @@ } }, "node_modules/@mui/styles/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } @@ -5899,6 +5946,20 @@ } } }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, "node_modules/randexp": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", @@ -5955,14 +6016,6 @@ "node": ">=6.0.0" } }, - "node_modules/svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -5975,47 +6028,40 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@fortawesome/free-regular-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", - "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dependencies": { - "has-symbols": "^1.0.3" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -6045,9 +6091,12 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6072,9 +6121,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.12", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.12.tgz", - "integrity": "sha512-3kaHiNm9khCAo0pVe0RenketDSFoZGAlVZ4zDjB/QNZV0XiCj+sh1zkX0VVhQPgYJDlBEzAag+MHJ1tU3vf0Zw==", + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" }, @@ -6110,6 +6159,19 @@ "postcss": "^8.2" } }, + "node_modules/react-motion": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", + "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", + "dependencies": { + "performance-now": "^0.2.0", + "prop-types": "^15.5.8", + "raf": "^3.1.0" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0" + } + }, "node_modules/pkg-up/node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -6122,15 +6184,16 @@ } }, "node_modules/array.prototype.filter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", - "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.4.tgz", + "integrity": "sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", "es-array-method-boxes-properly": "^1.0.0", + "es-object-atoms": "^1.0.0", "is-string": "^1.0.7" }, "engines": { @@ -6158,11 +6221,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -6258,11 +6321,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -6272,9 +6335,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -6361,15 +6424,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/plugin-transform-parameters": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -6408,14 +6470,14 @@ } }, "node_modules/merge-refs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.2.2.tgz", - "integrity": "sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz", + "integrity": "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==", "funding": { "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -6446,9 +6508,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -6485,6 +6547,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", @@ -6536,17 +6603,14 @@ } }, "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/sourcemap-codec": { @@ -6628,11 +6692,11 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -6669,11 +6733,11 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -6702,12 +6766,12 @@ } }, "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -6717,11 +6781,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -6730,6 +6794,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/connected-react-router": { "version": "6.9.3", "resolved": "https://registry.npmjs.org/connected-react-router/-/connected-react-router-6.9.3.tgz", @@ -6832,12 +6908,12 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -6869,28 +6945,31 @@ } }, "node_modules/stackblur-canvas": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.6.0.tgz", - "integrity": "sha512-8S1aIA+UoF6erJYnglGPug6MaHYGo1Ot7h5fuXx4fUPvcvQfcdw2o/ppCse63+eZf8PPidSu4v1JnmEVtEDnpg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", + "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", "optional": true, "engines": { "node": ">=0.1.14" } }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -7069,11 +7148,12 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7083,15 +7163,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -7198,15 +7278,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", - "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", + "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -7232,11 +7312,11 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -7358,15 +7438,15 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7418,13 +7498,14 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7676,6 +7757,20 @@ "workbox-core": "6.6.0" } }, + "node_modules/@jest/core/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -7719,23 +7814,23 @@ } }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" }, "node_modules/isexe": { "version": "2.0.0", @@ -7743,14 +7838,14 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/acorn-walk": { @@ -7853,9 +7948,9 @@ } }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -7959,13 +8054,21 @@ "postcss": "^8.4" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-simple-access": "^7.22.5" }, "engines": { @@ -8057,14 +8160,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", + "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", + "@babel/plugin-syntax-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -8074,9 +8177,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -8084,6 +8187,20 @@ "@types/send": "*" } }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@svgr/hast-util-to-babel-ast": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", @@ -8122,11 +8239,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -8184,6 +8296,17 @@ "ajv": ">=8" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", @@ -8200,19 +8323,25 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8234,13 +8363,13 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/strip-bom": { @@ -8315,14 +8444,14 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -8455,16 +8584,16 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", - "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", + "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-react-display-name": "^7.24.1", + "@babel/plugin-transform-react-jsx": "^7.23.4", "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + "@babel/plugin-transform-react-pure-annotations": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -8501,13 +8630,13 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/plugin-transform-optional-chaining": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -8525,9 +8654,9 @@ } }, "node_modules/sass": { - "version": "1.69.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.7.tgz", - "integrity": "sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ==", + "version": "1.77.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.0.tgz", + "integrity": "sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -8546,11 +8675,11 @@ "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -8565,12 +8694,12 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -8578,7 +8707,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -8613,9 +8742,9 @@ } }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -8639,9 +8768,9 @@ } }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { "node": ">= 4" } @@ -8685,9 +8814,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "engines": { "node": ">=10" }, @@ -8756,7 +8885,7 @@ "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", - "nth-check": "^2.1.1" + "nth-check": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" @@ -8778,13 +8907,13 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.7.tgz", - "integrity": "sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz", + "integrity": "sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.23.7", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-decorators": "^7.23.3" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-decorators": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -8818,12 +8947,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -8868,9 +8997,12 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8910,11 +9042,14 @@ "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8966,19 +9101,19 @@ } }, "node_modules/@types/node": { - "version": "20.10.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.8.tgz", - "integrity": "sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA==", + "version": "20.12.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", + "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -8989,23 +9124,27 @@ } }, "node_modules/@mui/base/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9020,27 +9159,29 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" }, "node_modules/@mui/icons-material": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.3.tgz", - "integrity": "sha512-7LEs8AnO2Se/XYH+CcJndRsGAE+M8KAExiiQHf0V11poqmPVGcbbY82Ry2IUYf9+rOilCVnWI18ErghZ625BPQ==", + "version": "5.15.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.16.tgz", + "integrity": "sha512-s8vYbyACzTNZRKv+20fCfVXJwJqNcVotns2EKnu1wmAga6wv2LAo5kB1d5yqQqZlMFtp34EJvRXf7cy8X0tJVA==", "dependencies": { - "@babel/runtime": "^7.23.6" + "@babel/runtime": "^7.23.9" }, "engines": { "node": ">=12.0.0" @@ -9060,6 +9201,20 @@ } } }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/workbox-build/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -9074,6 +9229,17 @@ "node": ">=10" } }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, "node_modules/postcss-focus-visible": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", @@ -9177,12 +9343,12 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -9225,15 +9391,6 @@ "node": ">=0.10.0" } }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, "node_modules/socket.io-parser": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", @@ -9274,17 +9431,17 @@ } }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } }, "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" }, "node_modules/jest-circus/node_modules/@jest/types": { "version": "27.5.1", @@ -9312,14 +9469,14 @@ } }, "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -9561,9 +9718,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -9726,13 +9883,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -9770,9 +9927,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" }, "node_modules/react-select": { "version": "3.2.0", @@ -9794,13 +9951,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -9837,9 +9994,9 @@ } }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dependencies": { "jake": "^10.8.5" }, @@ -9903,11 +10060,11 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -10005,6 +10162,22 @@ "@types/yargs-parser": "*" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/bfj": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", @@ -10026,12 +10199,12 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -10133,9 +10306,9 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "node_modules/core-js-pure": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.0.tgz", - "integrity": "sha512-f+eRYmkou59uh7BPcyJ8MC76DiGhspj1KMxVIcF24tzP8NA9HVa1uC7BTW2tgx7E1QVCzDzsgp7kArrzhlz8Ew==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.0.tgz", + "integrity": "sha512-d3BrpyFr5eD4KcbRvQ3FTUx/KWmaDesr7+a3+1+P46IUnNoEt+oiLijPINZMEon7w9oGkIINWxrBAU9DEciwFQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -10183,9 +10356,9 @@ } }, "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, "node_modules/jest-circus/node_modules/jest-get-type": { "version": "27.5.1", @@ -10272,57 +10445,64 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dependencies": { "gopd": "^1.0.1", - "regexp.prototype.flags": "^1.5.1", + "data-view-buffer": "^1.0.1", + "regexp.prototype.flags": "^1.5.2", "object-keys": "^1.1.1", - "has-proto": "^1.0.1", - "is-array-buffer": "^3.0.2", - "es-set-tostringtag": "^2.0.1", - "internal-slot": "^1.0.5", - "typed-array-buffer": "^1.0.0", + "has-proto": "^1.0.3", + "is-array-buffer": "^3.0.4", + "es-set-tostringtag": "^2.0.3", + "internal-slot": "^1.0.7", + "data-view-byte-length": "^1.0.1", + "typed-array-buffer": "^1.0.2", + "es-object-atoms": "^1.0.0", "es-to-primitive": "^1.2.1", - "hasown": "^2.0.0", - "get-intrinsic": "^1.2.2", + "hasown": "^2.0.2", + "get-intrinsic": "^1.2.4", "is-weakref": "^1.0.2", "is-callable": "^1.2.7", - "string.prototype.trimend": "^1.0.7", - "available-typed-arrays": "^1.0.5", - "is-shared-array-buffer": "^1.0.2", - "object.assign": "^4.1.4", - "arraybuffer.prototype.slice": "^1.0.2", + "string.prototype.trimend": "^1.0.8", + "is-data-view": "^1.0.1", + "available-typed-arrays": "^1.0.7", + "is-shared-array-buffer": "^1.0.3", + "object.assign": "^4.1.5", + "arraybuffer.prototype.slice": "^1.0.3", + "data-view-byte-offset": "^1.0.0", "is-regex": "^1.1.4", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", + "es-define-property": "^1.0.0", "has-symbols": "^1.0.3", - "array-buffer-byte-length": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "get-symbol-description": "^1.0.0", - "safe-regex-test": "^1.0.0", + "array-buffer-byte-length": "^1.0.1", + "string.prototype.trim": "^1.2.9", + "get-symbol-description": "^1.0.2", + "safe-regex-test": "^1.0.3", "unbox-primitive": "^1.0.2", - "safe-array-concat": "^1.0.1", + "safe-array-concat": "^1.1.2", "is-string": "^1.0.7", - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "function.prototype.name": "^1.1.6", - "typed-array-byte-length": "^1.0.0", + "typed-array-byte-length": "^1.0.1", "object-inspect": "^1.13.1", "globalthis": "^1.0.3", - "typed-array-length": "^1.0.4", - "which-typed-array": "^1.1.13", - "has-property-descriptors": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "string.prototype.trimstart": "^1.0.7", - "is-negative-zero": "^2.0.2" + "typed-array-length": "^1.0.6", + "which-typed-array": "^1.1.15", + "has-property-descriptors": "^1.0.2", + "typed-array-byte-offset": "^1.0.2", + "string.prototype.trimstart": "^1.0.8", + "is-negative-zero": "^2.0.3", + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -10615,11 +10795,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -10629,19 +10809,22 @@ } }, "node_modules/@mui/material/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/discontinuous-range": { @@ -10651,17 +10834,14 @@ "dev": true }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/pretty-format": { @@ -10739,6 +10919,22 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@jest/console/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -10756,11 +10952,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", - "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", + "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -10770,9 +10966,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -10785,21 +10981,6 @@ "postcss": "^8.1.0" } }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/source-map-explorer": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.3.tgz", @@ -10827,11 +11008,11 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -10872,11 +11053,11 @@ } }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/@svgr/babel-plugin-transform-svg-component": { @@ -10922,9 +11103,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", + "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -10959,9 +11140,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -11023,11 +11204,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -11159,11 +11340,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" }, "engines": { @@ -11182,9 +11363,9 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", - "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", + "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", "dependencies": { "@floating-ui/utils": "^0.2.0" } @@ -11224,17 +11405,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -11357,9 +11527,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", + "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==" }, "node_modules/throat": { "version": "6.0.2", @@ -11382,16 +11552,17 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -11474,6 +11645,14 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -11506,9 +11685,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "engines": { "node": "14 || >=16.14" } @@ -11539,9 +11718,9 @@ } }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -11677,12 +11856,12 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.1.tgz", - "integrity": "sha512-Y5NejJTTliTyY4H7sipGqY+RX5P87i3F7c4Rcepy72nq+mNLhIsD0W4c7kEmduMDQCSqtPsXPlSTsFhh2LQv+g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, "engines": { @@ -11798,15 +11977,16 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -11984,9 +12164,9 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/date-easter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/date-easter/-/date-easter-1.0.2.tgz", - "integrity": "sha512-mpC1izx7lUSLYl4B88V2W57eNB4xS2ic+ahxK2AYUsaBTsCeHzT6K5ymUKzL9YPFf/GlygFqpiD4/NO1hxDsLw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/date-easter/-/date-easter-1.0.3.tgz", + "integrity": "sha512-aOViyIgpM4W0OWUiLqivznwTtuMlD/rdUWhc5IatYnplhPiWrLv75cnifaKYhmQwUBLAMWLNG4/9mlLIbXoGBQ==", "engines": { "node": ">=12.0.0" } @@ -12004,6 +12184,11 @@ "node": ">4.0" } }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -12116,9 +12301,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.3.tgz", - "integrity": "sha512-sWeihiVyxdJjpLkp8SHkTy9kt2M/o11M60G1MzwljGL2BXdM3Ktzqv5QaQHdi00y7Y1ulvtI3GOSxP2xU8mQJw==", + "version": "5.15.16", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.16.tgz", + "integrity": "sha512-PTIbMJs5C/vYMfyJNW8ArOezh4eyHkg2pTeA7bBxh2kLP1Uzs0Nm+krXWbWGJPwTWjM8EhnDrr4aCF26+2oleg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" @@ -12141,31 +12326,19 @@ "lodash.isplainobject": "^4.0.6" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -12174,22 +12347,22 @@ } }, "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.1.0.tgz", + "integrity": "sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==", "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", + "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { @@ -12250,17 +12423,6 @@ "node": ">=0.8.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -12314,9 +12476,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "engines": { "node": ">=10.0.0" }, @@ -12473,24 +12635,27 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", + "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { @@ -12593,11 +12758,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -12631,12 +12796,12 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", - "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -12746,12 +12911,12 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", - "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz", + "integrity": "sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-flow": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -12911,15 +13076,15 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" } }, "node_modules/jest-each/node_modules/jest-get-type": { @@ -12972,34 +13137,34 @@ } }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "dependencies": { "chrome-trace-event": "^1.0.2", "eslint-scope": "5.1.1", "tapable": "^2.1.1", - "@webassemblyjs/wasm-edit": "^1.11.5", - "terser-webpack-plugin": "^5.3.7", + "@webassemblyjs/wasm-edit": "^1.12.1", + "terser-webpack-plugin": "^5.3.10", "@types/eslint-scope": "^3.7.3", "acorn": "^8.7.1", - "watchpack": "^2.4.0", - "@webassemblyjs/wasm-parser": "^1.11.5", + "watchpack": "^2.4.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "neo-async": "^2.6.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.16.0", "events": "^3.2.0", - "browserslist": "^4.14.5", + "browserslist": "^4.21.10", "mime-types": "^2.1.27", - "@types/estree": "^1.0.0", + "@types/estree": "^1.0.5", "loader-runner": "^4.2.0", "schema-utils": "^3.2.0", "glob-to-regexp": "^0.4.1", - "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/ast": "^1.12.1", "es-module-lexer": "^1.2.1", "webpack-sources": "^3.2.3", "json-parse-even-better-errors": "^2.3.1", "acorn-import-assertions": "^1.9.0", - "graceful-fs": "^4.2.9" + "graceful-fs": "^4.2.11" }, "bin": { "webpack": "bin/webpack.js" @@ -13018,11 +13183,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -13048,12 +13213,12 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { @@ -13105,9 +13270,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.1.tgz", - "integrity": "sha512-18PLWRzhy9glDQp3+wOgfLYRWlhgX0azxgJ63rdpoUHyrC9z0f5CkFburjQx4uD7ZCruw85ZtMt6K+L+R8fLJQ==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -13175,14 +13340,14 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -13222,9 +13387,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -13249,9 +13414,9 @@ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -13276,9 +13441,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.1.tgz", - "integrity": "sha512-UY+FGM/2jjMkzQLn8pxcHGMaVLh9aEitG3zY2CiY7XHdLiz3bZOwa6oDxNqEMv7zZkV+cj5DOdz0cQ1BP5Hjgw==" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", + "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==" }, "node_modules/svgo/node_modules/color-convert": { "version": "1.9.3", @@ -13313,15 +13478,17 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", "dependencies": { "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" }, "engines": { "node": ">= 0.8" @@ -13331,15 +13498,9 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -13352,6 +13513,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -13582,16 +13746,16 @@ } }, "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", - "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz", + "integrity": "sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -13601,13 +13765,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { @@ -13728,28 +13892,17 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.5.tgz", - "integrity": "sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz", + "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==", "dependencies": { - "@floating-ui/dom": "^1.5.4" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -13840,12 +13993,12 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -13923,19 +14076,34 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, + "node_modules/react-js-pagination": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/react-js-pagination/-/react-js-pagination-3.0.3.tgz", + "integrity": "sha512-podyA6Rd0uxc8uQakXWXxnonoOPI6NnFOROXfc6qPKNYm44s+Bgpn0JkyflcfbHf/GFKahnL8JN8rxBHZiBskg==", + "dependencies": { + "classnames": "^2.2.5", + "fstream": "1.0.12", + "paginator": "^1.0.0", + "prop-types": "15.x.x - 16.x.x", + "react": "15.x.x - 16.x.x", + "tar": "2.2.2" + } + }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -13983,11 +14151,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -14042,17 +14210,21 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/workbox-google-analytics": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", "dependencies": { "workbox-background-sync": "6.6.0", "workbox-core": "6.6.0", @@ -14061,9 +14233,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -14126,9 +14298,9 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "funding": [ { "type": "opencollective", @@ -14144,8 +14316,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -14184,14 +14356,17 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14273,13 +14448,18 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14326,11 +14506,11 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -14412,11 +14592,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -14493,9 +14673,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -14581,11 +14761,11 @@ "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -14761,11 +14941,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -14775,11 +14955,11 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", - "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", "dependencies": { - "@floating-ui/core": "^1.5.3", + "@floating-ui/core": "^1.0.0", "@floating-ui/utils": "^0.2.0" } }, @@ -14810,6 +14990,20 @@ "node": ">=8.0.0" } }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@types/babel__template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", @@ -14884,11 +15078,11 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -14898,13 +15092,14 @@ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15017,12 +15212,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -15037,37 +15232,38 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", "dependencies": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -15112,6 +15308,37 @@ "node": ">=10" } }, + "node_modules/@testing-library/react/node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dependencies": { + "is-date-object": "^1.0.5", + "regexp.prototype.flags": "^1.5.1", + "object-keys": "^1.1.1", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "which-collection": "^1.0.1", + "get-intrinsic": "^1.2.2", + "object-is": "^1.1.5", + "is-shared-array-buffer": "^1.0.2", + "object.assign": "^4.1.4", + "which-boxed-primitive": "^1.0.2", + "is-regex": "^1.1.4", + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "side-channel": "^1.0.4", + "isarray": "^2.0.5", + "es-get-iterator": "^1.1.3", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -15159,6 +15386,28 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/react-dropdown-select/node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -15198,16 +15447,16 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -15234,20 +15483,6 @@ "node": ">= 0.6" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@emotion/utils": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", @@ -15389,14 +15624,14 @@ } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -15466,12 +15701,12 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -15505,11 +15740,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -15596,11 +15831,11 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/core-js-compat": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", - "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", + "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", "dependencies": { - "browserslist": "^4.22.2" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -15608,9 +15843,9 @@ } }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -15628,7 +15863,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -15694,9 +15929,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -15722,9 +15957,12 @@ } }, "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } @@ -15755,11 +15993,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -15769,90 +16007,91 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", - "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", "dependencies": { - "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-async-generator-functions": "^7.23.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", "semver": "^6.3.1", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.24.5", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-dynamic-import": "^7.24.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.24.1", "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.24.1", "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-block-scoping": "^7.24.5", + "@babel/plugin-transform-numeric-separator": "^7.24.1", "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", "@babel/plugin-syntax-json-strings": "^7.8.3", "core-js-compat": "^3.31.0", - "@babel/compat-data": "^7.23.5", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", + "@babel/compat-data": "^7.24.4", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.5", "@babel/preset-modules": "0.1.6-no-external-plugins", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.5", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3" + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -15943,9 +16182,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "engines": { "node": ">=6.9.0" } @@ -15964,9 +16203,9 @@ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -16020,12 +16259,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -16135,31 +16374,28 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/@mui/material/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/clean-css/node_modules/source-map": { @@ -16206,19 +16442,20 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", + "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==" }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -16302,21 +16539,22 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -16407,17 +16645,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" }, "engines": { @@ -16437,9 +16675,9 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz", - "integrity": "sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw==", + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", "dependencies": { "moment": "^2.29.4" }, @@ -16479,17 +16717,17 @@ } }, "node_modules/@mui/system": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.3.tgz", - "integrity": "sha512-ewVU4eRgo4VfNMGpO61cKlfWmH7l9s6rA8EknRzuMX3DbSLfmtW2WJJg6qPwragvpPIir0Pp/AdWVSDhyNy5Tw==", - "dependencies": { - "@babel/runtime": "^7.23.6", - "@mui/private-theming": "^5.15.3", - "@mui/styled-engine": "^5.15.3", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", - "clsx": "^2.0.0", - "csstype": "^3.1.2", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -16625,18 +16863,18 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "type-is": "~1.6.18", "safe-buffer": "5.2.1", "finalhandler": "1.2.0", "fresh": "0.5.2", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-type": "~1.0.4", "send": "0.18.0", - "cookie": "0.5.0", + "cookie": "0.6.0", "methods": "~1.1.2", "proxy-addr": "~2.0.7", "accepts": "~1.3.8", @@ -16674,14 +16912,14 @@ } }, "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -16733,11 +16971,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -16799,9 +17037,9 @@ } }, "node_modules/core-js": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", - "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", + "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -16870,18 +17108,18 @@ } }, "node_modules/@types/jest": { - "version": "29.5.11", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", - "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" } }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" }, "node_modules/dequal": { "version": "2.0.3", @@ -16914,13 +17152,13 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", + "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.23.0", + "@babel/template": "^7.24.0", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -16977,13 +17215,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -17088,11 +17326,11 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -17132,9 +17370,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", + "integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==" }, "node_modules/css-select-base-adapter": { "version": "0.1.1", @@ -17186,11 +17424,11 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -17334,30 +17572,25 @@ "node": ">=8" } }, - "node_modules/quill/node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" - }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -17398,9 +17631,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -17512,19 +17745,33 @@ "node": ">= 0.6" } }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" }, "engines": { @@ -17779,9 +18026,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } @@ -17874,14 +18121,14 @@ "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" }, "node_modules/@emotion/styled": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", - "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.1", - "@emotion/serialize": "^1.1.2", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", "@emotion/utils": "^1.2.1" }, @@ -17915,9 +18162,9 @@ } }, "node_modules/@mui/utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/data-urls": { "version": "2.0.0", @@ -17996,16 +18243,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/html-to-pdf-js": { @@ -18116,14 +18366,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dependencies": { - "dequal": "^2.0.3" - } - }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", @@ -18225,20 +18467,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" }, "node_modules/postcss-nesting": { "version": "10.2.0", @@ -18260,11 +18502,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -18312,12 +18554,12 @@ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@mui/private-theming": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.3.tgz", - "integrity": "sha512-Q79MhVMmywC1l5bMsMZq5PsIudr1MNPJnx9/EqdMP0vpz5iNvFpnLmxsD7d8/hqTWgFAljI+LH3jX8MxlZH9Gw==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", "dependencies": { - "@babel/runtime": "^7.23.6", - "@mui/utils": "^5.15.3", + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", "prop-types": "^15.8.1" }, "engines": { @@ -18338,16 +18580,16 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -18480,9 +18722,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -18538,11 +18780,11 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", - "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", + "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -18626,29 +18868,10 @@ "@types/yargs-parser": "*" } }, - "node_modules/quill-delta/node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", "engines": { "node": ">=10.0.0" } @@ -18743,9 +18966,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "engines": { "node": ">=6.9.0" } @@ -18840,11 +19063,6 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, "node_modules/jest-message-util/node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -18859,12 +19077,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -18940,6 +19158,11 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/react-motion/node_modules/performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg==" + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -18949,24 +19172,30 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -18986,9 +19215,9 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -19019,12 +19248,12 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/@fortawesome/free-regular-svg-icons": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.1.tgz", - "integrity": "sha512-m6ShXn+wvqEU69wSP84coxLbNl7sGVZb+Ca+XZq6k30SzuP3X4TfPqtycgUh9ASwlNh5OfQCd8pDIWxl+O+LlQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.2.tgz", + "integrity": "sha512-iabw/f5f8Uy2nTRtJ13XZTS1O5+t+anvlamJ3zJGLEVE2pKsAWhPv2lq01uQlfgCX7VaveT3EVs515cCN9jRbw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.1" + "@fortawesome/fontawesome-common-types": "6.5.2" }, "engines": { "node": ">=6" @@ -19082,6 +19311,17 @@ "teleport": ">=0.2.0" } }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", @@ -19121,14 +19361,13 @@ } }, "node_modules/date-holidays": { - "version": "3.23.3", - "resolved": "https://registry.npmjs.org/date-holidays/-/date-holidays-3.23.3.tgz", - "integrity": "sha512-SaD1mTuQwZn6Bzq8nyjRjE+aLUqDGeNVv0WqDgO+ho/8XjumstQ7SjuFDFdX8v2fj7KjN4F9BTc1Ep0BsuQWMQ==", + "version": "3.23.12", + "resolved": "https://registry.npmjs.org/date-holidays/-/date-holidays-3.23.12.tgz", + "integrity": "sha512-DLyP0PPVgNydgaTAY7SBS26+5h3KO1Z8FRKiAROkz0hAGNBLGAM48SMabfVa2ACRHH7Qw3LXYvlJkt9oa9WePA==", "dependencies": { "date-holidays-parser": "^3.4.4", "js-yaml": "^4.1.0", - "lodash.omit": "^4.5.0", - "lodash.pick": "^4.4.0", + "lodash": "^4.17.21", "prepin": "^1.0.3" }, "bin": { @@ -19150,13 +19389,13 @@ } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -19207,9 +19446,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", - "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==" + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==" }, "node_modules/escodegen": { "version": "2.1.0", @@ -19282,23 +19521,23 @@ } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz", - "integrity": "sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz", + "integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.1" + "@fortawesome/fontawesome-common-types": "6.5.2" }, "engines": { "node": ">=6" } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", + "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -19308,15 +19547,15 @@ } }, "node_modules/css-loader": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.0.tgz", - "integrity": "sha512-3I5Nu4ytWlHvOP6zItjiHlefBNtrH+oehq8tnQa2kO305qpVyx9XNIT1CXIj5bgCJs7qICBCkgCYxQLKPANoLA==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.31", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" @@ -19329,17 +19568,26 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -19359,12 +19607,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -19375,11 +19623,11 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -19461,9 +19709,9 @@ } }, "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/postcss-overflow-shorthand": { "version": "3.0.4", @@ -19528,15 +19776,6 @@ } ] }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "node_modules/html2canvas": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", @@ -19550,39 +19789,28 @@ } }, "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "engines": { "node": ">= 10" } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@emotion/core": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz", @@ -19631,6 +19859,11 @@ "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -19688,12 +19921,12 @@ } }, "node_modules/enzyme-shallow-equal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz", - "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz", + "integrity": "sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==", "dev": true, "dependencies": { - "has": "^1.0.3", + "hasown": "^2.0.0", "object-is": "^1.1.5" }, "funding": { @@ -19719,6 +19952,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@typescript-eslint/types": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", @@ -19809,13 +20057,13 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -19829,6 +20077,20 @@ "node": ">=12.0.0" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", @@ -19842,9 +20104,9 @@ } }, "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "node_modules/object-inspect": { "version": "1.13.1", @@ -19929,18 +20191,12 @@ "object-assign": "^4.1.1" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/react-icons": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", + "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", + "peerDependencies": { + "react": "*" } }, "node_modules/immer": { @@ -19961,20 +20217,20 @@ } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -20044,11 +20300,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/lodash.omit": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" - }, "node_modules/@material-ui/system/node_modules/csstype": { "version": "2.6.21", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", @@ -20070,9 +20321,9 @@ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" }, "node_modules/postcss-modules-scope": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz", - "integrity": "sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -20110,16 +20361,16 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.30", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.30.tgz", - "integrity": "sha512-dc38W4W3K42atE9nSaOeoJ7/x9wGIfawdwC/UmMxMLlZ1iSsITQ8dQJaTATCbn98YvYPINK/EH541YA5enQIPQ==", - "dependencies": { - "@babel/runtime": "^7.23.6", - "@floating-ui/react-dom": "^2.0.4", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", + "clsx": "^2.1.0", "prop-types": "^15.8.1" }, "engines": { @@ -20141,15 +20392,15 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -20214,6 +20465,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/paginator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/paginator/-/paginator-1.0.0.tgz", + "integrity": "sha512-j2Y5AtF/NrXOEU9VVOQBGHnj81NveRQ/cDzySywqsWrAj+cxivMpMCkYJOds3ulQiDU4rQBWc0WoyyXMXOmuMA==" + }, "node_modules/svgo/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -20331,33 +20587,32 @@ } }, "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/client-zip": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/client-zip/-/client-zip-2.4.4.tgz", - "integrity": "sha512-Ixk40BUI7VvNDxW7SCze20GbCuC+gjP4tGkXUpo6/W96bOf96HSed6cOQVeUOIe74SJAG/dIrBr7AtR4xBVnsA==" - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/client-zip/-/client-zip-2.4.5.tgz", + "integrity": "sha512-4y4d5ZeTH/szIAMQeC8ju67pxtvj+3u20wMGwOFrZk+pegy3aSEA2JkwgC8XVDTXP/Iqn1gyqNQXmkyBp4KLEQ==" }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -20492,6 +20747,17 @@ "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", + "dependencies": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, "node_modules/@jest/core/node_modules/@types/yargs": { "version": "16.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", @@ -20534,12 +20800,12 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/@types/react": { - "version": "17.0.74", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.74.tgz", - "integrity": "sha512-nBtFGaeTMzpiL/p73xbmCi00SiCQZDTJUk9ZuHOLtil3nI+y7l269LHkHIAYpav99ZwGnPJzuJsJpfLXjiQ52g==", + "version": "17.0.80", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.80.tgz", + "integrity": "sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA==", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", + "@types/scheduler": "^0.16", "csstype": "^3.0.2" } }, @@ -20566,6 +20832,21 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/postcss-color-rebeccapurple": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", @@ -20625,25 +20906,27 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", "dependencies": { "semver": "^6.3.1", "doctrine": "^2.1.0", - "object.values": "^1.1.6", - "resolve": "^2.0.0-next.4", + "object.values": "^1.1.7", + "resolve": "^2.0.0-next.5", + "array.prototype.toreversed": "^1.1.2", "estraverse": "^5.3.0", - "object.hasown": "^1.1.2", - "array.prototype.flatmap": "^1.3.1", - "object.fromentries": "^2.0.6", - "array.prototype.tosorted": "^1.1.1", - "es-iterator-helpers": "^1.0.12", + "array.prototype.findlast": "^1.2.4", + "object.hasown": "^1.1.3", + "array.prototype.flatmap": "^1.3.2", + "object.fromentries": "^2.0.7", + "array.prototype.tosorted": "^1.1.3", + "es-iterator-helpers": "^1.0.17", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "string.prototype.matchall": "^4.0.8", + "object.entries": "^1.1.7", + "string.prototype.matchall": "^4.0.10", "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "array-includes": "^3.1.6", + "array-includes": "^3.1.7", "prop-types": "^15.8.1" }, "engines": { @@ -20668,17 +20951,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", @@ -20773,12 +21045,17 @@ "node": ">= 0.8.0" } }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -20789,14 +21066,16 @@ } }, "node_modules/array.prototype.reduce": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", - "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", + "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "is-string": "^1.0.7" }, "engines": { @@ -20849,9 +21128,9 @@ } }, "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "funding": [ { "type": "github", @@ -20898,23 +21177,23 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", + "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -21020,11 +21299,11 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -21033,18 +21312,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/react-date-picker": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/react-date-picker/-/react-date-picker-8.4.0.tgz", @@ -21089,11 +21356,11 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -21118,14 +21385,14 @@ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", diff --git a/forms-flow-web/package.json b/forms-flow-web/package.json index d4672414f..99232b0cc 100644 --- a/forms-flow-web/package.json +++ b/forms-flow-web/package.json @@ -84,7 +84,6 @@ "react-dropdown-select": "^4.7.4", "react-helmet": "^6.1.0", "react-js-pagination": "^3.0.3", - "react-loading-overlay": "^1.0.1", "react-modal-resizable-draggable": "^0.1.6", "react-quill": "^2.0.0", "react-redux": "^7.2.4", From 0d0de222dd277e76313bb53ff04dfe0bf6483e66 Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Tue, 7 May 2024 19:14:11 -0400 Subject: [PATCH 124/147] updated the lan tooltip --- forms-flow-web/src/components/FOI/Dashboard/utils.js | 4 +++- .../{syncaxispagedetails => restartpods}/restart-pods.yaml | 0 2 files changed, 3 insertions(+), 1 deletion(-) rename openshift/templates/cronjob/{syncaxispagedetails => restartpods}/restart-pods.yaml (100%) diff --git a/forms-flow-web/src/components/FOI/Dashboard/utils.js b/forms-flow-web/src/components/FOI/Dashboard/utils.js index 5a8c3677c..0fc9d37c6 100644 --- a/forms-flow-web/src/components/FOI/Dashboard/utils.js +++ b/forms-flow-web/src/components/FOI/Dashboard/utils.js @@ -295,12 +295,14 @@ export const pagecountcellTooltipRender = (params) => { const recordspagecount = params.row.recordspagecount; const requestpagecount = params.row.requestpagecount; const lanpagecount = params.row.axislanpagecount; + const bcgovcode = params.row.bcgovcode; + const requestType = params.row.requestType; let toolTipText = ""; if (requestpagecount > 0 || lanpagecount > 0) { if (requestpagecount > 0) { toolTipText += `AXIS pages: ${axispagecount} \n Mod pages: ${recordspagecount} \n`; } - if (lanpagecount > 0) { + if (bcgovcode?.toLowerCase() === "cfd" && requestType?.toLowerCase() === "personal") { toolTipText += `LAN pages: ${lanpagecount} \n`; } } diff --git a/openshift/templates/cronjob/syncaxispagedetails/restart-pods.yaml b/openshift/templates/cronjob/restartpods/restart-pods.yaml similarity index 100% rename from openshift/templates/cronjob/syncaxispagedetails/restart-pods.yaml rename to openshift/templates/cronjob/restartpods/restart-pods.yaml From d5aa741c6a23417070a849ba6cc6bc95aaa10ff0 Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Tue, 7 May 2024 19:26:24 -0400 Subject: [PATCH 125/147] Lan Pages updated --- forms-flow-web/src/components/FOI/Dashboard/utils.js | 3 ++- forms-flow-web/src/constants/FOI/enum.js | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/forms-flow-web/src/components/FOI/Dashboard/utils.js b/forms-flow-web/src/components/FOI/Dashboard/utils.js index 0fc9d37c6..086411d30 100644 --- a/forms-flow-web/src/components/FOI/Dashboard/utils.js +++ b/forms-flow-web/src/components/FOI/Dashboard/utils.js @@ -5,6 +5,7 @@ import { calculateDaysRemaining, } from "../../../helper/FOI/helper"; import { StateEnum } from "../../../constants/FOI/statusEnum"; +import { MinistryNeedsLANPages, RequestTypes } from "../../../constants/FOI/enum"; import Chip from "@mui/material/Chip"; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faFlag } from '@fortawesome/free-solid-svg-icons'; @@ -302,7 +303,7 @@ export const pagecountcellTooltipRender = (params) => { if (requestpagecount > 0) { toolTipText += `AXIS pages: ${axispagecount} \n Mod pages: ${recordspagecount} \n`; } - if (bcgovcode?.toLowerCase() === "cfd" && requestType?.toLowerCase() === "personal") { + if (MinistryNeedsLANPages.includes(bcgovcode?.toUpperCase()) && requestType?.toLowerCase() === RequestTypes.personal) { toolTipText += `LAN pages: ${lanpagecount} \n`; } } diff --git a/forms-flow-web/src/constants/FOI/enum.js b/forms-flow-web/src/constants/FOI/enum.js index dd70c764b..372a832e9 100644 --- a/forms-flow-web/src/constants/FOI/enum.js +++ b/forms-flow-web/src/constants/FOI/enum.js @@ -162,6 +162,15 @@ const MinistryNeedsScanning = [ "MSD" ] +const MinistryNeedsLANPages = [ + "CFD" +] + +const RequestTypes = Object.freeze({ + general: "general", + personal: "personal" +}); + const MCFPopularSections = 23 const MSDPopularSections = 11 @@ -206,4 +215,6 @@ MSDPopularSections, RecordsDownloadList, RecordDownloadCategory, RecordDownloadStatus, +MinistryNeedsLANPages, +RequestTypes }; From b2270dd62ddf70905ec502d185d41ac878f3594f Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 7 May 2024 18:00:44 -0700 Subject: [PATCH 126/147] fix merge overwrite package-lock --- forms-flow-web/package-lock.json | 3695 ++++++++++++++++-------------- forms-flow-web/package.json | 4 +- 2 files changed, 1919 insertions(+), 1780 deletions(-) diff --git a/forms-flow-web/package-lock.json b/forms-flow-web/package-lock.json index 6de439ff9..685268835 100644 --- a/forms-flow-web/package-lock.json +++ b/forms-flow-web/package-lock.json @@ -22,6 +22,7 @@ "@testing-library/user-event": "^12.1.10", "@material-ui/icons": "^4.11.2", "redux-logger": "^3.0.6", + "react-modal-resizable-draggable": "^0.1.6", "@mui/x-data-grid": "^5.2.2", "@material-ui/pickers": "^3.3.10", "bootstrap": "^4.6.0", @@ -120,14 +121,15 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -323,11 +325,11 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -386,12 +388,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -417,11 +419,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.3.tgz", - "integrity": "sha512-mT3LiSt9tZWCdx1pl7q4Q5tNo6gdZbvJel286ZHGuj6LQQXjWNAh8qiF9d+LogvNUI+D7eLkTnj605d1zoazfg==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", "dependencies": { - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "@types/prop-types": "^15.7.11", "prop-types": "^15.8.1", "react-is": "^18.2.0" @@ -443,17 +445,17 @@ } } }, - "node_modules/react-datepicker/node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -558,10 +560,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@emotion/css/node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/terser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", - "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -606,14 +613,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -689,9 +688,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "funding": [ { "type": "opencollective", @@ -707,9 +706,9 @@ } ], "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -724,12 +723,27 @@ "postcss": "^8.1.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", + "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -819,9 +833,9 @@ } }, "node_modules/@restart/hooks": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.15.tgz", - "integrity": "sha512-cZFXYTxbpzYcieq/mBwSyXgqnGMHoBVh3J7MU0CCoIB4NRZxV9/TuwTBAaLMqpNhC3zTPMCgkQ5Ey07L02Xmcw==", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", "dependencies": { "dequal": "^2.0.3" }, @@ -894,16 +908,16 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dependencies": { "colorette": "^2.0.10", "http-proxy-middleware": "^2.0.3", "p-retry": "^4.5.0", "@types/express": "^4.17.13", "compression": "^1.7.4", - "webpack-dev-middleware": "^5.3.1", + "webpack-dev-middleware": "^5.3.4", "launch-editor": "^2.6.0", "html-entities": "^2.3.2", "ansi-html-community": "^0.0.8", @@ -973,11 +987,6 @@ "date-fns": "^2.0.0" } }, - "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -1022,6 +1031,11 @@ "node": ">=4" } }, + "node_modules/@testing-library/react/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/jsonpath": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", @@ -1059,12 +1073,15 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1090,9 +1107,9 @@ "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -1203,12 +1220,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1265,9 +1282,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -1284,14 +1301,6 @@ "node": ">=0.10.0" } }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -1374,9 +1383,9 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -1400,9 +1409,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", - "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz", + "integrity": "sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -1413,7 +1422,7 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { @@ -1461,28 +1470,16 @@ } }, "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", "dependencies": { - "is-date-object": "^1.0.5", - "regexp.prototype.flags": "^1.5.1", - "object-keys": "^1.1.1", "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "which-collection": "^1.0.1", - "get-intrinsic": "^1.2.2", - "object-is": "^1.1.5", - "is-shared-array-buffer": "^1.0.2", - "object.assign": "^4.1.4", - "which-boxed-primitive": "^1.0.2", + "is-date-object": "^1.0.5", "is-regex": "^1.1.4", - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "side-channel": "^1.0.4", - "isarray": "^2.0.5", - "es-get-iterator": "^1.1.3", - "which-typed-array": "^1.1.13" + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" }, "engines": { "node": ">= 0.4" @@ -1613,17 +1610,6 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, - "node_modules/svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^2.1.1" - } - }, "node_modules/coa/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1660,11 +1646,11 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1674,14 +1660,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/css-prefers-color-scheme": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", @@ -2023,9 +2001,9 @@ } }, "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/async": { "version": "3.2.5", @@ -2033,22 +2011,25 @@ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "engines": { "node": ">= 0.4" }, @@ -2064,14 +2045,6 @@ "node": ">= 0.6" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/jspdf": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", @@ -2173,9 +2146,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001576", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", - "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", + "version": "1.0.30001616", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz", + "integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==", "funding": [ { "type": "opencollective", @@ -2192,9 +2165,9 @@ ] }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dependencies": { "ignore": "^5.2.0", "eslint-scope": "^7.2.2", @@ -2221,7 +2194,7 @@ "chalk": "^4.0.0", "debug": "^4.3.2", "ajv": "^6.12.4", - "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/config-array": "^0.11.14", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "esutils": "^2.0.2", @@ -2233,7 +2206,7 @@ "find-up": "^5.0.0", "optionator": "^0.9.3", "escape-string-regexp": "^4.0.0", - "@eslint/js": "8.56.0" + "@eslint/js": "8.57.0" }, "bin": { "eslint": "bin/eslint.js" @@ -2251,24 +2224,25 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -2277,25 +2251,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" - }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -2380,11 +2350,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2409,6 +2379,14 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, "node_modules/@csstools/postcss-oklab-function": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", @@ -2429,9 +2407,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } @@ -2540,9 +2518,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", - "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "dependencies": { "@emotion/hash": "^0.9.1", "@emotion/memoize": "^0.8.1", @@ -2640,9 +2618,9 @@ } }, "node_modules/socket.io-client": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.3.tgz", - "integrity": "sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -2665,20 +2643,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -2687,19 +2651,6 @@ "node": "*" } }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2733,9 +2684,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dependencies": { "debug": "^3.2.7" }, @@ -2943,9 +2894,9 @@ } }, "node_modules/@emotion/react": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", - "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -3013,9 +2964,9 @@ } }, "node_modules/@fortawesome/free-solid-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", - "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", "hasInstallScript": true, "engines": { "node": ">=6" @@ -3154,13 +3105,13 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -3185,9 +3136,9 @@ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==" + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" }, "node_modules/postcss-initial": { "version": "4.0.1", @@ -3234,13 +3185,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -3356,9 +3308,9 @@ } }, "node_modules/cssdb": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.10.0.tgz", - "integrity": "sha512-yGZ5tmA57gWh/uvdQBHs45wwFY0IBh3ypABk5sEubPBPSzXzkNgsWReqx7gdx6uhC+QoFBe+V8JwBB9/hQ6cIA==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", "funding": [ { "type": "opencollective", @@ -3411,14 +3363,14 @@ "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" }, "node_modules/jest-diff/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/jest-watch-typeahead/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", @@ -3434,9 +3386,9 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", @@ -3597,13 +3549,13 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3677,9 +3629,9 @@ } }, "node_modules/dompurify": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", - "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.2.tgz", + "integrity": "sha512-5vSyvxRAb45EoWwAktUT3AYqAwXK4FL7si22Cgj46U6ICsj/YJczCN+Bk7WNABIQmpWRymGfslMhrRUZkQNnqA==", "optional": true }, "node_modules/@emotion/core/node_modules/@emotion/sheet": { @@ -3788,15 +3740,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", + "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-syntax-jsx": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -3837,6 +3789,21 @@ "node": ">=12.0.0" } }, + "node_modules/react-modal-resizable-draggable": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/react-modal-resizable-draggable/-/react-modal-resizable-draggable-0.1.6.tgz", + "integrity": "sha512-xNpmEE47WtlCQpFOiqcyZ/3e/PzPO7iIMoKHugNLWm53U1y4OCRwlOqSX7IzdjceE8bEnLmf5vJDt/pNJf/+HA==", + "dependencies": { + "react": "^17.0.0", + "react-dom": "^17.0.1", + "react-icons": "^4.2.0", + "react-motion": "^0.5.2", + "react-transition-group": "^4.4.1" + }, + "peerDependencies": { + "react": "^17.0.1" + } + }, "node_modules/postcss-image-set-function": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", @@ -3896,9 +3863,12 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -4029,6 +3999,22 @@ "entities": "^2.0.0" } }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jest-diff/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -4041,11 +4027,11 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", - "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4080,22 +4066,22 @@ } }, "node_modules/@mui/styles": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.15.3.tgz", - "integrity": "sha512-yePvO+0z35a1Cm7sXy3rL6F1oEJSiDFcQ/4Mkn/MHttwfBbbi7higBbUsBkuLPGoy40EiIUF+Tr+UoNW296/bA==", + "version": "5.15.16", + "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.15.16.tgz", + "integrity": "sha512-WDv0M69fdfG8yJ5bmR8K81u+a7N/akSyVswKUavz//09EGS2cjPtInJspskMQNpZl2ReC5x/YEmkL+i5/PnmtA==", "dependencies": { "jss-plugin-props-sort": "^10.10.0", - "@mui/types": "^7.2.12", - "@mui/private-theming": "^5.15.3", + "@mui/types": "^7.2.14", + "@mui/private-theming": "^5.15.14", "jss-plugin-default-unit": "^10.10.0", - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "jss-plugin-nested": "^10.10.0", "jss-plugin-rule-value-function": "^10.10.0", "jss-plugin-camel-case": "^10.10.0", - "clsx": "^2.0.0", + "clsx": "^2.1.0", "@emotion/hash": "^0.9.1", - "@mui/utils": "^5.15.3", - "csstype": "^3.1.2", + "@mui/utils": "^5.15.14", + "csstype": "^3.1.3", "jss-plugin-vendor-prefixer": "^10.10.0", "jss": "^10.10.0", "jss-plugin-global": "^10.10.0", @@ -4177,12 +4163,15 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4241,9 +4230,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.22.5", @@ -4396,9 +4385,9 @@ } }, "node_modules/react-dropdown-select": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/react-dropdown-select/-/react-dropdown-select-4.11.0.tgz", - "integrity": "sha512-L4sMYLI5SGNWG88jib50nBo17qBsu28eyawUwW5xHSoKc0k8JsUk1Cim8NOU7UxvLpUAi8EMSGJt7hfvtQ6sTQ==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/react-dropdown-select/-/react-dropdown-select-4.11.2.tgz", + "integrity": "sha512-UeodiYuUWRD+LjU0IMZivJUKU6/QjjRA7Bwo3Zjebiex/t6AGMpcLzHnb4doNdOf6O4kWGqnpsL5xNgtlEicyw==", "dependencies": { "@emotion/react": "11.11.0", "@emotion/styled": "11.11.0" @@ -4439,9 +4428,9 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -4453,13 +4442,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -4552,15 +4541,16 @@ "integrity": "sha512-io974va+Qyu+UfuVX3UIAgJlxLhAMx9Y8VMfh+IG00Js7hXQo1qNQuwSiSa0xxco0SVgx5HWNkaiCcV+aZ8WPw==" }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4583,12 +4573,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -4617,22 +4607,22 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "engines": { "node": ">=6.9.0" } @@ -4672,11 +4662,11 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -4724,12 +4714,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -4760,18 +4750,15 @@ } }, "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "locate-path": "^6.0.0", + "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/hpack.js/node_modules/string_decoder": { @@ -4890,15 +4877,15 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", - "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dependencies": { "is-glob": "^4.0.3", "resolve": "^1.22.2", "arg": "^5.0.2", "@alloc/quick-lru": "^5.2.0", - "jiti": "^1.19.1", + "jiti": "^1.21.0", "lilconfig": "^2.1.0", "normalize-path": "^3.0.0", "postcss": "^8.4.23", @@ -4942,9 +4929,9 @@ } }, "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4998,21 +4985,10 @@ "postcss": "^8.4" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", "funding": [ { "type": "opencollective", @@ -5028,7 +5004,7 @@ } ], "dependencies": { - "escalade": "^3.1.1", + "escalade": "^3.1.2", "picocolors": "^1.0.0" }, "bin": { @@ -5060,13 +5036,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -5101,9 +5077,9 @@ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -5111,13 +5087,27 @@ "postcss": "^8.1.0" } }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", - "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.4", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -5133,13 +5123,13 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.3.tgz", - "integrity": "sha512-+d5XZCTeemOO/vBfWGEeHgTm8fjU1Psdgm+xAw+uegycO2EnoA/EfGSaG5UwZ6g3b66y48Mkxi35AggShMr88w==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", "dependencies": { - "@babel/runtime": "^7.23.6", + "@babel/runtime": "^7.23.9", "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -5177,13 +5167,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5214,12 +5208,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -5229,14 +5223,14 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.625", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.625.tgz", - "integrity": "sha512-DENMhh3MFgaPDoXWrVIqSPInQoLImywfCwrSmVl3cf9QHzoZSiutHwGaB/Ql3VkqcQV30rzgdM+BjKqBAJxo5Q==" + "version": "1.4.758", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.758.tgz", + "integrity": "sha512-/o9x6TCdrYZBMdGeTifAP3wlF/gVT+TtWJe3BSmtNh92Mw81U9hrYwW9OAGUh+sEOX/yz5e34sksqRruZbjYrw==" }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -5250,20 +5244,20 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/@mui/system/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -5353,15 +5347,13 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.13.tgz", + "integrity": "sha512-odZVYXly+JwzYri9rKqqUAk0cY6zLpv4dxoKinhoJNShV36Gpxf+CyDIILJ4tYsJ1ZxIWs233Y39iVnynvDA/g==", "dependencies": { "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", "schema-utils": "^3.0.0", @@ -5376,7 +5368,7 @@ "sockjs-client": "^1.4.0", "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", + "webpack-dev-server": "3.x || 4.x || 5.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, @@ -5479,11 +5471,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -5493,20 +5485,20 @@ } }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -5614,12 +5606,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -5640,19 +5632,19 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/@mui/material": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.3.tgz", - "integrity": "sha512-DODBBMouyq1B5f3YkEWL9vO8pGCxuEGqtfpltF6peMJzz/78tJFyLQsDas9MNLC/8AdFu2BQdkK7wox5UBPTAA==", - "dependencies": { - "@babel/runtime": "^7.23.6", - "@mui/base": "5.0.0-beta.30", - "@mui/core-downloads-tracker": "^5.15.3", - "@mui/system": "^5.15.3", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", + "version": "5.15.16", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.16.tgz", + "integrity": "sha512-ery2hFReewko9gpDBqOr2VmXwQG9ifXofPhGzIx09/b9JqCQC/06kZXZDGGrOTpIddK9HlIf4yrS+G70jPAzUQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40", + "@mui/core-downloads-tracker": "^5.15.16", + "@mui/system": "^5.15.15", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", "@types/react-transition-group": "^4.4.10", - "clsx": "^2.0.0", - "csstype": "^3.1.2", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^18.2.0", "react-transition-group": "^4.4.5" @@ -5743,11 +5735,11 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -5772,13 +5764,15 @@ "dev": true }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5809,9 +5803,9 @@ } }, "node_modules/@mui/styles/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } @@ -5955,14 +5949,6 @@ "node": ">=6.0.0" } }, - "node_modules/svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -5975,47 +5961,40 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@fortawesome/free-regular-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", - "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dependencies": { - "has-symbols": "^1.0.3" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -6045,9 +6024,12 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6072,9 +6054,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.12", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.12.tgz", - "integrity": "sha512-3kaHiNm9khCAo0pVe0RenketDSFoZGAlVZ4zDjB/QNZV0XiCj+sh1zkX0VVhQPgYJDlBEzAag+MHJ1tU3vf0Zw==", + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" }, @@ -6110,6 +6092,19 @@ "postcss": "^8.2" } }, + "node_modules/react-motion": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", + "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", + "dependencies": { + "performance-now": "^0.2.0", + "prop-types": "^15.5.8", + "raf": "^3.1.0" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0" + } + }, "node_modules/pkg-up/node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -6122,15 +6117,16 @@ } }, "node_modules/array.prototype.filter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", - "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.4.tgz", + "integrity": "sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", "es-array-method-boxes-properly": "^1.0.0", + "es-object-atoms": "^1.0.0", "is-string": "^1.0.7" }, "engines": { @@ -6158,11 +6154,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -6258,11 +6254,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -6272,9 +6268,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -6361,15 +6357,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/plugin-transform-parameters": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -6408,14 +6403,14 @@ } }, "node_modules/merge-refs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.2.2.tgz", - "integrity": "sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz", + "integrity": "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==", "funding": { "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -6446,9 +6441,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -6485,6 +6480,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", @@ -6536,17 +6536,14 @@ } }, "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/sourcemap-codec": { @@ -6628,11 +6625,11 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -6669,11 +6666,11 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -6702,12 +6699,12 @@ } }, "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -6717,11 +6714,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -6730,6 +6727,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/connected-react-router": { "version": "6.9.3", "resolved": "https://registry.npmjs.org/connected-react-router/-/connected-react-router-6.9.3.tgz", @@ -6832,12 +6841,12 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -6869,28 +6878,31 @@ } }, "node_modules/stackblur-canvas": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.6.0.tgz", - "integrity": "sha512-8S1aIA+UoF6erJYnglGPug6MaHYGo1Ot7h5fuXx4fUPvcvQfcdw2o/ppCse63+eZf8PPidSu4v1JnmEVtEDnpg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", + "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", "optional": true, "engines": { "node": ">=0.1.14" } }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -7069,11 +7081,12 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7083,15 +7096,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -7198,15 +7211,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", - "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", + "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -7232,11 +7245,11 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -7358,15 +7371,15 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7418,13 +7431,14 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7719,23 +7733,23 @@ } }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" }, "node_modules/isexe": { "version": "2.0.0", @@ -7743,14 +7757,14 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/acorn-walk": { @@ -7853,9 +7867,9 @@ } }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -7959,13 +7973,21 @@ "postcss": "^8.4" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-simple-access": "^7.22.5" }, "engines": { @@ -8057,14 +8079,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", + "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", + "@babel/plugin-syntax-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -8074,9 +8096,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -8084,6 +8106,20 @@ "@types/send": "*" } }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@svgr/hast-util-to-babel-ast": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", @@ -8122,11 +8158,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -8184,6 +8215,17 @@ "ajv": ">=8" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", @@ -8200,19 +8242,25 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8234,13 +8282,13 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/strip-bom": { @@ -8315,14 +8363,14 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -8455,16 +8503,16 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", - "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", + "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-react-display-name": "^7.24.1", + "@babel/plugin-transform-react-jsx": "^7.23.4", "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + "@babel/plugin-transform-react-pure-annotations": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -8501,13 +8549,13 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/plugin-transform-optional-chaining": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -8525,9 +8573,9 @@ } }, "node_modules/sass": { - "version": "1.69.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.7.tgz", - "integrity": "sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ==", + "version": "1.77.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.0.tgz", + "integrity": "sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -8546,11 +8594,11 @@ "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -8565,12 +8613,12 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -8578,7 +8626,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -8613,18 +8661,13 @@ } }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "dependencies": { "@emotion/memoize": "^0.8.1" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -8639,9 +8682,9 @@ } }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { "node": ">= 4" } @@ -8685,9 +8728,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "engines": { "node": ">=10" }, @@ -8756,7 +8799,7 @@ "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", - "nth-check": "^2.1.1" + "nth-check": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" @@ -8778,13 +8821,13 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.7.tgz", - "integrity": "sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz", + "integrity": "sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.23.7", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-decorators": "^7.23.3" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-decorators": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -8818,12 +8861,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -8868,9 +8911,12 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8910,11 +8956,14 @@ "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8966,19 +9015,19 @@ } }, "node_modules/@types/node": { - "version": "20.10.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.8.tgz", - "integrity": "sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA==", + "version": "20.12.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", + "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -8989,23 +9038,27 @@ } }, "node_modules/@mui/base/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9020,27 +9073,29 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" }, "node_modules/@mui/icons-material": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.3.tgz", - "integrity": "sha512-7LEs8AnO2Se/XYH+CcJndRsGAE+M8KAExiiQHf0V11poqmPVGcbbY82Ry2IUYf9+rOilCVnWI18ErghZ625BPQ==", + "version": "5.15.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.16.tgz", + "integrity": "sha512-s8vYbyACzTNZRKv+20fCfVXJwJqNcVotns2EKnu1wmAga6wv2LAo5kB1d5yqQqZlMFtp34EJvRXf7cy8X0tJVA==", "dependencies": { - "@babel/runtime": "^7.23.6" + "@babel/runtime": "^7.23.9" }, "engines": { "node": ">=12.0.0" @@ -9060,6 +9115,20 @@ } } }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/workbox-build/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -9074,6 +9143,17 @@ "node": ">=10" } }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, "node_modules/postcss-focus-visible": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", @@ -9177,12 +9257,12 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -9225,15 +9305,6 @@ "node": ">=0.10.0" } }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, "node_modules/socket.io-parser": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", @@ -9274,17 +9345,17 @@ } }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } }, "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" }, "node_modules/jest-circus/node_modules/@jest/types": { "version": "27.5.1", @@ -9312,14 +9383,14 @@ } }, "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -9561,9 +9632,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -9726,13 +9797,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -9770,9 +9841,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==" }, "node_modules/react-select": { "version": "3.2.0", @@ -9794,13 +9865,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -9837,9 +9908,9 @@ } }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dependencies": { "jake": "^10.8.5" }, @@ -9903,11 +9974,11 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -10005,6 +10076,22 @@ "@types/yargs-parser": "*" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/bfj": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", @@ -10026,12 +10113,12 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -10133,9 +10220,9 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "node_modules/core-js-pure": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.0.tgz", - "integrity": "sha512-f+eRYmkou59uh7BPcyJ8MC76DiGhspj1KMxVIcF24tzP8NA9HVa1uC7BTW2tgx7E1QVCzDzsgp7kArrzhlz8Ew==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.0.tgz", + "integrity": "sha512-d3BrpyFr5eD4KcbRvQ3FTUx/KWmaDesr7+a3+1+P46IUnNoEt+oiLijPINZMEon7w9oGkIINWxrBAU9DEciwFQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -10183,9 +10270,9 @@ } }, "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, "node_modules/jest-circus/node_modules/jest-get-type": { "version": "27.5.1", @@ -10272,57 +10359,64 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dependencies": { "gopd": "^1.0.1", - "regexp.prototype.flags": "^1.5.1", + "data-view-buffer": "^1.0.1", + "regexp.prototype.flags": "^1.5.2", "object-keys": "^1.1.1", - "has-proto": "^1.0.1", - "is-array-buffer": "^3.0.2", - "es-set-tostringtag": "^2.0.1", - "internal-slot": "^1.0.5", - "typed-array-buffer": "^1.0.0", + "has-proto": "^1.0.3", + "is-array-buffer": "^3.0.4", + "es-set-tostringtag": "^2.0.3", + "internal-slot": "^1.0.7", + "data-view-byte-length": "^1.0.1", + "typed-array-buffer": "^1.0.2", + "es-object-atoms": "^1.0.0", "es-to-primitive": "^1.2.1", - "hasown": "^2.0.0", - "get-intrinsic": "^1.2.2", + "hasown": "^2.0.2", + "get-intrinsic": "^1.2.4", "is-weakref": "^1.0.2", "is-callable": "^1.2.7", - "string.prototype.trimend": "^1.0.7", - "available-typed-arrays": "^1.0.5", - "is-shared-array-buffer": "^1.0.2", - "object.assign": "^4.1.4", - "arraybuffer.prototype.slice": "^1.0.2", + "string.prototype.trimend": "^1.0.8", + "is-data-view": "^1.0.1", + "available-typed-arrays": "^1.0.7", + "is-shared-array-buffer": "^1.0.3", + "object.assign": "^4.1.5", + "arraybuffer.prototype.slice": "^1.0.3", + "data-view-byte-offset": "^1.0.0", "is-regex": "^1.1.4", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", + "es-define-property": "^1.0.0", "has-symbols": "^1.0.3", - "array-buffer-byte-length": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "get-symbol-description": "^1.0.0", - "safe-regex-test": "^1.0.0", + "array-buffer-byte-length": "^1.0.1", + "string.prototype.trim": "^1.2.9", + "get-symbol-description": "^1.0.2", + "safe-regex-test": "^1.0.3", "unbox-primitive": "^1.0.2", - "safe-array-concat": "^1.0.1", + "safe-array-concat": "^1.1.2", "is-string": "^1.0.7", - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "function.prototype.name": "^1.1.6", - "typed-array-byte-length": "^1.0.0", + "typed-array-byte-length": "^1.0.1", "object-inspect": "^1.13.1", "globalthis": "^1.0.3", - "typed-array-length": "^1.0.4", - "which-typed-array": "^1.1.13", - "has-property-descriptors": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "string.prototype.trimstart": "^1.0.7", - "is-negative-zero": "^2.0.2" + "typed-array-length": "^1.0.6", + "which-typed-array": "^1.1.15", + "has-property-descriptors": "^1.0.2", + "typed-array-byte-offset": "^1.0.2", + "string.prototype.trimstart": "^1.0.8", + "is-negative-zero": "^2.0.3", + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -10615,11 +10709,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -10629,19 +10723,22 @@ } }, "node_modules/@mui/material/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/discontinuous-range": { @@ -10739,6 +10836,22 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@jest/console/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -10756,11 +10869,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", - "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", + "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -10770,9 +10883,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -10785,21 +10898,6 @@ "postcss": "^8.1.0" } }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/source-map-explorer": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.3.tgz", @@ -10827,11 +10925,11 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -10872,11 +10970,11 @@ } }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/@svgr/babel-plugin-transform-svg-component": { @@ -10922,9 +11020,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", + "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -10959,9 +11057,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -11023,11 +11121,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -11159,11 +11257,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" }, "engines": { @@ -11182,9 +11280,9 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", - "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", + "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", "dependencies": { "@floating-ui/utils": "^0.2.0" } @@ -11224,17 +11322,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -11357,9 +11444,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", + "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==" }, "node_modules/throat": { "version": "6.0.2", @@ -11382,16 +11469,17 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -11474,6 +11562,14 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -11506,9 +11602,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "engines": { "node": "14 || >=16.14" } @@ -11539,9 +11635,9 @@ } }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -11677,12 +11773,12 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.1.tgz", - "integrity": "sha512-Y5NejJTTliTyY4H7sipGqY+RX5P87i3F7c4Rcepy72nq+mNLhIsD0W4c7kEmduMDQCSqtPsXPlSTsFhh2LQv+g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, "engines": { @@ -11798,15 +11894,16 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -11984,9 +12081,9 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/date-easter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/date-easter/-/date-easter-1.0.2.tgz", - "integrity": "sha512-mpC1izx7lUSLYl4B88V2W57eNB4xS2ic+ahxK2AYUsaBTsCeHzT6K5ymUKzL9YPFf/GlygFqpiD4/NO1hxDsLw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/date-easter/-/date-easter-1.0.3.tgz", + "integrity": "sha512-aOViyIgpM4W0OWUiLqivznwTtuMlD/rdUWhc5IatYnplhPiWrLv75cnifaKYhmQwUBLAMWLNG4/9mlLIbXoGBQ==", "engines": { "node": ">=12.0.0" } @@ -12004,6 +12101,11 @@ "node": ">4.0" } }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -12116,9 +12218,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.3.tgz", - "integrity": "sha512-sWeihiVyxdJjpLkp8SHkTy9kt2M/o11M60G1MzwljGL2BXdM3Ktzqv5QaQHdi00y7Y1ulvtI3GOSxP2xU8mQJw==", + "version": "5.15.16", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.16.tgz", + "integrity": "sha512-PTIbMJs5C/vYMfyJNW8ArOezh4eyHkg2pTeA7bBxh2kLP1Uzs0Nm+krXWbWGJPwTWjM8EhnDrr4aCF26+2oleg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" @@ -12141,31 +12243,19 @@ "lodash.isplainobject": "^4.0.6" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -12174,22 +12264,22 @@ } }, "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.1.0.tgz", + "integrity": "sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==", "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", + "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { @@ -12250,17 +12340,6 @@ "node": ">=0.8.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -12314,9 +12393,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "engines": { "node": ">=10.0.0" }, @@ -12473,24 +12552,27 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", + "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { @@ -12593,11 +12675,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -12631,12 +12713,12 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", - "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, @@ -12746,12 +12828,12 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", - "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz", + "integrity": "sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-flow": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -12911,15 +12993,15 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" } }, "node_modules/jest-each/node_modules/jest-get-type": { @@ -12972,34 +13054,34 @@ } }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "dependencies": { "chrome-trace-event": "^1.0.2", "eslint-scope": "5.1.1", "tapable": "^2.1.1", - "@webassemblyjs/wasm-edit": "^1.11.5", - "terser-webpack-plugin": "^5.3.7", + "@webassemblyjs/wasm-edit": "^1.12.1", + "terser-webpack-plugin": "^5.3.10", "@types/eslint-scope": "^3.7.3", "acorn": "^8.7.1", - "watchpack": "^2.4.0", - "@webassemblyjs/wasm-parser": "^1.11.5", + "watchpack": "^2.4.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "neo-async": "^2.6.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.16.0", "events": "^3.2.0", - "browserslist": "^4.14.5", + "browserslist": "^4.21.10", "mime-types": "^2.1.27", - "@types/estree": "^1.0.0", + "@types/estree": "^1.0.5", "loader-runner": "^4.2.0", "schema-utils": "^3.2.0", "glob-to-regexp": "^0.4.1", - "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/ast": "^1.12.1", "es-module-lexer": "^1.2.1", "webpack-sources": "^3.2.3", "json-parse-even-better-errors": "^2.3.1", "acorn-import-assertions": "^1.9.0", - "graceful-fs": "^4.2.9" + "graceful-fs": "^4.2.11" }, "bin": { "webpack": "bin/webpack.js" @@ -13018,11 +13100,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -13048,12 +13130,12 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { @@ -13105,9 +13187,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.1.tgz", - "integrity": "sha512-18PLWRzhy9glDQp3+wOgfLYRWlhgX0azxgJ63rdpoUHyrC9z0f5CkFburjQx4uD7ZCruw85ZtMt6K+L+R8fLJQ==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -13175,14 +13257,14 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -13222,9 +13304,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -13249,12 +13331,9 @@ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", + "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", "bin": { "semver": "bin/semver.js" }, @@ -13276,9 +13355,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.1.tgz", - "integrity": "sha512-UY+FGM/2jjMkzQLn8pxcHGMaVLh9aEitG3zY2CiY7XHdLiz3bZOwa6oDxNqEMv7zZkV+cj5DOdz0cQ1BP5Hjgw==" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", + "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==" }, "node_modules/svgo/node_modules/color-convert": { "version": "1.9.3", @@ -13313,15 +13392,17 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", "dependencies": { "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" }, "engines": { "node": ">= 0.8" @@ -13331,15 +13412,9 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -13352,6 +13427,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -13582,16 +13660,16 @@ } }, "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", - "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz", + "integrity": "sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -13601,13 +13679,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { @@ -13675,17 +13753,6 @@ "webpack": "^5.0.0" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -13728,28 +13795,17 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.5.tgz", - "integrity": "sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz", + "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==", "dependencies": { - "@floating-ui/dom": "^1.5.4" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -13840,12 +13896,12 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -13923,14 +13979,16 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -13983,11 +14041,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -14042,17 +14100,21 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/workbox-google-analytics": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", "dependencies": { "workbox-background-sync": "6.6.0", "workbox-core": "6.6.0", @@ -14061,9 +14123,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -14126,9 +14188,9 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "funding": [ { "type": "opencollective", @@ -14144,8 +14206,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -14184,14 +14246,17 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14273,13 +14338,18 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14326,11 +14396,11 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -14412,11 +14482,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -14493,9 +14563,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", + "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -14581,11 +14651,11 @@ "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -14761,11 +14831,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -14775,11 +14845,11 @@ } }, "node_modules/@floating-ui/dom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", - "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", "dependencies": { - "@floating-ui/core": "^1.5.3", + "@floating-ui/core": "^1.0.0", "@floating-ui/utils": "^0.2.0" } }, @@ -14810,6 +14880,20 @@ "node": ">=8.0.0" } }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@types/babel__template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", @@ -14884,11 +14968,11 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -14898,13 +14982,14 @@ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15017,12 +15102,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -15037,37 +15122,38 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", "dependencies": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -15112,6 +15198,37 @@ "node": ">=10" } }, + "node_modules/@testing-library/react/node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dependencies": { + "is-date-object": "^1.0.5", + "regexp.prototype.flags": "^1.5.1", + "object-keys": "^1.1.1", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "which-collection": "^1.0.1", + "get-intrinsic": "^1.2.2", + "object-is": "^1.1.5", + "is-shared-array-buffer": "^1.0.2", + "object.assign": "^4.1.4", + "which-boxed-primitive": "^1.0.2", + "is-regex": "^1.1.4", + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "side-channel": "^1.0.4", + "isarray": "^2.0.5", + "es-get-iterator": "^1.1.3", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -15159,6 +15276,28 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/react-dropdown-select/node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -15198,16 +15337,16 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -15234,20 +15373,6 @@ "node": ">= 0.6" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@emotion/utils": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", @@ -15389,14 +15514,14 @@ } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -15466,12 +15591,12 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -15505,11 +15630,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -15596,11 +15721,11 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/core-js-compat": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", - "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", + "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", "dependencies": { - "browserslist": "^4.22.2" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -15608,9 +15733,9 @@ } }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -15628,7 +15753,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -15694,9 +15819,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -15722,9 +15847,12 @@ } }, "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } @@ -15755,11 +15883,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -15769,90 +15897,91 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", - "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", "dependencies": { - "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-async-generator-functions": "^7.23.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", "semver": "^6.3.1", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.24.5", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-dynamic-import": "^7.24.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.24.1", "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.24.1", "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-block-scoping": "^7.24.5", + "@babel/plugin-transform-numeric-separator": "^7.24.1", "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", "@babel/plugin-syntax-json-strings": "^7.8.3", "core-js-compat": "^3.31.0", - "@babel/compat-data": "^7.23.5", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", + "@babel/compat-data": "^7.24.4", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.5", "@babel/preset-modules": "0.1.6-no-external-plugins", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.5", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3" + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -15943,9 +16072,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "engines": { "node": ">=6.9.0" } @@ -15964,9 +16093,9 @@ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -16020,12 +16149,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -16135,31 +16264,28 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/@mui/material/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/clean-css/node_modules/source-map": { @@ -16206,19 +16332,20 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", + "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==" }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -16302,21 +16429,22 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -16407,17 +16535,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" }, "engines": { @@ -16437,9 +16565,9 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz", - "integrity": "sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw==", + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", "dependencies": { "moment": "^2.29.4" }, @@ -16479,17 +16607,17 @@ } }, "node_modules/@mui/system": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.3.tgz", - "integrity": "sha512-ewVU4eRgo4VfNMGpO61cKlfWmH7l9s6rA8EknRzuMX3DbSLfmtW2WJJg6qPwragvpPIir0Pp/AdWVSDhyNy5Tw==", - "dependencies": { - "@babel/runtime": "^7.23.6", - "@mui/private-theming": "^5.15.3", - "@mui/styled-engine": "^5.15.3", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", - "clsx": "^2.0.0", - "csstype": "^3.1.2", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -16625,18 +16753,18 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "type-is": "~1.6.18", "safe-buffer": "5.2.1", "finalhandler": "1.2.0", "fresh": "0.5.2", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-type": "~1.0.4", "send": "0.18.0", - "cookie": "0.5.0", + "cookie": "0.6.0", "methods": "~1.1.2", "proxy-addr": "~2.0.7", "accepts": "~1.3.8", @@ -16674,14 +16802,14 @@ } }, "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -16733,11 +16861,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -16799,9 +16927,9 @@ } }, "node_modules/core-js": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", - "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", + "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -16870,18 +16998,18 @@ } }, "node_modules/@types/jest": { - "version": "29.5.11", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", - "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" } }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" }, "node_modules/dequal": { "version": "2.0.3", @@ -16914,13 +17042,13 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", + "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.23.0", + "@babel/template": "^7.24.0", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -16977,13 +17105,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -17088,11 +17216,11 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -17132,9 +17260,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", + "integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==" }, "node_modules/css-select-base-adapter": { "version": "0.1.1", @@ -17186,11 +17314,11 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -17334,30 +17462,25 @@ "node": ">=8" } }, - "node_modules/quill/node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" - }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -17398,9 +17521,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -17512,19 +17635,33 @@ "node": ">= 0.6" } }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" }, "engines": { @@ -17779,9 +17916,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } @@ -17874,14 +18011,14 @@ "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" }, "node_modules/@emotion/styled": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", - "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.1", - "@emotion/serialize": "^1.1.2", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", "@emotion/utils": "^1.2.1" }, @@ -17915,9 +18052,9 @@ } }, "node_modules/@mui/utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/data-urls": { "version": "2.0.0", @@ -17996,16 +18133,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/html-to-pdf-js": { @@ -18116,14 +18256,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dependencies": { - "dequal": "^2.0.3" - } - }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", @@ -18225,20 +18357,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" }, "node_modules/postcss-nesting": { "version": "10.2.0", @@ -18260,11 +18392,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -18312,12 +18444,12 @@ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@mui/private-theming": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.3.tgz", - "integrity": "sha512-Q79MhVMmywC1l5bMsMZq5PsIudr1MNPJnx9/EqdMP0vpz5iNvFpnLmxsD7d8/hqTWgFAljI+LH3jX8MxlZH9Gw==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", "dependencies": { - "@babel/runtime": "^7.23.6", - "@mui/utils": "^5.15.3", + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", "prop-types": "^15.8.1" }, "engines": { @@ -18338,16 +18470,16 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -18480,9 +18612,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -18538,11 +18670,11 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", - "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", + "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -18626,29 +18758,10 @@ "@types/yargs-parser": "*" } }, - "node_modules/quill-delta/node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", "engines": { "node": ">=10.0.0" } @@ -18743,9 +18856,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "engines": { "node": ">=6.9.0" } @@ -18840,11 +18953,6 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, "node_modules/jest-message-util/node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -18859,12 +18967,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -18940,6 +19048,11 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/react-motion/node_modules/performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg==" + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -18949,24 +19062,30 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -18986,9 +19105,9 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -19019,12 +19138,12 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/@fortawesome/free-regular-svg-icons": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.1.tgz", - "integrity": "sha512-m6ShXn+wvqEU69wSP84coxLbNl7sGVZb+Ca+XZq6k30SzuP3X4TfPqtycgUh9ASwlNh5OfQCd8pDIWxl+O+LlQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.2.tgz", + "integrity": "sha512-iabw/f5f8Uy2nTRtJ13XZTS1O5+t+anvlamJ3zJGLEVE2pKsAWhPv2lq01uQlfgCX7VaveT3EVs515cCN9jRbw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.1" + "@fortawesome/fontawesome-common-types": "6.5.2" }, "engines": { "node": ">=6" @@ -19082,6 +19201,17 @@ "teleport": ">=0.2.0" } }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", @@ -19121,14 +19251,13 @@ } }, "node_modules/date-holidays": { - "version": "3.23.3", - "resolved": "https://registry.npmjs.org/date-holidays/-/date-holidays-3.23.3.tgz", - "integrity": "sha512-SaD1mTuQwZn6Bzq8nyjRjE+aLUqDGeNVv0WqDgO+ho/8XjumstQ7SjuFDFdX8v2fj7KjN4F9BTc1Ep0BsuQWMQ==", + "version": "3.23.12", + "resolved": "https://registry.npmjs.org/date-holidays/-/date-holidays-3.23.12.tgz", + "integrity": "sha512-DLyP0PPVgNydgaTAY7SBS26+5h3KO1Z8FRKiAROkz0hAGNBLGAM48SMabfVa2ACRHH7Qw3LXYvlJkt9oa9WePA==", "dependencies": { "date-holidays-parser": "^3.4.4", "js-yaml": "^4.1.0", - "lodash.omit": "^4.5.0", - "lodash.pick": "^4.4.0", + "lodash": "^4.17.21", "prepin": "^1.0.3" }, "bin": { @@ -19150,13 +19279,13 @@ } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -19207,9 +19336,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", - "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==" + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==" }, "node_modules/escodegen": { "version": "2.1.0", @@ -19282,23 +19411,23 @@ } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz", - "integrity": "sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz", + "integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.1" + "@fortawesome/fontawesome-common-types": "6.5.2" }, "engines": { "node": ">=6" } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", + "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -19308,15 +19437,15 @@ } }, "node_modules/css-loader": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.0.tgz", - "integrity": "sha512-3I5Nu4ytWlHvOP6zItjiHlefBNtrH+oehq8tnQa2kO305qpVyx9XNIT1CXIj5bgCJs7qICBCkgCYxQLKPANoLA==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.31", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" @@ -19329,17 +19458,26 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -19359,12 +19497,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -19375,11 +19513,11 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -19461,9 +19599,9 @@ } }, "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/postcss-overflow-shorthand": { "version": "3.0.4", @@ -19528,15 +19666,6 @@ } ] }, - "node_modules/svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "node_modules/html2canvas": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", @@ -19550,39 +19679,28 @@ } }, "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "engines": { "node": ">= 10" } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@emotion/core": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz", @@ -19631,6 +19749,11 @@ "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -19688,12 +19811,12 @@ } }, "node_modules/enzyme-shallow-equal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz", - "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz", + "integrity": "sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==", "dev": true, "dependencies": { - "has": "^1.0.3", + "hasown": "^2.0.0", "object-is": "^1.1.5" }, "funding": { @@ -19719,6 +19842,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@typescript-eslint/types": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", @@ -19809,13 +19947,13 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -19829,6 +19967,20 @@ "node": ">=12.0.0" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", @@ -19842,9 +19994,9 @@ } }, "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "node_modules/object-inspect": { "version": "1.13.1", @@ -19929,18 +20081,12 @@ "object-assign": "^4.1.1" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/react-icons": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", + "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", + "peerDependencies": { + "react": "*" } }, "node_modules/immer": { @@ -19961,20 +20107,20 @@ } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -20044,11 +20190,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/lodash.omit": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" - }, "node_modules/@material-ui/system/node_modules/csstype": { "version": "2.6.21", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", @@ -20070,9 +20211,9 @@ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" }, "node_modules/postcss-modules-scope": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz", - "integrity": "sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -20110,16 +20251,16 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.30", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.30.tgz", - "integrity": "sha512-dc38W4W3K42atE9nSaOeoJ7/x9wGIfawdwC/UmMxMLlZ1iSsITQ8dQJaTATCbn98YvYPINK/EH541YA5enQIPQ==", - "dependencies": { - "@babel/runtime": "^7.23.6", - "@floating-ui/react-dom": "^2.0.4", - "@mui/types": "^7.2.12", - "@mui/utils": "^5.15.3", + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", + "clsx": "^2.1.0", "prop-types": "^15.8.1" }, "engines": { @@ -20141,15 +20282,15 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -20331,33 +20472,32 @@ } }, "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/client-zip": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/client-zip/-/client-zip-2.4.4.tgz", - "integrity": "sha512-Ixk40BUI7VvNDxW7SCze20GbCuC+gjP4tGkXUpo6/W96bOf96HSed6cOQVeUOIe74SJAG/dIrBr7AtR4xBVnsA==" - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/client-zip/-/client-zip-2.4.5.tgz", + "integrity": "sha512-4y4d5ZeTH/szIAMQeC8ju67pxtvj+3u20wMGwOFrZk+pegy3aSEA2JkwgC8XVDTXP/Iqn1gyqNQXmkyBp4KLEQ==" }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -20534,12 +20674,12 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/@types/react": { - "version": "17.0.74", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.74.tgz", - "integrity": "sha512-nBtFGaeTMzpiL/p73xbmCi00SiCQZDTJUk9ZuHOLtil3nI+y7l269LHkHIAYpav99ZwGnPJzuJsJpfLXjiQ52g==", + "version": "17.0.80", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.80.tgz", + "integrity": "sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA==", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", + "@types/scheduler": "^0.16", "csstype": "^3.0.2" } }, @@ -20566,6 +20706,21 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/postcss-color-rebeccapurple": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", @@ -20625,25 +20780,27 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", "dependencies": { "semver": "^6.3.1", "doctrine": "^2.1.0", - "object.values": "^1.1.6", - "resolve": "^2.0.0-next.4", + "object.values": "^1.1.7", + "resolve": "^2.0.0-next.5", + "array.prototype.toreversed": "^1.1.2", "estraverse": "^5.3.0", - "object.hasown": "^1.1.2", - "array.prototype.flatmap": "^1.3.1", - "object.fromentries": "^2.0.6", - "array.prototype.tosorted": "^1.1.1", - "es-iterator-helpers": "^1.0.12", + "array.prototype.findlast": "^1.2.4", + "object.hasown": "^1.1.3", + "array.prototype.flatmap": "^1.3.2", + "object.fromentries": "^2.0.7", + "array.prototype.tosorted": "^1.1.3", + "es-iterator-helpers": "^1.0.17", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "string.prototype.matchall": "^4.0.8", + "object.entries": "^1.1.7", + "string.prototype.matchall": "^4.0.10", "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "array-includes": "^3.1.6", + "array-includes": "^3.1.7", "prop-types": "^15.8.1" }, "engines": { @@ -20668,17 +20825,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", @@ -20773,12 +20919,17 @@ "node": ">= 0.8.0" } }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -20789,14 +20940,16 @@ } }, "node_modules/array.prototype.reduce": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", - "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", + "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "is-string": "^1.0.7" }, "engines": { @@ -20849,9 +21002,9 @@ } }, "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "funding": [ { "type": "github", @@ -20898,23 +21051,23 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", + "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -21020,11 +21173,11 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -21033,18 +21186,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/react-date-picker": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/react-date-picker/-/react-date-picker-8.4.0.tgz", @@ -21089,11 +21230,11 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -21118,14 +21259,14 @@ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", diff --git a/forms-flow-web/package.json b/forms-flow-web/package.json index d4672414f..94c3a13fe 100644 --- a/forms-flow-web/package.json +++ b/forms-flow-web/package.json @@ -83,8 +83,6 @@ "react-dom": "^17.0.2", "react-dropdown-select": "^4.7.4", "react-helmet": "^6.1.0", - "react-js-pagination": "^3.0.3", - "react-loading-overlay": "^1.0.1", "react-modal-resizable-draggable": "^0.1.6", "react-quill": "^2.0.0", "react-redux": "^7.2.4", @@ -127,4 +125,4 @@ "node_modules/(?!(astronomia|client-zip|reactjs-popup|react-quill)/)" ] } -} +} \ No newline at end of file From 2a7e393538dc4607d0452d67eda1d15df31ec141 Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Wed, 8 May 2024 10:28:49 -0400 Subject: [PATCH 127/147] MCF added for LAN pages --- forms-flow-web/src/constants/FOI/enum.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forms-flow-web/src/constants/FOI/enum.js b/forms-flow-web/src/constants/FOI/enum.js index 372a832e9..10eb7762e 100644 --- a/forms-flow-web/src/constants/FOI/enum.js +++ b/forms-flow-web/src/constants/FOI/enum.js @@ -163,7 +163,8 @@ const MinistryNeedsScanning = [ ] const MinistryNeedsLANPages = [ - "CFD" + "CFD", + "MCF" ] const RequestTypes = Object.freeze({ From 92a6b5883328f2c58c57b06bbc1998d2ab4f03d3 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Wed, 8 May 2024 11:07:41 -0700 Subject: [PATCH 128/147] Changes to pass iaocode instead of bcgovcode. --- request-management-api/request_api/schemas/foiaxissync.py | 2 +- .../request_api/services/external/axissyncservice.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/request-management-api/request_api/schemas/foiaxissync.py b/request-management-api/request_api/schemas/foiaxissync.py index 94b4906e1..663cff338 100644 --- a/request-management-api/request_api/schemas/foiaxissync.py +++ b/request-management-api/request_api/schemas/foiaxissync.py @@ -7,7 +7,7 @@ class Meta: # pylint: disable=too-few-public-methods """Exclude unknown fields in the deserialized output.""" unknown = EXCLUDE - bcgovcode = fields.Str(data_key="bcgovcode",allow_none=False) + iaocode = fields.Str(data_key="iaocode",allow_none=False) requesttype = fields.Str(data_key="requesttype",allow_none=False) class FOIRequestAxisSyncSchema(Schema): diff --git a/request-management-api/request_api/services/external/axissyncservice.py b/request-management-api/request_api/services/external/axissyncservice.py index 2d3e10308..784593adb 100644 --- a/request-management-api/request_api/services/external/axissyncservice.py +++ b/request-management-api/request_api/services/external/axissyncservice.py @@ -17,11 +17,11 @@ class axissyncservice: def syncpagecounts(self, axispgmrequests): for entry in axispgmrequests: - self.__syncpagecounts(entry["bcgovcode"], entry["requesttype"]) + self.__syncpagecounts(entry["iaocode"], entry["requesttype"]) return DefaultMethodResult(True,'Batch execution completed', axispgmrequests) - def __syncpagecounts(self, bcgovcode, requesttype): - programeara = programareaservice().getprogramareabyiaocode(bcgovcode) + def __syncpagecounts(self, iaocode, requesttype): + programeara = programareaservice().getprogramareabyiaocode(iaocode) requests = FOIMinistryRequest.getrequest_by_pgmarea_type(programeara['programareaid'], requesttype) for batch in list(more_itertools.batched(requests, self.AXIS_SYNC_BATCHSIZE)): batchrequest = list(batch) @@ -35,7 +35,7 @@ def __syncpagecounts(self, bcgovcode, requesttype): print("batch update failed for ids=", axisids) else: print("axis page response is empty for ids=", axisids) - return DefaultMethodResult(True,'Batch execution completed for bcgovcode=%s | requesttype=%s', bcgovcode, requesttype) + return DefaultMethodResult(True,'Batch execution completed for iaocode=%s | requesttype=%s', iaocode, requesttype) def axis_getpageinfo(self, axis_payload): From 04d2af99aa20bea62c597bcd5fcf49d76b51452e Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 8 May 2024 14:49:41 -0700 Subject: [PATCH 129/147] fix migration script order --- .../versions/59a97f42b5f2_add_profileid_to_applicant.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py b/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py index 688398a8d..9ba14196e 100644 --- a/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py +++ b/request-management-api/migrations/versions/59a97f42b5f2_add_profileid_to_applicant.py @@ -1,7 +1,7 @@ """add version to applicant Revision ID: 59a97f42b5f2 -Revises: 7fa7236d06fb +Revises: 10aa6d69aeed Create Date: 2023-12-11 18:12:59.955472 """ @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. revision = '59a97f42b5f2' -down_revision = '7bc099abf5cc' +down_revision = '10aa6d69aeed' branch_labels = None depends_on = None From afad6ea8227ced0490dff450da439d8abd67cfdf Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 9 May 2024 10:01:49 -0700 Subject: [PATCH 130/147] fix rrt migration order --- .../migrations/versions/e698b39da6bd_add_rtt_tag.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/request-management-api/migrations/versions/e698b39da6bd_add_rtt_tag.py b/request-management-api/migrations/versions/e698b39da6bd_add_rtt_tag.py index 9864dfd4f..281cf882b 100644 --- a/request-management-api/migrations/versions/e698b39da6bd_add_rtt_tag.py +++ b/request-management-api/migrations/versions/e698b39da6bd_add_rtt_tag.py @@ -1,7 +1,7 @@ """Add RTT tag Revision ID: e698b39da6bd -Revises: 6646acda32fe +Revises: c590239f1b2f Create Date: 2024-04-15 08:17:20.554269 """ @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. revision = 'e698b39da6bd' -down_revision = '6646acda32fe' +down_revision = 'c590239f1b2f' branch_labels = None depends_on = None From b8c1e434d8f342d15a211210adbfcbba0cf01fc4 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Thu, 9 May 2024 12:37:23 -0700 Subject: [PATCH 131/147] Changes to resolve the cron error [Parse values] --- .../request_api/services/external/axissyncservice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/request-management-api/request_api/services/external/axissyncservice.py b/request-management-api/request_api/services/external/axissyncservice.py index 784593adb..80d06c0b8 100644 --- a/request-management-api/request_api/services/external/axissyncservice.py +++ b/request-management-api/request_api/services/external/axissyncservice.py @@ -65,8 +65,8 @@ def updatepagecount(self, requests, axisresponse): axisrequestid = entry["axisrequestid"] entry["updatedby"] = 'System' entry["updated_at"] = datetime2.now() - entry["axispagecount"] = axisresponse[axisrequestid] if axisrequestid in axisresponse else entry["axispagecount"] - entry["axislanpagecount"] = axisresponse[axisrequestid] if axisrequestid in axisresponse else entry["axislanpagecount"] + entry["axispagecount"] = axisresponse[axisrequestid]["requestpagepount"] if axisrequestid in axisresponse else entry["axispagecount"] + entry["axislanpagecount"] = axisresponse[axisrequestid]["lanpagepount"] if axisrequestid in axisresponse else entry["axislanpagecount"] return requests From f22ab89a99b04fd3be44227c01119c44427e9404 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Mon, 13 May 2024 09:53:09 -0700 Subject: [PATCH 132/147] Debug axis integration. --- .../request_api/services/external/axissyncservice.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/request-management-api/request_api/services/external/axissyncservice.py b/request-management-api/request_api/services/external/axissyncservice.py index 80d06c0b8..a26523c3c 100644 --- a/request-management-api/request_api/services/external/axissyncservice.py +++ b/request-management-api/request_api/services/external/axissyncservice.py @@ -28,8 +28,9 @@ def __syncpagecounts(self, iaocode, requesttype): axisids = self.__getaxisids(batchrequest) #Fetch pagecount from axis : Begin axis_pageinfo = self.axis_getpageinfo(axisids) + print("axis_pageinfo=",axis_pageinfo) #Fetch pagecount from axis : End - if axis_pageinfo != {}: + if axis_pageinfo != {}: response = FOIMinistryRequest.bulk_update_axispagecount(self.updatepagecount(batchrequest, axis_pageinfo)) if response.success == False: print("batch update failed for ids=", axisids) @@ -41,6 +42,7 @@ def __syncpagecounts(self, iaocode, requesttype): def axis_getpageinfo(self, axis_payload): try: if self.AXIS_BASE_URL not in (None,''): + print('axis_payload:',axis_payload) access_token = KeycloakAdminService().get_token() axis_page_endpoint = f'{self.AXIS_BASE_URL}/api/requestspagecount' response = requests.post( From 9342e977a660dd6c42209a7430014fd1123230a6 Mon Sep 17 00:00:00 2001 From: divyav-aot Date: Mon, 13 May 2024 15:04:43 -0400 Subject: [PATCH 133/147] updated the condition with an or for lanpages --- .../MCS.FOI.AXISIntegration.DAL/RequestsDA.cs | 4 ++-- .../Controllers/RequestsPageCountController.cs | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs index 7e2a6acbe..11bd7a210 100644 --- a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs +++ b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs @@ -128,7 +128,7 @@ public Dictionary GetAXISRequestsPageCount(string[] arrayOfRe DataTable axisDataTable = GetAxisRequestsPageCount(arrayOfRequestId); var axisRequestPageCountDict = axisDataTable.AsEnumerable() - .Where(rw => Convert.ToInt32(rw["requestPageCount"]) > 0) + .Where(rw => Convert.ToInt32(rw["requestPageCount"]) > 0 || Convert.ToInt32(rw["lanPageCount"]) > 0) .ToDictionary( rw => Convert.ToString(rw["AXISRequestID"]), rw => new PageCount @@ -145,7 +145,7 @@ public Dictionary GetAXISRequestsPageCount() DataTable axisDataTable = GetAxisRequestsPageCount(); var axisRequestPageCountDict = axisDataTable.AsEnumerable() - .Where(rw => Convert.ToInt32(rw["requestPageCount"]) > 0) + .Where(rw => Convert.ToInt32(rw["requestPageCount"]) > 0 || Convert.ToInt32(rw["lanPageCount"]) > 0) .ToDictionary( rw => Convert.ToString(rw["AXISRequestID"]), rw => new PageCount diff --git a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegrationWebAPI/Controllers/RequestsPageCountController.cs b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegrationWebAPI/Controllers/RequestsPageCountController.cs index 57627e384..8dd1fd602 100644 --- a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegrationWebAPI/Controllers/RequestsPageCountController.cs +++ b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegrationWebAPI/Controllers/RequestsPageCountController.cs @@ -38,6 +38,7 @@ public ActionResult Post([FromBody] List axisRequestIds) } foreach (var requestId in axisRequestIds) { + _logger.Log(LogLevel.Information, string.Format($"axisRequestId for syncing requestPageCount and LANPages: {requestId}")); if (!IsValidRequestId(requestId)) { return BadRequest($"Invalid axisRequestId: {requestId}"); From db5409e3c21a68e02ff54380ef9d2c145a720b7c Mon Sep 17 00:00:00 2001 From: JieunSon96 Date: Tue, 21 May 2024 14:35:23 -0700 Subject: [PATCH 134/147] fixed getting correct ministry version --- .../request_api/models/FOIRequestOIPC.py | 10 +++++++++- .../foirequest/requestserviceministrybuilder.py | 8 ++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/request-management-api/request_api/models/FOIRequestOIPC.py b/request-management-api/request_api/models/FOIRequestOIPC.py index 2d65c413d..8194ce74f 100644 --- a/request-management-api/request_api/models/FOIRequestOIPC.py +++ b/request-management-api/request_api/models/FOIRequestOIPC.py @@ -42,8 +42,16 @@ class FOIRequestOIPC(db.Model): @classmethod def getoipc(cls,ministryrequestid,ministryrequestversion): + latestministryrequestversion = None oipc_schema = FOIRequestOIPCSchema(many=True) - _oipclist = db.session.query(FOIRequestOIPC).filter(FOIRequestOIPC.foiministryrequest_id == ministryrequestid , FOIRequestOIPC.foiministryrequestversion_id == ministryrequestversion).order_by(FOIRequestOIPC.oipcid.asc()).all() + + # Query to get the latest version of FOIRequestOIPC for a given ministryrequestid + _latest_oipc = db.session.query(FOIRequestOIPC).filter(FOIRequestOIPC.foiministryrequest_id == ministryrequestid).order_by(FOIRequestOIPC.foiministryrequestversion_id.desc()).first() + + if _latest_oipc is not None: + latestministryrequestversion=_latest_oipc.foiministryrequestversion_id + + _oipclist = db.session.query(FOIRequestOIPC).filter(FOIRequestOIPC.foiministryrequest_id == ministryrequestid , FOIRequestOIPC.foiministryrequestversion_id == latestministryrequestversion).order_by(FOIRequestOIPC.oipcid.asc()).all() divisioninfos = oipc_schema.dump(_oipclist) return divisioninfos diff --git a/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py b/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py index 9336eb2d2..e1352e990 100644 --- a/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py +++ b/request-management-api/request_api/services/foirequest/requestserviceministrybuilder.py @@ -91,7 +91,7 @@ def createfoiministryrequestfromobject(self, ministryschema, requestschema, user foiministryrequest.closedate = requestdict['closedate'] foiministryrequest.closereasonid = requestdict['closereasonid'] foiministryrequest.isoipcreview = ministryschema["isoipcreview"] - foiministryrequest.oipcreviews = self.createfoirequestoipcs(foiministryrequest.isoipcreview, ministryschema["foirequest_id"], ministryschema["version"]) + foiministryrequest.oipcreviews = self.createfoirequestoipcs(foiministryrequest.isoipcreview, ministryschema["foiministryrequestid"], ministryschema["version"]) return foiministryrequest def __getrequeststatusid(self, requeststatuslabel): @@ -326,13 +326,13 @@ def createfoirequestdivision(self, requestschema, requestid, version, userid): def createfoiassigneefromobject(self, username, firstname, middlename, lastname): return FOIAssignee.saveassignee(username, firstname, middlename, lastname) - def createfoirequestoipcs(self, isoipcreview, requestid, version): - current_oipcs = FOIRequestOIPC.getoipc(requestid, version) + def createfoirequestoipcs(self, isoipcreview, requestMinistryid, version): + current_oipcs = FOIRequestOIPC.getoipc(requestMinistryid, version) if (isoipcreview == True): updated_oipcs = [] for oipc in current_oipcs: oipcreview = FOIRequestOIPC() - oipcreview.foiministryrequest_id = requestid + oipcreview.foiministryrequest_id = requestMinistryid oipcreview.foiministryrequestversion_id = version + 1 oipcreview.oipcno = oipc["oipcno"] oipcreview.reviewtypeid = oipc["reviewtypeid"] From 1793a988af6af44c7b570ffaf2d469e49bb1ddeb Mon Sep 17 00:00:00 2001 From: JieunSon96 Date: Mon, 27 May 2024 14:09:40 -0700 Subject: [PATCH 135/147] fixed displaying request queues on dashboard --- .../request_api/models/FOIMinistryRequests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index 45e71f65e..cb41b37c9 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -662,7 +662,7 @@ def getrequestssubquery(cls, groups, filterfields, keyword, additionalfilter, us ), isouter=True ).filter(or_(FOIMinistryRequest.requeststatuslabel != StateName.closed.name, - and_(FOIMinistryRequest.isoipcreview == True, FOIMinistryRequest.requeststatusid == 3, subquery_with_oipc.c.outcomeid == None))) + and_(FOIMinistryRequest.isoipcreview == True, FOIMinistryRequest.requeststatusid == 3))) From d3c657f0ed5c806ce2d784593705709f30ef100e Mon Sep 17 00:00:00 2001 From: ANTSAND Date: Mon, 27 May 2024 15:06:07 -0700 Subject: [PATCH 136/147] Update RRT notification message --- .../request_api/services/events/attachment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/services/events/attachment.py b/request-management-api/request_api/services/events/attachment.py index f7eba1b1e..41cb05f45 100644 --- a/request-management-api/request_api/services/events/attachment.py +++ b/request-management-api/request_api/services/events/attachment.py @@ -44,7 +44,7 @@ def __createcomment(self, requestid, message, ministryversion, userid, requestty return commentservice().createrawrequestcomment(_comment, userid, 2) def notificationmessage(self, type, ministryrequestid): - return f"{type} Attachment Uploaded on FOI Request {ministryrequestid}" + return f"{type} attachment uploaded" def __notificationtype(self): return "Attachment Upload Event" From 8bd545abff6369dadf3a80acc0c5310d0341ac5a Mon Sep 17 00:00:00 2001 From: nkan-aot2 <156717133+nkan-aot2@users.noreply.github.com> Date: Wed, 29 May 2024 11:54:53 -0700 Subject: [PATCH 137/147] make applicant details editable for business purposes --- forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index 1b95fcfc0..6baa462c2 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -1274,7 +1274,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { handleApplicantDetailsValue } createSaveRequestObject={createSaveRequestObject} - disableInput={disableInput || requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} + disableInput={disableInput /*|| requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} defaultExpanded={!closeApplicantDetails(userDetail, requestDetails?.requestType)} /> {requiredRequestDetailsValues.requestType.toLowerCase() === @@ -1355,7 +1355,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { 0 comment back in after axis decommission*/} + disableInput={disableInput || /*requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} defaultExpanded={true} /> )} From bc6855a2fec99033b5433b63376089f058808362 Mon Sep 17 00:00:00 2001 From: nkan-aot2 <156717133+nkan-aot2@users.noreply.github.com> Date: Wed, 29 May 2024 12:01:30 -0700 Subject: [PATCH 138/147] correct previous commit --- forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index 6baa462c2..4f5a9686a 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -1274,7 +1274,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { handleApplicantDetailsValue } createSaveRequestObject={createSaveRequestObject} - disableInput={disableInput /*|| requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} + disableInput={disableInput || requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} defaultExpanded={!closeApplicantDetails(userDetail, requestDetails?.requestType)} /> {requiredRequestDetailsValues.requestType.toLowerCase() === @@ -1307,7 +1307,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { handleContactDetailsInitialValue } handleContanctDetailsValue={handleContanctDetailsValue} - disableInput={disableInput || requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} + disableInput={disableInput || /*requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} handleEmailValidation={handleEmailValidation} defaultExpanded={!closeContactInfo(userDetail,requestDetails)} moreInfoAction={openApplicantProfileModal} From 2a24a48a92128d468ef55b7ca068f16d7a122182 Mon Sep 17 00:00:00 2001 From: nkan-aot2 <156717133+nkan-aot2@users.noreply.github.com> Date: Wed, 29 May 2024 15:44:33 -0700 Subject: [PATCH 139/147] correct previous correction --- forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index 4f5a9686a..ebd43ee25 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -1307,7 +1307,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { handleContactDetailsInitialValue } handleContanctDetailsValue={handleContanctDetailsValue} - disableInput={disableInput || /*requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} + disableInput={disableInput /* || requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} handleEmailValidation={handleEmailValidation} defaultExpanded={!closeContactInfo(userDetail,requestDetails)} moreInfoAction={openApplicantProfileModal} @@ -1355,7 +1355,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { 0 comment back in after axis decommission*/} + disableInput={disableInput /* || requestDetails?.axisApplicantID /* requestDetails?.foiRequestApplicantID > 0 comment back in after axis decommission*/} defaultExpanded={true} /> )} From daeb87736e73f0f16dcb606b5284feb038bbecbd Mon Sep 17 00:00:00 2001 From: JieunSon96 Date: Tue, 4 Jun 2024 14:09:28 -0700 Subject: [PATCH 140/147] fixed selecting distinct queries based on id --- .../request_api/models/FOIMinistryRequests.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index cb41b37c9..af3a27201 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -408,12 +408,12 @@ def getrequestssubquery(cls, groups, filterfields, keyword, additionalfilter, us #subquery for getting extension count subquery_extension_count = _session.query(FOIRequestExtension.foiministryrequest_id, func.count(distinct(FOIRequestExtension.foirequestextensionid)).filter(FOIRequestExtension.isactive == True).label('extensions')).group_by(FOIRequestExtension.foiministryrequest_id).subquery() - - #subquery for getting all, distinct oipcs for foiministry request + + #subquery for selecting distinct records based on foiministryrequest_id, grouping by foiministryrequestversion_id subquery_with_oipc_sql = """ - SELECT distinct on (foiministryrequest_id) foiministryrequest_id, foiministryrequestversion_id, outcomeid - FROM "FOIRequestOIPC" fo - order by foiministryrequest_id, foiministryrequestversion_id desc + SELECT distinct on (foiministryrequest_id) foiministryrequest_id, foiministryrequestversion_id, + CASE WHEN COUNT(outcomeid) = COUNT(*) THEN MAX(outcomeid) ELSE NULL END AS outcomeid FROM "FOIRequestOIPC" fo GROUP BY foiministryrequest_id, foiministryrequestversion_id + ORDER BY foiministryrequest_id, foiministryrequestversion_id DESC """ subquery_with_oipc = text(subquery_with_oipc_sql).columns(FOIRequestOIPC.foiministryrequest_id, FOIRequestOIPC.foiministryrequestversion_id, FOIRequestOIPC.outcomeid).alias("oipcnoneoutcomes") joincondition_oipc = [ @@ -662,7 +662,7 @@ def getrequestssubquery(cls, groups, filterfields, keyword, additionalfilter, us ), isouter=True ).filter(or_(FOIMinistryRequest.requeststatuslabel != StateName.closed.name, - and_(FOIMinistryRequest.isoipcreview == True, FOIMinistryRequest.requeststatusid == 3))) + and_(FOIMinistryRequest.isoipcreview == True, FOIMinistryRequest.requeststatusid == 3,subquery_with_oipc.c.outcomeid == None))) From 8af383b03b71f5da52f1de351f4758b1f5ef2b97 Mon Sep 17 00:00:00 2001 From: JieunSon96 Date: Wed, 5 Jun 2024 14:04:32 -0700 Subject: [PATCH 141/147] removed count func and replaced with exists to handle null values --- .../request_api/models/FOIMinistryRequests.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/request-management-api/request_api/models/FOIMinistryRequests.py b/request-management-api/request_api/models/FOIMinistryRequests.py index af3a27201..b31d1fc23 100644 --- a/request-management-api/request_api/models/FOIMinistryRequests.py +++ b/request-management-api/request_api/models/FOIMinistryRequests.py @@ -411,9 +411,9 @@ def getrequestssubquery(cls, groups, filterfields, keyword, additionalfilter, us #subquery for selecting distinct records based on foiministryrequest_id, grouping by foiministryrequestversion_id subquery_with_oipc_sql = """ - SELECT distinct on (foiministryrequest_id) foiministryrequest_id, foiministryrequestversion_id, - CASE WHEN COUNT(outcomeid) = COUNT(*) THEN MAX(outcomeid) ELSE NULL END AS outcomeid FROM "FOIRequestOIPC" fo GROUP BY foiministryrequest_id, foiministryrequestversion_id - ORDER BY foiministryrequest_id, foiministryrequestversion_id DESC + SELECT DISTINCT ON (foiministryrequest_id) foiministryrequest_id, foiministryrequestversion_id, + CASE WHEN EXISTS (SELECT 1 FROM "FOIRequestOIPC" WHERE fo.foiministryrequest_id = foiministryrequest_id AND fo.foiministryrequestversion_id = foiministryrequestversion_id AND outcomeid IS NULL) THEN NULL ELSE MAX(outcomeid) END AS outcomeid + FROM "FOIRequestOIPC" fo GROUP BY foiministryrequest_id, foiministryrequestversion_id ORDER BY foiministryrequest_id, foiministryrequestversion_id DESC """ subquery_with_oipc = text(subquery_with_oipc_sql).columns(FOIRequestOIPC.foiministryrequest_id, FOIRequestOIPC.foiministryrequestversion_id, FOIRequestOIPC.outcomeid).alias("oipcnoneoutcomes") joincondition_oipc = [ From 1afd61dcdf42d8629561f3d38a7772091a2834c3 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Mon, 10 Jun 2024 16:25:20 -0700 Subject: [PATCH 142/147] bug fix: wrong page count --- .../MCS.FOI.AXISIntegration.DAL/RequestsDA.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs index c92718d24..f92ab2b46 100644 --- a/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs +++ b/axisintegrationapi/MCS.FOI.AXISIntegration/MCS.FOI.AXISIntegration.DAL/RequestsDA.cs @@ -196,7 +196,7 @@ private DataTable GetAxisRequestData(string request) onbehalf.vcLastName as onbehalfLastName, onbehalf.vcMiddleName as onbehalfMiddleName, (SELECT terminology.vcTerminology from tblTerminologyLookup terminology WHERE terminology.iLabelID = requestTypes.iLabelID and terminology.tiLocaleID = 1) as requestType, - sum(distinct case when requests.IREQUESTID = reviewlog.IREQUESTID and reviewlog.IDOCID = documents.IDOCID then documents.SIPAGECOUNT + sum(case when requests.IREQUESTID = reviewlog.IREQUESTID and reviewlog.IDOCID = documents.IDOCID then documents.SIPAGECOUNT when requests.IREQUESTID = redaction.IREQUESTID and redaction.IDOCID = ldocuments.IDOCID then ldocuments.SIPAGECOUNT else 0 end) as requestPageCount, (case when requestfields.CustomField91 > 0 then requestfields.CustomField91 else 0 end ) as lanPageCount, @@ -353,7 +353,7 @@ private DataTable GetAxisRequestsPageCount(string[] arrayOfRequestId) ConnectionString = SettingsManager.ConnectionString; var inClauseValues = RequestsHelper.GetInClause(arrayOfRequestId); - string query = $@"Select vcVisibleRequestID as axisRequestId, sum(distinct case when requests.IREQUESTID = reviewlog.IREQUESTID and reviewlog.IDOCID = documents.IDOCID then documents.SIPAGECOUNT + string query = $@"Select vcVisibleRequestID as axisRequestId, sum(case when requests.IREQUESTID = reviewlog.IREQUESTID and reviewlog.IDOCID = documents.IDOCID then documents.SIPAGECOUNT when requests.IREQUESTID = redaction.IREQUESTID and redaction.IDOCID = ldocuments.IDOCID then ldocuments.SIPAGECOUNT else 0 end) as requestPageCount, (case when requestfields.CustomField91 > 0 then requestfields.CustomField91 else 0 end ) as lanPageCount @@ -394,7 +394,7 @@ private DataTable GetAxisRequestsPageCount() { ConnectionString = SettingsManager.ConnectionString; - string query = @"Select vcVisibleRequestID as axisRequestId, sum(distinct case when requests.IREQUESTID = reviewlog.IREQUESTID and reviewlog.IDOCID = documents.IDOCID then documents.SIPAGECOUNT + string query = @"Select vcVisibleRequestID as axisRequestId, sum(case when requests.IREQUESTID = reviewlog.IREQUESTID and reviewlog.IDOCID = documents.IDOCID then documents.SIPAGECOUNT when requests.IREQUESTID = redaction.IREQUESTID and redaction.IDOCID = ldocuments.IDOCID then ldocuments.SIPAGECOUNT else 0 end) as requestPageCount, (case when requestfields.CustomField91 > 0 then requestfields.CustomField91 else 0 end ) as lanPageCount From 6584969f99b406dd8965c527e5799e768a6164d2 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 11 Jun 2024 10:55:28 -0700 Subject: [PATCH 143/147] bug fix: axis sync set mod page count to 0 --- forms-flow-web/src/components/FOI/FOIRequest/utils.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/utils.js b/forms-flow-web/src/components/FOI/FOIRequest/utils.js index d06081cee..f981f15eb 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/utils.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/utils.js @@ -440,6 +440,9 @@ export const persistRequestFieldsNotInAxis = (newRequestDetails, existingRequest newRequestDetails.assignedToFirstName= existingRequestDetails.assignedToFirstName; newRequestDetails.assignedToLastName= existingRequestDetails.assignedToLastName; newRequestDetails.assignedToName= existingRequestDetails.assignedToName; + if(existingRequestDetails.recordspagecount && existingRequestDetails.recordspagecount > 0) { + newRequestDetails.recordspagecount= existingRequestDetails.recordspagecount; + } let foiReqAdditionalPersonalInfo = existingRequestDetails.additionalPersonalInfo; let axisAdditionalPersonalInfo = newRequestDetails.additionalPersonalInfo; if(newRequestDetails.requestType === 'personal'){ From 70a77e36ae2ec44acd631012d6fb20a8cf8eb0b0 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 11 Jun 2024 11:29:39 -0700 Subject: [PATCH 144/147] bug fix: axis sync set recordspagecount to 0 --- forms-flow-web/src/components/FOI/FOIRequest/utils.js | 3 --- .../request_api/schemas/foirequestwrapper.py | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/utils.js b/forms-flow-web/src/components/FOI/FOIRequest/utils.js index f981f15eb..d06081cee 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/utils.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/utils.js @@ -440,9 +440,6 @@ export const persistRequestFieldsNotInAxis = (newRequestDetails, existingRequest newRequestDetails.assignedToFirstName= existingRequestDetails.assignedToFirstName; newRequestDetails.assignedToLastName= existingRequestDetails.assignedToLastName; newRequestDetails.assignedToName= existingRequestDetails.assignedToName; - if(existingRequestDetails.recordspagecount && existingRequestDetails.recordspagecount > 0) { - newRequestDetails.recordspagecount= existingRequestDetails.recordspagecount; - } let foiReqAdditionalPersonalInfo = existingRequestDetails.additionalPersonalInfo; let axisAdditionalPersonalInfo = newRequestDetails.additionalPersonalInfo; if(newRequestDetails.requestType === 'personal'){ diff --git a/request-management-api/request_api/schemas/foirequestwrapper.py b/request-management-api/request_api/schemas/foirequestwrapper.py index 67db1d9b0..d41378eb0 100644 --- a/request-management-api/request_api/schemas/foirequestwrapper.py +++ b/request-management-api/request_api/schemas/foirequestwrapper.py @@ -91,6 +91,7 @@ class Meta: # pylint: disable=too-few-public-methods axisSyncDate = fields.Str(data_key="axisSyncDate",allow_none=True) axisRequestId = fields.Str(data_key="axisRequestId",allow_none=True, validate=[validate.Length(max=120, error=MAX_EXCEPTION_MESSAGE)]) axispagecount = fields.Int(data_key="axispagecount",allow_none=True) + recordspagecount = fields.Int(data_key="recordspagecount",allow_none=True) description = fields.Str(data_key="description", required=True,validate=[validate.Length(min=1, error=BLANK_EXCEPTION_MESSAGE)]) category = fields.Str(data_key="category", required=True,validate=[validate.Length(min=1, error=BLANK_EXCEPTION_MESSAGE)]) requestType = fields.Str(data_key="requestType", required=True,validate=[validate.Length(min=1, error=BLANK_EXCEPTION_MESSAGE)]) From 6670c49af8594fb311e283dab05b3fa5714b099c Mon Sep 17 00:00:00 2001 From: nkan-aot2 <156717133+nkan-aot2@users.noreply.github.com> Date: Thu, 13 Jun 2024 14:55:12 -0700 Subject: [PATCH 145/147] fix redaction summary not showing up in request details --- forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js index ebd43ee25..c472636c0 100644 --- a/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js +++ b/forms-flow-web/src/components/FOI/FOIRequest/FOIRequest.js @@ -321,7 +321,7 @@ const FOIRequest = React.memo(({ userDetail, openApplicantProfileModal }) => { dispatch( fetchRedactedSections(ministryId, (_err, res) => { if (!_err) { - setRedactedSections(res.sections); + setRedactedSections(res); } }) ); From c9cba48567ac5563514cbf7bcc3bbe2651605d2e Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 5 Jun 2024 15:31:03 -0700 Subject: [PATCH 146/147] fix recordspagecount and axislanpagecount not being copied over during version increase --- request-management-api/request_api/schemas/foirequestwrapper.py | 2 ++ .../request_api/services/foirequest/requestservicebuilder.py | 1 + .../request_api/services/foirequest/requestservicegetter.py | 1 + 3 files changed, 4 insertions(+) diff --git a/request-management-api/request_api/schemas/foirequestwrapper.py b/request-management-api/request_api/schemas/foirequestwrapper.py index d41378eb0..a5d528bde 100644 --- a/request-management-api/request_api/schemas/foirequestwrapper.py +++ b/request-management-api/request_api/schemas/foirequestwrapper.py @@ -156,6 +156,8 @@ class Meta: # pylint: disable=too-few-public-methods oipcdetails = fields.Nested(FOIMinistryRequestOIPCSchema, many=True,allow_none=True) + recordspagecount = fields.Int(data_key="recordspagecount",allow_none=True) + axislanpagecount = fields.Int(data_key="axislanpagecount",allow_none=True) class EditableFOIMinistryRequestWrapperSchema(Schema): class Meta: # pylint: disable=too-few-public-methods diff --git a/request-management-api/request_api/services/foirequest/requestservicebuilder.py b/request-management-api/request_api/services/foirequest/requestservicebuilder.py index 76d349644..31dca5387 100644 --- a/request-management-api/request_api/services/foirequest/requestservicebuilder.py +++ b/request-management-api/request_api/services/foirequest/requestservicebuilder.py @@ -31,6 +31,7 @@ def createministry(self, requestschema, ministry, activeversion, userid, filenum foiministryrequest.axisrequestid = requestschema.get("axisRequestId") foiministryrequest.axissyncdate = requestschema.get("axisSyncDate") foiministryrequest.axispagecount = requestschema.get("axispagecount") + foiministryrequest.axislanpagecount = requestschema.get("axislanpagecount") foiministryrequest.recordspagecount = requestschema.get("recordspagecount") foiministryrequest.filenumber = self.generatefilenumber(ministry["code"], requestschema.get("foirawrequestid")) if filenumber is None else filenumber foiministryrequest.programareaid = self.getvalueof("programArea",ministry["code"]) diff --git a/request-management-api/request_api/services/foirequest/requestservicegetter.py b/request-management-api/request_api/services/foirequest/requestservicegetter.py index 1e7410772..acfaa297f 100644 --- a/request-management-api/request_api/services/foirequest/requestservicegetter.py +++ b/request-management-api/request_api/services/foirequest/requestservicegetter.py @@ -160,6 +160,7 @@ def __preparebaseinfo(self,request,foiministryrequestid,requestministry,requestm 'axisSyncDate': parse(requestministry["axissyncdate"]).strftime('%Y-%m-%d %H:%M:%S.%f') if axissyncdatenoneorempty == False else None, 'axispagecount': int(requestministry["axispagecount"]) if requestministry["axispagecount"] is not None else 0 , 'recordspagecount': int(requestministry["recordspagecount"]) if requestministry["recordspagecount"] is not None else 0 , + 'axislanpagecount': int(requestministry["axislanpagecount"]) if requestministry["axislanpagecount"] is not None else 0 , 'description': requestministry['description'], 'fromDate': parse(requestministry['recordsearchfromdate']).strftime(self.__genericdateformat()) if requestministry['recordsearchfromdate'] is not None else '', 'toDate': parse(requestministry['recordsearchtodate']).strftime(self.__genericdateformat()) if requestministry['recordsearchtodate'] is not None else '', From 94838571994eded9528efe7e1079d0c0c26b5b4a Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 9 Jul 2024 17:42:00 -0700 Subject: [PATCH 147/147] resolve migration conflict --- .../migrations/versions/d1d4f6cdfd68_cfd_personal_tags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/migrations/versions/d1d4f6cdfd68_cfd_personal_tags.py b/request-management-api/migrations/versions/d1d4f6cdfd68_cfd_personal_tags.py index 92b7887fc..ea55ebf15 100644 --- a/request-management-api/migrations/versions/d1d4f6cdfd68_cfd_personal_tags.py +++ b/request-management-api/migrations/versions/d1d4f6cdfd68_cfd_personal_tags.py @@ -11,7 +11,7 @@ # revision identifiers, used by Alembic. revision = 'd1d4f6cdfd68' -down_revision = '10aa6d69aeed' +down_revision = 'e698b39da6bd' branch_labels = None depends_on = None
U-000''' + alert['request']['requestid'] + '''
U-000''' + alert['request']['requestid'] + '''U-000''' + str(alert['request']['requestid']) + ''' ''' + alert['request']['requestrawdata']['contactInfo']['lastName'] + ''' ''' + alert['request']['requestrawdata']['contactInfo']['firstName'] + ''' ''' + alert['request']['paymentstatus'] + '''
U-000''' + alert['request']['requestid'] + '''U-000''' + str(alert['request']['requestid']) + ''' ''' + alert['request']['requestrawdata']['contactInfo']['lastName'] + ''' ''' + alert['request']['requestrawdata']['contactInfo']['firstName'] + ''' ''' + alert['request']['paymentstatus'] + ''' ''' for m in alert['potentialmatches']: - emailhtml += (m['requestid'] + " - similarity: " + m['similarity'] + "
") + emailhtml += (str(m['requestid']) + " - similarity: " + m['similarity'] + "
") emailhtml = emailhtml[:4] emailhtml += '''
''' + alert['request']['requestrawdata']['descriptionTimeframe']['description'][0:99] + '''...U-000''' + str(alert['request']['requestid']) + ''' ''' + alert['request']['requestrawdata']['contactInfo']['lastName'] + ''' ''' + alert['request']['requestrawdata']['contactInfo']['firstName'] + '''''' + alert['request']['paymentstatus'] + '''''' + alert['request'].get('paymentstatus', "") + ''' ''' + alert['request']['requestrawdata']['descriptionTimeframe']['description'][0:99] + '''...
U-000''' + str(alert['request']['requestid']) + ''' ''' + alert['request']['requestrawdata']['contactInfo']['lastName'] + ''' ''' + alert['request']['requestrawdata']['contactInfo']['firstName'] + '''''' + alert['request']['paymentstatus'] + '''''' + alert['request'].get('paymentstatus', "") + ''' ''' for m in alert['potentialmatches']: From 79896d5fa67d037e897a80c672d13d9e07641718 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 8 Feb 2024 18:31:53 -0800 Subject: [PATCH 072/147] fix empty payment status at query level --- request-management-api/request_api/models/FOIRawRequests.py | 4 ++-- .../request_api/services/unopenedreportservice.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/request-management-api/request_api/models/FOIRawRequests.py b/request-management-api/request_api/models/FOIRawRequests.py index 849e017e3..aee8b940f 100644 --- a/request-management-api/request_api/models/FOIRawRequests.py +++ b/request-management-api/request_api/models/FOIRawRequests.py @@ -1103,7 +1103,7 @@ def getlatestsection5pendings(cls): def getunopenedunactionedrequests(cls, startdate, enddate): try: requests = [] - sql = '''select rr.created_at, rr.requestrawdata, rr.requestid, p.status from public."FOIRawRequests" rr + sql = '''select rr.created_at, rr.requestrawdata, rr.requestid, coalesce(p.status, '') as status from public."FOIRawRequests" rr join ( select max(version) as version, requestid from public."FOIRawRequests" group by requestid @@ -1115,7 +1115,7 @@ def getunopenedunactionedrequests(cls, startdate, enddate): order by request_id ) mp on mp.request_id = rr.requestid left join public."Payments" p on p.payment_id = mp.max - where status = 'Unopened' and rr.version = 1 and created_at > :startdate and created_at < :enddate + where rr.status = 'Unopened' and rr.version = 1 and created_at > :startdate and created_at < :enddate order by rr.requestid ''' rs = db.session.execute(text(sql), {'startdate': startdate, 'enddate': enddate}) for row in rs: diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index 0579409e1..4aa0052cb 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -88,7 +88,7 @@ def generateemailhtml(self, alerts): U-000''' + str(alert['request']['requestid']) + ''' ''' + alert['request']['requestrawdata']['contactInfo']['lastName'] + ''' ''' + alert['request']['requestrawdata']['contactInfo']['firstName'] + '''''' + alert['request'].get('paymentstatus', "") + '''''' + alert['request']['paymentstatus'] + ''' ''' + alert['request']['requestrawdata']['descriptionTimeframe']['description'][0:99] + '''...
U-000''' + str(alert['request']['requestid']) + ''' ''' + alert['request']['requestrawdata']['contactInfo']['lastName'] + ''' ''' + alert['request']['requestrawdata']['contactInfo']['firstName'] + '''''' + alert['request'].get('paymentstatus', "") + '''''' + alert['request']['paymentstatus'] + ''' ''' for m in alert['potentialmatches']: From 034ce04a57b55e76c3f7c1327ca9a99485af6d33 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 9 Feb 2024 11:20:14 -0800 Subject: [PATCH 073/147] fix data type for similarity score --- .../request_api/services/unopenedreportservice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/request-management-api/request_api/services/unopenedreportservice.py b/request-management-api/request_api/services/unopenedreportservice.py index 4aa0052cb..94e13fa7d 100644 --- a/request-management-api/request_api/services/unopenedreportservice.py +++ b/request-management-api/request_api/services/unopenedreportservice.py @@ -119,7 +119,7 @@ def generateemailhtml(self, alerts): ''' for m in alert['potentialmatches']: - emailhtml += (str(m['requestid']) + " - similarity: " + m['similarity'] + "
") + emailhtml += (str(m['requestid']) + " - similarity: " + str(m['similarity']) + "
") emailhtml = emailhtml[:4] emailhtml += '''
''' + alert['request']['requestrawdata']['descriptionTimeframe']['description'][0:99] + '''...''' + alert['request']['paymentstatus'] + ''' ''' - for m in alert['potentialmatches']: - emailhtml += (str(m['requestid']) + " - similarity: " + str(m['similarity']) + "
") + for m in alert['potentialmatches']['matches']: + emailhtml += (m['requestid'] + " - similarity: " + str(m['similarity']) + "
") emailhtml = emailhtml[:4] emailhtml += '''
''' + alert['request']['requestrawdata']['descriptionTimeframe']['description'][0:99] + '''...''' + alert['request']['requestrawdata']['descriptionTimeframe']['description'][0:99] + '''...