Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
2e0a3cd
chore(deps): bump Angular 13 -> 14 lock-step
tbonelee May 27, 2026
ec68c0a
refactor(forms): adopt Untyped* form classes for Angular 14 typed-for…
tbonelee May 27, 2026
17bc417
build(webpack): convert custom-webpack config to function form for mo…
tbonelee May 27, 2026
006b6d7
style: normalize classic visualization template html with prettier
tbonelee May 27, 2026
31b7d40
chore(deps): bump Angular 14 -> 15 lock-step
tbonelee May 27, 2026
f8ebc1a
build(ts): bump TypeScript target es5 -> es2020 for Angular 14+
tbonelee May 27, 2026
6843471
chore(deps): run @angular-eslint 13->14 and 14->15 schematics
tbonelee May 27, 2026
da913a6
chore(deps): bump Angular 15 -> 16 lock-step
tbonelee May 30, 2026
6388eb6
refactor(router): drop deprecated CanActivate interface for Angular 16
tbonelee May 30, 2026
b08b667
refactor(modal): migrate nzComponentParams -> nzData for ng-zorro 16
tbonelee May 30, 2026
83477c1
build(lint): migrate ESLint config off removed ng-cli-compat presets
tbonelee May 30, 2026
15e5af6
chore(deps): bump Angular 16 -> 17 lock-step
tbonelee May 30, 2026
3e4203d
refactor(compiler): drop unused useJit CompilerOption for Angular 17
tbonelee May 30, 2026
c65be61
fix(menu): restore full-row click target for user dropdown router links
tbonelee May 30, 2026
6aa95a7
chore(deps): bump Angular 17 -> 18 lock-step
tbonelee May 30, 2026
68b3b1b
refactor(http): replace HttpClientModule with provideHttpClient for A…
tbonelee May 30, 2026
d796fed
fix(theme): call colorPalette as a Less function instead of inline JS
tbonelee May 30, 2026
488622f
chore(deps): bump Angular 18 -> 19 lock-step
tbonelee May 30, 2026
042c185
refactor(standalone): set standalone: false on NgModule declarations …
tbonelee May 30, 2026
5fe438d
refactor(input-number): adopt NzInputNumberLegacyModule for ng-zorro 19
tbonelee May 30, 2026
420d3e9
fix(forms): migrate nz-checkbox-group to nzOptions + value model for …
tbonelee May 30, 2026
ba24da3
build(lint): adapt ESLint config and code to angular-eslint 19 + type…
tbonelee May 30, 2026
641fd60
fix(serve): rename browserTarget to buildTarget for Angular 19 dev-se…
tbonelee May 30, 2026
9d4ef45
build(node): bump pinned Node 18 -> 22 (npm 8 -> 10) for Angular 20
tbonelee May 30, 2026
f7fc519
chore(deps): bump Angular 19 -> 20 lock-step
tbonelee May 30, 2026
dd6c2f2
refactor(core): import DOCUMENT from @angular/core for Angular 20
tbonelee May 30, 2026
c520de9
refactor(ng-zorro): migrate templates and modules to ng-zorro 20
tbonelee May 30, 2026
2c5174f
fix(visualization): replace removed CDK PortalInjector with Injector.…
tbonelee May 30, 2026
e93fac8
fix(rxjs): adapt to RxJS 7 typing (required by ng-zorro 20)
tbonelee May 30, 2026
6156dc3
build(lint): disable prefer-inject for the constructor-DI codebase (a…
tbonelee May 30, 2026
b0e21d8
build(lint): migrate ESLint 8 eslintrc to ESLint 9 flat config
tbonelee May 30, 2026
bcfed0d
chore(deps): bump Angular 20 -> 21 lock-step
tbonelee May 30, 2026
68dc39e
build(ts): switch to bundler moduleResolution for Angular 21 package …
tbonelee May 30, 2026
88e10a0
refactor(templates): migrate to built-in control flow for Angular 21
tbonelee May 30, 2026
e476ca8
refactor(bootstrap): provide zone change detection explicitly for Ang…
tbonelee May 30, 2026
b8a6d56
refactor(ng-zorro): adapt to ng-zorro 21 removed/moved entry points
tbonelee May 30, 2026
af1617d
refactor(animation): adopt ng-zorro 21 collapse directive; drop @angu…
tbonelee May 30, 2026
ae392ef
fix(animation): keep dark-theme overrides from suppressing ng-zorro 2…
tbonelee May 31, 2026
517af6e
build(node): bump .nvmrc to Node 22.21.1 to match the pinned version
tbonelee May 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 0 additions & 139 deletions zeppelin-web-angular/.eslintrc.json

This file was deleted.

2 changes: 1 addition & 1 deletion zeppelin-web-angular/.nvmrc
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.

18.20.8
22.21.1
20 changes: 14 additions & 6 deletions zeppelin-web-angular/angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -126,26 +126,26 @@
"serve": {
"builder": "@angular-builders/custom-webpack:dev-server",
"options": {
"browserTarget": "zeppelin:build",
"buildTarget": "zeppelin:build",
"port": 4200,
"host": "localhost",
"liveReload": true,
"hmr": true
},
"configurations": {
"production": {
"browserTarget": "zeppelin:build:production"
"buildTarget": "zeppelin:build:production"
},
"development": {
"browserTarget": "zeppelin:build:development"
"buildTarget": "zeppelin:build:development"
}
},
"defaultConfiguration": "development"
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "zeppelin:build"
"buildTarget": "zeppelin:build"
}
},
"lint": {
Expand Down Expand Up @@ -199,8 +199,16 @@
}
}
},
"defaultProject": "zeppelin",
"cli": {
"defaultCollection": "@angular-eslint/schematics"
"schematicCollections": ["@angular-eslint/schematics"],
"analytics": false
},
"schematics": {
"@angular-eslint/schematics:application": {
"setParserOptionsProject": true
},
"@angular-eslint/schematics:library": {
"setParserOptionsProject": true
}
}
}
21 changes: 21 additions & 0 deletions zeppelin-web-angular/e2e/models/header-page.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,27 @@ export class HeaderPage extends BasePage {
await this.userMenuItems.configuration.click();
}

