Skip to content

Commit 2a02bc0

Browse files
authored
SY-2816: Synnax v0.44.5 (#1387)
1 parent fd0a819 commit 2a02bc0

17 files changed

Lines changed: 284 additions & 55 deletions

File tree

console/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@synnaxlabs/console",
33
"private": true,
4-
"version": "0.44.7",
4+
"version": "0.44.8",
55
"type": "module",
66
"scripts": {
77
"check-types": "tsc --noEmit",

console/src/lineplot/SelectAxis.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export const SelectMultipleAxesInputItem = ({
4040
initialParams={SEARCH_OPTIONS}
4141
onChange={useCallback((v: channel.Key[]) => onChange(axis, v), [onChange, axis])}
4242
full="x"
43+
location="top"
4344
{...selectProps}
4445
/>
4546
</Input.Item>

docs/site/src/pages/reference/cluster/installation.mdx

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -73,21 +73,6 @@ echo 'export PATH=$PATH:/usr/local/bin' >> ~/.zshrc
7373
If any previous versions of Synnax are installed and available on your `PATH`, you may
7474
need to remove them to avoid conflicts.
7575

76-
<Note.Note variant="warning">
77-
If you've also installed the [Synnax Python
78-
Client](/reference/python-client/get-started), its `synnax` command may take precedence
79-
over the one you just installed. To avoid conflicts, rename the binary you've just
80-
installed to something else, like `synnax-server` by running (you may need to use
81-
`sudo`):
82-
83-
```
84-
mv /usr/local/bin/synnax /usr/local/bin/synnax-server
85-
```
86-
87-
Then, you can run the binary using `synnax-server` instead of `synnax`.
88-
89-
</Note.Note>
90-
9176
Next, give execution permissions to the binary:
9277

9378
```bash
@@ -138,20 +123,6 @@ echo 'export PATH=$PATH:/usr/local/bin' >> ~/.zshrc
138123
If any previous versions of Synnax are installed and available on your `PATH`, you may
139124
need to remove them to avoid conflicts.
140125

141-
<Note.Note variant="warning">
142-
If you've also installed the [Synnax Python
143-
Client](/reference/python-client/get-started), its `synnax` command may take precedence
144-
over the one you just installed. To avoid conflicts, rename the binary you've just
145-
installed to something else, like `synnax-server` by running:
146-
147-
```
148-
mv /usr/local/bin/synnax /usr/local/bin/synnax-server
149-
```
150-
151-
Then, you can run the binary using `synnax-server` instead of `synnax`.
152-
153-
</Note.Note>
154-
155126
Next, give execution permissions to the binary:
156127

157128
```bash
@@ -191,13 +162,6 @@ Install the Synnax cluster on Windows by downloading and running the latest inst
191162
<br />
192163
<br />
193164

194-
<Note.Note variant="warning">
195-
If you've also installed the [Synnax Python
196-
Client](/reference/python-client/get-started), its `synnax` command may take
197-
precedence over the one you just installed. You can alternatively use the
198-
`synnax-server` command which has also been added to your `PATH`.
199-
</Note.Note>
200-
201165
To verify that the installation was successful, run the following command in a
202166
**PowerShell** terminal:
203167

docs/site/src/pages/releases/0-43-0.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: "Version 0.42 Release Notes"
2+
title: "Version 0.43 Release Notes"
33
---
44

55
import Release from "@/components/releases/Release.astro";
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
---
2+
title: "Version 0.44 Release Notes"
3+
---
4+
5+
import Release from "@/components/releases/Release.astro";
6+
import { Image, Video } from "@/components/Media";
7+
import { mdxOverrides } from "@/components/mdxOverrides";
8+
import { Divider, Flex } from "@synnaxlabs/pluto";
9+
10+
export const components = mdxOverrides;
11+
12+
<Release
13+
version="0.44.0"
14+
date="Aug 11, 2025"
15+
title="Embedded Console"
16+
>
17+
18+
<Image client:only="react" id="releases/0-44-0/thumbnail" themed={false} />
19+
20+
Synnax v0.44 introduces an embedded Console into the Synnax Cluster, which can be used
21+
in place of the desktop Console application.
22+
23+
We've also improved the data export process by adding dedicated CSV export buttons to
24+
both ranges and line plots.
25+
26+
As always, this release comes with a number of additional performance, stability, and
27+
user experience improvements to Synnax.
28+
29+
<Divider.Divider x />
30+
31+
### Embedded Console
32+
33+
Every Synnax cluster now comes with an embedded, browser-based Console. After starting
34+
the cluster using the default port of `9090`, you can access the Console at
35+
`http://localhost:9090`.
36+
37+
All functionality of the desktop Console is available in the embedded Console, with the
38+
notable exception of multi-window functionality.
39+
40+
The desktop Console will continue to be supported, and it's still our preferred way to
41+
work with a Synnax deployment.
42+
43+
<Divider.Divider x />
44+
45+
### Data Export
46+
47+
We've added dedicated CSV export buttons to both ranges and line plots, making it much
48+
easier to export data from Synnax for analysis.
49+
50+
<Flex.Box x justify="center">
51+
<Image
52+
client:only="react"
53+
id="releases/0-44-0/csv"
54+
themed={false}
55+
style={{ width: 350 }}
56+
/>
57+
</Flex.Box>
58+
59+
<Divider.Divider x />
60+
61+
### Legend Y-Axis Indicators
62+
63+
The line plot legend now separates lines to into groups by their corresponding y-axis.
64+
65+
<Flex.Box x justify="center">
66+
<Image
67+
client:only="react"
68+
id="releases/0-44-0/legend"
69+
themed={false}
70+
style={{ width: 100 }}
71+
/>
72+
</Flex.Box>
73+
74+
<Divider.Divider x />
75+
76+
### Added Methods for Reading the Latest Values from a Channel
77+
78+
We've added new methods in the Python and TypeScript clients for reading the most recent
79+
values written to one or more channels.
80+
81+
##### Python
82+
83+
In Python, simply call `read_latest` with the channels and the number of values you want
84+
to read. Additional documentation can be found
85+
[here](/reference/python-client/read-data).
86+
87+
```python
88+
import synnax as sy
89+
90+
client = sy.Synnax()
91+
92+
print(client.read_latest(["daq_time", "ox_pt_1"], 1))
93+
# {
94+
# "daq_time": [1723200000000000000],
95+
# "ox_pt_1": [100.0]
96+
# }
97+
```
98+
99+
##### TypeScript
100+
101+
The TypeScript client has a `readLatest` method that works in the same way. Additional
102+
documentation can be found [here](/reference/typescript-client/read-data).
103+
104+
```typescript
105+
import { Synnax } from "@synnaxlabs/client";
106+
107+
const client = new Synnax();
108+
109+
console.log(client.readLatest(["daq_time", "ox_pt_1"], 1));
110+
// {
111+
// "daq_time": [1723200000000000000],
112+
// "ox_pt_1": [100.0]
113+
// }
114+
```
115+
116+
<Divider.Divider x />
117+
118+
### Minor Improvements and Bug Fixes
119+
120+
- Added status indicators for devices and drivers to selection dialogs.
121+
- Made a number of updates to real-time data fetching infrastructure, improving the
122+
reactivity and performance of the cosnole.
123+
- Added `Command + W` and `Control + W` keyboard shortcuts to close modals, and added a
124+
press and hold delay to close the application on MacOS.
125+
- Fixed an issue where the Palette would not properly switch between command and search
126+
modes when closed and re-opened.
127+
- Added drag and drop importing and exporting of tasks.
128+
129+
</Release>

docs/site/src/pages/releases/index.mdx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,17 @@ import Release0400 from "@/pages/releases/0-40-0.mdx";
1616
import Release0410 from "@/pages/releases/0-41-0.mdx";
1717
import Release0420 from "@/pages/releases/0-42-0.mdx";
1818
import Release0430 from "@/pages/releases/0-43-0.mdx";
19+
import Release0440 from "@/pages/releases/0-44-0.mdx";
1920
import { mdxOverrides } from "@/components/mdxOverrides";
2021
export const components = mdxOverrides;
2122

2223
import { Divider } from "@synnaxlabs/pluto";
2324

25+
<Divider.Divider x />
26+
<div class="release-wrapper">
27+
###### 0.44
28+
<Release0440 />
29+
</div>
2430
<Divider.Divider x />
2531
<div class="release-wrapper">
2632
###### 0.43

pluto/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@synnaxlabs/pluto",
3-
"version": "0.44.7",
3+
"version": "0.44.8",
44
"type": "module",
55
"scripts": {
66
"build": "tsc --noEmit && vite build",

pluto/src/dialog/Frame.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import {
2323
import { type Component } from "@/component";
2424
import { CSS } from "@/css";
2525
import { BACKGROUND_CLASS } from "@/dialog/Background";
26-
import { type LocationPreference, position } from "@/dialog/position";
26+
import { type LocationPreference, position, type Preference } from "@/dialog/position";
2727
import { Flex } from "@/flex";
2828
import {
2929
useClickOutside,
@@ -178,7 +178,7 @@ export const Frame = ({
178178

179179
const visibleRef = useSyncedRef(visible);
180180
const targetRef = useRef<HTMLDivElement>(null);
181-
const prevLocation = useRef<xlocation.XY | undefined>(undefined);
181+
const prevLocationPreference = useRef<Preference | undefined>(undefined);
182182
const prevBox = useRef<box.Box | undefined>(undefined);
183183
const dialogRef = useRef<HTMLDivElement>(null);
184184

@@ -202,17 +202,21 @@ export const Frame = ({
202202
return { ...prev, modalPosition };
203203
});
204204
}
205+
let prefer = PREFERENCES;
206+
if (prevLocationPreference.current != null)
207+
prefer = [prevLocationPreference.current, ...PREFERENCES];
205208
// In the connected or floating case, we use a more sophisticated positioning
206209
// algorithm.
207-
const { adjustedDialog, targetCorner, dialogCorner } = position({
210+
const { adjustedDialog, ...locations } = position({
208211
target,
209212
dialog,
210213
container: windowBox,
211-
prefer: PREFERENCES,
214+
prefer,
212215
initial: propsLocation,
213216
offset: 3,
214217
});
215-
prevLocation.current = targetCorner;
218+
prevLocationPreference.current = locations;
219+
const { targetCorner, dialogCorner } = locations;
216220
const roundedDialog = box.round(adjustedDialog);
217221
if (positionsEqual(variant, roundedDialog, prevBox.current)) return;
218222
prevBox.current = roundedDialog;

0 commit comments

Comments
 (0)