This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a commit to branch 
gh-readonly-queue/main/pr-8631-279e12b2cd469c5cadaf69d987513f9b2552e2e6
in repository https://gitbox.apache.org/repos/asf/texera.git

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>

Reply via email to