This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/texera.git
The following commit(s) were added to refs/heads/main by this push:
new 6857871208 feat(notebook-migration): generalize notebook-specific UI
terminology (#8631)
6857871208 is described below
commit 68578712081006adeaa98dcfa038deff2232dff4
Author: Ryan Zhang <[email protected]>
AuthorDate: Mon Sep 21 19:59:53 2026 +0000
feat(notebook-migration): generalize notebook-specific UI terminology
(#8631)
### What changes were proposed in this PR?
The migration tool now accepts Python files as well as notebooks, with R
and folders to follow, but the workspace still told users they were
looking at a "Jupyter Notebook". A user who uploaded a `.py` saw a panel
with that title, a button labelled "expand Jupyter notebook", and a
confirmation asking whether to delete "this workflow's Jupyter
notebook".
The display strings that name the input type are now generic: the panel
header and its iframe title read "Uploaded Source Code", the delete
tooltip and confirmation say "source code", and the toolbar button says
"expand uploaded source code". Four notifications that named the input
the same way were updated too.
The toolbar button used the Jupyter logo, which reads wrong next to a
generic label. It now uses the `code` icon from ng-zorro, matching every
other button in that toolbar.
**Before**
<img width="242" height="93" alt="Screenshot 2026-09-21 at 12 54 56 PM"
src="https://github.com/user-attachments/assets/f00f5dc5-ef55-4ac7-9d40-43566ac8ef60"
/>
**After**
<img width="235" height="76" alt="image"
src="https://github.com/user-attachments/assets/08d50f63-c4b4-46fe-9c62-59dbe76c1974"
/>
That made `jupyter-logo.svg` unused, so it is deleted along with its
`.licenserc.yaml` exclude and its line in `frontend/LICENSE-binary`. The
attribution block itself stays, since `tool_popup_diagram.png` still
carries the Jupyter logo in the import modal.
Display strings only. Internal names (`JupyterPanelService`,
`notebookFileName`, the `notebook` table, the `/notebook-migration`
endpoints) are unchanged and still accurate, since a script really is
converted into a notebook. The import modal is also unchanged: its tabs
name their own input correctly.
### Any related issues, documentation, discussions?
Closes #8543
Parent-issue #4301
### How was this PR tested?
No new tests. The change is copy plus one icon, with no behavior to
cover. Verified the UI changes in local deployment.
### Was this PR authored or co-authored using generative AI tooling?
Generated-by: Claude Code (Claude Opus 5)
---
.licenserc.yaml | 1 -
frontend/LICENSE-binary | 1 -
.../jupyter-notebook-panel.component.html | 8 ++---
.../workspace/component/menu/menu.component.html | 9 +++--
.../workspace/component/menu/menu.component.scss | 6 ----
.../component/menu/menu.component.spec.ts | 4 +--
.../service/jupyter-panel/jupyter-panel.service.ts | 4 +--
.../notebook-migration.service.ts | 4 +--
.../notebook_migration_tool/jupyter-logo.svg | 42 ----------------------
9 files changed, 14 insertions(+), 65 deletions(-)
diff --git a/.licenserc.yaml b/.licenserc.yaml
index dc33ea0a54..b9db34a99c 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -55,7 +55,6 @@ header:
- 'frontend/src/assets/svg/operator-view-result.svg'
- 'frontend/src/assets/svg/operator-reuse-cache-invalid.svg'
- 'frontend/src/assets/svg/operator-reuse-cache-valid.svg'
- - 'frontend/src/assets/notebook_migration_tool/jupyter-logo.svg'
# Third-party icon glyph - see LICENSE file for attribution
- 'frontend/src/app/common/icon/model-icon.ts'
-
'frontend/src/app/common/type/proto/org/apache/texera/amber/core/virtualidentity.ts'
diff --git a/frontend/LICENSE-binary b/frontend/LICENSE-binary
index a0c75cfb81..903da17fd7 100644
--- a/frontend/LICENSE-binary
+++ b/frontend/LICENSE-binary
@@ -370,7 +370,6 @@ Angular / npm packages:
Third-party assets:
- Project Jupyter logo
frontend/src/assets/notebook_migration_tool/tool_popup_diagram.png
- frontend/src/assets/notebook_migration_tool/jupyter-logo.svg
https://github.com/jupyter/design
--------------------------------------------------------------------------------
diff --git
a/frontend/src/app/workspace/component/jupyter-notebook-panel/jupyter-notebook-panel.component.html
b/frontend/src/app/workspace/component/jupyter-notebook-panel/jupyter-notebook-panel.component.html
index edca1ba47b..1efbce1f4e 100644
---
a/frontend/src/app/workspace/component/jupyter-notebook-panel/jupyter-notebook-panel.component.html
+++
b/frontend/src/app/workspace/component/jupyter-notebook-panel/jupyter-notebook-panel.component.html
@@ -25,7 +25,7 @@
<div
class="panel-header"
cdkDragHandle>
- <span>Jupyter Notebook</span>
+ <span>Uploaded Source Code</span>
<div class="panel-buttons">
<!-- Minimize button -->
<button
@@ -42,9 +42,9 @@
<button
class="delete-button"
nz-tooltip
- nzTooltipTitle="Delete notebook"
+ nzTooltipTitle="Delete source code"
nz-popconfirm
- nzPopconfirmTitle="Delete this workflow's Jupyter notebook? This
cannot be undone."
+ nzPopconfirmTitle="Delete this workflow's uploaded source code? This
cannot be undone."
(nzOnConfirm)="deletePanel()">
<i
nz-icon
@@ -59,7 +59,7 @@
*ngIf="jupyterUrl"
#iframeRef
[src]="jupyterUrl"
- title="Jupyter Notebook"
+ title="Uploaded Source Code"
width="100%"
height="100%"
style="border: none"></iframe>
diff --git a/frontend/src/app/workspace/component/menu/menu.component.html
b/frontend/src/app/workspace/component/menu/menu.component.html
index 0cb65293bf..982a37e191 100644
--- a/frontend/src/app/workspace/component/menu/menu.component.html
+++ b/frontend/src/app/workspace/component/menu/menu.component.html
@@ -165,11 +165,10 @@
*ngIf="pythonNotebookMigrationEnabled && (jupyterNotebookExists$ |
async)"
nz-button
(click)="onClickExpandJupyterNotebookPanel()"
- title="expand Jupyter notebook">
- <img
- class="jupyter-notebook-icon"
- src="assets/notebook_migration_tool/jupyter-logo.svg"
- alt="Jupyter" />
+ title="expand uploaded source code">
+ <i
+ nz-icon
+ nzType="code"></i>
</button>
</nz-space-compact>
<ng-template #utilities>
diff --git a/frontend/src/app/workspace/component/menu/menu.component.scss
b/frontend/src/app/workspace/component/menu/menu.component.scss
index 12dafb6a2e..a2ee69762b 100644
--- a/frontend/src/app/workspace/component/menu/menu.component.scss
+++ b/frontend/src/app/workspace/component/menu/menu.component.scss
@@ -211,12 +211,6 @@ texera-coeditor-user-icon {
}
}
-.jupyter-notebook-icon {
- height: 1.1em;
- width: auto;
- vertical-align: -0.2em;
-}
-
/* One workflow, two ways of working on it. Rendered identically in the
operator canvas
and the Form View, in the same slot of the same title row, so the control
never moves when the view does -- that stillness is what makes the two read
as two
diff --git a/frontend/src/app/workspace/component/menu/menu.component.spec.ts
b/frontend/src/app/workspace/component/menu/menu.component.spec.ts
index 0ed34ae0ec..689e19eecd 100644
--- a/frontend/src/app/workspace/component/menu/menu.component.spec.ts
+++ b/frontend/src/app/workspace/component/menu/menu.component.spec.ts
@@ -1421,7 +1421,7 @@ describe("MenuComponent", () => {
});
it("shows the expand-jupyter button only when the flag is on and a
notebook exists", () => {
- const button = () =>
fixture.nativeElement.querySelector('button[title="expand Jupyter notebook"]');
+ const button = () =>
fixture.nativeElement.querySelector('button[title="expand uploaded source
code"]');
// commonTestProviders' MockGuiConfigService defaults the flag to false,
and no notebook exists.
expect(button()).toBeNull();
@@ -1449,7 +1449,7 @@ describe("MenuComponent", () => {
fixture.detectChanges();
const button = fixture.nativeElement.querySelector(
- 'button[title="expand Jupyter notebook"]'
+ 'button[title="expand uploaded source code"]'
) as HTMLButtonElement;
button.click();
diff --git
a/frontend/src/app/workspace/service/jupyter-panel/jupyter-panel.service.ts
b/frontend/src/app/workspace/service/jupyter-panel/jupyter-panel.service.ts
index 8f4624867d..7b56bca532 100644
--- a/frontend/src/app/workspace/service/jupyter-panel/jupyter-panel.service.ts
+++ b/frontend/src/app/workspace/service/jupyter-panel/jupyter-panel.service.ts
@@ -244,7 +244,7 @@ export class JupyterPanelService {
error: (err: unknown) => {
// Keep the panel open on failure so the user sees the notebook wasn't
removed.
console.error("Failed to delete Jupyter notebook:", err);
- this.notificationService.error("Failed to delete the Jupyter
notebook.");
+ this.notificationService.error("Failed to delete the uploaded source
code.");
},
});
}
@@ -290,7 +290,7 @@ export class JupyterPanelService {
const mappingKey = notebookMappingKey(wid);
// Check if there is corresponding mapping data
if (wid === undefined ||
!this.notebookMigrationService.hasMapping(mappingKey)) {
- this.notificationService.warning("No Jupyter notebook associated with
this workflow.");
+ this.notificationService.warning("No source code associated with this
workflow.");
return;
}
diff --git
a/frontend/src/app/workspace/service/notebook-migration/notebook-migration.service.ts
b/frontend/src/app/workspace/service/notebook-migration/notebook-migration.service.ts
index 61244f1232..f0bb14969e 100644
---
a/frontend/src/app/workspace/service/notebook-migration/notebook-migration.service.ts
+++
b/frontend/src/app/workspace/service/notebook-migration/notebook-migration.service.ts
@@ -192,12 +192,12 @@ export class NotebookMigrationService {
try {
await firstValueFrom(this.http.post(jupyterAPIUrl, requestBody, {
headers }));
- this.notificationService.success("Notebook successfully sent to
Jupyter");
+ this.notificationService.success("Source code successfully sent to
Jupyter");
return 1;
} catch (error) {
console.error("Error sending notebook to pod: ", error);
const message = error instanceof Error ? error.message : String(error);
- this.notificationService.error("Error sending notebook to Jupyter: " +
message);
+ this.notificationService.error("Error sending source code to Jupyter: "
+ message);
return 0;
}
}
diff --git a/frontend/src/assets/notebook_migration_tool/jupyter-logo.svg
b/frontend/src/assets/notebook_migration_tool/jupyter-logo.svg
deleted file mode 100644
index 4a63571eb5..0000000000
--- a/frontend/src/assets/notebook_migration_tool/jupyter-logo.svg
+++ /dev/null
@@ -1,42 +0,0 @@
-<svg width="39" height="51" viewBox="0 0 39 51" version="2.0"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:figma="http://www.figma.com/figma/ns">
-<title>logo-8.svg</title>
-<desc>Created using Figma 0.90</desc>
-<g id="Canvas" transform="translate(-2362 -2281)" figma:type="canvas">
-<g id="logo" style="mix-blend-mode:normal;" figma:type="group">
-<g id="g" style="mix-blend-mode:normal;" figma:type="group">
-<g id="path" style="mix-blend-mode:normal;" figma:type="group">
-<g id="path7 fill" style="mix-blend-mode:normal;" figma:type="vector">
-<use xlink:href="#path0_fill" transform="translate(2393.3 2281.31)"
style="mix-blend-mode:normal;"/>
-</g>
-</g>
-<g id="path" style="mix-blend-mode:normal;" figma:type="group">
-<g id="path8 fill" style="mix-blend-mode:normal;" figma:type="vector">
-<use xlink:href="#path1_fill" transform="translate(2363.74 2311.98)"
style="mix-blend-mode:normal;"/>
-</g>
-</g>
-<g id="path" style="mix-blend-mode:normal;" figma:type="group">
-<g id="path9 fill" style="mix-blend-mode:normal;" figma:type="vector">
-<use xlink:href="#path2_fill" transform="translate(2363.73 2285.48)"
style="mix-blend-mode:normal;"/>
-</g>
-</g>
-<g id="path" style="mix-blend-mode:normal;" figma:type="group">
-<g id="path10 fill" style="mix-blend-mode:normal;" figma:type="vector">
-<use xlink:href="#path3_fill" transform="translate(2363.8 2323.81)"
style="mix-blend-mode:normal;"/>
-</g>
-</g>
-<g id="path" style="mix-blend-mode:normal;" figma:type="group">
-<g id="path11 fill" style="mix-blend-mode:normal;" figma:type="vector">
-<use xlink:href="#path4_fill" transform="translate(2362.36 2286.06)"
style="mix-blend-mode:normal;"/>
-</g>
-</g>
-</g>
-</g>
-</g>
-<defs>
-<path id="path0_fill" d="M 5.89353 2.844C 5.91889 3.43165 5.77085 4.01367
5.46815 4.51645C 5.16545 5.01922 4.72168 5.42015 4.19299 5.66851C 3.6643
5.91688 3.07444 6.00151 2.49805 5.91171C 1.92166 5.8219 1.38463 5.5617 0.954898
5.16401C 0.52517 4.76633 0.222056 4.24903 0.0839037 3.67757C -0.0542483 3.10611
-0.02123 2.50617 0.178781 1.95364C 0.378793 1.4011 0.736809 0.920817 1.20754
0.573538C 1.67826 0.226259 2.24055 0.0275919 2.82326 0.00267229C 3.60389
-0.0307115 4.36573 0.249789 4.94142 [...]
-<path id="path1_fill" d="M 18.2646 7.13411C 10.4145 7.13411 3.55872 4.2576 0
0C 1.32539 3.8204 3.79556 7.13081 7.0686 9.47303C 10.3417 11.8152 14.2557
13.0734 18.269 13.0734C 22.2823 13.0734 26.1963 11.8152 29.4694 9.47303C
32.7424 7.13081 35.2126 3.8204 36.538 0C 32.9705 4.2576 26.1148 7.13411 18.2646
7.13411Z"/>
-<path id="path2_fill" d="M 18.2733 5.93931C 26.1235 5.93931 32.9793 8.81583
36.538 13.0734C 35.2126 9.25303 32.7424 5.94262 29.4694 3.6004C 26.1963 1.25818
22.2823 0 18.269 0C 14.2557 0 10.3417 1.25818 7.0686 3.6004C 3.79556 5.94262
1.32539 9.25303 0 13.0734C 3.56745 8.82463 10.4232 5.93931 18.2733 5.93931Z"/>
-<path id="path3_fill" d="M 7.42789 3.58338C 7.46008 4.3243 7.27355 5.05819
6.89193 5.69213C 6.51031 6.32607 5.95075 6.83156 5.28411 7.1446C 4.61747
7.45763 3.87371 7.56414 3.14702 7.45063C 2.42032 7.33712 1.74336 7.0087 1.20184
6.50695C 0.660328 6.0052 0.27861 5.35268 0.105017 4.63202C -0.0685757 3.91135
-0.0262361 3.15494 0.226675 2.45856C 0.479587 1.76217 0.931697 1.15713 1.52576
0.720033C 2.11983 0.282935 2.82914 0.0334395 3.56389 0.00313344C 4.54667
-0.0374033 5.50529 0.316706 6.2296 [...]
-<path id="path4_fill" d="M 2.27471 4.39629C 1.84363 4.41508 1.41671 4.30445
1.04799 4.07843C 0.679268 3.8524 0.385328 3.52114 0.203371 3.12656C 0.0214136
2.73198 -0.0403798 2.29183 0.0258116 1.86181C 0.0920031 1.4318 0.283204 1.03126
0.575213 0.710883C 0.867222 0.39051 1.24691 0.164708 1.66622 0.0620592C 2.08553
-0.0405897 2.52561 -0.0154714 2.93076 0.134235C 3.33591 0.283941 3.68792
0.551505 3.94222 0.90306C 4.19652 1.25462 4.34169 1.67436 4.35935 2.10916C
4.38299 2.69107 4.17678 3.2586 [...]
-</defs>
-</svg>