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>
