diff --git a/src/create-navigation-transition.ts b/src/create-navigation-transition.ts index faeca53..1128979 100644 --- a/src/create-navigation-transition.ts +++ b/src/create-navigation-transition.ts @@ -44,6 +44,9 @@ export const NavigationUserInitiated = Symbol.for( export const NavigationOriginalEvent = Symbol.for( "@virtualstate/navigation/originalEvent" ); +export const NavigationSourceElement = Symbol.for( + "@virtualstate/navigation/sourceElement" +); export interface NavigationNavigateOptions extends NavigationNavigateOptionsPrototype { @@ -52,6 +55,7 @@ export interface NavigationNavigateOptions [NavigationCanIntercept]?: boolean; [NavigationUserInitiated]?: boolean; [NavigationOriginalEvent]?: PreventDefaultLike; + [NavigationSourceElement]?: Element; } export const EventAbortController = Symbol.for( @@ -234,6 +238,7 @@ export function createNavigationTransition( (typeof navigationType === "string" ? navigationType : "replace"), userInitiated: options?.[NavigationUserInitiated] ?? false, destination, + sourceElement: options?.[NavigationSourceElement] }) const originalEvent = options?.[NavigationOriginalEvent]; diff --git a/src/events/navigate-event.ts b/src/events/navigate-event.ts index e0a76e0..7e2f22d 100644 --- a/src/events/navigate-event.ts +++ b/src/events/navigate-event.ts @@ -23,6 +23,7 @@ export class NavigateEvent implements Spec { readonly signal: AbortSignal; readonly userInitiated: boolean; readonly navigationType: NavigationNavigationType; + readonly sourceElement?: Element; constructor(public type: "navigate", init: NavigateEventInit) { if (!init) { @@ -44,6 +45,7 @@ export class NavigateEvent implements Spec { this.signal = init.signal; this.userInitiated = init.userInitiated ?? false; this.navigationType = init.navigationType ?? "push"; + this.sourceElement = init.sourceElement; } diff --git a/src/get-polyfill.ts b/src/get-polyfill.ts index 1d15c69..f9ee953 100644 --- a/src/get-polyfill.ts +++ b/src/get-polyfill.ts @@ -6,7 +6,7 @@ import { NavigationSetEntries, NavigationSetOptions } from "./navigation"; import { InvalidStateError } from "./navigation-errors"; -import { InternalNavigationNavigateOptions, NavigationDownloadRequest, NavigationFormData, NavigationOriginalEvent, NavigationUserInitiated } from "./create-navigation-transition"; +import { InternalNavigationNavigateOptions, NavigationDownloadRequest, NavigationFormData, NavigationOriginalEvent, NavigationSourceElement, NavigationUserInitiated } from "./create-navigation-transition"; import { stringify, parse } from './util/serialization'; import {NavigationHistory} from "./history"; import {like, ok} from "./is"; @@ -310,11 +310,13 @@ function interceptWindowClicks(navigation: Navigation, window: WindowLike) { return; } } + const sourceElement = aEl; const options: InternalNavigationNavigateOptions = { history: "auto", [NavigationUserInitiated]: true, [NavigationDownloadRequest]: aEl.download, [NavigationOriginalEvent]: ev, + [NavigationSourceElement]: sourceElement as any as Element, }; navigation.navigate(aEl.href, options); } @@ -347,6 +349,7 @@ function interceptWindowClicks(navigation: Navigation, window: WindowLike) { return; } } + const sourceElement = ev.submitter || form; let formData; /* c8 ignore start */ try { @@ -377,6 +380,7 @@ function interceptWindowClicks(navigation: Navigation, window: WindowLike) { [NavigationUserInitiated]: true, [NavigationFormData]: navFormData, [NavigationOriginalEvent]: unknownEvent, + [NavigationSourceElement]: sourceElement as any as Element }; navigation.navigate(url.href, options); } diff --git a/src/global-window.ts b/src/global-window.ts index 9566034..afd8bef 100644 --- a/src/global-window.ts +++ b/src/global-window.ts @@ -29,7 +29,6 @@ export interface EventPrototype { target: ElementPrototype; composedPath?(): ElementPrototype[]; defaultPrevented: unknown; - submitter: Record; } export interface MouseEventPrototype extends EventPrototype { @@ -41,7 +40,7 @@ export interface MouseEventPrototype extends EventPrototype { } export interface SubmitEventPrototype extends EventPrototype { - + submitter?: ElementPrototype; } export interface PopStateEventPrototype extends EventPrototype { diff --git a/src/spec/navigation.ts b/src/spec/navigation.ts index 40bff14..149a7cc 100644 --- a/src/spec/navigation.ts +++ b/src/spec/navigation.ts @@ -226,6 +226,7 @@ export interface NavigateEvent extends Event<"n readonly formData?: FormData; readonly downloadRequest?: string; readonly info: unknown; + readonly sourceElement?: Element; intercept(options?: NavigationIntercept): void; scroll(): void; @@ -253,6 +254,7 @@ export interface NavigateEventInit extends EventInit { formData?: FormData; downloadRequest?: string; info?: unknown; + sourceElement?: Element; } export interface NavigationDestination {