From 5ed1f50112dd77355a361695d101537ec12b4d51 Mon Sep 17 00:00:00 2001 From: Andrew Stein Date: Sun, 29 Mar 2026 16:55:34 -0400 Subject: [PATCH 1/2] New logo Signed-off-by: Andrew Stein --- docs/static/svg/perspective_logo.svg | 73 ++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 docs/static/svg/perspective_logo.svg diff --git a/docs/static/svg/perspective_logo.svg b/docs/static/svg/perspective_logo.svg new file mode 100644 index 0000000000..338eb88150 --- /dev/null +++ b/docs/static/svg/perspective_logo.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From def4ff78c9fb584171a7a340ecaee13772de1287 Mon Sep 17 00:00:00 2001 From: Andrew Stein Date: Thu, 2 Apr 2026 11:59:19 -0400 Subject: [PATCH 2/2] Fix theme bugs and assorted small regressions Signed-off-by: Andrew Stein --- .../viewer-datagrid/src/css/regular_table.css | 1 + packages/workspace/src/themes/pro-dark.css | 84 +++++++++---------- packages/workspace/src/themes/pro.css | 54 ++++++------ .../test/js/joins/inner_join.spec.ts | 72 ++++++++-------- .../test/js/joins/inner_join_indexed.spec.ts | 56 ++++++------- .../test/js/joins/left_join.spec.ts | 46 +++++----- .../test/js/joins/outer_join.spec.ts | 46 +++++----- .../test/js/joins/right_on.spec.ts | 54 ++++++------ rust/perspective-viewer/src/css/viewer.css | 4 +- .../src/rust/components/expression_editor.rs | 4 +- .../src/rust/tasks/edit_expression.rs | 20 +++-- .../src/themes/pro-dark.css | 4 +- 12 files changed, 228 insertions(+), 217 deletions(-) diff --git a/packages/viewer-datagrid/src/css/regular_table.css b/packages/viewer-datagrid/src/css/regular_table.css index 75600e9277..f4886c16d8 100644 --- a/packages/viewer-datagrid/src/css/regular_table.css +++ b/packages/viewer-datagrid/src/css/regular_table.css @@ -342,6 +342,7 @@ regular-table table tbody td { } regular-table table { + font-size: 1em; user-select: none; color: inherit; border-collapse: separate; diff --git a/packages/workspace/src/themes/pro-dark.css b/packages/workspace/src/themes/pro-dark.css index d3b6b93ec5..ed8af1cd72 100644 --- a/packages/workspace/src/themes/pro-dark.css +++ b/packages/workspace/src/themes/pro-dark.css @@ -13,7 +13,7 @@ perspective-workspace, perspective-workspace[theme="Pro Dark"], perspective-indicator[theme="Pro Dark"] { - --theme-name: "Pro Dark"; + --psp-theme-name: "Pro Dark"; } perspective-workspace perspective-viewer { @@ -23,11 +23,11 @@ perspective-workspace perspective-viewer { perspective-workspace perspective-viewer.widget-maximize { --modal-panel--margin: -4px 0 -4px 0; - --status-bar--border-radius: 6px 0 0 0; - --main-column--margin: 3px 0 3px 3px; - --main-column--border: 1px solid var(--inactive--color); - --main-column--border-width: 1px 0px 1px 1px; - --main-column--border-radius: 6px 0 0 6px; + --psp-status-bar--border-radius: 6px 0 0 0; + --psp-main-column--margin: 3px 0 3px 3px; + --psp-main-column--border: 1px solid var(--psp-inactive--color); + --psp-main-column--border-width: 1px 0px 1px 1px; + --psp-main-column--border-radius: 6px 0 0 6px; --settings-button--margin: 10px 0 0 0; } @@ -55,62 +55,62 @@ perspective-workspace { --menu-new--content: "description"; --menu-newview--content: "file_copy"; - --workspace-tabbar--border: 1px solid var(--inactive--color); - --workspace-tabbar--border-width: 0px 1px 1px 1px; - --workspace-tabbar--border-radius: 6px; - --workspace-tabbar--border-color: var(--inactive--color); - --workspace-tabbar-tab--border-width: 1px 1px 0px 1px; + --psp-workspace--tabbar--border: 1px solid var(--psp-inactive--color); + --psp-workspace--tabbar--border-width: 0px 1px 1px 1px; + --psp-workspace--tabbar--border-radius: 6px; + --psp-workspace--tabbar--border-color: var(--psp-inactive--color); + --psp-workspace--tabbar-tab--border-width: 1px 1px 0px 1px; /* Workspace */ - --column-drag-handle--mask-image: url("../svg/drag-handle.svg"); - --bookmarks--mask-image: url("../svg/bookmark-icon.svg"); + --psp-icon--column-drag-handle--mask-image: url("../svg/drag-handle.svg"); + --psp-icon--bookmarks--mask-image: url("../svg/bookmark-icon.svg"); /* perspective-viewer-pro-dark--colors */ background-color: #242526; - --workspace-split-panel-handle--background-color: #242526; + --psp-workspace--split-panel-handle--background-color: #242526; color: white; - --icon--color: white; - --active--color: #2770a9; - --error--color: #ff9485; - --inactive--color: #61656e; - --inactive--border-color: #4c505b; - --plugin--background: #242526; - --active--background: rgba(39, 113, 170, 0.5); - --expression--operator-color: #c5c9d0; - --expression--function-color: #22a0ce; - --expression--error-color: rgb(255, 136, 136); - --calendar--filter: invert(1); - --warning--color: #242526; - --warning--background: var(--icon--color); + --psp--color: white; + --psp-active--color: #2770a9; + --psp-error--color: #ff9485; + --psp-inactive--color: #61656e; + --psp-inactive--border-color: #4c505b; + --psp--background-color: #242526; + --psp-active--background: rgba(39, 113, 170, 0.5); + --psp-expression--operator--color: #c5c9d0; + --psp-expression--function--color: #22a0ce; + --psp-expression--error--color: rgb(255, 136, 136); + --psp-calendar--filter: invert(1); + --psp-warning--color: #242526; + --psp-warning--background: var(--psp--color); - --select-arrow--background-image: var( - --select-arrow-light--background-image + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image ); - --select-arrow--hover--background-image: var( - --select-arrow-dark--background-image + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image ); /* Syntax */ - --code-editor-symbol--color: white; - --code-editor-literal--color: #7dc3f0; - --code-editor-operator--color: rgb(23, 166, 123); - --code-editor-comment--color: rgb(204, 120, 48); - --code-editor-column--color: #e18ee1; + --psp-code-editor--symbol--color: white; + --psp-code-editor--literal--color: #7dc3f0; + --psp-code-editor--operator--color: rgb(23, 166, 123); + --psp-code-editor--comment--color: rgb(204, 120, 48); + --psp-code-editor--column--color: #e18ee1; background-color: #000202; color: white; --workspace-tabbar--background-color: #242526; --workspace-secondary--color: #c5c9d0; - --workspace-tabbar--border: 1px solid var(--inactive--color); - --workspace-tabbar--border-width: 1px 1px 1px 1px; - --workspace-tabbar--border-radius: 6px; - --workspace-tabbar--border-color: var(--inactive--color); - --workspace-tabbar-tab--border-width: 1px 1px 0 1px; + --psp-workspace--tabbar--border: 1px solid var(--psp-inactive--color); + --psp-workspace--tabbar--border-width: 1px 1px 1px 1px; + --psp-workspace--tabbar--border-radius: 6px; + --psp-workspace--tabbar--border-color: var(--psp-inactive--color); + --psp-workspace--tabbar-tab--border-width: 1px 1px 0 1px; } perspective-viewer[theme="Pro Dark"].workspace-master-widget { - --plugin--background: #242526; + --psp--background-color: #242526; } perspective-workspace-menu { diff --git a/packages/workspace/src/themes/pro.css b/packages/workspace/src/themes/pro.css index 4a5eed045a..80d36b9bde 100644 --- a/packages/workspace/src/themes/pro.css +++ b/packages/workspace/src/themes/pro.css @@ -17,7 +17,7 @@ perspective-workspace, perspective-workspace[theme="Pro Light"], perspective-indicator[theme="Pro Light"] { - --theme-name: "Pro Light"; + --psp-theme-name: "Pro Light"; } perspective-workspace { @@ -43,50 +43,50 @@ perspective-workspace { --menu-close--content: "close"; --menu-new--content: "description"; --menu-newview--content: "file_copy"; - --workspace-split-panel-handle--background-color: #f2f4f6; + --psp-workspace--split-panel-handle--background-color: #f2f4f6; - --workspace-tabbar--border: 1px solid var(--inactive--color); - --workspace-tabbar--border-width: 1px 1px 1px 1px; - --workspace-tabbar--border-radius: 6px; - --workspace-tabbar--border-color: var(--inactive--color); - --workspace-tabbar-tab--border-width: 1px 1px 0px 1px; + --psp-workspace--tabbar--border: 1px solid var(--psp-inactive--color); + --psp-workspace--tabbar--border-width: 1px 1px 1px 1px; + --psp-workspace--tabbar--border-radius: 6px; + --psp-workspace--tabbar--border-color: var(--psp-inactive--color); + --psp-workspace--tabbar-tab--border-width: 1px 1px 0px 1px; /* Workspace */ - --column-drag-handle--mask-image: url("../svg/drag-handle.svg"); - --bookmarks--mask-image: url("../svg/bookmark-icon.svg"); + --psp-icon--column-drag-handle--mask-image: url("../svg/drag-handle.svg"); + --psp-icon--bookmarks--mask-image: url("../svg/bookmark-icon.svg"); /* perspective-viewer-pro--colors */ color: #161616; background-color: #dadada; - --icon--color: #161616; - --inactive--color: #ababab; - --inactive--border-color: #dadada; + --psp--color: #161616; + --psp-inactive--color: #ababab; + --psp-inactive--border-color: #dadada; - --active--color: #2670a9; - --error--color: #ff471e; - --plugin--background: #ffffff; - --overflow-hint-icon--color: rgba(0, 0, 0, 0.2); - --select--background-color: none; - --warning--background: #042121; - --warning--color: #fdfffd; + --psp-active--color: #2670a9; + --psp-error--color: #ff471e; + --psp--background-color: #ffffff; + --psp-icon-overflow-hint--color: rgba(0, 0, 0, 0.2); + --psp-select--background-color: none; + --psp-warning--background: #042121; + --psp-warning--color: #fdfffd; - --select-arrow--background-image: var( - --select-arrow-dark--background-image + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-dark--mask-image ); - --select-arrow--hover--background-image: var( - --select-arrow-light--background-image + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-light--mask-image ); /* TODO deprecate me */ - --overflow-hint-icon--color: #fdfffd; + --psp-icon-overflow-hint--color: #fdfffd; } perspective-workspace perspective-viewer.widget-maximize { /* --modal-panel--margin: -4px 0 -4px 0; */ --psp-status-bar--border-radius: 6px 0 0 0; --psp-main-column--margin: 3px 0 3px 3px; - --psp-main-column--border: 1px solid var(--inactive--color); + --psp-main-column--border: 1px solid var(--psp-inactive--color); --psp-main-column--border-width: 1px 0px 1px 1px; --psp-main-column--border-radius: 6px 0 0 6px; /* --settings-button--margin: 10px 0 0 0; */ @@ -99,7 +99,7 @@ perspective-workspace perspective-viewer { perspective-viewer[theme="Pro Light"].workspace-master-widget { background-color: #f2f4f6; - --plugin--background: #f2f4f6; + --psp--background-color: #f2f4f6; regular-table { td, th { @@ -109,7 +109,7 @@ perspective-viewer[theme="Pro Light"].workspace-master-widget { } perspective-viewer { - --bookmarks--mask-image: url("../svg/bookmark-icon.svg"); + --psp-icon--bookmarks--mask-image: url("../svg/bookmark-icon.svg"); } perspective-workspace-menu { diff --git a/rust/perspective-js/test/js/joins/inner_join.spec.ts b/rust/perspective-js/test/js/joins/inner_join.spec.ts index 4623011e32..b49b367179 100644 --- a/rust/perspective-js/test/js/joins/inner_join.spec.ts +++ b/rust/perspective-js/test/js/joins/inner_join.spec.ts @@ -33,10 +33,10 @@ test.describe("Inner joins", function () { expect(json).toHaveLength(2); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("joined table has correct schema", async function () { @@ -56,9 +56,9 @@ test.describe("Inner joins", function () { y: "string", }); - joined.delete(); - right.delete(); - left.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("joined table reacts to left table updates", async function () { @@ -87,10 +87,10 @@ test.describe("Inner joins", function () { { id: 1, x: 99, y: "a" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("joined table reacts to right table updates", async function () { @@ -119,10 +119,10 @@ test.describe("Inner joins", function () { { id: 2, x: 20, y: "b" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("joined table reacts to new matching rows", async function () { @@ -142,10 +142,10 @@ test.describe("Inner joins", function () { expect(json).toHaveLength(1); expect(json).toEqual([{ id: 1, x: 10, y: "a" }]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("joined table supports views with group_by", async function () { @@ -171,10 +171,10 @@ test.describe("Inner joins", function () { expect(json["x"]).toEqual([60, 30, 30]); expect(json["y"]).toEqual([600, 300, 300]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("inner joins two tables by name strings", async function () { @@ -206,10 +206,10 @@ test.describe("Inner joins", function () { expect(json).toHaveLength(2); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("inner joins with mixed Table and string args", async function () { @@ -232,10 +232,10 @@ test.describe("Inner joins", function () { expect(json).toHaveLength(2); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("rejects column name conflicts", async function () { @@ -250,8 +250,8 @@ test.describe("Inner joins", function () { } expect(error).toBeDefined(); - right.delete(); - left.delete(); + await right.delete(); + await left.delete(); }); test("rejects updates on joined table", async function () { @@ -269,8 +269,8 @@ test.describe("Inner joins", function () { expect(error).toBeDefined(); - joined.delete(); - right.delete(); - left.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); }); diff --git a/rust/perspective-js/test/js/joins/inner_join_indexed.spec.ts b/rust/perspective-js/test/js/joins/inner_join_indexed.spec.ts index 1a533d28a4..f6e7eba7a7 100644 --- a/rust/perspective-js/test/js/joins/inner_join_indexed.spec.ts +++ b/rust/perspective-js/test/js/joins/inner_join_indexed.spec.ts @@ -40,10 +40,10 @@ import perspective from "../perspective_client.ts"; expect(json).toHaveLength(2); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("joined table has correct schema", async function () { @@ -66,9 +66,9 @@ import perspective from "../perspective_client.ts"; y: "string", }); - joined.delete(); - right.delete(); - left.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("joined table reacts to left table updates", async function () { @@ -101,10 +101,10 @@ import perspective from "../perspective_client.ts"; { id: 2, x: 20, y: "b" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("joined table reacts to right table updates", async function () { @@ -137,10 +137,10 @@ import perspective from "../perspective_client.ts"; { id: 2, x: 20, y: "b" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("joined table reacts to new matching rows", async function () { @@ -164,10 +164,10 @@ import perspective from "../perspective_client.ts"; expect(json).toHaveLength(1); expect(json).toEqual([{ id: 1, x: 10, y: "a" }]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("joined table supports views with group_by", async function () { @@ -199,10 +199,10 @@ import perspective from "../perspective_client.ts"; expect(json["x"]).toEqual([60, 30, 30]); expect(json["y"]).toEqual([600, 300, 300]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("rejects column name conflicts", async function () { @@ -217,8 +217,8 @@ import perspective from "../perspective_client.ts"; } expect(error).toBeDefined(); - right.delete(); - left.delete(); + await right.delete(); + await left.delete(); }); test("rejects updates on joined table", async function () { @@ -240,9 +240,9 @@ import perspective from "../perspective_client.ts"; expect(error).toBeDefined(); - joined.delete(); - right.delete(); - left.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); }); })(perspective); diff --git a/rust/perspective-js/test/js/joins/left_join.spec.ts b/rust/perspective-js/test/js/joins/left_join.spec.ts index 3a750fb384..4e9080b4f3 100644 --- a/rust/perspective-js/test/js/joins/left_join.spec.ts +++ b/rust/perspective-js/test/js/joins/left_join.spec.ts @@ -42,10 +42,10 @@ import perspective from "../perspective_client.ts"; { id: 3, x: 30, y: null }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("left join includes unmatched left rows with nulls", async function () { @@ -68,10 +68,10 @@ import perspective from "../perspective_client.ts"; { id: 2, x: 20, y: null }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("left join does not include unmatched right rows", async function () { @@ -91,10 +91,10 @@ import perspective from "../perspective_client.ts"; expect(json).toHaveLength(1); expect(json).toEqual([{ id: 1, x: 10, y: "a" }]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("left join reacts to right table updates", async function () { @@ -121,10 +121,10 @@ import perspective from "../perspective_client.ts"; { id: 2, x: 20, y: "b" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("left join with no matching rows", async function () { @@ -151,10 +151,10 @@ import perspective from "../perspective_client.ts"; { id: 2, x: 20, y: null }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("left join has correct schema", async function () { @@ -175,9 +175,9 @@ import perspective from "../perspective_client.ts"; y: "string", }); - joined.delete(); - right.delete(); - left.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); }); })(perspective); diff --git a/rust/perspective-js/test/js/joins/outer_join.spec.ts b/rust/perspective-js/test/js/joins/outer_join.spec.ts index d7490d009c..60fa69788e 100644 --- a/rust/perspective-js/test/js/joins/outer_join.spec.ts +++ b/rust/perspective-js/test/js/joins/outer_join.spec.ts @@ -43,10 +43,10 @@ import perspective from "../perspective_client.ts"; { id: 4, x: null, y: "d" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("outer join includes all rows when no keys match", async function () { @@ -74,10 +74,10 @@ import perspective from "../perspective_client.ts"; { id: 4, x: null, y: "d" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("outer join with all keys matching is same as inner", async function () { @@ -103,10 +103,10 @@ import perspective from "../perspective_client.ts"; { id: 2, x: 20, y: "b" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("outer join reacts to left table updates", async function () { @@ -140,10 +140,10 @@ import perspective from "../perspective_client.ts"; { id: 2, x: 20, y: "b" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("outer join reacts to right table updates", async function () { @@ -176,10 +176,10 @@ import perspective from "../perspective_client.ts"; { id: 2, x: 20, y: "b" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("outer join has correct schema", async function () { @@ -200,9 +200,9 @@ import perspective from "../perspective_client.ts"; y: "string", }); - joined.delete(); - right.delete(); - left.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); }); })(perspective); diff --git a/rust/perspective-js/test/js/joins/right_on.spec.ts b/rust/perspective-js/test/js/joins/right_on.spec.ts index 27f85feb4a..1fc1b7b789 100644 --- a/rust/perspective-js/test/js/joins/right_on.spec.ts +++ b/rust/perspective-js/test/js/joins/right_on.spec.ts @@ -39,10 +39,10 @@ test.describe("right_on option", function () { { id: 2, x: 20, y: "b" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("output schema uses left key column name", async function () { @@ -63,9 +63,9 @@ test.describe("right_on option", function () { y: "string", }); - joined.delete(); - right.delete(); - left.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("errors on type mismatch between on and right_on", async function () { @@ -85,8 +85,8 @@ test.describe("right_on option", function () { } expect(error).toBeDefined(); - right.delete(); - left.delete(); + await right.delete(); + await left.delete(); }); test("errors when right_on column not found", async function () { @@ -106,8 +106,8 @@ test.describe("right_on option", function () { } expect(error).toBeDefined(); - right.delete(); - left.delete(); + await right.delete(); + await left.delete(); }); test("right_on same as on behaves identically to omitting it", async function () { @@ -132,10 +132,10 @@ test.describe("right_on option", function () { { id: 2, x: 20, y: "b" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("reacts to right table updates with right_on", async function () { @@ -164,10 +164,10 @@ test.describe("right_on option", function () { { id: 2, x: 20, y: "b" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("left join with right_on", async function () { @@ -196,10 +196,10 @@ test.describe("right_on option", function () { { id: 3, x: 30, y: null }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); test("outer join with right_on", async function () { @@ -227,9 +227,9 @@ test.describe("right_on option", function () { { id: 3, x: null, y: "c" }, ]); - view.delete(); - joined.delete(); - right.delete(); - left.delete(); + await view.delete(); + await joined.delete(); + await right.delete(); + await left.delete(); }); }); diff --git a/rust/perspective-viewer/src/css/viewer.css b/rust/perspective-viewer/src/css/viewer.css index 11276a6cbf..3fae5f71fb 100644 --- a/rust/perspective-viewer/src/css/viewer.css +++ b/rust/perspective-viewer/src/css/viewer.css @@ -361,7 +361,7 @@ } .icon { - display: inline-block; + display: inline-flex; mask-size: cover; -webkit-mask-size: cover; background-repeat: no-repeat; @@ -372,6 +372,8 @@ ); &:before { + line-height: 0; + display: inline-flex; content: var(--psp-icon--drawer-tab-inverted--mask-image); visibility: hidden; } diff --git a/rust/perspective-viewer/src/rust/components/expression_editor.rs b/rust/perspective-viewer/src/rust/components/expression_editor.rs index 296966d084..6b072dbd71 100644 --- a/rust/perspective-viewer/src/rust/components/expression_editor.rs +++ b/rust/perspective-viewer/src/rust/components/expression_editor.rs @@ -143,7 +143,9 @@ impl Component for ExpressionEditor { } fn changed(&mut self, ctx: &Context, old_props: &Self::Properties) -> bool { - if ctx.props().alias != old_props.alias || ctx.props().reset_count != old_props.reset_count + if ctx.props().alias != old_props.alias + || ctx.props().reset_count != old_props.reset_count + || (ctx.props().alias.is_some() && ctx.props().metadata != old_props.metadata) { ctx.link() .send_message(ExpressionEditorMsg::SetExpr(initial_expr( diff --git a/rust/perspective-viewer/src/rust/tasks/edit_expression.rs b/rust/perspective-viewer/src/rust/tasks/edit_expression.rs index 255329b658..615c1586ca 100644 --- a/rust/perspective-viewer/src/rust/tasks/edit_expression.rs +++ b/rust/perspective-viewer/src/rust/tasks/edit_expression.rs @@ -62,34 +62,40 @@ pub trait EditExpression: HasPresentation + HasRenderer + HasSession + UpdateAnd .to_props() .create_replace_expression_update(&old_name, &new_expr); + this.update_and_render(update)?.await?; this.presentation .set_open_column_settings(Some(OpenColumnSettings { locator: Some(ColumnLocator::Expression(new_expr.name.to_string())), tab: Some(ColumnSettingsTab::Attributes), })); - this.update_and_render(update)?.await?; Ok(()) }); } /// Saves a new expression. Spawns a future. fn save_expr(&self, expr: Expression) -> ApiResult<()> { + let presentation = self.presentation().clone(); + let expr_name: String = expr.name.clone().into(); let task = { let mut serde_exprs = self.session().get_view_config().expressions.clone(); serde_exprs.insert(&expr); - self.presentation() - .set_open_column_settings(Some(OpenColumnSettings { - locator: Some(ColumnLocator::Expression(expr.name.clone().into())), - tab: Some(ColumnSettingsTab::Attributes), - })); self.update_and_render(ViewConfigUpdate { expressions: Some(serde_exprs), ..Default::default() }) }?; - ApiFuture::spawn(task); + ApiFuture::spawn(async move { + task.await?; + presentation.set_open_column_settings(Some(OpenColumnSettings { + locator: Some(ColumnLocator::Expression(expr_name)), + tab: Some(ColumnSettingsTab::Attributes), + })); + + Ok(()) + }); + Ok(()) } diff --git a/rust/perspective-viewer/src/themes/pro-dark.css b/rust/perspective-viewer/src/themes/pro-dark.css index 4286a765c7..c87f85ce2d 100644 --- a/rust/perspective-viewer/src/themes/pro-dark.css +++ b/rust/perspective-viewer/src/themes/pro-dark.css @@ -31,7 +31,7 @@ perspective-viewer[theme="Pro Dark"] { --psp-active--background: rgba(39, 113, 170, 0.5); --psp-expression--operator--color: #c5c9d0; --psp-expression--function--color: #22a0ce; - --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-expression--error--color: rgb(255, 136, 136); --psp-calendar--filter: invert(1); --psp-warning--color: #242526; --psp-warning--background: var(--psp--color); @@ -134,7 +134,7 @@ perspective-string-column-style[theme="Pro Dark"] { --psp-active--background: rgba(39, 113, 170, 0.5); --psp-expression--operator--color: #c5c9d0; --psp-expression--function--color: #22a0ce; - --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-expression--error--color: rgb(255, 136, 136); --psp-calendar--filter: invert(1); --psp-warning--color: #242526; --psp-warning--background: var(--psp--color);