From c837046eedec22ed0481824802399a6266da81f5 Mon Sep 17 00:00:00 2001 From: Jad Date: Tue, 12 Nov 2024 16:03:58 -0800 Subject: [PATCH 1/4] Add get submission item for staff --- .../src/submit_api/resources/__init__.py | 2 + .../src/submit_api/resources/staff/item.py | 55 +++++++++++++++++++ submit-api/src/submit_api/services/item.py | 3 +- 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 submit-api/src/submit_api/resources/staff/item.py diff --git a/submit-api/src/submit_api/resources/__init__.py b/submit-api/src/submit_api/resources/__init__.py index ec024721..edfb0525 100644 --- a/submit-api/src/submit_api/resources/__init__.py +++ b/submit-api/src/submit_api/resources/__init__.py @@ -33,6 +33,7 @@ from .proponent.user import API as USER_API from .staff.package import API as STAFF_PACKAGE_API from .staff.project import API as STAFF_PROJECT_API +from .staff.item import API as STAFF_ITEM_API __all__ = ('API_BLUEPRINT', 'OPS_BLUEPRINT', 'STAFF_API_BLUEPRINT') @@ -76,3 +77,4 @@ STAFF_API.add_namespace(STAFF_PROJECT_API) STAFF_API.add_namespace(STAFF_PACKAGE_API) +STAFF_API.add_namespace(STAFF_ITEM_API) diff --git a/submit-api/src/submit_api/resources/staff/item.py b/submit-api/src/submit_api/resources/staff/item.py new file mode 100644 index 00000000..9ab35ce1 --- /dev/null +++ b/submit-api/src/submit_api/resources/staff/item.py @@ -0,0 +1,55 @@ +# Copyright © 2024 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 an item resource.""" + +from http import HTTPStatus + +from flask_restx import Namespace, Resource, cors + +from submit_api.schemas.item import StaffItemSchema +from submit_api.services.item import ItemService +from submit_api.utils.util import cors_preflight + +from submit_api.auth import auth +from submit_api.resources.apihelper import Api as ApiHelper + + +API = Namespace("items", description="Endpoints for item Management") +"""Custom exception messages +""" + +item_model = ApiHelper.convert_ma_schema_to_restx_model( + API, StaffItemSchema(), "Submission item" +) + + +@cors_preflight("GET, OPTIONS") +@API.route("/", methods=["GET", "OPTIONS"]) +class Item(Resource): + """Resource for managing projects.""" + + @staticmethod + @ApiHelper.swagger_decorators( + API, endpoint_description="Get item by id" + ) + @API.response( + code=HTTPStatus.OK, model=item_model, description="Submission item" + ) + @API.response(HTTPStatus.BAD_REQUEST, "Bad Request") + @cors.crossdomain(origin="*") + @auth.require + def get(item_id): + """Get item by id.""" + projects = ItemService.get_item_by_id(item_id) + return StaffItemSchema().dump(projects), HTTPStatus.OK diff --git a/submit-api/src/submit_api/services/item.py b/submit-api/src/submit_api/services/item.py index 6726ad57..5d757ed6 100644 --- a/submit-api/src/submit_api/services/item.py +++ b/submit-api/src/submit_api/services/item.py @@ -10,8 +10,7 @@ class ItemService: @classmethod def get_item_by_id(cls, item_id) -> ItemModel: """Get item by id.""" - item = ItemModel.find_by_id(item_id) - return item + return ItemModel.find_by_id(item_id) @staticmethod def _apply_update_data(submission_item, update_data): From 19b62f3430bda3e7a2962c025e99c98572e14161 Mon Sep 17 00:00:00 2001 From: Jad Date: Tue, 12 Nov 2024 16:04:47 -0800 Subject: [PATCH 2/4] Run isort --- .../migrations/versions/5bf7b1f9a81c_email_queue_added.py | 2 +- .../versions/df9c90534e9d_internal_staff_doc_added.py | 2 +- submit-api/src/submit_api/__init__.py | 4 ++-- submit-api/src/submit_api/models/__init__.py | 4 ++-- submit-api/src/submit_api/resources/__init__.py | 2 +- submit-api/src/submit_api/resources/proponent/account.py | 5 ++--- submit-api/src/submit_api/resources/proponent/item.py | 5 ++--- submit-api/src/submit_api/resources/proponent/package.py | 5 ++--- submit-api/src/submit_api/resources/proponent/project.py | 5 ++--- submit-api/src/submit_api/resources/proponent/submission.py | 5 ++--- submit-api/src/submit_api/resources/staff/item.py | 5 ++--- submit-api/tests/conftest.py | 4 ++-- .../tests/utilities/factory_scenario/project_scenario.py | 3 +++ 13 files changed, 24 insertions(+), 27 deletions(-) diff --git a/submit-api/migrations/versions/5bf7b1f9a81c_email_queue_added.py b/submit-api/migrations/versions/5bf7b1f9a81c_email_queue_added.py index fb7d50eb..84450b42 100644 --- a/submit-api/migrations/versions/5bf7b1f9a81c_email_queue_added.py +++ b/submit-api/migrations/versions/5bf7b1f9a81c_email_queue_added.py @@ -5,8 +5,8 @@ Create Date: 2024-10-30 07:23:40.214720 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. diff --git a/submit-api/migrations/versions/df9c90534e9d_internal_staff_doc_added.py b/submit-api/migrations/versions/df9c90534e9d_internal_staff_doc_added.py index 5521d2d3..7f813f3a 100644 --- a/submit-api/migrations/versions/df9c90534e9d_internal_staff_doc_added.py +++ b/submit-api/migrations/versions/df9c90534e9d_internal_staff_doc_added.py @@ -5,8 +5,8 @@ Create Date: 2024-11-08 14:09:53.880062 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. diff --git a/submit-api/src/submit_api/__init__.py b/submit-api/src/submit_api/__init__.py index 6e4c9252..947e02a9 100644 --- a/submit-api/src/submit_api/__init__.py +++ b/submit-api/src/submit_api/__init__.py @@ -43,8 +43,8 @@ def create_app(run_mode=os.getenv('FLASK_ENV', 'development')): """Create flask app.""" - from submit_api.resources import (API_BLUEPRINT, OPS_BLUEPRINT, # pylint: disable=import-outside-toplevel - STAFF_API_BLUEPRINT) + from submit_api.resources import ( # pylint: disable=import-outside-toplevel + API_BLUEPRINT, OPS_BLUEPRINT, STAFF_API_BLUEPRINT) # Flask app initialize app = Flask(__name__) diff --git a/submit-api/src/submit_api/models/__init__.py b/submit-api/src/submit_api/models/__init__.py index bd9751ce..677092d3 100644 --- a/submit-api/src/submit_api/models/__init__.py +++ b/submit-api/src/submit_api/models/__init__.py @@ -20,11 +20,12 @@ from .account_user import AccountUser from .base_model import BaseModel from .db import db, ma, migrate +from .email_queue import EmailQueue from .item import Item from .item_type import ItemType from .package import Package -from .package_metadata import PackageMetadata from .package_item_type import PackageItemType +from .package_metadata import PackageMetadata from .package_type import PackageType from .project import Project from .project_team import ProjectTeam @@ -33,4 +34,3 @@ from .submitted_document import SubmittedDocument from .submitted_form import SubmittedForm from .user import User -from .email_queue import EmailQueue diff --git a/submit-api/src/submit_api/resources/__init__.py b/submit-api/src/submit_api/resources/__init__.py index edfb0525..07cb8129 100644 --- a/submit-api/src/submit_api/resources/__init__.py +++ b/submit-api/src/submit_api/resources/__init__.py @@ -31,9 +31,9 @@ from .proponent.project import API as PROJECT_API from .proponent.submission import API as SUBMISSION_API from .proponent.user import API as USER_API +from .staff.item import API as STAFF_ITEM_API from .staff.package import API as STAFF_PACKAGE_API from .staff.project import API as STAFF_PROJECT_API -from .staff.item import API as STAFF_ITEM_API __all__ = ('API_BLUEPRINT', 'OPS_BLUEPRINT', 'STAFF_API_BLUEPRINT') diff --git a/submit-api/src/submit_api/resources/proponent/account.py b/submit-api/src/submit_api/resources/proponent/account.py index 51b3d684..350f3c37 100644 --- a/submit-api/src/submit_api/resources/proponent/account.py +++ b/submit-api/src/submit_api/resources/proponent/account.py @@ -17,14 +17,13 @@ from flask_restx import Namespace, Resource, cors +from submit_api.auth import auth from submit_api.exceptions import ResourceNotFoundError +from submit_api.resources.apihelper import Api as ApiHelper from submit_api.schemas.account import AccountCreateSchema, AccountSchema from submit_api.services.account_service import AccountService from submit_api.utils.util import cors_preflight -from submit_api.auth import auth -from submit_api.resources.apihelper import Api as ApiHelper - API = Namespace("accounts", description="Endpoints for Account Management") """Custom exception messages diff --git a/submit-api/src/submit_api/resources/proponent/item.py b/submit-api/src/submit_api/resources/proponent/item.py index 69c7114f..2093eea0 100644 --- a/submit-api/src/submit_api/resources/proponent/item.py +++ b/submit-api/src/submit_api/resources/proponent/item.py @@ -17,13 +17,12 @@ from flask_restx import Namespace, Resource, cors +from submit_api.auth import auth +from submit_api.resources.apihelper import Api as ApiHelper from submit_api.schemas.item import ItemSchema from submit_api.services.item import ItemService from submit_api.utils.util import cors_preflight -from submit_api.auth import auth -from submit_api.resources.apihelper import Api as ApiHelper - API = Namespace("items", description="Endpoints for item Management") """Custom exception messages diff --git a/submit-api/src/submit_api/resources/proponent/package.py b/submit-api/src/submit_api/resources/proponent/package.py index 665c3315..d23de701 100644 --- a/submit-api/src/submit_api/resources/proponent/package.py +++ b/submit-api/src/submit_api/resources/proponent/package.py @@ -17,13 +17,12 @@ from flask_restx import Namespace, Resource, cors +from submit_api.auth import auth +from submit_api.resources.apihelper import Api as ApiHelper from submit_api.schemas.package import PackageSchema, PostPackageRequestSchema, PostPackageState from submit_api.services.package import PackageService from submit_api.utils.util import cors_preflight -from submit_api.auth import auth -from submit_api.resources.apihelper import Api as ApiHelper - API = Namespace("packages", description="Endpoints for Package Management") """Custom exception messages diff --git a/submit-api/src/submit_api/resources/proponent/project.py b/submit-api/src/submit_api/resources/proponent/project.py index 2c1bc10a..988b895d 100644 --- a/submit-api/src/submit_api/resources/proponent/project.py +++ b/submit-api/src/submit_api/resources/proponent/project.py @@ -18,15 +18,14 @@ from flask import request from flask_restx import Namespace, Resource, cors +from submit_api.auth import auth from submit_api.models.account_project_search_options import AccountProjectSearchOptions from submit_api.models.package import PackageStatus +from submit_api.resources.apihelper import Api as ApiHelper from submit_api.schemas.project import AccountProjectSchema, AddProjectSchema, ProjectSchema from submit_api.services.project_service import ProjectService from submit_api.utils.util import cors_preflight -from submit_api.auth import auth -from submit_api.resources.apihelper import Api as ApiHelper - API = Namespace("projects", description="Endpoints for Project Management") """Custom exception messages diff --git a/submit-api/src/submit_api/resources/proponent/submission.py b/submit-api/src/submit_api/resources/proponent/submission.py index 7b89b50a..ad96f572 100644 --- a/submit-api/src/submit_api/resources/proponent/submission.py +++ b/submit-api/src/submit_api/resources/proponent/submission.py @@ -17,13 +17,12 @@ from flask_restx import Namespace, Resource, cors +from submit_api.auth import auth +from submit_api.resources.apihelper import Api as ApiHelper from submit_api.schemas.submission import CreateSubmissionRequestSchema, SubmissionSchema from submit_api.services.submission import SubmissionService from submit_api.utils.util import cors_preflight -from submit_api.auth import auth -from submit_api.resources.apihelper import Api as ApiHelper - API = Namespace("submissions", description="Endpoints for Submission Management") """Custom exception messages diff --git a/submit-api/src/submit_api/resources/staff/item.py b/submit-api/src/submit_api/resources/staff/item.py index 9ab35ce1..addc427c 100644 --- a/submit-api/src/submit_api/resources/staff/item.py +++ b/submit-api/src/submit_api/resources/staff/item.py @@ -17,13 +17,12 @@ from flask_restx import Namespace, Resource, cors +from submit_api.auth import auth +from submit_api.resources.apihelper import Api as ApiHelper from submit_api.schemas.item import StaffItemSchema from submit_api.services.item import ItemService from submit_api.utils.util import cors_preflight -from submit_api.auth import auth -from submit_api.resources.apihelper import Api as ApiHelper - API = Namespace("items", description="Endpoints for item Management") """Custom exception messages diff --git a/submit-api/tests/conftest.py b/submit-api/tests/conftest.py index 1464799b..7a447358 100644 --- a/submit-api/tests/conftest.py +++ b/submit-api/tests/conftest.py @@ -22,9 +22,9 @@ from sqlalchemy import event, text from src.submit_api import create_app -from src.submit_api.auth import jwt as _jwt -from src.submit_api import get_named_config from src.submit_api import db as _db +from src.submit_api import get_named_config +from src.submit_api.auth import jwt as _jwt from .utilities.factory_scenario import TokenJWTClaims from .utilities.factory_utils import factory_auth_header diff --git a/submit-api/tests/utilities/factory_scenario/project_scenario.py b/submit-api/tests/utilities/factory_scenario/project_scenario.py index 379d61c3..0b456129 100644 --- a/submit-api/tests/utilities/factory_scenario/project_scenario.py +++ b/submit-api/tests/utilities/factory_scenario/project_scenario.py @@ -1,8 +1,11 @@ """Module for defining various project scenarios for testing with realistic data.""" from enum import Enum + from faker import Faker + from src.submit_api.models import Project as ProjectModel + fake = Faker() From 4f271f95eefd47c2fd4437d75ff032cbbc16eb39 Mon Sep 17 00:00:00 2001 From: Jad Date: Tue, 12 Nov 2024 16:52:35 -0800 Subject: [PATCH 3/4] Add folder for the s3 path when we do document upload --- submit-web/package-lock.json | 297 ++++++++++-------- submit-web/package.json | 1 + .../DocumentUpload/DocumentTable.tsx | 12 +- .../DocumentUpload/PendingDocumentRow.tsx | 1 + .../DocumentUploadSection.tsx | 31 +- .../DocumentUploadSection.tsx | 40 ++- submit-web/src/hooks/api/useObjectStorage.tsx | 9 + 7 files changed, 232 insertions(+), 159 deletions(-) diff --git a/submit-web/package-lock.json b/submit-web/package-lock.json index 3c9da217..311a9106 100644 --- a/submit-web/package-lock.json +++ b/submit-web/package-lock.json @@ -20,6 +20,7 @@ "@tanstack/router-plugin": "^1.45.7", "@types/react-input-mask": "^3.0.5", "axios": "^1.7.2", + "change-case": "^5.4.4", "dayjs": "^1.11.13", "epic.theme": "latest", "keycloak-js": "^25.0.1", @@ -3405,9 +3406,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", - "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.25.0.tgz", + "integrity": "sha512-CC/ZqFZwlAIbU1wUPisHyV/XRc5RydFrNLtgl3dGYskdwPZdt4HERtKm50a/+DtTlKeCq9IXFEWR+P6blwjqBA==", "cpu": [ "arm" ], @@ -3418,9 +3419,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", - "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.25.0.tgz", + "integrity": "sha512-/Y76tmLGUJqVBXXCfVS8Q8FJqYGhgH4wl4qTA24E9v/IJM0XvJCGQVSW1QZ4J+VURO9h8YCa28sTFacZXwK7Rg==", "cpu": [ "arm64" ], @@ -3431,9 +3432,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", - "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.25.0.tgz", + "integrity": "sha512-YVT6L3UrKTlC0FpCZd0MGA7NVdp7YNaEqkENbWQ7AOVOqd/7VzyHpgIpc1mIaxRAo1ZsJRH45fq8j4N63I/vvg==", "cpu": [ "arm64" ], @@ -3444,9 +3445,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", - "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.25.0.tgz", + "integrity": "sha512-ZRL+gexs3+ZmmWmGKEU43Bdn67kWnMeWXLFhcVv5Un8FQcx38yulHBA7XR2+KQdYIOtD0yZDWBCudmfj6lQJoA==", "cpu": [ "x64" ], @@ -3456,10 +3457,36 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.25.0.tgz", + "integrity": "sha512-xpEIXhiP27EAylEpreCozozsxWQ2TJbOLSivGfXhU4G1TBVEYtUPi2pOZBnvGXHyOdLAUUhPnJzH3ah5cqF01g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.25.0.tgz", + "integrity": "sha512-sC5FsmZGlJv5dOcURrsnIK7ngc3Kirnx3as2XU9uER+zjfyqIjdcMVgzy4cOawhsssqzoAX19qmxgJ8a14Qrqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", - "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.25.0.tgz", + "integrity": "sha512-uD/dbLSs1BEPzg564TpRAQ/YvTnCds2XxyOndAO8nJhaQcqQGFgv/DAVko/ZHap3boCvxnzYMa3mTkV/B/3SWA==", "cpu": [ "arm" ], @@ -3470,9 +3497,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", - "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.25.0.tgz", + "integrity": "sha512-ZVt/XkrDlQWegDWrwyC3l0OfAF7yeJUF4fq5RMS07YM72BlSfn2fQQ6lPyBNjt+YbczMguPiJoCfaQC2dnflpQ==", "cpu": [ "arm" ], @@ -3483,9 +3510,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", - "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.25.0.tgz", + "integrity": "sha512-qboZ+T0gHAW2kkSDPHxu7quaFaaBlynODXpBVnPxUgvWYaE84xgCKAPEYE+fSMd3Zv5PyFZR+L0tCdYCMAtG0A==", "cpu": [ "arm64" ], @@ -3496,9 +3523,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", - "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.25.0.tgz", + "integrity": "sha512-ndWTSEmAaKr88dBuogGH2NZaxe7u2rDoArsejNslugHZ+r44NfWiwjzizVS1nUOHo+n1Z6qV3X60rqE/HlISgw==", "cpu": [ "arm64" ], @@ -3509,9 +3536,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", - "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.25.0.tgz", + "integrity": "sha512-BVSQvVa2v5hKwJSy6X7W1fjDex6yZnNKy3Kx1JGimccHft6HV0THTwNtC2zawtNXKUu+S5CjXslilYdKBAadzA==", "cpu": [ "ppc64" ], @@ -3522,9 +3549,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", - "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.25.0.tgz", + "integrity": "sha512-G4hTREQrIdeV0PE2JruzI+vXdRnaK1pg64hemHq2v5fhv8C7WjVaeXc9P5i4Q5UC06d/L+zA0mszYIKl+wY8oA==", "cpu": [ "riscv64" ], @@ -3535,9 +3562,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", - "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.25.0.tgz", + "integrity": "sha512-9T/w0kQ+upxdkFL9zPVB6zy9vWW1deA3g8IauJxojN4bnz5FwSsUAD034KpXIVX5j5p/rn6XqumBMxfRkcHapQ==", "cpu": [ "s390x" ], @@ -3548,9 +3575,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", - "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.25.0.tgz", + "integrity": "sha512-ThcnU0EcMDn+J4B9LD++OgBYxZusuA7iemIIiz5yzEcFg04VZFzdFjuwPdlURmYPZw+fgVrFzj4CA64jSTG4Ig==", "cpu": [ "x64" ], @@ -3561,9 +3588,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", - "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.25.0.tgz", + "integrity": "sha512-zx71aY2oQxGxAT1JShfhNG79PnjYhMC6voAjzpu/xmMjDnKNf6Nl/xv7YaB/9SIa9jDYf8RBPWEnjcdlhlv1rQ==", "cpu": [ "x64" ], @@ -3574,9 +3601,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", - "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.25.0.tgz", + "integrity": "sha512-JT8tcjNocMs4CylWY/CxVLnv8e1lE7ff1fi6kbGocWwxDq9pj30IJ28Peb+Y8yiPNSF28oad42ApJB8oUkwGww==", "cpu": [ "arm64" ], @@ -3587,9 +3614,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", - "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.25.0.tgz", + "integrity": "sha512-dRLjLsO3dNOfSN6tjyVlG+Msm4IiZnGkuZ7G5NmpzwF9oOc582FZG05+UdfTbz5Jd4buK/wMb6UeHFhG18+OEg==", "cpu": [ "ia32" ], @@ -3600,9 +3627,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", - "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.25.0.tgz", + "integrity": "sha512-/RqrIFtLB926frMhZD0a5oDa4eFIbyNEwLLloMTEjmqfwZWXywwVVOVmwTsuyhC9HKkVEZcOOi+KV4U9wmOdlg==", "cpu": [ "x64" ], @@ -4102,9 +4129,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "devOptional": true }, "node_modules/@types/json-schema": { @@ -4716,9 +4743,9 @@ "peer": true }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { "acorn": "bin/acorn" }, @@ -4726,16 +4753,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "devOptional": true, - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -5006,9 +5023,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", - "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -5179,9 +5196,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "funding": [ { "type": "opencollective", @@ -5197,10 +5214,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -5310,9 +5327,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001649", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", - "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", "funding": [ { "type": "opencollective", @@ -5355,6 +5372,11 @@ "node": ">=0.8.0" } }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==" + }, "node_modules/check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -5975,9 +5997,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", - "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==" + "version": "1.5.57", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.57.tgz", + "integrity": "sha512-xS65H/tqgOwUBa5UmOuNSLuslDo7zho0y/lgQw35pnrqiZh7UOWHCeL/Bt6noJATbA6tpQJGCifsFsIRZj1Fqg==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -6117,9 +6139,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -8208,9 +8230,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { "braces": "^3.0.3", @@ -8732,9 +8754,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -8861,9 +8883,9 @@ } }, "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "devOptional": true, "funding": [ { @@ -8881,8 +8903,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -9577,12 +9599,12 @@ } }, "node_modules/rollup": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", - "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.25.0.tgz", + "integrity": "sha512-uVbClXmR6wvx5R1M3Od4utyLUxrmOcEm3pAtMphn73Apq19PDtHpgZoEvqH2YnnaNUuvKmg2DgRd2Sqv+odyqg==", "devOptional": true, "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -9592,22 +9614,24 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.20.0", - "@rollup/rollup-android-arm64": "4.20.0", - "@rollup/rollup-darwin-arm64": "4.20.0", - "@rollup/rollup-darwin-x64": "4.20.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", - "@rollup/rollup-linux-arm-musleabihf": "4.20.0", - "@rollup/rollup-linux-arm64-gnu": "4.20.0", - "@rollup/rollup-linux-arm64-musl": "4.20.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", - "@rollup/rollup-linux-riscv64-gnu": "4.20.0", - "@rollup/rollup-linux-s390x-gnu": "4.20.0", - "@rollup/rollup-linux-x64-gnu": "4.20.0", - "@rollup/rollup-linux-x64-musl": "4.20.0", - "@rollup/rollup-win32-arm64-msvc": "4.20.0", - "@rollup/rollup-win32-ia32-msvc": "4.20.0", - "@rollup/rollup-win32-x64-msvc": "4.20.0", + "@rollup/rollup-android-arm-eabi": "4.25.0", + "@rollup/rollup-android-arm64": "4.25.0", + "@rollup/rollup-darwin-arm64": "4.25.0", + "@rollup/rollup-darwin-x64": "4.25.0", + "@rollup/rollup-freebsd-arm64": "4.25.0", + "@rollup/rollup-freebsd-x64": "4.25.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.25.0", + "@rollup/rollup-linux-arm-musleabihf": "4.25.0", + "@rollup/rollup-linux-arm64-gnu": "4.25.0", + "@rollup/rollup-linux-arm64-musl": "4.25.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.25.0", + "@rollup/rollup-linux-riscv64-gnu": "4.25.0", + "@rollup/rollup-linux-s390x-gnu": "4.25.0", + "@rollup/rollup-linux-x64-gnu": "4.25.0", + "@rollup/rollup-linux-x64-musl": "4.25.0", + "@rollup/rollup-win32-arm64-msvc": "4.25.0", + "@rollup/rollup-win32-ia32-msvc": "4.25.0", + "@rollup/rollup-win32-x64-msvc": "4.25.0", "fsevents": "~2.3.2" } }, @@ -9902,9 +9926,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "devOptional": true, "engines": { "node": ">=0.10.0" @@ -10445,9 +10469,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -10463,8 +10487,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -10524,14 +10548,14 @@ } }, "node_modules/vite": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "devOptional": true, "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -10550,6 +10574,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -10567,6 +10592,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -10756,22 +10784,21 @@ } }, "node_modules/webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", "devOptional": true, "peer": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", diff --git a/submit-web/package.json b/submit-web/package.json index b3f2d14c..b63c7eca 100644 --- a/submit-web/package.json +++ b/submit-web/package.json @@ -24,6 +24,7 @@ "@tanstack/router-plugin": "^1.45.7", "@types/react-input-mask": "^3.0.5", "axios": "^1.7.2", + "change-case": "^5.4.4", "dayjs": "^1.11.13", "epic.theme": "latest", "keycloak-js": "^25.0.1", diff --git a/submit-web/src/components/DocumentUpload/DocumentTable.tsx b/submit-web/src/components/DocumentUpload/DocumentTable.tsx index 7cca088a..b755cbf0 100644 --- a/submit-web/src/components/DocumentUpload/DocumentTable.tsx +++ b/submit-web/src/components/DocumentUpload/DocumentTable.tsx @@ -17,15 +17,17 @@ import DocumentTableRow, { import { Document } from "@/store/documentUploadStore"; import PendingDocumentRow from "./PendingDocumentRow"; +type DocumentTableProps = { + header: string; + documents?: Array; + pendingDocuments: Array; + folder?: string; +}; export default function DocumentTable({ header, documents = [], pendingDocuments, -}: { - header: string; - documents?: Array; - pendingDocuments: Array; -}) { +}: DocumentTableProps) { return ( diff --git a/submit-web/src/components/DocumentUpload/PendingDocumentRow.tsx b/submit-web/src/components/DocumentUpload/PendingDocumentRow.tsx index e5300335..28e32fef 100644 --- a/submit-web/src/components/DocumentUpload/PendingDocumentRow.tsx +++ b/submit-web/src/components/DocumentUpload/PendingDocumentRow.tsx @@ -40,6 +40,7 @@ export default function PendingDocumentRow({ file: documentItem.file, fileDetails: { filename: documentItem.file.name, + folder: documentItem.folder, }, }); diff --git a/submit-web/src/components/SubmissionItem/ConsultationRecord/DocumentUploadSection.tsx b/submit-web/src/components/SubmissionItem/ConsultationRecord/DocumentUploadSection.tsx index 76b5ae2b..f490f283 100644 --- a/submit-web/src/components/SubmissionItem/ConsultationRecord/DocumentUploadSection.tsx +++ b/submit-web/src/components/SubmissionItem/ConsultationRecord/DocumentUploadSection.tsx @@ -12,15 +12,24 @@ import { useQueryClient } from "@tanstack/react-query"; import { SubmissionItem } from "@/models/SubmissionItem"; import DocumentTable from "@/components/DocumentUpload/DocumentTable"; import { getSubmissionItemQueryOptions } from "@/hooks/api/useItems"; +import { AccountProject } from "@/models/Project"; +import { getAccountProjectQueryOptions } from "@/hooks/api/useProjects"; +import { S3_FOLDER } from "@/hooks/api/useObjectStorage"; +import { camelCase } from "change-case"; export const DocumentUploadSection = () => { - const { submissionId: submissionItemId } = useParams({ + const { submissionId: submissionItemId, projectId } = useParams({ from: "/proponent/_proponentLayout/_dashboard/projects/$projectId/_projectLayout/submission-packages/$submissionPackageId/_submissionLayout/submissions/$submissionId", }); const queryClient = useQueryClient(); const submissionItem = queryClient.getQueryData( - getSubmissionItemQueryOptions({ itemId: Number(submissionItemId) }).queryKey + getSubmissionItemQueryOptions({ itemId: Number(submissionItemId) }) + .queryKey, + ); + + const accountProject = queryClient.getQueryData( + getAccountProjectQueryOptions(Number(projectId)).queryKey, ); const { reset, handleAddDocuments, documents } = useDocumentUploadStore(); @@ -34,7 +43,7 @@ export const DocumentUploadSection = () => { const handleOnDrop = (acceptedFiles: File[]) => { handleAddDocuments( acceptedFiles[0], - CONSULTATION_RECORD_DOCUMENT_FOLDERS.CONSULTATION_RECORDS + CONSULTATION_RECORD_DOCUMENT_FOLDERS.CONSULTATION_RECORDS, ); }; @@ -44,19 +53,26 @@ export const DocumentUploadSection = () => { } const documentSubmissions = submissionItem?.submissions.filter( - (submission) => submission.type === SUBMISSION_TYPE.DOCUMENT + (submission) => submission.type === SUBMISSION_TYPE.DOCUMENT, ); const documentSubmissionIds = documentSubmissions?.map( - (submission) => submission.id + (submission) => submission.id, ); const pendingDocuments = documents.filter( (document) => !document.submissionId || - !documentSubmissionIds?.includes(document.submissionId) + !documentSubmissionIds?.includes(document.submissionId), ); + const projectName = camelCase(accountProject?.project.name || ""); + + if (!accountProject) { + notify.error("Failed to load project"); + return null; + } + return ( @@ -109,7 +125,7 @@ export const DocumentUploadSection = () => { @@ -117,6 +133,7 @@ export const DocumentUploadSection = () => { documents={documentSubmissions} pendingDocuments={pendingDocuments} header={"Consultation Record(s)"} + folder={`${S3_FOLDER.SUBMISSIONS}/${projectName}/${S3_FOLDER.CONSULTATION_RECORDS}`} /> diff --git a/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/DocumentUploadSection.tsx b/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/DocumentUploadSection.tsx index f615f494..a9b7749d 100644 --- a/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/DocumentUploadSection.tsx +++ b/submit-web/src/components/SubmissionItem/ManagementPlanSubmission/DocumentUploadSection.tsx @@ -12,9 +12,13 @@ import { useQueryClient } from "@tanstack/react-query"; import { SubmissionItem } from "@/models/SubmissionItem"; import DocumentTable from "@/components/DocumentUpload/DocumentTable"; import { QUERY_KEY } from "@/hooks/api/constants"; +import { S3_FOLDER } from "@/hooks/api/useObjectStorage"; +import { getAccountProjectQueryOptions } from "@/hooks/api/useProjects"; +import { AccountProject } from "@/models/Project"; +import { camelCase } from "change-case"; export const DocumentUploadSection = () => { - const { submissionId: submissionItemId } = useParams({ + const { submissionId: submissionItemId, projectId } = useParams({ from: "/proponent/_proponentLayout/_dashboard/projects/$projectId/_projectLayout/submission-packages/$submissionPackageId/_submissionLayout/submissions/$submissionId", }); @@ -24,6 +28,10 @@ export const DocumentUploadSection = () => { Number(submissionItemId), ]); + const accountProject = queryClient.getQueryData( + getAccountProjectQueryOptions(Number(projectId)).queryKey, + ); + const { reset, handleAddDocuments, documents } = useDocumentUploadStore(); useEffect(() => { @@ -42,40 +50,46 @@ export const DocumentUploadSection = () => { } const documentSubmissions = submissionItem?.submissions.filter( - (submission) => submission.type === SUBMISSION_TYPE.DOCUMENT + (submission) => submission.type === SUBMISSION_TYPE.DOCUMENT, ); const documentSubmissionIds = documentSubmissions?.map( - (submission) => submission.id + (submission) => submission.id, ); const managementPlanDocuments = documentSubmissions?.filter( (submission) => submission.submitted_document.folder === - MANAGEMENT_PLAN_DOCUMENT_FOLDERS.MANAGEMENT_PLAN + MANAGEMENT_PLAN_DOCUMENT_FOLDERS.MANAGEMENT_PLAN, ); const supportingDocuments = documentSubmissions?.filter( (submission) => submission.submitted_document.folder === - MANAGEMENT_PLAN_DOCUMENT_FOLDERS.SUPPORTING + MANAGEMENT_PLAN_DOCUMENT_FOLDERS.SUPPORTING, ); const pendingDocuments = documents.filter( (document) => !document.submissionId || - !documentSubmissionIds?.includes(document.submissionId) + !documentSubmissionIds?.includes(document.submissionId), ); const pendingManagementPlanDocuments = pendingDocuments.filter( (document) => - document.folder === MANAGEMENT_PLAN_DOCUMENT_FOLDERS.MANAGEMENT_PLAN + document.folder === MANAGEMENT_PLAN_DOCUMENT_FOLDERS.MANAGEMENT_PLAN, ); const pendingSupportingDocuments = pendingDocuments.filter( (document) => - document.folder === MANAGEMENT_PLAN_DOCUMENT_FOLDERS.SUPPORTING + document.folder === MANAGEMENT_PLAN_DOCUMENT_FOLDERS.SUPPORTING, ); + const projectName = camelCase(accountProject?.project.name || ""); + + if (!accountProject) { + notify.error("Failed to load project"); + return null; + } return ( @@ -120,7 +134,7 @@ export const DocumentUploadSection = () => { onDrop={(acceptedFiles) => handleOnDrop( acceptedFiles, - MANAGEMENT_PLAN_DOCUMENT_FOLDERS.MANAGEMENT_PLAN + MANAGEMENT_PLAN_DOCUMENT_FOLDERS.MANAGEMENT_PLAN, ) } /> @@ -136,7 +150,7 @@ export const DocumentUploadSection = () => { @@ -144,6 +158,7 @@ export const DocumentUploadSection = () => { header={"Management Plan"} documents={managementPlanDocuments} pendingDocuments={pendingManagementPlanDocuments} + folder={`${S3_FOLDER.SUBMISSIONS}/${projectName}/${S3_FOLDER.MANAGEMENT_PLANS}`} /> @@ -171,7 +186,7 @@ export const DocumentUploadSection = () => { onDrop={(acceptedFiles) => handleOnDrop( acceptedFiles, - MANAGEMENT_PLAN_DOCUMENT_FOLDERS.SUPPORTING + MANAGEMENT_PLAN_DOCUMENT_FOLDERS.SUPPORTING, ) } /> @@ -186,7 +201,7 @@ export const DocumentUploadSection = () => { @@ -194,6 +209,7 @@ export const DocumentUploadSection = () => { header={"Supporting Documents"} documents={supportingDocuments} pendingDocuments={pendingSupportingDocuments} + folder={`${S3_FOLDER.SUBMISSIONS}/${projectName}/${S3_FOLDER.MANAGEMENT_PLANS}/${S3_FOLDER.SUPPORTING_DOCUMENTS}`} /> diff --git a/submit-web/src/hooks/api/useObjectStorage.tsx b/submit-web/src/hooks/api/useObjectStorage.tsx index f77b0bab..8623753a 100644 --- a/submit-web/src/hooks/api/useObjectStorage.tsx +++ b/submit-web/src/hooks/api/useObjectStorage.tsx @@ -6,6 +6,14 @@ import { import { useMutation } from "@tanstack/react-query"; import { Options } from "./types"; +export const S3_FOLDER = { + INTERNAL_STAFF: "internal_staff", + MANAGEMENT_PLANS: "management_plans", + SUPPORTING_DOCUMENTS: "supporting_documents", + CONSULTATION_RECORDS: "consultation_records", + SUBMISSIONS: "submissions", +}; + export type ObjectStorageHeaderDetails = { filename: string; filepath: string; @@ -17,6 +25,7 @@ export type ObjectStorageHeaderDetails = { type AuthHeaderRequestData = { filename: string; s3sourceuri?: string; + folder?: string; }; const createAuthHeaders = (data: AuthHeaderRequestData) => { return documentRequest({ From d4bbe6239572c1a8dd3a43810efb97b569197fe5 Mon Sep 17 00:00:00 2001 From: Jad Date: Tue, 12 Nov 2024 16:57:45 -0800 Subject: [PATCH 4/4] Pass s3 folder to document row --- submit-web/src/components/DocumentUpload/DocumentTable.tsx | 2 ++ .../src/components/DocumentUpload/PendingDocumentRow.tsx | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/submit-web/src/components/DocumentUpload/DocumentTable.tsx b/submit-web/src/components/DocumentUpload/DocumentTable.tsx index b755cbf0..582d2afa 100644 --- a/submit-web/src/components/DocumentUpload/DocumentTable.tsx +++ b/submit-web/src/components/DocumentUpload/DocumentTable.tsx @@ -27,6 +27,7 @@ export default function DocumentTable({ header, documents = [], pendingDocuments, + folder: s3Folder, }: DocumentTableProps) { return ( @@ -80,6 +81,7 @@ export default function DocumentTable({ ))} diff --git a/submit-web/src/components/DocumentUpload/PendingDocumentRow.tsx b/submit-web/src/components/DocumentUpload/PendingDocumentRow.tsx index 28e32fef..87bbc32e 100644 --- a/submit-web/src/components/DocumentUpload/PendingDocumentRow.tsx +++ b/submit-web/src/components/DocumentUpload/PendingDocumentRow.tsx @@ -15,10 +15,12 @@ import { Document } from "@/store/documentUploadStore"; type DocumentTableRowProps = { documentItem: Document; error?: boolean; + folder?: string; }; export default function PendingDocumentRow({ documentItem, error = false, + folder: s3Folder, }: DocumentTableRowProps) { const { submissionId: subItemId } = useParams({ from: "/proponent/_proponentLayout/_dashboard/projects/$projectId/_projectLayout/submission-packages/$submissionPackageId/_submissionLayout/submissions/$submissionId", @@ -40,7 +42,7 @@ export default function PendingDocumentRow({ file: documentItem.file, fileDetails: { filename: documentItem.file.name, - folder: documentItem.folder, + folder: s3Folder, }, });