From a723fcdbbbaafc41083cb989235f555800f71a9e Mon Sep 17 00:00:00 2001 From: cdfhalle <82583544+cdfhalle@users.noreply.github.com> Date: Fri, 31 Jan 2025 11:31:25 +0100 Subject: [PATCH] Evaluate segmentation in infer neurons task (#8221) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added new inputs for model evaluation * run formatter * updated changelog * add support for displaying annotation links instead of datasets * Update CHANGELOG.unreleased.md Co-authored-by: MichaelBuessemeyer <39529669+MichaelBuessemeyer@users.noreply.github.com> * adapt to feedback * update antd to allow form.field to set its own layout * Update frontend/javascripts/admin/api/jobs.ts Co-authored-by: MichaelBuessemeyer <39529669+MichaelBuessemeyer@users.noreply.github.com> * apply some of the requested changes * yarn fix-frontend * add assertion for annotationId * change variable name in error message * remove changes in application.conf * actually undo changes in application.conf * format frontend * apply feedback * fix drag handle alignment --------- Co-authored-by: MichaelBuessemeyer <39529669+MichaelBuessemeyer@users.noreply.github.com> Co-authored-by: Michael Büßemeyer --- CHANGELOG.unreleased.md | 1 + app/controllers/JobController.scala | 16 +- app/models/job/Job.scala | 5 + conf/messages | 1 + conf/webknossos.latest.routes | 2 +- frontend/javascripts/admin/api/jobs.ts | 25 +++ .../view/action-bar/starting_job_modals.tsx | 133 +++++++++++++- .../left-border-tabs/layer_settings_tab.tsx | 5 +- package.json | 2 +- yarn.lock | 166 +++++++++++------- 10 files changed, 285 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.unreleased.md b/CHANGELOG.unreleased.md index b1f4d521117..327dbcac450 100644 --- a/CHANGELOG.unreleased.md +++ b/CHANGELOG.unreleased.md @@ -11,6 +11,7 @@ For upgrade instructions, please check the [migration guide](MIGRATIONS.released [Commits](https://github.com/scalableminds/webknossos/compare/25.01.0...HEAD) ### Added +- It is now possible to start a split-merger evaluation when starting a neuron inference. [#8221](https://github.com/scalableminds/webknossos/pull/8221) - Added the possibility to configure a rotation for a dataset, which can be toggled off and on when viewing and annotating data. [#8159](https://github.com/scalableminds/webknossos/pull/8159) - When using the “Restore older Version” feature, there are no longer separate tabs for the different annotation layers. Only one linear annotation history is now used, and if you revert to an older version, all layers are reverted. If layers were added/deleted since then, that is also reverted. This also means that proofreading annotations can now be reverted to older versions as well. The description text of annotations is now versioned as well. [#7917](https://github.com/scalableminds/webknossos/pull/7917) - Added the possibility to use the "merger mode" even when the user has annotated volume data in the current layer (as long as no other mapping is active). [#8335](https://github.com/scalableminds/webknossos/pull/8335) diff --git a/app/controllers/JobController.scala b/app/controllers/JobController.scala index c12d64c063d..20f1462076e 100644 --- a/app/controllers/JobController.scala +++ b/app/controllers/JobController.scala @@ -223,10 +223,17 @@ class JobController @Inject()( def runInferNeuronsJob(datasetId: String, layerName: String, bbox: String, - newDatasetName: String): Action[AnyContent] = + newDatasetName: String, + doSplitMergerEvaluation: Boolean, + annotationId: Option[String], + evalUseSparseTracing: Option[Boolean], + evalMaxEdgeLength: Option[Double], + evalSparseTubeThresholdNm: Option[Double], + evalMinMergerPathLengthNm: Option[Double]): Action[AnyContent] = sil.SecuredAction.async { implicit request => log(Some(slackNotificationService.noticeFailedJobRequest)) { for { + datasetIdValidated <- ObjectId.fromString(datasetId) dataset <- datasetDAO.findOne(datasetIdValidated) ?~> Messages("dataset.notFound", datasetId) ~> NOT_FOUND organization <- organizationDAO.findOne(dataset._organization)(GlobalAccessContext) ?~> Messages( @@ -237,6 +244,7 @@ class JobController @Inject()( _ <- datasetService.assertValidLayerNameLax(layerName) multiUser <- multiUserDAO.findOne(request.identity._multiUser) _ <- Fox.runIf(!multiUser.isSuperUser)(jobService.assertBoundingBoxLimits(bbox, None)) + annotationIdParsed <- Fox.runIf(doSplitMergerEvaluation)(annotationId.toFox) ?~> "job.inferNeurons.annotationIdEvalParamsMissing" command = JobCommand.infer_neurons commandArgs = Json.obj( "organization_id" -> organization._id, @@ -245,6 +253,12 @@ class JobController @Inject()( "new_dataset_name" -> newDatasetName, "layer_name" -> layerName, "bbox" -> bbox, + "do_split_merger_evaluation" -> doSplitMergerEvaluation, + "annotation_id" -> annotationIdParsed, + "eval_use_sparse_tracing" -> evalUseSparseTracing, + "eval_max_edge_length" -> evalMaxEdgeLength, + "eval_sparse_tube_threshold_nm" -> evalSparseTubeThresholdNm, + "eval_min_merger_path_length_nm" -> evalMinMergerPathLengthNm, ) job <- jobService.submitJob(command, commandArgs, request.identity, dataset._dataStore) ?~> "job.couldNotRunNeuronInferral" js <- jobService.publicWrites(job) diff --git a/app/models/job/Job.scala b/app/models/job/Job.scala index d3c181d4601..72a2e99dd5e 100644 --- a/app/models/job/Job.scala +++ b/app/models/job/Job.scala @@ -54,6 +54,7 @@ case class Job( def datasetId: Option[String] = argAsStringOpt("dataset_id") private def argAsStringOpt(key: String) = (commandArgs \ key).toOption.flatMap(_.asOpt[String]) + private def argAsBooleanOpt(key: String) = (commandArgs \ key).toOption.flatMap(_.asOpt[Boolean]) def resultLink(organizationId: String): Option[String] = if (effectiveState != JobState.SUCCESS) None @@ -66,6 +67,10 @@ case class Job( }.getOrElse(datasetName.map(name => s"datasets/$organizationId/$name/view")) case JobCommand.export_tiff | JobCommand.render_animation => Some(s"/api/jobs/${this._id}/export") + case JobCommand.infer_neurons if this.argAsBooleanOpt("do_evaluation").getOrElse(false) => + returnValue.map { resultAnnotationLink => + resultAnnotationLink + } case JobCommand.infer_nuclei | JobCommand.infer_neurons | JobCommand.materialize_volume_annotation | JobCommand.infer_with_model | JobCommand.infer_mitochondria | JobCommand.align_sections => // Old jobs before the dataset renaming changes returned the output dataset name. diff --git a/conf/messages b/conf/messages index 5017c2f29bd..d22b5b9c376 100644 --- a/conf/messages +++ b/conf/messages @@ -331,6 +331,7 @@ job.edgeLengthExceeded = An edge length of the selected bounding box is too larg job.convertToWkw.notAllowed.organization = Converting to WKW is only allowed for datasets of your own organization. job.inferNuclei.notAllowed.organization = Currently nuclei inferral is only allowed for datasets of your own organization. job.inferNeurons.notAllowed.organization = Currently neuron inferral is only allowed for datasets of your own organization. +job.inferNeurons.annotationIdEvalParamsMissing=A evaluation of the neuron inferral jobs was requested but no annotation was supplied. job.meshFile.notAllowed.organization = Calculating mesh files is only allowed for datasets of your own organization. job.segmentIndexFile.notAllowed.organization = Calculating segment index files is only allowed for datasets of your own organization. job.globalizeFloodfill.notAllowed.organization = Globalizing floodfills is only allowed for datasets of your own organization. diff --git a/conf/webknossos.latest.routes b/conf/webknossos.latest.routes index ffb69830397..6284bc3227d 100644 --- a/conf/webknossos.latest.routes +++ b/conf/webknossos.latest.routes @@ -260,7 +260,7 @@ POST /jobs/run/computeMeshFile/:datasetId POST /jobs/run/computeSegmentIndexFile/:datasetId controllers.JobController.runComputeSegmentIndexFileJob(datasetId: String, layerName: String) POST /jobs/run/exportTiff/:datasetId controllers.JobController.runExportTiffJob(datasetId: String, bbox: String, additionalCoordinates: Option[String], layerName: Option[String], mag: Option[String], annotationLayerName: Option[String], annotationId: Option[String], asOmeTiff: Boolean) POST /jobs/run/inferNuclei/:datasetId controllers.JobController.runInferNucleiJob(datasetId: String, layerName: String, newDatasetName: String) -POST /jobs/run/inferNeurons/:datasetId controllers.JobController.runInferNeuronsJob(datasetId: String, layerName: String, bbox: String, newDatasetName: String) +POST /jobs/run/inferNeurons/:datasetId controllers.JobController.runInferNeuronsJob(datasetId: String, layerName: String, bbox: String, newDatasetName: String, doSplitMergerEvaluation: Boolean, annotationId: Option[String], evalUseSparseTracing: Option[Boolean], evalMaxEdgeLength: Option[Double], evalSparseTubeThresholdNm: Option[Double], evalMinMergerPathLengthNm: Option[Double]) POST /jobs/run/inferMitochondria/:datasetId controllers.JobController.runInferMitochondriaJob(datasetId: String, layerName: String, bbox: String, newDatasetName: String) POST /jobs/run/alignSections/:datasetId controllers.JobController.runAlignSectionsJob(datasetId: String, layerName: String, newDatasetName: String, annotationId: Option[String]) POST /jobs/run/materializeVolumeAnnotation/:datasetId controllers.JobController.runMaterializeVolumeAnnotationJob(datasetId: String, fallbackLayerName: String, annotationId: String, annotationType: String, newDatasetName: String, outputSegmentationLayerName: String, mergeSegments: Boolean, volumeLayerName: Option[String], includesEditableMapping: Boolean, boundingBox: Option[String]) diff --git a/frontend/javascripts/admin/api/jobs.ts b/frontend/javascripts/admin/api/jobs.ts index 55f462f1e0a..db907374dd4 100644 --- a/frontend/javascripts/admin/api/jobs.ts +++ b/frontend/javascripts/admin/api/jobs.ts @@ -179,12 +179,37 @@ export function startNeuronInferralJob( layerName: string, bbox: Vector6, newDatasetName: string, + doSplitMergerEvaluation: boolean, + annotationId?: string, + useSparseTracing?: boolean, + evalMaxEdgeLength?: number, + evalSparseTubeThresholdNm?: number, + evalMinMergerPathLengthNm?: number, ): Promise { const urlParams = new URLSearchParams({ layerName, bbox: bbox.join(","), newDatasetName, + doSplitMergerEvaluation: doSplitMergerEvaluation.toString(), }); + if (doSplitMergerEvaluation) { + if (!annotationId) { + throw new Error("annotationId is required when doSplitMergerEvaluation is true"); + } + urlParams.append("annotationId", `${annotationId}`); + if (useSparseTracing != null) { + urlParams.append("evalUseSparseTracing", `${useSparseTracing}`); + } + if (evalMaxEdgeLength != null) { + urlParams.append("evalMaxEdgeLength", `${evalMaxEdgeLength}`); + } + if (evalSparseTubeThresholdNm != null) { + urlParams.append("evalSparseTubeThresholdNm", `${evalSparseTubeThresholdNm}`); + } + if (evalMinMergerPathLengthNm != null) { + urlParams.append("evalMinMergerPathLengthNm", `${evalMinMergerPathLengthNm}`); + } + } return Request.receiveJSON(`/api/jobs/run/inferNeurons/${datasetId}?${urlParams.toString()}`, { method: "POST", }); diff --git a/frontend/javascripts/oxalis/view/action-bar/starting_job_modals.tsx b/frontend/javascripts/oxalis/view/action-bar/starting_job_modals.tsx index 48098670c28..2ba0c4e9998 100644 --- a/frontend/javascripts/oxalis/view/action-bar/starting_job_modals.tsx +++ b/frontend/javascripts/oxalis/view/action-bar/starting_job_modals.tsx @@ -14,8 +14,11 @@ import { Button, Card, Checkbox, + Col, + Collapse, Form, type FormInstance, + InputNumber, Modal, Radio, Row, @@ -98,6 +101,7 @@ type StartJobFormProps = Props & { jobApiCall: (arg0: JobApiCallArgsType, form: FormInstance) => Promise; jobName: keyof typeof jobNameToImagePath; description: React.ReactNode; + jobSpecificInputFields?: React.ReactNode | undefined; isBoundingBoxConfigurable?: boolean; chooseSegmentationLayer?: boolean; suggestedDatasetSuffix: string; @@ -523,11 +527,92 @@ function ShouldUseTreesFormItem() { ); } +type SplitMergerEvaluationSettings = { + useSparseTracing?: boolean; + maxEdgeLength?: number; + sparseTubeThresholdInNm?: number; + minimumMergerPathLengthInNm?: number; +}; + +function CollapsibleSplitMergerEvaluationSettings({ + isActive = false, + setActive, +}: { isActive: boolean; setActive: (active: boolean) => void }) { + return ( + setActive(!isActive)} + expandIcon={() => } + items={[ + { + key: "evaluation", + label: "Evaluation Settings", + children: ( + + + + + + + + + + + + + + + + ), + }, + ]} + activeKey={isActive ? "evaluation" : []} + /> + ); +} + function StartJobForm(props: StartJobFormProps) { const isBoundingBoxConfigurable = props.isBoundingBoxConfigurable || false; const isSkeletonSelectable = props.isSkeletonSelectable || false; const chooseSegmentationLayer = props.chooseSegmentationLayer || false; - const { handleClose, jobName, jobApiCall, fixedSelectedLayer, title, description } = props; + const { + handleClose, + jobName, + jobApiCall, + fixedSelectedLayer, + title, + description, + jobSpecificInputFields, + } = props; const [form] = Form.useForm(); const rawUserBoundingBoxes = useSelector((state: OxalisState) => getUserBoundingBoxesFromState(state), @@ -650,6 +735,7 @@ function StartJobForm(props: StartJobFormProps) { onChangeSelectedBoundingBox={(bBoxId) => form.setFieldsValue({ boundingBoxId: bBoxId })} value={form.getFieldValue("boundingBoxId")} /> + {jobSpecificInputFields} {isSkeletonSelectable && } {props.showWorkflowYaml ? ( state.dataset); + const hasSkeletonAnnotation = useSelector((state: OxalisState) => state.tracing.skeleton != null); const dispatch = useDispatch(); + const [doSplitMergerEvaluation, setDoSplitMergerEvaluation] = React.useState(false); return ( dispatch(setAIJobModalStateAction("invisible"))} @@ -710,13 +798,42 @@ export function NeuronSegmentationForm() { title="AI Neuron Segmentation" suggestedDatasetSuffix="with_reconstructed_neurons" isBoundingBoxConfigurable - jobApiCall={async ({ newDatasetName, selectedLayer: colorLayer, selectedBoundingBox }) => { - if (!selectedBoundingBox) { + jobApiCall={async ( + { newDatasetName, selectedLayer: colorLayer, selectedBoundingBox, annotationId }, + form: FormInstance, + ) => { + const splitMergerEvaluationSettings = form.getFieldValue( + "splitMergerEvaluationSettings", + ) as SplitMergerEvaluationSettings; + if ( + !selectedBoundingBox || + (doSplitMergerEvaluation && splitMergerEvaluationSettings == null) + ) { return; } const bbox = computeArrayFromBoundingBox(selectedBoundingBox.boundingBox); - return startNeuronInferralJob(dataset.id, colorLayer.name, bbox, newDatasetName); + if (!doSplitMergerEvaluation) { + return startNeuronInferralJob( + dataset.id, + colorLayer.name, + bbox, + newDatasetName, + doSplitMergerEvaluation, + ); + } + return startNeuronInferralJob( + dataset.id, + colorLayer.name, + bbox, + newDatasetName, + doSplitMergerEvaluation, + annotationId, + splitMergerEvaluationSettings.useSparseTracing, + splitMergerEvaluationSettings.maxEdgeLength, + splitMergerEvaluationSettings.sparseTubeThresholdInNm, + splitMergerEvaluationSettings.minimumMergerPathLengthInNm, + ); }} description={ <> @@ -731,6 +848,14 @@ export function NeuronSegmentationForm() { } + jobSpecificInputFields={ + hasSkeletonAnnotation && ( + + ) + } /> ); } diff --git a/frontend/javascripts/oxalis/view/left-border-tabs/layer_settings_tab.tsx b/frontend/javascripts/oxalis/view/left-border-tabs/layer_settings_tab.tsx index bc8ddd22f3d..7ad3b7f39d8 100644 --- a/frontend/javascripts/oxalis/view/left-border-tabs/layer_settings_tab.tsx +++ b/frontend/javascripts/oxalis/view/left-border-tabs/layer_settings_tab.tsx @@ -184,7 +184,10 @@ function DragHandle({ id }: { id: string }) { function DummyDragHandle({ tooltipTitle }: { tooltipTitle: string }) { return ( - + ); diff --git a/package.json b/package.json index fc909911d9a..dc2d6407f9e 100644 --- a/package.json +++ b/package.json @@ -141,7 +141,7 @@ "@tanstack/react-query-persist-client": "4.36.1", "@zip.js/zip.js": "^2.7.32", "ansi-to-react": "^6.1.6", - "antd": "5.17.4", + "antd": "5.18", "ball-morphology": "^0.1.0", "base64-js": "^1.2.1", "beautiful-react-hooks": "^3.11.1", diff --git a/yarn.lock b/yarn.lock index 056e70cf888..d82076a1a28 100644 --- a/yarn.lock +++ b/yarn.lock @@ -47,9 +47,9 @@ __metadata: languageName: node linkType: hard -"@ant-design/cssinjs@npm:^1.19.1": - version: 1.21.1 - resolution: "@ant-design/cssinjs@npm:1.21.1" +"@ant-design/cssinjs@npm:^1.21.0": + version: 1.22.0 + resolution: "@ant-design/cssinjs@npm:1.22.0" dependencies: "@babel/runtime": "npm:^7.11.1" "@emotion/hash": "npm:^0.8.0" @@ -57,11 +57,11 @@ __metadata: classnames: "npm:^2.3.1" csstype: "npm:^3.1.3" rc-util: "npm:^5.35.0" - stylis: "npm:^4.3.3" + stylis: "npm:^4.3.4" peerDependencies: react: ">=16.0.0" react-dom: ">=16.0.0" - checksum: 10c0/9dca7fa851ae59d084cfe6787937536a601e16e3b4f82f6a63a5eb4098d83b36a5b88a1ff9128a8d8cd2bd3336734e14248e427f0875c37cbf94a70fb0d29e50 + checksum: 10c0/f06aa27efba605caffb2e0684479ee5b7b5a6ed558aab52825e889c208e4fc1f1b669abbbc4aa483ce12155ae9d09e7c4abedeff8ef0bd0697900d9821dcd7bf languageName: node linkType: hard @@ -300,7 +300,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.10.4, @babel/runtime@npm:^7.11.1, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.7, @babel/runtime@npm:^7.18.0, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.6, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.24.4, @babel/runtime@npm:^7.24.5, @babel/runtime@npm:^7.24.8, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.10.4, @babel/runtime@npm:^7.11.1, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.7, @babel/runtime@npm:^7.18.0, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.6, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.24.4, @babel/runtime@npm:^7.24.8, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.9.2": version: 7.25.6 resolution: "@babel/runtime@npm:7.25.6" dependencies: @@ -309,6 +309,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.24.7": + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 10c0/12c01357e0345f89f4f7e8c0e81921f2a3e3e101f06e8eaa18a382b517376520cd2fa8c237726eb094dab25532855df28a7baaf1c26342b52782f6936b07c287 + languageName: node + linkType: hard + "@babel/template@npm:^7.22.5": version: 7.22.5 resolution: "@babel/template@npm:7.22.5" @@ -1549,6 +1558,23 @@ __metadata: languageName: node linkType: hard +"@rc-component/trigger@npm:^2.2.0": + version: 2.2.5 + resolution: "@rc-component/trigger@npm:2.2.5" + dependencies: + "@babel/runtime": "npm:^7.23.2" + "@rc-component/portal": "npm:^1.1.0" + classnames: "npm:^2.3.2" + rc-motion: "npm:^2.0.0" + rc-resize-observer: "npm:^1.3.1" + rc-util: "npm:^5.38.0" + peerDependencies: + react: ">=16.9.0" + react-dom: ">=16.9.0" + checksum: 10c0/829704ab59b19f669b1ff4b0af23c573e714dfc04ebe37d74a46d0ffc88ba2f8d29dffb17863b5e39f3984f534bdc72a091fd61c164f9fe173894f6499bbb69f + languageName: node + linkType: hard + "@react-dnd/asap@npm:^5.0.1": version: 5.0.2 resolution: "@react-dnd/asap@npm:5.0.2" @@ -3263,62 +3289,62 @@ __metadata: languageName: node linkType: hard -"antd@npm:5.17.4": - version: 5.17.4 - resolution: "antd@npm:5.17.4" +"antd@npm:5.18": + version: 5.18.3 + resolution: "antd@npm:5.18.3" dependencies: "@ant-design/colors": "npm:^7.0.2" - "@ant-design/cssinjs": "npm:^1.19.1" + "@ant-design/cssinjs": "npm:^1.21.0" "@ant-design/icons": "npm:^5.3.7" "@ant-design/react-slick": "npm:~1.1.2" - "@babel/runtime": "npm:^7.24.5" + "@babel/runtime": "npm:^7.24.7" "@ctrl/tinycolor": "npm:^3.6.1" "@rc-component/color-picker": "npm:~1.5.3" "@rc-component/mutate-observer": "npm:^1.1.0" "@rc-component/tour": "npm:~1.15.0" - "@rc-component/trigger": "npm:^2.1.1" + "@rc-component/trigger": "npm:^2.2.0" classnames: "npm:^2.5.1" copy-to-clipboard: "npm:^3.3.3" - dayjs: "npm:^1.11.10" + dayjs: "npm:^1.11.11" qrcode.react: "npm:^3.1.0" rc-cascader: "npm:~3.26.0" rc-checkbox: "npm:~3.3.0" rc-collapse: "npm:~3.7.3" - rc-dialog: "npm:~9.4.0" - rc-drawer: "npm:~7.1.0" + rc-dialog: "npm:~9.5.2" + rc-drawer: "npm:~7.2.0" rc-dropdown: "npm:~4.2.0" - rc-field-form: "npm:~2.0.1" - rc-image: "npm:~7.6.0" + rc-field-form: "npm:~2.2.1" + rc-image: "npm:~7.9.0" rc-input: "npm:~1.5.1" rc-input-number: "npm:~9.1.0" - rc-mentions: "npm:~2.13.1" + rc-mentions: "npm:~2.14.0" rc-menu: "npm:~9.14.0" - rc-motion: "npm:^2.9.1" - rc-notification: "npm:~5.4.0" + rc-motion: "npm:^2.9.2" + rc-notification: "npm:~5.6.0" rc-pagination: "npm:~4.0.4" rc-picker: "npm:~4.5.0" rc-progress: "npm:~4.0.0" - rc-rate: "npm:~2.12.0" + rc-rate: "npm:~2.13.0" rc-resize-observer: "npm:^1.4.0" rc-segmented: "npm:~2.3.0" rc-select: "npm:~14.14.0" rc-slider: "npm:~10.6.2" rc-steps: "npm:~6.0.1" rc-switch: "npm:~4.1.0" - rc-table: "npm:~7.45.6" - rc-tabs: "npm:~15.1.0" + rc-table: "npm:~7.45.7" + rc-tabs: "npm:~15.1.1" rc-textarea: "npm:~1.7.0" rc-tooltip: "npm:~6.2.0" - rc-tree: "npm:~5.8.7" + rc-tree: "npm:~5.8.8" rc-tree-select: "npm:~5.21.0" rc-upload: "npm:~4.5.2" - rc-util: "npm:^5.41.0" + rc-util: "npm:^5.43.0" scroll-into-view-if-needed: "npm:^3.1.0" throttle-debounce: "npm:^5.0.0" peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 10c0/2ea5853bf72c2ec2b409b53b730c633d97ce409807aa65cc607813f20647b9b4c10ec7fc43fb56e1d0298628b3d852aebe1835e1a63365664ac16dde6dae53cf + checksum: 10c0/da0420ef3c22ad205e5198d83da0e3df672ee3e7a9e64ec60e77c51537d6c2e955f223c48d3d8479b4617a8470db2f2de4ecf9611dddf475da47b5959bd78aa1 languageName: node linkType: hard @@ -4850,7 +4876,7 @@ __metadata: languageName: node linkType: hard -"dayjs@npm:^1.11.10, dayjs@npm:^1.11.13": +"dayjs@npm:^1.11.11, dayjs@npm:^1.11.13": version: 1.11.13 resolution: "dayjs@npm:1.11.13" checksum: 10c0/a3caf6ac8363c7dade9d1ee797848ddcf25c1ace68d9fe8678ecf8ba0675825430de5d793672ec87b24a69bf04a1544b176547b2539982275d5542a7955f35b7 @@ -10639,9 +10665,9 @@ __metadata: languageName: node linkType: hard -"rc-dialog@npm:~9.4.0": - version: 9.4.0 - resolution: "rc-dialog@npm:9.4.0" +"rc-dialog@npm:~9.5.2": + version: 9.5.2 + resolution: "rc-dialog@npm:9.5.2" dependencies: "@babel/runtime": "npm:^7.10.1" "@rc-component/portal": "npm:^1.0.0-8" @@ -10651,13 +10677,13 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 10c0/22804e44d7cf5952cce29d92bd180f86bffc9c182165144911e40f209169850aece8ec76a532867ad14272fe5e1ca1b59313af0f62bd7d0f3e37fe2695757677 + checksum: 10c0/e5854b2b99d4336f8c1125f63bb66da6b25959502866fb74c32cede5cad4ee6aa62dba6de79a16082812605193d83d99409f6372b161c2b906e68b9645d7031e languageName: node linkType: hard -"rc-drawer@npm:~7.1.0": - version: 7.1.0 - resolution: "rc-drawer@npm:7.1.0" +"rc-drawer@npm:~7.2.0": + version: 7.2.0 + resolution: "rc-drawer@npm:7.2.0" dependencies: "@babel/runtime": "npm:^7.23.9" "@rc-component/portal": "npm:^1.1.1" @@ -10667,7 +10693,7 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 10c0/7a27192518f853e1d410391a687c2aae7a8760dbdd9bd0a9d864b83aac9b1253517517f89acd389c11bd7d682f557f6515c5405317e5c2010763f4e0de7dbfc6 + checksum: 10c0/d6814998983100193d6a521745324a94fa8d65cbb979b2764d1d48a78d6b6e22f9d078ebb68545b68a0cc38f062298d11ed3635e93d004a60415d384330a8573 languageName: node linkType: hard @@ -10686,9 +10712,9 @@ __metadata: languageName: node linkType: hard -"rc-field-form@npm:~2.0.1": - version: 2.0.1 - resolution: "rc-field-form@npm:2.0.1" +"rc-field-form@npm:~2.2.1": + version: 2.2.1 + resolution: "rc-field-form@npm:2.2.1" dependencies: "@babel/runtime": "npm:^7.18.0" "@rc-component/async-validator": "npm:^5.0.3" @@ -10696,24 +10722,24 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 10c0/432028af840d51f12a723dd7b317a457637b888ebd057e5089bf116365898de3c8d56be3326845e9f713d2ed2b05b963b5f6b6583228a80621a2b4fde7ce8528 + checksum: 10c0/59911ef8222b08df561ea32bf0cc8d0731c796a06de95be9faacd8399be24e9c82343ceb52201df13c061bf75713b43e8d3963de33c41be35b735991c8f0f500 languageName: node linkType: hard -"rc-image@npm:~7.6.0": - version: 7.6.0 - resolution: "rc-image@npm:7.6.0" +"rc-image@npm:~7.9.0": + version: 7.9.0 + resolution: "rc-image@npm:7.9.0" dependencies: "@babel/runtime": "npm:^7.11.2" "@rc-component/portal": "npm:^1.0.2" classnames: "npm:^2.2.6" - rc-dialog: "npm:~9.4.0" + rc-dialog: "npm:~9.5.2" rc-motion: "npm:^2.6.2" rc-util: "npm:^5.34.1" peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 10c0/ed9b0a8815de05ee582f89d062a4116cc85a1b920b125e9fc305d4f6f25da615338b47ebcca04f98fbe546c9822557c986cc30c9456057cd2e48f02673cd57a1 + checksum: 10c0/fd04b8b66447d6c55f6fb298723582b80e51ddf364d7ae9560431f3f6a11622b97f1870755014d22994fadfbaaa21dda80444eee717409300853c1f65764d5b1 languageName: node linkType: hard @@ -10747,9 +10773,9 @@ __metadata: languageName: node linkType: hard -"rc-mentions@npm:~2.13.1": - version: 2.13.2 - resolution: "rc-mentions@npm:2.13.2" +"rc-mentions@npm:~2.14.0": + version: 2.14.0 + resolution: "rc-mentions@npm:2.14.0" dependencies: "@babel/runtime": "npm:^7.22.5" "@rc-component/trigger": "npm:^2.0.0" @@ -10761,7 +10787,7 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 10c0/971f1ceefbe1329e75a2d6b8d6facf9a20cfb1690d3d4a4b86872cb2db38a11557d5320a68507143ea7a9fbd56b0dd49b800af37b67baf3a34e7124c8a9e45fc + checksum: 10c0/43e3da8d736b5656fd2bb1073f81be5b494178123a1ca7834168e596cc2156827bee1d63a780c4338bd71a43368ae4fa445e8174b2ba1f3b29cb5ce70ad1adb4 languageName: node linkType: hard @@ -10782,7 +10808,7 @@ __metadata: languageName: node linkType: hard -"rc-motion@npm:^2.0.0, rc-motion@npm:^2.0.1, rc-motion@npm:^2.3.0, rc-motion@npm:^2.3.4, rc-motion@npm:^2.4.3, rc-motion@npm:^2.4.4, rc-motion@npm:^2.6.1, rc-motion@npm:^2.6.2, rc-motion@npm:^2.9.0, rc-motion@npm:^2.9.1": +"rc-motion@npm:^2.0.0, rc-motion@npm:^2.0.1, rc-motion@npm:^2.3.0, rc-motion@npm:^2.3.4, rc-motion@npm:^2.4.3, rc-motion@npm:^2.4.4, rc-motion@npm:^2.6.1, rc-motion@npm:^2.6.2, rc-motion@npm:^2.9.0": version: 2.9.2 resolution: "rc-motion@npm:2.9.2" dependencies: @@ -10796,9 +10822,23 @@ __metadata: languageName: node linkType: hard -"rc-notification@npm:~5.4.0": - version: 5.4.0 - resolution: "rc-notification@npm:5.4.0" +"rc-motion@npm:^2.9.2": + version: 2.9.3 + resolution: "rc-motion@npm:2.9.3" + dependencies: + "@babel/runtime": "npm:^7.11.1" + classnames: "npm:^2.2.1" + rc-util: "npm:^5.43.0" + peerDependencies: + react: ">=16.9.0" + react-dom: ">=16.9.0" + checksum: 10c0/d83981e8a4e4adf51c80174d7a2ff1461659b84522c70941e74e7b52450f7a4af49992606349d8a5a56237271b6cb38613137266a193501e8442934950ecf9df + languageName: node + linkType: hard + +"rc-notification@npm:~5.6.0": + version: 5.6.2 + resolution: "rc-notification@npm:5.6.2" dependencies: "@babel/runtime": "npm:^7.10.1" classnames: "npm:2.x" @@ -10807,7 +10847,7 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 10c0/f8709d9dfc357a8f12a6f40ad1a5f7c40e06ee3d8936e0f4e68cd7f03f91efb9c3bb69ee992070103f91c9acb241fb70a3fc01b72a4a1359fa110d5dfb5a926a + checksum: 10c0/ce4237ac23a04e6e07ec2610544938c64f08b3035360dccda6f17b6a6494f71fc8a588ae39542c5e06fa1ba96fc95084290a34b7f47f245ee8a23f944376d69c languageName: node linkType: hard @@ -10884,9 +10924,9 @@ __metadata: languageName: node linkType: hard -"rc-rate@npm:~2.12.0": - version: 2.12.0 - resolution: "rc-rate@npm:2.12.0" +"rc-rate@npm:~2.13.0": + version: 2.13.0 + resolution: "rc-rate@npm:2.13.0" dependencies: "@babel/runtime": "npm:^7.10.1" classnames: "npm:^2.2.5" @@ -10894,7 +10934,7 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 10c0/871bb040ec1de727c9b83e0d5db68877c22ef7494f82ce6dedbe655fc7894d7db63e99bed96584eed122e8845270df0b08e2a97a4cc5600e652ce229d561ace5 + checksum: 10c0/3e2c15ee41d20837e820b6a1b83bf83e74ecb36c1da05c9e32c22d864586e7a826c961ba8159468ac9c9ac2fcb03b91a812070a5eb8119e77c2248ef95d6febd languageName: node linkType: hard @@ -10988,7 +11028,7 @@ __metadata: languageName: node linkType: hard -"rc-table@npm:~7.45.6": +"rc-table@npm:~7.45.7": version: 7.45.7 resolution: "rc-table@npm:7.45.7" dependencies: @@ -11005,7 +11045,7 @@ __metadata: languageName: node linkType: hard -"rc-tabs@npm:~15.1.0": +"rc-tabs@npm:~15.1.1": version: 15.1.1 resolution: "rc-tabs@npm:15.1.1" dependencies: @@ -11069,7 +11109,7 @@ __metadata: languageName: node linkType: hard -"rc-tree@npm:~5.8.1, rc-tree@npm:~5.8.7": +"rc-tree@npm:~5.8.1, rc-tree@npm:~5.8.8": version: 5.8.8 resolution: "rc-tree@npm:5.8.8" dependencies: @@ -11099,7 +11139,7 @@ __metadata: languageName: node linkType: hard -"rc-util@npm:^5.0.1, rc-util@npm:^5.16.1, rc-util@npm:^5.17.0, rc-util@npm:^5.18.1, rc-util@npm:^5.2.0, rc-util@npm:^5.20.1, rc-util@npm:^5.21.0, rc-util@npm:^5.24.4, rc-util@npm:^5.25.2, rc-util@npm:^5.27.0, rc-util@npm:^5.30.0, rc-util@npm:^5.31.1, rc-util@npm:^5.32.2, rc-util@npm:^5.34.1, rc-util@npm:^5.35.0, rc-util@npm:^5.36.0, rc-util@npm:^5.37.0, rc-util@npm:^5.38.0, rc-util@npm:^5.38.1, rc-util@npm:^5.40.1, rc-util@npm:^5.41.0, rc-util@npm:^5.43.0": +"rc-util@npm:^5.0.1, rc-util@npm:^5.16.1, rc-util@npm:^5.17.0, rc-util@npm:^5.18.1, rc-util@npm:^5.2.0, rc-util@npm:^5.20.1, rc-util@npm:^5.21.0, rc-util@npm:^5.24.4, rc-util@npm:^5.25.2, rc-util@npm:^5.27.0, rc-util@npm:^5.30.0, rc-util@npm:^5.31.1, rc-util@npm:^5.32.2, rc-util@npm:^5.34.1, rc-util@npm:^5.35.0, rc-util@npm:^5.36.0, rc-util@npm:^5.37.0, rc-util@npm:^5.38.0, rc-util@npm:^5.38.1, rc-util@npm:^5.40.1, rc-util@npm:^5.43.0": version: 5.43.0 resolution: "rc-util@npm:5.43.0" dependencies: @@ -12775,7 +12815,7 @@ __metadata: languageName: node linkType: hard -"stylis@npm:^4.3.3": +"stylis@npm:^4.3.4": version: 4.3.4 resolution: "stylis@npm:4.3.4" checksum: 10c0/4899c2674cd2538e314257abd1ba7ea3c2176439659ddac6593c78192cfd4a06f814a0a4fc69bc7f8fcc6b997e13d383dd9b578b71074746a0fb86045a83e42d @@ -13928,7 +13968,7 @@ __metadata: "@zip.js/zip.js": "npm:^2.7.32" abort-controller: "npm:^3.0.0" ansi-to-react: "npm:^6.1.6" - antd: "npm:5.17.4" + antd: "npm:5.18" ava: "npm:^6.1.3" ball-morphology: "npm:^0.1.0" base64-js: "npm:^1.2.1"