/** The <li nz-menu-item> row for a user-menu entry, scoped to this dropdown's overlay. */
getUserMenuItemRow(label: string): Locator {
return this.page.locator('.zeppelin-user-menu .ant-dropdown-menu-item').filter({ hasText: label });
}

/**
* Click the empty padding area near the right edge of a user-menu row, away from the
* link text. This is the dead zone that only navigates when the inner <a> fills the
* whole row; clicking here regresses to "dropdown closes, no navigation" if the
* full-row click fix is missing.
*/
async clickUserMenuItemEdge(label: string): Promise<void> {
const row = this.getUserMenuItemRow(label);
await row.waitFor({ state: 'visible', timeout: 10000 });
const box = await row.boundingBox();
if (!box) {
throw new Error(`User menu item "${label}" has no bounding box`);
}
await row.click({ position: { x: box.width - 8, y: box.height / 2 } });
}

async getUsernameText(): Promise<string> {
return (await this.userBadge.textContent()) || '';
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import { expect, test } from '@playwright/test';
import { HeaderPage } from '../../models/header-page';
import { performLoginIfRequired, waitForZeppelinReady } from '../../utils';

/**
* Regression guard for the header user-menu navigation.
*
* ng-zorro renders dropdown nz-menu-item content inside <span class="ant-menu-title-content">,
* but the upstream rule that stretches the inner <a> across the whole item targets a
* different class (.ant-dropdown-menu-title-content). The class mismatch left the <a>
* covering only its text, so clicking the row padding closed the dropdown without
* navigating. This was exposed by the Angular/ng-zorro 13 -> 17 upgrade and fixed by a
* scoped full-row click rule (nzOverlayClassName="zeppelin-user-menu" + ::ng-deep ::after).
*
* Each test deliberately clicks the EMPTY PADDING of the row (not the link text) so a
* future ng-zorro/Angular upgrade that reintroduces the dead zone fails here.
*/
const MENU_ITEMS = [
{ label: 'Interpreter', route: '/interpreter' },
{ label: 'Notebook Repos', route: '/notebook-repos' },
{ label: 'Credential', route: '/credential' },
{ label: 'Configuration', route: '/configuration' }
];

test.describe('Header user menu - full-row navigation', () => {
let header: HeaderPage;

test.beforeEach(async ({ page }) => {
header = new HeaderPage(page);
await page.goto('/#/');
await waitForZeppelinReady(page);
await performLoginIfRequired(page);
});

for (const item of MENU_ITEMS) {
test(`navigates to ${item.label} when the row padding (not the text) is clicked`, async ({ page }) => {
await test.step('Given the user dropdown is open', async () => {
await header.clickUserDropdown();
await header.getUserMenuItemRow(item.label).waitFor({ state: 'visible', timeout: 10000 });
});

await test.step(`When I click the empty padding of the "${item.label}" row`, async () => {
await header.clickUserMenuItemEdge(item.label);
});

await test.step(`Then the app navigates to ${item.route}`, async () => {
await page.waitForURL(url => url.hash.includes(item.route), { timeout: 10000 });
expect(page.url()).toContain(item.route);
});
});
}
});
Loading
Loading