Skip to content

Commit 04922de

Browse files
committed
Merge branch 'master' into virtual-remote-datasets
2 parents e64fd7b + deaaa2c commit 04922de

File tree

60 files changed

+1883
-1727
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+1883
-1727
lines changed

CHANGELOG.released.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
77
and this project adheres to [Calendar Versioning](http://calver.org/) `0Y.0M.MICRO`.
88
For upgrade instructions, please check the [migration guide](MIGRATIONS.released.md).
99

10+
## [25.06.1](https://github.com/scalableminds/webknossos/releases/tag/25.06.1) - 2025-06-03
11+
[Commits](https://github.com/scalableminds/webknossos/compare/25.06.0...25.06.1)
12+
13+
### Fixed
14+
- Fixed viewing the results of volume annotation tasks in compound view. [#8668](https://github.com/scalableminds/webknossos/pull/8668)
15+
1016
## [25.06.0](https://github.com/scalableminds/webknossos/releases/tag/25.06.0) - 2025-05-26
1117
[Commits](https://github.com/scalableminds/webknossos/compare/25.05.1...25.06.0)
1218

@@ -22,7 +28,7 @@ For upgrade instructions, please check the [migration guide](MIGRATIONS.released
2228
- Added the possibility for super users to retry manually cancelled jobs from the jobs list. [#8629](https://github.com/scalableminds/webknossos/pull/8629)
2329

2430
### Changed
25-
- Remove `data.maybe` dependency and replaced with regular Typescript types. [#8563](https://github.com/scalableminds/webknossos/pull/8563)
31+
- Removed `data.maybe` dependency and replaced with regular Typescript types. [#8563](https://github.com/scalableminds/webknossos/pull/8563)
2632
- Updated `View Modes` documentation page with links for mouse and keyboard shortcuts. [#8582](https://github.com/scalableminds/webknossos/pull/8582)
2733
- Renamed the button to view the compound annotation of all tasks of a tasktype to be more descriptive. [#8565](https://github.com/scalableminds/webknossos/pull/8565)
2834
- Replaced fixed threshold of 40 meshes by a dynamic limit based on the number of triangles in the mesh for the "Create Animation" job. [#8588](https://github.com/scalableminds/webknossos/pull/8588)

CHANGELOG.unreleased.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,19 @@ and this project adheres to [Calendar Versioning](http://calver.org/) `0Y.0M.MIC
88
For upgrade instructions, please check the [migration guide](MIGRATIONS.released.md).
99

1010
## Unreleased
11-
[Commits](https://github.com/scalableminds/webknossos/compare/25.06.0...HEAD)
11+
[Commits](https://github.com/scalableminds/webknossos/compare/25.06.1...HEAD)
1212

1313
### Added
14+
- Added the ability to duplicate trees in skeleton annotations. Users can create a copy of any tree (including all nodes, edges, and properties) via the context menu in the skeleton tab. [#8662](https://github.com/scalableminds/webknossos/pull/8662)
15+
- Meshes are now reloaded using their previous opacity value. [#8622](https://github.com/scalableminds/webknossos/pull/8622)
1416

1517
### Changed
1618

1719
### Fixed
1820
- Improved efficiency of saving bounding box related changes. [#8492](https://github.com/scalableminds/webknossos/pull/8492)
19-
- Fixed regression which caused the import of trees (also of agglomerate skeletons) to crash if the annotation was not empty. [#8656](https://github.com/scalableminds/webknossos/pull/8656)
2021
- When deleting a dataset, its caches are cleared, so that if a new dataset by the same name is uploaded afterwards, only new data is loaded. [#8638](https://github.com/scalableminds/webknossos/pull/8638)
22+
- Fixed a race condition when starting proofreading with a split action. [#8676](https://github.com/scalableminds/webknossos/pull/8676)
23+
- Fixed that activating a mapping got stuck when a dataset was opened in "view" mode. [#8687](https://github.com/scalableminds/webknossos/pull/8687)
2124

2225
### Removed
2326

MIGRATIONS.released.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ See `MIGRATIONS.unreleased.md` for the changes which are not yet part of an offi
66
This project adheres to [Calendar Versioning](http://calver.org/) `0Y.0M.MICRO`.
77
User-facing changes are documented in the [changelog](CHANGELOG.released.md).
88

9+
## [25.06.1](https://github.com/scalableminds/webknossos/releases/tag/25.06.1) - 2025-06-03
10+
[Commits](https://github.com/scalableminds/webknossos/compare/25.06.0...25.06.1)
11+
12+
### Postgres Evolutions:
13+
None.
14+
915
## [25.06.0](https://github.com/scalableminds/webknossos/releases/tag/25.06.0) - 2025-05-26
1016
[Commits](https://github.com/scalableminds/webknossos/compare/25.05.1...25.06.0)
1117

MIGRATIONS.unreleased.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ This project adheres to [Calendar Versioning](http://calver.org/) `0Y.0M.MICRO`.
66
User-facing changes are documented in the [changelog](CHANGELOG.released.md).
77

88
## Unreleased
9-
[Commits](https://github.com/scalableminds/webknossos/compare/25.06.0...HEAD)
9+
[Commits](https://github.com/scalableminds/webknossos/compare/25.06.1...HEAD)
1010

11-
### Postgres Evolutions:
11+
- The default thread pool size was increased from 5 to 10 times the number of available CPUs (capped at 1000). Note that wk may need slightly more memory because of this. [#8686](https://github.com/scalableminds/webknossos/pull/8686)
1212

13+
### Postgres Evolutions:
1314
- [134-dataset-layer-attachments.sql](conf/evolutions/134-dataset-layer-attachments.sql)

conf/application.conf

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ play {
6666
pekko.actor.default-dispatcher {
6767
# We use a compromise for our thread pool configuration
6868
# Parts of our api are async, so they should not need many threads,
69-
# but some parts are also blocking (file io, gcs, s3 access), causing new requests
69+
# but some parts are also blocking (some file io, gcs access), causing new requests
7070
# to wait despite idle cpu, if there are too few threads
7171
fork-join-executor {
72-
parallelism-factor = 5.0 # Thread count = ceil(available processors * factor)
72+
parallelism-factor = 10.0 # Thread count = ceil(available processors * factor)
7373
parallelism-min = 8 # Min number of threads to cap factor-based parallelism number to
74-
parallelism-max = 300 # Max number of threads to cap factor-based parallelism number to
74+
parallelism-max = 1000 # Max number of threads to cap factor-based parallelism number to
7575
}
7676
}
7777

frontend/javascripts/admin/rest_api.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import dayjs from "dayjs";
22
import { V3 } from "libs/mjs";
3-
import type { RequestOptions } from "libs/request";
3+
import type { RequestOptions, RequestOptionsWithData } from "libs/request";
44
import Request from "libs/request";
55
import type { Message } from "libs/toast";
66
import Toast from "libs/toast";
@@ -90,6 +90,7 @@ import type {
9090
MappingType,
9191
NumberLike,
9292
PartialDatasetConfiguration,
93+
SaveQueueEntry,
9394
StoreAnnotation,
9495
TraceOrViewCommand,
9596
UserConfiguration,
@@ -2398,3 +2399,12 @@ export function requestVerificationMail() {
23982399
method: "POST",
23992400
});
24002401
}
2402+
2403+
export function sendSaveRequestWithToken(
2404+
urlWithoutToken: string,
2405+
data: RequestOptionsWithData<Array<SaveQueueEntry>>,
2406+
): Promise<void> {
2407+
// Ideally, this function should be refactored further so that it generates the
2408+
// correct urlWithoutToken itself.
2409+
return doWithToken((token) => Request.sendJSONReceiveJSON(`${urlWithoutToken}${token}`, data));
2410+
}

frontend/javascripts/components/color_picker.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { InputNumber, Popover } from "antd";
22
import useThrottledCallback from "beautiful-react-hooks/useThrottledCallback";
33
import * as Utils from "libs/utils";
4-
import { useRef, useState } from "react";
4+
import { useEffect, useRef, useState } from "react";
55
import type { CSSProperties } from "react";
66
import { HexColorInput, HexColorPicker, type RgbaColor, RgbaColorPicker } from "react-colorful";
77
import type { Vector3, Vector4 } from "viewer/constants";
@@ -36,14 +36,20 @@ const ThrottledColorPicker = ({
3636
}) => {
3737
const [value, localSetValue] = useState(color);
3838
const throttledSetValue = useThrottledCallback(onChange, [onChange], 20);
39+
40+
// Sync local state when external color prop changes
41+
useEffect(() => {
42+
localSetValue(color);
43+
}, [color]);
44+
3945
const setValue = (newValue: string) => {
4046
localSetValue(newValue);
4147
throttledSetValue(newValue);
4248
};
4349
return (
4450
<div style={{ marginRight: 10 }}>
4551
<HexColorPicker color={value} onChange={setValue} />
46-
<HexColorInput color={color} onChange={setValue} style={inputStyle} />
52+
<HexColorInput color={value} onChange={setValue} style={inputStyle} />
4753
</div>
4854
);
4955
};
@@ -90,6 +96,12 @@ const ThrottledRGBAColorPicker = ({
9096
}) => {
9197
const [value, localSetValue] = useState(color);
9298
const throttledSetValue = useThrottledCallback(onChangeColor, [onChangeColor, value], 20);
99+
100+
// Sync local state when external color prop changes
101+
useEffect(() => {
102+
localSetValue(color);
103+
}, [color]);
104+
93105
const setValue = (newValue: RgbaColor) => {
94106
localSetValue(newValue);
95107
throttledSetValue(newValue);

frontend/javascripts/libs/utils.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,3 +1303,11 @@ export function getPhraseFromCamelCaseString(stringInCamelCase: string): string
13031303
.map((word) => capitalize(word.replace(/(^|\s)td/, "$13D")))
13041304
.join(" ");
13051305
}
1306+
1307+
export function areSetsEqual<T>(setA: Set<T>, setB: Set<T>) {
1308+
if (setA.size !== setB.size) return false;
1309+
for (const val of setA) {
1310+
if (!setB.has(val)) return false;
1311+
}
1312+
return true;
1313+
}

frontend/javascripts/test/api/api_skeleton_latest.spec.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ import { vi, describe, it, expect, beforeEach } from "vitest";
88
import type { Vector3 } from "viewer/constants";
99
import { enforceSkeletonTracing } from "viewer/model/accessors/skeletontracing_accessor";
1010

11-
// All the mocking is done in the helpers file, so it can be reused for both skeleton and volume API
1211
describe("API Skeleton", () => {
1312
beforeEach<WebknossosTestContext>(async (context) => {
14-
await setupWebknossosForTesting(context, "skeleton");
13+
await setupWebknossosForTesting(context, "skeleton", { dontDispatchWkReady: true });
1514
});
1615

1716
it<WebknossosTestContext>("getActiveNodeId should get the active node id", ({ api }) => {

frontend/javascripts/test/api/api_volume_latest.spec.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
} from "../fixtures/volumetracing_server_objects";
88
import { AnnotationTool } from "viewer/model/accessors/tool_accessor";
99

10-
// All the mocking is done in the helpers file, so it can be reused for both skeleton and volume API
1110
describe("API Volume", () => {
1211
beforeEach<WebknossosTestContext>(async (context) => {
1312
await setupWebknossosForTesting(context, "volume");

0 commit comments

Comments
 (0)