Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
115 commits
Select commit Hold shift + click to select a range
48b02ff
chore: TypeScript 5.8, nx migrate, dep updates - bundler resolution
NathanWalker Jul 5, 2025
4039e2c
chore: use esm with hooks
NathanWalker Jul 6, 2025
0fe6055
chore: define __metadata for bundlers
NathanWalker Jul 6, 2025
84f5f19
refactor: circular deps part 1
NathanWalker Jul 6, 2025
7f726e9
feat: use module type on core package + hook v3
NathanWalker Jul 6, 2025
01acf2c
chore: use sass-loader in devDeps to satisfy automated tests
NathanWalker Jul 8, 2025
5796cd9
fix: test imports
NathanWalker Jul 8, 2025
2fba017
feat: support esm hooks
NathanWalker Jul 8, 2025
47c7208
refactor: circular deps part 2
NathanWalker Jul 8, 2025
1fdc933
refactor: circular deps part 3
NathanWalker Jul 8, 2025
4285a33
refactor: circular deps part 4
NathanWalker Jul 8, 2025
6ede07a
chore: cleanup
NathanWalker Jul 8, 2025
b70aa2c
refactor: circular deps part 5
NathanWalker Jul 8, 2025
18e75b6
refactor: circular deps part 6
NathanWalker Jul 8, 2025
779def7
refactor: circular deps part 7
NathanWalker Jul 9, 2025
50cfd6f
refactor: circular deps part 8
NathanWalker Jul 9, 2025
d8681cb
refactor: circular deps part 9
NathanWalker Jul 9, 2025
1db6259
refactor: circular deps part 10
NathanWalker Jul 9, 2025
33d967b
refactor: circular deps part 11
NathanWalker Jul 9, 2025
ee03774
refactor: circular deps part 12
NathanWalker Jul 9, 2025
579a25d
refactor: circular deps part 13
NathanWalker Jul 10, 2025
cb9ddde
fix: e2e test that should have never passed in first place
NathanWalker Jul 10, 2025
be6a908
chore: cleanup
NathanWalker Jul 10, 2025
cebc784
feat(webpack): enable esm modules as default
NathanWalker Jul 10, 2025
e7ab426
refactor: circular deps part 14
NathanWalker Jul 10, 2025
35fef40
refactor: circular deps part 15
NathanWalker Jul 11, 2025
300af8f
feat(core): allow .mjs files in dist package
NathanWalker Jul 11, 2025
2d5d62b
chore: cleanup vitest setup
NathanWalker Jul 11, 2025
a6279e2
Merge remote-tracking branch 'origin/main' into refactor/circular-dep…
NathanWalker Jul 11, 2025
32df462
fix: remove invalid .d.ts files
NathanWalker Jul 14, 2025
f1a5d3b
fix: imports
NathanWalker Jul 14, 2025
445a48d
fix: retain comments
NathanWalker Jul 14, 2025
4218cb8
fix: file extension handling for fonts
NathanWalker Jul 14, 2025
d9aa930
chore: cleanup
NathanWalker Jul 14, 2025
49413e5
chore: base webpack with ability to switch between esm to commonjs as…
NathanWalker Jul 14, 2025
4fe0003
chore: tmp comments to verify loading order - cleanup after confirmed
NathanWalker Jul 14, 2025
88c952d
chore: testing local alpha bumps only, reset when ready
NathanWalker Jul 14, 2025
e023042
Merge remote-tracking branch 'origin/main' into refactor/circular-dep…
NathanWalker Jul 14, 2025
b2cfc80
cleanup
NathanWalker Jul 14, 2025
7bc5721
chore: cleanup
NathanWalker Jul 15, 2025
2fb70c1
chore: cleanup android refs
NathanWalker Jul 15, 2025
248a85f
chore: cleanup
NathanWalker Jul 19, 2025
3f88953
chore: use esm runtimes for testing
NathanWalker Jul 22, 2025
b4579d1
chore: global handling
NathanWalker Jul 22, 2025
0ba0ab0
chore: working with builder xml require vs dynamic import wip
NathanWalker Jul 22, 2025
b853447
chore: cleanup
NathanWalker Jul 23, 2025
b79801a
chore: cleanup
NathanWalker Jul 23, 2025
17ac48f
chore: cleanup
NathanWalker Jul 23, 2025
f4a1326
chore: 9.0.0-alpha.7
NathanWalker Jul 23, 2025
ac65c0b
chore(webpack): 5.1.0-esm.3
NathanWalker Jul 23, 2025
41f041e
chore: note on conditional virtual entry if needed
NathanWalker Jul 23, 2025
3c1995c
chore: cleanup
NathanWalker Jul 25, 2025
5aeaac7
Merge remote-tracking branch 'origin/main' into refactor/circular-deps
NathanWalker Jul 25, 2025
03dae26
feat(webpack): auto enable commonjs when a project is on core < 9
NathanWalker Jul 25, 2025
b548ac3
chore(webpack): 5.1.0-esm.4
NathanWalker Jul 25, 2025
b9b234d
chore: cleanup
NathanWalker Jul 25, 2025
99c151c
chore: 9.0.0-alpha.8
NathanWalker Jul 26, 2025
4f8f841
fix(core): pin source-map due to minor bump using url
NathanWalker Jul 26, 2025
5667e08
chore: sync changelog with release/8.9.x branch
NathanWalker Jul 26, 2025
a9e5a22
chore(deps): bump postcss and vue-loader in /packages/webpack5 (#10772)
dependabot[bot] Jul 27, 2025
f1e2df6
chore: security clearances (#10773)
NathanWalker Jul 27, 2025
9ae0bf3
chore: vitest 3.2.4
NathanWalker Jul 27, 2025
ee6927b
chore: cleanup
NathanWalker Jul 27, 2025
3b15117
feat(webpack): auto enable commonjs on core < 9 + consider prereleases
NathanWalker Jul 27, 2025
61663d1
chore(webpack): 5.1.0-esm.5
NathanWalker Jul 27, 2025
2c669da
Merge remote-tracking branch 'origin/main' into refactor/circular-deps
NathanWalker Jul 30, 2025
6e41e73
Merge remote-tracking branch 'origin/main' into refactor/circular-deps
NathanWalker Aug 2, 2025
c934d89
feat: source map remapping for runtime stack trace displays
NathanWalker Aug 3, 2025
783f8ed
feat(ios): ListView sticky headers options
NathanWalker Aug 3, 2025
4b51e0b
feat(android): ListView sticky header options 1
NathanWalker Aug 3, 2025
6e17818
feat(android): ListView sticky header options 2
NathanWalker Aug 3, 2025
8e81246
feat(ios): ListView showSearch for built-in search behavior
NathanWalker Aug 3, 2025
fb7a23e
feat(android): ListView showSearch for search bar
NathanWalker Aug 4, 2025
561d2ea
feat(ios): searchAutoHide wip
NathanWalker Aug 4, 2025
75d04ea
chore: comment out logs for further testing
NathanWalker Aug 5, 2025
85dc509
chore: transient root deps
NathanWalker Aug 5, 2025
2d1b61e
chore: 9.0.0-alpha.9
NathanWalker Aug 5, 2025
c26757a
Merge remote-tracking branch 'origin/main' into refactor/circular-deps
NathanWalker Aug 7, 2025
0582c46
chore: merge main
NathanWalker Aug 7, 2025
85ae1b0
chore: 9.0.0-alpha.10
NathanWalker Aug 7, 2025
e06ca24
feat: css-tree 3.1+ support which includes es module support
NathanWalker Aug 14, 2025
a8b6ad6
fix: temporal dead zone issue when bundling inspector_modules
NathanWalker Aug 15, 2025
15c57ee
chore(webpack): 5.1.0-esm.6
NathanWalker Aug 15, 2025
3d05597
chore: 9.0.0-alpha.11
NathanWalker Aug 15, 2025
d2620a2
chore: cleanup
NathanWalker Aug 16, 2025
981772d
chore: 9.0.0-alpha.12
NathanWalker Aug 16, 2025
8d2922b
feat(ios): iosGlassEffect property
NathanWalker Aug 21, 2025
00820ae
feat: new glass AppIcon for demo apps
NathanWalker Aug 21, 2025
e22382b
chore: 9.0.0-alpha.13
NathanWalker Aug 21, 2025
498b33f
chore: use latest alpha cli
NathanWalker Aug 22, 2025
ac7bcfb
chore: cleanup log and xcconfig
NathanWalker Aug 23, 2025
9cce757
fix: automated tests
NathanWalker Aug 24, 2025
efbcebb
chore: target api 35 on android tests
NathanWalker Aug 24, 2025
e9d3219
feat(webpack): auto fallback to commonjs via runtime detection
NathanWalker Aug 28, 2025
591ec95
feat(webpack): consider prereleases in runtime detection for commonjs…
NathanWalker Aug 28, 2025
15f37b1
chore: webpack 5.0.25-alpha.0
NathanWalker Aug 28, 2025
d98d1b9
chore: use latest runtime alphas for ci testing, es module enabled
NathanWalker Aug 28, 2025
a91cc8f
fix(android): setInterval impl to match c++ and prevent drift
NathanWalker Aug 28, 2025
f8e9808
fix(webpack): es module polyfill handling of createRequire
NathanWalker Aug 28, 2025
f5f8ba2
chore: webpack 5.0.25-alpha.1
NathanWalker Aug 28, 2025
a12fe19
fix(webpack): always use project's sass impl with sass-loader to avoi…
NathanWalker Aug 30, 2025
5c14345
Merge remote-tracking branch 'origin/refactor/circular-deps' into fea…
NathanWalker Sep 1, 2025
0ad47a2
feat: sticky header demo
NathanWalker Sep 1, 2025
741b6fb
chore: tests
NathanWalker Sep 2, 2025
27bca73
chore: cleanup toolbox
NathanWalker Sep 2, 2025
1297cf5
Merge remote-tracking branch 'origin/main' into feat/list-view-sticky…
NathanWalker Oct 4, 2025
06483ab
chore: cleanup
NathanWalker Oct 4, 2025
e8cc7cd
Merge branch 'main' into feat/list-view-sticky-headers
NathanWalker Oct 29, 2025
e7056a1
Merge remote-tracking branch 'origin/main' into feat/list-view-sticky…
NathanWalker Oct 31, 2025
6351633
Merge branch 'main' into feat/list-view-sticky-headers
NathanWalker Nov 4, 2025
d829bb2
Merge remote-tracking branch 'origin/main' into feat/list-view-sticky…
NathanWalker Nov 5, 2025
3fced92
chore: cleanup
NathanWalker Nov 5, 2025
5562324
fix: flakey test
NathanWalker Nov 5, 2025
27acac6
Merge remote-tracking branch 'origin/main' into feat/list-view-sticky…
NathanWalker Nov 5, 2025
49c361c
Merge remote-tracking branch 'origin/main' into feat/list-view-sticky…
NathanWalker Nov 5, 2025
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
133 changes: 130 additions & 3 deletions apps/automated/src/ui/list-view/list-view-tests.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as TKUnit from '../../tk-unit';
import * as helper from '../../ui-helper';
import { UITest } from '../../ui-test';
import { isAndroid, Page, View, KeyedTemplate, Utils, Observable, EventData, ObservableArray, Label, Application, ListView, ItemEventData } from '@nativescript/core';
import { isAndroid, Page, View, KeyedTemplate, Utils, Observable, EventData, ObservableArray, Label, Application, ListView, ItemEventData, StackLayout } from '@nativescript/core';
import { MyButton, MyStackLayout } from '../layouts/layout-helper';

// >> article-item-tap
Expand Down Expand Up @@ -369,9 +369,10 @@ export class ListViewTest extends UITest<ListView> {
}

public test_loadMoreItems_raised_when_showing_few_items() {
var listView = this.testView;
this.setUp();
const listView = this.testView;

var loadMoreItemsCount = 0;
let loadMoreItemsCount = 0;
listView.items = FEW_ITEMS;
listView.on(ListView.itemLoadingEvent, this.loadViewWithItemNumber);
// >> article-loadmoreitems-event
Expand Down Expand Up @@ -751,10 +752,136 @@ export class ListViewTest extends UITest<ListView> {
listView.scrollToIndex(10000);
}

// Sticky header sanity tests
public test_stickyHeader_iOS_sectioned_headers_basic() {
if (!__APPLE__) {
return;
}

this.setUp();

const listView = this.testView;
listView.sectioned = true;
listView.stickyHeader = true;
listView.stickyHeaderTemplate = "<Label id='headerLabel' text='{{ title }}' />";

const items = [
{ title: 'Section A', items: [1, 2, 3] },
{ title: 'Section B', items: [4, 5] },
];
listView.items = items;

// Ensure layout
this.waitUntilTestElementIsLoaded();
this.waitUntilTestElementLayoutIsValid();

const table = <UITableView>listView.ios;
TKUnit.assertEqual(table.numberOfSections, 2, 'iOS sticky headers should use sections');

// Default auto height is ~44; ensure > 0
const rect0 = table.rectForHeaderInSection(0);
TKUnit.assert(rect0.size.height > 0, 'header height > 0');

// Template binding sanity: force-create header view via delegate and read label text
const header0 = (<any>table.delegate).tableViewViewForHeaderInSection(table, 0);
const headerText0 = this.getTextFromNativeHeaderForSection(listView, header0);
TKUnit.assertEqual(headerText0, 'Section A', 'iOS header 0 text');

// Respect explicit stickyHeaderHeight
listView.stickyHeaderHeight = 60;
listView.refresh();
TKUnit.wait(0.05);
const rect0b = table.rectForHeaderInSection(0);
// iOS reports in points; allow small variance
TKUnit.assert(Math.abs(rect0b.size.height - 60) <= 1, 'explicit header height ~60');
}

public test_stickyHeader_Android_header_updates_and_padding() {
if (!isAndroid) {
return;
}

this.setUp();

const listView = this.testView;
listView.sectioned = true;
listView.stickyHeader = true;
listView.stickyHeaderTemplate = "<Label id='headerLabel' text='{{ title }}' />";
listView.items = [
{ title: 'First', items: ['a', 'b', 'c'] },
{ title: 'Second', items: ['d', 'e'] },
];

this.waitUntilTestElementIsLoaded();
this.waitUntilTestElementLayoutIsValid();
TKUnit.waitUntilReady(() => !!(<any>listView)._stickyHeaderView);

// Sticky header view exists and binds
const sticky = (<any>listView)._stickyHeaderView;
TKUnit.assert(!!sticky, 'sticky header view exists');
const text0 = this.getStickyHeaderTextAndroid(listView);
TKUnit.assertEqual(text0, 'First', 'Android sticky header initial text');

// ListView should have top padding to avoid content under header
const topPad = (<android.widget.ListView>listView.android).getPaddingTop();
TKUnit.assert(topPad > 0, 'ListView has top padding for sticky header');

// Update header to next section (simulate scroll)
if ((<any>listView)._updateStickyHeader) {
(<any>listView)._updateStickyHeader(1);
TKUnit.wait(0.05);
const text1 = this.getStickyHeaderTextAndroid(listView);
TKUnit.assertEqual(text1, 'Second', 'Android sticky header updated text');
}
}

private checkItemVisibleAtIndex(listView: ListView, index: number): boolean {
return listView.isItemAtIndexVisible(index);
}

private getTextFromNativeHeaderForSection(listView: ListView, headerView: any): string {
if (__APPLE__ && headerView && headerView.contentView && headerView.contentView.subviews) {
// subviews can be function or array-like depending on runtime bridge
try {
if (Utils.isFunction(headerView.contentView.subviews)) {
const sv = headerView.contentView.subviews();
return sv && sv.length ? sv[0].text + '' : '';
} else {
return headerView.contentView.subviews[0].text + '';
}
} catch (e) {
return '';
}
}

return '';
}

private getStickyHeaderTextAndroid(listView: ListView): string {
if (isAndroid) {
const headerView = (<any>listView)._stickyHeaderView as StackLayout;
if (!headerView) {
return '';
}
if (headerView instanceof Label) {
return headerView.text + '';
}
if (headerView.getChildAt) {
const child = headerView.getChildAt(0) as StackLayout;
if (child instanceof Label) {
return child.text + '';
}
if (child?.getChildAt) {
const gchild = child.getChildAt(0);
if (gchild instanceof Label) {
return gchild.text + '';
}
}
}
}
return '';
}

private assertNoMemoryLeak(weakRef: WeakRef<ListView>) {
this.tearDown();
//
Expand Down
3 changes: 2 additions & 1 deletion apps/toolbox/src/main-page.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Page xmlns="http://schemas.nativescript.org/tns.xsd" navigatingTo="navigatingTo" class="page" androidOverflowEdge="bottom" statusBarStyle="dark">
<Page.actionBar>
<ActionBar title="Dev Toolbox" icon="" class="action-bar" iosLargeTitle="true" iosShadow="false">
<ActionBar title="Dev Toolbox" icon="" class="action-bar">
</ActionBar>
</Page.actionBar>
<StackLayout>
Expand All @@ -18,6 +18,7 @@
<Button text="image-handling" tap="{{ viewDemo }}" class="btn btn-primary btn-view-demo" />
<Button text="labels" tap="{{ viewDemo }}" class="btn btn-primary btn-view-demo" />
<Button text="list-page" tap="{{ viewDemo }}" class="btn btn-primary btn-view-demo" />
<Button text="list-page-sticky" tap="{{ viewDemo }}" class="btn btn-primary btn-view-demo" />
<Button text="multiple-scenes" tap="{{ viewDemo }}" class="btn btn-primary btn-view-demo" />
<Button text="root-layout" tap="{{ viewDemo }}" class="btn btn-primary btn-view-demo" />
<Button text="scroll-view" tap="{{ viewDemo }}" class="btn btn-primary btn-view-demo" />
Expand Down
Loading
Loading