From f1ab95963b26e332e047768d0e499cecd6b85db6 Mon Sep 17 00:00:00 2001 From: BastianHolmes Date: Tue, 25 Mar 2025 15:58:55 +0300 Subject: [PATCH 1/5] fix: booking category and app bar --- package-lock.json | 420 ++++++------------ .../blocks/CategoryForm/CategoryRoomsForm.tsx | 39 +- .../form/blocks/PetOwnerForm/PetOwnerForm.tsx | 41 +- .../fields/BookingSelect/BookingSelect.tsx | 2 + .../fields/CategorySelect/CategorySelect.tsx | 13 +- .../form/fields/RoomSelect/RoomSelect.tsx | 21 +- .../modal/BookingModal/BookingModal.tsx | 8 +- .../ShortClientModal/ShortClientModal.tsx | 12 +- .../components/steps/BookingScreen1.tsx | 11 +- .../components/steps/BookingScreen2.tsx | 5 +- src/modules/Booking/consts/DateData.ts | 84 +++- .../CreateBookingPage/CreateBookingPage.tsx | 18 +- .../forms/builder/PetFormBuilder.tsx | 1 - src/modules/Pets/pages/UpdatePetPage.tsx | 125 ++++++ src/routes/routes.tsx | 37 +- src/shared/ui/modal/Modal.tsx | 14 +- src/widgets/Header/ui/Header.tsx | 8 +- 17 files changed, 483 insertions(+), 376 deletions(-) create mode 100644 src/modules/Pets/pages/UpdatePetPage.tsx diff --git a/package-lock.json b/package-lock.json index 9ebbf16..966f1de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -85,7 +85,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "engines": { "node": ">=10" }, @@ -3365,7 +3364,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -3382,7 +3380,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, "engines": { "node": ">=12" }, @@ -3394,7 +3391,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "engines": { "node": ">=12" }, @@ -3406,7 +3402,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -3423,7 +3418,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3438,7 +3432,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -4460,7 +4453,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -4473,7 +4465,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -4482,7 +4473,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -5100,7 +5090,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "optional": true, "engines": { "node": ">=14" @@ -6838,7 +6827,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -6857,14 +6845,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -6877,7 +6863,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -6897,8 +6882,7 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "1.0.10", @@ -7402,14 +7386,12 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "engines": { "node": ">=8" }, @@ -7421,7 +7403,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -7430,7 +7411,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -7552,7 +7532,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "engines": { "node": ">= 6" } @@ -7611,7 +7590,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -7635,7 +7613,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -7749,7 +7726,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "engines": { "node": ">= 6" } @@ -7970,7 +7946,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -7990,7 +7965,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -8270,8 +8244,7 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/diff-sequences": { "version": "29.6.3", @@ -8297,8 +8270,7 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/doctrine": { "version": "3.0.0", @@ -8355,8 +8327,7 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/ejs": { "version": "3.1.10", @@ -8394,8 +8365,7 @@ "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/enquirer": { "version": "2.4.1", @@ -9568,7 +9538,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -9584,7 +9553,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -9626,7 +9594,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -9677,7 +9644,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9755,7 +9721,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -9771,7 +9736,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "engines": { "node": ">=14" }, @@ -9816,7 +9780,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -9978,7 +9941,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -10292,7 +10254,7 @@ "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "dev": true, + "devOptional": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -10490,7 +10452,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -10574,7 +10535,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10595,7 +10555,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -10628,7 +10587,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -10664,7 +10622,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -10869,8 +10826,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", @@ -10985,7 +10941,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -12939,7 +12894,6 @@ "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, "bin": { "jiti": "bin/jiti.js" } @@ -13209,7 +13163,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, "engines": { "node": ">=10" } @@ -13465,7 +13418,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -13474,7 +13426,6 @@ "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", "picomatch": "^2.3.1" @@ -13487,7 +13438,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -13536,7 +13486,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -13560,7 +13509,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -13574,7 +13522,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -13585,7 +13532,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -13713,7 +13659,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -13845,7 +13790,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "engines": { "node": ">= 6" } @@ -13992,6 +13936,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/openapi3-ts": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.2.2.tgz", @@ -14255,8 +14207,7 @@ "node_modules/package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, "node_modules/parent-module": { "version": "1.0.1", @@ -14333,7 +14284,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -14347,7 +14297,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -14362,8 +14311,7 @@ "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -14394,7 +14342,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -14403,7 +14350,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "engines": { "node": ">= 6" } @@ -14442,7 +14388,6 @@ "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -14470,7 +14415,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -14487,7 +14431,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -14506,7 +14449,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -14541,7 +14483,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, "engines": { "node": ">=14" }, @@ -14553,7 +14494,6 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", - "dev": true, "bin": { "yaml": "bin.mjs" }, @@ -14565,7 +14505,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -14590,7 +14529,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -14602,8 +14540,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -14726,7 +14663,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -14872,7 +14808,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -14881,7 +14816,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -14893,7 +14827,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -15106,7 +15039,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -15167,7 +15099,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -15343,7 +15274,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -15355,7 +15285,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -15483,7 +15412,6 @@ "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==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -15603,7 +15531,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15618,7 +15545,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15631,14 +15557,12 @@ "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string.prototype.includes": { "version": "2.0.0", @@ -15739,7 +15663,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15752,7 +15675,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15811,7 +15733,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -15833,7 +15754,6 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -15942,7 +15862,6 @@ "version": "3.4.13", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", - "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -16041,7 +15960,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -16050,7 +15968,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -16093,7 +16010,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -16157,8 +16073,7 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/ts-jest": { "version": "29.2.5", @@ -16546,8 +16461,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utility-types": { "version": "3.11.0", @@ -17161,7 +17075,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -17282,7 +17195,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -17299,7 +17211,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -17314,7 +17225,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -17325,8 +17235,7 @@ "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", @@ -17532,8 +17441,7 @@ "@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" }, "@ampproject/remapping": { "version": "2.3.0", @@ -17599,7 +17507,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "1.0.0", @@ -17946,7 +17855,8 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true + "dev": true, + "requires": {} }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -19318,7 +19228,8 @@ "@emotion/use-insertion-effect-with-fallbacks": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", - "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==" + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "requires": {} }, "@emotion/utils": { "version": "1.4.1", @@ -19602,7 +19513,8 @@ "@hookform/resolvers": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.0.tgz", - "integrity": "sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==" + "integrity": "sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==", + "requires": {} }, "@humanwhocodes/config-array": { "version": "0.13.0", @@ -19736,7 +19648,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "requires": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -19749,20 +19660,17 @@ "ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" }, "ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "requires": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -19773,7 +19681,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "requires": { "ansi-regex": "^6.0.1" } @@ -19782,7 +19689,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "requires": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -20367,13 +20273,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.3.tgz", "integrity": "sha512-XfZgry4DwEZvSFtS/6Y+R48D7qJYJK6R9/yJFyUFHCIUMEEHuJ4X95TDgJp5QkmzfLYvapMPzskV5HpIDrREug==", - "dev": true + "dev": true, + "requires": {} }, "@jsep-plugin/ternary": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.3.tgz", "integrity": "sha512-qtLGzCNzPVJ3kdH6/zoLWDPjauHIKiLSBAR71Wa0+PWvGA8wODUQvRgxtpUA5YqAYL3CQ8S4qXhd/9WuWTZirg==", - "dev": true + "dev": true, + "requires": {} }, "@mui/core-downloads-tracker": { "version": "5.16.7", @@ -20446,7 +20354,8 @@ "@mui/types": { "version": "7.2.17", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.17.tgz", - "integrity": "sha512-oyumoJgB6jDV8JFzRqjBo2daUuHpzDjoO/e3IrRhhHo/FxJlaVhET6mcNrKHUq2E+R+q3ql0qAtvQ4rfWHhAeQ==" + "integrity": "sha512-oyumoJgB6jDV8JFzRqjBo2daUuHpzDjoO/e3IrRhhHo/FxJlaVhET6mcNrKHUq2E+R+q3ql0qAtvQ4rfWHhAeQ==", + "requires": {} }, "@mui/utils": { "version": "5.16.6", @@ -20474,7 +20383,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -20483,14 +20391,12 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -20868,7 +20774,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "optional": true }, "@pkgr/core": { @@ -20885,7 +20790,8 @@ "@radix-ui/react-compose-refs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", - "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==" + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "requires": {} }, "@radix-ui/react-slot": { "version": "1.1.0", @@ -21169,7 +21075,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "dev": true + "dev": true, + "requires": {} }, "brace-expansion": { "version": "1.1.11", @@ -21255,13 +21162,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "dev": true + "dev": true, + "requires": {} }, "ajv-errors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "1.0.0", @@ -21619,7 +21528,8 @@ "version": "14.5.2", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", - "dev": true + "dev": true, + "requires": {} }, "@tootallnate/once": { "version": "2.0.0", @@ -22045,7 +21955,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "acorn-walk": { "version": "8.3.4", @@ -22124,8 +22035,7 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -22138,14 +22048,12 @@ "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -22154,8 +22062,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" } } }, @@ -22168,8 +22075,7 @@ "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "argparse": { "version": "1.0.10", @@ -22549,20 +22455,17 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "requires": { "balanced-match": "^1.0.0" } @@ -22571,7 +22474,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "requires": { "fill-range": "^7.1.1" } @@ -22651,8 +22553,7 @@ "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, "caniuse-lite": { "version": "1.0.30001663", @@ -22687,7 +22588,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -22703,7 +22603,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -22789,8 +22688,7 @@ "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" }, "comment-parser": { "version": "1.4.1", @@ -22960,7 +22858,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -22976,8 +22873,7 @@ "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssom": { "version": "0.5.0", @@ -23086,7 +22982,8 @@ "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true + "dev": true, + "requires": {} }, "deep-equal": { "version": "2.2.3", @@ -23174,8 +23071,7 @@ "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "diff-sequences": { "version": "29.6.3", @@ -23195,8 +23091,7 @@ "dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "doctrine": { "version": "3.0.0", @@ -23243,8 +23138,7 @@ "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "ejs": { "version": "3.1.10", @@ -23270,8 +23164,7 @@ "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "enquirer": { "version": "2.4.1", @@ -24024,13 +23917,15 @@ "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==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-react-refresh": { "version": "0.4.12", "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz", "integrity": "sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==", - "dev": true + "dev": true, + "requires": {} }, "eslint-scope": { "version": "5.1.1", @@ -24163,7 +24058,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -24176,7 +24070,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -24217,7 +24110,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -24264,7 +24156,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -24319,7 +24210,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, "requires": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -24328,8 +24218,7 @@ "signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" } } }, @@ -24364,7 +24253,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "optional": true }, "function-bind": { @@ -24488,7 +24376,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "requires": { "is-glob": "^4.0.3" } @@ -24704,7 +24591,7 @@ "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "dev": true + "devOptional": true }, "immutable": { "version": "4.3.7", @@ -24844,7 +24731,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -24894,8 +24780,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-finalizationregistry": { "version": "1.0.2", @@ -24909,8 +24794,7 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-fn": { "version": "2.1.0", @@ -24931,7 +24815,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -24951,8 +24834,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.7", @@ -25082,8 +24964,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "istanbul-lib-coverage": { "version": "3.2.2", @@ -25178,7 +25059,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, "requires": { "@isaacs/cliui": "^8.0.2", "@pkgjs/parseargs": "^0.11.0" @@ -26000,7 +25880,8 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true + "dev": true, + "requires": {} }, "jest-regex-util": { "version": "29.6.3", @@ -26611,8 +26492,7 @@ "jiti": { "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==" }, "js-tokens": { "version": "4.0.0", @@ -26814,8 +26694,7 @@ "lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" }, "lines-and-columns": { "version": "1.2.4", @@ -26977,7 +26856,8 @@ "lucide-react": { "version": "0.364.0", "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.364.0.tgz", - "integrity": "sha512-eHfdbJExWtTaZ0tBMGtI7PA/MbqV5wt+o4/yitDce17tadH/75Gq3Tq8jSteb3LhLr0eay/j5YUuN4yXjnI3aw==" + "integrity": "sha512-eHfdbJExWtTaZ0tBMGtI7PA/MbqV5wt+o4/yitDce17tadH/75Gq3Tq8jSteb3LhLr0eay/j5YUuN4yXjnI3aw==", + "requires": {} }, "lz-string": { "version": "1.5.0", @@ -27032,14 +26912,12 @@ "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "requires": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -27048,8 +26926,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" } } }, @@ -27082,7 +26959,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "requires": { "brace-expansion": "^2.0.1" } @@ -27096,8 +26972,7 @@ "minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" }, "ms": { "version": "2.1.3", @@ -27108,7 +26983,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "requires": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -27118,8 +26992,7 @@ "nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" }, "natural-compare": { "version": "1.4.0", @@ -27216,8 +27089,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "npm-run-path": { "version": "4.0.1", @@ -27321,8 +27193,7 @@ "object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" }, "object-inspect": { "version": "1.13.2", @@ -27421,6 +27292,13 @@ "mimic-fn": "^2.1.0" } }, + "openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "dev": true, + "peer": true + }, "openapi3-ts": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.2.2.tgz", @@ -27617,8 +27495,7 @@ "package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, "parent-module": { "version": "1.0.1", @@ -27673,8 +27550,7 @@ "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", @@ -27685,7 +27561,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, "requires": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -27694,8 +27569,7 @@ "lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" } } }, @@ -27718,14 +27592,12 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" }, "pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" }, "pkg-dir": { "version": "4.2.0", @@ -27752,7 +27624,6 @@ "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", @@ -27763,7 +27634,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "requires": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -27774,7 +27644,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "requires": { "camelcase-css": "^2.0.1" } @@ -27783,7 +27652,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, "requires": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" @@ -27792,14 +27660,12 @@ "lilconfig": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==" }, "yaml": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", - "dev": true + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==" } } }, @@ -27807,7 +27673,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, "requires": { "postcss-selector-parser": "^6.1.1" } @@ -27816,7 +27681,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -27825,8 +27689,7 @@ "postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "prelude-ls": { "version": "1.2.1", @@ -27923,8 +27786,7 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "react": { "version": "18.3.1", @@ -27955,7 +27817,8 @@ "react-hook-form": { "version": "7.53.0", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.0.tgz", - "integrity": "sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==" + "integrity": "sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==", + "requires": {} }, "react-input-mask": { "version": "2.0.4", @@ -28009,7 +27872,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "requires": { "pify": "^2.3.0" } @@ -28018,7 +27880,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" }, @@ -28026,8 +27887,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" } } }, @@ -28186,8 +28046,7 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rimraf": { "version": "3.0.2", @@ -28228,7 +28087,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -28349,7 +28207,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -28357,8 +28214,7 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "should": { "version": "13.2.3", @@ -28467,8 +28323,7 @@ "source-map-js": { "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==", - "dev": true + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" }, "source-map-support": { "version": "0.5.13", @@ -28568,7 +28423,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -28578,8 +28432,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" } } }, @@ -28587,7 +28440,6 @@ "version": "npm:string-width@4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -28597,8 +28449,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" } } }, @@ -28680,7 +28531,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -28689,7 +28539,6 @@ "version": "npm:strip-ansi@6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -28730,7 +28579,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -28745,7 +28593,6 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, "requires": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -28822,7 +28669,6 @@ "version": "3.4.13", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", - "dev": true, "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -28851,7 +28697,8 @@ "tailwindcss-animate": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==" + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "requires": {} }, "test-exclude": { "version": "6.0.0", @@ -28901,7 +28748,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "requires": { "any-promise": "^1.0.0" } @@ -28910,7 +28756,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "requires": { "thenify": ">= 3.1.0 < 4" } @@ -28947,7 +28792,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -28990,13 +28834,13 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true + "dev": true, + "requires": {} }, "ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "ts-jest": { "version": "29.2.5", @@ -29027,7 +28871,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", - "dev": true + "dev": true, + "requires": {} }, "tsconfig-paths": { "version": "3.15.0", @@ -29239,13 +29084,13 @@ "use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==" + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utility-types": { "version": "3.11.0", @@ -29491,7 +29336,8 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.3.tgz", "integrity": "sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -29556,7 +29402,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -29666,7 +29511,6 @@ "version": "npm:wrap-ansi@7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -29677,7 +29521,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -29686,7 +29529,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -29694,8 +29536,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" } } }, @@ -29719,7 +29560,8 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true + "dev": true, + "requires": {} }, "xml-name-validator": { "version": "4.0.0", diff --git a/src/modules/Booking/components/form/blocks/CategoryForm/CategoryRoomsForm.tsx b/src/modules/Booking/components/form/blocks/CategoryForm/CategoryRoomsForm.tsx index bed31f8..21af515 100644 --- a/src/modules/Booking/components/form/blocks/CategoryForm/CategoryRoomsForm.tsx +++ b/src/modules/Booking/components/form/blocks/CategoryForm/CategoryRoomsForm.tsx @@ -1,12 +1,19 @@ -import { Controller, DeepPartial, UseFormReturn } from "react-hook-form" +import { + Controller, + DeepPartial, + UseFormReturn, + useWatch, +} from "react-hook-form" import { CategorySelect } from "../../fields/CategorySelect/CategorySelect" import { RoomSelect } from "../../fields/RoomSelect/RoomSelect" import { IBookingForm, ICategoryAndRoom, } from "@/modules/Booking/model/types/BookingValidationSchema" - - +import { useGetAllRooms } from "@/modules/Rooms/api/queries" +import { useGetCategories } from "@/modules/Categories/api/queries" +import { useMemo } from "react" +import useBookingStore from "@/modules/Booking/store/BookingStore" interface CategoryRoomsProps { form: UseFormReturn @@ -18,8 +25,24 @@ export const CategoryRoomsForm = (props: CategoryRoomsProps) => { const { formState: { errors, dirtyFields }, control, + resetField, } = form + const setBookingData = useBookingStore(state => state.setBookingData) + const { data: rooms, isError: isErrorRooms } = useGetAllRooms("booking") + const { data: categories, isError: isErrorCategories } = useGetCategories() + const { categories: categoryValue } = useWatch({ control }) + + const filteredRooms = useMemo(() => { + resetField("rooms") + setBookingData({ ...bookingData, rooms: "" }) + const filtered = rooms?.filter( + room => room.categoryDto?.name === categoryValue + ) + + return filtered + }, [rooms, categoryValue, resetField]) + return (
{ ) }} @@ -40,14 +65,18 @@ export const CategoryRoomsForm = (props: CategoryRoomsProps) => { { if (dirtyFields.categories || bookingData.categories?.length) { return ( ) } diff --git a/src/modules/Booking/components/form/blocks/PetOwnerForm/PetOwnerForm.tsx b/src/modules/Booking/components/form/blocks/PetOwnerForm/PetOwnerForm.tsx index c16b45b..116ed7a 100644 --- a/src/modules/Booking/components/form/blocks/PetOwnerForm/PetOwnerForm.tsx +++ b/src/modules/Booking/components/form/blocks/PetOwnerForm/PetOwnerForm.tsx @@ -10,7 +10,7 @@ import { OwnerDto, PetDtoForOwner } from "@/generated/owners" import { Icon } from "@/shared/ui/Icon/Icon" import { IconButton } from "@mui/material" import { IPet } from "@/modules/Booking/model/types/BookingValidationSchema" -import { DeepPartial, UseFormReturn } from "react-hook-form" +import { DeepPartial, UseFormReturn, useWatch } from "react-hook-form" import { useState } from "react" import { PetSelectionModal } from "../../../modal/PetSelectionModal/PetSelectionModal" import { CreateShortPet } from "../../../modal/ShortPetModal/ShortPetModal" @@ -28,15 +28,17 @@ export const PetOwnerForm = (props: IPetOwnerFormProps) => { const [isSelectPetOpen, setIsSelectPetOpen] = useState(false) const { setValue, watch } = form + const values = useWatch({ control: form.control }) const setOwner = useBookingStore(state => state.setOwner) const storeOwner = useBookingStore(state => state.owner) const setIsOpenShortPetModal = useBookingStore( state => state.setIsCreateShortPet ) + const setBookingData = useBookingStore(state => state.setBookingData) const { data: client } = useGetClientById(Number(storeOwner?.id)) - const owner = storeOwner || client + const owner = storeOwner || client || null const petIds = watch("petIds") ?? [] const availablePets = @@ -47,12 +49,15 @@ export const PetOwnerForm = (props: IPetOwnerFormProps) => { const handleSelectPet = (petId: number) => { const updatedPetIds = [...petIds, petId] + setBookingData({ ...bookingData, ...values, petIds: updatedPetIds }) setValue("petIds", updatedPetIds) } const handleRemovePet = (petId: number) => { const updatedPetIds = petIds.filter(id => id !== petId) + setBookingData({ ...bookingData, ...values, petIds: updatedPetIds }) setValue("petIds", updatedPetIds) + console.log(bookingData) } const handleChooseClient = (value: OwnerDto) => { @@ -112,24 +117,26 @@ export const PetOwnerForm = (props: IPetOwnerFormProps) => { selectPet: (id: number) => void ) => { return ( -
- {owner && - petsToShow.map(pet => ( - selectPet(pet.id ?? 0)} - breed={pet.breed ?? "Нет породы"} - petName={pet.name ?? "Нет клички"} - petType={pet.type ?? "Собака или кошка?"} - width="234px" - height="244px" - /> - ))} - + <> + {owner && petsToShow.length !== 0 && ( +
+ {petsToShow.map(pet => ( + selectPet(pet.id ?? 0)} + breed={pet.breed ?? "Нет породы"} + petName={pet.name ?? "Нет клички"} + petType={pet.type ?? "Собака или кошка?"} + width="234px" + height="244px" + /> + ))} +
+ )} {!petsToShow.length && (

Нет доступных питомцев

)} -
+ ) } diff --git a/src/modules/Booking/components/form/fields/BookingSelect/BookingSelect.tsx b/src/modules/Booking/components/form/fields/BookingSelect/BookingSelect.tsx index ccbe229..feef0ab 100644 --- a/src/modules/Booking/components/form/fields/BookingSelect/BookingSelect.tsx +++ b/src/modules/Booking/components/form/fields/BookingSelect/BookingSelect.tsx @@ -47,6 +47,7 @@ export const BookingSelect = forwardRef( placeholder, register, onChange, + disabled, } = props const handleSelectChange = (e: SelectChangeEvent) => { @@ -59,6 +60,7 @@ export const BookingSelect = forwardRef(
void value: string error?: string className: string + isErrorRequest: boolean + categories: CategoryDto[] } export const CategorySelect: React.FC = props => { - const { onChange, value, error, className } = props - const { data: categories, isError } = useGetCategories() - + const { onChange, value, error, className, categories, isErrorRequest } = + props const mappedDataFromCategories = (): SelectData[] | undefined => categories?.map(element => ({ label: element.name, value: String(element.name), })) const renderNoData = (): React.ReactNode => { - if (!isError && categories?.length === 0) { + if (!isErrorRequest && categories?.length === 0) { return Категории не найдены - } else if (isError) { + } else if (isErrorRequest) { return Ошибка загрузки категорий } } diff --git a/src/modules/Booking/components/form/fields/RoomSelect/RoomSelect.tsx b/src/modules/Booking/components/form/fields/RoomSelect/RoomSelect.tsx index 92e46f8..1a39528 100644 --- a/src/modules/Booking/components/form/fields/RoomSelect/RoomSelect.tsx +++ b/src/modules/Booking/components/form/fields/RoomSelect/RoomSelect.tsx @@ -2,28 +2,36 @@ import { SelectData } from "@/shared/ui/Select" import { Typography } from "@mui/material" import { BookingSelect } from "../BookingSelect/BookingSelect" import { Placeholder } from "@/modules/Booking/consts/Placeholders" -import { useGetAllRooms } from "@/modules/Rooms/api/queries" +import { RoomDto } from "@/generated/room" type TProps = { onChange: (value: string) => void value: string error?: string className?: string + rooms: RoomDto[] + disabled?: boolean + isErrorRequest: boolean } export const RoomSelect: React.FC = props => { - const { onChange, value, error, className } = props - const { data: rooms, isError } = useGetAllRooms("1") + const { onChange, value, error, className, rooms, isErrorRequest } = props + + const hasRooms = rooms.length + const placeholder = !hasRooms + ? "Нет доступных комнат" + : Placeholder.ROOMS.valueOf() const mappedDataFromRooms = (): SelectData[] | undefined => rooms?.map(element => ({ label: element.number, value: String(element.number), })) + const renderNoData = (): React.ReactNode => { - if (!isError && rooms?.length === 0) { + if (!isErrorRequest && rooms?.length === 0) { return Комнаты не найдены - } else if (isError) { + } else if (isErrorRequest) { return Ошибка загрузки комнат } } @@ -37,8 +45,9 @@ export const RoomSelect: React.FC = props => { renderNoData={renderNoData} error={error} marginBottom="16px" - placeholder={Placeholder.ROOMS.valueOf()} + placeholder={placeholder} className={className} + disabled={!hasRooms} /> ) } diff --git a/src/modules/Booking/components/modal/BookingModal/BookingModal.tsx b/src/modules/Booking/components/modal/BookingModal/BookingModal.tsx index c881cd6..bf28e22 100644 --- a/src/modules/Booking/components/modal/BookingModal/BookingModal.tsx +++ b/src/modules/Booking/components/modal/BookingModal/BookingModal.tsx @@ -7,7 +7,6 @@ import { IBookingForm } from "../../../model/types/BookingValidationSchema" import { addConfirmationNotification } from "@/shared/utils/utils" import { useNavigate } from "react-router-dom" - type TProps = { children: React.ReactNode onSubmit: UseFormHandleSubmit> @@ -82,6 +81,9 @@ export const BookingModal: React.FC = memo(props => { "& .MuiDialog-paperScrollPaper": { overflowY: "visible", }, + "& .MuiDialog-container": { + overflowY: "auto", + }, }} > = memo(props => { Новое бронирование
= memo(props => {
- ) }) diff --git a/src/modules/Booking/components/modal/ShortClientModal/ShortClientModal.tsx b/src/modules/Booking/components/modal/ShortClientModal/ShortClientModal.tsx index f55069a..aca1237 100644 --- a/src/modules/Booking/components/modal/ShortClientModal/ShortClientModal.tsx +++ b/src/modules/Booking/components/modal/ShortClientModal/ShortClientModal.tsx @@ -38,8 +38,8 @@ export const ShortClientModal: React.FC = ({ const renderBody = () => { return ( -
- + + {ShortClientFieldsConfig.map(field => { if (PhoneIds.includes(field.id)) { return ( @@ -95,13 +95,7 @@ export const ShortClientModal: React.FC = ({ const renderFooter = () => { return ( - +
diff --git a/src/modules/Pets/components/forms/builder/PetFormBuilder.tsx b/src/modules/Pets/components/forms/builder/PetFormBuilder.tsx index bb60a69..57179be 100644 --- a/src/modules/Pets/components/forms/builder/PetFormBuilder.tsx +++ b/src/modules/Pets/components/forms/builder/PetFormBuilder.tsx @@ -1,7 +1,6 @@ import { useForm, useWatch } from "react-hook-form" import { yupResolver } from "@hookform/resolvers/yup" import { createValidationSchema } from "./createValidationSchema" -import {} from "../fields" import { forwardRef, useEffect, useState } from "react" import { CategoryTitle } from "../../common/CategoryTitle/CategoryTitle" import { ControlledDate } from "../fields/ControlledDate/ControlledDate" diff --git a/src/modules/Pets/pages/UpdatePetPage.tsx b/src/modules/Pets/pages/UpdatePetPage.tsx new file mode 100644 index 0000000..61b37bc --- /dev/null +++ b/src/modules/Pets/pages/UpdatePetPage.tsx @@ -0,0 +1,125 @@ +import { useNavigate, useParams } from "react-router-dom" +import FormBuilder from "../components/forms/builder/PetFormBuilder" +import { useGetClientById } from "@/modules/Clients/api/queries" +import { CircularProgress } from "@mui/material" +import { CardClientSmall } from "@/modules/Clients/components/ClientsPage/CardClientSmall" +import { NewPetDto } from "@/generated/pets" +import { useRef } from "react" +import { + addConfirmationNotification, + addErrorNotification, + addSuccessNotification, +} from "@/shared/utils/utils" +import { usePetFormStore } from "../store" +import { CAT_CONFIG, DOG_CONFIG, EXOT_CONFIG, FormData } from "../components" +import { PetPageTitle } from "../components/common" +import { useCreatePet } from "../api" +import { useGetPetById } from "../api/queries" + +const petConfig = { + dog: { + name: "dog", + config: DOG_CONFIG, + dtoName: "DOG", + ru: "Cобака", + }, + cat: { + name: "cat", + config: CAT_CONFIG, + dtoName: "CAT", + ru: "Кошка", + }, + other: { + name: "other", + config: EXOT_CONFIG, + dtoName: "EXOTIC", + ru: "Прочее", + }, +} + +export const UpdatePetPage = () => { + const { id, petId } = useParams() + const navigate = useNavigate() + const successNotification = addSuccessNotification() + const errorNotification = addErrorNotification() + const confirmationNotification = addConfirmationNotification() + + const isDirty = usePetFormStore(state => state.isDirty) + + const { data: clientData, isLoading } = useGetClientById(Number(id)) + const { data: petData, isLoading: isPetLoading } = useGetPetById( + Number(petId) + ) + + const { mutate: createPet } = useCreatePet(clientData?.id || 0) + + const formRef = useRef<{ leaveForm: () => void }>(null) + + const { firstName, lastName, middleName, rating } = clientData || {} + + const fullName = `${firstName} ${lastName || ""} ${middleName || ""}` + + const onCloseForm = () => navigate(`/clients/${id}`) + + const handleNavigate = () => { + if (isDirty) { + confirmationNotification(onCloseForm) + } else { + onCloseForm() + } + } + + const handleUpdatePet = async (data: NewPetDto) => { + const cleanObj = (obj: {}) => + Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== "")) + + const payload = { + ...cleanObj(data), + ownerId: Number(id), // ошибка owner на беке + type: petConfig[currentPetType as keyof typeof petConfig]?.dtoName, // ошибка typeOfPet на беке + } + + createPet(payload as NewPetDto, { + onSuccess: () => { + onCloseForm() + successNotification("Питомец успешно создан") + }, + onError: () => { + errorNotification("Произошла ошибка при создании питомца") + }, + }) + } + + if (!petData) { + return null + } + + return ( +
+
+ +
+ +
+ + + {(isLoading || isPetLoading) && } + {!isLoading && ( +
+ +
+ )} +
+
+ ) +} diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index a1f28c6..b40000a 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -4,6 +4,9 @@ import { LayoutWithFooter } from "@/shared/ui/Layouts/LayoutWithFooter" import { LayoutBookingGrid } from "@/shared/ui/Layouts/LayoutBookingGrid" import { CreatePetPage, PetPage } from "@/modules/Pets" import { BookingGridPage } from "@/modules/Booking/pages/BookingGridPage/BookingGridPage" +import { UpdatePetPage } from "@/modules/Pets/pages/UpdatePetPage" +import { Layout } from "@/shared/ui/Layouts/Layout" +import { CreateBookingPage } from "@/modules/Booking/pages/CreateBookingPage/CreateBookingPage" const CategoriesPage = lazy(() => import("@/modules/Categories/pages/CategoriesPage").then(module => ({ @@ -40,13 +43,13 @@ const BookingPage = lazy(() => default: module.BookingPage, })) ) -const CreateBookingPage = lazy(() => - import("@/modules/Booking/pages/CreateBookingPage/CreateBookingPage").then( - module => ({ - default: module.CreateBookingPage, - }) - ) -) +// const CreateBookingPage = lazy(() => +// import("@/modules/Booking/pages/CreateBookingPage/CreateBookingPage").then( +// module => ({ +// default: module.CreateBookingPage, +// }) +// ) +// ) const ClientPage = lazy(() => import("@/modules/Clients/pages/ClientPage.tsx").then(module => ({ default: module.ClientPage, @@ -61,7 +64,7 @@ const LazyLoadWrapper = ({ children }: { children: React.ReactNode }) => ( export const routes: RouteObject[] = [ { path: "/", - element: , + element: , children: [ { index: true, @@ -123,6 +126,10 @@ export const routes: RouteObject[] = [ path: "clients/:id/pets/:petType/create", element: , }, + { + path: "clients/:id/pets/:petId/update", + element: , + }, { path: "clients/:id/pets/:petId", element: , @@ -137,20 +144,6 @@ export const routes: RouteObject[] = [ ), }, - { - path: "/create-booking", - element: , - children: [ - { - element: ( - - - - ), - path: "", - }, - ], - }, { path: "/create-booking", element: , diff --git a/src/shared/ui/modal/Modal.tsx b/src/shared/ui/modal/Modal.tsx index d1317d2..3ad1d8f 100644 --- a/src/shared/ui/modal/Modal.tsx +++ b/src/shared/ui/modal/Modal.tsx @@ -1,4 +1,4 @@ -import { Box, Dialog, DialogTitle } from "@mui/material" +import { Box, Dialog, DialogContent, DialogTitle } from "@mui/material" import { memo } from "react" /** @@ -38,18 +38,24 @@ export const Modal: React.FC = memo(props => { onClose={onClose} aria-labelledby={ariaLabelledby} aria-describedby={ariaDescribedby} + scroll="body" sx={{ "& .MuiPaper-root": { borderRadius: "16px", width: "616px", - overflow: "visible !important", + scrollbarGutter: "stable", + overflow: "auto !important", + maxHeight: "unset !important", + }, + "&.MuiModal-root": { + // overflow: "auto !important", }, }} > {renderHeader()} -
+ = memo(props => { {renderFooter()} -
+ ) }) diff --git a/src/widgets/Header/ui/Header.tsx b/src/widgets/Header/ui/Header.tsx index 8685962..63885fc 100644 --- a/src/widgets/Header/ui/Header.tsx +++ b/src/widgets/Header/ui/Header.tsx @@ -15,12 +15,14 @@ import { DropDownMenu } from "@/widgets/Dropdown/DropdownMenu.tsx" import { useLocation, useNavigate } from "react-router-dom" export const Header: React.FC = ({ links }) => { - const [selectedLink, setSelectedLink] = useState(links[0].label) + const { pathname } = useLocation() + const navigate = useNavigate() + + const currentLink = links.find(l => l.href === pathname) + const [selectedLink, setSelectedLink] = useState(currentLink?.label) const [hoveredLink, setHoveredLink] = useState(undefined) const [isDropdownMenuOpen, setIsDropdownMenuOpen] = useState(false) const [menuTimeout, setMenuTimeout] = useState(null) - const { pathname } = useLocation() - const navigate = useNavigate() const isCreateBookingPage = pathname.includes("create-booking") From 44e91534b667de6df552647f174fc7a8f3a46632 Mon Sep 17 00:00:00 2001 From: BastianHolmes Date: Tue, 1 Apr 2025 22:07:32 +0300 Subject: [PATCH 2/5] feat: pet update, routing refactor --- src/modules/Booking/api/queries.ts | 22 +++++ .../blocks/CategoryForm/CategoryRoomsForm.tsx | 31 ++++-- .../form/blocks/PetOwnerForm/PetOwnerForm.tsx | 2 +- .../fields/CategorySelect/CategorySelect.tsx | 1 + .../modal/BookingModal/BookingModal.tsx | 4 +- .../components/steps/BookingScreen3.tsx | 26 ++++- .../components/steps/BookingScreen4.tsx | 20 +++- src/modules/Booking/consts/errors.ts | 7 ++ .../model/types/BookingValidationSchema.ts | 18 +++- .../CreateBookingPage/CreateBookingFooter.tsx | 29 ++++++ .../CreateBookingPage/CreateBookingPage.tsx | 12 ++- src/modules/Booking/store/BookingStore.ts | 5 + src/modules/Pets/api/mutations.ts | 17 +++- .../forms/builder/PetFormBuilder.tsx | 9 +- .../forms/builder/createValidationSchema.ts | 6 +- .../Pets/pages/CreatePage/CreatePetFooter.tsx | 44 +++++++++ .../pages/{ => CreatePage}/CreatePetPage.tsx | 11 ++- .../Pets/pages/UpdatePage/UpdatePetFooter.tsx | 44 +++++++++ .../pages/{ => UpdatePage}/UpdatePetPage.tsx | 36 ++++--- .../Pets/pages/{ => ViewPage}/PetPage.tsx | 13 +-- .../Pets/pages/ViewPage/ViewPetFooter.tsx | 35 +++++++ src/modules/Pets/pages/index.ts | 4 +- src/modules/Rooms/api/queries.ts | 13 ++- src/routes/routes.tsx | 74 ++++++-------- src/routes/types.ts | 45 +++++++++ src/routes/utils.ts | 36 +++++++ src/shared/ui/ErrorBar/ErrorBar.tsx | 71 +++++++------- src/shared/ui/ErrorBar/utils.ts | 45 ++++----- src/shared/ui/Footer/Footer.tsx | 35 +++++++ src/shared/ui/Layouts/Layout.tsx | 6 +- src/shared/ui/Layouts/LayoutBookingGrid.tsx | 20 ---- src/shared/ui/Layouts/LayoutWithFooter.tsx | 24 ----- src/shared/ui/modal/Modal.tsx | 2 +- src/widgets/Footer/Footer.tsx | 98 ------------------- 34 files changed, 558 insertions(+), 307 deletions(-) create mode 100644 src/modules/Booking/consts/errors.ts create mode 100644 src/modules/Booking/pages/CreateBookingPage/CreateBookingFooter.tsx create mode 100644 src/modules/Pets/pages/CreatePage/CreatePetFooter.tsx rename src/modules/Pets/pages/{ => CreatePage}/CreatePetPage.tsx (90%) create mode 100644 src/modules/Pets/pages/UpdatePage/UpdatePetFooter.tsx rename src/modules/Pets/pages/{ => UpdatePage}/UpdatePetPage.tsx (74%) rename src/modules/Pets/pages/{ => ViewPage}/PetPage.tsx (86%) create mode 100644 src/modules/Pets/pages/ViewPage/ViewPetFooter.tsx create mode 100644 src/routes/types.ts create mode 100644 src/routes/utils.ts create mode 100644 src/shared/ui/Footer/Footer.tsx delete mode 100644 src/shared/ui/Layouts/LayoutBookingGrid.tsx delete mode 100644 src/shared/ui/Layouts/LayoutWithFooter.tsx delete mode 100644 src/widgets/Footer/Footer.tsx diff --git a/src/modules/Booking/api/queries.ts b/src/modules/Booking/api/queries.ts index 961be22..49b6921 100644 --- a/src/modules/Booking/api/queries.ts +++ b/src/modules/Booking/api/queries.ts @@ -3,6 +3,7 @@ import { EQueryKeys } from "./keys" import { checkRoomAvailableInDates, findAllBookingsInDates, + findBlockingBookingsForRoomInDates, getBookingById, } from "@/generated/bookings" import { @@ -64,3 +65,24 @@ export const useGetBookings = ({ checkOutDate: convertServerDateToAnFormView(checkOutDate), })), }) + +export const useBlockingBookingsForRoomInDates = ( + roomId: number, + checkInDate: string, + checkOutDate: string +) => + useQuery({ + queryKey: [EQueryKeys.GET_BOOKING_BY_ID + roomId], + queryFn: () => + findBlockingBookingsForRoomInDates( + roomId, + { + checkInDate, + checkOutDate, + }, + { + headers: { "X-PetHotel-User-Id": 1 }, + } + ), + enabled: !!roomId && !!checkInDate && !!checkOutDate, + }) diff --git a/src/modules/Booking/components/form/blocks/CategoryForm/CategoryRoomsForm.tsx b/src/modules/Booking/components/form/blocks/CategoryForm/CategoryRoomsForm.tsx index 21af515..9acd39c 100644 --- a/src/modules/Booking/components/form/blocks/CategoryForm/CategoryRoomsForm.tsx +++ b/src/modules/Booking/components/form/blocks/CategoryForm/CategoryRoomsForm.tsx @@ -12,8 +12,9 @@ import { } from "@/modules/Booking/model/types/BookingValidationSchema" import { useGetAllRooms } from "@/modules/Rooms/api/queries" import { useGetCategories } from "@/modules/Categories/api/queries" -import { useMemo } from "react" +import { useEffect, useMemo } from "react" import useBookingStore from "@/modules/Booking/store/BookingStore" +import { RoomDto } from "@/generated/bookings" interface CategoryRoomsProps { form: UseFormReturn @@ -29,19 +30,24 @@ export const CategoryRoomsForm = (props: CategoryRoomsProps) => { } = form const setBookingData = useBookingStore(state => state.setBookingData) + const setRoom = useBookingStore(state => state.setRoom) + const { data: rooms, isError: isErrorRooms } = useGetAllRooms("booking") const { data: categories, isError: isErrorCategories } = useGetCategories() - const { categories: categoryValue } = useWatch({ control }) + const { categories: categoryValue, rooms: roomValue } = useWatch({ control }) const filteredRooms = useMemo(() => { - resetField("rooms") - setBookingData({ ...bookingData, rooms: "" }) const filtered = rooms?.filter( room => room.categoryDto?.name === categoryValue ) return filtered - }, [rooms, categoryValue, resetField]) + }, [rooms, categoryValue]) + + useEffect(() => { + const curRoom = rooms?.find(room => room.number === roomValue) as RoomDto + if (curRoom) setRoom(curRoom) + }, [roomValue, rooms, setRoom]) return (
@@ -52,7 +58,11 @@ export const CategoryRoomsForm = (props: CategoryRoomsProps) => { return ( { + resetField("rooms") + setBookingData({ ...bookingData, rooms: "" }) + return field.onChange(args) + }} value={field.value || bookingData.categories || ""} error={errors?.categories?.message} categories={categories || []} @@ -71,7 +81,14 @@ export const CategoryRoomsForm = (props: CategoryRoomsProps) => { return ( { + const curRoom = rooms?.find( + room => room.number === field.value + ) as RoomDto + if (curRoom) setRoom(curRoom) + console.log(curRoom, rooms, field.value) + return field.onChange(args) + }} value={field.value || bookingData.rooms || ""} error={errors?.rooms?.message} rooms={filteredRooms || []} diff --git a/src/modules/Booking/components/form/blocks/PetOwnerForm/PetOwnerForm.tsx b/src/modules/Booking/components/form/blocks/PetOwnerForm/PetOwnerForm.tsx index 116ed7a..7fd9543 100644 --- a/src/modules/Booking/components/form/blocks/PetOwnerForm/PetOwnerForm.tsx +++ b/src/modules/Booking/components/form/blocks/PetOwnerForm/PetOwnerForm.tsx @@ -41,6 +41,7 @@ export const PetOwnerForm = (props: IPetOwnerFormProps) => { const owner = storeOwner || client || null const petIds = watch("petIds") ?? [] + console.log(values, "values") const availablePets = owner?.petsDto?.filter(pet => !petIds.includes(pet.id ?? 0)) ?? [] @@ -57,7 +58,6 @@ export const PetOwnerForm = (props: IPetOwnerFormProps) => { const updatedPetIds = petIds.filter(id => id !== petId) setBookingData({ ...bookingData, ...values, petIds: updatedPetIds }) setValue("petIds", updatedPetIds) - console.log(bookingData) } const handleChooseClient = (value: OwnerDto) => { diff --git a/src/modules/Booking/components/form/fields/CategorySelect/CategorySelect.tsx b/src/modules/Booking/components/form/fields/CategorySelect/CategorySelect.tsx index e5854cd..8ce30cd 100644 --- a/src/modules/Booking/components/form/fields/CategorySelect/CategorySelect.tsx +++ b/src/modules/Booking/components/form/fields/CategorySelect/CategorySelect.tsx @@ -6,6 +6,7 @@ import { CategoryDto } from "@/generated/bookings" type TProps = { onChange: (value: string) => void + onChangeCategory?: () => void value: string error?: string className: string diff --git a/src/modules/Booking/components/modal/BookingModal/BookingModal.tsx b/src/modules/Booking/components/modal/BookingModal/BookingModal.tsx index bf28e22..3b9fa48 100644 --- a/src/modules/Booking/components/modal/BookingModal/BookingModal.tsx +++ b/src/modules/Booking/components/modal/BookingModal/BookingModal.tsx @@ -15,7 +15,7 @@ type TProps = { } export const BookingModal: React.FC = memo(props => { - const { children, onSubmit, isDirty, isReadyToSubmit } = props + const { children, onSubmit, isDirty, isReadyToSubmit = true } = props const navigate = useNavigate() const confirmationNotification = addConfirmationNotification() @@ -132,7 +132,7 @@ export const BookingModal: React.FC = memo(props => { size={EButtonSize.Large} fontSize={16} fontWeight={700} - disabled={isReadyToSubmit} + disabled={!isReadyToSubmit} > {btnText[bookingStep - 1]} diff --git a/src/modules/Booking/components/steps/BookingScreen3.tsx b/src/modules/Booking/components/steps/BookingScreen3.tsx index a9e9f63..4f6407e 100644 --- a/src/modules/Booking/components/steps/BookingScreen3.tsx +++ b/src/modules/Booking/components/steps/BookingScreen3.tsx @@ -10,9 +10,19 @@ import useBookingStore from "../../store/BookingStore" import { CategoryRoomsForm } from "../form/blocks/CategoryForm/CategoryRoomsForm" import { ScheduleForm } from "../form/blocks/ScheduleForm/ScheduleForm" import { StepTitle } from "../typography/StepTitle/StepTitle" +import { useGetIsDatesAvailable } from "../../api/queries" +import ErrorBar from "@/shared/ui/ErrorBar/ErrorBar" +import { ErrorMessages } from "../../consts/errors" const BookingScreen3 = () => { const bookingData = useBookingStore(state => state.bookingData) + const room = useBookingStore(state => state.room) + + const { failureReason } = useGetIsDatesAvailable( + Number(room?.id), + bookingData.dateFrom!, + bookingData.dateTo! + ) const form = useForm({ resolver: yupResolver(ScreenSchema3), @@ -26,9 +36,14 @@ const BookingScreen3 = () => { daysAmount: bookingData.daysAmount || 0, }, }) + const disabled = failureReason?.response?.data?.message return ( - + } @@ -38,6 +53,15 @@ const BookingScreen3 = () => { bookingData={bookingData} form={form as unknown as UseFormReturn} /> + {disabled && ( +
+ +
+ )}
) } diff --git a/src/modules/Booking/components/steps/BookingScreen4.tsx b/src/modules/Booking/components/steps/BookingScreen4.tsx index 5727cac..e673321 100644 --- a/src/modules/Booking/components/steps/BookingScreen4.tsx +++ b/src/modules/Booking/components/steps/BookingScreen4.tsx @@ -5,17 +5,20 @@ import { ICategoryAndRoom, IPet, IScheduleForm, - ScreenSchema3, + ScreenSchema3WithPets, } from "../../model/types/BookingValidationSchema" import useBookingStore from "../../store/BookingStore" import { PetOwnerForm } from "../form/blocks/PetOwnerForm/PetOwnerForm" import { CategoryRoomsForm } from "../form/blocks/CategoryForm/CategoryRoomsForm" import { ScheduleForm } from "../form/blocks/ScheduleForm/ScheduleForm" +import ErrorBar from "@/shared/ui/ErrorBar/ErrorBar" +import { ErrorMessages } from "../../consts/errors" + const BookingScreen4 = () => { const bookingData = useBookingStore(state => state.bookingData) const form = useForm({ - resolver: yupResolver(ScreenSchema3), + resolver: yupResolver(ScreenSchema3WithPets), defaultValues: { categories: bookingData.categories || "", rooms: bookingData.rooms || "", @@ -24,12 +27,25 @@ const BookingScreen4 = () => { timeFrom: bookingData.timeFrom || "", timeTo: bookingData.timeTo || "", daysAmount: bookingData.daysAmount || 0, + petIds: bookingData.petIds || [], }, + mode: "onSubmit", }) + const noPets = Boolean(form.formState.errors.petIds?.message) + return (
+ {noPets && ( +
+ +
+ )} } diff --git a/src/modules/Booking/consts/errors.ts b/src/modules/Booking/consts/errors.ts new file mode 100644 index 0000000..355e94e --- /dev/null +++ b/src/modules/Booking/consts/errors.ts @@ -0,0 +1,7 @@ +export const ErrorMessages = { + NO_ROOMS_TITLE: "Нет свободных комнат", + NO_ROOMS: "Комната недоступна. Выберите другие даты или категорию комнаты.", + NO_CATEGORIES: "Нет доступных категорий", + NO_PETS: "Переход на следующий шаг невозможен без добавленного питомца", + NO_PETS_TITLE: "Добавьте или создайте хотя бы одного питомца", +} diff --git a/src/modules/Booking/model/types/BookingValidationSchema.ts b/src/modules/Booking/model/types/BookingValidationSchema.ts index 103c217..23234d1 100644 --- a/src/modules/Booking/model/types/BookingValidationSchema.ts +++ b/src/modules/Booking/model/types/BookingValidationSchema.ts @@ -15,6 +15,10 @@ export interface IScheduleForm { daysAmount?: number } +export interface IPet { + petIds: number[] +} + export interface IOwnerForm { owner: OwnerShortDto pets: PetDto[] @@ -35,10 +39,6 @@ export interface IComment { comment?: string } -export interface IPet { - petIds: number[] -} - export interface IBookingForm extends ICategoryAndRoom, IScheduleForm, @@ -91,8 +91,18 @@ export const ScreenSchema2 = yup.object().shape({ rooms: yup.string().required("Пожалуйста выберите комнату"), }) +export const PetSchema = yup.object().shape({ + petIds: yup + .array() + .of(yup.number()) + .min(1) + .required("Пожалуйста выберите животных"), +}) + export const ScreenSchema3 = ScreenSchema1.concat(ScreenSchema2) +export const ScreenSchema3WithPets = ScreenSchema3.concat(PetSchema) + export const ScreenSchema4 = yup.object().shape({ pricePerDay: yup .number() diff --git a/src/modules/Booking/pages/CreateBookingPage/CreateBookingFooter.tsx b/src/modules/Booking/pages/CreateBookingPage/CreateBookingFooter.tsx new file mode 100644 index 0000000..6f4fd70 --- /dev/null +++ b/src/modules/Booking/pages/CreateBookingPage/CreateBookingFooter.tsx @@ -0,0 +1,29 @@ +import { Button, EButtonSize, EButtonVariant } from "@/shared/ui/Button/Button" +import { useNavigate } from "react-router-dom" + +export const BookingFooter = () => { + const navigate = useNavigate() + return ( + <> + + + + ) +} diff --git a/src/modules/Booking/pages/CreateBookingPage/CreateBookingPage.tsx b/src/modules/Booking/pages/CreateBookingPage/CreateBookingPage.tsx index 8c0038f..239ea24 100644 --- a/src/modules/Booking/pages/CreateBookingPage/CreateBookingPage.tsx +++ b/src/modules/Booking/pages/CreateBookingPage/CreateBookingPage.tsx @@ -53,7 +53,7 @@ const defaultValues = { export const CreateBookingPage = () => { const data = useBookingStore(state => state.bookingData) const setBookingData = useBookingStore(state => state.setBookingData) - const { mutate: createBooking, isSuccess, error } = useCreateBooking() + const { mutate: createBooking, isSuccess, error, status } = useCreateBooking() const navigate = useNavigate() const notificateError = addErrorNotification() const notificateSuccess = addSuccessNotification() @@ -65,15 +65,19 @@ export const CreateBookingPage = () => { mode: "all", }) - const onSubmit = (bookingData: IBookingForm) => { + const onSubmit = async (bookingData: IBookingForm) => { const data = mapperBookingFormDataToDTO(bookingData) - createBooking(data) + await createBooking(data) + console.log(status) if (isSuccess) { + console.log(isSuccess, "Успех??") notificateSuccess("Бронирование успешно создано") setBookingData(defaultValues) navigate("/bookings") } else { - notificateError(error.response.data.message) + notificateError( + error.response.data.message || "Произошла ошибка, попробуйте ещё раз" + ) } } diff --git a/src/modules/Booking/store/BookingStore.ts b/src/modules/Booking/store/BookingStore.ts index b9273a2..08e3202 100644 --- a/src/modules/Booking/store/BookingStore.ts +++ b/src/modules/Booking/store/BookingStore.ts @@ -2,6 +2,7 @@ import { create } from "zustand" import { IBookingForm } from "../model/types/BookingValidationSchema" import { DeepPartial } from "react-hook-form" import { OwnerDto } from "@/generated/owners" +import { RoomDto } from "@/generated/bookings" interface IBookingStore { isCreateShortPet: boolean @@ -10,12 +11,14 @@ interface IBookingStore { bookingStep: number bookingData: DeepPartial owner: OwnerDto | null + room: RoomDto | null setIsCreateShortClient: (value: boolean) => void setIsBookingInProgress: (value: boolean) => void setBookingStep: (value: number) => void setSpecificBookingData: (value: string, setter: string) => void setBookingData: (value: DeepPartial) => void setOwner: (value: OwnerDto) => void + setRoom: (value: RoomDto) => void setIsCreateShortPet: (value: boolean) => void } @@ -25,6 +28,7 @@ const useBookingStore = create(set => ({ isBookingInProgress: false, bookingStep: 1, owner: null, + room: null, bookingData: { dateFrom: "", dateTo: "", @@ -44,6 +48,7 @@ const useBookingStore = create(set => ({ setIsCreateShortPet: value => set({ isCreateShortPet: value }), setIsBookingInProgress: value => set({ isBookingInProgress: value }), setOwner: value => set({ owner: value }), + setRoom: value => set({ room: value }), setBookingStep: value => set({ bookingStep: value }), setSpecificBookingData: (value, setter) => set(state => ({ diff --git a/src/modules/Pets/api/mutations.ts b/src/modules/Pets/api/mutations.ts index 3a967e9..349f941 100644 --- a/src/modules/Pets/api/mutations.ts +++ b/src/modules/Pets/api/mutations.ts @@ -1,7 +1,8 @@ import { useMutation, useQueryClient } from "@tanstack/react-query" -import { addPet, NewPetDto } from "@/generated/pets" +import { addPet, NewPetDto, updatePet, UpdatePetDto } from "@/generated/pets" import { EMutationKeys } from "./keys" import { EQueryKeys } from "@/modules/Clients/api/keys" +import { EQueryKeys as EPetQueryKeys } from "@/modules/Pets/api/keys" export const useCreatePet = (clientId: number) => { const queryClient = useQueryClient() @@ -17,3 +18,17 @@ export const useCreatePet = (clientId: number) => { }, }) } + +export const useUpdatePet = (petId: number) => { + const queryClient = useQueryClient() + return useMutation({ + mutationKey: [EMutationKeys.UPDATE_PET], + mutationFn: (data: UpdatePetDto) => + updatePet(petId, data, { headers: { "X-PetHotel-User-Id": 1 } }), + onSuccess: petId => { + queryClient.invalidateQueries({ + queryKey: [EPetQueryKeys.GET_PET_BY_ID + petId], + }) + }, + }) +} diff --git a/src/modules/Pets/components/forms/builder/PetFormBuilder.tsx b/src/modules/Pets/components/forms/builder/PetFormBuilder.tsx index 57179be..165803a 100644 --- a/src/modules/Pets/components/forms/builder/PetFormBuilder.tsx +++ b/src/modules/Pets/components/forms/builder/PetFormBuilder.tsx @@ -18,12 +18,13 @@ interface FormBuilderProps { onSubmit: (data: FormData) => void defaultValues?: FormData viewMode?: boolean + formId: string } const FormBuilder = forwardRef( - ({ config, onSubmit, defaultValues, viewMode }: FormBuilderProps) => { - const categories = Object.values(config.categories) - const allFields = categories.flatMap(category => category.fields) + ({ config, onSubmit, defaultValues, viewMode, formId }: FormBuilderProps) => { + const categories = Object.values(config?.categories || {}) + const allFields = categories.flatMap(category => category?.fields) const [expandedCategories, setExpandedCategories] = useState<{ [key: string]: boolean }>({}) @@ -129,7 +130,7 @@ const FormBuilder = forwardRef( {Object.entries(config.categories).map(([categoryKey, category]) => { const isExpanded = expandedCategories[categoryKey] diff --git a/src/modules/Pets/components/forms/builder/createValidationSchema.ts b/src/modules/Pets/components/forms/builder/createValidationSchema.ts index a5a0074..dac9e8e 100644 --- a/src/modules/Pets/components/forms/builder/createValidationSchema.ts +++ b/src/modules/Pets/components/forms/builder/createValidationSchema.ts @@ -8,7 +8,7 @@ export const createValidationSchema = (fields: FormField[]) => { let fieldSchema switch (field.type) { case "text": - fieldSchema = yup.string() + fieldSchema = yup.string().nullable() if (field.required) { fieldSchema = fieldSchema.required( field.validationErr || "This field is required" @@ -24,7 +24,7 @@ export const createValidationSchema = (fields: FormField[]) => { case "date": case "select": case "radio": - fieldSchema = yup.string() + fieldSchema = yup.string().nullable() if (field.required) { fieldSchema = fieldSchema.required( field.validationErr || "This field is required" @@ -32,7 +32,7 @@ export const createValidationSchema = (fields: FormField[]) => { } break case "checkbox": - fieldSchema = yup.boolean() + fieldSchema = yup.boolean().nullable() if (field.required) { fieldSchema = fieldSchema.oneOf( [true], diff --git a/src/modules/Pets/pages/CreatePage/CreatePetFooter.tsx b/src/modules/Pets/pages/CreatePage/CreatePetFooter.tsx new file mode 100644 index 0000000..fe37546 --- /dev/null +++ b/src/modules/Pets/pages/CreatePage/CreatePetFooter.tsx @@ -0,0 +1,44 @@ +import { addConfirmationNotification } from "@/shared/utils/utils" +import { useNavigate, useParams } from "react-router-dom" +import { usePetFormStore } from "../../store" +import { Button, EButtonSize, EButtonVariant } from "@/shared/ui/Button/Button" +import { APP_ROUTES } from "@/routes/types" + +export const CreatePetFooter = () => { + const { id } = useParams() + const navigate = useNavigate() + const confirmNotification = addConfirmationNotification() + const isDirty = usePetFormStore(state => state.isDirty) + const onCloseForm = () => navigate(APP_ROUTES.client(Number(id))) + + const handleNavigate = () => { + if (isDirty) { + confirmNotification(onCloseForm) + } else { + onCloseForm() + } + } + return ( + <> + + + + ) +} diff --git a/src/modules/Pets/pages/CreatePetPage.tsx b/src/modules/Pets/pages/CreatePage/CreatePetPage.tsx similarity index 90% rename from src/modules/Pets/pages/CreatePetPage.tsx rename to src/modules/Pets/pages/CreatePage/CreatePetPage.tsx index 1a83eb8..a742d9c 100644 --- a/src/modules/Pets/pages/CreatePetPage.tsx +++ b/src/modules/Pets/pages/CreatePage/CreatePetPage.tsx @@ -1,5 +1,5 @@ import { useNavigate, useParams } from "react-router-dom" -import FormBuilder from "../components/forms/builder/PetFormBuilder" +import FormBuilder from "../../components/forms/builder/PetFormBuilder" import { useGetClientById } from "@/modules/Clients/api/queries" import { CircularProgress } from "@mui/material" import { CardClientSmall } from "@/modules/Clients/components/ClientsPage/CardClientSmall" @@ -10,10 +10,10 @@ import { addErrorNotification, addSuccessNotification, } from "@/shared/utils/utils" -import { usePetFormStore } from "../store" -import { CAT_CONFIG, DOG_CONFIG, EXOT_CONFIG } from "../components" -import { PetPageTitle } from "../components/common" -import { useCreatePet } from "../api" +import { usePetFormStore } from "../../store" +import { CAT_CONFIG, DOG_CONFIG, EXOT_CONFIG } from "../../components" +import { PetPageTitle } from "../../components/common" +import { useCreatePet } from "../../api" const petConfig = { dog: { @@ -97,6 +97,7 @@ export const CreatePetPage = () => { ref={formRef} config={petConfig[currentPetType].config} onSubmit={handleCreatePet as never} + formId="create-pet" /> {isLoading && } diff --git a/src/modules/Pets/pages/UpdatePage/UpdatePetFooter.tsx b/src/modules/Pets/pages/UpdatePage/UpdatePetFooter.tsx new file mode 100644 index 0000000..f8aa74e --- /dev/null +++ b/src/modules/Pets/pages/UpdatePage/UpdatePetFooter.tsx @@ -0,0 +1,44 @@ +import { addConfirmationNotification } from "@/shared/utils/utils" +import { useNavigate, useParams } from "react-router-dom" +import { usePetFormStore } from "../../store" +import { Button, EButtonSize, EButtonVariant } from "@/shared/ui/Button/Button" +import { APP_ROUTES } from "@/routes/types" + +export const UpdatePetFooter = () => { + const { id } = useParams() + const navigate = useNavigate() + const confirmNotification = addConfirmationNotification() + const isDirty = usePetFormStore(state => state.isDirty) + const onCloseForm = () => navigate(APP_ROUTES.client(Number(id))) + + const handleNavigate = () => { + if (isDirty) { + confirmNotification(onCloseForm) + } else { + onCloseForm() + } + } + return ( + <> + + + + ) +} diff --git a/src/modules/Pets/pages/UpdatePetPage.tsx b/src/modules/Pets/pages/UpdatePage/UpdatePetPage.tsx similarity index 74% rename from src/modules/Pets/pages/UpdatePetPage.tsx rename to src/modules/Pets/pages/UpdatePage/UpdatePetPage.tsx index 61b37bc..e59056f 100644 --- a/src/modules/Pets/pages/UpdatePetPage.tsx +++ b/src/modules/Pets/pages/UpdatePage/UpdatePetPage.tsx @@ -1,5 +1,4 @@ import { useNavigate, useParams } from "react-router-dom" -import FormBuilder from "../components/forms/builder/PetFormBuilder" import { useGetClientById } from "@/modules/Clients/api/queries" import { CircularProgress } from "@mui/material" import { CardClientSmall } from "@/modules/Clients/components/ClientsPage/CardClientSmall" @@ -10,11 +9,13 @@ import { addErrorNotification, addSuccessNotification, } from "@/shared/utils/utils" -import { usePetFormStore } from "../store" -import { CAT_CONFIG, DOG_CONFIG, EXOT_CONFIG, FormData } from "../components" -import { PetPageTitle } from "../components/common" -import { useCreatePet } from "../api" -import { useGetPetById } from "../api/queries" +import { usePetFormStore } from "../../store" +import { useGetPetById } from "../../api/queries" +import { useUpdatePet } from "../../api" +import { PetPageTitle } from "../../components/common" +import { CAT_CONFIG, DOG_CONFIG, EXOT_CONFIG, FormData } from "../../components" +import FormBuilder from "../../components/forms/builder/PetFormBuilder" +import { APP_ROUTES } from "@/routes/types" const petConfig = { dog: { @@ -51,7 +52,7 @@ export const UpdatePetPage = () => { Number(petId) ) - const { mutate: createPet } = useCreatePet(clientData?.id || 0) + const { mutate: updatePet } = useUpdatePet(petData?.id || 0) const formRef = useRef<{ leaveForm: () => void }>(null) @@ -59,7 +60,7 @@ export const UpdatePetPage = () => { const fullName = `${firstName} ${lastName || ""} ${middleName || ""}` - const onCloseForm = () => navigate(`/clients/${id}`) + const onCloseForm = () => navigate(APP_ROUTES.client(Number(id))) const handleNavigate = () => { if (isDirty) { @@ -75,17 +76,16 @@ export const UpdatePetPage = () => { const payload = { ...cleanObj(data), - ownerId: Number(id), // ошибка owner на беке - type: petConfig[currentPetType as keyof typeof petConfig]?.dtoName, // ошибка typeOfPet на беке + ownerId: Number(id), } - createPet(payload as NewPetDto, { + updatePet(payload as NewPetDto, { onSuccess: () => { onCloseForm() - successNotification("Питомец успешно создан") + successNotification("Питомец успешно изменён") }, onError: () => { - errorNotification("Произошла ошибка при создании питомца") + errorNotification("Произошла ошибка при изменении питомца") }, }) } @@ -97,15 +97,19 @@ export const UpdatePetPage = () => { return (
- +
{(isLoading || isPetLoading) && } @@ -114,7 +118,7 @@ export const UpdatePetPage = () => {
diff --git a/src/modules/Pets/pages/PetPage.tsx b/src/modules/Pets/pages/ViewPage/PetPage.tsx similarity index 86% rename from src/modules/Pets/pages/PetPage.tsx rename to src/modules/Pets/pages/ViewPage/PetPage.tsx index b7f55c5..2bb0d42 100644 --- a/src/modules/Pets/pages/PetPage.tsx +++ b/src/modules/Pets/pages/ViewPage/PetPage.tsx @@ -1,20 +1,20 @@ import { useNavigate, useParams } from "react-router-dom" -import FormBuilder from "../components/forms/builder/PetFormBuilder" +import FormBuilder from "../../components/forms/builder/PetFormBuilder" import { useGetClientById } from "@/modules/Clients/api/queries" import { CircularProgress } from "@mui/material" import { CardClientSmall } from "@/modules/Clients/components/ClientsPage/CardClientSmall" import { useRef } from "react" import { addConfirmationNotification } from "@/shared/utils/utils" -import { usePetFormStore } from "../store" +import { usePetFormStore } from "../../store" import { CAT_CONFIG, DOG_CONFIG, EXOT_CONFIG, FormData as PetFormData, -} from "../components" -import { PetPageTitle } from "../components/common" -import { useGetPetById } from "../api/queries" -import { PetTranslatedTypes } from "../components/forms/types/enums" +} from "../../components" +import { PetPageTitle } from "../../components/common" +import { useGetPetById } from "../../api/queries" +import { PetTranslatedTypes } from "../../components/forms/types/enums" const petConfig = { DOG: DOG_CONFIG, @@ -65,6 +65,7 @@ export const PetPage = () => { onSubmit={() => {}} defaultValues={petData as PetFormData} viewMode + formId="pet-form" /> {isLoading && } diff --git a/src/modules/Pets/pages/ViewPage/ViewPetFooter.tsx b/src/modules/Pets/pages/ViewPage/ViewPetFooter.tsx new file mode 100644 index 0000000..8c0f491 --- /dev/null +++ b/src/modules/Pets/pages/ViewPage/ViewPetFooter.tsx @@ -0,0 +1,35 @@ +import { useNavigate, useParams } from "react-router-dom" +import { Button, EButtonSize, EButtonVariant } from "@/shared/ui/Button/Button" +import { APP_ROUTES } from "@/routes/types" + +export const ViewPetFooter = () => { + const { id, petId } = useParams() + const navigate = useNavigate() + + const handleNavigate = () => { + navigate(APP_ROUTES.updatePet(Number(id), Number(petId))) + } + return ( + <> + + + + ) +} diff --git a/src/modules/Pets/pages/index.ts b/src/modules/Pets/pages/index.ts index 526b281..31358a3 100644 --- a/src/modules/Pets/pages/index.ts +++ b/src/modules/Pets/pages/index.ts @@ -1,2 +1,2 @@ -export * from "./CreatePetPage" -export * from "./PetPage" +export * from "./CreatePage/CreatePetPage" +export * from "./ViewPage/PetPage" diff --git a/src/modules/Rooms/api/queries.ts b/src/modules/Rooms/api/queries.ts index bb3a881..7f94df5 100644 --- a/src/modules/Rooms/api/queries.ts +++ b/src/modules/Rooms/api/queries.ts @@ -1,6 +1,11 @@ import { useQuery } from "@tanstack/react-query" import { EQueryKeys } from "./keys" -import { RoomDto, checkUniqueRoomNumber, getAllRooms } from "@/generated/room" +import { + RoomDto, + checkUniqueRoomNumber, + getAllRooms, + getRoomById, +} from "@/generated/room" export const useGetAllRooms = (key: string) => useQuery({ queryKey: [`${EQueryKeys.GET_ALL_ROOMS} ${key}`], @@ -11,6 +16,12 @@ export const useGetAllRooms = (key: string) => ) as Promise, }) +export const useGetRoomById = (id: number) => + useQuery({ + queryKey: [`${EQueryKeys.GET_ALL_ROOMS} ${id}`], + queryFn: () => getRoomById(id, { headers: { "X-PetHotel-User-Id": 1 } }), + }) + export const useCheckUniqueRoomNumber = ( roomNumber: string, enabled?: boolean diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index b40000a..feff8c2 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -1,12 +1,12 @@ import { lazy, Suspense } from "react" import { RouteObject } from "react-router-dom" -import { LayoutWithFooter } from "@/shared/ui/Layouts/LayoutWithFooter" -import { LayoutBookingGrid } from "@/shared/ui/Layouts/LayoutBookingGrid" import { CreatePetPage, PetPage } from "@/modules/Pets" import { BookingGridPage } from "@/modules/Booking/pages/BookingGridPage/BookingGridPage" -import { UpdatePetPage } from "@/modules/Pets/pages/UpdatePetPage" +// import { UpdatePetPage } from "@/modules/Pets/pages/UpdatePetPage" import { Layout } from "@/shared/ui/Layouts/Layout" import { CreateBookingPage } from "@/modules/Booking/pages/CreateBookingPage/CreateBookingPage" +import { APP_ROUTES } from "./types" +import { UpdatePetPage } from "@/modules/Pets/pages/UpdatePage/UpdatePetPage" const CategoriesPage = lazy(() => import("@/modules/Categories/pages/CategoriesPage").then(module => ({ @@ -43,27 +43,21 @@ const BookingPage = lazy(() => default: module.BookingPage, })) ) -// const CreateBookingPage = lazy(() => -// import("@/modules/Booking/pages/CreateBookingPage/CreateBookingPage").then( -// module => ({ -// default: module.CreateBookingPage, -// }) -// ) -// ) const ClientPage = lazy(() => import("@/modules/Clients/pages/ClientPage.tsx").then(module => ({ default: module.ClientPage, })) ) +// 4. Компонент для ленивой загрузки const LazyLoadWrapper = ({ children }: { children: React.ReactNode }) => ( Loading...
}>{children} ) -//TODO: вынести все path в общий объект, чтобы избежать опечаток в будущем +// 5. Типизированные маршруты export const routes: RouteObject[] = [ { - path: "/", + path: APP_ROUTES.home, element: , children: [ { @@ -75,7 +69,7 @@ export const routes: RouteObject[] = [ ), }, { - path: "*", + path: APP_ROUTES.notFound, element: ( @@ -83,7 +77,7 @@ export const routes: RouteObject[] = [ ), }, { - path: "categories", + path: APP_ROUTES.categories, element: ( @@ -91,7 +85,7 @@ export const routes: RouteObject[] = [ ), }, { - path: "rooms", + path: APP_ROUTES.rooms, element: ( @@ -99,7 +93,7 @@ export const routes: RouteObject[] = [ ), }, { - path: "clients", + path: APP_ROUTES.clients, element: ( @@ -107,7 +101,7 @@ export const routes: RouteObject[] = [ ), }, { - path: "booking/:bookingId", + path: APP_ROUTES.booking(":bookingId"), element: ( @@ -115,7 +109,7 @@ export const routes: RouteObject[] = [ ), }, { - path: "clients/:id", + path: APP_ROUTES.client(":id"), element: ( @@ -123,45 +117,41 @@ export const routes: RouteObject[] = [ ), }, { - path: "clients/:id/pets/:petType/create", + path: APP_ROUTES.createPet(":id", ":petType"), element: , }, { - path: "clients/:id/pets/:petId/update", + path: APP_ROUTES.updatePet(":id", ":petId"), element: , }, { - path: "clients/:id/pets/:petId", + path: APP_ROUTES.pet(":id", ":petId"), element: , }, + { + path: APP_ROUTES.createBooking, + element: ( + + + + ), + }, + { + path: APP_ROUTES.bookings, + element: ( + + + + ), + }, ], }, { - path: "/authorization", + path: APP_ROUTES.authorization, element: ( ), }, - { - path: "/create-booking", - element: , - children: [ - { - index: true, - element: , - }, - ], - }, - { - path: "/bookings", - element: , - children: [ - { - index: true, - element: , - }, - ], - }, ] diff --git a/src/routes/types.ts b/src/routes/types.ts new file mode 100644 index 0000000..707c609 --- /dev/null +++ b/src/routes/types.ts @@ -0,0 +1,45 @@ +import { BookingFooter } from "@/modules/Booking/pages/CreateBookingPage/CreateBookingFooter" +import { CreatePetFooter } from "@/modules/Pets/pages/CreatePage/CreatePetFooter" +import { UpdatePetFooter } from "@/modules/Pets/pages/UpdatePage/UpdatePetFooter" +import { ViewPetFooter } from "@/modules/Pets/pages/ViewPage/ViewPetFooter" + +export type AppRoutes = { + home: string + notFound: string + categories: string + rooms: string + clients: string + client: (id: string | number) => string + booking: (bookingId: string | number) => string + createPet: (clientId: string | number, petType: string) => string + updatePet: (clientId: string | number, petId: string | number) => string + pet: (clientId: string | number, petId: string | number) => string + authorization: string + createBooking: string + bookings: string +} + +export const APP_ROUTES: AppRoutes = { + home: "/", + notFound: "*", + categories: "/categories", + rooms: "/rooms", + clients: "/clients", + client: id => `/clients/${id}`, + booking: bookingId => `/booking/${bookingId}`, + createPet: (clientId, petType) => + `/clients/${clientId}/pets/${petType}/create`, + updatePet: (clientId, petId) => `/clients/${clientId}/pets/${petId}/update`, + pet: (clientId, petId) => `/clients/${clientId}/pets/${petId}`, + authorization: "/authorization", + createBooking: "/create-booking", + bookings: "/bookings", +} + +export const FooterMap = new Map JSX.Element>([ + ["booking", BookingFooter], + ["createPet", CreatePetFooter], + ["createBooking", BookingFooter], + ["pet", ViewPetFooter], + ["updatePet", UpdatePetFooter], +]) diff --git a/src/routes/utils.ts b/src/routes/utils.ts new file mode 100644 index 0000000..3001192 --- /dev/null +++ b/src/routes/utils.ts @@ -0,0 +1,36 @@ +import { APP_ROUTES, AppRoutes } from "./types" + +/** + * Находит ключ маршрута по его значению с учетом любого количества параметров + * @param pathValue - проверяемый путь + * @returns Ключ маршрута или null, если не найден + */ +export function getRouteKeyByPath(pathValue: string): keyof AppRoutes | null { + const staticRoutes = Object.entries(APP_ROUTES).filter( + ([, value]) => typeof value === "string" + ) as Array<[keyof AppRoutes, string]> + + for (const [key, staticPath] of staticRoutes) { + if (staticPath === pathValue) { + return key + } + } + + const dynamicRoutes = Object.entries(APP_ROUTES).filter( + ([, value]) => typeof value === "function" + ) as Array<[keyof AppRoutes, Function]> + + for (const [key, generator] of dynamicRoutes) { + const testParams = Array.from({ length: 10 }, (_, i) => `:param${i + 1}`) + const testPath = generator(...testParams) + + const regexPattern = + "^" + testPath.replace(/\/:\w+/g, "/([^/]+)").replace(/\?/g, "\\?") + "$" + + if (new RegExp(regexPattern).test(pathValue)) { + return key + } + } + + return null +} diff --git a/src/shared/ui/ErrorBar/ErrorBar.tsx b/src/shared/ui/ErrorBar/ErrorBar.tsx index 7c872a0..37024b1 100644 --- a/src/shared/ui/ErrorBar/ErrorBar.tsx +++ b/src/shared/ui/ErrorBar/ErrorBar.tsx @@ -1,50 +1,47 @@ - import { Box } from "@mui/material" import { Typography, styled } from "@mui/material" -import { Icon } from '../Icon/Icon'; -import { BarStyle } from "./utils"; - +import { Icon } from "../Icon/Icon" +import { BarStyle } from "./utils" const BarTitle = styled(Typography)(() => ({ - color: "#181A1A", - fontSize: "16px", - fontWeight: 700, - lineHeight: "16px", - paddingLeft: "8px" + color: "#181A1A", + fontSize: "16px", + fontWeight: 700, + lineHeight: "16px", + paddingLeft: "8px", })) const BarBody = styled(Typography)(() => ({ - color: "#181A1A", - fontSize: "14px", - fontWeight: 400, - lineHeight: "20px", - paddingLeft: "8px" + color: "#181A1A", + fontSize: "14px", + fontWeight: 400, + lineHeight: "20px", + paddingLeft: "8px", })) - -interface ErrorProps { title: string, body: string, style: StyleTheme } +interface ErrorProps { + title: string + body: string + style: StyleTheme +} export type StyleTheme = "Blue" | "Red" | "Yellow" - const ErrorBar = (props: ErrorProps) => { - - const { title, body, style } = props - const Bar = BarStyle(style) - - return ( - - -
- - {title} - - - {body} - -
-
- - ); + const { title, body, style } = props + const Bar = BarStyle(style) + + return ( + + +
+ {title} + {body} +
+
+ ) } -export default ErrorBar; - +export default ErrorBar diff --git a/src/shared/ui/ErrorBar/utils.ts b/src/shared/ui/ErrorBar/utils.ts index d02f225..32e5af2 100644 --- a/src/shared/ui/ErrorBar/utils.ts +++ b/src/shared/ui/ErrorBar/utils.ts @@ -1,33 +1,30 @@ -import { TIcon } from "@/assets/Icons/types"; -import { StyleTheme } from "./ErrorBar"; +import { TIcon } from "@/assets/Icons/types" +import { StyleTheme } from "./ErrorBar" -interface Theme { Logo: TIcon, Border: string } +interface Theme { + Logo: TIcon + Border: string +} const YellowTheme: Theme = { - Logo: 'AttentionYellow', - Border: '2px solid #FFC107' + Logo: "AttentionYellow", + Border: "2px solid #FFC107", } const BlueTheme: Theme = { - Logo: 'AttentionBlue', - Border: '2px solid #196D88' - + Logo: "AttentionBlue", + Border: "2px solid #196D88", } const RedTheme: Theme = { - Logo: 'AttentionRed', - Border: '2px solid #FF7878' - + Logo: "AttentionRed", + Border: "2px solid #FF7878", } export const BarStyle = (type: StyleTheme) => { - switch (type) { - case 'Yellow': - return YellowTheme - break; - case 'Blue': - return BlueTheme - break; - case 'Red': - return RedTheme - break; - - } -} \ No newline at end of file + switch (type) { + case "Yellow": + return YellowTheme + case "Blue": + return BlueTheme + case "Red": + return RedTheme + } +} diff --git a/src/shared/ui/Footer/Footer.tsx b/src/shared/ui/Footer/Footer.tsx new file mode 100644 index 0000000..5993882 --- /dev/null +++ b/src/shared/ui/Footer/Footer.tsx @@ -0,0 +1,35 @@ +import { FooterMap } from "@/routes/types" +import { getRouteKeyByPath } from "@/routes/utils" +import { styled } from "@mui/material" +import { useLocation } from "react-router-dom" + +const StyledFooter = styled("footer")(({ theme }) => ({ + marginTop: "40px", + boxShadow: "0px -4px 8px 0px rgba(0, 0, 0, 0.09)", + color: theme.palette.common.white, + display: "flex", + justifyContent: "flex-end", + padding: "24px", + gap: "8px", + position: "fixed", + bottom: 0, + width: "100%", +})) + +export const Footer = () => { + const { pathname } = useLocation() + + const pathnameKey = getRouteKeyByPath(pathname) + + if (!pathnameKey) return null + + const FooterComponent = FooterMap.get(pathnameKey) + + if (!FooterComponent) return null + + return ( + + + + ) +} diff --git a/src/shared/ui/Layouts/Layout.tsx b/src/shared/ui/Layouts/Layout.tsx index cee455d..8f534b5 100644 --- a/src/shared/ui/Layouts/Layout.tsx +++ b/src/shared/ui/Layouts/Layout.tsx @@ -4,10 +4,11 @@ import { Header } from "@/widgets/Header/ui/Header" import { CircularProgress } from "@mui/material" import { FC, Suspense } from "react" import { Outlet } from "react-router-dom" +import { Footer } from "@/shared/ui/Footer/Footer" export const Layout: FC = () => { return ( -
+ <>
@@ -17,6 +18,7 @@ export const Layout: FC = () => {
-
+