From 135141b9772b8f4dc82875589a9138bbfeaa61c7 Mon Sep 17 00:00:00 2001 From: Yoganandan Pandiyan Date: Mon, 20 Jul 2026 14:37:55 +0200 Subject: [PATCH 1/7] WIP --- .../postgres/ProposalDataSource.ts | 10 +- apps/frontend/package-lock.json | 4834 ++++++----------- apps/frontend/package.json | 14 +- .../AppToolbar/AccountActionButton.tsx | 24 +- .../src/components/AppToolbar/AppToolbar.tsx | 4 +- apps/frontend/src/components/PageLayout.tsx | 9 +- .../src/components/admin/AssignTagsForm.tsx | 4 +- .../call/AssignedInstrumentsTable.tsx | 4 +- .../src/components/call/CallGeneralInfo.tsx | 4 +- .../call/CallNotificationAndCycleInfo.tsx | 2 +- .../src/components/call/CallReviewsInfo.tsx | 2 +- .../src/components/call/CallsTable.tsx | 8 +- .../src/components/common/ChangeRole.tsx | 16 +- .../src/components/common/EmailSearchBar.tsx | 7 +- .../src/components/common/ErrorMessage.tsx | 8 +- .../components/common/FileUploadComponent.tsx | 81 +- .../common/FormikUIAutocomplete.tsx | 30 +- .../FormikUICustomDependencySelector.tsx | 8 +- .../components/common/FormikUIDatePicker.tsx | 10 +- .../common/FormikUIDateTimePicker.tsx | 10 +- .../src/components/common/SimpleTabs.tsx | 37 +- .../common/TextFieldWithCounter.tsx | 36 +- .../common/experimentFilters/DateFilter.tsx | 20 +- .../FormikUIPredefinedMessagesTextField.tsx | 27 +- .../common/proposalFilters/DateFilter.tsx | 12 +- .../proposalFilters/QuestionaryFilter.tsx | 6 +- .../src/components/experiment/DateFilter.tsx | 20 +- .../experiment/ExperimentFilterBar.tsx | 20 +- .../experiment/ExperimentReviewContent.tsx | 699 +-- .../experiment/ExperimentReviewModal.tsx | 6 +- .../experimentSafety/ExperimentSafety.tsx | 84 +- .../ExperimentSafetyReview.tsx | 210 +- .../ExperimentSafetyReviewPage.tsx | 592 +- .../experimentSample/SampleEsiReview.tsx | 164 +- .../src/components/fap/FapGradeGuide.tsx | 6 +- .../frontend/src/components/fap/FapsTable.tsx | 6 +- .../components/fap/General/FapGeneralInfo.tsx | 14 +- .../FapMeetingComponentsView.tsx | 6 +- .../FapUpdateInstrumentTime.tsx | 16 +- .../FapMeetingProposalViewModal.tsx | 8 +- .../ProposalViewModal/FinalRankingForm.tsx | 22 +- .../src/components/fap/Members/FapMembers.tsx | 95 +- .../Proposals/MultiRankAssignmentDialog.tsx | 12 +- .../ProposalsView/AssignProposalsToFaps.tsx | 2 +- .../FapProposalsAndAssignmentsTable.tsx | 2 +- .../FapProposalsAndAssignmentsView.tsx | 12 +- .../ProposalsView/LegacyFapProposals.tsx | 12 +- .../fap/Proposals/RankInputModal.tsx | 4 +- .../FapReviewersAndAssignmentsTable.tsx | 6 +- .../FapReviewersAndAssignmentsView.tsx | 12 +- .../components/feedback/FeedbackReview.tsx | 162 +- .../institution/MergeInstitutionPage.tsx | 344 +- .../AssignProposalsToInstruments.tsx | 2 +- .../instrument/CreateUpdateInstrument.tsx | 4 +- .../CreateUpdateInternalReview.tsx | 620 +-- .../internalReview/InternalReviewsTable.tsx | 238 +- .../src/components/pages/GradeGuidePage.tsx | 8 +- .../src/components/pages/OverviewPage.tsx | 12 +- .../CallSelectModalOnProposalClone.tsx | 2 +- .../proposal/ChangeProposalStatus.tsx | 20 +- .../components/proposal/NotifyProposal.tsx | 2 +- .../proposal/PrincipalInvestigator.tsx | 13 +- .../src/components/proposal/ProposalAdmin.tsx | 22 +- .../proposal/ProposalAdminReadOnly.tsx | 18 +- .../proposal/ProposalAttachmentDownload.tsx | 12 +- .../proposal/ProposalChooseCall.tsx | 4 +- .../components/proposal/ProposalFilterBar.tsx | 28 +- .../proposal/ProposalInviteNotification.tsx | 5 +- .../proposal/ProposalPeopleSelectorModal.tsx | 38 +- .../components/proposal/ProposalSummary.tsx | 410 +- .../ProposalTableInstrumentScientist.tsx | 21 +- .../proposal/ProposalTableOfficer.tsx | 15 +- .../proposal/TableActionsDropdownMenu.tsx | 58 +- .../components/proposalBooking/BasicCard.tsx | 110 + .../proposalBooking/CreateUpdateVisit.tsx | 286 +- .../questionary/NavigationFragment.tsx | 9 +- .../questionary/QuestionaryDetails.tsx | 4 +- .../Boolean/BooleanSearchCriteriaInput.tsx | 2 +- .../Boolean/QuestionaryComponentBoolean.tsx | 8 +- .../DatePicker/DateSearchCriteriaInput.tsx | 18 +- .../DatePicker/QuestionDateForm.tsx | 2 +- .../QuestionTemplateRelationDateForm.tsx | 2 +- .../QuestionaryComponentDatePicker.tsx | 2 +- ...cMultipleChoiceSearchCriteriaComponent.tsx | 2 +- .../QuestionaryComponentFapReviewBasis.tsx | 6 +- .../QuestionaryComponentFeedbackBasis.tsx | 94 +- .../FileUploadSearchCriteriaInput.tsx | 2 +- .../QuestionaryComponentFileUpload.tsx | 142 +- ...estionaryComponentGenericTemplateBasis.tsx | 212 +- .../questionaryComponents/Hint.tsx | 11 +- ...nstrumentPickerSearchCriteriaComponent.tsx | 2 +- .../QuestionaryComponentInstrumentPicker.tsx | 60 +- .../IntervalSearchCriteriaComponent.tsx | 6 +- .../Interval/QuestionaryComponentInterval.tsx | 24 +- .../MultipleChoiceSearchCriteriaComponent.tsx | 2 +- .../NumberSearchCriteriaComponent.tsx | 6 +- .../NumberInput/QuestionNumberInputForm.tsx | 2 +- .../QuestionaryComponentNumberInput.tsx | 14 +- .../QuestionaryComponentProposalBasis.tsx | 502 +- ...stionaryComponentExperimentSafetyBasis.tsx | 950 ++-- .../QuestionDependencyList.tsx | 23 +- .../QuestionFormShell.tsx | 246 +- .../QuestionTemplateRelationFormShell.tsx | 288 +- .../QuestionnairesList.tsx | 8 +- .../QuestionaryComponentRichTextInput.tsx | 1 - .../QuestionaryComponentSampleBasis.tsx | 198 +- .../QuestionaryComponentSampleDeclaration.tsx | 528 +- .../QuestionaryComponentShipmentBasis.tsx | 508 +- ...estionaryComponentTechnicalReviewBasis.tsx | 18 +- ...TechniquePickerSearchCriteriaComponent.tsx | 2 +- .../TextInput/TextSearchCriteriaComponent.tsx | 4 +- .../QuestionaryComponentVisitBasis.tsx | 304 +- .../review/AssignTechnicalReview.tsx | 256 +- .../review/ProposalReviewContent.tsx | 623 +-- .../components/review/ProposalReviewModal.tsx | 6 +- .../review/ProposalTableReviewer.tsx | 31 +- .../src/components/review/ReviewerFilter.tsx | 4 +- .../CreateUpdateApiAccessToken.tsx | 22 +- .../proposalStatus/ProposalStatusesTable.tsx | 2 +- .../workflow/AddStatusActionsToConnection.tsx | 20 +- .../settings/workflow/EmailActionConfig.tsx | 34 +- .../SetStatusChangingEventsOnConnection.tsx | 26 +- .../settings/workflow/StatusNode.tsx | 7 +- .../settings/workflow/StatusPicker.tsx | 13 +- .../settings/workflow/WorkflowEditor.tsx | 4 +- .../settings/workflow/WorkflowEditorModel.tsx | 676 +-- .../components/shipments/DeclareShipments.tsx | 420 +- .../components/shipments/ShipmentReview.tsx | 252 +- .../StatusActionsLogsTable.tsx | 12 +- .../AssignInstrumentsToTechniques.tsx | 2 +- .../ProposalScientistComment.tsx | 4 +- .../TechniqueProposalFilterBar.tsx | 36 +- .../components/template/CreateTemplate.tsx | 230 +- .../components/template/QuestionPicker.tsx | 8 +- .../template/QuestionPickerFilter.tsx | 8 +- .../src/components/template/QuestionsPage.tsx | 532 +- .../template/QuestionsTableFilter.tsx | 12 +- .../template/TemplateQuestionEditor.tsx | 18 +- .../template/TemplateTopicEditor.tsx | 10 +- .../components/template/TemplatesTable.tsx | 686 +-- .../src/components/template/documentation.tsx | 8 +- .../template/import/ImportTemplatePage.tsx | 110 +- .../template/import/MergeReview.tsx | 332 +- .../experimentSafety/PdfTemplateEditor.tsx | 468 +- .../pdf/proposal/PdfTemplateEditor.tsx | 502 +- .../src/components/unit/ImportUnitsPage.tsx | 106 +- .../src/components/user/ExternalAuth.tsx | 372 +- .../components/user/UpdateUserInformation.tsx | 415 +- .../src/components/user/UserListItem.tsx | 7 +- .../visit/VisitRegistrationReview.tsx | 232 +- .../src/context/DownloadContextProvider.tsx | 10 +- apps/frontend/src/hooks/common/useDataApi.ts | 580 +- .../src/hooks/common/useRenewToken.ts | 56 +- .../usePersistQuestionaryEditorModel.ts | 600 +- .../settings/usePersistWorkflowEditorModel.ts | 650 +-- apps/frontend/src/index.css | 8 +- .../questionary/QuestionaryEditorModel.ts | 414 +- apps/frontend/src/utils/Time.ts | 306 +- apps/frontend/src/utils/helperFunctions.tsx | 10 +- apps/frontend/src/utils/materialIcons.tsx | 2 +- apps/frontend/src/utils/materialTableIcon.ts | 15 + .../src/utils/useDataApiWithFeedback.ts | 94 +- apps/frontend/src/utils/utilTypes.ts | 92 +- apps/frontend/vite.config.mts | 5 + 164 files changed, 11269 insertions(+), 12002 deletions(-) create mode 100644 apps/frontend/src/components/proposalBooking/BasicCard.tsx create mode 100644 apps/frontend/src/utils/materialTableIcon.ts diff --git a/apps/backend/src/datasources/postgres/ProposalDataSource.ts b/apps/backend/src/datasources/postgres/ProposalDataSource.ts index de29890a80..4247ce5f73 100644 --- a/apps/backend/src/datasources/postgres/ProposalDataSource.ts +++ b/apps/backend/src/datasources/postgres/ProposalDataSource.ts @@ -1419,7 +1419,7 @@ export default class PostgresProposalDataSource implements ProposalDataSource { } async getInvitedProposal(inviteId: number): Promise { - const proposals: InvitedProposalRecord[] | undefined = await database + return await database .select( 'proposals.proposal_id', 'proposer.firstname as proposer_name', @@ -1433,8 +1433,10 @@ export default class PostgresProposalDataSource implements ProposalDataSource { .join('users as proposer', { 'proposals.proposer_id': 'proposer.user_id', }) - .where('invite_id', inviteId); - - return proposals ? createInvitedProposalObject(proposals[0]) : null; + .where('invite_id', inviteId) + .first() + .then((proposal: InvitedProposalRecord) => { + return proposal ? createInvitedProposalObject(proposal) : null; + }); } } diff --git a/apps/frontend/package-lock.json b/apps/frontend/package-lock.json index 11f3b79331..04a6cedcce 100644 --- a/apps/frontend/package-lock.json +++ b/apps/frontend/package-lock.json @@ -10,17 +10,19 @@ "hasInstallScript": true, "dependencies": { "@codemirror/lang-html": "^6.4.5", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", "@graphql-codegen/cli": "^6.2.1", "@graphql-codegen/typescript": "^5.0.9", "@graphql-codegen/typescript-graphql-request": "^7.0.0", "@graphql-codegen/typescript-operations": "^5.0.9", "@graphql-typed-document-node/core": "^3.2.0", "@hello-pangea/dnd": "^16.6.0", - "@material-table/core": "^6.4.4", - "@mui/icons-material": "^5.15.18", - "@mui/material": "^5.15.18", - "@mui/system": "^5.15.15", - "@mui/x-date-pickers": "^7.5.0", + "@material-table/core": "6.4.4", + "@mui/icons-material": "^9.2.0", + "@mui/material": "^9.2.0", + "@mui/system": "^9.2.0", + "@mui/x-date-pickers": "^9.9.0", "@tinymce/tinymce-react": "^5.1.1", "@types/mime": "^2.0.3", "@uiw/react-codemirror": "^4.22.1", @@ -37,7 +39,7 @@ "jwt-decode": "^4.0.0", "luxon": "^3.4.4", "mime": "^3.0.0", - "notistack": "^2.0.4", + "notistack": "^3.0.2", "pdfjs-dist": "^5.4.296", "query-string": "^6.14.0", "react": "^18.3.1", @@ -480,13 +482,6 @@ "@babel/core": "^7.0.0-0" } }, - "../../validation/node_modules/@babel/runtime": { - "version": "7.28.6", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "../../validation/node_modules/@babel/template": { "version": "7.28.6", "dev": true, @@ -534,6 +529,22 @@ "dev": true, "license": "MIT" }, + "../../validation/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "../../validation/node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "dev": true, @@ -558,57 +569,57 @@ } }, "../../validation/node_modules/@jest/console": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", + "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "chalk": "^4.1.2", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", "slash": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jest/core": { - "version": "29.7.0", + "version": "30.4.2", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/console": "30.4.1", + "@jest/pattern": "30.4.0", + "@jest/reporters": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.4.1", + "jest-config": "30.4.2", + "jest-haste-map": "30.4.1", + "jest-message-util": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-resolve-dependencies": "30.4.2", + "jest-runner": "30.4.2", + "jest-runtime": "30.4.2", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "jest-watcher": "30.4.1", + "pretty-format": "30.4.1", + "slash": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -619,105 +630,132 @@ } } }, + "../../validation/node_modules/@jest/core/node_modules/@jest/pattern": { + "version": "30.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "../../validation/node_modules/@jest/diff-sequences": { + "version": "30.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "../../validation/node_modules/@jest/environment": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/fake-timers": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "jest-mock": "^29.7.0" + "jest-mock": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jest/expect": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "expect": "30.4.1", + "jest-snapshot": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jest/expect-utils": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3" + "@jest/get-type": "30.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jest/fake-timers": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", + "@jest/types": "30.4.1", + "@sinonjs/fake-timers": "^15.4.0", "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "../../validation/node_modules/@jest/get-type": { + "version": "30.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jest/globals": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "@jest/environment": "30.4.1", + "@jest/expect": "30.4.1", + "@jest/types": "30.4.1", + "jest-mock": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jest/reporters": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", + "@jest/console": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", + "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", + "jest-worker": "30.4.1", "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", + "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -729,96 +767,122 @@ } }, "../../validation/node_modules/@jest/schemas": { - "version": "29.6.3", + "version": "30.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "../../validation/node_modules/@jest/snapshot-utils": { + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jest/source-map": { - "version": "29.6.3", + "version": "30.0.1", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jest/test-result": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@jest/console": "30.4.1", + "@jest/types": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jest/test-sequencer": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "@jest/test-result": "30.4.1", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", "slash": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jest/transform": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", + "@babel/core": "^7.27.4", + "@jest/types": "30.4.1", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-util": "30.4.1", + "pirates": "^4.0.7", "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "write-file-atomic": "^5.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jest/types": { - "version": "29.6.3", + "version": "30.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "../../validation/node_modules/@jest/types/node_modules/@jest/pattern": { + "version": "30.4.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "jest-regex-util": "30.4.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/@jridgewell/gen-mapping": { @@ -861,8 +925,28 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "../../validation/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "../../validation/node_modules/@pkgr/core": { + "version": "0.2.9", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, "../../validation/node_modules/@sinclair/typebox": { - "version": "0.27.10", + "version": "0.34.49", "dev": true, "license": "MIT" }, @@ -875,11 +959,11 @@ } }, "../../validation/node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", + "version": "15.4.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@sinonjs/commons": "^3.0.1" } }, "../../validation/node_modules/@types/babel__core": { @@ -919,14 +1003,6 @@ "@babel/types": "^7.28.2" } }, - "../../validation/node_modules/@types/graceful-fs": { - "version": "4.1.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../validation/node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "dev": true, @@ -949,20 +1025,16 @@ } }, "../../validation/node_modules/@types/jest": { - "version": "29.5.14", + "version": "30.0.0", "dev": true, "license": "MIT", "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" + "expect": "^30.0.0", + "pretty-format": "^30.0.0" } }, - "../../validation/node_modules/@types/lodash": { - "version": "4.17.23", - "license": "MIT" - }, "../../validation/node_modules/@types/luxon": { - "version": "2.4.0", + "version": "3.7.2", "dev": true, "license": "MIT" }, @@ -975,11 +1047,11 @@ } }, "../../validation/node_modules/@types/sanitize-html": { - "version": "2.16.0", + "version": "2.16.1", "dev": true, "license": "MIT", "dependencies": { - "htmlparser2": "^8.0.0" + "htmlparser2": "^10.1" } }, "../../validation/node_modules/@types/stack-utils": { @@ -1000,6 +1072,23 @@ "dev": true, "license": "MIT" }, + "../../validation/node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "dev": true, + "license": "ISC" + }, + "../../validation/node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, "../../validation/node_modules/ansi-escapes": { "version": "4.3.2", "dev": true, @@ -1015,11 +1104,14 @@ } }, "../../validation/node_modules/ansi-regex": { - "version": "5.0.1", + "version": "6.2.2", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "../../validation/node_modules/ansi-styles": { @@ -1057,67 +1149,52 @@ } }, "../../validation/node_modules/babel-jest": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", + "@jest/transform": "30.4.1", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.4.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", "slash": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.8.0" + "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "../../validation/node_modules/babel-plugin-istanbul": { - "version": "6.1.1", + "version": "7.0.1", "dev": true, "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" }, "engines": { - "node": ">=8" - } - }, - "../../validation/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" + "node": ">=12" } }, "../../validation/node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", + "version": "30.4.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" + "@types/babel__core": "^7.20.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/babel-preset-current-node-syntax": { @@ -1146,18 +1223,18 @@ } }, "../../validation/node_modules/babel-preset-jest": { - "version": "29.6.3", + "version": "30.4.0", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" + "babel-plugin-jest-hoist": "30.4.0", + "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "../../validation/node_modules/balanced-match": { @@ -1174,25 +1251,11 @@ } }, "../../validation/node_modules/brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../../validation/node_modules/braces": { - "version": "3.0.3", + "version": "2.1.0", "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0" } }, "../../validation/node_modules/browserslist": { @@ -1267,6 +1330,25 @@ "node": ">=6" } }, + "../../validation/node_modules/caniuse-lite": { + "version": "1.0.30001769", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "../../validation/node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -1291,7 +1373,7 @@ } }, "../../validation/node_modules/ci-info": { - "version": "3.9.0", + "version": "4.4.0", "dev": true, "funding": [ { @@ -1305,7 +1387,7 @@ } }, "../../validation/node_modules/cjs-module-lexer": { - "version": "1.4.3", + "version": "2.2.0", "dev": true, "license": "MIT" }, @@ -1322,6 +1404,59 @@ "node": ">=12" } }, + "../../validation/node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../validation/node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../validation/node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../validation/node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../validation/node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "../../validation/node_modules/co": { "version": "4.6.0", "dev": true, @@ -1362,26 +1497,6 @@ "dev": true, "license": "MIT" }, - "../../validation/node_modules/create-jest": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../validation/node_modules/cross-spawn": { "version": "7.0.6", "dev": true, @@ -1395,6 +1510,10 @@ "node": ">= 8" } }, + "../../validation/node_modules/dayjs": { + "version": "1.11.20", + "license": "MIT" + }, "../../validation/node_modules/debug": { "version": "4.4.3", "dev": true, @@ -1412,7 +1531,7 @@ } }, "../../validation/node_modules/dedent": { - "version": "1.7.1", + "version": "1.7.2", "dev": true, "license": "MIT", "peerDependencies": { @@ -1439,14 +1558,6 @@ "node": ">=8" } }, - "../../validation/node_modules/diff-sequences": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../validation/node_modules/dom-serializer": { "version": "2.0.0", "license": "MIT", @@ -1494,6 +1605,11 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "../../validation/node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, "../../validation/node_modules/electron-to-chromium": { "version": "1.5.286", "dev": true, @@ -1511,7 +1627,7 @@ } }, "../../validation/node_modules/emoji-regex": { - "version": "8.0.0", + "version": "9.2.2", "dev": true, "license": "MIT" }, @@ -1585,26 +1701,33 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "../../validation/node_modules/exit": { - "version": "0.1.2", + "../../validation/node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "../../validation/node_modules/exit-x": { + "version": "0.2.2", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "../../validation/node_modules/expect": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "@jest/expect-utils": "30.4.1", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/fast-json-stable-stringify": { @@ -1620,27 +1743,31 @@ "bser": "2.1.1" } }, - "../../validation/node_modules/fill-range": { - "version": "7.1.1", + "../../validation/node_modules/find-up": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, - "../../validation/node_modules/find-up": { - "version": "4.1.0", + "../../validation/node_modules/foreground-child": { + "version": "3.3.1", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "../../validation/node_modules/fs.realpath": { @@ -1648,12 +1775,16 @@ "dev": true, "license": "ISC" }, - "../../validation/node_modules/function-bind": { - "version": "1.1.2", + "../../validation/node_modules/fsevents": { + "version": "2.3.3", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "../../validation/node_modules/gensync": { @@ -1692,19 +1823,19 @@ } }, "../../validation/node_modules/glob": { - "version": "7.2.3", + "version": "10.5.0", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -1716,7 +1847,7 @@ "license": "ISC" }, "../../validation/node_modules/handlebars": { - "version": "4.7.8", + "version": "4.7.9", "dev": true, "license": "MIT", "dependencies": { @@ -1743,24 +1874,13 @@ "node": ">=8" } }, - "../../validation/node_modules/hasown": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "../../validation/node_modules/html-escaper": { "version": "2.0.2", "dev": true, "license": "MIT" }, "../../validation/node_modules/htmlparser2": { - "version": "8.0.2", + "version": "10.1.0", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -1772,8 +1892,18 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "../../validation/node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "../../validation/node_modules/human-signals": { @@ -1829,20 +1959,6 @@ "dev": true, "license": "MIT" }, - "../../validation/node_modules/is-core-module": { - "version": "2.16.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../validation/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "dev": true, @@ -1859,14 +1975,6 @@ "node": ">=6" } }, - "../../validation/node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "../../validation/node_modules/is-plain-object": { "version": "5.0.0", "license": "MIT", @@ -1938,13 +2046,13 @@ } }, "../../validation/node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", + "version": "5.0.6", "dev": true, "license": "BSD-3-Clause", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "istanbul-lib-coverage": "^3.0.0" }, "engines": { "node": ">=10" @@ -1962,21 +2070,35 @@ "node": ">=8" } }, + "../../validation/node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "../../validation/node_modules/jest": { - "version": "29.7.0", + "version": "30.4.2", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" + "@jest/core": "30.4.2", + "@jest/types": "30.4.1", + "import-local": "^3.2.0", + "jest-cli": "30.4.2" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -1988,70 +2110,69 @@ } }, "../../validation/node_modules/jest-changed-files": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", + "execa": "^5.1.1", + "jest-util": "30.4.1", "p-limit": "^3.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-circus": { - "version": "29.7.0", + "version": "30.4.2", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/environment": "30.4.1", + "@jest/expect": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.0.0", + "chalk": "^4.1.2", "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.4.1", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-runtime": "30.4.2", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", + "pretty-format": "30.4.1", + "pure-rand": "^7.0.0", "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "stack-utils": "^2.0.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-cli": { - "version": "29.7.0", + "version": "30.4.2", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" + "@jest/core": "30.4.2", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.4.2", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "yargs": "^17.7.2" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -2063,193 +2184,225 @@ } }, "../../validation/node_modules/jest-config": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", + "version": "30.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.4.0", + "@jest/test-sequencer": "30.4.1", + "@jest/types": "30.4.1", + "babel-jest": "30.4.1", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-circus": "30.4.2", + "jest-docblock": "30.4.0", + "jest-environment-node": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-runner": "30.4.2", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", + "pretty-format": "30.4.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "@types/node": "*", + "esbuild-register": ">=3.4.0", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "esbuild-register": { + "optional": true + }, "ts-node": { "optional": true } } }, - "../../validation/node_modules/jest-diff": { - "version": "29.7.0", + "../../validation/node_modules/jest-config/node_modules/@jest/pattern": { + "version": "30.4.0", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@types/node": "*", + "jest-regex-util": "30.4.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "../../validation/node_modules/jest-docblock": { - "version": "29.7.0", + "../../validation/node_modules/jest-diff": { + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "detect-newline": "^3.0.0" + "@jest/diff-sequences": "30.4.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "../../validation/node_modules/jest-each": { - "version": "29.7.0", + "../../validation/node_modules/jest-docblock": { + "version": "30.4.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "detect-newline": "^3.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "../../validation/node_modules/jest-environment-node": { - "version": "29.7.0", + "../../validation/node_modules/jest-each": { + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "@jest/get-type": "30.1.0", + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "jest-util": "30.4.1", + "pretty-format": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "../../validation/node_modules/jest-get-type": { - "version": "29.6.3", + "../../validation/node_modules/jest-environment-node": { + "version": "30.4.1", "dev": true, "license": "MIT", + "dependencies": { + "@jest/environment": "30.4.1", + "@jest/fake-timers": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-mock": "30.4.1", + "jest-util": "30.4.1", + "jest-validate": "30.4.1" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-haste-map": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", + "@jest/types": "30.4.1", "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.4.0", + "jest-util": "30.4.1", + "jest-worker": "30.4.1", + "picomatch": "^4.0.3", "walker": "^1.0.8" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "optionalDependencies": { - "fsevents": "^2.3.2" + "fsevents": "^2.3.3" + } + }, + "../../validation/node_modules/jest-haste-map/node_modules/picomatch": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "../../validation/node_modules/jest-leak-detector": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@jest/get-type": "30.1.0", + "pretty-format": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-matcher-utils": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.4.1", + "pretty-format": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-message-util": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.4.1", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", + "picomatch": "^4.0.3", + "pretty-format": "30.4.1", "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "stack-utils": "^2.0.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "../../validation/node_modules/jest-message-util/node_modules/picomatch": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "../../validation/node_modules/jest-mock": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", + "@jest/types": "30.4.1", "@types/node": "*", - "jest-util": "^29.7.0" + "jest-util": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-pnp-resolver": { @@ -2269,139 +2422,140 @@ } }, "../../validation/node_modules/jest-regex-util": { - "version": "29.6.3", + "version": "30.4.0", "dev": true, "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-resolve": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-resolve-dependencies": { - "version": "29.7.0", + "version": "30.4.2", "dev": true, "license": "MIT", "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "jest-regex-util": "30.4.0", + "jest-snapshot": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-runner": { - "version": "29.7.0", + "version": "30.4.2", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/console": "30.4.1", + "@jest/environment": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.0.0", + "chalk": "^4.1.2", "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.4.0", + "jest-environment-node": "30.4.1", + "jest-haste-map": "30.4.1", + "jest-leak-detector": "30.4.1", + "jest-message-util": "30.4.1", + "jest-resolve": "30.4.1", + "jest-runtime": "30.4.2", + "jest-util": "30.4.1", + "jest-watcher": "30.4.1", + "jest-worker": "30.4.1", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-runtime": { - "version": "29.7.0", + "version": "30.4.2", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/environment": "30.4.1", + "@jest/fake-timers": "30.4.1", + "@jest/globals": "30.4.1", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-snapshot": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.4.1", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.4.1", + "graceful-fs": "^4.2.11", + "jest-diff": "30.4.1", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", + "pretty-format": "30.4.1", + "semver": "^7.7.2", + "synckit": "^0.11.8" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.4", + "version": "7.8.0", "dev": true, "license": "ISC", "bin": { @@ -2412,35 +2566,46 @@ } }, "../../validation/node_modules/jest-util": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", + "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "../../validation/node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "../../validation/node_modules/jest-validate": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", + "@jest/get-type": "30.1.0", + "@jest/types": "30.4.1", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "pretty-format": "30.4.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-validate/node_modules/camelcase": { @@ -2455,35 +2620,36 @@ } }, "../../validation/node_modules/jest-watcher": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" + "jest-util": "30.4.1", + "string-length": "^4.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-worker": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.4.1", "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "supports-color": "^8.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/jest-worker/node_modules/supports-color": { @@ -2544,12 +2710,11 @@ "node": ">=6" } }, - "../../validation/node_modules/kleur": { - "version": "3.0.3", - "dev": true, + "../../validation/node_modules/launder": { + "version": "1.7.1", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "dayjs": "^1.11.7" } }, "../../validation/node_modules/leven": { @@ -2576,18 +2741,6 @@ "node": ">=8" } }, - "../../validation/node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "../../validation/node_modules/lodash-es": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", - "license": "MIT" - }, "../../validation/node_modules/lodash.memoize": { "version": "4.1.2", "dev": true, @@ -2602,7 +2755,7 @@ } }, "../../validation/node_modules/luxon": { - "version": "2.5.2", + "version": "3.7.2", "license": "MIT", "engines": { "node": ">=12" @@ -2623,7 +2776,7 @@ } }, "../../validation/node_modules/make-dir/node_modules/semver": { - "version": "7.7.4", + "version": "7.8.0", "dev": true, "license": "ISC", "bin": { @@ -2651,18 +2804,6 @@ "dev": true, "license": "MIT" }, - "../../validation/node_modules/micromatch": { - "version": "4.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "../../validation/node_modules/mimic-fn": { "version": "2.1.0", "dev": true, @@ -2672,16 +2813,17 @@ } }, "../../validation/node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "9.0.9", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.2" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "../../validation/node_modules/minimist": { @@ -2692,15 +2834,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "../../validation/node_modules/minipass": { + "version": "7.1.3", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "../../validation/node_modules/ms": { "version": "2.1.3", "dev": true, "license": "MIT" }, - "../../validation/node_modules/nanoclone": { - "version": "0.2.1", - "license": "MIT" - }, "../../validation/node_modules/nanoid": { "version": "3.3.11", "funding": [ @@ -2717,6 +2863,20 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "../../validation/node_modules/napi-postinstall": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "../../validation/node_modules/natural-compare": { "version": "1.4.0", "dev": true, @@ -2825,6 +2985,11 @@ "node": ">=6" } }, + "../../validation/node_modules/package-json-from-dist": { + "version": "1.0.1", + "dev": true, + "license": "BlueOak-1.0.0" + }, "../../validation/node_modules/parse-json": { "version": "5.2.0", "dev": true, @@ -2870,10 +3035,25 @@ "node": ">=8" } }, - "../../validation/node_modules/path-parse": { - "version": "1.0.7", + "../../validation/node_modules/path-scurry": { + "version": "1.11.1", "dev": true, - "license": "MIT" + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../validation/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" }, "../../validation/node_modules/picocolors": { "version": "1.1.1", @@ -2881,8 +3061,6 @@ }, "../../validation/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -2938,16 +3116,17 @@ } }, "../../validation/node_modules/pretty-format": { - "version": "29.7.0", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@jest/schemas": "30.4.1", + "ansi-styles": "^5.2.0", + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "../../validation/node_modules/pretty-format/node_modules/ansi-styles": { @@ -2961,24 +3140,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "../../validation/node_modules/prompts": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, "../../validation/node_modules/property-expr": { "version": "2.0.6", "license": "MIT" }, "../../validation/node_modules/pure-rand": { - "version": "6.1.0", + "version": "7.0.1", "dev": true, "funding": [ { @@ -2992,11 +3159,18 @@ ], "license": "MIT" }, - "../../validation/node_modules/react-is": { + "../../validation/node_modules/react-is-18": { + "name": "react-is", "version": "18.3.1", "dev": true, "license": "MIT" }, + "../../validation/node_modules/react-is-19": { + "name": "react-is", + "version": "19.2.6", + "dev": true, + "license": "MIT" + }, "../../validation/node_modules/require-directory": { "version": "2.1.1", "dev": true, @@ -3005,25 +3179,6 @@ "node": ">=0.10.0" } }, - "../../validation/node_modules/resolve": { - "version": "1.22.11", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../validation/node_modules/resolve-cwd": { "version": "3.0.0", "dev": true, @@ -3043,22 +3198,15 @@ "node": ">=8" } }, - "../../validation/node_modules/resolve.exports": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "../../validation/node_modules/sanitize-html": { - "version": "2.17.0", + "version": "2.17.5", "license": "MIT", "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", - "htmlparser2": "^8.0.0", + "htmlparser2": "^10.1.0", "is-plain-object": "^5.0.0", + "launder": "^1.7.1", "parse-srcset": "^1.0.2", "postcss": "^8.3.11" } @@ -3091,14 +3239,15 @@ } }, "../../validation/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../validation/node_modules/sisteransi": { - "version": "1.0.5", + "version": "4.1.0", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "../../validation/node_modules/slash": { "version": "3.0.0", @@ -3168,7 +3317,43 @@ "node": ">=10" } }, + "../../validation/node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../validation/node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "../../validation/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../validation/node_modules/string-width-cjs": { + "name": "string-width", "version": "4.2.3", "dev": true, "license": "MIT", @@ -3181,7 +3366,46 @@ "node": ">=8" } }, + "../../validation/node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../validation/node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../validation/node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "../../validation/node_modules/strip-ansi": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../validation/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "dev": true, "license": "MIT", @@ -3192,6 +3416,14 @@ "node": ">=8" } }, + "../../validation/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "../../validation/node_modules/strip-bom": { "version": "4.0.0", "dev": true, @@ -3230,15 +3462,18 @@ "node": ">=8" } }, - "../../validation/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", + "../../validation/node_modules/synckit": { + "version": "0.11.12", "dev": true, "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, "engines": { - "node": ">= 0.4" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/synckit" } }, "../../validation/node_modules/test-exclude": { @@ -3254,38 +3489,70 @@ "node": ">=8" } }, - "../../validation/node_modules/tmpl": { - "version": "1.0.5", + "../../validation/node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.14", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "../../validation/node_modules/to-regex-range": { - "version": "5.0.1", + "../../validation/node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "is-number": "^7.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=8.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../validation/node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, + "../../validation/node_modules/tiny-case": { + "version": "1.0.3", + "license": "MIT" + }, + "../../validation/node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, "../../validation/node_modules/toposort": { "version": "2.0.2", "license": "MIT" }, "../../validation/node_modules/ts-jest": { - "version": "29.4.6", + "version": "29.4.11", "dev": true, "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", + "handlebars": "^4.7.9", "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.3", + "semver": "^7.8.0", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, @@ -3302,7 +3569,7 @@ "babel-jest": "^29.0.0 || ^30.0.0", "jest": "^29.0.0 || ^30.0.0", "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" + "typescript": ">=4.3 <7" }, "peerDependenciesMeta": { "@babel/core": { @@ -3326,7 +3593,7 @@ } }, "../../validation/node_modules/ts-jest/node_modules/semver": { - "version": "7.7.4", + "version": "7.8.1", "dev": true, "license": "ISC", "bin": { @@ -3396,6 +3663,39 @@ "dev": true, "license": "MIT" }, + "../../validation/node_modules/unrs-resolver": { + "version": "1.11.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, "../../validation/node_modules/update-browserslist-db": { "version": "1.2.3", "dev": true, @@ -3466,6 +3766,23 @@ "license": "MIT" }, "../../validation/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../validation/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "dev": true, "license": "MIT", @@ -3481,21 +3798,69 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "../../validation/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../validation/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../validation/node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../validation/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../validation/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "../../validation/node_modules/wrappy": { "version": "1.0.2", "dev": true, "license": "ISC" }, "../../validation/node_modules/write-file-atomic": { - "version": "4.0.2", + "version": "5.0.1", "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "signal-exit": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "../../validation/node_modules/y18n": { @@ -3536,50 +3901,89 @@ "node": ">=12" } }, - "../../validation/node_modules/yocto-queue": { - "version": "0.1.0", + "../../validation/node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "../../validation/node_modules/yup": { - "version": "0.32.11", + "../../validation/node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../validation/node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.15.4", - "@types/lodash": "^4.14.175", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "nanoclone": "^0.2.1", - "property-expr": "^2.0.4", - "toposort": "^2.0.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", + "../../validation/node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/@ardatan/relay-compiler": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-13.0.1.tgz", - "integrity": "sha512-afG3YPwuSA0E5foouZusz5GlXKs74dObv4cuWyLyfKsYFj2r7oGRNB28v18HvwuLSQtQFCi+DpIe0TZkgQDYyg==", + "../../validation/node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.29.2", - "immutable": "^5.1.5", - "invariant": "^2.2.4" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../validation/node_modules/yup": { + "version": "1.7.1", + "license": "MIT", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "../../validation/node_modules/yup/node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ardatan/relay-compiler": { + "version": "13.0.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "immutable": "^5.1.5", + "invariant": "^2.2.4" }, "peerDependencies": { "graphql": "*" @@ -3587,8 +3991,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -3601,8 +4003,6 @@ }, "node_modules/@babel/compat-data": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -3610,8 +4010,6 @@ }, "node_modules/@babel/core": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", @@ -3651,8 +4049,6 @@ }, "node_modules/@babel/generator": { "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", @@ -3667,8 +4063,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", @@ -3683,8 +4077,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3692,8 +4084,6 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -3701,8 +4091,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.6", @@ -3714,8 +4102,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", @@ -3731,8 +4117,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -3740,8 +4124,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -3749,8 +4131,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -3758,8 +4138,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -3767,8 +4145,6 @@ }, "node_modules/@babel/helpers": { "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", @@ -3780,8 +4156,6 @@ }, "node_modules/@babel/parser": { "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -3795,8 +4169,6 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" @@ -3837,9 +4209,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -3847,8 +4219,6 @@ }, "node_modules/@babel/template": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.28.6", @@ -3861,8 +4231,6 @@ }, "node_modules/@babel/traverse": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", @@ -3879,8 +4247,6 @@ }, "node_modules/@babel/types": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -4010,8 +4376,6 @@ }, "node_modules/@date-fns/tz": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.4.1.tgz", - "integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==", "license": "MIT" }, "node_modules/@date-io/core": { @@ -4033,49 +4397,17 @@ } } }, - "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -4085,46 +4417,58 @@ } }, "node_modules/@emotion/cache": { - "version": "11.11.0", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", "license": "MIT", "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "node_modules/@emotion/core": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-11.0.0.tgz", + "integrity": "sha512-w4sE3AmHmyG6RDKf6mIbtHpgJUSJ2uGvPQb8VXFL7hFjMPibE8IiehG8cMX3Ztm4svfCQV6KqusQbeIOkurBcA==", "license": "MIT" }, "node_modules/@emotion/hash": { - "version": "0.9.1", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", "license": "MIT", "dependencies": { - "@emotion/memoize": "^0.8.1" + "@emotion/memoize": "^0.9.0" } }, "node_modules/@emotion/memoize": { - "version": "0.8.1", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.11.4", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { @@ -4137,30 +4481,36 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.4", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", "license": "MIT", "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { - "version": "1.2.2", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", "license": "MIT" }, "node_modules/@emotion/styled": { - "version": "11.11.5", + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.2", - "@emotion/serialize": "^1.1.4", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1" + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -4173,28 +4523,34 @@ } }, "node_modules/@emotion/unitless": { - "version": "0.8.1", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.2.1", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", "license": "MIT" }, "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", "license": "MIT" }, "node_modules/@envelop/core": { "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.5.1.tgz", - "integrity": "sha512-3DQg8sFskDo386TkL5j12jyRAdip/8yzK3x7YGbZBgobZ4aKXrvDU0GppU0SnmrpQnNaiTUsxBs9LKkwQ/eyvw==", "license": "MIT", "dependencies": { "@envelop/instrumentation": "^1.0.0", @@ -4208,8 +4564,6 @@ }, "node_modules/@envelop/instrumentation": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@envelop/instrumentation/-/instrumentation-1.0.0.tgz", - "integrity": "sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==", "license": "MIT", "dependencies": { "@whatwg-node/promise-helpers": "^1.2.1", @@ -4221,8 +4575,6 @@ }, "node_modules/@envelop/types": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@envelop/types/-/types-5.2.1.tgz", - "integrity": "sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==", "license": "MIT", "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", @@ -4232,545 +4584,151 @@ "node": ">=18.0.0" } }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "darwin" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/config-array": { + "version": "0.21.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/core": { + "version": "0.17.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/js": { + "version": "9.39.2", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], + "node_modules/@eslint/object-schema": { + "version": "2.1.7", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@fastify/busboy": { + "version": "3.2.0", + "license": "MIT" + }, + "node_modules/@floating-ui/core": { + "version": "1.6.2", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@floating-ui/utils": "^0.2.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/@floating-ui/dom": { + "version": "1.6.5", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", - "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", - "license": "MIT" - }, - "node_modules/@floating-ui/core": { - "version": "1.6.2", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.0" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.5", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/react-dom": { @@ -4785,13 +4743,13 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.2", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@graphql-codegen/add": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-6.0.0.tgz", - "integrity": "sha512-biFdaURX0KTwEJPQ1wkT6BRgNasqgQ5KbCI1a3zwtLtO7XTo7/vKITPylmiU27K5DSOWYnY/1jfSqUAEBuhZrQ==", "license": "MIT", "dependencies": { "@graphql-codegen/plugin-helpers": "^6.0.0", @@ -4806,8 +4764,6 @@ }, "node_modules/@graphql-codegen/cli": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-6.2.1.tgz", - "integrity": "sha512-E1B+5nBda2l89Pci5M0HcEj2Hmx2yhORFX+1T3rmwpQjdOiulo+h9JifWxKomUpjfbmU1YkBSd47CCGLFPU10A==", "license": "MIT", "dependencies": { "@babel/generator": "^7.18.13", @@ -4867,8 +4823,6 @@ }, "node_modules/@graphql-codegen/cli/node_modules/cosmiconfig": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", - "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "license": "MIT", "dependencies": { "env-paths": "^2.2.1", @@ -4893,8 +4847,6 @@ }, "node_modules/@graphql-codegen/cli/node_modules/debounce": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.2.0.tgz", - "integrity": "sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==", "license": "MIT", "engines": { "node": ">=18" @@ -4905,8 +4857,6 @@ }, "node_modules/@graphql-codegen/cli/node_modules/yaml": { "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -4920,8 +4870,6 @@ }, "node_modules/@graphql-codegen/client-preset": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-5.2.4.tgz", - "integrity": "sha512-k4f9CoepkVznXRReCHBVnG/FeQVQgIOhgtkaJ6I9FcQRzUkrm9ASmQjOdNdMlZt0DHTU4nbVxIBGZW7gk1RavA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -4953,8 +4901,6 @@ }, "node_modules/@graphql-codegen/core": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-5.0.1.tgz", - "integrity": "sha512-eQD7aXpKkKvaydMv5Bu0FnKCPnNMAhZ3vZW+K4Rl9IAC2w5PDv9lJhs3YTWM9W58zNOZpGQGT2F0ekS3QNIiKw==", "license": "MIT", "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", @@ -4971,8 +4917,6 @@ }, "node_modules/@graphql-codegen/gql-tag-operations": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-5.1.4.tgz", - "integrity": "sha512-tDj/0a1U7rDH3PQgLeA+PlgBNb593MIJ43oAOKMRgJPwIQ9T7p2oqBRLxwfFZFTDLwnwsGZ7xIKqIcGgyAIj5Q==", "license": "MIT", "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", @@ -4990,8 +4934,6 @@ }, "node_modules/@graphql-codegen/plugin-helpers": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-6.2.1.tgz", - "integrity": "sha512-shRr26TfVZ6KFBjzRYUj02gLNh6yaECz9gTGgI6riANw5sSH9PONwTsBRYkEgU+6IXiL7VQeCumahvxSGFbRlQ==", "license": "MIT", "dependencies": { "@graphql-tools/utils": "^11.0.0", @@ -5009,8 +4951,6 @@ }, "node_modules/@graphql-codegen/schema-ast": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-5.0.1.tgz", - "integrity": "sha512-svLffXddnXxq1qFXQqqh+zYrxdiMnIKm+CXCUv0MYhLh0R4L5vpnaTzIUCk3icHNNXhKRm2uBD70+K8VY0xiCg==", "license": "MIT", "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", @@ -5026,8 +4966,6 @@ }, "node_modules/@graphql-codegen/typed-document-node": { "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-6.1.7.tgz", - "integrity": "sha512-VLL9hB+YPigc/W2QYCkSNMZrkKv42nTchb9mJ0h5VY98YmW/zWb6NeYM80iHSpk8ZvHsuUT5geA53/s1phO2NQ==", "license": "MIT", "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", @@ -5045,8 +4983,6 @@ }, "node_modules/@graphql-codegen/typescript": { "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-5.0.9.tgz", - "integrity": "sha512-YlIZ4nqdFdzr5vxuNtQtZnnMYuZ5cLYB2HaGhGI2zvqHxCmkBjIRpu/5sfccawKy23wetV+aoWvoNqxGKIryig==", "license": "MIT", "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", @@ -5064,8 +5000,6 @@ }, "node_modules/@graphql-codegen/typescript-graphql-request": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-graphql-request/-/typescript-graphql-request-7.0.0.tgz", - "integrity": "sha512-7loJg1k2Xisl7Hj1jTJ0So/Qf/8p+mPHsyeqLeBeCi4Xc6nSABAo8U2d5SFAaO2QCTqT/dvWoDOfVw4AQCu30g==", "license": "MIT", "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", @@ -5084,14 +5018,10 @@ }, "node_modules/@graphql-codegen/typescript-graphql-request/node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/@graphql-codegen/typescript-operations": { "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-5.0.9.tgz", - "integrity": "sha512-jJFdJKMS5Cqisb5QMi7xXHPsJH9yHBMYOxBc8laFkFjHk/AOqJK90qCKbO9lwwTMPZUDe6N/HslmA0ax4J0zsg==", "license": "MIT", "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", @@ -5115,8 +5045,6 @@ }, "node_modules/@graphql-codegen/visitor-plugin-common": { "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-6.2.4.tgz", - "integrity": "sha512-iwiVCc7Mv8/XAa3K35AdFQ9chJSDv/gYEnBeQFF/Sq/W8EyJoHypOGOTTLk7OSrWO4xea65ggv0e7fGt7rPJjQ==", "license": "MIT", "dependencies": { "@graphql-codegen/plugin-helpers": "^6.1.1", @@ -5139,8 +5067,6 @@ }, "node_modules/@graphql-hive/signal": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-2.0.0.tgz", - "integrity": "sha512-Pz8wB3K0iU6ae9S1fWfsmJX24CcGeTo6hE7T44ucmV/ALKRj+bxClmqrYcDT7v3f0d12Rh4FAXBb6gon+WkDpQ==", "license": "MIT", "engines": { "node": ">=20.0.0" @@ -5148,8 +5074,6 @@ }, "node_modules/@graphql-tools/apollo-engine-loader": { "version": "8.0.28", - "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.28.tgz", - "integrity": "sha512-MzgDrUuoxp6dZeo54zLBL3cEJKJtM3N/2RqK0rbPxPq5X2z6TUA7EGg8vIFTUkt5xelAsUrm8/4ai41ZDdxOng==", "license": "MIT", "dependencies": { "@graphql-tools/utils": "^11.0.0", @@ -5166,8 +5090,6 @@ }, "node_modules/@graphql-tools/batch-execute": { "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-10.0.8.tgz", - "integrity": "sha512-Kobt37qrVTFhX4HUK5/vPgMXFw/5f97AzmAlfmDBSRh/GnoAmLKCb48FrEI3gdeIwZB2fEhVHJyDqsojldnLQA==", "license": "MIT", "dependencies": { "@graphql-tools/utils": "^11.0.0", @@ -5184,14 +5106,10 @@ }, "node_modules/@graphql-tools/batch-execute/node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/@graphql-tools/code-file-loader": { "version": "8.1.30", - "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.30.tgz", - "integrity": "sha512-BMMg/9xowN3yOHpOhLH/9w8Lu7Fp7UiUAuVri+gl8RDroBC0JGm93v6prhr8U276AlVFGAy3wAb/28TJKOtlAg==", "license": "MIT", "dependencies": { "@graphql-tools/graphql-tag-pluck": "8.3.29", @@ -5209,8 +5127,6 @@ }, "node_modules/@graphql-tools/delegate": { "version": "12.0.13", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-12.0.13.tgz", - "integrity": "sha512-Aei3SI5HezLt7kKQNbX/GrZv5c5YibdbP0N6BvuEWQYG+lpRO3RRX2fZ+g+KshJOGuTJQFK1umIjki++vKoJ+A==", "license": "MIT", "dependencies": { "@graphql-tools/batch-execute": "^10.0.8", @@ -5231,14 +5147,10 @@ }, "node_modules/@graphql-tools/delegate/node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/@graphql-tools/documents": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.1.tgz", - "integrity": "sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==", "license": "MIT", "dependencies": { "lodash.sortby": "^4.7.0", @@ -5253,8 +5165,6 @@ }, "node_modules/@graphql-tools/executor": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.5.1.tgz", - "integrity": "sha512-n94Qcu875Mji9GQ52n5UbgOTxlgvFJicBPYD+FRks9HKIQpdNPjkkrKZUYNG51XKa+bf03rxNflm4+wXhoHHrA==", "license": "MIT", "dependencies": { "@graphql-tools/utils": "^11.0.0", @@ -5273,8 +5183,6 @@ }, "node_modules/@graphql-tools/executor-common": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-1.0.6.tgz", - "integrity": "sha512-23/K5C+LSlHDI0mj2SwCJ33RcELCcyDUgABm1Z8St7u/4Z5+95i925H/NAjUyggRjiaY8vYtNiMOPE49aPX1sg==", "license": "MIT", "dependencies": { "@envelop/core": "^5.4.0", @@ -5289,8 +5197,6 @@ }, "node_modules/@graphql-tools/executor-graphql-ws": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-3.1.5.tgz", - "integrity": "sha512-WXRsfwu9AkrORD9nShrd61OwwxeQ5+eXYcABRR3XPONFIS8pWQfDJGGqxql9/227o/s0DV5SIfkBURb5Knzv+A==", "license": "MIT", "dependencies": { "@graphql-tools/executor-common": "^1.0.6", @@ -5310,14 +5216,10 @@ }, "node_modules/@graphql-tools/executor-graphql-ws/node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/@graphql-tools/executor-http": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-3.2.1.tgz", - "integrity": "sha512-53i0TYO0cznIlZDJcnq4gQ6SOZ8efGgCDV33MYh6oqEapcp36tCMEVnVGVxcX5qRRyNHkqTY6hkA+/AyK9kicQ==", "license": "MIT", "dependencies": { "@graphql-hive/signal": "^2.0.0", @@ -5339,14 +5241,10 @@ }, "node_modules/@graphql-tools/executor-http/node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/@graphql-tools/executor-legacy-ws": { "version": "1.1.26", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.26.tgz", - "integrity": "sha512-rlFHk8XoRCXjARQAlHTgtisyE5KJxMb9UyR4hRbD6tLlYjmzNf9ms8GjsLYe/j1QpHJ7fNDm9aXqj1+evhQ/MQ==", "license": "MIT", "dependencies": { "@graphql-tools/utils": "^11.0.0", @@ -5364,8 +5262,6 @@ }, "node_modules/@graphql-tools/git-loader": { "version": "8.0.34", - "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.34.tgz", - "integrity": "sha512-0j9Cemf1dlIqRf9+Eqm1fGilQ7exYocW8dxpfXxbngvpPZ5TpOaNVruxOvfh7M+RIfd4yU4vSGr9tgj2TodDUw==", "license": "MIT", "dependencies": { "@graphql-tools/graphql-tag-pluck": "8.3.29", @@ -5384,8 +5280,6 @@ }, "node_modules/@graphql-tools/github-loader": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-9.1.0.tgz", - "integrity": "sha512-S/nlKtnmX3JzTrGwbPyXw+GKGj/1+A1lRQ73QEMDMjQK3TXygoKml5WqZwHEvp6qp3Jdncx9FHUzg9nge+rizQ==", "license": "MIT", "dependencies": { "@graphql-tools/executor-http": "^3.2.1", @@ -5405,8 +5299,6 @@ }, "node_modules/@graphql-tools/graphql-file-loader": { "version": "8.1.12", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.1.12.tgz", - "integrity": "sha512-Nma7gBgJoUbqXWTmdHjouo36tjzewA8MptVcHoH7widzkciaUVzBhriHzqICFB/dVxig//g9MX8s1XawZo7UAg==", "license": "MIT", "dependencies": { "@graphql-tools/import": "^7.1.12", @@ -5424,8 +5316,6 @@ }, "node_modules/@graphql-tools/graphql-tag-pluck": { "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.29.tgz", - "integrity": "sha512-aKX6ooaSjROHhGqlW1B2pARKjWk1OQOLvmQJe8GmP9vvKwjxuTl9FgZazjWvhN0GO9LFxd/JGzx0xCiXE6KQZw==", "license": "MIT", "dependencies": { "@babel/core": "^7.28.6", @@ -5445,8 +5335,6 @@ }, "node_modules/@graphql-tools/import": { "version": "7.1.12", - "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.1.12.tgz", - "integrity": "sha512-QSsdPsdJ7yCgQ5XODyKYpC7NlB9R1Koi0R3418PT7GiRm+9O8gYXSs/23dumcOnpiLrnf4qR2aytBn1+JOAhnA==", "license": "MIT", "dependencies": { "@graphql-tools/utils": "^11.0.0", @@ -5462,8 +5350,6 @@ }, "node_modules/@graphql-tools/import/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", "engines": { "node": ">=8" @@ -5471,8 +5357,6 @@ }, "node_modules/@graphql-tools/json-file-loader": { "version": "8.0.26", - "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.26.tgz", - "integrity": "sha512-kwy9IFi5QtXXTLBgWkvA1RqsZeJDn0CxsTbhNlziCzmga9fNo7qtZ18k9FYIq3EIoQQlok+b7W7yeyJATA2xhw==", "license": "MIT", "dependencies": { "@graphql-tools/utils": "^11.0.0", @@ -5489,8 +5373,6 @@ }, "node_modules/@graphql-tools/load": { "version": "8.1.8", - "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.8.tgz", - "integrity": "sha512-gxO662b64qZSToK3N6XUxWG5E6HOUjlg5jEnmGvD4bMtGJ0HwEe/BaVZbBQemCfLkxYjwRIBiVfOY9o0JyjZJg==", "license": "MIT", "dependencies": { "@graphql-tools/schema": "^10.0.31", @@ -5507,8 +5389,6 @@ }, "node_modules/@graphql-tools/merge": { "version": "9.1.7", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.1.7.tgz", - "integrity": "sha512-Y5E1vTbTabvcXbkakdFUt4zUIzB1fyaEnVmIWN0l0GMed2gdD01TpZWLUm4RNAxpturvolrb24oGLQrBbPLSoQ==", "license": "MIT", "dependencies": { "@graphql-tools/utils": "^11.0.0", @@ -5523,8 +5403,6 @@ }, "node_modules/@graphql-tools/optimize": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", - "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", "license": "MIT", "dependencies": { "tslib": "^2.4.0" @@ -5538,8 +5416,6 @@ }, "node_modules/@graphql-tools/relay-operation-optimizer": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.1.2.tgz", - "integrity": "sha512-n/yNuj9aQVdk1bxHvnbqQdvZ5P3Ru8L7BoDlBGK9OXr2Q44XBhFIonqaxREqAWyMme5WnE+DjUswa5H70PQbRg==", "license": "MIT", "dependencies": { "@ardatan/relay-compiler": "^13.0.1", @@ -5555,8 +5431,6 @@ }, "node_modules/@graphql-tools/schema": { "version": "10.0.31", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.31.tgz", - "integrity": "sha512-ZewRgWhXef6weZ0WiP7/MV47HXiuFbFpiDUVLQl6mgXsWSsGELKFxQsyUCBos60Qqy1JEFAIu3Ns6GGYjGkqkQ==", "license": "MIT", "dependencies": { "@graphql-tools/merge": "^9.1.7", @@ -5572,8 +5446,6 @@ }, "node_modules/@graphql-tools/url-loader": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-9.1.0.tgz", - "integrity": "sha512-G3Ul5sLsLOJlfT4LkdQSKcHoJ+4CuSeUbRT1XjBXZSgNkeXZt2MXHJQX0X8+b4mJq7fI3thcfbiB+5sEUlnT7g==", "license": "MIT", "dependencies": { "@graphql-tools/executor-graphql-ws": "^3.1.4", @@ -5598,8 +5470,6 @@ }, "node_modules/@graphql-tools/utils": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", "license": "MIT", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", @@ -5616,8 +5486,6 @@ }, "node_modules/@graphql-tools/wrap": { "version": "11.1.13", - "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-11.1.13.tgz", - "integrity": "sha512-oWdhddkcFy9vKjvAZiw7oH/1mrgg0uMpwdeFeFt7S/MlLiySx+Vuk7kjARktjUBl+yAMt9q1/BADnoT+5vH0hw==", "license": "MIT", "dependencies": { "@graphql-tools/delegate": "^12.0.13", @@ -5635,8 +5503,6 @@ }, "node_modules/@graphql-tools/wrap/node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/@graphql-typed-document-node/core": { @@ -5710,8 +5576,6 @@ }, "node_modules/@humanfs/core": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5720,8 +5584,6 @@ }, "node_modules/@humanfs/node": { "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5746,8 +5608,6 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5760,8 +5620,6 @@ }, "node_modules/@inquirer/ansi": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", - "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "license": "MIT", "engines": { "node": ">=18" @@ -5769,8 +5627,6 @@ }, "node_modules/@inquirer/checkbox": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", - "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -5793,8 +5649,6 @@ }, "node_modules/@inquirer/confirm": { "version": "5.1.21", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", - "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -5814,8 +5668,6 @@ }, "node_modules/@inquirer/core": { "version": "10.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", - "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -5841,8 +5693,6 @@ }, "node_modules/@inquirer/core/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", "engines": { "node": ">=14" @@ -5853,8 +5703,6 @@ }, "node_modules/@inquirer/core/node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -5867,8 +5715,6 @@ }, "node_modules/@inquirer/editor": { "version": "4.2.23", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", - "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -5889,8 +5735,6 @@ }, "node_modules/@inquirer/expand": { "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", - "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -5911,8 +5755,6 @@ }, "node_modules/@inquirer/external-editor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "license": "MIT", "dependencies": { "chardet": "^2.1.1", @@ -5932,8 +5774,6 @@ }, "node_modules/@inquirer/figures": { "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", - "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "license": "MIT", "engines": { "node": ">=18" @@ -5941,8 +5781,6 @@ }, "node_modules/@inquirer/input": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", - "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -5962,8 +5800,6 @@ }, "node_modules/@inquirer/number": { "version": "3.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", - "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -5983,8 +5819,6 @@ }, "node_modules/@inquirer/password": { "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", - "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -6005,8 +5839,6 @@ }, "node_modules/@inquirer/prompts": { "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", - "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "license": "MIT", "dependencies": { "@inquirer/checkbox": "^4.3.2", @@ -6034,8 +5866,6 @@ }, "node_modules/@inquirer/rawlist": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", - "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -6056,8 +5886,6 @@ }, "node_modules/@inquirer/search": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", - "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -6079,8 +5907,6 @@ }, "node_modules/@inquirer/select": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", - "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -6103,8 +5929,6 @@ }, "node_modules/@inquirer/type": { "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", - "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "license": "MIT", "engines": { "node": ">=18" @@ -6120,8 +5944,6 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -6130,8 +5952,6 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -6140,8 +5960,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -6149,14 +5967,10 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -6208,6 +6022,8 @@ }, "node_modules/@material-table/core": { "version": "6.4.4", + "resolved": "https://registry.npmjs.org/@material-table/core/-/core-6.4.4.tgz", + "integrity": "sha512-/x4RqWgOGWGr6deCSMQl0q+Ts38ZmFjTUjMBZ0/exaFIdv2cCUhnu1BP+Yfc/PFgbEZloKumbc2cRvMhwv79Hg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.19.0", @@ -6235,8 +6051,209 @@ "react-dom": ">=18.0.0" } }, + "node_modules/@material-table/core/node_modules/@mui/core-downloads-tracker": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", + "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@material-table/core/node_modules/@mui/material": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", + "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.18.0", + "@mui/system": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-table/core/node_modules/@mui/material/node_modules/@mui/system": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", + "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.17.1", + "@mui/styled-engine": "^5.18.0", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-table/core/node_modules/@mui/private-theming": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", + "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.17.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-table/core/node_modules/@mui/styled-engine": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz", + "integrity": "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@material-table/core/node_modules/@mui/types": { + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-table/core/node_modules/@mui/utils": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", + "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "~7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@material-table/core/node_modules/@mui/x-date-pickers": { "version": "6.20.2", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.20.2.tgz", + "integrity": "sha512-x1jLg8R+WhvkmUETRfX2wC+xJreMii78EXKLl6r3G+ggcAZlPyt0myID1Amf6hvJb9CtR7CgUo8BwR+1Vx9Ggw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", @@ -6301,34 +6318,100 @@ }, "node_modules/@material-table/core/node_modules/deepmerge": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.40", + "node_modules/@mui/base": { + "version": "5.0.0-dev.20240529-082515-213b5e33ab", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-dev.20240529-082515-213b5e33ab.tgz", + "integrity": "sha512-3ic6fc6BHstgM+MGqJEVx3zt9g5THxVXm3VVFUfdeplPqAWWgW2QoKfZDLT10s+pi+MAkpgEBP0kgRidf81Rsw==", + "deprecated": "This package has been replaced by @base-ui/react", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.6", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14-dev.20240529-082515-213b5e33ab", + "@mui/utils": "^6.0.0-dev.20240529-082515-213b5e33ab", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/@mui/types": { + "version": "7.4.12", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.12.tgz", + "integrity": "sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/@mui/utils": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.9.tgz", + "integrity": "sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@floating-ui/react-dom": "^2.0.8", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.0", - "prop-types": "^15.8.1" + "@babel/runtime": "^7.26.0", + "@mui/types": "~7.2.24", + "@types/prop-types": "^15.7.14", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/@mui/utils/node_modules/@mui/types": { + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -6337,7 +6420,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.18", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.2.0.tgz", + "integrity": "sha512-+XMav+ZaXkZKUFUgzjrfMEedfyJKxxviAske2q8N8CWDMeqZdDU2lWMkiUPiB388hGaDqhwvOAwkrsc/pUyp8g==", "license": "MIT", "funding": { "type": "opencollective", @@ -6345,22 +6430,24 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.15.18", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-9.2.0.tgz", + "integrity": "sha512-VgBd3z7Qc3vd/thcNSMC03nHRh/U4DzMUd+1dRyJTbm/hGo7+N6N4GDuJZDNHa6LZhhwG6Cu1X3DNvrVv8sNag==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9" + "@babel/runtime": "^7.29.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@mui/material": "^9.2.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -6369,24 +6456,26 @@ } }, "node_modules/@mui/material": { - "version": "5.15.18", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-9.2.0.tgz", + "integrity": "sha512-+YTRSgGKGrrRo2XJZXs7JRA6qHoHWvNtxyqxnrRJTBmIuLOUpxxh7m4G9lF4tWberxGFY+EqkkRPgJCl+fSMJg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.40", - "@mui/core-downloads-tracker": "^5.15.18", - "@mui/system": "^5.15.15", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", - "csstype": "^3.1.3", + "@babel/runtime": "^7.29.2", + "@mui/core-downloads-tracker": "^9.2.0", + "@mui/system": "^9.2.0", + "@mui/types": "^9.1.1", + "@mui/utils": "^9.2.0", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.2.3", "prop-types": "^15.8.1", - "react-is": "^18.2.0", + "react-is": "^19.2.6", "react-transition-group": "^4.4.5" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -6395,9 +6484,10 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@mui/material-pigment-css": "^9.2.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -6406,33 +6496,34 @@ "@emotion/styled": { "optional": true }, + "@mui/material-pigment-css": { + "optional": true + }, "@types/react": { "optional": true } } }, - "node_modules/@mui/material/node_modules/react-is": { - "version": "18.3.1", - "license": "MIT" - }, "node_modules/@mui/private-theming": { - "version": "5.15.14", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-9.2.0.tgz", + "integrity": "sha512-w9wpyDxGPGnAACPB2hKhCDmILJIAvQxrfjUbIAEa0AznX1rOjaz5N+yB1uuw8ixnJcpEh/tPbD9oEe19wcWPHw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.14", + "@babel/runtime": "^7.29.2", + "@mui/utils": "^9.2.0", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -6441,16 +6532,20 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.15.14", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-9.1.1.tgz", + "integrity": "sha512-neaYKdJfvEG54q8efHLJR7swpHG/gfSv9xGqW5iTSMsubD7yPCPFrhVBt284j1DOF3uZaaDJSHQL7gz6jGF21Q==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.3", + "@babel/runtime": "^7.29.2", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.2.3", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -6459,7 +6554,7 @@ "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -6471,20 +6566,22 @@ } }, "node_modules/@mui/system": { - "version": "5.15.15", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-9.2.0.tgz", + "integrity": "sha512-YvUJwKoGVtbnOm2PyPi5TvX2d1rOA6sqSpEWVs4WmXNIaFTuYmNUaVdU2o1NKUEe31URnD3E8ZVUMcsLQXwcYg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.14", - "@mui/styled-engine": "^5.15.14", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "clsx": "^2.1.0", - "csstype": "^3.1.3", + "@babel/runtime": "^7.29.2", + "@mui/private-theming": "^9.2.0", + "@mui/styled-engine": "^9.1.1", + "@mui/types": "^9.1.1", + "@mui/utils": "^9.2.0", + "clsx": "^2.1.1", + "csstype": "^3.2.3", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -6493,8 +6590,8 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -6509,10 +6606,15 @@ } }, "node_modules/@mui/types": { - "version": "7.2.14", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-9.1.1.tgz", + "integrity": "sha512-Zjt7u8wNvDg40rPTGoL+TnfkpuSKjwubsNSFRH1KAVZLcaV4I3AFNHIFbvH7p4F3alEibSbdd90xAgn5Rnfndg==", "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2" + }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -6521,24 +6623,28 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.14", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.2.0.tgz", + "integrity": "sha512-OsUH5zhlSOM4xmLl53+agug1M1UyWb4zxFxWQCqwKTKUeQPvTENtg3JhrroBD2qpCLKsX5W/DYGERJ4mBUbc8g==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@types/prop-types": "^15.7.11", + "@babel/runtime": "^7.29.2", + "@mui/types": "^9.1.1", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "react-is": "^19.2.6" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -6546,19 +6652,16 @@ } } }, - "node_modules/@mui/utils/node_modules/react-is": { - "version": "18.2.0", - "license": "MIT" - }, "node_modules/@mui/x-date-pickers": { - "version": "7.5.0", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-9.9.0.tgz", + "integrity": "sha512-NrmOeLuhOaTPp8xSpmSa08i0xX4h2H5dnGMKClIfEgXJcjtojPrMoe7LzEN+iUYm7HzzxP+pH/bH3IXAMoqcYw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.24.5", - "@mui/base": "^5.0.0-beta.40", - "@mui/system": "^5.15.14", - "@mui/utils": "^5.15.14", - "@types/react-transition-group": "^4.4.10", + "@babel/runtime": "^7.29.7", + "@mui/utils": "^9.2.0", + "@mui/x-internals": "^9.9.0", + "@types/react-transition-group": "^4.4.12", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" @@ -6573,16 +6676,17 @@ "peerDependencies": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14", - "date-fns": "^2.25.0 || ^3.2.0", - "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", + "@mui/material": "^7.3.0 || ^9.0.0", + "@mui/system": "^7.3.0 || ^9.0.0", + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", + "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0", "dayjs": "^1.10.7", "luxon": "^3.0.2", "moment": "^2.29.4", - "moment-hijri": "^2.1.2", + "moment-hijri": "^2.1.2 || ^3.0.0", "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -6614,234 +6718,66 @@ } } }, - "node_modules/@mui/x-date-pickers/node_modules/clsx": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@napi-rs/canvas": { - "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.97.tgz", - "integrity": "sha512-8cFniXvrIEnVwuNSRCW9wirRZbHvrD3JVujdS2P5n5xiJZNZMOZcfOvJ1pb66c7jXMKHHglJEDVJGbm8XWFcXQ==", - "license": "MIT", - "optional": true, - "workspaces": [ - "e2e/*" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@napi-rs/canvas-android-arm64": "0.1.97", - "@napi-rs/canvas-darwin-arm64": "0.1.97", - "@napi-rs/canvas-darwin-x64": "0.1.97", - "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.97", - "@napi-rs/canvas-linux-arm64-gnu": "0.1.97", - "@napi-rs/canvas-linux-arm64-musl": "0.1.97", - "@napi-rs/canvas-linux-riscv64-gnu": "0.1.97", - "@napi-rs/canvas-linux-x64-gnu": "0.1.97", - "@napi-rs/canvas-linux-x64-musl": "0.1.97", - "@napi-rs/canvas-win32-arm64-msvc": "0.1.97", - "@napi-rs/canvas-win32-x64-msvc": "0.1.97" - } - }, - "node_modules/@napi-rs/canvas-android-arm64": { - "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.97.tgz", - "integrity": "sha512-V1c/WVw+NzH8vk7ZK/O8/nyBSCQimU8sfMsB/9qeSvdkGKNU7+mxy/bIF0gTgeBFmHpj30S4E9WHMSrxXGQuVQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-darwin-arm64": { - "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.97.tgz", - "integrity": "sha512-ok+SCEF4YejcxuJ9Rm+WWunHHpf2HmiPxfz6z1a/NFQECGXtsY7A4B8XocK1LmT1D7P174MzwPF9Wy3AUAwEPw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-darwin-x64": { - "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.97.tgz", - "integrity": "sha512-PUP6e6/UGlclUvAQNnuXCcnkpdUou6VYZfQOQxExLp86epOylmiwLkqXIvpFmjoTEDmPmXrI+coL/9EFU1gKPA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { - "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.97.tgz", - "integrity": "sha512-XyXH2L/cic8eTNtbrXCcvqHtMX/nEOxN18+7rMrAM2XtLYC/EB5s0wnO1FsLMWmK+04ZSLN9FBGipo7kpIkcOw==", - "cpu": [ - "arm" - ], + "node_modules/@mui/x-internals": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-9.9.0.tgz", + "integrity": "sha512-RMddUd59Qie2o4dralFUcp4Hzu0HOyeYqjh2t3zkpURX1CGX2tUbYZxCwC5UjLJ/PBcSqmSDrGalx7Z8UQFX+g==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@babel/runtime": "^7.29.7", + "@base-ui/utils": "^0.3.0", + "@mui/utils": "^9.2.0", + "reselect": "^5.2.0", + "use-sync-external-store": "^1.6.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-linux-arm64-gnu": { - "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.97.tgz", - "integrity": "sha512-Kuq/M3djq0K8ktgz6nPlK7Ne5d4uWeDxPpyKWOjWDK2RIOhHVtLtyLiJw2fuldw7Vn4mhw05EZXCEr4Q76rs9w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">=14.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-linux-arm64-musl": { - "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.97.tgz", - "integrity": "sha512-kKmSkQVnWeqg7qdsiXvYxKhAFuHz3tkBjW/zyQv5YKUPhotpaVhpBGv5LqCngzyuRV85SXoe+OFj+Tv0a0QXkQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { - "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.97.tgz", - "integrity": "sha512-Jc7I3A51jnEOIAXeLsN/M/+Z28LUeakcsXs07FLq9prXc0eYOtVwsDEv913Gr+06IRo34gJJVgT0TXvmz+N2VA==", - "cpu": [ - "riscv64" - ], + "node_modules/@mui/x-internals/node_modules/@base-ui/utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.3.1.tgz", + "integrity": "sha512-gFFiltORVmW/N6IILTGxizP3PBpVpysqML1ALY5Vk0mH+7faVkCknOU31goYHN5Aoek2dkjxva1XOD2Ce9WuIg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@babel/runtime": "^7.29.2", + "@floating-ui/utils": "^0.2.11", + "reselect": "^5.2.0", + "use-sync-external-store": "^1.6.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@napi-rs/canvas-linux-x64-gnu": { - "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.97.tgz", - "integrity": "sha512-iDUBe7AilfuBSRbSa8/IGX38Mf+iCSBqoVKLSQ5XaY2JLOaqz1TVyPFEyIck7wT6mRQhQt5sN6ogfjIDfi74tg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "peerDependencies": { + "@types/react": "^17 || ^18 || ^19", + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@napi-rs/canvas-linux-x64-musl": { - "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.97.tgz", - "integrity": "sha512-AKLFd/v0Z5fvgqBDqhvqtAdx+fHMJ5t9JcUNKq4FIZ5WH+iegGm8HPdj00NFlCSnm83Fp3Ln8I2f7uq1aIiWaA==", - "cpu": [ - "x64" - ], + "node_modules/@mui/x-internals/node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@napi-rs/canvas-win32-arm64-msvc": { + "node_modules/@napi-rs/canvas": { "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-0.1.97.tgz", - "integrity": "sha512-u883Yr6A6fO7Vpsy9YE4FVCIxzzo5sO+7pIUjjoDLjS3vQaNMkVzx5bdIpEL+ob+gU88WDK4VcxYMZ6nmnoX9A==", - "cpu": [ - "arm64" - ], "license": "MIT", "optional": true, - "os": [ - "win32" + "workspaces": [ + "e2e/*" ], "engines": { "node": ">= 10" @@ -6849,19 +6785,30 @@ "funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/canvas-android-arm64": "0.1.97", + "@napi-rs/canvas-darwin-arm64": "0.1.97", + "@napi-rs/canvas-darwin-x64": "0.1.97", + "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.97", + "@napi-rs/canvas-linux-arm64-gnu": "0.1.97", + "@napi-rs/canvas-linux-arm64-musl": "0.1.97", + "@napi-rs/canvas-linux-riscv64-gnu": "0.1.97", + "@napi-rs/canvas-linux-x64-gnu": "0.1.97", + "@napi-rs/canvas-linux-x64-musl": "0.1.97", + "@napi-rs/canvas-win32-arm64-msvc": "0.1.97", + "@napi-rs/canvas-win32-x64-msvc": "0.1.97" } }, - "node_modules/@napi-rs/canvas-win32-x64-msvc": { + "node_modules/@napi-rs/canvas-darwin-arm64": { "version": "0.1.97", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.97.tgz", - "integrity": "sha512-sWtD2EE3fV0IzN+iiQUqr/Q1SwqWhs2O1FKItFlxtdDkikpEj5g7DKQpY3x55H/MAOnL8iomnlk3mcEeGiUMoQ==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">= 10" @@ -6871,23 +6818,8 @@ "url": "https://github.com/sponsors/Brooooooklyn" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -6899,8 +6831,6 @@ }, "node_modules/@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==", "license": "MIT", "engines": { "node": ">= 8" @@ -6908,8 +6838,6 @@ }, "node_modules/@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==", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -7010,393 +6938,49 @@ "d3-selection": "^3.0.0", "zustand": "^4.4.1" }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/node-toolbar": { - "version": "1.3.14", - "license": "MIT", - "dependencies": { - "@reactflow/core": "11.11.4", - "classcat": "^5.0.3", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@remix-run/router": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", - "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@repeaterjs/repeater": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.6.tgz", - "integrity": "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==", - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@reactflow/node-toolbar": { + "version": "1.3.14", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@reactflow/core": "11.11.4", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@remix-run/router": { + "version": "1.23.3", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "node_modules/@repeaterjs/repeater": { + "version": "3.0.6", + "license": "MIT" }, - "node_modules/@rollup/rollup-win32-x64-msvc": { + "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ] }, "node_modules/@rtsao/scc": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, "license": "MIT" }, @@ -7412,17 +6996,6 @@ "react-dom": "^18.0.0 || ^17.0.1 || ^16.7.0" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "dev": true, @@ -7653,8 +7226,6 @@ }, "node_modules/@types/eslint": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", "dependencies": { @@ -7664,8 +7235,6 @@ }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -7713,7 +7282,9 @@ "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.12", + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "license": "MIT" }, "node_modules/@types/react": { @@ -7733,9 +7304,11 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.10", + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", "license": "MIT", - "dependencies": { + "peerDependencies": { "@types/react": "*" } }, @@ -7745,8 +7318,6 @@ }, "node_modules/@types/ws": { "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7754,8 +7325,6 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", - "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -7783,8 +7352,6 @@ }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -7793,8 +7360,6 @@ }, "node_modules/@typescript-eslint/parser": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", - "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", "dev": true, "license": "MIT", "dependencies": { @@ -7818,8 +7383,6 @@ }, "node_modules/@typescript-eslint/project-service": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", - "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", "dev": true, "license": "MIT", "dependencies": { @@ -7840,8 +7403,6 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", - "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", "dev": true, "license": "MIT", "dependencies": { @@ -7858,8 +7419,6 @@ }, "node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", - "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", "dev": true, "license": "MIT", "engines": { @@ -7875,8 +7434,6 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", - "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", "dev": true, "license": "MIT", "dependencies": { @@ -7900,8 +7457,6 @@ }, "node_modules/@typescript-eslint/types": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", - "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", "dev": true, "license": "MIT", "engines": { @@ -7914,8 +7469,6 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", - "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7942,8 +7495,6 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", "engines": { @@ -7952,8 +7503,6 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7965,8 +7514,6 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", "dev": true, "license": "ISC", "dependencies": { @@ -7981,8 +7528,6 @@ }, "node_modules/@typescript-eslint/utils": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", - "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8005,8 +7550,6 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", - "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", "dev": true, "license": "MIT", "dependencies": { @@ -8023,8 +7566,6 @@ }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", - "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true, "license": "Apache-2.0", "engines": { @@ -8036,8 +7577,6 @@ }, "node_modules/@uiw/codemirror-extensions-basic-setup": { "version": "4.25.10", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.10.tgz", - "integrity": "sha512-P3vytLlpE62KYSWrMUnwDCv2lvaQDuDZzyj03mHntuHo5bSl34fRZpjTY3kQTPGuXHxkGSYpoPFFj+hMTqaaMQ==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -8063,8 +7602,6 @@ }, "node_modules/@uiw/react-codemirror": { "version": "4.25.10", - "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.10.tgz", - "integrity": "sha512-DzgSMwM5qzB7v1FIb4gEeriYt67iiay756/HIOM9mAbeOVK0MO7rqefHf0O5c0269pJKMW7AH9FjclExD23V9w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.6", @@ -8087,38 +7624,8 @@ "react-dom": ">=17.0.0" } }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, "node_modules/@unrs/resolver-binding-darwin-arm64": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", "cpu": [ "arm64" ], @@ -8129,233 +7636,6 @@ "darwin" ] }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@user-office-software/duo-localisation": { "version": "1.2.0", "license": "ISC" @@ -8384,8 +7664,6 @@ }, "node_modules/@whatwg-node/disposablestack": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz", - "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==", "license": "MIT", "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", @@ -8397,8 +7675,6 @@ }, "node_modules/@whatwg-node/fetch": { "version": "0.10.13", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.13.tgz", - "integrity": "sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==", "license": "MIT", "dependencies": { "@whatwg-node/node-fetch": "^0.8.3", @@ -8410,8 +7686,6 @@ }, "node_modules/@whatwg-node/node-fetch": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.8.5.tgz", - "integrity": "sha512-4xzCl/zphPqlp9tASLVeUhB5+WJHbuWGYpfoC2q1qh5dw0AqZBW7L27V5roxYWijPxj4sspRAAoOH3d2ztaHUQ==", "license": "MIT", "dependencies": { "@fastify/busboy": "^3.1.1", @@ -8425,8 +7699,6 @@ }, "node_modules/@whatwg-node/promise-helpers": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz", - "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==", "license": "MIT", "dependencies": { "tslib": "^2.6.3" @@ -8437,8 +7709,6 @@ }, "node_modules/@wojtekmaj/react-hooks": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@wojtekmaj/react-hooks/-/react-hooks-2.0.5.tgz", - "integrity": "sha512-Ui4QnkXco5l/sa2HA9EhKLTWluSm0iBtOaj5JswwOjfgohBaUKntn8iLdZt3Fcr3/tsA3tLfz3IhtikhC34a7Q==", "license": "MIT", "funding": { "url": "https://github.com/wojtekmaj/react-hooks?sponsor=1" @@ -8455,8 +7725,6 @@ }, "node_modules/acorn": { "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -8468,8 +7736,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -8478,8 +7744,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -8495,8 +7759,6 @@ }, "node_modules/ansi-escapes": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "license": "MIT", "dependencies": { "environment": "^1.0.0" @@ -8534,8 +7796,6 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { @@ -8551,8 +7811,6 @@ }, "node_modules/array-includes": { "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8574,8 +7832,6 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "license": "MIT", "engines": { "node": ">=8" @@ -8602,8 +7858,6 @@ }, "node_modules/array.prototype.findlastindex": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8624,8 +7878,6 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { @@ -8643,8 +7895,6 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { @@ -8662,8 +7912,6 @@ }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "license": "MIT", "dependencies": { @@ -8679,8 +7927,6 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8701,8 +7947,6 @@ }, "node_modules/async-function": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", "engines": { @@ -8721,8 +7965,6 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8755,8 +7997,6 @@ }, "node_modules/baseline-browser-mapping": { "version": "2.10.16", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.16.tgz", - "integrity": "sha512-Lyf3aK28zpsD1yQMiiHD4RvVb6UdMoo8xzG2XzFIfR9luPzOpcBlAsT/qfB1XWS1bxWT+UtE4WmQgsp297FYOA==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -8767,8 +8007,6 @@ }, "node_modules/brace-expansion": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -8788,8 +8026,6 @@ }, "node_modules/browserslist": { "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "funding": [ { "type": "opencollective", @@ -8821,8 +8057,6 @@ }, "node_modules/call-bind": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", "dependencies": { @@ -8840,8 +8074,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8854,8 +8086,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { @@ -8878,8 +8108,6 @@ }, "node_modules/camel-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", @@ -8888,8 +8116,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001786", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001786.tgz", - "integrity": "sha512-4oxTZEvqmLLrERwxO76yfKM7acZo310U+v4kqexI2TL1DkkUEMT8UijrxxcnVdxR3qkVf5awGRX+4Z6aPHVKrA==", "funding": [ { "type": "opencollective", @@ -8908,8 +8134,6 @@ }, "node_modules/capital-case": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", "license": "MIT", "dependencies": { "no-case": "^3.0.4", @@ -8933,8 +8157,6 @@ }, "node_modules/change-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", "license": "MIT", "dependencies": { "camel-case": "^4.1.2", @@ -8953,8 +8175,6 @@ }, "node_modules/change-case-all": { "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", "license": "MIT", "dependencies": { "change-case": "^4.1.2", @@ -8971,8 +8191,6 @@ }, "node_modules/chardet": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "license": "MIT" }, "node_modules/classcat": { @@ -8985,8 +8203,6 @@ }, "node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "license": "MIT", "dependencies": { "restore-cursor": "^5.0.0" @@ -9000,8 +8216,6 @@ }, "node_modules/cli-truncate": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", - "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", "license": "MIT", "dependencies": { "slice-ansi": "^8.0.0", @@ -9016,8 +8230,6 @@ }, "node_modules/cli-truncate/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -9028,8 +8240,6 @@ }, "node_modules/cli-truncate/node_modules/string-width": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", - "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", "license": "MIT", "dependencies": { "get-east-asian-width": "^1.5.0", @@ -9044,8 +8254,6 @@ }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" @@ -9059,8 +8267,6 @@ }, "node_modules/cli-width": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "license": "ISC", "engines": { "node": ">= 12" @@ -9076,7 +8282,9 @@ } }, "node_modules/clsx": { - "version": "2.1.0", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { "node": ">=6" @@ -9111,14 +8319,10 @@ }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "license": "MIT" }, "node_modules/common-tags": { "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "license": "MIT", "engines": { "node": ">=4.0.0" @@ -9131,8 +8335,6 @@ }, "node_modules/constant-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", "license": "MIT", "dependencies": { "no-case": "^3.0.4", @@ -9164,8 +8366,6 @@ }, "node_modules/cross-inspect": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.1.tgz", - "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==", "license": "MIT", "dependencies": { "tslib": "^2.4.0" @@ -9195,7 +8395,9 @@ } }, "node_modules/csstype": { - "version": "3.1.3", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/d3-color": { @@ -9287,8 +8489,6 @@ }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "license": "MIT", "engines": { "node": ">= 12" @@ -9296,8 +8496,6 @@ }, "node_modules/data-view-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9314,8 +8512,6 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9332,8 +8528,6 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9350,8 +8544,6 @@ }, "node_modules/dataloader": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", - "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==", "license": "MIT" }, "node_modules/date-fns": { @@ -9368,8 +8560,6 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9446,8 +8636,6 @@ }, "node_modules/dependency-graph": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", "license": "MIT", "engines": { "node": ">=4" @@ -9455,8 +8643,6 @@ }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", "engines": { "node": ">=6" @@ -9471,8 +8657,6 @@ }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "license": "MIT", "dependencies": { "path-type": "^4.0.0" @@ -9545,8 +8729,6 @@ }, "node_modules/dot-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "license": "MIT", "dependencies": { "no-case": "^3.0.4", @@ -9566,8 +8748,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", "dependencies": { @@ -9581,14 +8761,10 @@ }, "node_modules/electron-to-chromium": { "version": "1.5.332", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.332.tgz", - "integrity": "sha512-7OOtytmh/rINMLwaFTbcMVvYXO3AUm029X0LcyfYk0B557RlPkdpTpnH9+htMlfu5dKwOmT0+Zs2Aw+lnn6TeQ==", "license": "ISC" }, "node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "license": "MIT" }, "node_modules/entities": { @@ -9603,8 +8779,6 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "license": "MIT", "engines": { "node": ">=6" @@ -9612,8 +8786,6 @@ }, "node_modules/environment": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "license": "MIT", "engines": { "node": ">=18" @@ -9631,8 +8803,6 @@ }, "node_modules/es-abstract": { "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "dev": true, "license": "MIT", "dependencies": { @@ -9700,8 +8870,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", "engines": { @@ -9718,8 +8886,6 @@ }, "node_modules/es-iterator-helpers": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", - "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", "dev": true, "license": "MIT", "dependencies": { @@ -9746,8 +8912,6 @@ }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", "dependencies": { @@ -9759,8 +8923,6 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { @@ -9775,8 +8937,6 @@ }, "node_modules/es-shim-unscopables": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { @@ -9788,8 +8948,6 @@ }, "node_modules/es-to-primitive": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { @@ -9843,8 +9001,6 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -9862,8 +9018,6 @@ }, "node_modules/eslint": { "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { @@ -9933,8 +9087,6 @@ }, "node_modules/eslint-import-context": { "version": "0.1.9", - "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", - "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -9976,8 +9128,6 @@ }, "node_modules/eslint-import-resolver-typescript": { "version": "4.4.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz", - "integrity": "sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==", "dev": true, "license": "ISC", "dependencies": { @@ -10011,8 +9161,6 @@ }, "node_modules/eslint-module-utils": { "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { @@ -10029,8 +9177,6 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10039,8 +9185,6 @@ }, "node_modules/eslint-plugin-import": { "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { @@ -10129,8 +9273,6 @@ }, "node_modules/eslint-plugin-react": { "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "license": "MIT", "dependencies": { @@ -10162,8 +9304,6 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", - "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", "dev": true, "license": "MIT", "dependencies": { @@ -10217,8 +9357,6 @@ }, "node_modules/eslint-plugin-unused-imports": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.4.1.tgz", - "integrity": "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10233,8 +9371,6 @@ }, "node_modules/eslint-scope": { "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10250,8 +9386,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10263,8 +9397,6 @@ }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10287,8 +9419,6 @@ }, "node_modules/espree": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10305,8 +9435,6 @@ }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10329,8 +9457,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10358,14 +9484,10 @@ }, "node_modules/eventemitter3": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, @@ -10376,8 +9498,6 @@ }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -10392,8 +9512,6 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, @@ -10404,8 +9522,6 @@ }, "node_modules/fastq": { "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -10413,8 +9529,6 @@ }, "node_modules/fetch-blob": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", "funding": [ { "type": "github", @@ -10436,8 +9550,6 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10485,8 +9597,6 @@ }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -10499,15 +9609,11 @@ }, "node_modules/flatted": { "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, "node_modules/for-each": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { @@ -10522,8 +9628,6 @@ }, "node_modules/formdata-polyfill": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" @@ -10561,10 +9665,7 @@ }, "node_modules/fsevents": { "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, "license": "MIT", "optional": true, "os": [ @@ -10583,8 +9684,6 @@ }, "node_modules/function.prototype.name": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10604,8 +9703,6 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { @@ -10614,8 +9711,6 @@ }, "node_modules/generator-function": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, "license": "MIT", "engines": { @@ -10638,8 +9733,6 @@ }, "node_modules/get-east-asian-width": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "license": "MIT", "engines": { "node": ">=18" @@ -10650,8 +9743,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10675,8 +9766,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { @@ -10689,8 +9778,6 @@ }, "node_modules/get-symbol-description": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { @@ -10707,8 +9794,6 @@ }, "node_modules/get-tsconfig": { "version": "4.13.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", - "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", "dev": true, "license": "MIT", "dependencies": { @@ -10720,8 +9805,6 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -10732,8 +9815,6 @@ }, "node_modules/globals": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { @@ -10745,8 +9826,6 @@ }, "node_modules/globalthis": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10762,8 +9841,6 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "license": "MIT", "dependencies": { "array-union": "^2.1.0", @@ -10780,10 +9857,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/goober": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.19.tgz", + "integrity": "sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==", + "license": "MIT", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { @@ -10802,8 +9886,6 @@ }, "node_modules/graphql-config": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.1.6.tgz", - "integrity": "sha512-fCkYnm4Kdq3un0YIM4BCZHVR5xl0UeLP6syxxO7KAstdY7QVyVvTHP0kRPDYEP1v08uwtJVgis5sj3IOTLOniQ==", "license": "MIT", "dependencies": { "@graphql-tools/graphql-file-loader": "^8.0.0", @@ -10833,8 +9915,6 @@ }, "node_modules/graphql-config/node_modules/balanced-match": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "license": "MIT", "engines": { "node": "18 || 20 || >=22" @@ -10842,8 +9922,6 @@ }, "node_modules/graphql-config/node_modules/brace-expansion": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -10854,8 +9932,6 @@ }, "node_modules/graphql-config/node_modules/cosmiconfig": { "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", @@ -10880,8 +9956,6 @@ }, "node_modules/graphql-config/node_modules/minimatch": { "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.5" @@ -10895,8 +9969,6 @@ }, "node_modules/graphql-request": { "version": "7.4.0", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-7.4.0.tgz", - "integrity": "sha512-xfr+zFb/QYbs4l4ty0dltqiXIp07U6sl+tOKAb0t50/EnQek6CVVBLjETXi+FghElytvgaAWtIOt3EV7zLzIAQ==", "license": "MIT", "dependencies": { "@graphql-typed-document-node/core": "^3.2.0" @@ -10920,8 +9992,6 @@ }, "node_modules/graphql-ws": { "version": "6.0.8", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.8.tgz", - "integrity": "sha512-m3EOaNsUBXwAnkBWbzPfe0Nq8pXUfxsWnolC54sru3FzHvhTZL0Ouf/BoQsaGAXqM+YPerXOJ47BUnmgmoupCw==", "license": "MIT", "engines": { "node": ">=20" @@ -10946,8 +10016,6 @@ }, "node_modules/has-bigints": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { @@ -10977,8 +10045,6 @@ }, "node_modules/has-proto": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10993,8 +10059,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { @@ -11006,8 +10070,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { @@ -11032,8 +10094,6 @@ }, "node_modules/header-case": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", "license": "MIT", "dependencies": { "capital-case": "^1.0.4", @@ -11042,15 +10102,11 @@ }, "node_modules/hermes-estree": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", "dev": true, "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", "dev": true, "license": "MIT", "dependencies": { @@ -11136,8 +10192,6 @@ }, "node_modules/i18next-http-backend": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.5.tgz", - "integrity": "sha512-QaWHnsxieEDcqKe+vo/RFqpiIFRi/KBqlOSPcUlvinBaISCeiTRCbtrazHAjtHtsLC66oDsROAH8frWkQzfMMQ==", "license": "MIT", "dependencies": { "cross-fetch": "4.1.0" @@ -11145,8 +10199,6 @@ }, "node_modules/i18next-http-backend/node_modules/cross-fetch": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", "license": "MIT", "dependencies": { "node-fetch": "^2.7.0" @@ -11154,8 +10206,6 @@ }, "node_modules/i18next-http-backend/node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -11174,8 +10224,6 @@ }, "node_modules/iconv-lite": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -11197,8 +10245,6 @@ }, "node_modules/immer": { "version": "11.1.8", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.8.tgz", - "integrity": "sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==", "license": "MIT", "funding": { "type": "opencollective", @@ -11207,8 +10253,6 @@ }, "node_modules/immutable": { "version": "5.1.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", - "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "license": "MIT" }, "node_modules/import-fresh": { @@ -11227,8 +10271,6 @@ }, "node_modules/import-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", "license": "MIT", "engines": { "node": ">=12.2" @@ -11251,8 +10293,6 @@ }, "node_modules/internal-slot": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { @@ -11266,8 +10306,6 @@ }, "node_modules/invariant": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" @@ -11275,8 +10313,6 @@ }, "node_modules/is-absolute": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "license": "MIT", "dependencies": { "is-relative": "^1.0.0", @@ -11288,8 +10324,6 @@ }, "node_modules/is-array-buffer": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { @@ -11310,8 +10344,6 @@ }, "node_modules/is-async-function": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11330,8 +10362,6 @@ }, "node_modules/is-bigint": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11346,8 +10376,6 @@ }, "node_modules/is-boolean-object": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { @@ -11363,8 +10391,6 @@ }, "node_modules/is-bun-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", - "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11373,8 +10399,6 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { @@ -11386,8 +10410,6 @@ }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -11401,8 +10423,6 @@ }, "node_modules/is-data-view": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { @@ -11419,8 +10439,6 @@ }, "node_modules/is-date-object": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { @@ -11443,8 +10461,6 @@ }, "node_modules/is-finalizationregistry": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { @@ -11466,8 +10482,6 @@ }, "node_modules/is-generator-function": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { @@ -11496,8 +10510,6 @@ }, "node_modules/is-lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", - "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -11505,8 +10517,6 @@ }, "node_modules/is-map": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { @@ -11536,8 +10546,6 @@ }, "node_modules/is-number-object": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { @@ -11553,8 +10561,6 @@ }, "node_modules/is-regex": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { @@ -11572,8 +10578,6 @@ }, "node_modules/is-relative": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "license": "MIT", "dependencies": { "is-unc-path": "^1.0.0" @@ -11584,8 +10588,6 @@ }, "node_modules/is-set": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { @@ -11597,8 +10599,6 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { @@ -11613,8 +10613,6 @@ }, "node_modules/is-string": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { @@ -11630,8 +10628,6 @@ }, "node_modules/is-symbol": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { @@ -11648,8 +10644,6 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11664,8 +10658,6 @@ }, "node_modules/is-unc-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "license": "MIT", "dependencies": { "unc-path-regex": "^0.1.2" @@ -11676,8 +10668,6 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", "engines": { "node": ">=10" @@ -11688,8 +10678,6 @@ }, "node_modules/is-upper-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", - "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -11697,8 +10685,6 @@ }, "node_modules/is-weakmap": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { @@ -11710,8 +10696,6 @@ }, "node_modules/is-weakref": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { @@ -11726,8 +10710,6 @@ }, "node_modules/is-weakset": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11743,8 +10725,6 @@ }, "node_modules/is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11752,8 +10732,6 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, @@ -11764,8 +10742,6 @@ }, "node_modules/isomorphic-ws": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", "license": "MIT", "peerDependencies": { "ws": "*" @@ -11773,8 +10749,6 @@ }, "node_modules/isows": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", - "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", "funding": [ { "type": "github", @@ -11788,8 +10762,6 @@ }, "node_modules/iterator.prototype": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, "license": "MIT", "dependencies": { @@ -11806,8 +10778,6 @@ }, "node_modules/jiti": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -11819,8 +10789,6 @@ }, "node_modules/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -11831,8 +10799,6 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -11843,8 +10809,6 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, @@ -11854,8 +10818,6 @@ }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, @@ -11906,8 +10868,6 @@ }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -11932,8 +10892,6 @@ }, "node_modules/listr2": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", - "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "license": "MIT", "dependencies": { "cli-truncate": "^5.0.0", @@ -11949,8 +10907,6 @@ }, "node_modules/listr2/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -11961,8 +10917,6 @@ }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -11973,8 +10927,6 @@ }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", @@ -11990,8 +10942,6 @@ }, "node_modules/listr2/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" @@ -12005,8 +10955,6 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", @@ -12036,14 +10984,10 @@ }, "node_modules/lodash": { "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/lodash-es": { "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "license": "MIT" }, "node_modules/lodash.merge": { @@ -12053,14 +10997,10 @@ }, "node_modules/lodash.sortby": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "license": "MIT", "dependencies": { "chalk": "^4.1.0", @@ -12075,8 +11015,6 @@ }, "node_modules/log-update": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "license": "MIT", "dependencies": { "ansi-escapes": "^7.0.0", @@ -12094,8 +11032,6 @@ }, "node_modules/log-update/node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -12106,8 +11042,6 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -12118,8 +11052,6 @@ }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", "dependencies": { "get-east-asian-width": "^1.3.1" @@ -12133,8 +11065,6 @@ }, "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", @@ -12149,8 +11079,6 @@ }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", @@ -12166,8 +11094,6 @@ }, "node_modules/log-update/node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" @@ -12181,8 +11107,6 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", @@ -12208,8 +11132,6 @@ }, "node_modules/lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -12217,8 +11139,6 @@ }, "node_modules/lower-case-first": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", - "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -12226,8 +11146,6 @@ }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -12235,8 +11153,6 @@ }, "node_modules/lru-cache/node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, "node_modules/luxon": { @@ -12248,8 +11164,6 @@ }, "node_modules/make-cancellable-promise": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-2.0.0.tgz", - "integrity": "sha512-3SEQqTpV9oqVsIWqAcmDuaNeo7yBO3tqPtqGRcKkEo0lrzD3wqbKG9mkxO65KoOgXqj+zH2phJ2LiAsdzlogSw==", "license": "MIT", "funding": { "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" @@ -12257,8 +11171,6 @@ }, "node_modules/make-event-props": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-2.0.0.tgz", - "integrity": "sha512-G/hncXrl4Qt7mauJEXSg3AcdYzmpkIITTNl5I+rH9sog5Yw0kK6vseJjCaPfOXqOqQuPUP89Rkhfz5kPS8ijtw==", "license": "MIT", "funding": { "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" @@ -12266,8 +11178,6 @@ }, "node_modules/map-cache": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12275,8 +11185,6 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { @@ -12285,8 +11193,6 @@ }, "node_modules/merge-refs": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-2.0.0.tgz", - "integrity": "sha512-3+B21mYK2IqUWnd2EivABLT7ueDhb0b8/dGK8LoFQPrU61YITeCMn14F7y7qZafWNZhUEKb24cJdiT5Wxs3prg==", "license": "MIT", "funding": { "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" @@ -12302,8 +11208,6 @@ }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", "engines": { "node": ">= 8" @@ -12311,8 +11215,6 @@ }, "node_modules/meros": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.2.tgz", - "integrity": "sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==", "license": "MIT", "engines": { "node": ">=13" @@ -12349,8 +11251,6 @@ }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "license": "MIT", "engines": { "node": ">=18" @@ -12361,8 +11261,6 @@ }, "node_modules/minimatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "license": "ISC", "dependencies": { @@ -12382,14 +11280,10 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/mute-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" @@ -12414,8 +11308,6 @@ }, "node_modules/napi-postinstall": { "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", "bin": { @@ -12435,8 +11327,6 @@ }, "node_modules/no-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "license": "MIT", "dependencies": { "lower-case": "^2.0.2", @@ -12445,9 +11335,6 @@ }, "node_modules/node-domexception": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", "funding": [ { "type": "github", @@ -12465,14 +11352,10 @@ }, "node_modules/node-releases": { "version": "2.0.37", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", - "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", "license": "MIT" }, "node_modules/normalize-path": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "license": "MIT", "dependencies": { "remove-trailing-separator": "^1.0.1" @@ -12482,30 +11365,25 @@ } }, "node_modules/notistack": { - "version": "2.0.4", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/notistack/-/notistack-3.0.2.tgz", + "integrity": "sha512-0R+/arLYbK5Hh7mEfR2adt0tyXJcCC9KkA2hc56FeWik2QN6Bm/S4uW+BjzDARsJth5u06nTjelSw/VSnB1YEA==", "license": "MIT", "dependencies": { "clsx": "^1.1.0", - "hoist-non-react-statics": "^3.3.0" + "goober": "^2.0.33" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/notistack" }, "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "@mui/material": "^5.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/notistack/node_modules/clsx": { @@ -12524,8 +11402,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -12545,8 +11421,6 @@ }, "node_modules/object.assign": { "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { @@ -12566,8 +11440,6 @@ }, "node_modules/object.entries": { "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, "license": "MIT", "dependencies": { @@ -12612,8 +11484,6 @@ }, "node_modules/object.values": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -12631,8 +11501,6 @@ }, "node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "license": "MIT", "dependencies": { "mimic-function": "^5.0.0" @@ -12662,8 +11530,6 @@ }, "node_modules/own-keys": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, "license": "MIT", "dependencies": { @@ -12707,8 +11573,6 @@ }, "node_modules/param-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "license": "MIT", "dependencies": { "dot-case": "^3.0.4", @@ -12727,8 +11591,6 @@ }, "node_modules/parse-filepath": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "license": "MIT", "dependencies": { "is-absolute": "^1.0.0", @@ -12757,8 +11619,6 @@ }, "node_modules/pascal-case": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "license": "MIT", "dependencies": { "no-case": "^3.0.4", @@ -12767,8 +11627,6 @@ }, "node_modules/path-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", "license": "MIT", "dependencies": { "dot-case": "^3.0.4", @@ -12797,8 +11655,6 @@ }, "node_modules/path-root": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "license": "MIT", "dependencies": { "path-root-regex": "^0.1.0" @@ -12809,8 +11665,6 @@ }, "node_modules/path-root-regex": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12825,8 +11679,6 @@ }, "node_modules/pdfjs-dist": { "version": "5.4.296", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.296.tgz", - "integrity": "sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==", "license": "Apache-2.0", "engines": { "node": ">=20.16.0 || >=22.3.0" @@ -12837,14 +11689,10 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -12855,8 +11703,6 @@ }, "node_modules/possible-typed-array-names": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { @@ -12942,8 +11788,6 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -12968,8 +11812,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -13002,8 +11844,6 @@ }, "node_modules/react-day-picker": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-10.0.0.tgz", - "integrity": "sha512-lrEXo5wFPsq5LTcayelM3BPueD00v7zbdipAY+EIdPcseVykYwkOWx4Ujn/EtbBvpnp8ZPUHol17HXH6kVbZoA==", "license": "MIT", "dependencies": { "@date-fns/tz": "^1.4.1", @@ -13063,10 +11903,14 @@ } } }, + "node_modules/react-is": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "license": "MIT" + }, "node_modules/react-pdf": { "version": "10.4.1", - "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-10.4.1.tgz", - "integrity": "sha512-kS/35staVCBqS29verTQJQZXw7RfsRCPO3fdJoW1KXylcv7A9dw6DZ3vJXC2w+bIBgLw5FN4pOFvKSQtkQhPfA==", "license": "MIT", "dependencies": { "clsx": "^2.0.0", @@ -13106,8 +11950,6 @@ }, "node_modules/react-router": { "version": "6.30.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", - "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", "license": "MIT", "dependencies": { "@remix-run/router": "1.23.3" @@ -13121,8 +11963,6 @@ }, "node_modules/react-router-dom": { "version": "6.30.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", - "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", "license": "MIT", "dependencies": { "@remix-run/router": "1.23.3", @@ -13175,8 +12015,6 @@ }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { @@ -13198,8 +12036,6 @@ }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { @@ -13226,8 +12062,6 @@ }, "node_modules/remove-trailing-separator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "license": "ISC" }, "node_modules/remove-trailing-spaces": { @@ -13241,6 +12075,12 @@ "node": ">=0.10.0" } }, + "node_modules/reselect": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz", + "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.8", "license": "MIT", @@ -13265,8 +12105,6 @@ }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", "funding": { @@ -13275,8 +12113,6 @@ }, "node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "license": "MIT", "dependencies": { "onetime": "^7.0.0", @@ -13291,8 +12127,6 @@ }, "node_modules/restore-cursor/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", "engines": { "node": ">=14" @@ -13303,8 +12137,6 @@ }, "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -13313,14 +12145,10 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "license": "MIT" }, "node_modules/rollup": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", "dependencies": { @@ -13364,8 +12192,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -13387,8 +12213,6 @@ }, "node_modules/safe-array-concat": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13407,8 +12231,6 @@ }, "node_modules/safe-push-apply": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", "dependencies": { @@ -13424,8 +12246,6 @@ }, "node_modules/safe-regex-test": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { @@ -13442,8 +12262,6 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/scheduler": { @@ -13455,8 +12273,6 @@ }, "node_modules/semver": { "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -13468,8 +12284,6 @@ }, "node_modules/sentence-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", "license": "MIT", "dependencies": { "no-case": "^3.0.4", @@ -13495,8 +12309,6 @@ }, "node_modules/set-function-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13511,8 +12323,6 @@ }, "node_modules/set-proto": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, "license": "MIT", "dependencies": { @@ -13545,8 +12355,6 @@ }, "node_modules/shell-quote": { "version": "1.8.4", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", - "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -13557,8 +12365,6 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", "dependencies": { @@ -13577,8 +12383,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, "license": "MIT", "dependencies": { @@ -13594,8 +12398,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", "dependencies": { @@ -13613,8 +12415,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", "dependencies": { @@ -13633,8 +12433,6 @@ }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "license": "MIT", "engines": { "node": ">=8" @@ -13642,8 +12440,6 @@ }, "node_modules/slice-ansi": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", - "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", "license": "MIT", "dependencies": { "ansi-styles": "^6.2.3", @@ -13658,8 +12454,6 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -13670,8 +12464,6 @@ }, "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", "dependencies": { "get-east-asian-width": "^1.3.1" @@ -13685,8 +12477,6 @@ }, "node_modules/snake-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "license": "MIT", "dependencies": { "dot-case": "^3.0.4", @@ -13717,8 +12507,6 @@ }, "node_modules/sponge-case": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", - "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -13726,8 +12514,6 @@ }, "node_modules/stable-hash-x": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", - "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", "dev": true, "license": "MIT", "engines": { @@ -13736,8 +12522,6 @@ }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13757,8 +12541,6 @@ }, "node_modules/string-env-interpolation": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz", - "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==", "license": "MIT" }, "node_modules/string-width": { @@ -13779,8 +12561,6 @@ }, "node_modules/string.prototype.matchall": { "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, "license": "MIT", "dependencies": { @@ -13807,8 +12587,6 @@ }, "node_modules/string.prototype.repeat": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, "license": "MIT", "dependencies": { @@ -13818,8 +12596,6 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { @@ -13840,8 +12616,6 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13893,8 +12667,6 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -13948,8 +12720,6 @@ }, "node_modules/swap-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", - "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -13957,8 +12727,6 @@ }, "node_modules/sync-fetch": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.6.0.tgz", - "integrity": "sha512-IELLEvzHuCfc1uTsshPK58ViSdNqXxlml1U+fmwJIKLYKOr/rAtBrorE2RYm5IHaMpDNlmC0fr1LAvdXvyheEQ==", "license": "MIT", "dependencies": { "node-fetch": "^3.3.2", @@ -13971,8 +12739,6 @@ }, "node_modules/sync-fetch/node_modules/node-fetch": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", @@ -14004,8 +12770,6 @@ }, "node_modules/timeout-signal": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/timeout-signal/-/timeout-signal-2.0.0.tgz", - "integrity": "sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==", "license": "MIT", "engines": { "node": ">=16" @@ -14013,8 +12777,6 @@ }, "node_modules/tiny-case": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", - "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==", "license": "MIT" }, "node_modules/tiny-invariant": { @@ -14027,8 +12789,6 @@ }, "node_modules/tinyglobby": { "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14044,8 +12804,6 @@ }, "node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -14062,8 +12820,6 @@ }, "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -14075,14 +12831,10 @@ }, "node_modules/tinymce": { "version": "7.9.3", - "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-7.9.3.tgz", - "integrity": "sha512-Mtm54U5YJ6Pyo/GaAx+JSHXTGEuxrg2AowVWCD9zy1eBolp5Ub7S1rTtsyQdxhPegfhLuR3VLiTKGw1tacv09g==", "license": "GPL-2.0-or-later" }, "node_modules/title-case": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", - "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -14108,8 +12860,6 @@ }, "node_modules/ts-api-utils": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -14147,8 +12897,6 @@ }, "node_modules/tslib": { "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "license": "0BSD" }, "node_modules/type-check": { @@ -14171,8 +12919,6 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { @@ -14186,8 +12932,6 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { @@ -14206,8 +12950,6 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14228,8 +12970,6 @@ }, "node_modules/typed-array-length": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { @@ -14260,8 +13000,6 @@ }, "node_modules/typescript-eslint": { "version": "8.56.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.0.tgz", - "integrity": "sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==", "dev": true, "license": "MIT", "dependencies": { @@ -14284,8 +13022,6 @@ }, "node_modules/unbox-primitive": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { @@ -14303,8 +13039,6 @@ }, "node_modules/unc-path-regex": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -14316,8 +13050,6 @@ }, "node_modules/unixify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", - "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", "license": "MIT", "dependencies": { "normalize-path": "^2.1.1" @@ -14328,8 +13060,6 @@ }, "node_modules/unrs-resolver": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -14363,8 +13093,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -14393,8 +13121,6 @@ }, "node_modules/upper-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -14402,8 +13128,6 @@ }, "node_modules/upper-case-first": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -14411,8 +13135,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -14421,8 +13143,6 @@ }, "node_modules/urlpattern-polyfill": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", - "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", "license": "MIT" }, "node_modules/use-memo-one": { @@ -14521,8 +13241,6 @@ }, "node_modules/warning": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" @@ -14537,8 +13255,6 @@ }, "node_modules/whatwg-mimetype": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "license": "MIT", "engines": { "node": ">=18" @@ -14572,8 +13288,6 @@ }, "node_modules/which-boxed-primitive": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { @@ -14592,8 +13306,6 @@ }, "node_modules/which-builtin-type": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -14620,8 +13332,6 @@ }, "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { @@ -14639,8 +13349,6 @@ }, "node_modules/which-typed-array": { "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -14676,8 +13384,6 @@ }, "node_modules/ws": { "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -14704,8 +13410,6 @@ }, "node_modules/yaml": { "version": "1.10.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", - "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", "license": "ISC", "engines": { "node": ">= 6" @@ -14746,8 +13450,6 @@ }, "node_modules/yoctocolors-cjs": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "license": "MIT", "engines": { "node": ">=18" @@ -14758,8 +13460,6 @@ }, "node_modules/yup": { "version": "1.7.1", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.7.1.tgz", - "integrity": "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==", "license": "MIT", "dependencies": { "property-expr": "^2.0.5", @@ -14770,8 +13470,6 @@ }, "node_modules/yup/node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" @@ -14782,8 +13480,6 @@ }, "node_modules/zod": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, "license": "MIT", "funding": { @@ -14792,8 +13488,6 @@ }, "node_modules/zod-validation-error": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", "dev": true, "license": "MIT", "engines": { diff --git a/apps/frontend/package.json b/apps/frontend/package.json index ff7827cc7b..bdd523a41d 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -15,12 +15,14 @@ "@graphql-codegen/typescript-graphql-request": "^7.0.0", "@graphql-codegen/typescript-operations": "^5.0.9", "@graphql-typed-document-node/core": "^3.2.0", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", "@hello-pangea/dnd": "^16.6.0", - "@material-table/core": "^6.4.4", - "@mui/icons-material": "^5.15.18", - "@mui/material": "^5.15.18", - "@mui/system": "^5.15.15", - "@mui/x-date-pickers": "^7.5.0", + "@material-table/core": "6.4.4", + "@mui/icons-material": "^9.2.0", + "@mui/material": "^9.2.0", + "@mui/system": "^9.2.0", + "@mui/x-date-pickers": "^9.9.0", "@tinymce/tinymce-react": "^5.1.1", "@types/mime": "^2.0.3", "@uiw/react-codemirror": "^4.22.1", @@ -37,7 +39,7 @@ "jwt-decode": "^4.0.0", "luxon": "^3.4.4", "mime": "^3.0.0", - "notistack": "^2.0.4", + "notistack": "^3.0.2", "pdfjs-dist": "^5.4.296", "query-string": "^6.14.0", "react": "^18.3.1", diff --git a/apps/frontend/src/components/AppToolbar/AccountActionButton.tsx b/apps/frontend/src/components/AppToolbar/AccountActionButton.tsx index 010a51092d..fbad1f8311 100644 --- a/apps/frontend/src/components/AppToolbar/AccountActionButton.tsx +++ b/apps/frontend/src/components/AppToolbar/AccountActionButton.tsx @@ -163,7 +163,11 @@ const AccountActionButton = () => { disabled={isLoggingOut} data-cy="manage-account-button" > - + Manage account @@ -176,7 +180,11 @@ const AccountActionButton = () => { }} data-cy="change-roles-button" > - + { onClick={handleExternalHomepageClick} data-cy="external-homepage-button" > - + Facilities Homepage @@ -237,7 +249,11 @@ const AccountActionButton = () => { onClick={handleOnLogout} disabled={isLoggingOut} > - + {isLoggingOut ? : } Logout diff --git a/apps/frontend/src/components/AppToolbar/AppToolbar.tsx b/apps/frontend/src/components/AppToolbar/AppToolbar.tsx index 149289a29c..a43646572f 100644 --- a/apps/frontend/src/components/AppToolbar/AppToolbar.tsx +++ b/apps/frontend/src/components/AppToolbar/AppToolbar.tsx @@ -94,7 +94,9 @@ const AppToolbar = ({ open, handleDrawerOpen, header }: AppToolbarProps) => { )} {(!isTabletOrMobile || !isPortraitMode) && ( - + {location.pathname === '/' ? 'Dashboard' : header} )} diff --git a/apps/frontend/src/components/PageLayout.tsx b/apps/frontend/src/components/PageLayout.tsx index 76f78cd541..627a3a7133 100644 --- a/apps/frontend/src/components/PageLayout.tsx +++ b/apps/frontend/src/components/PageLayout.tsx @@ -148,7 +148,14 @@ const PageLayout = ({ }} > {isTabletOrMobile && ( - + {header} )} diff --git a/apps/frontend/src/components/admin/AssignTagsForm.tsx b/apps/frontend/src/components/admin/AssignTagsForm.tsx index b16b1edfc4..573a18594b 100644 --- a/apps/frontend/src/components/admin/AssignTagsForm.tsx +++ b/apps/frontend/src/components/admin/AssignTagsForm.tsx @@ -62,12 +62,12 @@ const AssignTagsForm = ({ role, close, onAssign }: AssignTagsFormProps) => { onChange={(_event, newValue) => { setFieldValue('selectedTags', newValue); }} - renderTags={(value, getTagProps) => + renderValue={(value, getItemProps) => value.map((option, index) => ( )) diff --git a/apps/frontend/src/components/call/AssignedInstrumentsTable.tsx b/apps/frontend/src/components/call/AssignedInstrumentsTable.tsx index fb844baf7b..b94de8aa73 100644 --- a/apps/frontend/src/components/call/AssignedInstrumentsTable.tsx +++ b/apps/frontend/src/components/call/AssignedInstrumentsTable.tsx @@ -87,12 +87,14 @@ const AvailabilityTimeEditComponent = ( onChange={(e: ChangeEvent) => props.onChange(e.target.value) } - InputProps={{ inputProps: { max: MAX_32_BIT_INTEGER - 1, min: 1 } }} required fullWidth error={props.error} helperText={props.helperText} margin="none" + slotProps={{ + input: { inputProps: { max: MAX_32_BIT_INTEGER - 1, min: 1 } } + }} /> ); diff --git a/apps/frontend/src/components/call/CallGeneralInfo.tsx b/apps/frontend/src/components/call/CallGeneralInfo.tsx index 90af6aaf0a..0f0b9a3d0b 100644 --- a/apps/frontend/src/components/call/CallGeneralInfo.tsx +++ b/apps/frontend/src/components/call/CallGeneralInfo.tsx @@ -295,7 +295,9 @@ const CallGeneralInfo = ({ title="Reference Number Format" > - + A reference number format determines how reference numbers are generated. It consists of a prefix and digits parameter.

diff --git a/apps/frontend/src/components/call/CallNotificationAndCycleInfo.tsx b/apps/frontend/src/components/call/CallNotificationAndCycleInfo.tsx index 88c08dce71..7f2a3aa925 100644 --- a/apps/frontend/src/components/call/CallNotificationAndCycleInfo.tsx +++ b/apps/frontend/src/components/call/CallNotificationAndCycleInfo.tsx @@ -1,4 +1,4 @@ -import useTheme from '@mui/material/styles/useTheme'; +import { useTheme } from '@mui/material/styles'; import { AdapterLuxon as DateAdapter } from '@mui/x-date-pickers/AdapterLuxon'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { Field, useFormikContext } from 'formik'; diff --git a/apps/frontend/src/components/call/CallReviewsInfo.tsx b/apps/frontend/src/components/call/CallReviewsInfo.tsx index 59a7a0cbb0..f155cdc6dc 100644 --- a/apps/frontend/src/components/call/CallReviewsInfo.tsx +++ b/apps/frontend/src/components/call/CallReviewsInfo.tsx @@ -1,4 +1,4 @@ -import useTheme from '@mui/material/styles/useTheme'; +import { useTheme } from '@mui/material/styles'; import { AdapterLuxon as DateAdapter } from '@mui/x-date-pickers/AdapterLuxon'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { Field, useFormikContext } from 'formik'; diff --git a/apps/frontend/src/components/call/CallsTable.tsx b/apps/frontend/src/components/call/CallsTable.tsx index 7d81c65dfb..ffc9966616 100644 --- a/apps/frontend/src/components/call/CallsTable.tsx +++ b/apps/frontend/src/components/call/CallsTable.tsx @@ -383,7 +383,11 @@ const CallsTable = ({ confirm, isArchivedTab }: CallTableProps) => { return (
- + { /> )} - {isCallReorderMode && (
@@ -424,7 +427,6 @@ const CallsTable = ({ confirm, isArchivedTab }: CallTableProps) => {
)} - {assigningInstrumentsCallId && ( { return ( - - Changing role... - + sx={{ + display: "flex", + justifyContent: "center", + alignItems: "center", + minHeight: "100vh" + }}> + Changing role... + ); }; diff --git a/apps/frontend/src/components/common/EmailSearchBar.tsx b/apps/frontend/src/components/common/EmailSearchBar.tsx index cc268a32de..f71b30d692 100644 --- a/apps/frontend/src/components/common/EmailSearchBar.tsx +++ b/apps/frontend/src/components/common/EmailSearchBar.tsx @@ -18,7 +18,12 @@ const EmailSearchBar = (props: Options) => (
- + & BoxProps) { const { name, ...boxProps } = props; return ( - + ); diff --git a/apps/frontend/src/components/common/FileUploadComponent.tsx b/apps/frontend/src/components/common/FileUploadComponent.tsx index a34d0cf058..bbba9de42e 100644 --- a/apps/frontend/src/components/common/FileUploadComponent.tsx +++ b/apps/frontend/src/components/common/FileUploadComponent.tsx @@ -1,9 +1,9 @@ -import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutline'; +import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutlined'; import AttachFileIcon from '@mui/icons-material/AttachFile'; import CancelIcon from '@mui/icons-material/Cancel'; import ClosedCaption from '@mui/icons-material/ClosedCaption'; import ClosedCaptionOutlinedIcon from '@mui/icons-material/ClosedCaptionOutlined'; -import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'; +import DeleteOutlineIcon from '@mui/icons-material/DeleteOutlined'; import ErrorIcon from '@mui/icons-material/Error'; import GetAppIcon from '@mui/icons-material/GetApp'; import InfoOutlined from '@mui/icons-material/InfoOutlined'; @@ -65,8 +65,13 @@ export function FileEntry(props: { }; return ( - - + + - - + + - + {props.metaData.mimeType.startsWith('image') && ( - - + {props.metaData.mimeType.startsWith('image') && ( - + - - - - - ), - }} fullWidth + slotProps={{ + input: { + startAdornment: ( + + + + + + ), + }, + }} /> )} {(showCaption || props.caption) && ( - + 1 ? ( - + Maximum {maxFiles} file(s) ) : null; @@ -451,7 +471,12 @@ export function FileUploadComponent(props: { const pdfPageLimitInfo = fileType.includes('.pdf') && pdfPageLimit > 0 ? ( - + Maximum {pdfPageLimit} PDF page(s) per file ) : null; diff --git a/apps/frontend/src/components/common/FormikUIAutocomplete.tsx b/apps/frontend/src/components/common/FormikUIAutocomplete.tsx index 379b87c8dc..21adc2724d 100644 --- a/apps/frontend/src/components/common/FormikUIAutocomplete.tsx +++ b/apps/frontend/src/components/common/FormikUIAutocomplete.tsx @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import MuiAutocomplete, { AutocompleteProps as MuiAutocompleteProps, + AutocompleteRenderInputParams, } from '@mui/material/Autocomplete'; import { InputProps } from '@mui/material/Input'; import InputAdornment from '@mui/material/InputAdornment'; @@ -137,31 +138,34 @@ const FormikUIAutocomplete = ({ return foundOption?.text || ''; }} - renderInput={(params: MUITextFieldProps) => ( + renderInput={(params: AutocompleteRenderInputParams) => ( - {InputProps?.endAdornment && adornmentVisible - ? InputProps.endAdornment - : null}{' '} - {params.InputProps?.endAdornment} - - ), - }} onFocus={() => { setAdornmentVisible(true); }} onBlur={() => { setAdornmentVisible(false); }} + slotProps={{ + ...params.slotProps, + input: { + ...params.slotProps.input, + ...InputProps, + endAdornment: ( + + {InputProps?.endAdornment && adornmentVisible + ? InputProps.endAdornment + : null}{' '} + {params.slotProps.input?.endAdornment} + + ), + }, + }} /> )} ListboxProps={{ 'data-cy': props['data-cy'] + '-options' }} diff --git a/apps/frontend/src/components/common/FormikUICustomDependencySelector.tsx b/apps/frontend/src/components/common/FormikUICustomDependencySelector.tsx index 131393dfe3..bee580fdca 100644 --- a/apps/frontend/src/components/common/FormikUICustomDependencySelector.tsx +++ b/apps/frontend/src/components/common/FormikUICustomDependencySelector.tsx @@ -192,7 +192,7 @@ const FormikUICustomDependencySelector = ({ return ( - + Field @@ -232,8 +232,7 @@ const FormikUICustomDependencySelector = ({ - - + Compare @@ -254,8 +253,7 @@ const FormikUICustomDependencySelector = ({ - - + Value diff --git a/apps/frontend/src/components/common/FormikUIDatePicker.tsx b/apps/frontend/src/components/common/FormikUIDatePicker.tsx index 08e18d3eeb..7f78600157 100644 --- a/apps/frontend/src/components/common/FormikUIDatePicker.tsx +++ b/apps/frontend/src/components/common/FormikUIDatePicker.tsx @@ -1,6 +1,5 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { TextFieldProps } from '@mui/material/TextField'; -import { PickerValidDate } from '@mui/x-date-pickers'; import { DatePicker as MuiDatePicker, DatePickerProps as MuiDatePickerProps, @@ -13,7 +12,7 @@ import { createFormikErrorHandler } from 'utils/errorHandler'; export interface DatePickerProps extends FieldProps, - Omit, 'name' | 'value' | 'error'> { + Omit { textField?: TextFieldProps; } @@ -33,15 +32,14 @@ export function fieldToDatePicker({ onChange, onError, ...props -}: DatePickerProps): MuiDatePickerProps { +}: DatePickerProps): MuiDatePickerProps { const fieldError = getIn(errors, field.name); const showError = getIn(touched, field.name) && !!fieldError; const isStringValue = typeof value === 'string'; return { slotProps: { - textField: (textFieldProps) => ({ - ...textFieldProps, + textField: { error: showError, helperText: showError ? fieldError : helperText, label: label, @@ -51,7 +49,7 @@ export function fieldToDatePicker({ setFieldTouched(field.name, true, true); }, ...textField, - }), + } as NonNullable['textField'], }, disabled: disabled ?? isSubmitting, onChange: diff --git a/apps/frontend/src/components/common/FormikUIDateTimePicker.tsx b/apps/frontend/src/components/common/FormikUIDateTimePicker.tsx index aa7d11fd9b..cc148589b0 100644 --- a/apps/frontend/src/components/common/FormikUIDateTimePicker.tsx +++ b/apps/frontend/src/components/common/FormikUIDateTimePicker.tsx @@ -1,6 +1,5 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { TextFieldProps } from '@mui/material/TextField'; -import { PickerValidDate } from '@mui/x-date-pickers'; import { DateTimePicker as MuiDateTimePicker, DateTimePickerProps as MuiDateTimePickerProps, @@ -13,7 +12,7 @@ import { createFormikErrorHandler } from 'utils/errorHandler'; export interface DateTimePickerProps extends FieldProps, - Omit, 'name' | 'value' | 'error'> { + Omit { textField?: TextFieldProps; } @@ -33,15 +32,14 @@ export function fieldToDateTimePicker({ onChange, onError, ...props -}: DateTimePickerProps): MuiDateTimePickerProps { +}: DateTimePickerProps): MuiDateTimePickerProps { const fieldError = getIn(errors, field.name); const showError = getIn(touched, field.name) && !!fieldError; const isStringValue = typeof value === 'string'; return { slotProps: { - textField: (textFieldProps) => ({ - ...textFieldProps, + textField: { error: showError, helperText: showError ? fieldError : helperText, label: label, @@ -51,7 +49,7 @@ export function fieldToDateTimePicker({ setFieldTouched(field.name, true, true); }, ...textField, - }), + } as NonNullable['textField'], }, disabled: disabled ?? isSubmitting, onChange: diff --git a/apps/frontend/src/components/common/SimpleTabs.tsx b/apps/frontend/src/components/common/SimpleTabs.tsx index f1864a72d1..52efaf291d 100644 --- a/apps/frontend/src/components/common/SimpleTabs.tsx +++ b/apps/frontend/src/components/common/SimpleTabs.tsx @@ -1,5 +1,5 @@ import Box from '@mui/material/Box'; -import { useTheme } from '@mui/material/styles'; +import { SxProps, Theme, useTheme } from '@mui/material/styles'; import Tab from '@mui/material/Tab'; import Tabs from '@mui/material/Tabs'; import useMediaQuery from '@mui/material/useMediaQuery'; @@ -13,6 +13,7 @@ interface TabPanelProps { value: number; padding?: number | string; orientation: 'horizontal' | 'vertical'; + sx?: SxProps; } function TabPanel(props: TabPanelProps) { @@ -24,11 +25,24 @@ function TabPanel(props: TabPanelProps) { hidden={value !== index} id={`${orientation}-tab-${index}`} aria-labelledby={`${orientation}-tabpanel-${index}`} - width="100%" - overflow="auto" {...other} + sx={[ + { + width: '100%', + overflow: 'auto', + }, + ...(Array.isArray(other.sx) ? other.sx : [other.sx]), + ]} > - {value === index && {children}} + {value === index && ( + + {children} + + )} ); } @@ -162,15 +176,16 @@ const SimpleTabs = ({ ))} - {noItems ? ( {noItemsText} diff --git a/apps/frontend/src/components/common/TextFieldWithCounter.tsx b/apps/frontend/src/components/common/TextFieldWithCounter.tsx index f7d695a804..82190ccccf 100644 --- a/apps/frontend/src/components/common/TextFieldWithCounter.tsx +++ b/apps/frontend/src/components/common/TextFieldWithCounter.tsx @@ -31,23 +31,25 @@ const TextFieldWithCounter = ( ({ - ...(other.multiline && { - alignSelf: 'flex-end', - alignItems: 'flex-end', - marginBottom: -theme.spacing(0.5), - }), - ...(maxLen && - textLen > maxLen && { color: theme.palette.error.main }), - })} - > - {counter} - - ), + slotProps={{ + input: { + endAdornment: !isCounterHidden && ( + ({ + ...(other.multiline && { + alignSelf: 'flex-end', + alignItems: 'flex-end', + marginBottom: -theme.spacing(0.5), + }), + ...(maxLen && + textLen > maxLen && { color: theme.palette.error.main }), + })} + > + {counter} + + ), + } }} />
diff --git a/apps/frontend/src/components/common/experimentFilters/DateFilter.tsx b/apps/frontend/src/components/common/experimentFilters/DateFilter.tsx index c61e6b8902..91010786f9 100644 --- a/apps/frontend/src/components/common/experimentFilters/DateFilter.tsx +++ b/apps/frontend/src/components/common/experimentFilters/DateFilter.tsx @@ -70,7 +70,11 @@ function DateFilter(props: DateFilterProps) { return ( - + - + + size={{ + sm: 4, + xs: 12 + }}> { diff --git a/apps/frontend/src/components/common/predefinedMessages/FormikUIPredefinedMessagesTextField.tsx b/apps/frontend/src/components/common/predefinedMessages/FormikUIPredefinedMessagesTextField.tsx index 9d03c9a856..2fa7cc85f3 100644 --- a/apps/frontend/src/components/common/predefinedMessages/FormikUIPredefinedMessagesTextField.tsx +++ b/apps/frontend/src/components/common/predefinedMessages/FormikUIPredefinedMessagesTextField.tsx @@ -61,21 +61,22 @@ const FormikUIPredefinedMessagesTextField = ({ setFormFieldValue={helpers.setValue} /> )} - - - - - - ), + slotProps={{ + input: { + endAdornment: ( + + + + + + ), + } }} /> diff --git a/apps/frontend/src/components/common/proposalFilters/DateFilter.tsx b/apps/frontend/src/components/common/proposalFilters/DateFilter.tsx index 7cbf9ede2b..cc0513e4c6 100644 --- a/apps/frontend/src/components/common/proposalFilters/DateFilter.tsx +++ b/apps/frontend/src/components/common/proposalFilters/DateFilter.tsx @@ -33,7 +33,11 @@ const DateFilter = ({ onChange }: DateFilterProps) => { - + { /> - + - + - + {selectedQuestion && ( - + {selectedQuestion && ( - -
- - ); -}; - -const ProposalInformationTab = ({ proposalPk }: { proposalPk: number }) => { - const { proposalData, loading: proposalLoading } = - useProposalData(proposalPk); - - if (proposalLoading) { - return ; - } - - return ( - <> - {proposalData ? ( - - ) : ( - -

Proposal not found

-
- )} - - ); -}; - -const ExperimentReviewContent = ({ - experimentPk, - tabNames, - isInsideModal, -}: ExperimentReviewContentProps) => { - const { experiment, loading: experimentLoading } = - useExperiment(experimentPk); - - const { t } = useTranslation(); - const { toFormattedDateTime } = useFormattedDateTime({ - shouldUseTimeZone: true, - settingsFormatToUse: SettingsId.DATE_FORMAT, - }); - - if (experimentLoading) { - return ; - } - - if (!experiment) { - return ( - -

Experiment not found

-
- ); - } - - const ExperimentInformationTab = () => { - const rows = [ - { label: 'Experiment Number', value: experiment.experimentId }, - { - label: 'Start', - value: toFormattedDateTime(experiment.startsAt), - }, - { - label: 'End', - value: toFormattedDateTime(experiment.endsAt), - }, - { - label: 'Experiment Safety Review Status', - value: experiment.experimentSafety?.status?.name ?? 'ESF Not Started', - }, - ]; - - return ; - }; - - const ExperimentSafetyReviewTab = ( - <> - {experiment.experimentSafety?.experimentSafetyPk ? ( - - ) : ( - -

Experiment Safety not found

-
- )} - - ); - - const tabsContent = tabNames.map((tab, index) => { - switch (tab) { - case EXPERIMENT_MODAL_TAB_NAMES.EXPERIMENT_INFORMATION: - return ( - - - - ); - case EXPERIMENT_MODAL_TAB_NAMES.PROPOSAL_INFORMATION: - return ( - - - - ); - case EXPERIMENT_MODAL_TAB_NAMES.EXPERIMENT_SAFETY_FORM: - return ( - - {experiment.experimentSafety?.experimentSafetyPk ? ( - - ) : ( - -

Experiment Safety Not Submitted by the User

-
- )} -
- ); - case EXPERIMENT_MODAL_TAB_NAMES.EXPERIMENT_SAFETY_REVIEW: - return {ExperimentSafetyReviewTab}; - case EXPERIMENT_MODAL_TAB_NAMES.VISIT: - return ( - - - - ); - default: - return null; - } - }); - - return ( - <> - {tabNames.length > 1 ? ( - t(name))} - isInsideModal={isInsideModal} - > - {tabsContent} - - ) : ( - <>{tabsContent} - )} - - ); -}; - -export default ExperimentReviewContent; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import { DialogActions, DialogContent } from '@mui/material'; +import Accordion from '@mui/material/Accordion'; +import AccordionDetails from '@mui/material/AccordionDetails'; +import AccordionSummary from '@mui/material/AccordionSummary'; +import Button from '@mui/material/Button'; +import Link from '@mui/material/Link'; +import List from '@mui/material/List'; +import ListItem from '@mui/material/ListItem'; +import Typography from '@mui/material/Typography'; +import { Box } from '@mui/system'; +import React, { Fragment, useState } from 'react'; +import { useTranslation } from 'react-i18next'; + +import SimpleTabs from 'components/common/SimpleTabs'; +import StyledDialog from 'components/common/StyledDialog'; +import UOLoader from 'components/common/UOLoader'; +import ExperimentSafetyReview from 'components/experimentSafetyReview/ExperimentSafetyReview'; +import GeneralInformation from 'components/proposal/GeneralInformation'; +import { AnswersTable } from 'components/questionary/AnswersTable'; +import QuestionaryDetails from 'components/questionary/QuestionaryDetails'; +import { SettingsId } from 'generated/sdk'; +import { useFormattedDateTime } from 'hooks/admin/useFormattedDateTime'; +import { useExperiment } from 'hooks/experiment/useExperiment'; +import { useExperimentSafety } from 'hooks/experimentSafety/useExperimentSafety'; +import { useProposalData } from 'hooks/proposal/useProposalData'; + +import ExperimentVisitsTable from './ExperimentVisitsTable'; + +export enum EXPERIMENT_MODAL_TAB_NAMES { + EXPERIMENT_INFORMATION = 'Experiment Information', + PROPOSAL_INFORMATION = 'Proposal Information', + EXPERIMENT_SAFETY_FORM = 'Experiment Safety Form', + EXPERIMENT_SAFETY_REVIEW = 'Experiment Safety Review', + VISIT = 'Visit', +} + +type ExperimentReviewContentProps = { + tabNames: EXPERIMENT_MODAL_TAB_NAMES[]; + experimentPk: number; + isInsideModal?: boolean; +}; + +const ExperimentSafetyFormTab = ({ + experimentSafetyPk, +}: { + experimentSafetyPk: number; +}) => { + const [selectedSampleId, setSelectedSampleId] = useState(null); + const { experimentSafety, loading: experimentSafetyLoading } = + useExperimentSafety(experimentSafetyPk); + + if (experimentSafetyLoading) { + return ; + } + + if (!experimentSafety) { + return ( + +

Experiment Safety not found

+
+ ); + } + + const SampleList = () => ( + ({ + padding: 0, + margin: 0, + '& li': { + display: 'block', + marginRight: theme.spacing(1), + }, + })} + > + {experimentSafety.samples?.map((sample) => ( + + setSelectedSampleId(sample.sampleId)} + style={{ cursor: 'pointer' }} + > + {sample.sample.title || `Sample ${sample.sampleId}`} + + + ))} + + ); + + return ( + + {/* Sample Safety Input Accordion */} + {experimentSafety.samples && experimentSafety.samples.length > 0 && ( + ({ + ':before': { display: 'none' }, + border: `1px solid ${theme.palette.grey[200]}`, + marginBottom: theme.spacing(2), + })} + > + } + sx={(theme) => ({ + background: theme.palette.grey[100], + })} + > + Sample Safety Input + + + + + + )} + + {/* Experiment Safety Input Accordion */} + ({ + ':before': { display: 'none' }, + border: `1px solid ${theme.palette.grey[200]}`, + })} + > + } + sx={(theme) => ({ + background: theme.palette.grey[100], + })} + > + Experiment Safety Input + + + + + + + {/* Sample Details Modal */} + setSelectedSampleId(null)} + title={ + selectedSampleId + ? (() => { + const selectedSample = experimentSafety.samples?.find( + (sample) => sample.sampleId === selectedSampleId + ); + + return `Sample Safety Input - ${ + selectedSample?.sample.title || `Sample ${selectedSampleId}` + }`; + })() + : 'Sample Safety Input' + } + > + + {selectedSampleId + ? (() => { + const selectedSample = experimentSafety.samples?.find( + (sample) => sample.sampleId === selectedSampleId + ); + + return selectedSample?.sampleEsiQuestionaryId ? ( + + ) : ( + No questionary found for this sample + ); + })() + : null} + + + + + + + ); +}; + +const ProposalInformationTab = ({ proposalPk }: { proposalPk: number }) => { + const { proposalData, loading: proposalLoading } = + useProposalData(proposalPk); + + if (proposalLoading) { + return ; + } + + return ( + <> + {proposalData ? ( + + ) : ( + +

Proposal not found

+
+ )} + + ); +}; + +const ExperimentReviewContent = ({ + experimentPk, + tabNames, + isInsideModal, +}: ExperimentReviewContentProps) => { + const { experiment, loading: experimentLoading } = + useExperiment(experimentPk); + + const { t } = useTranslation(); + const { toFormattedDateTime } = useFormattedDateTime({ + shouldUseTimeZone: true, + settingsFormatToUse: SettingsId.DATE_FORMAT, + }); + + if (experimentLoading) { + return ; + } + + if (!experiment) { + return ( + +

Experiment not found

+
+ ); + } + + const ExperimentInformationTab = () => { + const rows = [ + { label: 'Experiment Number', value: experiment.experimentId }, + { + label: 'Start', + value: toFormattedDateTime(experiment.startsAt), + }, + { + label: 'End', + value: toFormattedDateTime(experiment.endsAt), + }, + { + label: 'Experiment Safety Review Status', + value: experiment.experimentSafety?.status?.name ?? 'ESF Not Started', + }, + ]; + + return ; + }; + + const ExperimentSafetyReviewTab = ( + <> + {experiment.experimentSafety?.experimentSafetyPk ? ( + + ) : ( + +

Experiment Safety not found

+
+ )} + + ); + + const tabsContent = tabNames.map((tab, index) => { + switch (tab) { + case EXPERIMENT_MODAL_TAB_NAMES.EXPERIMENT_INFORMATION: + return ( + + + + ); + case EXPERIMENT_MODAL_TAB_NAMES.PROPOSAL_INFORMATION: + return ( + + + + ); + case EXPERIMENT_MODAL_TAB_NAMES.EXPERIMENT_SAFETY_FORM: + return ( + + {experiment.experimentSafety?.experimentSafetyPk ? ( + + ) : ( + +

Experiment Safety Not Submitted by the User

+
+ )} +
+ ); + case EXPERIMENT_MODAL_TAB_NAMES.EXPERIMENT_SAFETY_REVIEW: + return {ExperimentSafetyReviewTab}; + case EXPERIMENT_MODAL_TAB_NAMES.VISIT: + return ( + + + + ); + default: + return null; + } + }); + + return ( + <> + {tabNames.length > 1 ? ( + t(name))} + isInsideModal={isInsideModal} + > + {tabsContent} + + ) : ( + <>{tabsContent} + )} + + ); +}; + +export default ExperimentReviewContent; diff --git a/apps/frontend/src/components/experiment/ExperimentReviewModal.tsx b/apps/frontend/src/components/experiment/ExperimentReviewModal.tsx index 2cfa55a8d8..21b4f86aaa 100644 --- a/apps/frontend/src/components/experiment/ExperimentReviewModal.tsx +++ b/apps/frontend/src/components/experiment/ExperimentReviewModal.tsx @@ -8,7 +8,7 @@ import { } from '@mui/material'; import Dialog from '@mui/material/Dialog'; import Slide from '@mui/material/Slide'; -import { TransitionProps } from '@mui/material/transitions/transition'; +import { TransitionProps } from '@mui/material/transitions'; import React from 'react'; const Transition = React.forwardRef(function Transition( @@ -41,7 +41,9 @@ const ExperimentReviewModal = ({ open={modalOpen} fullScreen onClose={handleClose} - TransitionComponent={Transition} + slots={{ + transition: Transition + }} > diff --git a/apps/frontend/src/components/experimentSafety/ExperimentSafety.tsx b/apps/frontend/src/components/experimentSafety/ExperimentSafety.tsx index 56cb0ef39f..5c92bb1c16 100644 --- a/apps/frontend/src/components/experimentSafety/ExperimentSafety.tsx +++ b/apps/frontend/src/components/experimentSafety/ExperimentSafety.tsx @@ -1,42 +1,42 @@ -import { useSnackbar } from 'notistack'; -import React, { useEffect, useState } from 'react'; - -import UOLoader from 'components/common/UOLoader'; -import { GetExperimentSafetyQuery } from 'generated/sdk'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; - -import ExperimentSafetyContainer from './ExperimentSafetyContainer'; - -interface ExperimentSafetyProps { - experimentSafetyPk: number; -} -function ExperimentSafety({ experimentSafetyPk }: ExperimentSafetyProps) { - const { api } = useDataApiWithFeedback(); - const { enqueueSnackbar } = useSnackbar(); - const [experimentSafety, setExperimentSafety] = useState< - GetExperimentSafetyQuery['experimentSafety'] | null - >(null); - - useEffect(() => { - api() - .getExperimentSafety({ experimentSafetyPk }) - .then((result) => { - if (result.experimentSafety) { - setExperimentSafety(result.experimentSafety); - } else { - enqueueSnackbar('Experiment Safety data not found', { - variant: 'error', - className: 'snackbar-error', - }); - } - }); - }, [experimentSafetyPk, api, enqueueSnackbar]); - - if (!experimentSafety) { - return ; - } - - return ; -} - -export default ExperimentSafety; +import { useSnackbar } from 'notistack'; +import React, { useEffect, useState } from 'react'; + +import UOLoader from 'components/common/UOLoader'; +import { GetExperimentSafetyQuery } from 'generated/sdk'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; + +import ExperimentSafetyContainer from './ExperimentSafetyContainer'; + +interface ExperimentSafetyProps { + experimentSafetyPk: number; +} +function ExperimentSafety({ experimentSafetyPk }: ExperimentSafetyProps) { + const { api } = useDataApiWithFeedback(); + const { enqueueSnackbar } = useSnackbar(); + const [experimentSafety, setExperimentSafety] = useState< + GetExperimentSafetyQuery['experimentSafety'] | null + >(null); + + useEffect(() => { + api() + .getExperimentSafety({ experimentSafetyPk }) + .then((result) => { + if (result.experimentSafety) { + setExperimentSafety(result.experimentSafety); + } else { + enqueueSnackbar('Experiment Safety data not found', { + variant: 'error', + className: 'snackbar-error', + }); + } + }); + }, [experimentSafetyPk, api, enqueueSnackbar]); + + if (!experimentSafety) { + return ; + } + + return ; +} + +export default ExperimentSafety; diff --git a/apps/frontend/src/components/experimentSafety/ExperimentSafetyReview.tsx b/apps/frontend/src/components/experimentSafety/ExperimentSafetyReview.tsx index 5cb6c23b72..84b2841a1b 100644 --- a/apps/frontend/src/components/experimentSafety/ExperimentSafetyReview.tsx +++ b/apps/frontend/src/components/experimentSafety/ExperimentSafetyReview.tsx @@ -1,105 +1,105 @@ -import React, { useContext } from 'react'; - -import { NavigButton } from 'components/common/NavigButton'; -import NavigationFragment from 'components/questionary/NavigationFragment'; -import { - createMissingContextErrorMessage, - QuestionaryContext, -} from 'components/questionary/QuestionaryContext'; -import { - ExperimentSafetyReviewerDecisionEnum, - InstrumentScientistDecisionEnum, -} from 'generated/sdk'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; -import { FunctionType } from 'utils/utilTypes'; -import withConfirm, { WithConfirmType } from 'utils/withConfirm'; - -import { ExperimentSafetyContextType } from './ExperimentSafetyContainer'; -import ExperimentSafetyDetails from './ExperimentSafetyDetails'; - -type ExperimentSafetyReviewProps = { - onComplete?: FunctionType; - confirm: WithConfirmType; -}; - -function ExperimentSafetyReview({ confirm }: ExperimentSafetyReviewProps) { - const { api, isExecutingCall } = useDataApiWithFeedback(); - - const { state, dispatch } = useContext( - QuestionaryContext - ) as ExperimentSafetyContextType; - if (!state || !dispatch) { - throw new Error(createMissingContextErrorMessage()); - } - - const isSubmitted = state.experimentSafety.esiQuestionarySubmittedAt !== null; - - // Check if any decision has been made (not null, not undefined, not UNSET) - const hasInstrumentScientistDecision = - state.experimentSafety.instrumentScientistDecision !== null && - state.experimentSafety.instrumentScientistDecision !== undefined && - state.experimentSafety.instrumentScientistDecision !== - InstrumentScientistDecisionEnum.UNSET; - - const hasExperimentSafetyReviewerDecision = - state.experimentSafety.experimentSafetyReviewerDecision !== null && - state.experimentSafety.experimentSafetyReviewerDecision !== undefined && - state.experimentSafety.experimentSafetyReviewerDecision !== - ExperimentSafetyReviewerDecisionEnum.UNSET; - - const hasDecision = - hasInstrumentScientistDecision || hasExperimentSafetyReviewerDecision; - - const isDisabled = isSubmitted || hasDecision; - - // Create appropriate button label - let buttonLabel = 'Submit'; - if (isSubmitted) { - buttonLabel = '✔ Submitted'; - } else if (hasDecision) { - buttonLabel = '✔ Decision Made'; - } - - return ( - <> - - - - confirm( - async () => { - const { submitExperimentSafety } = - await api().submitExperimentSafety({ - experimentSafetyPk: - state.experimentSafety.experimentSafetyPk, - isSubmitted: true, - }); - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: submitExperimentSafety, - }); - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_SUBMITTED', - itemWithQuestionary: submitExperimentSafety, - }); - }, - { - title: 'Confirmation', - description: - 'I am aware that no further edits can be done after esi submission.', - } - )() - } - disabled={isDisabled} - data-cy="submit-proposal-esi-button" - > - {buttonLabel} - - - - ); -} - -export default withConfirm(ExperimentSafetyReview); +import React, { useContext } from 'react'; + +import { NavigButton } from 'components/common/NavigButton'; +import NavigationFragment from 'components/questionary/NavigationFragment'; +import { + createMissingContextErrorMessage, + QuestionaryContext, +} from 'components/questionary/QuestionaryContext'; +import { + ExperimentSafetyReviewerDecisionEnum, + InstrumentScientistDecisionEnum, +} from 'generated/sdk'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; +import { FunctionType } from 'utils/utilTypes'; +import withConfirm, { WithConfirmType } from 'utils/withConfirm'; + +import { ExperimentSafetyContextType } from './ExperimentSafetyContainer'; +import ExperimentSafetyDetails from './ExperimentSafetyDetails'; + +type ExperimentSafetyReviewProps = { + onComplete?: FunctionType; + confirm: WithConfirmType; +}; + +function ExperimentSafetyReview({ confirm }: ExperimentSafetyReviewProps) { + const { api, isExecutingCall } = useDataApiWithFeedback(); + + const { state, dispatch } = useContext( + QuestionaryContext + ) as ExperimentSafetyContextType; + if (!state || !dispatch) { + throw new Error(createMissingContextErrorMessage()); + } + + const isSubmitted = state.experimentSafety.esiQuestionarySubmittedAt !== null; + + // Check if any decision has been made (not null, not undefined, not UNSET) + const hasInstrumentScientistDecision = + state.experimentSafety.instrumentScientistDecision !== null && + state.experimentSafety.instrumentScientistDecision !== undefined && + state.experimentSafety.instrumentScientistDecision !== + InstrumentScientistDecisionEnum.UNSET; + + const hasExperimentSafetyReviewerDecision = + state.experimentSafety.experimentSafetyReviewerDecision !== null && + state.experimentSafety.experimentSafetyReviewerDecision !== undefined && + state.experimentSafety.experimentSafetyReviewerDecision !== + ExperimentSafetyReviewerDecisionEnum.UNSET; + + const hasDecision = + hasInstrumentScientistDecision || hasExperimentSafetyReviewerDecision; + + const isDisabled = isSubmitted || hasDecision; + + // Create appropriate button label + let buttonLabel = 'Submit'; + if (isSubmitted) { + buttonLabel = '✔ Submitted'; + } else if (hasDecision) { + buttonLabel = '✔ Decision Made'; + } + + return ( + <> + + + + confirm( + async () => { + const { submitExperimentSafety } = + await api().submitExperimentSafety({ + experimentSafetyPk: + state.experimentSafety.experimentSafetyPk, + isSubmitted: true, + }); + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: submitExperimentSafety, + }); + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_SUBMITTED', + itemWithQuestionary: submitExperimentSafety, + }); + }, + { + title: 'Confirmation', + description: + 'I am aware that no further edits can be done after esi submission.', + } + )() + } + disabled={isDisabled} + data-cy="submit-proposal-esi-button" + > + {buttonLabel} + + + + ); +} + +export default withConfirm(ExperimentSafetyReview); diff --git a/apps/frontend/src/components/experimentSafetyReview/ExperimentSafetyReviewPage.tsx b/apps/frontend/src/components/experimentSafetyReview/ExperimentSafetyReviewPage.tsx index 98998c931d..74d4bee3cd 100644 --- a/apps/frontend/src/components/experimentSafetyReview/ExperimentSafetyReviewPage.tsx +++ b/apps/frontend/src/components/experimentSafetyReview/ExperimentSafetyReviewPage.tsx @@ -1,294 +1,298 @@ -import GetAppIcon from '@mui/icons-material/GetApp'; -import VisibilityIcon from '@mui/icons-material/Visibility'; -import { DialogContent } from '@mui/material'; -import Avatar from '@mui/material/Avatar'; -import Button from '@mui/material/Button'; -import Grid from '@mui/material/Grid'; -import IconButton from '@mui/material/IconButton'; -import ListItemIcon from '@mui/material/ListItemIcon'; -import MenuItem from '@mui/material/MenuItem'; -import Tooltip from '@mui/material/Tooltip'; -import Typography from '@mui/material/Typography'; -import { Field, Form, Formik } from 'formik'; -import React, { useEffect, useState } from 'react'; -import { useSearchParams } from 'react-router-dom'; - -import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; -import TextField from 'components/common/FormikUITextField'; -import CallFilter from 'components/common/proposalFilters/CallFilter'; -import StyledDialog from 'components/common/StyledDialog'; -import { Maybe, SampleStatus } from 'generated/sdk'; -import { useCallsData } from 'hooks/call/useCallsData'; -import { useDownloadPDFSample } from 'hooks/sample/useDownloadPDFSample'; -import { SampleWithProposalData } from 'models/questionary/sample/SampleWithProposalData'; -import { StyledContainer, StyledPaper } from 'styles/StyledComponents'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; - -import SampleDetails from './SampleDetails'; -import SamplesTable from './SamplesTable'; - -function ExperimentSafetyReviewDialog(props: { - sample: SampleWithProposalData; - onClose: (sample: Maybe) => void; -}) { - const { sample, onClose } = props; - const { api } = useDataApiWithFeedback(); - - const initialValues: SampleWithProposalData = { - ...sample, - }; - - return ( - onClose(null)} - fullWidth={true} - maxWidth="lg" - title="Experiment Safety Review" - > - - - => { - if (!values) { - return; - } - - const { id, safetyComment, safetyStatus } = values; - const { submitSampleReview: updatedSample } = await api({ - toastSuccessMessage: `Review for '${sample?.title}' submitted`, - }).submitSampleReview({ - sampleId: id, - safetyComment, - safetyStatus, - }); - onClose({ ...values, ...updatedSample }); - }} - > - {({ isSubmitting, dirty }) => ( - - - - -   - - Not evaluated - - - - - -   - - - Low risk - - - - - -   - - - Elevated risk - - - - - -   - - - High risk - - - - - - - - - - )} - - - - ); -} - -const columns = [ - { - title: 'Actions', - sorting: false, - removable: false, - field: 'rowActions', - }, - { - title: 'Proposal ID', - field: 'proposal.proposalId', - }, - { title: 'Title', field: 'title' }, - { title: 'Status', field: 'safetyStatus' }, - { title: 'Created', field: 'created' }, -]; - -function ExperimentSafetyReviewPage() { - const { api, isExecutingCall } = useDataApiWithFeedback(); - const { calls, loadingCalls } = useCallsData({ isActive: true }); - const [searchParam] = useSearchParams(); - const call = searchParam.get('call'); - - const [selectedCallId, setSelectedCallId] = useState( - call ? +call : 0 - ); - const [samples, setSamples] = useState([]); - const [selectedSample, setSelectedSample] = - useState(null); - - useEffect(() => { - if (selectedCallId === null) { - return; - } - - if (selectedCallId === 0) { - api() - .getSamplesWithProposalData() - .then((result) => { - setSamples(result.samples || []); - }); - } else { - api() - .getSamplesByCallId({ callId: selectedCallId }) - .then((result) => { - setSamples(result.samplesByCallId || []); - }); - } - }, [api, selectedCallId]); - - const downloadPDFSample = useDownloadPDFSample(); - const RowActionButtons = (rowData: SampleWithProposalData) => ( - <> - - setSelectedSample(rowData)}> - - - - - downloadPDFSample([rowData.id], rowData.title)} - > - - - - - ); - - const samplesWithRowActions = samples.map((sample) => ({ - ...sample, - rowActions: RowActionButtons(sample), - })); - - return ( - <> - {selectedSample && ( - { - if (newSample) { - const newSamples = samples.map((sample) => - sample.id === newSample.id ? newSample : sample - ); - - setSamples(newSamples); - } - setSelectedSample(null); - }} - /> - )} - - - - - { - setSelectedCallId(callId); - }} - shouldShowAll={true} - /> - - - - downloadPDFSample( - (rowData as SampleWithProposalData[]).map(({ id }) => id), - (rowData as SampleWithProposalData[])[0].title - ), - }, - ]} - /> - - - - ); -} - -export default ExperimentSafetyReviewPage; +import GetAppIcon from '@mui/icons-material/GetApp'; +import VisibilityIcon from '@mui/icons-material/Visibility'; +import { DialogContent } from '@mui/material'; +import Avatar from '@mui/material/Avatar'; +import Button from '@mui/material/Button'; +import Grid from '@mui/material/Grid'; +import IconButton from '@mui/material/IconButton'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import MenuItem from '@mui/material/MenuItem'; +import Tooltip from '@mui/material/Tooltip'; +import Typography from '@mui/material/Typography'; +import { Field, Form, Formik } from 'formik'; +import React, { useEffect, useState } from 'react'; +import { useSearchParams } from 'react-router-dom'; + +import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; +import TextField from 'components/common/FormikUITextField'; +import CallFilter from 'components/common/proposalFilters/CallFilter'; +import StyledDialog from 'components/common/StyledDialog'; +import { Maybe, SampleStatus } from 'generated/sdk'; +import { useCallsData } from 'hooks/call/useCallsData'; +import { useDownloadPDFSample } from 'hooks/sample/useDownloadPDFSample'; +import { SampleWithProposalData } from 'models/questionary/sample/SampleWithProposalData'; +import { StyledContainer, StyledPaper } from 'styles/StyledComponents'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; + +import SampleDetails from './SampleDetails'; +import SamplesTable from './SamplesTable'; + +function ExperimentSafetyReviewDialog(props: { + sample: SampleWithProposalData; + onClose: (sample: Maybe) => void; +}) { + const { sample, onClose } = props; + const { api } = useDataApiWithFeedback(); + + const initialValues: SampleWithProposalData = { + ...sample, + }; + + return ( + onClose(null)} + fullWidth={true} + maxWidth="lg" + title="Experiment Safety Review" + > + + + => { + if (!values) { + return; + } + + const { id, safetyComment, safetyStatus } = values; + const { submitSampleReview: updatedSample } = await api({ + toastSuccessMessage: `Review for '${sample?.title}' submitted`, + }).submitSampleReview({ + sampleId: id, + safetyComment, + safetyStatus, + }); + onClose({ ...values, ...updatedSample }); + }} + > + {({ isSubmitting, dirty }) => ( +
+ + + +   + + Not evaluated + + + + + +   + + + Low risk + + + + + +   + + + Elevated risk + + + + + +   + + + High risk + + + + + + + + + + )} +
+
+
+ ); +} + +const columns = [ + { + title: 'Actions', + sorting: false, + removable: false, + field: 'rowActions', + }, + { + title: 'Proposal ID', + field: 'proposal.proposalId', + }, + { title: 'Title', field: 'title' }, + { title: 'Status', field: 'safetyStatus' }, + { title: 'Created', field: 'created' }, +]; + +function ExperimentSafetyReviewPage() { + const { api, isExecutingCall } = useDataApiWithFeedback(); + const { calls, loadingCalls } = useCallsData({ isActive: true }); + const [searchParam] = useSearchParams(); + const call = searchParam.get('call'); + + const [selectedCallId, setSelectedCallId] = useState( + call ? +call : 0 + ); + const [samples, setSamples] = useState([]); + const [selectedSample, setSelectedSample] = + useState(null); + + useEffect(() => { + if (selectedCallId === null) { + return; + } + + if (selectedCallId === 0) { + api() + .getSamplesWithProposalData() + .then((result) => { + setSamples(result.samples || []); + }); + } else { + api() + .getSamplesByCallId({ callId: selectedCallId }) + .then((result) => { + setSamples(result.samplesByCallId || []); + }); + } + }, [api, selectedCallId]); + + const downloadPDFSample = useDownloadPDFSample(); + const RowActionButtons = (rowData: SampleWithProposalData) => ( + <> + + setSelectedSample(rowData)}> + + + + + downloadPDFSample([rowData.id], rowData.title)} + > + + + + + ); + + const samplesWithRowActions = samples.map((sample) => ({ + ...sample, + rowActions: RowActionButtons(sample), + })); + + return ( + <> + {selectedSample && ( + { + if (newSample) { + const newSamples = samples.map((sample) => + sample.id === newSample.id ? newSample : sample + ); + + setSamples(newSamples); + } + setSelectedSample(null); + }} + /> + )} + + + + + { + setSelectedCallId(callId); + }} + shouldShowAll={true} + /> + + + + downloadPDFSample( + (rowData as SampleWithProposalData[]).map(({ id }) => id), + (rowData as SampleWithProposalData[])[0].title + ), + }, + ]} + /> + + + + ); +} + +export default ExperimentSafetyReviewPage; diff --git a/apps/frontend/src/components/experimentSample/SampleEsiReview.tsx b/apps/frontend/src/components/experimentSample/SampleEsiReview.tsx index 2d73a3ea8b..ddf638c0d4 100644 --- a/apps/frontend/src/components/experimentSample/SampleEsiReview.tsx +++ b/apps/frontend/src/components/experimentSample/SampleEsiReview.tsx @@ -1,82 +1,82 @@ -import { FormControlLabel } from '@mui/material'; -import Checkbox from '@mui/material/Checkbox'; -import React, { ChangeEvent, useContext, useState } from 'react'; - -import { NavigButton } from 'components/common/NavigButton'; -import NavigationFragment from 'components/questionary/NavigationFragment'; -import { - createMissingContextErrorMessage, - QuestionaryContext, -} from 'components/questionary/QuestionaryContext'; -import QuestionaryDetails from 'components/questionary/QuestionaryDetails'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; - -import { ExperimentSampleContextType } from './ExperimentSampleContainer'; - -function SampleEsiReview() { - const { api, isExecutingCall } = useDataApiWithFeedback(); - const [isAffirmChecked, setIsAffirmChecked] = useState(false); - - const { state, dispatch } = useContext( - QuestionaryContext - ) as ExperimentSampleContextType; - if (!state || !dispatch) { - throw new Error(createMissingContextErrorMessage()); - } - - const isSubmitted = state.experimentSample.isEsiSubmitted; - - return ( - <> - - - - ) => { - setIsAffirmChecked(evt.target.checked); - }} - value={isAffirmChecked} - checked={isAffirmChecked} - data-cy="confirm-sample-correct-cb" - /> - } - label={ - - * I hereby confirm that all of the entered information regarding - the sample is correct - - } - /> - { - const { updateExperimentSample } = - await api().updateExperimentSample({ - experimentPk: state.experimentSample.experimentPk, - sampleId: state.experimentSample.sample.id, - isSubmitted: true, - }); - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: updateExperimentSample, - }); - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_SUBMITTED', - itemWithQuestionary: updateExperimentSample, - }); - }} - disabled={isSubmitted || !isAffirmChecked} - data-cy="submit-esi-button" - > - {isSubmitted ? '✔ Ready' : 'Submit'} - - - - ); -} - -export default SampleEsiReview; +import { FormControlLabel } from '@mui/material'; +import Checkbox from '@mui/material/Checkbox'; +import React, { ChangeEvent, useContext, useState } from 'react'; + +import { NavigButton } from 'components/common/NavigButton'; +import NavigationFragment from 'components/questionary/NavigationFragment'; +import { + createMissingContextErrorMessage, + QuestionaryContext, +} from 'components/questionary/QuestionaryContext'; +import QuestionaryDetails from 'components/questionary/QuestionaryDetails'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; + +import { ExperimentSampleContextType } from './ExperimentSampleContainer'; + +function SampleEsiReview() { + const { api, isExecutingCall } = useDataApiWithFeedback(); + const [isAffirmChecked, setIsAffirmChecked] = useState(false); + + const { state, dispatch } = useContext( + QuestionaryContext + ) as ExperimentSampleContextType; + if (!state || !dispatch) { + throw new Error(createMissingContextErrorMessage()); + } + + const isSubmitted = state.experimentSample.isEsiSubmitted; + + return ( + <> + + + + ) => { + setIsAffirmChecked(evt.target.checked); + }} + value={isAffirmChecked} + checked={isAffirmChecked} + data-cy="confirm-sample-correct-cb" + /> + } + label={ + + * I hereby confirm that all of the entered information regarding + the sample is correct + + } + /> + { + const { updateExperimentSample } = + await api().updateExperimentSample({ + experimentPk: state.experimentSample.experimentPk, + sampleId: state.experimentSample.sample.id, + isSubmitted: true, + }); + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: updateExperimentSample, + }); + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_SUBMITTED', + itemWithQuestionary: updateExperimentSample, + }); + }} + disabled={isSubmitted || !isAffirmChecked} + data-cy="submit-esi-button" + > + {isSubmitted ? '✔ Ready' : 'Submit'} + + + + ); +} + +export default SampleEsiReview; diff --git a/apps/frontend/src/components/fap/FapGradeGuide.tsx b/apps/frontend/src/components/fap/FapGradeGuide.tsx index 9c524065a5..d6c2b9fc64 100644 --- a/apps/frontend/src/components/fap/FapGradeGuide.tsx +++ b/apps/frontend/src/components/fap/FapGradeGuide.tsx @@ -17,7 +17,11 @@ const FapGradeGuide: React.FC = ({ fap, onFapUpdate }) => { const hasAccessRights = useCheckAccess([UserRole.USER_OFFICER]); return ( - + { return (
- + { {`${fap.code} ${t('Facility access panel')}`} - + { disabled={!hasAccessRights || isExecutingCall} /> - + { } disabled={!hasAccessRights || isExecutingCall} /> - + - + ) => onChange(e.target.value)} - InputProps={{ - inputProps: { - max: MAX_32_BIT_INTEGER - 1, - min: 0, - }, - }} required sx={{ width }} margin="none" placeholder="Enter in Days" + slotProps={{ + input: { + inputProps: { + max: MAX_32_BIT_INTEGER - 1, + min: 0, + }, + }, + }} /> ); @@ -78,9 +80,9 @@ const FapUpdateInstrumentTime = (props: FapUpdateInstrumentTimeProps) => { >
handleClose()} - TransitionComponent={Transition} data-cy="Fap-meeting-modal" + slots={{ + transition: Transition + }} > - +
{loading || !fapProposalData || !proposalData ? ( diff --git a/apps/frontend/src/components/fap/MeetingComponents/ProposalViewModal/FinalRankingForm.tsx b/apps/frontend/src/components/fap/MeetingComponents/ProposalViewModal/FinalRankingForm.tsx index ce295e6b36..5f087f966f 100644 --- a/apps/frontend/src/components/fap/MeetingComponents/ProposalViewModal/FinalRankingForm.tsx +++ b/apps/frontend/src/components/fap/MeetingComponents/ProposalViewModal/FinalRankingForm.tsx @@ -151,7 +151,11 @@ const FinalRankingForm = ({ {`${t('Fap')} Meeting form`} - + Comment for user @@ -210,7 +214,11 @@ const FinalRankingForm = ({ /> - + {isSubmitting && ( ({ + sx={[{ + display: "flex", + alignItems: "center" + }, (theme) => ({ margin: theme.spacing(0, 0, 0, 1), - })} - > + })]}> )} diff --git a/apps/frontend/src/components/fap/Members/FapMembers.tsx b/apps/frontend/src/components/fap/Members/FapMembers.tsx index 2a05e78707..326df285f4 100644 --- a/apps/frontend/src/components/fap/Members/FapMembers.tsx +++ b/apps/frontend/src/components/fap/Members/FapMembers.tsx @@ -279,39 +279,41 @@ const FapMembers = ({ fullWidth data-cy={`${t('Fap')}${chairOrSec}`} required - InputProps={{ - readOnly: true, - endAdornment: isUserOfficer && ( - <> - - - removeChairOrSecretary( - user, + slotProps={{ + input: { + readOnly: true, + endAdornment: isUserOfficer && ( + <> + + + removeChairOrSecretary( + user, + isChair + ? UserRole.FAP_CHAIR + : UserRole.FAP_SECRETARY + ) + } + > + + + + + isChair - ? UserRole.FAP_CHAIR - : UserRole.FAP_SECRETARY - ) - } - > - - - - - - isChair - ? setFapChairModalOpen(true) - : setFapSecretaryModalOpen(true) - } - > - - - - - ), + ? setFapChairModalOpen(true) + : setFapSecretaryModalOpen(true) + } + > + + + + + ), + } }} /> @@ -362,22 +364,33 @@ const FapMembers = ({ {`${fapData.code} - ${t('Fap')} Members`} - - + + {fapChairSecTable(fapData.fapChairs, true)} - + {fapChairSecTable(fapData.fapSecretaries, false)} {isUserOfficer && ( + sx={{ + display: "flex", + justifyContent: "space-between", + marginTop: '10px', + marginBottom: '10px' + }}> - - - - - - ); -} - -export default withConfirm(MergeInstitutionsPage); +import MergeType from '@mui/icons-material/MergeType'; +import Button from '@mui/material/Button'; +import Grid from '@mui/material/Grid'; +import TextField from '@mui/material/TextField'; +import React, { useEffect } from 'react'; +import { useParams } from 'react-router-dom'; + +import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; +import UOLoader from 'components/common/UOLoader'; +import { Institution } from 'generated/sdk'; +import { useInstitutionsData } from 'hooks/admin/useInstitutionData'; +import { StyledContainer, StyledPaper } from 'styles/StyledComponents'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; +import withConfirm, { WithConfirmType } from 'utils/withConfirm'; + +import InstitutionSelect from './InstitutionSelect'; + +type MergeInstitutionPageProps = { + confirm: WithConfirmType; +}; + +function MergeInstitutionsPage({ confirm }: MergeInstitutionPageProps) { + const { institutionId } = useParams<{ + institutionId: string; + }>(); + + const { institutions, loadingInstitutions, setInstitutions } = + useInstitutionsData(); + + const [institutionFrom, setInstitutionFrom] = + React.useState(null); + const [institutionInto, setInstitutionInto] = + React.useState(null); + const [mergedInstitutionName, setMergedInstitutionName] = React.useState(''); + + const { api } = useDataApiWithFeedback(); + + useEffect(() => { + if (institutionFrom === null && institutionId) { + setInstitutionFrom( + institutions.find((i) => i.id === +institutionId) || null + ); + } + }, [institutions, institutionId, institutionFrom]); + + if (loadingInstitutions) { + return ; + } + + return ( + + + + +

Merge Institutions

+ Merge two institutions into one. All the relevant data from both + institutions will be merged. +
+ + { + setInstitutionFrom(institution); + if (institution?.id === institutionInto?.id) { + setInstitutionInto(null); + } + }} + value={institutionFrom} + /> + institution.id !== institutionFrom?.id + )} + onInstitutionSelected={(institution) => { + setInstitutionInto(institution); + if (institution) { + setMergedInstitutionName(institution.name); + } + }} + value={institutionInto} + /> + + + + + + setMergedInstitutionName(e.target.value)} + /> + + + + + + +
+
+
+ ); +} + +export default withConfirm(MergeInstitutionsPage); diff --git a/apps/frontend/src/components/instrument/AssignProposalsToInstruments.tsx b/apps/frontend/src/components/instrument/AssignProposalsToInstruments.tsx index 48163b38ff..302150d41b 100644 --- a/apps/frontend/src/components/instrument/AssignProposalsToInstruments.tsx +++ b/apps/frontend/src/components/instrument/AssignProposalsToInstruments.tsx @@ -67,7 +67,7 @@ const AssignProposalsToInstruments = ({ - + + void; - internalReview: InternalReview | null; - technicalReviewId?: number | null; - technicalReviewSubmitted?: boolean; -}; - -const CreateUpdateInternalReview = ({ - close, - internalReview, - technicalReviewId, - technicalReviewSubmitted, -}: CreateUpdateInternalReviewProps) => { - const theme = useTheme(); - const { api, isExecutingCall } = useDataApiWithFeedback(); - const isInternalReviewer = useCheckAccess([UserRole.INTERNAL_REVIEWER]); - const { user } = useContext(UserContext); - const [usersData, setUsersData] = useState( - internalReview?.reviewerId ? [internalReview?.reviewer] : [] - ); - const featureContext = useContext(FeatureContext); - const isUserSurnameSearchEnabled = featureContext.featuresMap.get( - FeatureId.USER_SEARCH_FILTER - )?.isEnabled; - - const initialValues = internalReview - ? { - title: internalReview.title, - comment: internalReview.comment || '', - files: internalReview.files, - reviewerId: internalReview.reviewerId, - surname: '', - } - : { - title: '', - comment: '', - files: '', - reviewerId: null, - surname: '', - }; - - const formDisabled = - (isInternalReviewer && user.id !== internalReview?.reviewerId) || - (isInternalReviewer && technicalReviewSubmitted); - - useEffect(() => { - if (!isUserSurnameSearchEnabled) { - api() - .getUsers({ userRole: UserRole.INTERNAL_REVIEWER }) - .then((data) => { - setUsersData(data.users?.users || []); - }); - } - }, [isUserSurnameSearchEnabled, api]); - - const findUserBySurname = async ( - value: string, - setFieldError: (field: string, message: string | undefined) => void - ) => { - if (!value) { - return; - } - - try { - await api() - .getUsers({ searchText: value, userRole: UserRole.INTERNAL_REVIEWER }) - .then((data) => { - if (data.users?.totalCount == 0) { - setFieldError( - 'surname', - 'No Internal Reviewers found with that surname' - ); - } else { - setUsersData(data.users?.users || []); - } - }); - } catch { - close(null); - } - }; - - type formikProps = FormikProps & - FormikHelpers; - - const SurnameSearchField = (props: formikProps) => { - const { values, setFieldError } = props; - - return isUserSurnameSearchEnabled ? ( - - - - - ) : null; - }; - - return ( - => { - if (values.reviewerId === null || !technicalReviewId) { - return; - } - - if (internalReview) { - try { - const { updateInternalReview } = await api({ - toastSuccessMessage: 'Internal review updated successfully!', - }).updateInternalReview({ - input: { - comment: values.comment, - reviewerId: values.reviewerId, - title: values.title, - id: internalReview.id, - technicalReviewId: technicalReviewId, - files: JSON.stringify(values.files), - }, - }); - - close(updateInternalReview as InternalReview); - } catch { - close(null); - } - } else { - try { - const { createInternalReview } = await api({ - toastSuccessMessage: 'Internal review created successfully!', - }).createInternalReview({ - input: { - comment: values.comment, - reviewerId: values.reviewerId, - title: values.title, - technicalReviewId: technicalReviewId, - files: JSON.stringify(values.files), - }, - }); - - close(createInternalReview as InternalReview); - } catch { - close(null); - } - } - }} - > - {(formikProps) => ( - - - {internalReview - ? isInternalReviewer - ? `Internal review` - : 'Update' - : 'Create new internal review'} - - - {!isInternalReviewer ? ( - - ) : ( - <> - - Title - - - - {internalReview?.title} - - - )} - {!isInternalReviewer ? : null} - {!isInternalReviewer ? ( - ({ - text: getFullUserName(user), - value: user ? user.id : '', - }))} - data-cy="internal-reviewer" - required - disabled={isExecutingCall || formikProps.isSubmitting} - /> - ) : ( - user.id !== internalReview?.reviewerId && ( - <> - - Reviewer - - - - {getFullUserName(internalReview?.reviewer)} - - - ) - )} - - - Internal review comment - - { - const isStartContentDifferentThanCurrent = - editor.startContent !== editor.contentDocument.body.innerHTML; - - if (isStartContentDifferentThanCurrent || editor.isDirty()) { - formikProps.setFieldValue('comment', content); - } - }} - disabled={ - formikProps.isSubmitting || isExecutingCall || formDisabled - } - /> - - {(!isInternalReviewer || user.id === internalReview?.reviewerId) && ( - - )} - - )} - - ); -}; - -export default CreateUpdateInternalReview; +import Button from '@mui/material/Button'; +import InputLabel from '@mui/material/InputLabel'; +import Stack from '@mui/material/Stack'; +import { useTheme } from '@mui/material/styles'; +import Typography from '@mui/material/Typography'; +import { Field, Form, Formik, FormikHelpers, FormikProps } from 'formik'; +import React, { useContext, useEffect, useState } from 'react'; + +import FormikUIAutocomplete from 'components/common/FormikUIAutocomplete'; +import TextField from 'components/common/FormikUITextField'; +import Editor from 'components/common/TinyEditor'; +import UOLoader from 'components/common/UOLoader'; +import { FeatureContext } from 'context/FeatureContextProvider'; +import { UserContext } from 'context/UserContextProvider'; +import { FeatureId, InternalReview, UserRole } from 'generated/sdk'; +import { useCheckAccess } from 'hooks/common/useCheckAccess'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; +import { getFullUserName } from 'utils/user'; + +type CreateUpdateInternalReviewProps = { + close: (internalReviewAdded: InternalReview | null) => void; + internalReview: InternalReview | null; + technicalReviewId?: number | null; + technicalReviewSubmitted?: boolean; +}; + +const CreateUpdateInternalReview = ({ + close, + internalReview, + technicalReviewId, + technicalReviewSubmitted, +}: CreateUpdateInternalReviewProps) => { + const theme = useTheme(); + const { api, isExecutingCall } = useDataApiWithFeedback(); + const isInternalReviewer = useCheckAccess([UserRole.INTERNAL_REVIEWER]); + const { user } = useContext(UserContext); + const [usersData, setUsersData] = useState( + internalReview?.reviewerId ? [internalReview?.reviewer] : [] + ); + const featureContext = useContext(FeatureContext); + const isUserSurnameSearchEnabled = featureContext.featuresMap.get( + FeatureId.USER_SEARCH_FILTER + )?.isEnabled; + + const initialValues = internalReview + ? { + title: internalReview.title, + comment: internalReview.comment || '', + files: internalReview.files, + reviewerId: internalReview.reviewerId, + surname: '', + } + : { + title: '', + comment: '', + files: '', + reviewerId: null, + surname: '', + }; + + const formDisabled = + (isInternalReviewer && user.id !== internalReview?.reviewerId) || + (isInternalReviewer && technicalReviewSubmitted); + + useEffect(() => { + if (!isUserSurnameSearchEnabled) { + api() + .getUsers({ userRole: UserRole.INTERNAL_REVIEWER }) + .then((data) => { + setUsersData(data.users?.users || []); + }); + } + }, [isUserSurnameSearchEnabled, api]); + + const findUserBySurname = async ( + value: string, + setFieldError: (field: string, message: string | undefined) => void + ) => { + if (!value) { + return; + } + + try { + await api() + .getUsers({ searchText: value, userRole: UserRole.INTERNAL_REVIEWER }) + .then((data) => { + if (data.users?.totalCount == 0) { + setFieldError( + 'surname', + 'No Internal Reviewers found with that surname' + ); + } else { + setUsersData(data.users?.users || []); + } + }); + } catch { + close(null); + } + }; + + type formikProps = FormikProps & + FormikHelpers; + + const SurnameSearchField = (props: formikProps) => { + const { values, setFieldError } = props; + + return isUserSurnameSearchEnabled ? ( + + + + + ) : null; + }; + + return ( + => { + if (values.reviewerId === null || !technicalReviewId) { + return; + } + + if (internalReview) { + try { + const { updateInternalReview } = await api({ + toastSuccessMessage: 'Internal review updated successfully!', + }).updateInternalReview({ + input: { + comment: values.comment, + reviewerId: values.reviewerId, + title: values.title, + id: internalReview.id, + technicalReviewId: technicalReviewId, + files: JSON.stringify(values.files), + }, + }); + + close(updateInternalReview as InternalReview); + } catch { + close(null); + } + } else { + try { + const { createInternalReview } = await api({ + toastSuccessMessage: 'Internal review created successfully!', + }).createInternalReview({ + input: { + comment: values.comment, + reviewerId: values.reviewerId, + title: values.title, + technicalReviewId: technicalReviewId, + files: JSON.stringify(values.files), + }, + }); + + close(createInternalReview as InternalReview); + } catch { + close(null); + } + } + }} + > + {(formikProps) => ( +
+ + {internalReview + ? isInternalReviewer + ? `Internal review` + : 'Update' + : 'Create new internal review'} + + + {!isInternalReviewer ? ( + + ) : ( + <> + + Title + + + + {internalReview?.title} + + + )} + {!isInternalReviewer ? : null} + {!isInternalReviewer ? ( + ({ + text: getFullUserName(user), + value: user ? user.id : '', + }))} + data-cy="internal-reviewer" + required + disabled={isExecutingCall || formikProps.isSubmitting} + /> + ) : ( + user.id !== internalReview?.reviewerId && ( + <> + + Reviewer + + + + {getFullUserName(internalReview?.reviewer)} + + + ) + )} + + + Internal review comment + + { + const isStartContentDifferentThanCurrent = + editor.startContent !== editor.contentDocument.body.innerHTML; + + if (isStartContentDifferentThanCurrent || editor.isDirty()) { + formikProps.setFieldValue('comment', content); + } + }} + disabled={ + formikProps.isSubmitting || isExecutingCall || formDisabled + } + /> + + {(!isInternalReviewer || user.id === internalReview?.reviewerId) && ( + + )} + + )} +
+ ); +}; + +export default CreateUpdateInternalReview; diff --git a/apps/frontend/src/components/internalReview/InternalReviewsTable.tsx b/apps/frontend/src/components/internalReview/InternalReviewsTable.tsx index fa1ab68a8d..d4a4af4ed3 100644 --- a/apps/frontend/src/components/internalReview/InternalReviewsTable.tsx +++ b/apps/frontend/src/components/internalReview/InternalReviewsTable.tsx @@ -1,119 +1,119 @@ -import Typography from '@mui/material/Typography'; -import React from 'react'; - -import SuperMaterialTable from 'components/common/SuperMaterialTable'; -import { InternalReview, UserRole } from 'generated/sdk'; -import { useFormattedDateTime } from 'hooks/admin/useFormattedDateTime'; -import { useCheckAccess } from 'hooks/common/useCheckAccess'; -import { useInternalReviewsData } from 'hooks/review/useInternalReviewData'; -import { tableIcons } from 'utils/materialIcons'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; -import { getFullUserName } from 'utils/user'; -import { FunctionType } from 'utils/utilTypes'; - -import CreateUpdateInternalReview from './CreateUpdateInternalReview'; - -const columns = [ - { title: 'Title', field: 'title' }, - { - title: 'Reviewer', - render: (rowData: InternalReview) => getFullUserName(rowData.reviewer), - }, - { title: 'Created at', field: 'formattedCreatedAt' }, - { - title: 'Assigned by', - render: (rowData: InternalReview) => - getFullUserName(rowData.assignedByUser), - }, -]; - -type InternalReviewsTableProps = { - technicalReviewId: number; - technicalReviewSubmitted: boolean; -}; - -const InternalReviewsTable = ({ - technicalReviewId, - technicalReviewSubmitted, -}: InternalReviewsTableProps) => { - const { api } = useDataApiWithFeedback(); - const { - loading, - internalReviews, - setInternalReviewsWithLoading: setInternalReviews, - } = useInternalReviewsData({ technicalReviewId }); - const { toFormattedDateTime } = useFormattedDateTime({ - shouldUseTimeZone: true, - }); - const isInternalReviewer = useCheckAccess([UserRole.INTERNAL_REVIEWER]); - - const createModal = ( - onUpdate: FunctionType, - onCreate: (internalReview: InternalReview | null) => void, - editInternalReview: InternalReview | null - ) => ( - - !!editInternalReview - ? onUpdate(internalReview) - : onCreate(internalReview) - } - technicalReviewId={technicalReviewId} - technicalReviewSubmitted={technicalReviewSubmitted} - /> - ); - - const deleteInternalReview = async (id: string | number) => { - try { - await api({ - toastSuccessMessage: 'Internal review deleted successfully', - }).deleteInternalReview({ - input: { - id: id as number, - technicalReviewId: technicalReviewId, - }, - }); - - return true; - } catch { - return false; - } - }; - - const reviewsWithFormattedData = internalReviews.map((review) => ({ - ...review, - formattedCreatedAt: toFormattedDateTime(review.createdAt), - })); - - return ( -
- - Internal reviews - - } - delete={deleteInternalReview} - createModal={createModal} - createModalSize="sm" - setData={setInternalReviews} - icons={tableIcons} - columns={columns} - data={reviewsWithFormattedData} - isLoading={loading} - options={{ - search: false, - padding: 'dense', - }} - /> -
- ); -}; - -export default InternalReviewsTable; +import Typography from '@mui/material/Typography'; +import React from 'react'; + +import SuperMaterialTable from 'components/common/SuperMaterialTable'; +import { InternalReview, UserRole } from 'generated/sdk'; +import { useFormattedDateTime } from 'hooks/admin/useFormattedDateTime'; +import { useCheckAccess } from 'hooks/common/useCheckAccess'; +import { useInternalReviewsData } from 'hooks/review/useInternalReviewData'; +import { tableIcons } from 'utils/materialIcons'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; +import { getFullUserName } from 'utils/user'; +import { FunctionType } from 'utils/utilTypes'; + +import CreateUpdateInternalReview from './CreateUpdateInternalReview'; + +const columns = [ + { title: 'Title', field: 'title' }, + { + title: 'Reviewer', + render: (rowData: InternalReview) => getFullUserName(rowData.reviewer), + }, + { title: 'Created at', field: 'formattedCreatedAt' }, + { + title: 'Assigned by', + render: (rowData: InternalReview) => + getFullUserName(rowData.assignedByUser), + }, +]; + +type InternalReviewsTableProps = { + technicalReviewId: number; + technicalReviewSubmitted: boolean; +}; + +const InternalReviewsTable = ({ + technicalReviewId, + technicalReviewSubmitted, +}: InternalReviewsTableProps) => { + const { api } = useDataApiWithFeedback(); + const { + loading, + internalReviews, + setInternalReviewsWithLoading: setInternalReviews, + } = useInternalReviewsData({ technicalReviewId }); + const { toFormattedDateTime } = useFormattedDateTime({ + shouldUseTimeZone: true, + }); + const isInternalReviewer = useCheckAccess([UserRole.INTERNAL_REVIEWER]); + + const createModal = ( + onUpdate: FunctionType, + onCreate: (internalReview: InternalReview | null) => void, + editInternalReview: InternalReview | null + ) => ( + + !!editInternalReview + ? onUpdate(internalReview) + : onCreate(internalReview) + } + technicalReviewId={technicalReviewId} + technicalReviewSubmitted={technicalReviewSubmitted} + /> + ); + + const deleteInternalReview = async (id: string | number) => { + try { + await api({ + toastSuccessMessage: 'Internal review deleted successfully', + }).deleteInternalReview({ + input: { + id: id as number, + technicalReviewId: technicalReviewId, + }, + }); + + return true; + } catch { + return false; + } + }; + + const reviewsWithFormattedData = internalReviews.map((review) => ({ + ...review, + formattedCreatedAt: toFormattedDateTime(review.createdAt), + })); + + return ( +
+ + Internal reviews + + } + delete={deleteInternalReview} + createModal={createModal} + createModalSize="sm" + setData={setInternalReviews} + icons={tableIcons} + columns={columns} + data={reviewsWithFormattedData} + isLoading={loading} + options={{ + search: false, + padding: 'dense', + }} + /> +
+ ); +}; + +export default InternalReviewsTable; diff --git a/apps/frontend/src/components/pages/GradeGuidePage.tsx b/apps/frontend/src/components/pages/GradeGuidePage.tsx index e64de375bb..b34f46e224 100644 --- a/apps/frontend/src/components/pages/GradeGuidePage.tsx +++ b/apps/frontend/src/components/pages/GradeGuidePage.tsx @@ -18,7 +18,9 @@ const GradeGuidePage = ({ fap }: GradeGuidePageProps) => { const [loadingPage, pageContent] = useGetPageContent(PageName.GRADEGUIDEPAGE); const noContents = ( - + ({ width: '100px', @@ -33,7 +35,9 @@ const GradeGuidePage = ({ fap }: GradeGuidePageProps) => { if (loadingPage) { return ( - + ); diff --git a/apps/frontend/src/components/pages/OverviewPage.tsx b/apps/frontend/src/components/pages/OverviewPage.tsx index 49cac22b17..f73c3ec896 100644 --- a/apps/frontend/src/components/pages/OverviewPage.tsx +++ b/apps/frontend/src/components/pages/OverviewPage.tsx @@ -4,8 +4,7 @@ import React, { useContext } from 'react'; import ProposalTableInstrumentScientist from 'components/proposal/ProposalTableInstrumentScientist'; import ProposalTableOfficer from 'components/proposal/ProposalTableOfficer'; import ProposalTableReader from 'components/proposal/ProposalTableReader'; -import ProposalTableUser from 'components/proposal/ProposalTableUser'; -import UserUpcomingExperimentsTable from 'components/proposalBooking/UserUpcomingExperimentsTable'; +import BasicCard from 'components/proposalBooking/BasicCard'; import ProposalTableReviewer from 'components/review/ProposalTableReviewer'; import { FeatureContext } from 'context/FeatureContextProvider'; import { PageName, UserRole, FeatureId } from 'generated/sdk'; @@ -38,14 +37,7 @@ export default function OverviewPage(props: { userRole: UserRole }) { case UserRole.USER: roleBasedOverView = ( <> - {isSchedulerEnabled && ( - - - - )} - - - + ); break; diff --git a/apps/frontend/src/components/proposal/CallSelectModalOnProposalClone.tsx b/apps/frontend/src/components/proposal/CallSelectModalOnProposalClone.tsx index 9d528870f1..9c9367b52c 100644 --- a/apps/frontend/src/components/proposal/CallSelectModalOnProposalClone.tsx +++ b/apps/frontend/src/components/proposal/CallSelectModalOnProposalClone.tsx @@ -66,7 +66,7 @@ const CallSelectModalOnProposalsClone = ({ - + - + - +
- + - + 0 && ( - + )} - + {proposalStatuses.find( (status) => status.workflowStatusId === diff --git a/apps/frontend/src/components/proposal/NotifyProposal.tsx b/apps/frontend/src/components/proposal/NotifyProposal.tsx index 8a13dce24c..07ba0cf674 100644 --- a/apps/frontend/src/components/proposal/NotifyProposal.tsx +++ b/apps/frontend/src/components/proposal/NotifyProposal.tsx @@ -48,7 +48,7 @@ const NotifyProposal = ({ - + )} - + slotProps={{ + input: { + readOnly: true, + }, + + inputLabel: { shrink: true } + }} /> diff --git a/apps/frontend/src/components/proposal/ProposalAdmin.tsx b/apps/frontend/src/components/proposal/ProposalAdmin.tsx index 85a59a8624..84dc2e3b87 100644 --- a/apps/frontend/src/components/proposal/ProposalAdmin.tsx +++ b/apps/frontend/src/components/proposal/ProposalAdmin.tsx @@ -114,8 +114,14 @@ const ProposalAdmin = ({ data, setAdministration }: ProposalAdminProps) => { {({ isSubmitting, values }) => (
- - + + { disabled={!isUserOfficer || isSubmitting} /> - + @@ -167,7 +177,7 @@ const ProposalAdmin = ({ data, setAdministration }: ProposalAdminProps) => { } /> - + { message-key={PredefinedMessageKey.USER} /> - + { message-key={PredefinedMessageKey.MANAGER} /> - + { Administration - + ({ @@ -43,7 +47,11 @@ const ProposalAdminReadOnly = ({ data }: ProposalAdminReadOnlyProps) => { - + ({ @@ -63,7 +71,7 @@ const ProposalAdminReadOnly = ({ data }: ProposalAdminReadOnlyProps) => { - + ({ @@ -98,7 +106,7 @@ const ProposalAdminReadOnly = ({ data }: ProposalAdminReadOnlyProps) => { - + ({ @@ -119,7 +127,7 @@ const ProposalAdminReadOnly = ({ data }: ProposalAdminReadOnlyProps) => { - + ({ diff --git a/apps/frontend/src/components/proposal/ProposalAttachmentDownload.tsx b/apps/frontend/src/components/proposal/ProposalAttachmentDownload.tsx index a22092571c..6809a3e773 100644 --- a/apps/frontend/src/components/proposal/ProposalAttachmentDownload.tsx +++ b/apps/frontend/src/components/proposal/ProposalAttachmentDownload.tsx @@ -52,14 +52,14 @@ const ProposalAttachmentDownload = ({ > Download attachment on proposal/s - - + sx={{ + justifyContent: "center", + alignItems: "flex-start" + }}> + - + - void }) => { }} >
- + {invite.proposal.title || 'No Title'} diff --git a/apps/frontend/src/components/proposal/ProposalPeopleSelectorModal.tsx b/apps/frontend/src/components/proposal/ProposalPeopleSelectorModal.tsx index a3479ed180..d50f10f608 100644 --- a/apps/frontend/src/components/proposal/ProposalPeopleSelectorModal.tsx +++ b/apps/frontend/src/components/proposal/ProposalPeopleSelectorModal.tsx @@ -276,13 +276,15 @@ function ProposalPeopleSelectorModal({ } }; - const getOptionLabel = (option: UserOrEmail) => - isValidEmail(option) - ? option - : getFullUserNameWithInstitution(option) || ''; + const getOptionLabel = (option: UserOrEmail | UserOrEmail[]) => + Array.isArray(option) + ? '' + : isValidEmail(option) + ? option + : getFullUserNameWithInstitution(option) || ''; - const getOptionKey = (option: UserOrEmail) => - isValidEmail(option) ? option : option.id; + const getOptionKey = (option: UserOrEmail | UserOrEmail[]) => + Array.isArray(option) ? '' : isValidEmail(option) ? option : option.id; const isLoading = loading || isPendingSearch.current; @@ -352,16 +354,20 @@ function ProposalPeopleSelectorModal({ event.stopPropagation(); } }} - InputProps={{ - ...params.InputProps, - endAdornment: ( - <> - {isLoading && ( - - )} - {params.InputProps.endAdornment} - - ), + slotProps={{ + ...params.slotProps, + + input: { + ...params.slotProps.input, + endAdornment: ( + <> + {isLoading && ( + + )} + {params.slotProps.input.endAdornment} + + ), + }, }} /> )} diff --git a/apps/frontend/src/components/proposal/ProposalSummary.tsx b/apps/frontend/src/components/proposal/ProposalSummary.tsx index 625174ac91..171b3b0360 100644 --- a/apps/frontend/src/components/proposal/ProposalSummary.tsx +++ b/apps/frontend/src/components/proposal/ProposalSummary.tsx @@ -1,205 +1,205 @@ -import Button from '@mui/material/Button'; -import React, { useContext, useEffect, useState } from 'react'; - -import { NavigButton } from 'components/common/NavigButton'; -import UOLoader from 'components/common/UOLoader'; -import NavigationFragment from 'components/questionary/NavigationFragment'; -import { - createMissingContextErrorMessage, - QuestionaryContext, -} from 'components/questionary/QuestionaryContext'; -import ProposalQuestionaryReview from 'components/review/ProposalQuestionaryReview'; -import { UserContext } from 'context/UserContextProvider'; -import { UserRole } from 'generated/sdk'; -import { useCheckAccess } from 'hooks/common/useCheckAccess'; -import { useDownloadPDFProposal } from 'hooks/proposal/useDownloadPDFProposal'; -import { isCallEnded } from 'utils/helperFunctions'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; -import withConfirm, { WithConfirmType } from 'utils/withConfirm'; - -import { ProposalContextType } from './ProposalContainer'; -import { ProposalStatusDefaultShortCodes } from './ProposalsSharedConstants'; - -type ProposalSummaryProps = { - confirm: WithConfirmType; -}; - -function ProposalReview({ confirm }: ProposalSummaryProps) { - const { state, dispatch } = useContext( - QuestionaryContext - ) as ProposalContextType; - - if (!dispatch || !state) { - throw new Error(createMissingContextErrorMessage()); - } - - const { api } = useDataApiWithFeedback(); - const isUserOfficer = useCheckAccess([UserRole.USER_OFFICER]); - const { isInternalUser } = useContext(UserContext); - const callHasEnded = isCallEnded( - state.proposal.call?.startCall, - state.proposal.call?.endCall - ); - const isCallActiveInternal = state.proposal?.call?.isActiveInternal ?? true; - const [loadingSubmitMessage, setLoadingSubmitMessage] = - useState(true); - const [isSubmitting, setIsSubmitting] = useState(false); - const [submitButtonMessage, setSubmitButtonMessage] = useState( - 'I am aware that no further edits can be made after proposal submission.' - ); - - const proposal = state.proposal; - - const downloadPDFProposal = useDownloadPDFProposal(); - - const allStepsComplete = - proposal.questionary && - proposal.questionary.steps.every((step) => step.isCompleted); - - const [submitDisabled, setSubmitDisabled] = useState(() => { - const submissionDisabled = - (!isUserOfficer && callHasEnded) || // disallow submit for non user officers if the call ended - !allStepsComplete || - proposal.submitted; - - if ( - !proposal.submitted && - submissionDisabled && - isInternalUser && - isCallActiveInternal && - allStepsComplete - ) { - return false; // allow submit for intenal users if the call ended - } - - return submissionDisabled; - }); - - const [ - proposalSubmissionSuccessMessage, - setProposalSubmissionSuccessMessage, - ] = useState( - 'Your proposal has been submitted successfully. You will receive a confirmation email soon.' - ); - - // Show a different submit confirmation if - // EDITABLE_SUBMITTED is an upcoming status - useEffect(() => { - async function initializeSubmissionMessage() { - if (!proposal.callId || submitDisabled) { - setLoadingSubmitMessage(false); - - return; - } - const { call } = await api().getCallSubmissionDetails({ - callId: proposal.callId, - }); - const statuses = call?.proposalWorkflow?.statuses; - - const currentStatusId = proposal.status?.id; - - if (statuses) { - const editableStatusesShortCodes = [ - ProposalStatusDefaultShortCodes.EDITABLE_SUBMITTED.valueOf(), - ProposalStatusDefaultShortCodes.EDITABLE_SUBMITTED_INTERNAL.valueOf(), - ]; - const hasUpcomingEditableStatus = - statuses && - statuses.some( - (status) => - status.statusId && - currentStatusId && - status.statusId === currentStatusId && - editableStatusesShortCodes?.includes(status.statusId) - ); - - if (proposal.status != null && hasUpcomingEditableStatus) { - setSubmitButtonMessage( - 'Submit proposal? The proposal can be edited after submission.' - ); - } else { - setSubmitButtonMessage( - 'I am aware that no further edits can be made after proposal submission.' - ); - } - } - - if (call?.submissionMessage) { - setProposalSubmissionSuccessMessage(call.submissionMessage); - } - - setLoadingSubmitMessage(false); - } - initializeSubmissionMessage(); - }, [api, proposal.callId, proposal.status, submitDisabled]); - - if (loadingSubmitMessage) { - return ; - } - - return ( - <> - - - dispatch({ type: 'BACK_CLICKED' })} - disabled={state.stepIndex === 0} - isBusy={isSubmitting} - > - Back - - { - confirm( - async () => { - setIsSubmitting(true); - try { - const { submitProposal } = await api({ - toastSuccessMessage: proposalSubmissionSuccessMessage, - }).submitProposal({ - proposalPk: state.proposal.primaryKey, - }); - - const { proposal } = await api().getProposal({ - primaryKey: submitProposal.primaryKey, - }); // refetching proposal after event handling is done in backend - - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_SUBMITTED', - itemWithQuestionary: proposal!, - }); - } finally { - setSubmitDisabled(true); - setIsSubmitting(false); - } - }, - { - title: 'Please confirm', - description: submitButtonMessage, - } - )(); - }} - disabled={submitDisabled} - isBusy={isSubmitting} - data-cy="button-submit-proposal" - > - {proposal.submitted ? '✔ Submitted' : 'Submit'} - - - - - ); -} - -export default withConfirm(ProposalReview); +import Button from '@mui/material/Button'; +import React, { useContext, useEffect, useState } from 'react'; + +import { NavigButton } from 'components/common/NavigButton'; +import UOLoader from 'components/common/UOLoader'; +import NavigationFragment from 'components/questionary/NavigationFragment'; +import { + createMissingContextErrorMessage, + QuestionaryContext, +} from 'components/questionary/QuestionaryContext'; +import ProposalQuestionaryReview from 'components/review/ProposalQuestionaryReview'; +import { UserContext } from 'context/UserContextProvider'; +import { UserRole } from 'generated/sdk'; +import { useCheckAccess } from 'hooks/common/useCheckAccess'; +import { useDownloadPDFProposal } from 'hooks/proposal/useDownloadPDFProposal'; +import { isCallEnded } from 'utils/helperFunctions'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; +import withConfirm, { WithConfirmType } from 'utils/withConfirm'; + +import { ProposalContextType } from './ProposalContainer'; +import { ProposalStatusDefaultShortCodes } from './ProposalsSharedConstants'; + +type ProposalSummaryProps = { + confirm: WithConfirmType; +}; + +function ProposalReview({ confirm }: ProposalSummaryProps) { + const { state, dispatch } = useContext( + QuestionaryContext + ) as ProposalContextType; + + if (!dispatch || !state) { + throw new Error(createMissingContextErrorMessage()); + } + + const { api } = useDataApiWithFeedback(); + const isUserOfficer = useCheckAccess([UserRole.USER_OFFICER]); + const { isInternalUser } = useContext(UserContext); + const callHasEnded = isCallEnded( + state.proposal.call?.startCall, + state.proposal.call?.endCall + ); + const isCallActiveInternal = state.proposal?.call?.isActiveInternal ?? true; + const [loadingSubmitMessage, setLoadingSubmitMessage] = + useState(true); + const [isSubmitting, setIsSubmitting] = useState(false); + const [submitButtonMessage, setSubmitButtonMessage] = useState( + 'I am aware that no further edits can be made after proposal submission.' + ); + + const proposal = state.proposal; + + const downloadPDFProposal = useDownloadPDFProposal(); + + const allStepsComplete = + proposal.questionary && + proposal.questionary.steps.every((step) => step.isCompleted); + + const [submitDisabled, setSubmitDisabled] = useState(() => { + const submissionDisabled = + (!isUserOfficer && callHasEnded) || // disallow submit for non user officers if the call ended + !allStepsComplete || + proposal.submitted; + + if ( + !proposal.submitted && + submissionDisabled && + isInternalUser && + isCallActiveInternal && + allStepsComplete + ) { + return false; // allow submit for intenal users if the call ended + } + + return submissionDisabled; + }); + + const [ + proposalSubmissionSuccessMessage, + setProposalSubmissionSuccessMessage, + ] = useState( + 'Your proposal has been submitted successfully. You will receive a confirmation email soon.' + ); + + // Show a different submit confirmation if + // EDITABLE_SUBMITTED is an upcoming status + useEffect(() => { + async function initializeSubmissionMessage() { + if (!proposal.callId || submitDisabled) { + setLoadingSubmitMessage(false); + + return; + } + const { call } = await api().getCallSubmissionDetails({ + callId: proposal.callId, + }); + const statuses = call?.proposalWorkflow?.statuses; + + const currentStatusId = proposal.status?.id; + + if (statuses) { + const editableStatusesShortCodes = [ + ProposalStatusDefaultShortCodes.EDITABLE_SUBMITTED.valueOf(), + ProposalStatusDefaultShortCodes.EDITABLE_SUBMITTED_INTERNAL.valueOf(), + ]; + const hasUpcomingEditableStatus = + statuses && + statuses.some( + (status) => + status.statusId && + currentStatusId && + status.statusId === currentStatusId && + editableStatusesShortCodes?.includes(status.statusId) + ); + + if (proposal.status != null && hasUpcomingEditableStatus) { + setSubmitButtonMessage( + 'Submit proposal? The proposal can be edited after submission.' + ); + } else { + setSubmitButtonMessage( + 'I am aware that no further edits can be made after proposal submission.' + ); + } + } + + if (call?.submissionMessage) { + setProposalSubmissionSuccessMessage(call.submissionMessage); + } + + setLoadingSubmitMessage(false); + } + initializeSubmissionMessage(); + }, [api, proposal.callId, proposal.status, submitDisabled]); + + if (loadingSubmitMessage) { + return ; + } + + return ( + <> + + + dispatch({ type: 'BACK_CLICKED' })} + disabled={state.stepIndex === 0} + isBusy={isSubmitting} + > + Back + + { + confirm( + async () => { + setIsSubmitting(true); + try { + const { submitProposal } = await api({ + toastSuccessMessage: proposalSubmissionSuccessMessage, + }).submitProposal({ + proposalPk: state.proposal.primaryKey, + }); + + const { proposal } = await api().getProposal({ + primaryKey: submitProposal.primaryKey, + }); // refetching proposal after event handling is done in backend + + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_SUBMITTED', + itemWithQuestionary: proposal!, + }); + } finally { + setSubmitDisabled(true); + setIsSubmitting(false); + } + }, + { + title: 'Please confirm', + description: submitButtonMessage, + } + )(); + }} + disabled={submitDisabled} + isBusy={isSubmitting} + data-cy="button-submit-proposal" + > + {proposal.submitted ? '✔ Submitted' : 'Submit'} + + + + + ); +} + +export default withConfirm(ProposalReview); diff --git a/apps/frontend/src/components/proposal/ProposalTableInstrumentScientist.tsx b/apps/frontend/src/components/proposal/ProposalTableInstrumentScientist.tsx index b61eb75024..443f87fe33 100644 --- a/apps/frontend/src/components/proposal/ProposalTableInstrumentScientist.tsx +++ b/apps/frontend/src/components/proposal/ProposalTableInstrumentScientist.tsx @@ -204,11 +204,12 @@ const ToolbarWithSelectAllPrefetched = (props: { {tableHasData && !!selectAllAction && allItemsSelectedOnThePage && ( theme.palette.background.default} data-cy="select-all-proposals" - > + sx={{ + textAlign: "center", + padding: 1, + bgcolor: (theme) => theme.palette.background.default + }}> {selectAllAction.iconProps?.hidden ? ( <> All proposals are selected. @@ -956,7 +957,11 @@ const ProposalTableInstrumentScientist = ({ )} {isInstrumentScientist && ( - + @@ -964,7 +969,11 @@ const ProposalTableInstrumentScientist = ({ } /> - + {tableHasData && !!selectAllAction && allItemsSelectedOnThePage && ( theme.palette.background.default} data-cy="select-all-proposals" - > + sx={{ + textAlign: "center", + padding: 1, + bgcolor: (theme) => theme.palette.background.default + }}> {selectAllAction.iconProps?.hidden ? ( <> All proposals are selected. @@ -573,7 +574,11 @@ const ProposalTableOfficer = ({ confirm(action, { title: 'Are you sure? Multiple proposals selected!', description: ( - + {selectedCount} proposals are selected. This action will diff --git a/apps/frontend/src/components/proposal/TableActionsDropdownMenu.tsx b/apps/frontend/src/components/proposal/TableActionsDropdownMenu.tsx index 95d7ae08f0..c416de952d 100644 --- a/apps/frontend/src/components/proposal/TableActionsDropdownMenu.tsx +++ b/apps/frontend/src/components/proposal/TableActionsDropdownMenu.tsx @@ -143,37 +143,39 @@ const TableActionsDropdownMenu = ({ anchorEl={anchorElement} open={open} onClose={() => handleClose('close')} - MenuListProps={{ - 'aria-labelledby': 'basic-button', - }} - PaperProps={{ - elevation: 0, - sx: { - overflow: 'visible', - filter: 'drop-shadow(0px 2px 8px rgba(0,0,0,0.32))', - mt: 1.5, - '& .MuiAvatar-root': { - width: 32, - height: 32, - ml: -0.5, - mr: 1, - }, - '&:before': { - content: '""', - display: 'block', - position: 'absolute', - top: 0, - right: 14, - width: 10, - height: 10, - bgcolor: 'background.paper', - transform: 'translateY(-50%) rotate(45deg)', - zIndex: 0, + transformOrigin={{ horizontal: 'right', vertical: 'top' }} + anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }} + slotProps={{ + paper: { + elevation: 0, + sx: { + overflow: 'visible', + filter: 'drop-shadow(0px 2px 8px rgba(0,0,0,0.32))', + mt: 1.5, + '& .MuiAvatar-root': { + width: 32, + height: 32, + ml: -0.5, + mr: 1, + }, + '&:before': { + content: '""', + display: 'block', + position: 'absolute', + top: 0, + right: 14, + width: 10, + height: 10, + bgcolor: 'background.paper', + transform: 'translateY(-50%) rotate(45deg)', + zIndex: 0, + }, }, }, + list: { + 'aria-labelledby': 'basic-button', + }, }} - transformOrigin={{ horizontal: 'right', vertical: 'top' }} - anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }} > {menuItems.map((data, i) => ( (false); + + const handleChange = + (panel: string) => (event: React.SyntheticEvent, isExpanded: boolean) => { + setExpanded(isExpanded ? panel : false); + }; + + return ( +
+ + } + aria-controls="panel1bh-content" + id="panel1bh-header" + > + + General settings + + + I am an accordion + + + + + Nulla facilisi. Phasellus sollicitudin nulla et quam mattis feugiat. + Aliquam eget maximus est, id dignissim quam. + + + + + } + aria-controls="panel2bh-content" + id="panel2bh-header" + > + + Users + + + You are currently not an owner + + + + + Donec placerat, lectus sed mattis semper, neque lectus feugiat + lectus, varius pulvinar diam eros in elit. Pellentesque convallis + laoreet laoreet. + + + + + } + aria-controls="panel3bh-content" + id="panel3bh-header" + > + + Advanced settings + + + Filtering has been entirely disabled for whole web server + + + + + Nunc vitae orci ultricies, auctor nunc in, volutpat nisl. Integer + sit amet egestas eros, vitae egestas augue. Duis vel est augue. + + + + + } + aria-controls="panel4bh-content" + id="panel4bh-header" + > + + Personal data + + + + + Nunc vitae orci ultricies, auctor nunc in, volutpat nisl. Integer + sit amet egestas eros, vitae egestas augue. Duis vel est augue. + + + +
+ ); +} diff --git a/apps/frontend/src/components/proposalBooking/CreateUpdateVisit.tsx b/apps/frontend/src/components/proposalBooking/CreateUpdateVisit.tsx index 66c2e0c449..04af976ec2 100644 --- a/apps/frontend/src/components/proposalBooking/CreateUpdateVisit.tsx +++ b/apps/frontend/src/components/proposalBooking/CreateUpdateVisit.tsx @@ -1,143 +1,143 @@ -import { Button, Typography } from '@mui/material'; -import { Form, Formik } from 'formik'; -import React, { useContext, useState } from 'react'; -import * as Yup from 'yup'; - -import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; -import ErrorMessage from 'components/common/ErrorMessage'; -import FormikUIAutocomplete from 'components/common/FormikUIAutocomplete'; -import UserManagementTable from 'components/common/UserManagementTable'; -import { FeatureContext } from 'context/FeatureContextProvider'; -import { BasicUserDetails, FeatureId, Invite } from 'generated/sdk'; -import { UserExperiment } from 'hooks/experiment/useUserExperiments'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; -import { getFullUserName } from 'utils/user'; - -interface CreateUpdateVisitProps { - event: UserExperiment; - close: (updatedEvent: UserExperiment) => void; -} -function CreateUpdateVisit({ event, close }: CreateUpdateVisitProps) { - const { api } = useDataApiWithFeedback(); - const [visitInvites, setVisitInvites] = useState( - event.visit?.registrationInvites || [] - ); - - const { visit } = event; - - const initialValues = { - team: visit?.registrations.map((registration) => registration.user!) || [], - teamLeadUserId: visit?.teamLead.id || null, - inviteEmails: visit?.registrationInvites || [], - }; - - const featureContext = useContext(FeatureContext); - const allowInviteByEmail = !!featureContext.featuresMap.get( - FeatureId.EMAIL_INVITE - )?.isEnabled; - - return ( - user.id) - .includes(teamLeadUserId); - }, - }), - inviteEmails: Yup.array().default([]), - })} - onSubmit={async (values): Promise => { - if (visit) { - api({ toastSuccessMessage: 'Visit updated' }) - .updateVisit({ - visitId: visit.id, - team: values.team.map((user) => user.id), - teamLeadUserId: values.teamLeadUserId, - inviteEmails: visitInvites.map((invite) => invite.email), - }) - .then(({ updateVisit }) => { - if (updateVisit) { - close({ ...event, visit: updateVisit }); - } - }); - } else { - api({ toastSuccessMessage: 'Visit created' }) - .createVisit({ - experimentPk: event.experimentPk, - team: values.team?.map((user) => user.id), - teamLeadUserId: values.teamLeadUserId as number, - }) - .then(({ createVisit }) => { - if (createVisit) { - close({ ...event, visit: createVisit }); - } - }); - } - }} - > - {({ values, isSubmitting, setFieldValue }) => ( - - - {visit ? 'Update the visit' : 'Create new visit'} - - { - setFieldValue('team', team); - }} - users={values.team || []} - allowInviteByEmail={allowInviteByEmail} - /> - - - ({ - text: getFullUserName(user), - value: user.id, - }))} - label="Team lead" - name="teamLeadUserId" - InputProps={{ - 'data-cy': 'team-lead-user-dropdown', - margin: 'dense', - }} - /> - - - - - - - - )} - - ); -} - -export default CreateUpdateVisit; +import { Button, Typography } from '@mui/material'; +import { Form, Formik } from 'formik'; +import React, { useContext, useState } from 'react'; +import * as Yup from 'yup'; + +import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; +import ErrorMessage from 'components/common/ErrorMessage'; +import FormikUIAutocomplete from 'components/common/FormikUIAutocomplete'; +import UserManagementTable from 'components/common/UserManagementTable'; +import { FeatureContext } from 'context/FeatureContextProvider'; +import { BasicUserDetails, FeatureId, Invite } from 'generated/sdk'; +import { UserExperiment } from 'hooks/experiment/useUserExperiments'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; +import { getFullUserName } from 'utils/user'; + +interface CreateUpdateVisitProps { + event: UserExperiment; + close: (updatedEvent: UserExperiment) => void; +} +function CreateUpdateVisit({ event, close }: CreateUpdateVisitProps) { + const { api } = useDataApiWithFeedback(); + const [visitInvites, setVisitInvites] = useState( + event.visit?.registrationInvites || [] + ); + + const { visit } = event; + + const initialValues = { + team: visit?.registrations.map((registration) => registration.user!) || [], + teamLeadUserId: visit?.teamLead.id || null, + inviteEmails: visit?.registrationInvites || [], + }; + + const featureContext = useContext(FeatureContext); + const allowInviteByEmail = !!featureContext.featuresMap.get( + FeatureId.EMAIL_INVITE + )?.isEnabled; + + return ( + user.id) + .includes(teamLeadUserId); + }, + }), + inviteEmails: Yup.array().default([]), + })} + onSubmit={async (values): Promise => { + if (visit) { + api({ toastSuccessMessage: 'Visit updated' }) + .updateVisit({ + visitId: visit.id, + team: values.team.map((user) => user.id), + teamLeadUserId: values.teamLeadUserId, + inviteEmails: visitInvites.map((invite) => invite.email), + }) + .then(({ updateVisit }) => { + if (updateVisit) { + close({ ...event, visit: updateVisit }); + } + }); + } else { + api({ toastSuccessMessage: 'Visit created' }) + .createVisit({ + experimentPk: event.experimentPk, + team: values.team?.map((user) => user.id), + teamLeadUserId: values.teamLeadUserId as number, + }) + .then(({ createVisit }) => { + if (createVisit) { + close({ ...event, visit: createVisit }); + } + }); + } + }} + > + {({ values, isSubmitting, setFieldValue }) => ( +
+ + {visit ? 'Update the visit' : 'Create new visit'} + + { + setFieldValue('team', team); + }} + users={values.team || []} + allowInviteByEmail={allowInviteByEmail} + /> + + + ({ + text: getFullUserName(user), + value: user.id, + }))} + label="Team lead" + name="teamLeadUserId" + InputProps={{ + 'data-cy': 'team-lead-user-dropdown', + margin: 'dense', + }} + /> + + + + + + + + )} +
+ ); +} + +export default CreateUpdateVisit; diff --git a/apps/frontend/src/components/questionary/NavigationFragment.tsx b/apps/frontend/src/components/questionary/NavigationFragment.tsx index 85644487a8..c6e0a12f4c 100644 --- a/apps/frontend/src/components/questionary/NavigationFragment.tsx +++ b/apps/frontend/src/components/questionary/NavigationFragment.tsx @@ -15,12 +15,13 @@ const NavigationFragment = (props: { return ( + sx={{ + justifyContent: "flex-end", + marginTop: 3, + alignItems: "center" + }}> {props.isLoading && } <>{props.children} diff --git a/apps/frontend/src/components/questionary/QuestionaryDetails.tsx b/apps/frontend/src/components/questionary/QuestionaryDetails.tsx index b98f7edaea..ac1ec166cc 100644 --- a/apps/frontend/src/components/questionary/QuestionaryDetails.tsx +++ b/apps/frontend/src/components/questionary/QuestionaryDetails.tsx @@ -41,7 +41,9 @@ function QuestionaryDetails(props: QuestionaryDetailsProps) { if (loadingQuestionary) { return ( - + ); diff --git a/apps/frontend/src/components/questionary/questionaryComponents/Boolean/BooleanSearchCriteriaInput.tsx b/apps/frontend/src/components/questionary/questionaryComponents/Boolean/BooleanSearchCriteriaInput.tsx index bc0ebcaa54..6bd41cbb0d 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/Boolean/BooleanSearchCriteriaInput.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/Boolean/BooleanSearchCriteriaInput.tsx @@ -12,7 +12,7 @@ function BooleanSearchCriteriaInput({ return ( - + Value diff --git a/apps/frontend/src/components/questionary/questionaryComponents/Boolean/QuestionaryComponentBoolean.tsx b/apps/frontend/src/components/questionary/questionaryComponents/Boolean/QuestionaryComponentBoolean.tsx index 5f16bf95f3..28341700e2 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/Boolean/QuestionaryComponentBoolean.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/Boolean/QuestionaryComponentBoolean.tsx @@ -43,14 +43,16 @@ export function QuestionaryComponentBoolean(props: BasicComponentProps) { }} value={stateValue} checked={stateValue} - inputProps={{ - 'aria-label': 'primary checkbox', - }} sx={{ paddingTop: 0, paddingBottom: 0, }} data-natural-key={naturalKey} + slotProps={{ + input: { + 'aria-label': 'primary checkbox', + } + }} /> } label={ diff --git a/apps/frontend/src/components/questionary/questionaryComponents/DatePicker/DateSearchCriteriaInput.tsx b/apps/frontend/src/components/questionary/questionaryComponents/DatePicker/DateSearchCriteriaInput.tsx index 217dd82bb0..1e426990a2 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/DatePicker/DateSearchCriteriaInput.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/DatePicker/DateSearchCriteriaInput.tsx @@ -38,8 +38,14 @@ function DateSearchCriteriaInput({ }, [searchCriteria?.value]); return ( - - + + Operator @@ -72,7 +78,7 @@ function DateSearchCriteriaInput({ - + - + )} - + - async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { - const feedback = (state as FeedbackSubmissionState).feedback; - - const isCreated = feedback.id !== 0; - if (isCreated) { - // return existing questionary id - return feedback.questionaryId; - } - - // create new feedback and return new questionary id - const { createFeedback } = await api.createFeedback({ - experimentPk: feedback.experimentPk, - }); - - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_CREATED', - itemWithQuestionary: createFeedback, - }); - - return createFeedback.questionary.questionaryId; - }; - -export { QuestionaryComponentFeedbackBasis, feedbackBasisPreSubmit }; +import { useContext } from 'react'; + +import { FeedbackContextType } from 'components/feedback/FeedbackContainer'; +import { + createMissingContextErrorMessage, + QuestionaryContext, +} from 'components/questionary/QuestionaryContext'; +import { SubmitActionDependencyContainer } from 'hooks/questionary/useSubmitActions'; +import { FeedbackSubmissionState } from 'models/questionary/feedback/FeedbackSubmissionState'; + +function QuestionaryComponentFeedbackBasis() { + const { dispatch, state } = useContext( + QuestionaryContext + ) as FeedbackContextType; + + if (!state || !dispatch) { + throw new Error(createMissingContextErrorMessage()); + } + + return null; +} + +const feedbackBasisPreSubmit = + () => + async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { + const feedback = (state as FeedbackSubmissionState).feedback; + + const isCreated = feedback.id !== 0; + if (isCreated) { + // return existing questionary id + return feedback.questionaryId; + } + + // create new feedback and return new questionary id + const { createFeedback } = await api.createFeedback({ + experimentPk: feedback.experimentPk, + }); + + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_CREATED', + itemWithQuestionary: createFeedback, + }); + + return createFeedback.questionary.questionaryId; + }; + +export { QuestionaryComponentFeedbackBasis, feedbackBasisPreSubmit }; diff --git a/apps/frontend/src/components/questionary/questionaryComponents/FileUpload/FileUploadSearchCriteriaInput.tsx b/apps/frontend/src/components/questionary/questionaryComponents/FileUpload/FileUploadSearchCriteriaInput.tsx index 4681b17b41..55ee5de370 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/FileUpload/FileUploadSearchCriteriaInput.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/FileUpload/FileUploadSearchCriteriaInput.tsx @@ -12,7 +12,7 @@ function FileUploadSearchCriteriaInput({ return ( - + Has attachments diff --git a/apps/frontend/src/components/questionary/questionaryComponents/FileUpload/QuestionaryComponentFileUpload.tsx b/apps/frontend/src/components/questionary/questionaryComponents/FileUpload/QuestionaryComponentFileUpload.tsx index 570c1a5e74..71de58b807 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/FileUpload/QuestionaryComponentFileUpload.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/FileUpload/QuestionaryComponentFileUpload.tsx @@ -1,71 +1,71 @@ -import FormControl from '@mui/material/FormControl'; -import FormHelperText from '@mui/material/FormHelperText'; -import FormLabel from '@mui/material/FormLabel'; -import React, { useEffect, useState } from 'react'; - -import { - FileIdWithCaptionAndFigure, - FileUploadComponent, -} from 'components/common/FileUploadComponent'; -import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; -import { FileUploadConfig } from 'generated/sdk'; - -export function QuestionaryComponentFileUpload( - props: BasicComponentProps & { files?: string[] } -) { - const { - answer, - onComplete, - formikProps: { errors }, - } = props; - const { - question: { id }, - value, - } = answer; - const isError = errors[id] ? true : false; - const config = answer.config as FileUploadConfig; - const [stateValue, setStateValue] = - useState(value); - - useEffect(() => { - setStateValue(answer.value); - }, [answer]); - - return ( - - - {answer.question.question} - {config.small_label && ( - <> -
- {config.small_label} - - )} -
- { - const newStateValue = fileMetaDataList.map((file) => ({ - id: file.id, - caption: file.caption, - figure: file.figure, - })); - - setStateValue(newStateValue); - onComplete(newStateValue); - }} - value={stateValue} - /> - {isError && {errors[id]?.toString()}} -
- ); -} +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import FormLabel from '@mui/material/FormLabel'; +import React, { useEffect, useState } from 'react'; + +import { + FileIdWithCaptionAndFigure, + FileUploadComponent, +} from 'components/common/FileUploadComponent'; +import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; +import { FileUploadConfig } from 'generated/sdk'; + +export function QuestionaryComponentFileUpload( + props: BasicComponentProps & { files?: string[] } +) { + const { + answer, + onComplete, + formikProps: { errors }, + } = props; + const { + question: { id }, + value, + } = answer; + const isError = errors[id] ? true : false; + const config = answer.config as FileUploadConfig; + const [stateValue, setStateValue] = + useState(value); + + useEffect(() => { + setStateValue(answer.value); + }, [answer]); + + return ( + + + {answer.question.question} + {config.small_label && ( + <> +
+ {config.small_label} + + )} +
+ { + const newStateValue = fileMetaDataList.map((file) => ({ + id: file.id, + caption: file.caption, + figure: file.figure, + })); + + setStateValue(newStateValue); + onComplete(newStateValue); + }} + value={stateValue} + /> + {isError && {errors[id]?.toString()}} +
+ ); +} diff --git a/apps/frontend/src/components/questionary/questionaryComponents/GenericTemplateBasis/QuestionaryComponentGenericTemplateBasis.tsx b/apps/frontend/src/components/questionary/questionaryComponents/GenericTemplateBasis/QuestionaryComponentGenericTemplateBasis.tsx index 8662d9a290..eebcceffad 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/GenericTemplateBasis/QuestionaryComponentGenericTemplateBasis.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/GenericTemplateBasis/QuestionaryComponentGenericTemplateBasis.tsx @@ -1,106 +1,106 @@ -import { Field } from 'formik'; -import React, { ChangeEvent, useContext, useState } from 'react'; - -import TextField from 'components/common/FormikUITextField'; -import withPreventSubmit from 'components/common/withPreventSubmit'; -import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; -import { - createMissingContextErrorMessage, - QuestionaryContext, -} from 'components/questionary/QuestionaryContext'; -import { GenericTemplateBasisConfig } from 'generated/sdk'; -import { SubmitActionDependencyContainer } from 'hooks/questionary/useSubmitActions'; -import { GenericTemplateSubmissionState } from 'models/questionary/genericTemplate/GenericTemplateSubmissionState'; - -import { GenericTemplateContextType } from '../GenericTemplate/GenericTemplateContainer'; - -const TextFieldNoSubmit = withPreventSubmit(TextField); - -function QuestionaryComponentGenericTemplateBasis(props: BasicComponentProps) { - const { - answer, - answer: { - question: { id }, - }, - } = props; - - const config = answer.config as GenericTemplateBasisConfig; - - const { dispatch, state } = useContext( - QuestionaryContext - ) as GenericTemplateContextType; - - const [title, setTitle] = useState(state?.genericTemplate.title || ''); - - if (!state || !dispatch) { - throw new Error(createMissingContextErrorMessage()); - } - - return ( - ) => { - setTitle(event.currentTarget.value); - }, - onBlur: () => { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: { title: title }, - }); - }, - }} - required - multiline - fullWidth - component={TextFieldNoSubmit} - data-cy="title-input" - margin="dense" - /> - ); -} - -const genericTemplateBasisPreSubmit = - () => - async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { - const genericTemplate = (state as GenericTemplateSubmissionState) - .genericTemplate; - const title = genericTemplate.title; - - let returnValue = state.questionary.questionaryId; - - if (genericTemplate.id > 0) { - const result = await api.updateGenericTemplate({ - title: title, - genericTemplateId: genericTemplate.id, - }); - if (result.updateGenericTemplate) { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: result.updateGenericTemplate, - }); - } - } else { - const { createGenericTemplate } = await api.createGenericTemplate({ - title: title, - templateId: state.questionary.templateId, - proposalPk: genericTemplate.proposalPk, - questionId: genericTemplate.questionId, - }); - - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_CREATED', - itemWithQuestionary: createGenericTemplate, - }); - returnValue = createGenericTemplate.questionaryId; - } - - return returnValue; - }; - -export { - QuestionaryComponentGenericTemplateBasis, - genericTemplateBasisPreSubmit, -}; +import { Field } from 'formik'; +import React, { ChangeEvent, useContext, useState } from 'react'; + +import TextField from 'components/common/FormikUITextField'; +import withPreventSubmit from 'components/common/withPreventSubmit'; +import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; +import { + createMissingContextErrorMessage, + QuestionaryContext, +} from 'components/questionary/QuestionaryContext'; +import { GenericTemplateBasisConfig } from 'generated/sdk'; +import { SubmitActionDependencyContainer } from 'hooks/questionary/useSubmitActions'; +import { GenericTemplateSubmissionState } from 'models/questionary/genericTemplate/GenericTemplateSubmissionState'; + +import { GenericTemplateContextType } from '../GenericTemplate/GenericTemplateContainer'; + +const TextFieldNoSubmit = withPreventSubmit(TextField); + +function QuestionaryComponentGenericTemplateBasis(props: BasicComponentProps) { + const { + answer, + answer: { + question: { id }, + }, + } = props; + + const config = answer.config as GenericTemplateBasisConfig; + + const { dispatch, state } = useContext( + QuestionaryContext + ) as GenericTemplateContextType; + + const [title, setTitle] = useState(state?.genericTemplate.title || ''); + + if (!state || !dispatch) { + throw new Error(createMissingContextErrorMessage()); + } + + return ( + ) => { + setTitle(event.currentTarget.value); + }, + onBlur: () => { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: { title: title }, + }); + }, + }} + required + multiline + fullWidth + component={TextFieldNoSubmit} + data-cy="title-input" + margin="dense" + /> + ); +} + +const genericTemplateBasisPreSubmit = + () => + async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { + const genericTemplate = (state as GenericTemplateSubmissionState) + .genericTemplate; + const title = genericTemplate.title; + + let returnValue = state.questionary.questionaryId; + + if (genericTemplate.id > 0) { + const result = await api.updateGenericTemplate({ + title: title, + genericTemplateId: genericTemplate.id, + }); + if (result.updateGenericTemplate) { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: result.updateGenericTemplate, + }); + } + } else { + const { createGenericTemplate } = await api.createGenericTemplate({ + title: title, + templateId: state.questionary.templateId, + proposalPk: genericTemplate.proposalPk, + questionId: genericTemplate.questionId, + }); + + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_CREATED', + itemWithQuestionary: createGenericTemplate, + }); + returnValue = createGenericTemplate.questionaryId; + } + + return returnValue; + }; + +export { + QuestionaryComponentGenericTemplateBasis, + genericTemplateBasisPreSubmit, +}; diff --git a/apps/frontend/src/components/questionary/questionaryComponents/Hint.tsx b/apps/frontend/src/components/questionary/questionaryComponents/Hint.tsx index 0a66e1bae4..365a9c66b2 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/Hint.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/Hint.tsx @@ -9,12 +9,13 @@ import React from 'react'; function Hint(props: BoxProps) { return ( + sx={[{ + fontSize: 12, + fontStyle: "italic", + color: "#888", + marginTop: "4px" + }, ...(Array.isArray(props.sx) ? props.sx : [props.sx])]}> {props.children} ); diff --git a/apps/frontend/src/components/questionary/questionaryComponents/InstrumentPicker/InstrumentPickerSearchCriteriaComponent.tsx b/apps/frontend/src/components/questionary/questionaryComponents/InstrumentPicker/InstrumentPickerSearchCriteriaComponent.tsx index 2dba18bd07..41c4b47ec3 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/InstrumentPicker/InstrumentPickerSearchCriteriaComponent.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/InstrumentPicker/InstrumentPickerSearchCriteriaComponent.tsx @@ -21,7 +21,7 @@ function InstrumentPickerSearchCriteriaComponent({ return ( - + - {requestTime.map((value: InstrumentIdNameAndTime) => { - if (value.instrumentId) - return ( - - {value.instrumentName}: - - ), - }} - data-time-request={value.instrumentId + '-time-request'} - onChange={(e: React.ChangeEvent) => { - handleTimeInput(e.target.value, value.instrumentId); - }} - /> - ); - })} - - ) - ); + return (requestTimeForInstrument && ( + {requestTime.map((value: InstrumentIdNameAndTime) => { + if (value.instrumentId) + return ( + ) => { + handleTimeInput(e.target.value, value.instrumentId); + }} + slotProps={{ + input: { + startAdornment: ( + + {value.instrumentName}: + + ), + } + }} + /> + ); + })} + )); }; const DisplayErrorMessage = () => { diff --git a/apps/frontend/src/components/questionary/questionaryComponents/Interval/IntervalSearchCriteriaComponent.tsx b/apps/frontend/src/components/questionary/questionaryComponents/Interval/IntervalSearchCriteriaComponent.tsx index 4c538878bb..2b4d0b2802 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/Interval/IntervalSearchCriteriaComponent.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/Interval/IntervalSearchCriteriaComponent.tsx @@ -33,7 +33,7 @@ function IntervalSearchCriteriaComponent({ return ( - + Operator @@ -61,7 +61,7 @@ function IntervalSearchCriteriaComponent({ - + - + Unit diff --git a/apps/frontend/src/components/questionary/questionaryComponents/Interval/QuestionaryComponentInterval.tsx b/apps/frontend/src/components/questionary/questionaryComponents/Interval/QuestionaryComponentInterval.tsx index ecde338520..ff45309691 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/Interval/QuestionaryComponentInterval.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/Interval/QuestionaryComponentInterval.tsx @@ -114,8 +114,10 @@ export function QuestionaryComponentInterval(props: BasicComponentProps) { margin="dense" fullWidth > - - + + <> {question} @@ -129,12 +131,10 @@ export function QuestionaryComponentInterval(props: BasicComponentProps) { + size={3}> + size={3}> + size={6}> {getUnits()} - + {isError && {fieldError.min}} - + {isError && {fieldError.max}} - + {isError && {fieldError.unit}} diff --git a/apps/frontend/src/components/questionary/questionaryComponents/MultipleChoice/MultipleChoiceSearchCriteriaComponent.tsx b/apps/frontend/src/components/questionary/questionaryComponents/MultipleChoice/MultipleChoiceSearchCriteriaComponent.tsx index a8061432d8..c00f331d00 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/MultipleChoice/MultipleChoiceSearchCriteriaComponent.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/MultipleChoice/MultipleChoiceSearchCriteriaComponent.tsx @@ -17,7 +17,7 @@ function MultipleChoiceSearchCriteriaComponent({ return ( - + {/* TODO here it should me made clear that in case of multiple question, the answer will be "one of" */} - + Operator @@ -62,7 +62,7 @@ function NumberSearchCriteriaComponent({ - + - + Unit diff --git a/apps/frontend/src/components/questionary/questionaryComponents/NumberInput/QuestionNumberInputForm.tsx b/apps/frontend/src/components/questionary/questionaryComponents/NumberInput/QuestionNumberInputForm.tsx index 04223e5e48..fb3197a35b 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/NumberInput/QuestionNumberInputForm.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/NumberInput/QuestionNumberInputForm.tsx @@ -1,4 +1,4 @@ -import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutline'; +import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutlined'; import LaunchIcon from '@mui/icons-material/Launch'; import { DialogContent } from '@mui/material'; import Autocomplete from '@mui/material/Autocomplete'; diff --git a/apps/frontend/src/components/questionary/questionaryComponents/NumberInput/QuestionaryComponentNumberInput.tsx b/apps/frontend/src/components/questionary/questionaryComponents/NumberInput/QuestionaryComponentNumberInput.tsx index 54afce6e12..4511d832b5 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/NumberInput/QuestionaryComponentNumberInput.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/NumberInput/QuestionaryComponentNumberInput.tsx @@ -110,8 +110,10 @@ export function QuestionaryComponentNumber(props: BasicComponentProps) { margin="dense" fullWidth > - - + + <> {question} @@ -124,7 +126,7 @@ export function QuestionaryComponentNumber(props: BasicComponentProps) { - ({ paddingRight: theme.spacing(1) })}> + ({ paddingRight: theme.spacing(1) })} size={2}> { @@ -160,14 +162,14 @@ export function QuestionaryComponentNumber(props: BasicComponentProps) { error={isError} /> - + {getUnits()} - + {isError && {fieldError.value}} - + {isError && {fieldError.unit}} diff --git a/apps/frontend/src/components/questionary/questionaryComponents/ProposalBasis/QuestionaryComponentProposalBasis.tsx b/apps/frontend/src/components/questionary/questionaryComponents/ProposalBasis/QuestionaryComponentProposalBasis.tsx index 3d8eb80ffb..d7bdccfc62 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/ProposalBasis/QuestionaryComponentProposalBasis.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/ProposalBasis/QuestionaryComponentProposalBasis.tsx @@ -1,251 +1,251 @@ -import Box from '@mui/material/Box'; -import InputAdornment from '@mui/material/InputAdornment'; -import { useTheme } from '@mui/material/styles'; -import { Field } from 'formik'; -import React, { ChangeEvent, useContext, useState } from 'react'; - -import ErrorMessage from 'components/common/ErrorMessage'; -import TextField from 'components/common/FormikUITextField'; -import withPreventSubmit from 'components/common/withPreventSubmit'; -import CoProposers from 'components/proposal/CoProposers'; -import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; -import PrincipalInvestigator from 'components/proposal/PrincipalInvestigator'; -import { ProposalContextType } from 'components/proposal/ProposalContainer'; -import { - createMissingContextErrorMessage, - QuestionaryContext, -} from 'components/questionary/QuestionaryContext'; -import { BasicUserDetails, Invite } from 'generated/sdk'; -import { SubmitActionDependencyContainer } from 'hooks/questionary/useSubmitActions'; -import { ProposalSubmissionState } from 'models/questionary/proposal/ProposalSubmissionState'; - -const TextFieldNoSubmit = withPreventSubmit(TextField); - -function QuestionaryComponentProposalBasis(props: BasicComponentProps) { - const { - answer: { - question: { id }, - }, - formikProps, - } = props; - const theme = useTheme(); - - const { state, dispatch } = useContext( - QuestionaryContext - ) as ProposalContextType; - - const [localTitle, setLocalTitle] = useState(state?.proposal.title); - const [localAbstract, setLocalAbstract] = useState(state?.proposal.abstract); - const [hasInvalidChars, setHasInvalidChars] = useState(false); - const [textLen, setTextLen] = useState( - state?.proposal?.abstract?.length ?? 0 - ); - - if (!state || !dispatch) { - throw new Error(createMissingContextErrorMessage()); - } - - const { proposer, users } = state.proposal; - - const coProposersChanged = (users: BasicUserDetails[]) => { - formikProps.setFieldValue( - `${id}.users`, - users.map((user) => user.id) - ); - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: { users: users }, - }); - }; - - const invitesChanged = (invites: Invite[]) => { - formikProps.setFieldValue(`${id}.coProposerInvites`, { ...invites }); - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: { coProposerInvites: invites }, - }); - }; - - const principalInvestigatorChanged = (user: BasicUserDetails) => { - formikProps.setFieldValue(`${id}.proposer`, user.id); - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: { - proposer: user, - }, - }); - - // Remove the new PI from the co-proposers list (if present) and add the old PI (if present) to the co-proposers list - coProposersChanged( - users - .filter((coInvestigator) => coInvestigator.id !== user.id) - .concat(proposer as BasicUserDetails) - ); - }; - const counter = `Characters: ${textLen}/1500`; - - return ( -
- - ) => - setLocalTitle(event.target.value), - onBlur: () => { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: { title: localTitle }, - }); - }, - }} - required - fullWidth - component={TextField} - data-cy="title" - margin="dense" - id="title-input" - InputLabelProps={{ - shrink: true, - }} - /> - ) => { - const value = event.target.value; - const nonPrintableRegex = /[^\x20-\x7E\n\r\t]/g; - const hasInvalid = nonPrintableRegex.test(value); - const cleanedValue = value.replace(nonPrintableRegex, ' '); - setTextLen(event.target.value.length); - setHasInvalidChars(hasInvalid); - setLocalAbstract(cleanedValue); - }, - onBlur: () => { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: { abstract: localAbstract }, - }); - }, - }} - required - multiline - maxRows="16" - minRows="4" - fullWidth - component={TextFieldNoSubmit} - data-cy="abstract" - margin="dense" - id="abstract-input" - InputLabelProps={{ - shrink: true, - }} - helperText={ - hasInvalidChars - ? 'Non-printable characters have been removed from your input.' - : 'Only printable ASCII characters are allowed.' - } - /> - - ({ - display: 'flex', - justifyContent: 'right', - marginBottom: -theme.spacing(50), - })} - > - {counter} - - - - -
- ); -} - -const proposalBasisPreSubmit = - (isInvitesEnabled: boolean) => - async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { - const proposal = (state as ProposalSubmissionState).proposal; - const { primaryKey, title, abstract, users, proposer, callId } = proposal; - - let returnValue = state.questionary.questionaryId; - - if (primaryKey > 0) { - const result = await api.updateProposal({ - proposalPk: primaryKey, - title: title, - abstract: abstract, - users: users.map((user) => user.id), - proposerId: proposer?.id, - }); - - let invites; - if (isInvitesEnabled) { - invites = await api.setCoProposerInvites({ - input: { - proposalPk: result.updateProposal.primaryKey, - emails: proposal.coProposerInvites.map((invite) => invite.email), - }, - }); - } - - const coProposerInvites = invites?.setCoProposerInvites ?? []; - - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_LOADED', - itemWithQuestionary: { - ...proposal, - ...result.updateProposal, - ...(isInvitesEnabled ? { coProposerInvites } : {}), - }, - }); - } else { - const { createProposal } = await api.createProposal({ - callId: callId, - }); - const { updateProposal } = await api.updateProposal({ - proposalPk: createProposal.primaryKey, - title: title, - abstract: abstract, - users: users.map((user) => user.id), - proposerId: proposer?.id, - }); - - let invites; - if (isInvitesEnabled) { - invites = await api.setCoProposerInvites({ - input: { - proposalPk: updateProposal.primaryKey, - emails: proposal.coProposerInvites.map((invite) => invite.email), - }, - }); - } - - const coProposerInvites = invites?.setCoProposerInvites ?? []; - - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_CREATED', - itemWithQuestionary: { - ...proposal, - ...createProposal, - ...updateProposal, - ...(isInvitesEnabled ? { coProposerInvites } : {}), - }, - }); - returnValue = createProposal.questionaryId; - } - - return returnValue; - }; - -export { QuestionaryComponentProposalBasis, proposalBasisPreSubmit }; +import Box from '@mui/material/Box'; +import InputAdornment from '@mui/material/InputAdornment'; +import { useTheme } from '@mui/material/styles'; +import { Field } from 'formik'; +import React, { ChangeEvent, useContext, useState } from 'react'; + +import ErrorMessage from 'components/common/ErrorMessage'; +import TextField from 'components/common/FormikUITextField'; +import withPreventSubmit from 'components/common/withPreventSubmit'; +import CoProposers from 'components/proposal/CoProposers'; +import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; +import PrincipalInvestigator from 'components/proposal/PrincipalInvestigator'; +import { ProposalContextType } from 'components/proposal/ProposalContainer'; +import { + createMissingContextErrorMessage, + QuestionaryContext, +} from 'components/questionary/QuestionaryContext'; +import { BasicUserDetails, Invite } from 'generated/sdk'; +import { SubmitActionDependencyContainer } from 'hooks/questionary/useSubmitActions'; +import { ProposalSubmissionState } from 'models/questionary/proposal/ProposalSubmissionState'; + +const TextFieldNoSubmit = withPreventSubmit(TextField); + +function QuestionaryComponentProposalBasis(props: BasicComponentProps) { + const { + answer: { + question: { id }, + }, + formikProps, + } = props; + const theme = useTheme(); + + const { state, dispatch } = useContext( + QuestionaryContext + ) as ProposalContextType; + + const [localTitle, setLocalTitle] = useState(state?.proposal.title); + const [localAbstract, setLocalAbstract] = useState(state?.proposal.abstract); + const [hasInvalidChars, setHasInvalidChars] = useState(false); + const [textLen, setTextLen] = useState( + state?.proposal?.abstract?.length ?? 0 + ); + + if (!state || !dispatch) { + throw new Error(createMissingContextErrorMessage()); + } + + const { proposer, users } = state.proposal; + + const coProposersChanged = (users: BasicUserDetails[]) => { + formikProps.setFieldValue( + `${id}.users`, + users.map((user) => user.id) + ); + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: { users: users }, + }); + }; + + const invitesChanged = (invites: Invite[]) => { + formikProps.setFieldValue(`${id}.coProposerInvites`, { ...invites }); + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: { coProposerInvites: invites }, + }); + }; + + const principalInvestigatorChanged = (user: BasicUserDetails) => { + formikProps.setFieldValue(`${id}.proposer`, user.id); + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: { + proposer: user, + }, + }); + + // Remove the new PI from the co-proposers list (if present) and add the old PI (if present) to the co-proposers list + coProposersChanged( + users + .filter((coInvestigator) => coInvestigator.id !== user.id) + .concat(proposer as BasicUserDetails) + ); + }; + const counter = `Characters: ${textLen}/1500`; + + return ( +
+ + ) => + setLocalTitle(event.target.value), + onBlur: () => { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: { title: localTitle }, + }); + }, + }} + required + fullWidth + component={TextField} + data-cy="title" + margin="dense" + id="title-input" + InputLabelProps={{ + shrink: true, + }} + /> + ) => { + const value = event.target.value; + const nonPrintableRegex = /[^\x20-\x7E\n\r\t]/g; + const hasInvalid = nonPrintableRegex.test(value); + const cleanedValue = value.replace(nonPrintableRegex, ' '); + setTextLen(event.target.value.length); + setHasInvalidChars(hasInvalid); + setLocalAbstract(cleanedValue); + }, + onBlur: () => { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: { abstract: localAbstract }, + }); + }, + }} + required + multiline + maxRows="16" + minRows="4" + fullWidth + component={TextFieldNoSubmit} + data-cy="abstract" + margin="dense" + id="abstract-input" + InputLabelProps={{ + shrink: true, + }} + helperText={ + hasInvalidChars + ? 'Non-printable characters have been removed from your input.' + : 'Only printable ASCII characters are allowed.' + } + /> + + ({ + display: 'flex', + justifyContent: 'right', + marginBottom: -theme.spacing(50), + })} + > + {counter} + + + + +
+ ); +} + +const proposalBasisPreSubmit = + (isInvitesEnabled: boolean) => + async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { + const proposal = (state as ProposalSubmissionState).proposal; + const { primaryKey, title, abstract, users, proposer, callId } = proposal; + + let returnValue = state.questionary.questionaryId; + + if (primaryKey > 0) { + const result = await api.updateProposal({ + proposalPk: primaryKey, + title: title, + abstract: abstract, + users: users.map((user) => user.id), + proposerId: proposer?.id, + }); + + let invites; + if (isInvitesEnabled) { + invites = await api.setCoProposerInvites({ + input: { + proposalPk: result.updateProposal.primaryKey, + emails: proposal.coProposerInvites.map((invite) => invite.email), + }, + }); + } + + const coProposerInvites = invites?.setCoProposerInvites ?? []; + + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_LOADED', + itemWithQuestionary: { + ...proposal, + ...result.updateProposal, + ...(isInvitesEnabled ? { coProposerInvites } : {}), + }, + }); + } else { + const { createProposal } = await api.createProposal({ + callId: callId, + }); + const { updateProposal } = await api.updateProposal({ + proposalPk: createProposal.primaryKey, + title: title, + abstract: abstract, + users: users.map((user) => user.id), + proposerId: proposer?.id, + }); + + let invites; + if (isInvitesEnabled) { + invites = await api.setCoProposerInvites({ + input: { + proposalPk: updateProposal.primaryKey, + emails: proposal.coProposerInvites.map((invite) => invite.email), + }, + }); + } + + const coProposerInvites = invites?.setCoProposerInvites ?? []; + + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_CREATED', + itemWithQuestionary: { + ...proposal, + ...createProposal, + ...updateProposal, + ...(isInvitesEnabled ? { coProposerInvites } : {}), + }, + }); + returnValue = createProposal.questionaryId; + } + + return returnValue; + }; + +export { QuestionaryComponentProposalBasis, proposalBasisPreSubmit }; diff --git a/apps/frontend/src/components/questionary/questionaryComponents/ProposalEsiBasis/QuestionaryComponentExperimentSafetyBasis.tsx b/apps/frontend/src/components/questionary/questionaryComponents/ProposalEsiBasis/QuestionaryComponentExperimentSafetyBasis.tsx index f27d565910..66ade67f48 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/ProposalEsiBasis/QuestionaryComponentExperimentSafetyBasis.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/ProposalEsiBasis/QuestionaryComponentExperimentSafetyBasis.tsx @@ -1,475 +1,475 @@ -import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutline'; -import DeleteIcon from '@mui/icons-material/Delete'; -import EditIcon from '@mui/icons-material/Edit'; -import FileCopy from '@mui/icons-material/FileCopy'; -import { - Button, - Checkbox, - DialogContent, - Divider, - IconButton, - List, - ListItem, - ListItemText, - Typography, -} from '@mui/material'; -import ListItemIcon from '@mui/material/ListItemIcon'; -import { Field, FieldProps } from 'formik'; -import { useSnackbar } from 'notistack'; -import React, { MouseEvent, useContext, useState } from 'react'; - -import ErrorMessage from 'components/common/ErrorMessage'; -import BoxIcon from 'components/common/icons/BoxIcon'; -import StyledDialog from 'components/common/StyledDialog'; -import UOLoader from 'components/common/UOLoader'; -import { ExperimentSafetyContextType } from 'components/experimentSafety/ExperimentSafetyContainer'; -import SampleEsiContainer from 'components/experimentSample/ExperimentSampleContainer'; -import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; -import { - createMissingContextErrorMessage, - QuestionaryContext, -} from 'components/questionary/QuestionaryContext'; -import { - DataType, - GetExperimentSampleQuery, - SampleDeclarationConfig, - SampleFragment, -} from 'generated/sdk'; -import { ExperimentSampleWithQuestionary } from 'models/questionary/experimentSample/ExperimentSampleWithQuestionary'; -import { getQuestionsByType } from 'models/questionary/QuestionaryFunctions'; -import { StyledButtonContainer } from 'styles/StyledComponents'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; -import withConfirm, { WithConfirmType } from 'utils/withConfirm'; -import withPrompt, { WithPromptType } from 'utils/withPrompt'; - -function QuestionaryComponentExperimentSafetyBasis( - props: BasicComponentProps & { prompt: WithPromptType } & { - confirm: WithConfirmType; - } -) { - const { answer, prompt, confirm } = props; - const answerId = answer.question.id; - const { state, dispatch } = useContext( - QuestionaryContext - ) as ExperimentSafetyContextType; - const [selectedExperimentSample, setSelectedExperimentSample] = - useState(null); - const { api } = useDataApiWithFeedback(); - const { enqueueSnackbar } = useSnackbar(); - - if (!state) { - throw new Error(createMissingContextErrorMessage()); - } - - return ( - - {({ field, form }: FieldProps) => { - const addSampleToExperiment = (sampleId: number) => { - api() - .addSampleToExperiment({ - experimentPk: state!.experimentSafety.experimentPk, - sampleId: sampleId, - }) - .then(({ addSampleToExperiment }) => { - if (addSampleToExperiment) { - dispatch({ - type: 'SAMPLE_ADDED_TO_EXPERIMENT', - experimentSample: addSampleToExperiment, - }); - setSelectedExperimentSample(addSampleToExperiment); - form.setFieldValue(answerId, [ - ...field.value, - addSampleToExperiment, - ]); - } - }); - }; - - const removeSampleFromExperiment = (sampleId: number) => { - api() - .removeSampleFromExperiment({ - experimentPk: state!.experimentSafety.experimentPk, - sampleId: sampleId, - }) - .then(({ removeSampleFromExperiment }) => { - if (removeSampleFromExperiment) { - dispatch({ - type: 'SAMPLE_REMOVED_FROM_EXPERIMENT', - sampleId: removeSampleFromExperiment.sampleId, - }); - - // Refresh ESI list - api() - .getExperimentSafety({ - experimentSafetyPk: - state!.experimentSafety.experimentSafetyPk, - }) - .then((result) => { - form.setFieldValue( - answerId, - result.experimentSafety?.samples - ); - }); - } - }); - }; - - const createSample = async (title: string) => { - const sampleQuestions = getQuestionsByType( - state.experimentSafety.proposal.questionary.steps, - DataType.SAMPLE_DECLARATION - ); - - if (sampleQuestions.length === 0) { - api().addClientLog({ - error: `No sample declaration question found for proposal ${state.experimentSafety.proposal.primaryKey}`, - }); - - enqueueSnackbar( - 'It is not possible to create a sample, because no sample declaration question was found in the proposal questionary. Please contact your User Office.', - { - variant: 'error', - className: 'snackbar-error', - } - ); - - return; - } - - const sampleQuestion = sampleQuestions[0]; - - const result = await api().createSample({ - title: title, - templateId: (sampleQuestion.config as SampleDeclarationConfig) - .templateId!, - proposalPk: state.experimentSafety.proposal.primaryKey, - questionId: sampleQuestion.question.id, - isPostProposalSubmission: true, - }); - - const sample = result.createSample; - if (sample !== null) { - dispatch({ type: 'SAMPLE_CREATED', sample: sample }); - addSampleToExperiment(sample.id); - } - }; - - const deleteSample = async (sampleId: number) => { - await api() - .deleteSample({ - sampleId: sampleId, - }) - .then((response) => { - const deletedSample = response.deleteSample; - if (deletedSample) { - const newValue = field.value.filter( - (esi) => esi.sampleId !== deletedSample.id - ); - dispatch({ - type: 'SAMPLE_DELETED', - sampleId: deletedSample.id, - }); - dispatch({ - type: 'SAMPLE_REMOVED_FROM_EXPERIMENT', - sampleId: deletedSample.id, - }); - form.setFieldValue(answerId, newValue); - } - }); - }; - - const removeSampleFromExperimentConfirmation = async ( - sampleId: number - ) => { - confirm( - () => { - removeSampleFromExperiment(sampleId); - }, - { - title: 'Are you sure?', - description: - 'Are you sure you want to deselect the sample? The information entered for the ESI will be lost!', - } - )(); - }; - - const handleEditExperimentSampleClick = async (id: number) => { - await api() - .updateExperimentSample({ - sampleId: id, - experimentPk: state!.experimentSafety.experimentPk, - isSubmitted: false, - }) - .then(({ updateExperimentSample }) => { - if (updateExperimentSample) { - setSelectedExperimentSample(updateExperimentSample); - const newValue = field.value.map((esi) => - esi.sampleId === updateExperimentSample.sampleId - ? updateExperimentSample - : esi - ); - dispatch({ - type: 'EXPERIMENT_SAMPLE_UPDATED', - experimentSample: updateExperimentSample, - }); - form.setFieldValue(answerId, newValue); - } - }); - }; - - const handleCloneSampleClick = async ( - sampleToClone: SampleFragment - ) => { - prompt( - async (newTitle) => { - await api() - .cloneSample({ - sampleId: sampleToClone.id, - title: newTitle, - isPostProposalSubmission: true, - }) - .then((response) => { - const newSample = response.cloneSample; - if (newSample !== null) { - dispatch({ type: 'SAMPLE_CREATED', sample: newSample }); - } - }); - }, - { - question: 'Sample title', - prefilledAnswer: `Copy of ${sampleToClone.title}`, - } - )(); - }; - - const handleCloneExperimentClick = async ( - sampleToClone: SampleFragment - ) => { - prompt( - async (newTitle) => { - await api() - .cloneExperimentSample({ - experimentPk: state.experimentSafety.experimentPk, - sampleId: sampleToClone.id, - newSampleTitle: newTitle, - }) - .then(({ cloneExperimentSample }) => { - if (cloneExperimentSample !== null) { - dispatch({ - type: 'SAMPLE_CREATED', - sample: cloneExperimentSample.sample, - }); - dispatch({ - type: 'SAMPLE_ADDED_TO_EXPERIMENT', - experimentSample: - cloneExperimentSample as ExperimentSampleWithQuestionary, - }); - form.setFieldValue(answerId, [ - ...field.value, - cloneExperimentSample, - ]); - } - }); - }, - { - question: 'Sample title', - prefilledAnswer: `Copy of ${sampleToClone.title}`, - } - )(); - }; - - const allSamples = state?.experimentSafety?.proposal.samples; - const declaredExperimentSamples = field.value || []; - - return ( - <> - - - {allSamples?.map((sample) => { - const declaredExperimentSample = declaredExperimentSamples.find( - (curEsi) => curEsi.sampleId === sample.id - ); - const hasDeclaredEsi = declaredExperimentSample !== undefined; - const isDeclarationComplete = - declaredExperimentSample?.isEsiSubmitted; - - return ( - - - - e.target.checked - ? addSampleToExperiment(sample.id) - : removeSampleFromExperimentConfirmation(sample.id) - } - data-cy="select-sample-chk" - /> - - - - - - - {hasDeclaredEsi && ( - - { - e.stopPropagation(); - handleEditExperimentSampleClick(sample.id); - }} - data-cy="edit-esi-btn" - > - - - - )} - - { - - { - e.stopPropagation(); - hasDeclaredEsi - ? handleCloneExperimentClick(sample) - : handleCloneSampleClick(sample); - }} - data-cy="clone-sample-btn" - > - - - - } - - {sample.isPostProposalSubmission && ( - - { - e.stopPropagation(); - confirm( - async () => { - deleteSample(sample.id); - }, - { - title: 'Are you sure', - description: `Are you sure you want to delete sample "${sample.title}"`, - } - )(); - }} - > - - - - )} - - ); - })} - - - - - - - - {`${declaredExperimentSamples.length ?? 0} of - ${state?.experimentSafety?.proposal.samples?.length ?? 0} samples selected`} - - setSelectedExperimentSample(null)} - open={selectedExperimentSample !== null} - data-cy="sample-esi-modal" - maxWidth="md" - fullWidth - title="Declare the Sample" - > - - {selectedExperimentSample ? ( - { - const newValue = field.value.map((sampleEsi) => - sampleEsi.sampleId === updatedExperimentSample.sampleId - ? updatedExperimentSample - : sampleEsi - ); - dispatch({ - type: 'EXPERIMENT_SAMPLE_UPDATED', - experimentSample: updatedExperimentSample, - }); - form.setFieldValue(answerId, newValue); - }} - onSubmitted={() => { - // refresh all samples - api() - .getExperimentSafety({ - experimentSafetyPk: - state!.experimentSafety.experimentSafetyPk, - }) - .then((result) => { - form.setFieldValue( - answerId, - result.experimentSafety?.samples - ); - }); - - setSelectedExperimentSample(null); - }} - > - ) : ( - - )} - - - - ); - }} - - ); -} - -export default withConfirm( - withPrompt(QuestionaryComponentExperimentSafetyBasis) -); +import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutlined'; +import DeleteIcon from '@mui/icons-material/Delete'; +import EditIcon from '@mui/icons-material/Edit'; +import FileCopy from '@mui/icons-material/FileCopy'; +import { + Button, + Checkbox, + DialogContent, + Divider, + IconButton, + List, + ListItem, + ListItemText, + Typography, +} from '@mui/material'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import { Field, FieldProps } from 'formik'; +import { useSnackbar } from 'notistack'; +import React, { MouseEvent, useContext, useState } from 'react'; + +import ErrorMessage from 'components/common/ErrorMessage'; +import BoxIcon from 'components/common/icons/BoxIcon'; +import StyledDialog from 'components/common/StyledDialog'; +import UOLoader from 'components/common/UOLoader'; +import { ExperimentSafetyContextType } from 'components/experimentSafety/ExperimentSafetyContainer'; +import SampleEsiContainer from 'components/experimentSample/ExperimentSampleContainer'; +import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; +import { + createMissingContextErrorMessage, + QuestionaryContext, +} from 'components/questionary/QuestionaryContext'; +import { + DataType, + GetExperimentSampleQuery, + SampleDeclarationConfig, + SampleFragment, +} from 'generated/sdk'; +import { ExperimentSampleWithQuestionary } from 'models/questionary/experimentSample/ExperimentSampleWithQuestionary'; +import { getQuestionsByType } from 'models/questionary/QuestionaryFunctions'; +import { StyledButtonContainer } from 'styles/StyledComponents'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; +import withConfirm, { WithConfirmType } from 'utils/withConfirm'; +import withPrompt, { WithPromptType } from 'utils/withPrompt'; + +function QuestionaryComponentExperimentSafetyBasis( + props: BasicComponentProps & { prompt: WithPromptType } & { + confirm: WithConfirmType; + } +) { + const { answer, prompt, confirm } = props; + const answerId = answer.question.id; + const { state, dispatch } = useContext( + QuestionaryContext + ) as ExperimentSafetyContextType; + const [selectedExperimentSample, setSelectedExperimentSample] = + useState(null); + const { api } = useDataApiWithFeedback(); + const { enqueueSnackbar } = useSnackbar(); + + if (!state) { + throw new Error(createMissingContextErrorMessage()); + } + + return ( + + {({ field, form }: FieldProps) => { + const addSampleToExperiment = (sampleId: number) => { + api() + .addSampleToExperiment({ + experimentPk: state!.experimentSafety.experimentPk, + sampleId: sampleId, + }) + .then(({ addSampleToExperiment }) => { + if (addSampleToExperiment) { + dispatch({ + type: 'SAMPLE_ADDED_TO_EXPERIMENT', + experimentSample: addSampleToExperiment, + }); + setSelectedExperimentSample(addSampleToExperiment); + form.setFieldValue(answerId, [ + ...field.value, + addSampleToExperiment, + ]); + } + }); + }; + + const removeSampleFromExperiment = (sampleId: number) => { + api() + .removeSampleFromExperiment({ + experimentPk: state!.experimentSafety.experimentPk, + sampleId: sampleId, + }) + .then(({ removeSampleFromExperiment }) => { + if (removeSampleFromExperiment) { + dispatch({ + type: 'SAMPLE_REMOVED_FROM_EXPERIMENT', + sampleId: removeSampleFromExperiment.sampleId, + }); + + // Refresh ESI list + api() + .getExperimentSafety({ + experimentSafetyPk: + state!.experimentSafety.experimentSafetyPk, + }) + .then((result) => { + form.setFieldValue( + answerId, + result.experimentSafety?.samples + ); + }); + } + }); + }; + + const createSample = async (title: string) => { + const sampleQuestions = getQuestionsByType( + state.experimentSafety.proposal.questionary.steps, + DataType.SAMPLE_DECLARATION + ); + + if (sampleQuestions.length === 0) { + api().addClientLog({ + error: `No sample declaration question found for proposal ${state.experimentSafety.proposal.primaryKey}`, + }); + + enqueueSnackbar( + 'It is not possible to create a sample, because no sample declaration question was found in the proposal questionary. Please contact your User Office.', + { + variant: 'error', + className: 'snackbar-error', + } + ); + + return; + } + + const sampleQuestion = sampleQuestions[0]; + + const result = await api().createSample({ + title: title, + templateId: (sampleQuestion.config as SampleDeclarationConfig) + .templateId!, + proposalPk: state.experimentSafety.proposal.primaryKey, + questionId: sampleQuestion.question.id, + isPostProposalSubmission: true, + }); + + const sample = result.createSample; + if (sample !== null) { + dispatch({ type: 'SAMPLE_CREATED', sample: sample }); + addSampleToExperiment(sample.id); + } + }; + + const deleteSample = async (sampleId: number) => { + await api() + .deleteSample({ + sampleId: sampleId, + }) + .then((response) => { + const deletedSample = response.deleteSample; + if (deletedSample) { + const newValue = field.value.filter( + (esi) => esi.sampleId !== deletedSample.id + ); + dispatch({ + type: 'SAMPLE_DELETED', + sampleId: deletedSample.id, + }); + dispatch({ + type: 'SAMPLE_REMOVED_FROM_EXPERIMENT', + sampleId: deletedSample.id, + }); + form.setFieldValue(answerId, newValue); + } + }); + }; + + const removeSampleFromExperimentConfirmation = async ( + sampleId: number + ) => { + confirm( + () => { + removeSampleFromExperiment(sampleId); + }, + { + title: 'Are you sure?', + description: + 'Are you sure you want to deselect the sample? The information entered for the ESI will be lost!', + } + )(); + }; + + const handleEditExperimentSampleClick = async (id: number) => { + await api() + .updateExperimentSample({ + sampleId: id, + experimentPk: state!.experimentSafety.experimentPk, + isSubmitted: false, + }) + .then(({ updateExperimentSample }) => { + if (updateExperimentSample) { + setSelectedExperimentSample(updateExperimentSample); + const newValue = field.value.map((esi) => + esi.sampleId === updateExperimentSample.sampleId + ? updateExperimentSample + : esi + ); + dispatch({ + type: 'EXPERIMENT_SAMPLE_UPDATED', + experimentSample: updateExperimentSample, + }); + form.setFieldValue(answerId, newValue); + } + }); + }; + + const handleCloneSampleClick = async ( + sampleToClone: SampleFragment + ) => { + prompt( + async (newTitle) => { + await api() + .cloneSample({ + sampleId: sampleToClone.id, + title: newTitle, + isPostProposalSubmission: true, + }) + .then((response) => { + const newSample = response.cloneSample; + if (newSample !== null) { + dispatch({ type: 'SAMPLE_CREATED', sample: newSample }); + } + }); + }, + { + question: 'Sample title', + prefilledAnswer: `Copy of ${sampleToClone.title}`, + } + )(); + }; + + const handleCloneExperimentClick = async ( + sampleToClone: SampleFragment + ) => { + prompt( + async (newTitle) => { + await api() + .cloneExperimentSample({ + experimentPk: state.experimentSafety.experimentPk, + sampleId: sampleToClone.id, + newSampleTitle: newTitle, + }) + .then(({ cloneExperimentSample }) => { + if (cloneExperimentSample !== null) { + dispatch({ + type: 'SAMPLE_CREATED', + sample: cloneExperimentSample.sample, + }); + dispatch({ + type: 'SAMPLE_ADDED_TO_EXPERIMENT', + experimentSample: + cloneExperimentSample as ExperimentSampleWithQuestionary, + }); + form.setFieldValue(answerId, [ + ...field.value, + cloneExperimentSample, + ]); + } + }); + }, + { + question: 'Sample title', + prefilledAnswer: `Copy of ${sampleToClone.title}`, + } + )(); + }; + + const allSamples = state?.experimentSafety?.proposal.samples; + const declaredExperimentSamples = field.value || []; + + return ( + <> + + + {allSamples?.map((sample) => { + const declaredExperimentSample = declaredExperimentSamples.find( + (curEsi) => curEsi.sampleId === sample.id + ); + const hasDeclaredEsi = declaredExperimentSample !== undefined; + const isDeclarationComplete = + declaredExperimentSample?.isEsiSubmitted; + + return ( + + + + e.target.checked + ? addSampleToExperiment(sample.id) + : removeSampleFromExperimentConfirmation(sample.id) + } + data-cy="select-sample-chk" + /> + + + + + + + {hasDeclaredEsi && ( + + { + e.stopPropagation(); + handleEditExperimentSampleClick(sample.id); + }} + data-cy="edit-esi-btn" + > + + + + )} + + { + + { + e.stopPropagation(); + hasDeclaredEsi + ? handleCloneExperimentClick(sample) + : handleCloneSampleClick(sample); + }} + data-cy="clone-sample-btn" + > + + + + } + + {sample.isPostProposalSubmission && ( + + { + e.stopPropagation(); + confirm( + async () => { + deleteSample(sample.id); + }, + { + title: 'Are you sure', + description: `Are you sure you want to delete sample "${sample.title}"`, + } + )(); + }} + > + + + + )} + + ); + })} + + + + + + + + {`${declaredExperimentSamples.length ?? 0} of + ${state?.experimentSafety?.proposal.samples?.length ?? 0} samples selected`} + + setSelectedExperimentSample(null)} + open={selectedExperimentSample !== null} + data-cy="sample-esi-modal" + maxWidth="md" + fullWidth + title="Declare the Sample" + > + + {selectedExperimentSample ? ( + { + const newValue = field.value.map((sampleEsi) => + sampleEsi.sampleId === updatedExperimentSample.sampleId + ? updatedExperimentSample + : sampleEsi + ); + dispatch({ + type: 'EXPERIMENT_SAMPLE_UPDATED', + experimentSample: updatedExperimentSample, + }); + form.setFieldValue(answerId, newValue); + }} + onSubmitted={() => { + // refresh all samples + api() + .getExperimentSafety({ + experimentSafetyPk: + state!.experimentSafety.experimentSafetyPk, + }) + .then((result) => { + form.setFieldValue( + answerId, + result.experimentSafety?.samples + ); + }); + + setSelectedExperimentSample(null); + }} + > + ) : ( + + )} + + + + ); + }} + + ); +} + +export default withConfirm( + withPrompt(QuestionaryComponentExperimentSafetyBasis) +); diff --git a/apps/frontend/src/components/questionary/questionaryComponents/QuestionDependencyList.tsx b/apps/frontend/src/components/questionary/questionaryComponents/QuestionDependencyList.tsx index ba1d4dc323..074c1416e0 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/QuestionDependencyList.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/QuestionDependencyList.tsx @@ -1,4 +1,4 @@ -import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutline'; +import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutlined'; import ClearIcon from '@mui/icons-material/Clear'; import Box from '@mui/material/Box'; import FormControl from '@mui/material/FormControl'; @@ -72,9 +72,13 @@ const QuestionDependencyList = ({ {({ remove, push }) => ( <> - + - + @@ -96,7 +100,7 @@ const QuestionDependencyList = ({ {field.dependencies.length > 1 && ( - + Compare dependencies @@ -130,9 +134,14 @@ const QuestionDependencyList = ({ {field.dependencies?.map((dependency, i) => { return ( - + - + - + { remove(i); diff --git a/apps/frontend/src/components/questionary/questionaryComponents/QuestionFormShell.tsx b/apps/frontend/src/components/questionary/questionaryComponents/QuestionFormShell.tsx index d07be5a80e..6375b952e8 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/QuestionFormShell.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/QuestionFormShell.tsx @@ -1,123 +1,123 @@ -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Typography from '@mui/material/Typography'; -import { Form, Formik } from 'formik'; -import React from 'react'; - -import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; -import { - getQuestionaryComponentDefinition, - QuestionFormProps, -} from 'components/questionary/QuestionaryComponentRegistry'; -import { Question } from 'generated/sdk'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; -import withConfirm, { WithConfirmType } from 'utils/withConfirm'; - -import { QuestionReadPermissionsConfig } from '../QuestionReadPermissionsConfig'; - -interface QuestionFormShellProps extends QuestionFormProps { - validationSchema: unknown; - confirm: WithConfirmType; -} - -export const QuestionFormShell = withConfirm( - (props: QuestionFormShellProps) => { - const { question, validationSchema, confirm, children } = props; - const { onUpdated, onDeleted, closeMe } = props; - const { api } = useDataApiWithFeedback(); - const definition = getQuestionaryComponentDefinition(question.dataType); - - const submitHandler = async (values: Question): Promise => { - const { updateQuestion } = await api().updateQuestion({ - id: values.id, - naturalKey: values.naturalKey, - question: values.question, - config: values.config ? JSON.stringify(values.config) : undefined, - }); - - if (updateQuestion) { - onUpdated?.({ - ...question, - ...updateQuestion, - }); - closeMe?.(); - } - }; - - const deleteHandler = () => - confirm( - async () => { - const { deleteQuestion } = await api().deleteQuestion({ - questionId: question.id, - }); - if (deleteQuestion) { - onDeleted?.(deleteQuestion); - closeMe?.(); - } - }, - { - title: 'Delete question', - description: 'Are you sure you want to delete this question?', - } - )(); - - return ( - - ({ - marginTop: theme.spacing(2), - marginBottom: theme.spacing(1), - display: 'flex', - alignItems: 'center', - color: theme.palette.grey[600], - '& SVG': { - marginRight: theme.spacing(1), - }, - })} - > - {definition.icon} - {definition.name} - - - {(formikProps) => ( -
- {children?.(formikProps)} - - - - - - - )} -
-
- ); - } -); +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; +import { Form, Formik } from 'formik'; +import React from 'react'; + +import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; +import { + getQuestionaryComponentDefinition, + QuestionFormProps, +} from 'components/questionary/QuestionaryComponentRegistry'; +import { Question } from 'generated/sdk'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; +import withConfirm, { WithConfirmType } from 'utils/withConfirm'; + +import { QuestionReadPermissionsConfig } from '../QuestionReadPermissionsConfig'; + +interface QuestionFormShellProps extends QuestionFormProps { + validationSchema: unknown; + confirm: WithConfirmType; +} + +export const QuestionFormShell = withConfirm( + (props: QuestionFormShellProps) => { + const { question, validationSchema, confirm, children } = props; + const { onUpdated, onDeleted, closeMe } = props; + const { api } = useDataApiWithFeedback(); + const definition = getQuestionaryComponentDefinition(question.dataType); + + const submitHandler = async (values: Question): Promise => { + const { updateQuestion } = await api().updateQuestion({ + id: values.id, + naturalKey: values.naturalKey, + question: values.question, + config: values.config ? JSON.stringify(values.config) : undefined, + }); + + if (updateQuestion) { + onUpdated?.({ + ...question, + ...updateQuestion, + }); + closeMe?.(); + } + }; + + const deleteHandler = () => + confirm( + async () => { + const { deleteQuestion } = await api().deleteQuestion({ + questionId: question.id, + }); + if (deleteQuestion) { + onDeleted?.(deleteQuestion); + closeMe?.(); + } + }, + { + title: 'Delete question', + description: 'Are you sure you want to delete this question?', + } + )(); + + return ( + + ({ + marginTop: theme.spacing(2), + marginBottom: theme.spacing(1), + display: 'flex', + alignItems: 'center', + color: theme.palette.grey[600], + '& SVG': { + marginRight: theme.spacing(1), + }, + })} + > + {definition.icon} + {definition.name} + + + {(formikProps) => ( +
+ {children?.(formikProps)} + + + + + + + )} +
+
+ ); + } +); diff --git a/apps/frontend/src/components/questionary/questionaryComponents/QuestionTemplateRelationFormShell.tsx b/apps/frontend/src/components/questionary/questionaryComponents/QuestionTemplateRelationFormShell.tsx index a6b182f3ce..7a62893a90 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/QuestionTemplateRelationFormShell.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/QuestionTemplateRelationFormShell.tsx @@ -1,144 +1,144 @@ -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import Link from '@mui/material/Link'; -import Typography from '@mui/material/Typography'; -import { Form, Formik } from 'formik'; -import React from 'react'; - -import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; -import { - getQuestionaryComponentDefinition, - QuestionTemplateRelationFormProps, -} from 'components/questionary/QuestionaryComponentRegistry'; -import { FieldDependencyInput, QuestionTemplateRelation } from 'generated/sdk'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; - -import { QuestionReadPermissionsConfig } from '../QuestionReadPermissionsConfig'; - -// Have this until GQL accepts Union types -// https://github.com/graphql/graphql-spec/blob/master/rfcs/InputUnion.md -const prepareDependencies = (dependency: FieldDependencyInput) => { - return { - ...dependency, - condition: { - ...dependency?.condition, - params: JSON.stringify({ value: dependency?.condition.params }), - }, - }; -}; - -export const QuestionTemplateRelationFormShell = ( - props: QuestionTemplateRelationFormProps & { validationSchema: unknown } -) => { - const { api } = useDataApiWithFeedback(); - const definition = getQuestionaryComponentDefinition( - props.questionRel.question.dataType - ); - - const submitHandler = async ( - values: QuestionTemplateRelation - ): Promise => { - api() - .updateQuestionTemplateRelationSettings({ - templateId: props.template.templateId, - questionId: values.question.id, - config: values.config ? JSON.stringify(values.config) : undefined, - dependencies: values.dependencies - ? values.dependencies.map((dependency) => - prepareDependencies(dependency) - ) - : [], - dependenciesOperator: values.dependenciesOperator, - }) - .then((data) => { - if (data.updateQuestionTemplateRelationSettings) { - props.onUpdated?.(data.updateQuestionTemplateRelationSettings); - props.closeMe?.(); - } - }); - }; - - const deleteHandler = async () => { - const { deleteQuestionTemplateRelation } = - await api().deleteQuestionTemplateRelation({ - templateId: props.template.templateId, - questionId: props.questionRel.question.id, - }); - - if (deleteQuestionTemplateRelation) { - props.onDeleted?.(deleteQuestionTemplateRelation); - props.closeMe?.(); - } - }; - - return ( - - ({ - marginTop: theme.spacing(2), - marginBottom: '21px', - display: 'flex', - alignItems: 'center', - color: theme.palette.grey[600], - '& SVG': { - marginRight: theme.spacing(1), - }, - })} - > - {definition.icon} - {definition.name} - - { - props.onOpenQuestionClicked?.(props.questionRel.question); - props.closeMe?.(); - }} - sx={{ - fontSize: '16px', - paddingLeft: '21px', - display: 'block', - marginBottom: '16px', - }} - > - Edit {props.questionRel.question.naturalKey} - - - {(formikProps) => ( -
- {props.children?.(formikProps)} - - - - - - - )} -
-
- ); -}; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Link from '@mui/material/Link'; +import Typography from '@mui/material/Typography'; +import { Form, Formik } from 'formik'; +import React from 'react'; + +import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; +import { + getQuestionaryComponentDefinition, + QuestionTemplateRelationFormProps, +} from 'components/questionary/QuestionaryComponentRegistry'; +import { FieldDependencyInput, QuestionTemplateRelation } from 'generated/sdk'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; + +import { QuestionReadPermissionsConfig } from '../QuestionReadPermissionsConfig'; + +// Have this until GQL accepts Union types +// https://github.com/graphql/graphql-spec/blob/master/rfcs/InputUnion.md +const prepareDependencies = (dependency: FieldDependencyInput) => { + return { + ...dependency, + condition: { + ...dependency?.condition, + params: JSON.stringify({ value: dependency?.condition.params }), + }, + }; +}; + +export const QuestionTemplateRelationFormShell = ( + props: QuestionTemplateRelationFormProps & { validationSchema: unknown } +) => { + const { api } = useDataApiWithFeedback(); + const definition = getQuestionaryComponentDefinition( + props.questionRel.question.dataType + ); + + const submitHandler = async ( + values: QuestionTemplateRelation + ): Promise => { + api() + .updateQuestionTemplateRelationSettings({ + templateId: props.template.templateId, + questionId: values.question.id, + config: values.config ? JSON.stringify(values.config) : undefined, + dependencies: values.dependencies + ? values.dependencies.map((dependency) => + prepareDependencies(dependency) + ) + : [], + dependenciesOperator: values.dependenciesOperator, + }) + .then((data) => { + if (data.updateQuestionTemplateRelationSettings) { + props.onUpdated?.(data.updateQuestionTemplateRelationSettings); + props.closeMe?.(); + } + }); + }; + + const deleteHandler = async () => { + const { deleteQuestionTemplateRelation } = + await api().deleteQuestionTemplateRelation({ + templateId: props.template.templateId, + questionId: props.questionRel.question.id, + }); + + if (deleteQuestionTemplateRelation) { + props.onDeleted?.(deleteQuestionTemplateRelation); + props.closeMe?.(); + } + }; + + return ( + + ({ + marginTop: theme.spacing(2), + marginBottom: '21px', + display: 'flex', + alignItems: 'center', + color: theme.palette.grey[600], + '& SVG': { + marginRight: theme.spacing(1), + }, + })} + > + {definition.icon} + {definition.name} + + { + props.onOpenQuestionClicked?.(props.questionRel.question); + props.closeMe?.(); + }} + sx={{ + fontSize: '16px', + paddingLeft: '21px', + display: 'block', + marginBottom: '16px', + }} + > + Edit {props.questionRel.question.naturalKey} + + + {(formikProps) => ( +
+ {props.children?.(formikProps)} + + + + + + + )} +
+
+ ); +}; diff --git a/apps/frontend/src/components/questionary/questionaryComponents/QuestionnairesList.tsx b/apps/frontend/src/components/questionary/questionaryComponents/QuestionnairesList.tsx index 43a3857140..8fd69f54e2 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/QuestionnairesList.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/QuestionnairesList.tsx @@ -1,4 +1,4 @@ -import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutline'; +import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutlined'; import { Box } from '@mui/material'; import Button from '@mui/material/Button'; import List from '@mui/material/List'; @@ -82,7 +82,11 @@ export function QuestionnairesList({ })} )} - + {`${data.length} item(s)`} - {isError && {fieldError}} {paragraphSpacingError && ( diff --git a/apps/frontend/src/components/questionary/questionaryComponents/SampleBasis/QuestionaryComponentSampleBasis.tsx b/apps/frontend/src/components/questionary/questionaryComponents/SampleBasis/QuestionaryComponentSampleBasis.tsx index 73724662b0..feaf5f8f60 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/SampleBasis/QuestionaryComponentSampleBasis.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/SampleBasis/QuestionaryComponentSampleBasis.tsx @@ -1,99 +1,99 @@ -import { Field } from 'formik'; -import React, { ChangeEvent, useContext, useState } from 'react'; - -import TextField from 'components/common/FormikUITextField'; -import withPreventSubmit from 'components/common/withPreventSubmit'; -import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; -import { - createMissingContextErrorMessage, - QuestionaryContext, -} from 'components/questionary/QuestionaryContext'; -import { SubmitActionDependencyContainer } from 'hooks/questionary/useSubmitActions'; -import { SampleSubmissionState } from 'models/questionary/sample/SampleSubmissionState'; - -import { SampleContextType } from '../SampleDeclaration/SampleDeclarationContainer'; - -const TextFieldNoSubmit = withPreventSubmit(TextField); - -function QuestionaryComponentSampleBasis(props: BasicComponentProps) { - const { - answer: { - question: { id }, - }, - } = props; - - const { dispatch, state } = useContext( - QuestionaryContext - ) as SampleContextType; - - const [title, setTitle] = useState(state?.sample.title || ''); - - if (!state || !dispatch) { - throw new Error(createMissingContextErrorMessage()); - } - - return ( - ) => { - setTitle(event.currentTarget.value); - }, - onBlur: () => { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: { title: title }, - }); - }, - }} - required - fullWidth - component={TextFieldNoSubmit} - data-cy="title-input" - margin="dense" - /> - ); -} - -const sampleBasisPreSubmit = - () => - async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { - const sample = (state as SampleSubmissionState).sample; - const title = sample.title; - - let returnValue = state.questionary.questionaryId; - - if (sample.id > 0) { - const result = await api.updateSample({ - title: title, - sampleId: sample.id, - }); - if (result.updateSample) { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: result.updateSample, - }); - } - } else { - const result = await api.createSample({ - title: title, - templateId: state.questionary.templateId, - proposalPk: sample.proposalPk, - questionId: sample.questionId, - }); - - if (result.createSample) { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_CREATED', - itemWithQuestionary: result.createSample, - }); - returnValue = result.createSample.questionaryId; - } - } - - return returnValue; - }; - -export { QuestionaryComponentSampleBasis, sampleBasisPreSubmit }; +import { Field } from 'formik'; +import React, { ChangeEvent, useContext, useState } from 'react'; + +import TextField from 'components/common/FormikUITextField'; +import withPreventSubmit from 'components/common/withPreventSubmit'; +import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; +import { + createMissingContextErrorMessage, + QuestionaryContext, +} from 'components/questionary/QuestionaryContext'; +import { SubmitActionDependencyContainer } from 'hooks/questionary/useSubmitActions'; +import { SampleSubmissionState } from 'models/questionary/sample/SampleSubmissionState'; + +import { SampleContextType } from '../SampleDeclaration/SampleDeclarationContainer'; + +const TextFieldNoSubmit = withPreventSubmit(TextField); + +function QuestionaryComponentSampleBasis(props: BasicComponentProps) { + const { + answer: { + question: { id }, + }, + } = props; + + const { dispatch, state } = useContext( + QuestionaryContext + ) as SampleContextType; + + const [title, setTitle] = useState(state?.sample.title || ''); + + if (!state || !dispatch) { + throw new Error(createMissingContextErrorMessage()); + } + + return ( + ) => { + setTitle(event.currentTarget.value); + }, + onBlur: () => { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: { title: title }, + }); + }, + }} + required + fullWidth + component={TextFieldNoSubmit} + data-cy="title-input" + margin="dense" + /> + ); +} + +const sampleBasisPreSubmit = + () => + async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { + const sample = (state as SampleSubmissionState).sample; + const title = sample.title; + + let returnValue = state.questionary.questionaryId; + + if (sample.id > 0) { + const result = await api.updateSample({ + title: title, + sampleId: sample.id, + }); + if (result.updateSample) { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: result.updateSample, + }); + } + } else { + const result = await api.createSample({ + title: title, + templateId: state.questionary.templateId, + proposalPk: sample.proposalPk, + questionId: sample.questionId, + }); + + if (result.createSample) { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_CREATED', + itemWithQuestionary: result.createSample, + }); + returnValue = result.createSample.questionaryId; + } + } + + return returnValue; + }; + +export { QuestionaryComponentSampleBasis, sampleBasisPreSubmit }; diff --git a/apps/frontend/src/components/questionary/questionaryComponents/SampleDeclaration/QuestionaryComponentSampleDeclaration.tsx b/apps/frontend/src/components/questionary/questionaryComponents/SampleDeclaration/QuestionaryComponentSampleDeclaration.tsx index 46c0b659fb..785a09afdc 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/SampleDeclaration/QuestionaryComponentSampleDeclaration.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/SampleDeclaration/QuestionaryComponentSampleDeclaration.tsx @@ -1,264 +1,264 @@ -import { DialogContent } from '@mui/material'; -import InputLabel from '@mui/material/InputLabel'; -import Paper from '@mui/material/Paper'; -import { Field, FieldProps } from 'formik'; -import React, { useContext, useState } from 'react'; - -import ErrorMessage from 'components/common/ErrorMessage'; -import StyledDialog from 'components/common/StyledDialog'; -import UOLoader from 'components/common/UOLoader'; -import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; -import { ProposalContextType } from 'components/proposal/ProposalContainer'; -import { - createMissingContextErrorMessage, - QuestionaryContext, -} from 'components/questionary/QuestionaryContext'; -import { - QuestionaryStep, - SampleStatus, - SubTemplateConfig, -} from 'generated/sdk'; -import { SampleCore } from 'models/questionary/sample/SampleCore'; -import { SampleWithQuestionary } from 'models/questionary/sample/SampleWithQuestionary'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; -import withConfirm, { WithConfirmType } from 'utils/withConfirm'; -import withPrompt, { WithPromptType } from 'utils/withPrompt'; - -import { SampleDeclarationContainer } from './SampleDeclarationContainer'; -import { - QuestionnairesList, - QuestionnairesListRow, -} from '../QuestionnairesList'; - -const sampleToListRow = (sample: SampleCore): QuestionnairesListRow => { - return { - id: sample.id, - label: sample.title, - isCompleted: sample.questionary?.isCompleted ?? false, - }; -}; - -export function createSampleStub( - templateId: number, - questionarySteps: QuestionaryStep[], - proposalPk: number, - questionId: string -): SampleWithQuestionary { - return { - id: 0, - created: new Date(), - creatorId: 0, - questionary: { - questionaryId: 0, - templateId: templateId, - created: new Date(), - steps: questionarySteps, - isCompleted: false, - }, - questionId: questionId, - questionaryId: 0, - isPostProposalSubmission: false, - safetyComment: '', - safetyStatus: SampleStatus.PENDING_EVALUATION, - title: '', - proposalPk: proposalPk, - }; -} - -function QuestionaryComponentSampleDeclaration( - props: BasicComponentProps & { - confirm: WithConfirmType; - prompt: WithPromptType; - } -) { - const { answer, confirm, prompt } = props; - const answerId = answer.question.id; - const config = answer.config as SubTemplateConfig; - const { state, dispatch } = useContext( - QuestionaryContext - ) as ProposalContextType; - - const { api } = useDataApiWithFeedback(); - - const [selectedSample, setSelectedSample] = - useState(null); - - if (!state) { - throw new Error(createMissingContextErrorMessage()); - } - - return ( - - {({ field, form }: FieldProps) => { - const updateFieldValueAndState = ( - updatedItems: SampleCore[] | null - ) => { - form.setFieldValue(answerId, updatedItems); - dispatch({ - type: 'SAMPLE_DECLARATION_ITEMS_MODIFIED', - id: answerId, - questionId: answer.question.id, - newItems: updatedItems, - }); - }; - - const copySample = (id: number, title: string) => - api() - .cloneSample({ sampleId: id, title: title }) - .then((response) => { - const clonedSample = response.cloneSample; - if (clonedSample) { - const newStateItems = [...field.value, clonedSample]; - - updateFieldValueAndState(newStateItems); - setSelectedSample(clonedSample); - } - }); - - const deleteSample = (id: number) => - api() - .deleteSample({ sampleId: id }) - .then(() => { - const newStateItems = field.value.filter( - (sample) => sample.id !== id - ); - - updateFieldValueAndState(newStateItems); - }); - - return ( - <> - - {answer.question.question} - - ({ - padding: '1rem', - marginTop: theme.spacing(1), - })} - > - - api() - .getSample({ sampleId: item.id }) - .then((response) => { - if (response.sample) { - setSelectedSample(response.sample); - } - }) - } - onDeleteClick={(item) => { - confirm(() => deleteSample(item.id), { - title: 'Delete Sample', - description: - 'This action will delete the sample and all data associated with it', - })(); - }} - onCloneClick={(item) => { - prompt((answer) => copySample(item.id, answer), { - question: 'Title', - prefilledAnswer: `Copy of ${item.label}`, - })(); - }} - onAddNewClick={() => { - // TODO move this into a function like copySample - if (!state) { - throw new Error( - 'Sample Declaration is missing proposal context' - ); - } - - const proposalPk = state.proposal.primaryKey; - const questionId = props.answer.question.id; - if (proposalPk <= 0 || !questionId) { - throw new Error( - 'Sample Declaration is missing proposal id and/or question id' - ); - } - const templateId = config.templateId; - - if (!templateId) { - throw new Error('Sample Declaration is missing templateId'); - } - - api() - .getBlankQuestionarySteps({ templateId }) - .then((result) => { - const blankSteps = result.blankQuestionarySteps; - if (blankSteps) { - const sampleStub = createSampleStub( - templateId, - blankSteps, - proposalPk, - questionId - ); - setSelectedSample(sampleStub); - } - }); - }} - {...props} - /> - - - - setSelectedSample(null)} - open={selectedSample !== null} - data-cy="sample-declaration-modal" - maxWidth="md" - fullWidth - title="Sample Declaration" - > - - {selectedSample ? ( - { - const newStateItems = field.value.map((sample) => - sample.id === updatedSample.id - ? updatedSample - : sample - ); - - updateFieldValueAndState(newStateItems); - }} - sampleCreated={(newSample) => { - const newStateItems = [...field.value, newSample]; - - updateFieldValueAndState(newStateItems); - }} - sampleEditDone={() => { - // refresh all samples - api() - .getSamplesWithQuestionaryStatus({ - filter: { - questionId: answer.question.id, - proposalPk: state.proposal.primaryKey, - }, - }) - .then((result) => { - updateFieldValueAndState(result.samples); - }); - - setSelectedSample(null); - }} - > - ) : ( - - )} - - - - - ); - }} - - ); -} - -export default withConfirm(withPrompt(QuestionaryComponentSampleDeclaration)); +import { DialogContent } from '@mui/material'; +import InputLabel from '@mui/material/InputLabel'; +import Paper from '@mui/material/Paper'; +import { Field, FieldProps } from 'formik'; +import React, { useContext, useState } from 'react'; + +import ErrorMessage from 'components/common/ErrorMessage'; +import StyledDialog from 'components/common/StyledDialog'; +import UOLoader from 'components/common/UOLoader'; +import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; +import { ProposalContextType } from 'components/proposal/ProposalContainer'; +import { + createMissingContextErrorMessage, + QuestionaryContext, +} from 'components/questionary/QuestionaryContext'; +import { + QuestionaryStep, + SampleStatus, + SubTemplateConfig, +} from 'generated/sdk'; +import { SampleCore } from 'models/questionary/sample/SampleCore'; +import { SampleWithQuestionary } from 'models/questionary/sample/SampleWithQuestionary'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; +import withConfirm, { WithConfirmType } from 'utils/withConfirm'; +import withPrompt, { WithPromptType } from 'utils/withPrompt'; + +import { SampleDeclarationContainer } from './SampleDeclarationContainer'; +import { + QuestionnairesList, + QuestionnairesListRow, +} from '../QuestionnairesList'; + +const sampleToListRow = (sample: SampleCore): QuestionnairesListRow => { + return { + id: sample.id, + label: sample.title, + isCompleted: sample.questionary?.isCompleted ?? false, + }; +}; + +export function createSampleStub( + templateId: number, + questionarySteps: QuestionaryStep[], + proposalPk: number, + questionId: string +): SampleWithQuestionary { + return { + id: 0, + created: new Date(), + creatorId: 0, + questionary: { + questionaryId: 0, + templateId: templateId, + created: new Date(), + steps: questionarySteps, + isCompleted: false, + }, + questionId: questionId, + questionaryId: 0, + isPostProposalSubmission: false, + safetyComment: '', + safetyStatus: SampleStatus.PENDING_EVALUATION, + title: '', + proposalPk: proposalPk, + }; +} + +function QuestionaryComponentSampleDeclaration( + props: BasicComponentProps & { + confirm: WithConfirmType; + prompt: WithPromptType; + } +) { + const { answer, confirm, prompt } = props; + const answerId = answer.question.id; + const config = answer.config as SubTemplateConfig; + const { state, dispatch } = useContext( + QuestionaryContext + ) as ProposalContextType; + + const { api } = useDataApiWithFeedback(); + + const [selectedSample, setSelectedSample] = + useState(null); + + if (!state) { + throw new Error(createMissingContextErrorMessage()); + } + + return ( + + {({ field, form }: FieldProps) => { + const updateFieldValueAndState = ( + updatedItems: SampleCore[] | null + ) => { + form.setFieldValue(answerId, updatedItems); + dispatch({ + type: 'SAMPLE_DECLARATION_ITEMS_MODIFIED', + id: answerId, + questionId: answer.question.id, + newItems: updatedItems, + }); + }; + + const copySample = (id: number, title: string) => + api() + .cloneSample({ sampleId: id, title: title }) + .then((response) => { + const clonedSample = response.cloneSample; + if (clonedSample) { + const newStateItems = [...field.value, clonedSample]; + + updateFieldValueAndState(newStateItems); + setSelectedSample(clonedSample); + } + }); + + const deleteSample = (id: number) => + api() + .deleteSample({ sampleId: id }) + .then(() => { + const newStateItems = field.value.filter( + (sample) => sample.id !== id + ); + + updateFieldValueAndState(newStateItems); + }); + + return ( + <> + + {answer.question.question} + + ({ + padding: '1rem', + marginTop: theme.spacing(1), + })} + > + + api() + .getSample({ sampleId: item.id }) + .then((response) => { + if (response.sample) { + setSelectedSample(response.sample); + } + }) + } + onDeleteClick={(item) => { + confirm(() => deleteSample(item.id), { + title: 'Delete Sample', + description: + 'This action will delete the sample and all data associated with it', + })(); + }} + onCloneClick={(item) => { + prompt((answer) => copySample(item.id, answer), { + question: 'Title', + prefilledAnswer: `Copy of ${item.label}`, + })(); + }} + onAddNewClick={() => { + // TODO move this into a function like copySample + if (!state) { + throw new Error( + 'Sample Declaration is missing proposal context' + ); + } + + const proposalPk = state.proposal.primaryKey; + const questionId = props.answer.question.id; + if (proposalPk <= 0 || !questionId) { + throw new Error( + 'Sample Declaration is missing proposal id and/or question id' + ); + } + const templateId = config.templateId; + + if (!templateId) { + throw new Error('Sample Declaration is missing templateId'); + } + + api() + .getBlankQuestionarySteps({ templateId }) + .then((result) => { + const blankSteps = result.blankQuestionarySteps; + if (blankSteps) { + const sampleStub = createSampleStub( + templateId, + blankSteps, + proposalPk, + questionId + ); + setSelectedSample(sampleStub); + } + }); + }} + {...props} + /> + + + + setSelectedSample(null)} + open={selectedSample !== null} + data-cy="sample-declaration-modal" + maxWidth="md" + fullWidth + title="Sample Declaration" + > + + {selectedSample ? ( + { + const newStateItems = field.value.map((sample) => + sample.id === updatedSample.id + ? updatedSample + : sample + ); + + updateFieldValueAndState(newStateItems); + }} + sampleCreated={(newSample) => { + const newStateItems = [...field.value, newSample]; + + updateFieldValueAndState(newStateItems); + }} + sampleEditDone={() => { + // refresh all samples + api() + .getSamplesWithQuestionaryStatus({ + filter: { + questionId: answer.question.id, + proposalPk: state.proposal.primaryKey, + }, + }) + .then((result) => { + updateFieldValueAndState(result.samples); + }); + + setSelectedSample(null); + }} + > + ) : ( + + )} + + + + + ); + }} + + ); +} + +export default withConfirm(withPrompt(QuestionaryComponentSampleDeclaration)); diff --git a/apps/frontend/src/components/questionary/questionaryComponents/ShipmentBasis/QuestionaryComponentShipmentBasis.tsx b/apps/frontend/src/components/questionary/questionaryComponents/ShipmentBasis/QuestionaryComponentShipmentBasis.tsx index 79aedd852e..db92ac5d97 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/ShipmentBasis/QuestionaryComponentShipmentBasis.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/ShipmentBasis/QuestionaryComponentShipmentBasis.tsx @@ -1,254 +1,254 @@ -import FormControl from '@mui/material/FormControl'; -import InputLabel from '@mui/material/InputLabel'; -import MenuItem from '@mui/material/MenuItem'; -import Select from '@mui/material/Select'; -import { useTheme } from '@mui/material/styles'; -import TextField from '@mui/material/TextField'; -import Typography from '@mui/material/Typography'; -import { FormikErrors } from 'formik'; -import React, { useContext, useState } from 'react'; - -import MultiMenuItem from 'components/common/MultiMenuItem'; -import withPreventSubmit from 'components/common/withPreventSubmit'; -import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; -import ProposalErrorLabel from 'components/proposal/ProposalErrorLabel'; -import { - createMissingContextErrorMessage, - QuestionaryContext, -} from 'components/questionary/QuestionaryContext'; -import { ShipmentContextType } from 'components/shipments/ShipmentContainer'; -import { UserContext } from 'context/UserContextProvider'; -import { Sample, UserRole } from 'generated/sdk'; -import { useUserProposals } from 'hooks/proposal/useUserProposals'; -import { SubmitActionDependencyContainer } from 'hooks/questionary/useSubmitActions'; -import { useProposalSamples } from 'hooks/sample/useProposalSamples'; -import { - ShipmentBasisFormikData, - ShipmentSubmissionState, -} from 'models/questionary/shipment/ShipmentSubmissionState'; - -const TextFieldNoSubmit = withPreventSubmit(TextField); - -const samplesToSampleIds = (samples: Pick[]) => - samples.map((sample) => sample.id); - -function QuestionaryComponentShipmentBasis(props: BasicComponentProps) { - const { - answer: { - question: { id }, - }, - formikProps: { errors }, - } = props; - - const fieldErrors = errors[id] as FormikErrors>; - const theme = useTheme(); - const { state, dispatch } = useContext( - QuestionaryContext - ) as ShipmentContextType; - - const [title, setTitle] = useState(state?.shipment.title); - const [proposalPk, setProposalPk] = useState( - state?.shipment.proposalPk || null - ); - const [sampleIds, setSampleIds] = useState( - state?.shipment.samples.map((sample) => sample.id) || [] - ); - - const { currentRole } = useContext(UserContext); - const { proposals, loadingProposals } = useUserProposals( - currentRole as UserRole - ); - const { samples, loadingSamples } = useProposalSamples(proposalPk); - - if (!state || !dispatch) { - throw new Error(createMissingContextErrorMessage()); - } - - const handleChange = (changes: Partial) => { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: changes, - }); - }; - - return ( -
- - ) => { - handleChange({ title: event.target.value }); - }} - onChange={(event: React.ChangeEvent) => - setTitle(event.target.value) - } - required - fullWidth - data-cy="title-input" - /> - {fieldErrors?.title} - - - {!loadingProposals && ( - - Select proposal - - {fieldErrors?.proposalPk} - - )} - - {!loadingSamples && ( - - {samples.length > 0 ? ( - <> - Select samples - - - ) : ( - proposalPk && ( - - No samples found for this proposal. Please add samples to the - proposal first. - - ) - )} - {fieldErrors?.samples} - - )} -
- ); -} - -const shipmentBasisPreSubmit = - () => - async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { - const shipment = (state as ShipmentSubmissionState).shipment; - const title = shipment.title; - let shipmentId = shipment.id; - let returnValue = state.questionary.questionaryId; - if (shipmentId > 0) { - const { updateShipment } = await api.updateShipment({ - title: title, - shipmentId: shipment.id, - proposalPk: shipment.proposalPk, - }); - if (updateShipment) { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: { - ...updateShipment, - questionary: { - ...updateShipment.questionary, - steps: state.questionary.steps, - }, - }, - }); - } - } else { - if (!shipment.experimentPk) return returnValue; - const { createShipment } = await api.createShipment({ - title: title, - proposalPk: shipment.proposalPk, - experimentPk: shipment.experimentPk, - }); - if (createShipment) { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_CREATED', - itemWithQuestionary: { - ...createShipment, - questionary: { - ...createShipment.questionary, - steps: state.questionary.steps, - }, - }, - }); - shipmentId = createShipment.id; - returnValue = createShipment.questionaryId; - } else { - return returnValue; - } - } - - const { addSamplesToShipment } = await api.addSamplesToShipment({ - shipmentId: shipmentId, - sampleIds: samplesToSampleIds(shipment.samples), - }); - - if (addSamplesToShipment) { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: { - ...addSamplesToShipment, - questionary: { - ...addSamplesToShipment.questionary, - steps: state.questionary.steps, - }, - }, - }); - } - - return returnValue; - }; - -export { QuestionaryComponentShipmentBasis, shipmentBasisPreSubmit }; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import MenuItem from '@mui/material/MenuItem'; +import Select from '@mui/material/Select'; +import { useTheme } from '@mui/material/styles'; +import TextField from '@mui/material/TextField'; +import Typography from '@mui/material/Typography'; +import { FormikErrors } from 'formik'; +import React, { useContext, useState } from 'react'; + +import MultiMenuItem from 'components/common/MultiMenuItem'; +import withPreventSubmit from 'components/common/withPreventSubmit'; +import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; +import ProposalErrorLabel from 'components/proposal/ProposalErrorLabel'; +import { + createMissingContextErrorMessage, + QuestionaryContext, +} from 'components/questionary/QuestionaryContext'; +import { ShipmentContextType } from 'components/shipments/ShipmentContainer'; +import { UserContext } from 'context/UserContextProvider'; +import { Sample, UserRole } from 'generated/sdk'; +import { useUserProposals } from 'hooks/proposal/useUserProposals'; +import { SubmitActionDependencyContainer } from 'hooks/questionary/useSubmitActions'; +import { useProposalSamples } from 'hooks/sample/useProposalSamples'; +import { + ShipmentBasisFormikData, + ShipmentSubmissionState, +} from 'models/questionary/shipment/ShipmentSubmissionState'; + +const TextFieldNoSubmit = withPreventSubmit(TextField); + +const samplesToSampleIds = (samples: Pick[]) => + samples.map((sample) => sample.id); + +function QuestionaryComponentShipmentBasis(props: BasicComponentProps) { + const { + answer: { + question: { id }, + }, + formikProps: { errors }, + } = props; + + const fieldErrors = errors[id] as FormikErrors>; + const theme = useTheme(); + const { state, dispatch } = useContext( + QuestionaryContext + ) as ShipmentContextType; + + const [title, setTitle] = useState(state?.shipment.title); + const [proposalPk, setProposalPk] = useState( + state?.shipment.proposalPk || null + ); + const [sampleIds, setSampleIds] = useState( + state?.shipment.samples.map((sample) => sample.id) || [] + ); + + const { currentRole } = useContext(UserContext); + const { proposals, loadingProposals } = useUserProposals( + currentRole as UserRole + ); + const { samples, loadingSamples } = useProposalSamples(proposalPk); + + if (!state || !dispatch) { + throw new Error(createMissingContextErrorMessage()); + } + + const handleChange = (changes: Partial) => { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: changes, + }); + }; + + return ( +
+ + ) => { + handleChange({ title: event.target.value }); + }} + onChange={(event: React.ChangeEvent) => + setTitle(event.target.value) + } + required + fullWidth + data-cy="title-input" + /> + {fieldErrors?.title} + + + {!loadingProposals && ( + + Select proposal + + {fieldErrors?.proposalPk} + + )} + + {!loadingSamples && ( + + {samples.length > 0 ? ( + <> + Select samples + + + ) : ( + proposalPk && ( + + No samples found for this proposal. Please add samples to the + proposal first. + + ) + )} + {fieldErrors?.samples} + + )} +
+ ); +} + +const shipmentBasisPreSubmit = + () => + async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { + const shipment = (state as ShipmentSubmissionState).shipment; + const title = shipment.title; + let shipmentId = shipment.id; + let returnValue = state.questionary.questionaryId; + if (shipmentId > 0) { + const { updateShipment } = await api.updateShipment({ + title: title, + shipmentId: shipment.id, + proposalPk: shipment.proposalPk, + }); + if (updateShipment) { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: { + ...updateShipment, + questionary: { + ...updateShipment.questionary, + steps: state.questionary.steps, + }, + }, + }); + } + } else { + if (!shipment.experimentPk) return returnValue; + const { createShipment } = await api.createShipment({ + title: title, + proposalPk: shipment.proposalPk, + experimentPk: shipment.experimentPk, + }); + if (createShipment) { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_CREATED', + itemWithQuestionary: { + ...createShipment, + questionary: { + ...createShipment.questionary, + steps: state.questionary.steps, + }, + }, + }); + shipmentId = createShipment.id; + returnValue = createShipment.questionaryId; + } else { + return returnValue; + } + } + + const { addSamplesToShipment } = await api.addSamplesToShipment({ + shipmentId: shipmentId, + sampleIds: samplesToSampleIds(shipment.samples), + }); + + if (addSamplesToShipment) { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: { + ...addSamplesToShipment, + questionary: { + ...addSamplesToShipment.questionary, + steps: state.questionary.steps, + }, + }, + }); + } + + return returnValue; + }; + +export { QuestionaryComponentShipmentBasis, shipmentBasisPreSubmit }; diff --git a/apps/frontend/src/components/questionary/questionaryComponents/TechnicalReviewBasis/QuestionaryComponentTechnicalReviewBasis.tsx b/apps/frontend/src/components/questionary/questionaryComponents/TechnicalReviewBasis/QuestionaryComponentTechnicalReviewBasis.tsx index e889c0d6c4..6f0d8436fd 100644 --- a/apps/frontend/src/components/questionary/questionaryComponents/TechnicalReviewBasis/QuestionaryComponentTechnicalReviewBasis.tsx +++ b/apps/frontend/src/components/questionary/questionaryComponents/TechnicalReviewBasis/QuestionaryComponentTechnicalReviewBasis.tsx @@ -109,7 +109,11 @@ function QuestionaryComponentTechnicalReviewBasis(props: BasicComponentProps) { - + - + - + + + - + - + Operator @@ -47,7 +47,7 @@ function TextSearchCriteriaComponent({ - + - { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: { startsAt }, - }); - }} - // NOTE: This is needed just because Cypress testing a Material-UI datepicker is not working on Github actions https://stackoverflow.com/a/69986695/5619063 - desktopModeMediaQuery={theme.breakpoints.up('sm')} - /> - { - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: { endsAt }, - }); - }} - // NOTE: This is needed just because Cypress testing a Material-UI datepicker is not working on Github actions https://stackoverflow.com/a/69986695/5619063 - desktopModeMediaQuery={theme.breakpoints.up('sm')} - /> -
- ); -} - -const createVisitRegistration = async ( - api: Sdk, - visitId: number, - userId: number -) => { - const { createVisitRegistration } = await api.createVisitRegistration({ - visitId, - userId, - }); - - return createVisitRegistration; -}; - -const updateVisitRegistration = async ( - api: Sdk, - update: UpdateVisitRegistrationMutationVariables -) => { - const { updateVisitRegistration } = await api.updateVisitRegistration(update); - - return updateVisitRegistration; -}; - -const visitBasisPreSubmit = - () => - async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { - const { registration } = state as VisitRegistrationSubmissionState; - - const isStarted = !!registration.questionary.questionaryId; - - if (isStarted === false) { - await createVisitRegistration( - api, - registration.visitId, - registration.userId - ); - const newRegistration = await updateVisitRegistration(api, registration); - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_CREATED', - itemWithQuestionary: newRegistration, - }); - - return newRegistration.questionary.questionaryId; - } else { - const updRegistration = await updateVisitRegistration(api, registration); - dispatch({ - type: 'ITEM_WITH_QUESTIONARY_MODIFIED', - itemWithQuestionary: updRegistration, - }); - - return updRegistration.questionary.questionaryId; - } - }; - -export { QuestionaryComponentVisitBasis, visitBasisPreSubmit }; +import { useTheme } from '@mui/material/styles'; +import { AdapterLuxon as DateAdapter } from '@mui/x-date-pickers/AdapterLuxon'; +import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; +import { Field } from 'formik'; +import { DateTime } from 'luxon'; +import React, { useContext } from 'react'; + +import DatePicker from 'components/common/FormikUIDatePicker'; +import { BasicComponentProps } from 'components/proposal/IBasicComponentProps'; +import { + createMissingContextErrorMessage, + QuestionaryContext, +} from 'components/questionary/QuestionaryContext'; +import { VisitRegistrationContextType } from 'components/visit/VisitRegistrationContainer'; +import { + Sdk, + SettingsId, + UpdateVisitRegistrationMutationVariables, +} from 'generated/sdk'; +import { useFormattedDateTime } from 'hooks/admin/useFormattedDateTime'; +import { SubmitActionDependencyContainer } from 'hooks/questionary/useSubmitActions'; +import { VisitRegistrationSubmissionState } from 'models/questionary/visit/VisitRegistrationSubmissionState'; + +function QuestionaryComponentVisitBasis({ answer }: BasicComponentProps) { + const theme = useTheme(); + const { dispatch, state } = useContext( + QuestionaryContext + ) as VisitRegistrationContextType; + const { format } = useFormattedDateTime({ + settingsFormatToUse: SettingsId.DATE_FORMAT, + }); + + if (!state || !dispatch) { + throw new Error(createMissingContextErrorMessage()); + } + + const id = answer.question.id; + + return ( + + { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: { startsAt }, + }); + }} + // NOTE: This is needed just because Cypress testing a Material-UI datepicker is not working on Github actions https://stackoverflow.com/a/69986695/5619063 + desktopModeMediaQuery={theme.breakpoints.up('sm')} + /> + { + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: { endsAt }, + }); + }} + // NOTE: This is needed just because Cypress testing a Material-UI datepicker is not working on Github actions https://stackoverflow.com/a/69986695/5619063 + desktopModeMediaQuery={theme.breakpoints.up('sm')} + /> + + ); +} + +const createVisitRegistration = async ( + api: Sdk, + visitId: number, + userId: number +) => { + const { createVisitRegistration } = await api.createVisitRegistration({ + visitId, + userId, + }); + + return createVisitRegistration; +}; + +const updateVisitRegistration = async ( + api: Sdk, + update: UpdateVisitRegistrationMutationVariables +) => { + const { updateVisitRegistration } = await api.updateVisitRegistration(update); + + return updateVisitRegistration; +}; + +const visitBasisPreSubmit = + () => + async ({ api, dispatch, state }: SubmitActionDependencyContainer) => { + const { registration } = state as VisitRegistrationSubmissionState; + + const isStarted = !!registration.questionary.questionaryId; + + if (isStarted === false) { + await createVisitRegistration( + api, + registration.visitId, + registration.userId + ); + const newRegistration = await updateVisitRegistration(api, registration); + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_CREATED', + itemWithQuestionary: newRegistration, + }); + + return newRegistration.questionary.questionaryId; + } else { + const updRegistration = await updateVisitRegistration(api, registration); + dispatch({ + type: 'ITEM_WITH_QUESTIONARY_MODIFIED', + itemWithQuestionary: updRegistration, + }); + + return updRegistration.questionary.questionaryId; + } + }; + +export { QuestionaryComponentVisitBasis, visitBasisPreSubmit }; diff --git a/apps/frontend/src/components/review/AssignTechnicalReview.tsx b/apps/frontend/src/components/review/AssignTechnicalReview.tsx index d0b0b012b5..7acf6718d1 100644 --- a/apps/frontend/src/components/review/AssignTechnicalReview.tsx +++ b/apps/frontend/src/components/review/AssignTechnicalReview.tsx @@ -1,126 +1,130 @@ -import Autocomplete from '@mui/material/Autocomplete'; -import Button from '@mui/material/Button'; -import Grid from '@mui/material/Grid'; -import TextField from '@mui/material/TextField'; -import React, { useState } from 'react'; - -import { UserRole } from 'generated/sdk'; -import { useCheckAccess } from 'hooks/common/useCheckAccess'; -import { - ProposalDataInstrument, - ProposalDataTechnicalReview, -} from 'hooks/proposal/useProposalData'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; -import { getFullUserName } from 'utils/user'; -import withConfirm, { WithConfirmType } from 'utils/withConfirm'; - -type AssignTechnicalReviewProps = { - technicalReview: ProposalDataTechnicalReview; - instrument: ProposalDataInstrument; - onTechnicalReviewUpdated: ( - updatedTechnicalReview: ProposalDataTechnicalReview - ) => void; - confirm: WithConfirmType; -}; - -function AssignTechnicalReview({ - technicalReview, - instrument, - onTechnicalReviewUpdated, - confirm, -}: AssignTechnicalReviewProps) { - const { api } = useDataApiWithFeedback(); - const isUserOfficer = useCheckAccess([UserRole.USER_OFFICER]); - const isInternalReviewer = useCheckAccess([UserRole.INTERNAL_REVIEWER]); - - const [selectedUser, setSelectedUser] = useState( - technicalReview?.technicalReviewAssigneeId - ); - - const usersData = instrument?.scientists ? [...instrument.scientists] : []; - const instrumentContactAlreadyExists = instrument?.scientists.find( - (scientist) => scientist.id === instrument?.instrumentContact?.id - ); - - if (instrument?.instrumentContact && !instrumentContactAlreadyExists) { - usersData.push(instrument?.instrumentContact); - } - - const userIdToUser = (userId?: number | null) => - usersData.find((user) => user.id === userId); - - return ( - - - ( - - )} - getOptionLabel={(option) => getFullUserName(option)} - onChange={(_event, newValue) => { - if (newValue) { - setSelectedUser(newValue.id); - } - }} - value={userIdToUser(selectedUser)} - disableClearable - data-cy="user-list" - disabled={ - (!isUserOfficer && technicalReview?.submitted) || isInternalReviewer - } - ListboxProps={{ title: 'user-list-options' }} - /> - - - - - - ); -} - -export default withConfirm(AssignTechnicalReview); +import Autocomplete from '@mui/material/Autocomplete'; +import Button from '@mui/material/Button'; +import Grid from '@mui/material/Grid'; +import TextField from '@mui/material/TextField'; +import React, { useState } from 'react'; + +import { UserRole } from 'generated/sdk'; +import { useCheckAccess } from 'hooks/common/useCheckAccess'; +import { + ProposalDataInstrument, + ProposalDataTechnicalReview, +} from 'hooks/proposal/useProposalData'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; +import { getFullUserName } from 'utils/user'; +import withConfirm, { WithConfirmType } from 'utils/withConfirm'; + +type AssignTechnicalReviewProps = { + technicalReview: ProposalDataTechnicalReview; + instrument: ProposalDataInstrument; + onTechnicalReviewUpdated: ( + updatedTechnicalReview: ProposalDataTechnicalReview + ) => void; + confirm: WithConfirmType; +}; + +function AssignTechnicalReview({ + technicalReview, + instrument, + onTechnicalReviewUpdated, + confirm, +}: AssignTechnicalReviewProps) { + const { api } = useDataApiWithFeedback(); + const isUserOfficer = useCheckAccess([UserRole.USER_OFFICER]); + const isInternalReviewer = useCheckAccess([UserRole.INTERNAL_REVIEWER]); + + const [selectedUser, setSelectedUser] = useState( + technicalReview?.technicalReviewAssigneeId + ); + + const usersData = instrument?.scientists ? [...instrument.scientists] : []; + const instrumentContactAlreadyExists = instrument?.scientists.find( + (scientist) => scientist.id === instrument?.instrumentContact?.id + ); + + if (instrument?.instrumentContact && !instrumentContactAlreadyExists) { + usersData.push(instrument?.instrumentContact); + } + + const userIdToUser = (userId?: number | null) => + usersData.find((user) => user.id === userId); + + return ( + + + ( + + )} + getOptionLabel={(option) => getFullUserName(option)} + onChange={(_event, newValue) => { + if (newValue) { + setSelectedUser(newValue.id); + } + }} + value={userIdToUser(selectedUser)} + disableClearable + data-cy="user-list" + disabled={ + (!isUserOfficer && technicalReview?.submitted) || isInternalReviewer + } + slotProps={{ + listbox: { title: 'user-list-options' } + }} + /> + + + + + + ); +} + +export default withConfirm(AssignTechnicalReview); diff --git a/apps/frontend/src/components/review/ProposalReviewContent.tsx b/apps/frontend/src/components/review/ProposalReviewContent.tsx index 7ebbe8f9d0..57d52b3c77 100644 --- a/apps/frontend/src/components/review/ProposalReviewContent.tsx +++ b/apps/frontend/src/components/review/ProposalReviewContent.tsx @@ -1,309 +1,314 @@ -import { Paper, Typography } from '@mui/material'; -import Box from '@mui/material/Box'; -import Button from '@mui/material/Button'; -import React, { Fragment, useContext } from 'react'; -import { useTranslation } from 'react-i18next'; - -import SimpleTabs from 'components/common/SimpleTabs'; -import UOLoader from 'components/common/UOLoader'; -import EventLogList from 'components/eventLog/EventLogList'; -import ExternalReviews from 'components/fap/MeetingComponents/ProposalViewModal/ExternalReviews'; -import FapMeetingDecision from 'components/fap/MeetingComponents/ProposalViewModal/FapMeetingDecision'; -import GeneralInformation from 'components/proposal/GeneralInformation'; -import ProposalAdmin, { - AdministrationFormData, -} from 'components/proposal/ProposalAdmin'; -import ProposalAdminReadOnly from 'components/proposal/ProposalAdminReadOnly'; -import { UserContext } from 'context/UserContextProvider'; -import { - CoreTechnicalReviewFragment, - InstrumentWithManagementTime, - Review, - TechnicalReview, - UserRole, -} from 'generated/sdk'; -import { useCheckAccess } from 'hooks/common/useCheckAccess'; -import { - ProposalDataTechnicalReview, - useProposalData, -} from 'hooks/proposal/useProposalData'; -import { getFullUserName } from 'utils/user'; - -import ProposalReviewContainer from './ProposalReviewContainer'; -import ProposalTechnicalReviewerAssignment from './ProposalTechnicalReviewerAssignment'; -import TechnicalReviewContainer from './TechnicalReviewContainer'; -import TechnicalReviewQuestionaryReview from './TechnicalReviewQuestionaryReview'; -import InternalReviews from '../internalReview/InternalReviews'; - -export enum PROPOSAL_MODAL_TAB_NAMES { - PROPOSAL_INFORMATION = 'Proposal information', - TECHNICAL_REVIEW = 'Technical reviews', - REVIEWS = 'FAP reviews', - ADMIN = 'Admin', - GRADE = 'Grade', - LOGS = 'Logs', -} - -type ProposalReviewContentProps = { - tabNames: PROPOSAL_MODAL_TAB_NAMES[]; - proposalPk?: number | null; - reviewId?: number | null; - fapId?: number | null; - fapSec?: number[] | null; - isInsideModal?: boolean; -}; - -const ProposalReviewContent = ({ - proposalPk, - tabNames, - reviewId, - fapId, - fapSec: fapSecs, - isInsideModal, -}: ProposalReviewContentProps) => { - const { user } = useContext(UserContext); - const isUserOfficer = useCheckAccess([UserRole.USER_OFFICER]); - const isProposalReader = useCheckAccess([UserRole.PROPOSAL_READER]); - const isInstrumentScientist = useCheckAccess([UserRole.INSTRUMENT_SCIENTIST]); - const isInternalReviewer = useCheckAccess([UserRole.INTERNAL_REVIEWER]); - const isFapSec = useCheckAccess([UserRole.FAP_SECRETARY]); - const { proposalData, setProposalData, loading } = - useProposalData(proposalPk); - const { t } = useTranslation(); - - if (loading) { - return ; - } - - if (!proposalData) { - return ( - -

Proposal not found

- -
- ); - } - - const ProposalInformationTab = ( - - setProposalData({ - ...proposalData, - ...newProposal, - call: proposalData.call, - }) - } - canEditProposal={true} - /> - ); - - const getTechnicalReviewInstrument = (instrumentId: number) => - proposalData.instruments?.find( - (instrument) => instrument?.id === instrumentId - ); - - const canEditAsFapSec = - isFapSec && fapSecs && fapSecs.find((userId) => userId === user.id); - - const technicalReviewsContent = proposalData.technicalReviews.map( - (technicalReview) => { - const technicalReviewInstrument = getTechnicalReviewInstrument( - technicalReview.instrumentId - ); - - const canEditAsInstrumentSci = - isInstrumentScientist && - (technicalReview?.technicalReviewAssigneeId === user.id || - (technicalReviewInstrument?.scientists.some( - (scientist) => scientist.id === user.id - ) && - technicalReviewInstrument.multipleTechReviewsEnabled)); - - return isUserOfficer || - isFapSec || - canEditAsFapSec || - canEditAsInstrumentSci || - isInternalReviewer ? ( - - {!!technicalReview && ( - - )} - {!!technicalReviewInstrument && !canEditAsFapSec && !isFapSec && ( - { - setProposalData({ - ...proposalData, - technicalReviews: - proposalData.technicalReviews.map((tReview) => - updatedTechnicalReview.id === tReview.id - ? updatedTechnicalReview - : tReview - ) || [], - }); - }} - /> - )} - ({ - padding: theme.spacing(2), - marginTop: 0, - marginBottom: theme.spacing(2), - })} - > - - {`Reviewed by ${getFullUserName(technicalReview.technicalReviewAssignee)}`} - - - setProposalData({ - ...proposalData, - technicalReviews: - proposalData.technicalReviews.map((technicalReview) => { - if (technicalReview.id === data?.id) { - return { ...technicalReview, ...data }; - } else { - return { - ...technicalReview, - }; - } - }) || null, - }) - } - > - - - ) : ( - - ); - } - ); - - const TechnicalReviewTab = proposalData.technicalReviews.length ? ( - proposalData.technicalReviews.length > 1 ? ( - - getTechnicalReviewInstrument(technicalReview.instrumentId) - ?.name || 'None' - ) || [] - } - > - {technicalReviewsContent as JSX.Element[]} - - ) : ( - technicalReviewsContent - ) - ) : ( -
No technical reviews found for the selected proposal
- ); - - const GradeTab = reviewId && ( - - ); - - const AllProposalReviewsTab = (isUserOfficer || isProposalReader) && ( - <> - - - - ); - - const ProposalAdminTab = - (isUserOfficer || isInstrumentScientist || isProposalReader) && - (isUserOfficer || isInstrumentScientist ? ( - - setProposalData({ - ...proposalData, - ...data, - instruments: - proposalData.instruments?.map((instrument) => ({ - ...(instrument as InstrumentWithManagementTime), - managementTimeAllocation: - data.managementTimeAllocations?.find( - (item) => item.instrumentId === instrument?.id - )?.value ?? null, - })) || [], - }) - } - /> - ) : ( - - )); - - const EventLogsTab = (isUserOfficer || isProposalReader) && ( - - ); - - const tabsContent = tabNames.map((tab, index) => { - switch (tab) { - case PROPOSAL_MODAL_TAB_NAMES.PROPOSAL_INFORMATION: - return {ProposalInformationTab}; - case PROPOSAL_MODAL_TAB_NAMES.TECHNICAL_REVIEW: - return {TechnicalReviewTab}; - case PROPOSAL_MODAL_TAB_NAMES.REVIEWS: - return {AllProposalReviewsTab}; - case PROPOSAL_MODAL_TAB_NAMES.ADMIN: - return {ProposalAdminTab}; - case PROPOSAL_MODAL_TAB_NAMES.LOGS: - return {EventLogsTab}; - case PROPOSAL_MODAL_TAB_NAMES.GRADE: - return {GradeTab}; - default: - return null; - } - }); - - return ( - <> - {tabNames.length > 1 ? ( - t(name))} - isInsideModal={isInsideModal} - data-cy="proposal-review-tabs" - > - {tabsContent} - - ) : ( - <>{tabsContent} - )} - - ); -}; - -export default ProposalReviewContent; +import { Paper, Typography } from '@mui/material'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import React, { Fragment, useContext } from 'react'; +import { useTranslation } from 'react-i18next'; + +import SimpleTabs from 'components/common/SimpleTabs'; +import UOLoader from 'components/common/UOLoader'; +import EventLogList from 'components/eventLog/EventLogList'; +import ExternalReviews from 'components/fap/MeetingComponents/ProposalViewModal/ExternalReviews'; +import FapMeetingDecision from 'components/fap/MeetingComponents/ProposalViewModal/FapMeetingDecision'; +import GeneralInformation from 'components/proposal/GeneralInformation'; +import ProposalAdmin, { + AdministrationFormData, +} from 'components/proposal/ProposalAdmin'; +import ProposalAdminReadOnly from 'components/proposal/ProposalAdminReadOnly'; +import { UserContext } from 'context/UserContextProvider'; +import { + CoreTechnicalReviewFragment, + InstrumentWithManagementTime, + Review, + TechnicalReview, + UserRole, +} from 'generated/sdk'; +import { useCheckAccess } from 'hooks/common/useCheckAccess'; +import { + ProposalDataTechnicalReview, + useProposalData, +} from 'hooks/proposal/useProposalData'; +import { getFullUserName } from 'utils/user'; + +import ProposalReviewContainer from './ProposalReviewContainer'; +import ProposalTechnicalReviewerAssignment from './ProposalTechnicalReviewerAssignment'; +import TechnicalReviewContainer from './TechnicalReviewContainer'; +import TechnicalReviewQuestionaryReview from './TechnicalReviewQuestionaryReview'; +import InternalReviews from '../internalReview/InternalReviews'; + +export enum PROPOSAL_MODAL_TAB_NAMES { + PROPOSAL_INFORMATION = 'Proposal information', + TECHNICAL_REVIEW = 'Technical reviews', + REVIEWS = 'FAP reviews', + ADMIN = 'Admin', + GRADE = 'Grade', + LOGS = 'Logs', +} + +type ProposalReviewContentProps = { + tabNames: PROPOSAL_MODAL_TAB_NAMES[]; + proposalPk?: number | null; + reviewId?: number | null; + fapId?: number | null; + fapSec?: number[] | null; + isInsideModal?: boolean; +}; + +const ProposalReviewContent = ({ + proposalPk, + tabNames, + reviewId, + fapId, + fapSec: fapSecs, + isInsideModal, +}: ProposalReviewContentProps) => { + const { user } = useContext(UserContext); + const isUserOfficer = useCheckAccess([UserRole.USER_OFFICER]); + const isProposalReader = useCheckAccess([UserRole.PROPOSAL_READER]); + const isInstrumentScientist = useCheckAccess([UserRole.INSTRUMENT_SCIENTIST]); + const isInternalReviewer = useCheckAccess([UserRole.INTERNAL_REVIEWER]); + const isFapSec = useCheckAccess([UserRole.FAP_SECRETARY]); + const { proposalData, setProposalData, loading } = + useProposalData(proposalPk); + const { t } = useTranslation(); + + if (loading) { + return ; + } + + if (!proposalData) { + return ( + +

Proposal not found

+ +
+ ); + } + + const ProposalInformationTab = ( + + setProposalData({ + ...proposalData, + ...newProposal, + call: proposalData.call, + }) + } + canEditProposal={true} + /> + ); + + const getTechnicalReviewInstrument = (instrumentId: number) => + proposalData.instruments?.find( + (instrument) => instrument?.id === instrumentId + ); + + const canEditAsFapSec = + isFapSec && fapSecs && fapSecs.find((userId) => userId === user.id); + + const technicalReviewsContent = proposalData.technicalReviews.map( + (technicalReview) => { + const technicalReviewInstrument = getTechnicalReviewInstrument( + technicalReview.instrumentId + ); + + const canEditAsInstrumentSci = + isInstrumentScientist && + (technicalReview?.technicalReviewAssigneeId === user.id || + (technicalReviewInstrument?.scientists.some( + (scientist) => scientist.id === user.id + ) && + technicalReviewInstrument.multipleTechReviewsEnabled)); + + return isUserOfficer || + isFapSec || + canEditAsFapSec || + canEditAsInstrumentSci || + isInternalReviewer ? ( + + {!!technicalReview && ( + + )} + {!!technicalReviewInstrument && !canEditAsFapSec && !isFapSec && ( + { + setProposalData({ + ...proposalData, + technicalReviews: + proposalData.technicalReviews.map((tReview) => + updatedTechnicalReview.id === tReview.id + ? updatedTechnicalReview + : tReview + ) || [], + }); + }} + /> + )} + ({ + padding: theme.spacing(2), + marginTop: 0, + marginBottom: theme.spacing(2), + })} + > + + {`Reviewed by ${getFullUserName(technicalReview.technicalReviewAssignee)}`} + + + setProposalData({ + ...proposalData, + technicalReviews: + proposalData.technicalReviews.map((technicalReview) => { + if (technicalReview.id === data?.id) { + return { ...technicalReview, ...data }; + } else { + return { + ...technicalReview, + }; + } + }) || null, + }) + } + > + + + ) : ( + + ); + } + ); + + const TechnicalReviewTab = proposalData.technicalReviews.length ? ( + proposalData.technicalReviews.length > 1 ? ( + + getTechnicalReviewInstrument(technicalReview.instrumentId) + ?.name || 'None' + ) || [] + } + > + {technicalReviewsContent as JSX.Element[]} + + ) : ( + technicalReviewsContent + ) + ) : ( +
No technical reviews found for the selected proposal
+ ); + + const GradeTab = reviewId && ( + + ); + + const AllProposalReviewsTab = (isUserOfficer || isProposalReader) && ( + <> + + + + ); + + const ProposalAdminTab = + (isUserOfficer || isInstrumentScientist || isProposalReader) && + (isUserOfficer || isInstrumentScientist ? ( + + setProposalData({ + ...proposalData, + ...data, + instruments: + proposalData.instruments?.map((instrument) => ({ + ...(instrument as InstrumentWithManagementTime), + managementTimeAllocation: + data.managementTimeAllocations?.find( + (item) => item.instrumentId === instrument?.id + )?.value ?? null, + })) || [], + }) + } + /> + ) : ( + + )); + + const EventLogsTab = (isUserOfficer || isProposalReader) && ( + + ); + + const tabsContent = tabNames.map((tab, index) => { + switch (tab) { + case PROPOSAL_MODAL_TAB_NAMES.PROPOSAL_INFORMATION: + return {ProposalInformationTab}; + case PROPOSAL_MODAL_TAB_NAMES.TECHNICAL_REVIEW: + return {TechnicalReviewTab}; + case PROPOSAL_MODAL_TAB_NAMES.REVIEWS: + return {AllProposalReviewsTab}; + case PROPOSAL_MODAL_TAB_NAMES.ADMIN: + return {ProposalAdminTab}; + case PROPOSAL_MODAL_TAB_NAMES.LOGS: + return {EventLogsTab}; + case PROPOSAL_MODAL_TAB_NAMES.GRADE: + return {GradeTab}; + default: + return null; + } + }); + + return ( + <> + {tabNames.length > 1 ? ( + t(name))} + isInsideModal={isInsideModal} + data-cy="proposal-review-tabs" + > + {tabsContent} + + ) : ( + <>{tabsContent} + )} + + ); +}; + +export default ProposalReviewContent; diff --git a/apps/frontend/src/components/review/ProposalReviewModal.tsx b/apps/frontend/src/components/review/ProposalReviewModal.tsx index 08e8cb3a60..ff4f094787 100644 --- a/apps/frontend/src/components/review/ProposalReviewModal.tsx +++ b/apps/frontend/src/components/review/ProposalReviewModal.tsx @@ -5,7 +5,7 @@ import DialogContent from '@mui/material/DialogContent'; import IconButton from '@mui/material/IconButton'; import Slide from '@mui/material/Slide'; import Toolbar from '@mui/material/Toolbar'; -import { TransitionProps } from '@mui/material/transitions/transition'; +import { TransitionProps } from '@mui/material/transitions'; import Typography from '@mui/material/Typography'; import React from 'react'; @@ -70,7 +70,9 @@ const ProposalReviewModal = ({ open={proposalReviewModalOpen} fullScreen onClose={(): Promise => handleClose()} - TransitionComponent={Transition} + slots={{ + transition: Transition + }} > diff --git a/apps/frontend/src/components/review/ProposalTableReviewer.tsx b/apps/frontend/src/components/review/ProposalTableReviewer.tsx index 5fe4898461..4332106948 100644 --- a/apps/frontend/src/components/review/ProposalTableReviewer.tsx +++ b/apps/frontend/src/components/review/ProposalTableReviewer.tsx @@ -355,8 +355,9 @@ const ProposalTableReviewer = ({ confirm }: { confirm: WithConfirmType }) => { setUserData( (usersData) => - ({ + (({ ...usersData, + reviews: usersData?.reviews.map((review) => { const submittedReview = submitProposalReviewsInput.find( (submittedReviewItem) => @@ -373,8 +374,8 @@ const ProposalTableReviewer = ({ confirm }: { confirm: WithConfirmType }) => { ...review, }; } - }), - }) as UserWithReviewsQuery['me'] + }) + }) as UserWithReviewsQuery['me']) ); } }; @@ -434,20 +435,32 @@ const ProposalTableReviewer = ({ confirm }: { confirm: WithConfirmType }) => { <> {isFapReviewer && ( - + )} - + - + { }} /> - + My proposals All proposals diff --git a/apps/frontend/src/components/settings/apiAccessTokens/CreateUpdateApiAccessToken.tsx b/apps/frontend/src/components/settings/apiAccessTokens/CreateUpdateApiAccessToken.tsx index 8c04e83010..8369236149 100644 --- a/apps/frontend/src/components/settings/apiAccessTokens/CreateUpdateApiAccessToken.tsx +++ b/apps/frontend/src/components/settings/apiAccessTokens/CreateUpdateApiAccessToken.tsx @@ -169,9 +169,6 @@ const CreateUpdateApiAccessToken = ({ {group.items.map((item, index) => ( + size={{ + md: 6, + xs: 12 + }}> } @@ -361,10 +363,10 @@ const CreateUpdateApiAccessToken = ({ /> ({ margin: theme.spacing(2, 0, 2) })} - > - + sx={[{ + justifyContent: "flex-end" + }, (theme) => ({ margin: theme.spacing(2, 0, 2) })]}> + - - )} - - - ); -}; - -export default CreateTemplate; +import Button from '@mui/material/Button'; +import { createTemplateValidationSchema } from '@user-office-software/duo-validation/lib/Template'; +import { Field, Form, Formik } from 'formik'; +import React from 'react'; + +import TextField from 'components/common/FormikUITextField'; +import { TemplateGroupId, TemplateMetadataFragment } from 'generated/sdk'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; + +import { + experimentBody as defaultExperimentBody, + experimentHeader as defaultExperimentHeader, + experimentFooter as defaultExperimentFooter, + experimentDummyData as defaultExperimentDummyData, +} from './ExperimentPdfTemplateDefaultData'; +import { + body as defaultProposalBody, + header as defaultProposalHeader, + footer as defaultProposalFooter, + sampleDeclaration as defaultProposalSampleDeclaration, + dummyData as defaultProposalDummyData, +} from './PdfTemplateDefaultData'; + +const CreateTemplate = (props: { + onComplete: (template: TemplateMetadataFragment) => void; + groupId: TemplateGroupId; +}) => { + const { onComplete, groupId } = props; + const { api } = useDataApiWithFeedback(); + + return ( + <> + => { + const { createTemplate } = await api().createTemplate({ + ...values, + groupId, + }); + if ( + createTemplate.groupId == TemplateGroupId.PROPOSAL_PDF && + createTemplate.proposalPdfTemplate + ) { + await api({ + toastSuccessMessage: 'Template updated successfully!', + }).updateProposalPdfTemplate({ + proposalPdfTemplateId: + createTemplate.proposalPdfTemplate.proposalPdfTemplateId, + templateData: defaultProposalBody, + templateHeader: defaultProposalHeader, + templateFooter: defaultProposalFooter, + templateSampleDeclaration: defaultProposalSampleDeclaration, + dummyData: defaultProposalDummyData, + }); + } else if ( + createTemplate.groupId == TemplateGroupId.EXPERIMENT_SAFETY_PDF && + createTemplate.experimentSafetyPdfTemplate + ) { + await api({ + toastSuccessMessage: 'Template updated successfully!', + }).updateExperimentSafetyPdfTemplate({ + experimentSafetyPdfTemplateId: + createTemplate.experimentSafetyPdfTemplate + .experimentSafetyPdfTemplateId, + templateData: defaultExperimentBody, + templateHeader: defaultExperimentHeader, + templateFooter: defaultExperimentFooter, + dummyData: defaultExperimentDummyData, + }); + } + + onComplete(createTemplate); + }} + validationSchema={createTemplateValidationSchema} + > + {({ isSubmitting }) => ( +
+ + + + + )} +
+ + ); +}; + +export default CreateTemplate; diff --git a/apps/frontend/src/components/template/QuestionPicker.tsx b/apps/frontend/src/components/template/QuestionPicker.tsx index 20ebf005a3..484ae333d9 100644 --- a/apps/frontend/src/components/template/QuestionPicker.tsx +++ b/apps/frontend/src/components/template/QuestionPicker.tsx @@ -207,7 +207,9 @@ export const QuestionPicker = (props: QuestionPickerProps) => { keepMounted open={open} onClose={() => setAnchorEl(null)} - TransitionComponent={Fade} + slots={{ + transition: Fade + }} > {getQuestionaryComponentDefinitions() .filter((definition) => definition.creatable) @@ -250,8 +252,6 @@ export const QuestionPicker = (props: QuestionPickerProps) => { {(provided, snapshot) => ( { }} style={getListStyle(snapshot.isDraggingOver)} data-cy="question-list" - > + size={12}> {getItems()} {provided.placeholder} diff --git a/apps/frontend/src/components/template/QuestionPickerFilter.tsx b/apps/frontend/src/components/template/QuestionPickerFilter.tsx index 9487a1283f..5c486597c9 100644 --- a/apps/frontend/src/components/template/QuestionPickerFilter.tsx +++ b/apps/frontend/src/components/template/QuestionPickerFilter.tsx @@ -49,9 +49,6 @@ function QuestionPickerFilter({ onChange }: QuestionPickerProps) { label="Question text" data-cy="search-text" fullWidth - InputLabelProps={{ - shrink: true, - }} onChange={(event: ChangeEvent) => { const newFilter = { ...filter, @@ -68,6 +65,11 @@ function QuestionPickerFilter({ onChange }: QuestionPickerProps) { ); }} autoFocus + slotProps={{ + inputLabel: { + shrink: true, + } + }} />
({ - category: category ?? undefined, - dataType: type ? [type] : undefined, - excludeDataType: nonCreatableQuestions.map( - (definition) => definition.dataType - ), - }); - const pageSize = searchParams.get('pageSize'); - const page = searchParams.get('page'); - const searchText = searchParams.get('search'); - - const [isEditQuestionModalOpen, setIsEditQuestionModalOpen] = - React.useState(false); - const [selectedQuestion, setSelectedQuestion] = - React.useState(); - const tableRef = - React.createRef>(); - - const { api } = useDataApiWithFeedback(); - - const fetchQuestionsData = (tableQuery: Query) => - new Promise>((resolve, reject) => { - try { - const [orderBy] = tableQuery.orderByCollection; - - api() - .getAllQuestions({ - filter, - searchText: tableQuery.search, - sortField: orderBy?.orderByField, - sortDirection: - orderBy?.orderDirection == PaginationSortDirection.ASC - ? PaginationSortDirection.ASC - : orderBy?.orderDirection == PaginationSortDirection.DESC - ? PaginationSortDirection.DESC - : undefined, - first: tableQuery.pageSize, - offset: tableQuery.page * tableQuery.pageSize, - }) - .then((results) => { - resolve({ - data: results.allQuestions?.questions, - page: tableQuery.page, - totalCount: results.allQuestions?.totalCount || 0, - }); - }) - .catch((error) => { - reject(error); - }); - } catch (error) { - reject(error); - } - }); - - const sortDirection = searchParams.get('sortDirection'); - - let columns: Column[] = [ - { title: 'Question', field: 'question' }, - { title: 'Key', field: 'naturalKey' }, - { title: 'Category', field: 'categoryId' }, - { - title: '# Answers', - field: 'answers', - render: (rowData: QuestionWithUsage) => ( - - - - ), - }, - { - title: '# Templates', - field: 'templates', - render: (rowData: QuestionWithUsage) => ( - - - - ), - }, - ]; - columns = setSortDirectionOnSortField( - columns, - searchParams.get('sortField'), - sortDirection === PaginationSortDirection.ASC - ? PaginationSortDirection.ASC - : sortDirection === PaginationSortDirection.DESC - ? PaginationSortDirection.DESC - : undefined - ); - - return ( - - - {/* Edit Form Modal */} - setIsEditQuestionModalOpen(false)} - > - - {selectedQuestion && ( - <> - { - // refs should not be used in rendering but these are used in event handlers only but eslint cannot detect that - // eslint-disable-next-line react-hooks/refs - createQuestionForm({ - question: selectedQuestion, - rolesData, - onUpdated: () => { - setIsEditQuestionModalOpen(false); - tableRef.current && tableRef.current.onQueryChange({}); - }, - onDeleted: () => { - setIsEditQuestionModalOpen(false); - tableRef.current && tableRef.current.onQueryChange({}); - }, - closeMe: () => { - setIsEditQuestionModalOpen(false); - }, - }) - } - - )} - - - - {/* Filter Bar */} - { - setFilter((filter) => ({ - ...filter, - category: newFilter.category, - dataType: newFilter.dataType, - })); - - tableRef.current && tableRef.current.onQueryChange({}); - }} - /> - - {/* Server Paginated Table */} -
- - Questions - - } - editable={{ - onRowDelete: (oldData) => { - return api({ - toastSuccessMessage: 'Question deleted', - }).deleteQuestion({ questionId: oldData.id }); - }, - isDeletable: (rowData) => rowData.templates.length === 0, - }} - actions={[ - { - icon: () => , - tooltip: 'Edit Question', - onClick: (event, data) => { - setIsEditQuestionModalOpen(true); - setSelectedQuestion(Array.isArray(data) ? data[0] : data); - }, - }, - ]} - columns={columns} - data={fetchQuestionsData} - onSearchChange={(searchText) => { - setSearchParam((searchParam) => { - searchParam.delete('search'); - if (searchText) searchParam.set('search', searchText); - - return searchParam; - }); - }} - onOrderCollectionChange={(orderByCollection) => { - const [orderBy] = orderByCollection; - setSearchParam((searchParam) => { - searchParam.delete('sortField'); - searchParam.delete('sortDirection'); - - if ( - orderBy?.orderByField != null && - orderBy?.orderDirection != null - ) { - searchParam.set('sortField', orderBy?.orderByField); - searchParam.set('sortDirection', orderBy?.orderDirection); - } - - return searchParam; - }); - }} - onPageChange={(page, pageSize) => { - setSearchParam((searchParam) => { - searchParam.delete('page'); - searchParam.delete('pageSize'); - - searchParam.set('page', page.toString()); - searchParam.set('pageSize', pageSize.toString()); - - return searchParam; - }); - }} - options={{ - searchText: searchText ?? undefined, - pageSize: pageSize ? +pageSize : undefined, - initialPage: searchText ? 0 : page ? +page : 0, - debounceInterval: 600, - }} - /> -
-
-
- ); -} - -export default QuestionsPage; +import MaterialTableCore, { + Column, + Query, + QueryResult, +} from '@material-table/core'; +import { Edit } from '@mui/icons-material'; +import { DialogContent, Typography } from '@mui/material'; +import React from 'react'; +import { useSearchParams } from 'react-router-dom'; + +import DenseMaterialTable from 'components/common/DenseMaterialTable'; +import StyledDialog from 'components/common/StyledDialog'; +import { + createQuestionForm, + nonCreatableQuestions, +} from 'components/questionary/QuestionaryComponentRegistry'; +import { + BasicUserDetailsFragment, + DataType, + PaginationSortDirection, + QuestionsFilter, + TemplateCategoryId, +} from 'generated/sdk'; +import ButtonWithDialog from 'hooks/common/ButtonWithDialog'; +import { QuestionWithUsage } from 'hooks/template/useQuestions'; +import { useRolesData } from 'hooks/user/useRolesData'; +import { StyledContainer, StyledPaper } from 'styles/StyledComponents'; +import { setSortDirectionOnSortField } from 'utils/helperFunctions'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; + +import AnswerCountDetails from './AnswerCountDetails'; +import QuestionsTableFilter from './QuestionsTableFilter'; +import TemplateCountDetails from './TemplateCountDetails'; + +function QuestionsPage() { + const [searchParams, setSearchParam] = useSearchParams(); + const category = searchParams.get('category') as TemplateCategoryId; + const { rolesData } = useRolesData(); + + const type = searchParams.get('type') as DataType; + const [filter, setFilter] = React.useState({ + category: category ?? undefined, + dataType: type ? [type] : undefined, + excludeDataType: nonCreatableQuestions.map( + (definition) => definition.dataType + ), + }); + const pageSize = searchParams.get('pageSize'); + const page = searchParams.get('page'); + const searchText = searchParams.get('search'); + + const [isEditQuestionModalOpen, setIsEditQuestionModalOpen] = + React.useState(false); + const [selectedQuestion, setSelectedQuestion] = + React.useState(); + const tableRef = + React.createRef>(); + + const { api } = useDataApiWithFeedback(); + + const fetchQuestionsData = (tableQuery: Query) => + new Promise>((resolve, reject) => { + try { + const [orderBy] = tableQuery.orderByCollection; + + api() + .getAllQuestions({ + filter, + searchText: tableQuery.search, + sortField: orderBy?.orderByField, + sortDirection: + orderBy?.orderDirection == PaginationSortDirection.ASC + ? PaginationSortDirection.ASC + : orderBy?.orderDirection == PaginationSortDirection.DESC + ? PaginationSortDirection.DESC + : undefined, + first: tableQuery.pageSize, + offset: tableQuery.page * tableQuery.pageSize, + }) + .then((results) => { + resolve({ + data: results.allQuestions?.questions, + page: tableQuery.page, + totalCount: results.allQuestions?.totalCount || 0, + }); + }) + .catch((error) => { + reject(error); + }); + } catch (error) { + reject(error); + } + }); + + const sortDirection = searchParams.get('sortDirection'); + + let columns: Column[] = [ + { title: 'Question', field: 'question' }, + { title: 'Key', field: 'naturalKey' }, + { title: 'Category', field: 'categoryId' }, + { + title: '# Answers', + field: 'answers', + render: (rowData: QuestionWithUsage) => ( + + + + ), + }, + { + title: '# Templates', + field: 'templates', + render: (rowData: QuestionWithUsage) => ( + + + + ), + }, + ]; + columns = setSortDirectionOnSortField( + columns, + searchParams.get('sortField'), + sortDirection === PaginationSortDirection.ASC + ? PaginationSortDirection.ASC + : sortDirection === PaginationSortDirection.DESC + ? PaginationSortDirection.DESC + : undefined + ); + + return ( + + + {/* Edit Form Modal */} + setIsEditQuestionModalOpen(false)} + > + + {selectedQuestion && ( + <> + { + // refs should not be used in rendering but these are used in event handlers only but eslint cannot detect that + // eslint-disable-next-line react-hooks/refs + createQuestionForm({ + question: selectedQuestion, + rolesData, + onUpdated: () => { + setIsEditQuestionModalOpen(false); + tableRef.current && tableRef.current.onQueryChange({}); + }, + onDeleted: () => { + setIsEditQuestionModalOpen(false); + tableRef.current && tableRef.current.onQueryChange({}); + }, + closeMe: () => { + setIsEditQuestionModalOpen(false); + }, + }) + } + + )} + + + + {/* Filter Bar */} + { + setFilter((filter) => ({ + ...filter, + category: newFilter.category, + dataType: newFilter.dataType, + })); + + tableRef.current && tableRef.current.onQueryChange({}); + }} + /> + + {/* Server Paginated Table */} +
+ + Questions + + } + editable={{ + onRowDelete: (oldData) => { + return api({ + toastSuccessMessage: 'Question deleted', + }).deleteQuestion({ questionId: oldData.id }); + }, + isDeletable: (rowData) => rowData.templates.length === 0, + }} + actions={[ + { + icon: () => , + tooltip: 'Edit Question', + onClick: (event, data) => { + setIsEditQuestionModalOpen(true); + setSelectedQuestion(Array.isArray(data) ? data[0] : data); + }, + }, + ]} + columns={columns} + data={fetchQuestionsData} + onSearchChange={(searchText) => { + setSearchParam((searchParam) => { + searchParam.delete('search'); + if (searchText) searchParam.set('search', searchText); + + return searchParam; + }); + }} + onOrderCollectionChange={(orderByCollection) => { + const [orderBy] = orderByCollection; + setSearchParam((searchParam) => { + searchParam.delete('sortField'); + searchParam.delete('sortDirection'); + + if ( + orderBy?.orderByField != null && + orderBy?.orderDirection != null + ) { + searchParam.set('sortField', orderBy?.orderByField); + searchParam.set('sortDirection', orderBy?.orderDirection); + } + + return searchParam; + }); + }} + onPageChange={(page, pageSize) => { + setSearchParam((searchParam) => { + searchParam.delete('page'); + searchParam.delete('pageSize'); + + searchParam.set('page', page.toString()); + searchParam.set('pageSize', pageSize.toString()); + + return searchParam; + }); + }} + options={{ + searchText: searchText ?? undefined, + pageSize: pageSize ? +pageSize : undefined, + initialPage: searchText ? 0 : page ? +page : 0, + debounceInterval: 600, + }} + /> +
+
+
+ ); +} + +export default QuestionsPage; diff --git a/apps/frontend/src/components/template/QuestionsTableFilter.tsx b/apps/frontend/src/components/template/QuestionsTableFilter.tsx index ac4ecbff31..ffcb97cf13 100644 --- a/apps/frontend/src/components/template/QuestionsTableFilter.tsx +++ b/apps/frontend/src/components/template/QuestionsTableFilter.tsx @@ -39,7 +39,11 @@ function QuestionsTableFilter(props: QuestionsTableFilterProps) { return ( - + Category + size={10}> {props.data.naturalKey} + size={2}> {getTemplateFieldIcon(props.data.dataType)} - + {questionDefinition.renderers ? questionDefinition.renderers.questionRenderer(props.data) : defaultRenderer.questionRenderer(props.data)} + size={12}> {dependencyJsx} diff --git a/apps/frontend/src/components/template/TemplateTopicEditor.tsx b/apps/frontend/src/components/template/TemplateTopicEditor.tsx index b7709bfaea..f7214dc263 100644 --- a/apps/frontend/src/components/template/TemplateTopicEditor.tsx +++ b/apps/frontend/src/components/template/TemplateTopicEditor.tsx @@ -255,7 +255,7 @@ export default function QuestionaryEditorTopic(props: { style={getItemStyle(provided.draggableProps.style)} {...provided.dragHandleProps} > - + setAnchorEl(null)} - TransitionComponent={Fade} + slots={{ + transition: Fade + }} > {(provided, snapshot) => ( + size={12}> {getItems()} {provided.placeholder} diff --git a/apps/frontend/src/components/template/TemplatesTable.tsx b/apps/frontend/src/components/template/TemplatesTable.tsx index 13d02acaa0..79d6d3f602 100644 --- a/apps/frontend/src/components/template/TemplatesTable.tsx +++ b/apps/frontend/src/components/template/TemplatesTable.tsx @@ -1,343 +1,343 @@ -import { Column, MaterialTableProps } from '@material-table/core'; -import Archive from '@mui/icons-material/Archive'; -import Delete from '@mui/icons-material/Delete'; -import Edit from '@mui/icons-material/Edit'; -import FileCopy from '@mui/icons-material/FileCopy'; -import PostAddIcon from '@mui/icons-material/PostAdd'; -import PublishIcon from '@mui/icons-material/Publish'; -import ShareIcon from '@mui/icons-material/Share'; -import UnarchiveIcon from '@mui/icons-material/Unarchive'; -import { DialogContent, Typography } from '@mui/material'; -import Button from '@mui/material/Button'; -import React, { useEffect, useState } from 'react'; -import { useNavigate } from 'react-router-dom'; - -import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; -import MaterialTable from 'components/common/DenseMaterialTable'; -import StyledDialog from 'components/common/StyledDialog'; -import { GetTemplatesQuery, Template, TemplateGroupId } from 'generated/sdk'; -import { downloadBlob } from 'utils/downloadBlob'; -import { tableIcons } from 'utils/materialIcons'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; -import withConfirm, { WithConfirmType } from 'utils/withConfirm'; - -import CreateTemplate from './CreateTemplate'; - -export type TemplateRowDataType = Pick< - Template, - 'templateId' | 'name' | 'description' | 'isArchived' | 'questionaryCount' -> & - Record; - -export interface TemplatesTableProps { - columns: Column[]; - templateGroup: TemplateGroupId; - dataProvider: () => Promise>; - isRowRemovable: (row: TemplateRowDataType) => boolean; - actions?: MaterialTableProps['actions']; - emptyDataSourceMessage?: React.ReactNode; -} - -const TemplatesTable = ({ - dataProvider, - columns, - templateGroup, - isRowRemovable, - confirm, - actions, - emptyDataSourceMessage, -}: TemplatesTableProps & { confirm: WithConfirmType }) => { - const [templates, setTemplates] = useState([]); - const { api } = useDataApiWithFeedback(); - const navigate = useNavigate(); - const [show, setShow] = useState(false); - const [loadingTemplates, setLoadingTemplates] = useState(true); - - useEffect(() => { - dataProvider().then((data) => { - data && setTemplates(data); - setLoadingTemplates(false); - }); - }, [dataProvider]); - - const UnarchiveIconComponent = () => ; - const getUnarchiveButton = () => { - return { - icon: UnarchiveIconComponent, - tooltip: 'Unarchive', - onClick: ( - event: React.MouseEvent, - data: TemplateRowDataType | TemplateRowDataType[] - ) => { - confirm( - () => { - api() - .updateTemplate({ - templateId: (data as TemplateRowDataType).templateId, - isArchived: false, - }) - .then((response) => { - const data = [...templates]; - data.splice( - templates.findIndex( - (elem) => - elem.templateId === response.updateTemplate.templateId - ), - 1 - ); - setTemplates(data); - }); - }, - { - title: 'Are you sure?', - description: `Are you sure you want to unarchive ${ - (data as TemplateRowDataType).name - }. This action can be undone by archiving the template.`, - confirmationText: 'Yes', - cancellationText: 'Cancel', - } - )(); - }, - }; - }; - - const ArchiveIconComponent = () => ; - const getArchiveButton = () => { - return { - icon: ArchiveIconComponent, - tooltip: 'Archive', - onClick: ( - event: React.MouseEvent, - data: TemplateRowDataType | TemplateRowDataType[] - ) => { - confirm( - () => { - api({ toastSuccessMessage: 'Template archived successfully' }) - .updateTemplate({ - templateId: (data as TemplateRowDataType).templateId, - isArchived: true, - }) - .then((response) => { - const data = [...templates]; - data.splice( - templates.findIndex( - (elem) => - elem.templateId === response.updateTemplate.templateId - ), - 1 - ); - setTemplates(data); - }); - }, - { - title: 'Are you sure?', - description: `Are you sure you want to archive ${ - (data as TemplateRowDataType).name - }. This action can be undone by unarchiving the template.`, - confirmationText: 'Yes', - cancellationText: 'Cancel', - } - )(); - }, - }; - }; - - const DeleteIconComponent = () => ; - const getDeleteButton = (rowData: TemplateRowDataType) => { - return { - icon: DeleteIconComponent, - hidden: !isRowRemovable(rowData), - tooltip: 'Delete', - onClick: ( - event: React.MouseEvent, - data: TemplateRowDataType | TemplateRowDataType[] - ) => { - confirm( - () => { - api() - .deleteTemplate({ - id: (data as TemplateRowDataType).templateId, - }) - .then((response) => { - const data = [...templates]; - data.splice( - templates.findIndex( - (elem) => - elem.templateId === response.deleteTemplate.templateId - ), - 1 - ); - setTemplates(data); - }); - }, - { - title: 'Are you sure?', - description: `Are you sure you want to delete ${ - (data as TemplateRowDataType).name - }. This action cannot be undone.`, - confirmationText: 'Yes', - cancellationText: 'Cancel', - } - )(); - }, - }; - }; - - const getArchivedOrUnarchivedButton = (rowData: TemplateRowDataType) => { - if (rowData.isArchived) { - return getUnarchiveButton(); - } - - return getArchiveButton(); - }; - const editTemplate = (templateId: number) => { - if (templateGroup === TemplateGroupId.PROPOSAL_PDF) - navigate(`/PdfTemplateEditor/proposal/${templateId}`); - else if (templateGroup === TemplateGroupId.EXPERIMENT_SAFETY_PDF) - navigate(`/PdfTemplateEditor/experimentSafety/${templateId}`); - else navigate(`/QuestionaryEditor/${templateId}`); - }; - - const customActions = actions || []; - const EditIconComponent = () => ; - const FileCopyIconComponent = () => ; - - const templatesWithId = templates.map((template) => - Object.assign(template, { id: template.templateId }) - ); - - return ( - <> - setShow(false)} - title="Create New Template" - > - - { - if (template) { - setTemplates([ - ...templates, - { ...template, questionaryCount: 0 }, - ]); - - setTimeout(() => { - editTemplate(template.templateId); - }); - } - setShow(false); - }} - groupId={templateGroup} - /> - - - - Templates -
- } - columns={columns} - isLoading={loadingTemplates} - data={templatesWithId} - // text to show when the table is empty - localization={{ - body: { - emptyDataSourceMessage: - emptyDataSourceMessage ?? 'No templates found', - }, - }} - actions={[ - ...customActions, - { - icon: EditIconComponent, - tooltip: 'Edit', - onClick: (event, data) => { - editTemplate((data as TemplateRowDataType).templateId); - }, - }, - { - icon: FileCopyIconComponent, - hidden: false, - tooltip: 'Clone', - onClick: (event, data) => { - confirm( - () => { - api() - .cloneTemplate({ - templateId: (data as TemplateRowDataType).templateId, - }) - .then((result) => { - const clonedTemplate = result.cloneTemplate; - if (clonedTemplate) { - const newTemplates = [...templates]; - newTemplates.push({ ...clonedTemplate, callCount: 0 }); - setTemplates(newTemplates); - } - }); - }, - { - title: 'Are you sure?', - description: `Are you sure you want to clone ${ - (data as TemplateRowDataType).name - }`, - confirmationText: 'Yes', - cancellationText: 'Cancel', - } - )(); - }, - }, - { - icon: ShareIcon, - tooltip: 'Export', - onClick: (event, data) => { - api() - .getTemplateExport({ - templateId: (data as TemplateRowDataType).templateId, - }) - .then((result) => { - if (!result.template) { - return; - } - - const blob = new Blob([result.template.json], { - type: 'application/json;charset=utf8', - }); - downloadBlob( - blob, - `${(data as TemplateRowDataType).name}.json` - ); - }); - }, - }, - (rowData) => getDeleteButton(rowData), - (rowData) => getArchivedOrUnarchivedButton(rowData), - ]} - /> - - - - - - ); -}; - -export default withConfirm(TemplatesTable); +import { Column, MaterialTableProps } from '@material-table/core'; +import Archive from '@mui/icons-material/Archive'; +import Delete from '@mui/icons-material/Delete'; +import Edit from '@mui/icons-material/Edit'; +import FileCopy from '@mui/icons-material/FileCopy'; +import PostAddIcon from '@mui/icons-material/PostAdd'; +import PublishIcon from '@mui/icons-material/Publish'; +import ShareIcon from '@mui/icons-material/Share'; +import UnarchiveIcon from '@mui/icons-material/Unarchive'; +import { DialogContent, Typography } from '@mui/material'; +import Button from '@mui/material/Button'; +import React, { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; + +import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; +import MaterialTable from 'components/common/DenseMaterialTable'; +import StyledDialog from 'components/common/StyledDialog'; +import { GetTemplatesQuery, Template, TemplateGroupId } from 'generated/sdk'; +import { downloadBlob } from 'utils/downloadBlob'; +import { tableIcons } from 'utils/materialIcons'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; +import withConfirm, { WithConfirmType } from 'utils/withConfirm'; + +import CreateTemplate from './CreateTemplate'; + +export type TemplateRowDataType = Pick< + Template, + 'templateId' | 'name' | 'description' | 'isArchived' | 'questionaryCount' +> & + Record; + +export interface TemplatesTableProps { + columns: Column[]; + templateGroup: TemplateGroupId; + dataProvider: () => Promise>; + isRowRemovable: (row: TemplateRowDataType) => boolean; + actions?: MaterialTableProps['actions']; + emptyDataSourceMessage?: React.ReactNode; +} + +const TemplatesTable = ({ + dataProvider, + columns, + templateGroup, + isRowRemovable, + confirm, + actions, + emptyDataSourceMessage, +}: TemplatesTableProps & { confirm: WithConfirmType }) => { + const [templates, setTemplates] = useState([]); + const { api } = useDataApiWithFeedback(); + const navigate = useNavigate(); + const [show, setShow] = useState(false); + const [loadingTemplates, setLoadingTemplates] = useState(true); + + useEffect(() => { + dataProvider().then((data) => { + data && setTemplates(data); + setLoadingTemplates(false); + }); + }, [dataProvider]); + + const UnarchiveIconComponent = () => ; + const getUnarchiveButton = () => { + return { + icon: UnarchiveIconComponent, + tooltip: 'Unarchive', + onClick: ( + event: React.MouseEvent, + data: TemplateRowDataType | TemplateRowDataType[] + ) => { + confirm( + () => { + api() + .updateTemplate({ + templateId: (data as TemplateRowDataType).templateId, + isArchived: false, + }) + .then((response) => { + const data = [...templates]; + data.splice( + templates.findIndex( + (elem) => + elem.templateId === response.updateTemplate.templateId + ), + 1 + ); + setTemplates(data); + }); + }, + { + title: 'Are you sure?', + description: `Are you sure you want to unarchive ${ + (data as TemplateRowDataType).name + }. This action can be undone by archiving the template.`, + confirmationText: 'Yes', + cancellationText: 'Cancel', + } + )(); + }, + }; + }; + + const ArchiveIconComponent = () => ; + const getArchiveButton = () => { + return { + icon: ArchiveIconComponent, + tooltip: 'Archive', + onClick: ( + event: React.MouseEvent, + data: TemplateRowDataType | TemplateRowDataType[] + ) => { + confirm( + () => { + api({ toastSuccessMessage: 'Template archived successfully' }) + .updateTemplate({ + templateId: (data as TemplateRowDataType).templateId, + isArchived: true, + }) + .then((response) => { + const data = [...templates]; + data.splice( + templates.findIndex( + (elem) => + elem.templateId === response.updateTemplate.templateId + ), + 1 + ); + setTemplates(data); + }); + }, + { + title: 'Are you sure?', + description: `Are you sure you want to archive ${ + (data as TemplateRowDataType).name + }. This action can be undone by unarchiving the template.`, + confirmationText: 'Yes', + cancellationText: 'Cancel', + } + )(); + }, + }; + }; + + const DeleteIconComponent = () => ; + const getDeleteButton = (rowData: TemplateRowDataType) => { + return { + icon: DeleteIconComponent, + hidden: !isRowRemovable(rowData), + tooltip: 'Delete', + onClick: ( + event: React.MouseEvent, + data: TemplateRowDataType | TemplateRowDataType[] + ) => { + confirm( + () => { + api() + .deleteTemplate({ + id: (data as TemplateRowDataType).templateId, + }) + .then((response) => { + const data = [...templates]; + data.splice( + templates.findIndex( + (elem) => + elem.templateId === response.deleteTemplate.templateId + ), + 1 + ); + setTemplates(data); + }); + }, + { + title: 'Are you sure?', + description: `Are you sure you want to delete ${ + (data as TemplateRowDataType).name + }. This action cannot be undone.`, + confirmationText: 'Yes', + cancellationText: 'Cancel', + } + )(); + }, + }; + }; + + const getArchivedOrUnarchivedButton = (rowData: TemplateRowDataType) => { + if (rowData.isArchived) { + return getUnarchiveButton(); + } + + return getArchiveButton(); + }; + const editTemplate = (templateId: number) => { + if (templateGroup === TemplateGroupId.PROPOSAL_PDF) + navigate(`/PdfTemplateEditor/proposal/${templateId}`); + else if (templateGroup === TemplateGroupId.EXPERIMENT_SAFETY_PDF) + navigate(`/PdfTemplateEditor/experimentSafety/${templateId}`); + else navigate(`/QuestionaryEditor/${templateId}`); + }; + + const customActions = actions || []; + const EditIconComponent = () => ; + const FileCopyIconComponent = () => ; + + const templatesWithId = templates.map((template) => + Object.assign(template, { id: template.templateId }) + ); + + return ( + <> + setShow(false)} + title="Create New Template" + > + + { + if (template) { + setTemplates([ + ...templates, + { ...template, questionaryCount: 0 }, + ]); + + setTimeout(() => { + editTemplate(template.templateId); + }); + } + setShow(false); + }} + groupId={templateGroup} + /> + + + + Templates +
+ } + columns={columns} + isLoading={loadingTemplates} + data={templatesWithId} + // text to show when the table is empty + localization={{ + body: { + emptyDataSourceMessage: + emptyDataSourceMessage ?? 'No templates found', + }, + }} + actions={[ + ...customActions, + { + icon: EditIconComponent, + tooltip: 'Edit', + onClick: (event, data) => { + editTemplate((data as TemplateRowDataType).templateId); + }, + }, + { + icon: FileCopyIconComponent, + hidden: false, + tooltip: 'Clone', + onClick: (event, data) => { + confirm( + () => { + api() + .cloneTemplate({ + templateId: (data as TemplateRowDataType).templateId, + }) + .then((result) => { + const clonedTemplate = result.cloneTemplate; + if (clonedTemplate) { + const newTemplates = [...templates]; + newTemplates.push({ ...clonedTemplate, callCount: 0 }); + setTemplates(newTemplates); + } + }); + }, + { + title: 'Are you sure?', + description: `Are you sure you want to clone ${ + (data as TemplateRowDataType).name + }`, + confirmationText: 'Yes', + cancellationText: 'Cancel', + } + )(); + }, + }, + { + icon: ShareIcon, + tooltip: 'Export', + onClick: (event, data) => { + api() + .getTemplateExport({ + templateId: (data as TemplateRowDataType).templateId, + }) + .then((result) => { + if (!result.template) { + return; + } + + const blob = new Blob([result.template.json], { + type: 'application/json;charset=utf8', + }); + downloadBlob( + blob, + `${(data as TemplateRowDataType).name}.json` + ); + }); + }, + }, + (rowData) => getDeleteButton(rowData), + (rowData) => getArchivedOrUnarchivedButton(rowData), + ]} + /> + + + + + + ); +}; + +export default withConfirm(TemplatesTable); diff --git a/apps/frontend/src/components/template/documentation.tsx b/apps/frontend/src/components/template/documentation.tsx index b5ec9ead93..1ac34e905e 100644 --- a/apps/frontend/src/components/template/documentation.tsx +++ b/apps/frontend/src/components/template/documentation.tsx @@ -101,15 +101,19 @@ export default function PDFTemplateDocumentation() { > Object: {key} - +
{Object.keys(documentation[key]).map((subKey) => (
diff --git a/apps/frontend/src/components/template/import/ImportTemplatePage.tsx b/apps/frontend/src/components/template/import/ImportTemplatePage.tsx index 56c4ad732c..e6d879d5d6 100644 --- a/apps/frontend/src/components/template/import/ImportTemplatePage.tsx +++ b/apps/frontend/src/components/template/import/ImportTemplatePage.tsx @@ -1,55 +1,55 @@ -import { Typography } from '@mui/material'; -import Container from '@mui/material/Container'; -import React from 'react'; - -import { TemplateValidation } from 'generated/sdk'; -import { StyledPaper } from 'styles/StyledComponents'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; - -import { MergeReview } from './MergeReview'; -import { SelectImportFile } from '../../common/SelectImportFile'; - -export const getFileContents = async (file: File): Promise => { - return new Promise((resolve) => { - const reader = new FileReader(); - reader.readAsText(file); - reader.onload = () => { - resolve(reader.result as string); - }; - }); -}; - -export default function ImportTemplatePage() { - const { api } = useDataApiWithFeedback(); - const [validationResult, setValidationResult] = - React.useState(null); - - return ( - - - - Import template - - {validationResult ? ( - setValidationResult(null)} - /> - ) : ( - { - api() - .validateTemplateImport({ templateAsJson: json }) - .then(({ validateTemplateImport }) => { - const result = validateTemplateImport; - if (result) { - setValidationResult(result as TemplateValidation); - } - }); - }} - /> - )} - - - ); -} +import { Typography } from '@mui/material'; +import Container from '@mui/material/Container'; +import React from 'react'; + +import { TemplateValidation } from 'generated/sdk'; +import { StyledPaper } from 'styles/StyledComponents'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; + +import { MergeReview } from './MergeReview'; +import { SelectImportFile } from '../../common/SelectImportFile'; + +export const getFileContents = async (file: File): Promise => { + return new Promise((resolve) => { + const reader = new FileReader(); + reader.readAsText(file); + reader.onload = () => { + resolve(reader.result as string); + }; + }); +}; + +export default function ImportTemplatePage() { + const { api } = useDataApiWithFeedback(); + const [validationResult, setValidationResult] = + React.useState(null); + + return ( + + + + Import template + + {validationResult ? ( + setValidationResult(null)} + /> + ) : ( + { + api() + .validateTemplateImport({ templateAsJson: json }) + .then(({ validateTemplateImport }) => { + const result = validateTemplateImport; + if (result) { + setValidationResult(result as TemplateValidation); + } + }); + }} + /> + )} + + + ); +} diff --git a/apps/frontend/src/components/template/import/MergeReview.tsx b/apps/frontend/src/components/template/import/MergeReview.tsx index 9d89138233..06fddcbbb2 100644 --- a/apps/frontend/src/components/template/import/MergeReview.tsx +++ b/apps/frontend/src/components/template/import/MergeReview.tsx @@ -1,166 +1,166 @@ -import { Box, Button, Typography } from '@mui/material'; -import { produce } from 'immer'; -import React, { useCallback, useState } from 'react'; -import { useNavigate } from 'react-router-dom'; - -import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; -import { - ConflictResolutionStrategy, - QuestionComparison, - SettingsId, - TemplateValidation, -} from 'generated/sdk'; -import { useFormattedDateTime } from 'hooks/admin/useFormattedDateTime'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; - -import { QuestionComparisonList } from './QuestionComparisonList'; - -interface MergeReviewProps { - templateImport: TemplateValidation; - onBack?: () => void; -} - -const hasUnresolvedConflicts = (questionComparisons: QuestionComparison[]) => - questionComparisons.some( - (comparison) => - comparison.conflictResolutionStrategy === - ConflictResolutionStrategy.UNRESOLVED - ); - -export function MergeReview(props: MergeReviewProps) { - const { api } = useDataApiWithFeedback(); - const navigate = useNavigate(); - const { toFormattedDateTime } = useFormattedDateTime({ - settingsFormatToUse: SettingsId.DATE_FORMAT, - }); - - const { templateImport, onBack } = props; - const { version, json } = templateImport; - const exportDate = toFormattedDateTime(templateImport.exportDate); - - const [state, setState] = useState({ ...templateImport }); - - const onConflictResolved = useCallback( - ( - comparison: QuestionComparison, - resolutionStrategy: ConflictResolutionStrategy - ) => { - setState( - produce((draft) => { - const updateQuestion = draft.validationData.questionComparisons.find( - (curComparison) => - comparison.newQuestion.id === curComparison.newQuestion.id - ); - if (updateQuestion) { - updateQuestion.conflictResolutionStrategy = resolutionStrategy; - } - }) - ); - }, - [] - ); - - const onConflictResolvedSubTemplate = useCallback( - ( - comparison: QuestionComparison, - resolutionStrategy: ConflictResolutionStrategy - ) => { - setState( - produce((draft) => { - const updateTemplate = - draft.validationData.subTemplateValidationData?.find((template) => - template.questionComparisons.find( - (curComparison) => - comparison.newQuestion.id === curComparison.newQuestion.id - ) - ); - const updateQuestion = updateTemplate?.questionComparisons.find( - (curComparison) => - comparison.newQuestion.id === curComparison.newQuestion.id - ); - if (updateQuestion) { - updateQuestion.conflictResolutionStrategy = resolutionStrategy; - } - }) - ); - }, - [] - ); - - const handleImportClick = () => - api({ toastSuccessMessage: 'Template imported successfully' }) - .importTemplate({ - templateAsJson: json, - conflictResolutions: state.validationData.questionComparisons.map( - (comparison) => { - const question = comparison.newQuestion; - - return { - itemId: question.id, - strategy: comparison.conflictResolutionStrategy, - }; - } - ), - subTemplatesConflictResolutions: - state.validationData.subTemplateValidationData.map((template) => { - return template.questionComparisons.map((comparison) => { - const question = comparison.newQuestion; - - return { - itemId: question.id, - strategy: comparison.conflictResolutionStrategy, - }; - }); - }), - }) - .then((result) => { - if (result.importTemplate) { - navigate(`/QuestionaryEditor/${result.importTemplate.templateId}`); - } - }); - - return ( - <> - - Version: {version} - Export date: {exportDate} - - - - {templateImport.validationData.subTemplateValidationData.length > 0 && ( - <> - - - Sub Templates and Sample Questions: - - - template.questionComparisons) - .flat()} - onConflictResolved={onConflictResolvedSubTemplate} - /> - - )} - - - - - - ); -} - -export default MergeReview; +import { Box, Button, Typography } from '@mui/material'; +import { produce } from 'immer'; +import React, { useCallback, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; + +import { ActionButtonContainer } from 'components/common/ActionButtonContainer'; +import { + ConflictResolutionStrategy, + QuestionComparison, + SettingsId, + TemplateValidation, +} from 'generated/sdk'; +import { useFormattedDateTime } from 'hooks/admin/useFormattedDateTime'; +import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; + +import { QuestionComparisonList } from './QuestionComparisonList'; + +interface MergeReviewProps { + templateImport: TemplateValidation; + onBack?: () => void; +} + +const hasUnresolvedConflicts = (questionComparisons: QuestionComparison[]) => + questionComparisons.some( + (comparison) => + comparison.conflictResolutionStrategy === + ConflictResolutionStrategy.UNRESOLVED + ); + +export function MergeReview(props: MergeReviewProps) { + const { api } = useDataApiWithFeedback(); + const navigate = useNavigate(); + const { toFormattedDateTime } = useFormattedDateTime({ + settingsFormatToUse: SettingsId.DATE_FORMAT, + }); + + const { templateImport, onBack } = props; + const { version, json } = templateImport; + const exportDate = toFormattedDateTime(templateImport.exportDate); + + const [state, setState] = useState({ ...templateImport }); + + const onConflictResolved = useCallback( + ( + comparison: QuestionComparison, + resolutionStrategy: ConflictResolutionStrategy + ) => { + setState( + produce((draft) => { + const updateQuestion = draft.validationData.questionComparisons.find( + (curComparison) => + comparison.newQuestion.id === curComparison.newQuestion.id + ); + if (updateQuestion) { + updateQuestion.conflictResolutionStrategy = resolutionStrategy; + } + }) + ); + }, + [] + ); + + const onConflictResolvedSubTemplate = useCallback( + ( + comparison: QuestionComparison, + resolutionStrategy: ConflictResolutionStrategy + ) => { + setState( + produce((draft) => { + const updateTemplate = + draft.validationData.subTemplateValidationData?.find((template) => + template.questionComparisons.find( + (curComparison) => + comparison.newQuestion.id === curComparison.newQuestion.id + ) + ); + const updateQuestion = updateTemplate?.questionComparisons.find( + (curComparison) => + comparison.newQuestion.id === curComparison.newQuestion.id + ); + if (updateQuestion) { + updateQuestion.conflictResolutionStrategy = resolutionStrategy; + } + }) + ); + }, + [] + ); + + const handleImportClick = () => + api({ toastSuccessMessage: 'Template imported successfully' }) + .importTemplate({ + templateAsJson: json, + conflictResolutions: state.validationData.questionComparisons.map( + (comparison) => { + const question = comparison.newQuestion; + + return { + itemId: question.id, + strategy: comparison.conflictResolutionStrategy, + }; + } + ), + subTemplatesConflictResolutions: + state.validationData.subTemplateValidationData.map((template) => { + return template.questionComparisons.map((comparison) => { + const question = comparison.newQuestion; + + return { + itemId: question.id, + strategy: comparison.conflictResolutionStrategy, + }; + }); + }), + }) + .then((result) => { + if (result.importTemplate) { + navigate(`/QuestionaryEditor/${result.importTemplate.templateId}`); + } + }); + + return ( + <> + + Version: {version} + Export date: {exportDate} + + + + {templateImport.validationData.subTemplateValidationData.length > 0 && ( + <> + + + Sub Templates and Sample Questions: + + + template.questionComparisons) + .flat()} + onConflictResolved={onConflictResolvedSubTemplate} + /> + + )} + + + + + + ); +} + +export default MergeReview; diff --git a/apps/frontend/src/components/template/pdf/experimentSafety/PdfTemplateEditor.tsx b/apps/frontend/src/components/template/pdf/experimentSafety/PdfTemplateEditor.tsx index 2315ee3d35..7aeb482fa2 100644 --- a/apps/frontend/src/components/template/pdf/experimentSafety/PdfTemplateEditor.tsx +++ b/apps/frontend/src/components/template/pdf/experimentSafety/PdfTemplateEditor.tsx @@ -1,234 +1,234 @@ -import { html } from '@codemirror/lang-html'; -import { Box, Typography } from '@mui/material'; -import Button from '@mui/material/Button'; -import CodeMirror from '@uiw/react-codemirror'; -import { Field, FieldProps, Form, Formik } from 'formik'; -import React, { useEffect, useRef, useState } from 'react'; -import { useParams } from 'react-router-dom'; - -import SimpleTabs from 'components/common/SimpleTabs'; -import UOLoader from 'components/common/UOLoader'; -import { ExperimentSafetyPdfTemplate, Template } from 'generated/sdk'; -import { usePersistQuestionaryEditorModel } from 'hooks/questionary/usePersistQuestionaryEditorModel'; -import QuestionaryEditorModel from 'models/questionary/QuestionaryEditorModel'; -import { StyledButtonContainer } from 'styles/StyledComponents'; -import useDataApiWithFeedback from 'utils/useDataApiWithFeedback'; - -import PDFTemplateDocumentation from '../../documentation'; -import { TemplateMetadataEditor } from '../../TemplateMetadataEditor'; -import PdfTemplateEditorViewer from '../experimentSafety/PdfTemplateEditorViewer'; -interface ITemplateEditorProps { - name: Type; - template: Template | null; - initialValues: { - [key in Type]: string | null; - }; - pdfTemplate: ExperimentSafetyPdfTemplate | null; - setPdfTemplate: React.Dispatch< - React.SetStateAction - >; -} -const TemplateEditor = < - Type extends - | 'templateData' - | 'templateHeader' - | 'templateFooter' - | 'dummyData', ->({ - name, - template, - initialValues, - pdfTemplate, - setPdfTemplate, -}: ITemplateEditorProps) => { - const { api } = useDataApiWithFeedback(); - - const { persistModel } = usePersistQuestionaryEditorModel(); - const { state, dispatch } = QuestionaryEditorModel([persistModel]); - - return ( - <> - - {template?.name} - - - => { - if (pdfTemplate) { - await api({ - toastSuccessMessage: 'Template updated successfully!', - }) - .updateExperimentSafetyPdfTemplate({ - ...values, - experimentSafetyPdfTemplateId: - pdfTemplate?.experimentSafetyPdfTemplateId, - }) - .then((template) => { - setPdfTemplate( - template.updateExperimentSafetyPdfTemplate as ExperimentSafetyPdfTemplate - ); - }); - } - }} - > - {({ setFieldValue }) => ( -
- - {({ field }: FieldProps) => ( - - { - setFieldValue(name, value); - }} - value={field.value} - data-cy={name} - /> - - )} - - - - - -
- )} -
- - ); -}; - -export default function PdfTemplateEditor() { - const { api } = useDataApiWithFeedback(); - const [loading, setLoading] = useState(true); - const [template, setTemplate] = useState