Skip to content

Commit 4040fa9

Browse files
authored
Merge branch 'main' into fix/trailing-comma-highlight
2 parents 8557b99 + 7ef883c commit 4040fa9

21 files changed

Lines changed: 1361 additions & 164 deletions

File tree

packages/browser-tests/cypress/integration/auth/auth.spec.js

Lines changed: 52 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ const interceptSettings = (payload) => {
1212
describe("OSS", () => {
1313
before(() => {
1414
interceptSettings({
15-
"release.type": "OSS",
16-
"release.version": "1.2.3",
15+
"config": {
16+
"release.type": "OSS",
17+
"release.version": "1.2.3",
18+
}
1719
});
1820
cy.visit(baseUrl);
1921
});
@@ -27,16 +29,18 @@ describe("OSS", () => {
2729
describe("Auth - UI", () => {
2830
before(() => {
2931
interceptSettings({
30-
"release.type": "EE",
31-
"release.version": "1.2.3",
32-
"acl.enabled": true,
33-
"acl.basic.auth.realm.enabled": false,
34-
"acl.oidc.enabled": false,
35-
"acl.oidc.client.id": null,
36-
"acl.oidc.authorization.endpoint": null,
37-
"acl.oidc.token.endpoint": null,
38-
"acl.oidc.pkce.required": null,
39-
"acl.oidc.groups.encoded.in.token": false,
32+
"config": {
33+
"release.type": "EE",
34+
"release.version": "1.2.3",
35+
"acl.enabled": true,
36+
"acl.basic.auth.realm.enabled": false,
37+
"acl.oidc.enabled": false,
38+
"acl.oidc.client.id": null,
39+
"acl.oidc.authorization.endpoint": null,
40+
"acl.oidc.token.endpoint": null,
41+
"acl.oidc.pkce.required": null,
42+
"acl.oidc.groups.encoded.in.token": false,
43+
}
4044
});
4145
cy.visit(baseUrl);
4246
});
@@ -52,16 +56,18 @@ describe("Auth - UI", () => {
5256
describe("Auth - OIDC", () => {
5357
before(() => {
5458
interceptSettings({
55-
"release.type": "EE",
56-
"release.version": "1.2.3",
57-
"acl.enabled": true,
58-
"acl.basic.auth.realm.enabled": false,
59-
"acl.oidc.enabled": true,
60-
"acl.oidc.client.id": "test",
61-
"acl.oidc.authorization.endpoint": "https://host:9999/auth",
62-
"acl.oidc.token.endpoint": "https://host:9999/token",
63-
"acl.oidc.pkce.required": true,
64-
"acl.oidc.groups.encoded.in.token": false,
59+
"config": {
60+
"release.type": "EE",
61+
"release.version": "1.2.3",
62+
"acl.enabled": true,
63+
"acl.basic.auth.realm.enabled": false,
64+
"acl.oidc.enabled": true,
65+
"acl.oidc.client.id": "test",
66+
"acl.oidc.authorization.endpoint": "https://host:9999/auth",
67+
"acl.oidc.token.endpoint": "https://host:9999/token",
68+
"acl.oidc.pkce.required": true,
69+
"acl.oidc.groups.encoded.in.token": false,
70+
}
6571
});
6672
cy.visit(baseUrl);
6773
});
@@ -77,16 +83,18 @@ describe("Auth - OIDC", () => {
7783
describe("Auth - Basic", () => {
7884
before(() => {
7985
interceptSettings({
80-
"release.type": "EE",
81-
"release.version": "1.2.3",
82-
"acl.enabled": true,
83-
"acl.basic.auth.realm.enabled": true,
84-
"acl.oidc.enabled": false,
85-
"acl.oidc.client.id": null,
86-
"acl.oidc.authorization.endpoint": null,
87-
"acl.oidc.token.endpoint": null,
88-
"acl.oidc.pkce.required": null,
89-
"acl.oidc.groups.encoded.in.token": false,
86+
"config": {
87+
"release.type": "EE",
88+
"release.version": "1.2.3",
89+
"acl.enabled": true,
90+
"acl.basic.auth.realm.enabled": true,
91+
"acl.oidc.enabled": false,
92+
"acl.oidc.client.id": null,
93+
"acl.oidc.authorization.endpoint": null,
94+
"acl.oidc.token.endpoint": null,
95+
"acl.oidc.pkce.required": null,
96+
"acl.oidc.groups.encoded.in.token": false,
97+
}
9098
});
9199
cy.visit(baseUrl);
92100
});
@@ -100,16 +108,18 @@ describe("Auth - Basic", () => {
100108
describe("Auth - Disabled", () => {
101109
before(() => {
102110
interceptSettings({
103-
"release.type": "EE",
104-
"release.version": "1.2.3",
105-
"acl.enabled": false,
106-
"acl.basic.auth.realm.enabled": true,
107-
"acl.oidc.enabled": false,
108-
"acl.oidc.client.id": null,
109-
"acl.oidc.authorization.endpoint": null,
110-
"acl.oidc.token.endpoint": null,
111-
"acl.oidc.pkce.required": null,
112-
"acl.oidc.groups.encoded.in.token": false,
111+
"config": {
112+
"release.type": "EE",
113+
"release.version": "1.2.3",
114+
"acl.enabled": false,
115+
"acl.basic.auth.realm.enabled": true,
116+
"acl.oidc.enabled": false,
117+
"acl.oidc.client.id": null,
118+
"acl.oidc.authorization.endpoint": null,
119+
"acl.oidc.token.endpoint": null,
120+
"acl.oidc.pkce.required": null,
121+
"acl.oidc.groups.encoded.in.token": false,
122+
}
113123
});
114124
cy.visit(baseUrl);
115125
});

packages/browser-tests/cypress/integration/console/telemetry.spec.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ describe("telemetry config", () => {
2222
cy.wait("@telemetryConfig").then(({ response }) => {
2323
const columnNames = response.body.columns.map((c) => c.name);
2424
expect(response.statusCode).to.equal(200);
25-
["id", "enabled", "version", "os", "package"].forEach((name) => {
25+
["id", "enabled", "version", "os", "package", "instance_name", "instance_type", "instance_desc"].forEach((name) => {
2626
expect(columnNames).to.include(name);
2727
});
2828
expect(response.body.dataset[0][0]).to.be.string;
@@ -34,6 +34,9 @@ describe("telemetry config", () => {
3434
expect(typeof response.body.dataset[0][4]).to.satisfy(
3535
(v) => v === null || typeof v === "string"
3636
);
37+
expect(response.body.dataset[0][5]).to.be.string;
38+
expect(response.body.dataset[0][6]).to.be.string;
39+
expect(response.body.dataset[0][7]).to.be.string;
3740
});
3841
});
3942
});
@@ -62,7 +65,7 @@ describe("telemetry enabled", () => {
6265
it("should start telemetry when enabled", () => {
6366
cy.wait("@telemetryConfig").then(({ response }) => {
6467
cy.wait("@addTelemetry").then(({ request }) => {
65-
const payload = JSON.parse(request.body);
68+
const payload = request.body;
6669
expect(payload.id).to.equal(response.body.dataset[0][0]);
6770
expect(payload.version).to.equal(response.body.dataset[0][2]);
6871
expect(payload.os).to.equal(response.body.dataset[0][3]);
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/// <reference types="cypress" />
2+
3+
describe("TopBar", () => {
4+
beforeEach(() => {
5+
cy.loadConsoleWithAuth();
6+
});
7+
8+
it("should show the instance warning and no description", () => {
9+
cy.getByDataHook("topbar-instance-name").should(
10+
"have.text",
11+
"Instance name is not set"
12+
);
13+
cy.getByDataHook("topbar-instance-badge").should(
14+
"have.css",
15+
"background-color",
16+
"rgb(40, 42, 54)"
17+
);
18+
});
19+
20+
it("should preview the color, show error when instance name is empty, and don't save changes on cancel", () => {
21+
cy.getByDataHook("topbar-instance-name").realHover();
22+
cy.getByDataHook("topbar-instance-edit-icon").should("be.visible");
23+
cy.getByDataHook("topbar-instance-edit-icon").click();
24+
cy.getByDataHook("topbar-instance-color-option-r").click();
25+
cy.getByDataHook("topbar-instance-badge").should(
26+
"have.css",
27+
"background-color",
28+
"rgb(199, 7, 45)"
29+
);
30+
cy.getByDataHook("topbar-instance-save-button").click();
31+
cy.contains("Instance name is required").should("be.visible");
32+
cy.getByDataHook("topbar-instance-cancel-button").click();
33+
cy.getByDataHook("topbar-instance-name").should(
34+
"have.text",
35+
"Instance name is not set"
36+
);
37+
cy.getByDataHook("topbar-instance-badge").should(
38+
"have.css",
39+
"background-color",
40+
"rgb(40, 42, 54)"
41+
);
42+
});
43+
44+
it("should change the instance name, description, and type", () => {
45+
cy.getByDataHook("topbar-instance-badge").realHover();
46+
cy.getByDataHook("topbar-instance-edit-icon").should("be.visible");
47+
cy.getByDataHook("topbar-instance-edit-icon").click();
48+
cy.getByDataHook("topbar-instance-name-input").type("test-instance");
49+
cy.getByDataHook("topbar-instance-type-select").select("production");
50+
cy.getByDataHook("topbar-instance-description-input").type(
51+
"test description of the test instance"
52+
);
53+
cy.getByDataHook("topbar-instance-color-option-g").click();
54+
cy.getByDataHook("topbar-instance-save-button").click();
55+
cy.getByDataHook("topbar-instance-save-button").should("not.exist");
56+
cy.getByDataHook("topbar-instance-name").should("contain", "Production");
57+
cy.getByDataHook("topbar-instance-name").should("contain", "test-instance");
58+
cy.getByDataHook("topbar-instance-icon").realHover();
59+
cy.contains("test description of the test instance").should("be.visible");
60+
cy.contains(
61+
"You are connected to a QuestDB instance for production"
62+
).should("be.visible");
63+
});
64+
});

packages/browser-tests/cypress/integration/enterprise/oidc.spec.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,19 @@ describe("OIDC authentication", () => {
4040

4141
// load login page
4242
interceptSettings({
43-
"release.type": "EE",
44-
"release.version": "1.2.3",
45-
"acl.enabled": true,
46-
"acl.basic.auth.realm.enabled": false,
47-
"acl.oidc.enabled": true,
48-
"acl.oidc.client.id": "client1",
49-
"acl.oidc.authorization.endpoint": oidcAuthorizationCodeUrl,
50-
"acl.oidc.token.endpoint": oidcTokenUrl,
51-
"acl.oidc.pkce.required": true,
52-
"acl.oidc.state.required": false,
53-
"acl.oidc.groups.encoded.in.token": false,
43+
"config": {
44+
"release.type": "EE",
45+
"release.version": "1.2.3",
46+
"acl.enabled": true,
47+
"acl.basic.auth.realm.enabled": false,
48+
"acl.oidc.enabled": true,
49+
"acl.oidc.client.id": "client1",
50+
"acl.oidc.authorization.endpoint": oidcAuthorizationCodeUrl,
51+
"acl.oidc.token.endpoint": oidcTokenUrl,
52+
"acl.oidc.pkce.required": true,
53+
"acl.oidc.state.required": false,
54+
"acl.oidc.groups.encoded.in.token": false,
55+
}
5456
});
5557
cy.visit(baseUrl);
5658

packages/browser-tests/questdb

Submodule questdb updated 216 files

packages/web-console/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,16 @@ and this project adheres to
1717
- `Security` in case of vulnerabilities.
1818

1919

20+
## 0.7.11 - 2025.05.23
21+
### Added
22+
- instance naming UI [#427](https://github.com/questdb/ui/pull/427)
23+
- make SSO re-authentication optional on logout [#412](https://github.com/questdb/ui/pull/412)
24+
25+
### Fixed
26+
- wait for all body to be streamed before calculating network time [#429](https://github.com/questdb/ui/pull/429)
27+
- jit compiled icon shrink problem and notifications height [#428](https://github.com/questdb/ui/pull/428)
28+
29+
2030
## 0.7.10 - 2025.04.28
2131
### Added
2232
- owner setting for tables created during CSV import [#413](https://github.com/questdb/ui/pull/413)

packages/web-console/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@questdb/web-console",
3-
"version": "0.7.10",
3+
"version": "0.7.11",
44
"license": "Apache-2.0",
55
"description": "QuestDB Console",
66
"files": [

packages/web-console/src/components/PopperToggle/index.tsx

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,35 +86,61 @@ export const PopperToggle = ({
8686
return
8787
}
8888

89-
setActive(false)
89+
if (_active) {
90+
setActive(false)
91+
if (onToggle) {
92+
onToggle(false)
93+
}
94+
}
95+
},
96+
[container, onToggle, triggerElement, _active],
97+
)
9098

91-
if (onToggle) {
92-
onToggle(false)
99+
const handleKeyDown = useCallback(
100+
(event: KeyboardEvent) => {
101+
if (event.key === "Escape" && _active) {
102+
setActive(false)
103+
104+
if (onToggle) {
105+
onToggle(false)
106+
}
93107
}
94108
},
95-
[container, onToggle, triggerElement],
109+
[_active, onToggle],
96110
)
97111

98112
usePopperStyles(container, styles.popper)
99113

100114
useTransition(container, _active, transitionTimeoutId)
101115

102116
useEffect(() => {
103-
setActive(typeof active === "undefined" ? _active || false : active)
104-
}, [active, _active])
117+
if (typeof active !== "undefined") {
118+
setActive(active)
119+
}
120+
}, [active])
121+
122+
useEffect(() => {
123+
document.body.appendChild(container)
124+
125+
return () => {
126+
clearTimeout(transitionTimeoutId.current)
127+
if (document.body.contains(container)) {
128+
document.body.removeChild(container)
129+
}
130+
}
131+
}, [container])
105132

106133
useEffect(() => {
107134
document.addEventListener("mousedown", handleMouseDown)
108135
document.addEventListener("touchstart", handleMouseDown)
136+
document.addEventListener("keydown", handleKeyDown)
109137

110138
return () => {
111-
// eslint-disable-next-line react-hooks/exhaustive-deps
112-
clearTimeout(transitionTimeoutId.current)
113139
document.removeEventListener("mousedown", handleMouseDown)
114140
document.removeEventListener("touchstart", handleMouseDown)
115-
document.body.contains(container) && document.body.removeChild(container)
141+
document.removeEventListener("keydown", handleKeyDown)
116142
}
117-
}, [container, handleMouseDown])
143+
}, [handleMouseDown, handleKeyDown])
118144

119145
return (
120146
<>

0 commit comments

Comments
 (0)