turbo-rails 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/turbo.js +85 -61
- data/app/assets/javascripts/turbo.min.js +5 -5
- data/app/assets/javascripts/turbo.min.js.map +1 -1
- data/lib/turbo/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae9e55565c85d150ae5bcafa265fcf6a626f39a2e5973e84d9f6507337344ad4
|
4
|
+
data.tar.gz: f20222d0d07c40215260bc9bf27002991aca5093147df738c9e8f9d4414be9f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1207a896a07408a7b229ac7051a2ad7301469bc7d56dd3b944a83c56e847981af934f2abf975ba90ca273647fbfb2cf5fc8eaffea95109c2c39a8415f8ce103
|
7
|
+
data.tar.gz: 03fb1eca56d27e8f828d865af85e5caddd6bbccf31f4999194e13105f8aaad067a3c0870ce7a99e3a408e5126a2d814f863ea33fb30160a5f7a07ee2bd983dc3
|
@@ -97,11 +97,7 @@ class FrameElement extends HTMLElement {
|
|
97
97
|
this.delegate.disconnect();
|
98
98
|
}
|
99
99
|
reload() {
|
100
|
-
|
101
|
-
this.removeAttribute("complete");
|
102
|
-
this.src = null;
|
103
|
-
this.src = src;
|
104
|
-
return this.loaded;
|
100
|
+
return this.delegate.sourceURLReloaded();
|
105
101
|
}
|
106
102
|
attributeChangedCallback(name) {
|
107
103
|
if (name == "loading") {
|
@@ -936,6 +932,7 @@ class FormSubmitObserver {
|
|
936
932
|
const submitter = event.submitter || undefined;
|
937
933
|
if (form && submissionDoesNotDismissDialog(form, submitter) && submissionDoesNotTargetIFrame(form, submitter) && this.delegate.willSubmitForm(form, submitter)) {
|
938
934
|
event.preventDefault();
|
935
|
+
event.stopImmediatePropagation();
|
939
936
|
this.delegate.formSubmitted(form, submitter);
|
940
937
|
}
|
941
938
|
}
|
@@ -1076,6 +1073,47 @@ class FrameView extends View {
|
|
1076
1073
|
}
|
1077
1074
|
}
|
1078
1075
|
|
1076
|
+
class LinkInterceptor {
|
1077
|
+
constructor(delegate, element) {
|
1078
|
+
this.clickBubbled = event => {
|
1079
|
+
if (this.respondsToEventTarget(event.target)) {
|
1080
|
+
this.clickEvent = event;
|
1081
|
+
} else {
|
1082
|
+
delete this.clickEvent;
|
1083
|
+
}
|
1084
|
+
};
|
1085
|
+
this.linkClicked = event => {
|
1086
|
+
if (this.clickEvent && this.respondsToEventTarget(event.target) && event.target instanceof Element) {
|
1087
|
+
if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {
|
1088
|
+
this.clickEvent.preventDefault();
|
1089
|
+
event.preventDefault();
|
1090
|
+
this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);
|
1091
|
+
}
|
1092
|
+
}
|
1093
|
+
delete this.clickEvent;
|
1094
|
+
};
|
1095
|
+
this.willVisit = _event => {
|
1096
|
+
delete this.clickEvent;
|
1097
|
+
};
|
1098
|
+
this.delegate = delegate;
|
1099
|
+
this.element = element;
|
1100
|
+
}
|
1101
|
+
start() {
|
1102
|
+
this.element.addEventListener("click", this.clickBubbled);
|
1103
|
+
document.addEventListener("turbo:click", this.linkClicked);
|
1104
|
+
document.addEventListener("turbo:before-visit", this.willVisit);
|
1105
|
+
}
|
1106
|
+
stop() {
|
1107
|
+
this.element.removeEventListener("click", this.clickBubbled);
|
1108
|
+
document.removeEventListener("turbo:click", this.linkClicked);
|
1109
|
+
document.removeEventListener("turbo:before-visit", this.willVisit);
|
1110
|
+
}
|
1111
|
+
respondsToEventTarget(target) {
|
1112
|
+
const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null;
|
1113
|
+
return element && element.closest("turbo-frame, html") == this.element;
|
1114
|
+
}
|
1115
|
+
}
|
1116
|
+
|
1079
1117
|
class LinkClickObserver {
|
1080
1118
|
constructor(delegate, eventTarget) {
|
1081
1119
|
this.started = false;
|
@@ -1134,13 +1172,13 @@ function doesNotTargetIFrame(anchor) {
|
|
1134
1172
|
class FormLinkClickObserver {
|
1135
1173
|
constructor(delegate, element) {
|
1136
1174
|
this.delegate = delegate;
|
1137
|
-
this.
|
1175
|
+
this.linkInterceptor = new LinkClickObserver(this, element);
|
1138
1176
|
}
|
1139
1177
|
start() {
|
1140
|
-
this.
|
1178
|
+
this.linkInterceptor.start();
|
1141
1179
|
}
|
1142
1180
|
stop() {
|
1143
|
-
this.
|
1181
|
+
this.linkInterceptor.stop();
|
1144
1182
|
}
|
1145
1183
|
willFollowLinkToLocation(link, location, originalEvent) {
|
1146
1184
|
return this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) && link.hasAttribute("data-turbo-method");
|
@@ -1668,10 +1706,11 @@ class Visit {
|
|
1668
1706
|
this.delegate = delegate;
|
1669
1707
|
this.location = location;
|
1670
1708
|
this.restorationIdentifier = restorationIdentifier || uuid();
|
1671
|
-
const {action: action, historyChanged: historyChanged, referrer: referrer, snapshotHTML: snapshotHTML, response: response, visitCachedSnapshot: visitCachedSnapshot, willRender: willRender, updateHistory: updateHistory, shouldCacheSnapshot: shouldCacheSnapshot, acceptsStreamResponse: acceptsStreamResponse} = Object.assign(Object.assign({}, defaultOptions), options);
|
1709
|
+
const {action: action, historyChanged: historyChanged, referrer: referrer, snapshot: snapshot, snapshotHTML: snapshotHTML, response: response, visitCachedSnapshot: visitCachedSnapshot, willRender: willRender, updateHistory: updateHistory, shouldCacheSnapshot: shouldCacheSnapshot, acceptsStreamResponse: acceptsStreamResponse} = Object.assign(Object.assign({}, defaultOptions), options);
|
1672
1710
|
this.action = action;
|
1673
1711
|
this.historyChanged = historyChanged;
|
1674
1712
|
this.referrer = referrer;
|
1713
|
+
this.snapshot = snapshot;
|
1675
1714
|
this.snapshotHTML = snapshotHTML;
|
1676
1715
|
this.response = response;
|
1677
1716
|
this.isSamePage = this.delegate.locationWithActionIsSamePage(this.location, this.action);
|
@@ -1956,7 +1995,7 @@ class Visit {
|
|
1956
1995
|
}
|
1957
1996
|
cacheSnapshot() {
|
1958
1997
|
if (!this.snapshotCached) {
|
1959
|
-
this.view.cacheSnapshot().then((snapshot => snapshot && this.visitCachedSnapshot(snapshot)));
|
1998
|
+
this.view.cacheSnapshot(this.snapshot).then((snapshot => snapshot && this.visitCachedSnapshot(snapshot)));
|
1960
1999
|
this.snapshotCached = true;
|
1961
2000
|
}
|
1962
2001
|
}
|
@@ -2065,11 +2104,11 @@ class BrowserAdapter {
|
|
2065
2104
|
}
|
2066
2105
|
}
|
2067
2106
|
reload(reason) {
|
2107
|
+
var _a;
|
2068
2108
|
dispatch("turbo:reload", {
|
2069
2109
|
detail: reason
|
2070
2110
|
});
|
2071
|
-
|
2072
|
-
window.location.href = this.location.toString();
|
2111
|
+
window.location.href = ((_a = this.location) === null || _a === void 0 ? void 0 : _a.toString()) || window.location.href;
|
2073
2112
|
}
|
2074
2113
|
get navigator() {
|
2075
2114
|
return this.session.navigator;
|
@@ -2104,24 +2143,24 @@ class FrameRedirector {
|
|
2104
2143
|
constructor(session, element) {
|
2105
2144
|
this.session = session;
|
2106
2145
|
this.element = element;
|
2107
|
-
this.
|
2146
|
+
this.linkInterceptor = new LinkInterceptor(this, element);
|
2108
2147
|
this.formSubmitObserver = new FormSubmitObserver(this, element);
|
2109
2148
|
}
|
2110
2149
|
start() {
|
2111
|
-
this.
|
2150
|
+
this.linkInterceptor.start();
|
2112
2151
|
this.formSubmitObserver.start();
|
2113
2152
|
}
|
2114
2153
|
stop() {
|
2115
|
-
this.
|
2154
|
+
this.linkInterceptor.stop();
|
2116
2155
|
this.formSubmitObserver.stop();
|
2117
2156
|
}
|
2118
|
-
|
2119
|
-
return this.shouldRedirect(element)
|
2157
|
+
shouldInterceptLinkClick(element, _location, _event) {
|
2158
|
+
return this.shouldRedirect(element);
|
2120
2159
|
}
|
2121
|
-
|
2160
|
+
linkClickIntercepted(element, url, event) {
|
2122
2161
|
const frame = this.findFrameElement(element);
|
2123
2162
|
if (frame) {
|
2124
|
-
frame.delegate.
|
2163
|
+
frame.delegate.linkClickIntercepted(element, url, event);
|
2125
2164
|
}
|
2126
2165
|
}
|
2127
2166
|
willSubmitForm(element, submitter) {
|
@@ -2133,17 +2172,6 @@ class FrameRedirector {
|
|
2133
2172
|
frame.delegate.formSubmitted(element, submitter);
|
2134
2173
|
}
|
2135
2174
|
}
|
2136
|
-
frameAllowsVisitingLocation(target, {href: url}, originalEvent) {
|
2137
|
-
const event = dispatch("turbo:click", {
|
2138
|
-
target: target,
|
2139
|
-
detail: {
|
2140
|
-
url: url,
|
2141
|
-
originalEvent: originalEvent
|
2142
|
-
},
|
2143
|
-
cancelable: true
|
2144
|
-
});
|
2145
|
-
return !event.defaultPrevented;
|
2146
|
-
}
|
2147
2175
|
shouldSubmit(form, submitter) {
|
2148
2176
|
var _a;
|
2149
2177
|
const action = getAction(form, submitter);
|
@@ -2777,10 +2805,10 @@ class PageView extends View {
|
|
2777
2805
|
clearSnapshotCache() {
|
2778
2806
|
this.snapshotCache.clear();
|
2779
2807
|
}
|
2780
|
-
async cacheSnapshot() {
|
2781
|
-
if (
|
2808
|
+
async cacheSnapshot(snapshot = this.snapshot) {
|
2809
|
+
if (snapshot.isCacheable) {
|
2782
2810
|
this.delegate.viewWillCacheSnapshot();
|
2783
|
-
const {
|
2811
|
+
const {lastRenderedLocation: location} = this;
|
2784
2812
|
await nextEventLoopTick();
|
2785
2813
|
const cachedSnapshot = snapshot.clone();
|
2786
2814
|
this.snapshotCache.put(location, cachedSnapshot);
|
@@ -2793,9 +2821,6 @@ class PageView extends View {
|
|
2793
2821
|
get snapshot() {
|
2794
2822
|
return PageSnapshot.fromElement(this.element);
|
2795
2823
|
}
|
2796
|
-
get shouldCacheSnapshot() {
|
2797
|
-
return this.snapshot.isCacheable;
|
2798
|
-
}
|
2799
2824
|
}
|
2800
2825
|
|
2801
2826
|
class Preloader {
|
@@ -3305,7 +3330,7 @@ class FrameController {
|
|
3305
3330
|
this.view = new FrameView(this, this.element);
|
3306
3331
|
this.appearanceObserver = new AppearanceObserver(this, this.element);
|
3307
3332
|
this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);
|
3308
|
-
this.
|
3333
|
+
this.linkInterceptor = new LinkInterceptor(this, this.element);
|
3309
3334
|
this.restorationIdentifier = uuid();
|
3310
3335
|
this.formSubmitObserver = new FormSubmitObserver(this, this.element);
|
3311
3336
|
}
|
@@ -3318,7 +3343,7 @@ class FrameController {
|
|
3318
3343
|
this.loadSourceURL();
|
3319
3344
|
}
|
3320
3345
|
this.formLinkClickObserver.start();
|
3321
|
-
this.
|
3346
|
+
this.linkInterceptor.start();
|
3322
3347
|
this.formSubmitObserver.start();
|
3323
3348
|
}
|
3324
3349
|
}
|
@@ -3327,7 +3352,7 @@ class FrameController {
|
|
3327
3352
|
this.connected = false;
|
3328
3353
|
this.appearanceObserver.stop();
|
3329
3354
|
this.formLinkClickObserver.stop();
|
3330
|
-
this.
|
3355
|
+
this.linkInterceptor.stop();
|
3331
3356
|
this.formSubmitObserver.stop();
|
3332
3357
|
}
|
3333
3358
|
}
|
@@ -3345,6 +3370,15 @@ class FrameController {
|
|
3345
3370
|
this.loadSourceURL();
|
3346
3371
|
}
|
3347
3372
|
}
|
3373
|
+
sourceURLReloaded() {
|
3374
|
+
const {src: src} = this.element;
|
3375
|
+
this.ignoringChangesToAttribute("complete", (() => {
|
3376
|
+
this.element.removeAttribute("complete");
|
3377
|
+
}));
|
3378
|
+
this.element.src = null;
|
3379
|
+
this.element.src = src;
|
3380
|
+
return this.element.loaded;
|
3381
|
+
}
|
3348
3382
|
completeChanged() {
|
3349
3383
|
if (this.isIgnoringChangesTo("complete")) return;
|
3350
3384
|
this.loadSourceURL();
|
@@ -3400,17 +3434,17 @@ class FrameController {
|
|
3400
3434
|
this.loadSourceURL();
|
3401
3435
|
}
|
3402
3436
|
willSubmitFormLinkToLocation(link) {
|
3403
|
-
return
|
3437
|
+
return this.shouldInterceptNavigation(link);
|
3404
3438
|
}
|
3405
3439
|
submittedFormLinkToLocation(link, _location, form) {
|
3406
3440
|
const frame = this.findFrameElement(link);
|
3407
3441
|
if (frame) form.setAttribute("data-turbo-frame", frame.id);
|
3408
3442
|
}
|
3409
|
-
|
3410
|
-
return this.shouldInterceptNavigation(element)
|
3443
|
+
shouldInterceptLinkClick(element, _location, _event) {
|
3444
|
+
return this.shouldInterceptNavigation(element);
|
3411
3445
|
}
|
3412
|
-
|
3413
|
-
this.navigateFrame(element, location
|
3446
|
+
linkClickIntercepted(element, location) {
|
3447
|
+
this.navigateFrame(element, location);
|
3414
3448
|
}
|
3415
3449
|
willSubmitForm(element, submitter) {
|
3416
3450
|
return element.closest("turbo-frame") == this.element && this.shouldInterceptNavigation(element, submitter);
|
@@ -3458,7 +3492,7 @@ class FrameController {
|
|
3458
3492
|
}
|
3459
3493
|
formSubmissionSucceededWithResponse(formSubmission, response) {
|
3460
3494
|
const frame = this.findFrameElement(formSubmission.formElement, formSubmission.submitter);
|
3461
|
-
|
3495
|
+
frame.delegate.proposeVisitIfNavigatedWithAction(frame, formSubmission.formElement, formSubmission.submitter);
|
3462
3496
|
frame.delegate.loadResponse(response);
|
3463
3497
|
}
|
3464
3498
|
formSubmissionFailedWithResponse(formSubmission, fetchResponse) {
|
@@ -3508,14 +3542,14 @@ class FrameController {
|
|
3508
3542
|
}
|
3509
3543
|
navigateFrame(element, url, submitter) {
|
3510
3544
|
const frame = this.findFrameElement(element, submitter);
|
3511
|
-
this.
|
3545
|
+
this.pageSnapshot = PageSnapshot.fromElement(frame).clone();
|
3546
|
+
frame.delegate.proposeVisitIfNavigatedWithAction(frame, element, submitter);
|
3512
3547
|
this.withCurrentNavigationElement(element, (() => {
|
3513
3548
|
frame.src = url;
|
3514
3549
|
}));
|
3515
3550
|
}
|
3516
3551
|
proposeVisitIfNavigatedWithAction(frame, element, submitter) {
|
3517
3552
|
this.action = getVisitAction(submitter, element, frame);
|
3518
|
-
this.frame = frame;
|
3519
3553
|
if (isAction(this.action)) {
|
3520
3554
|
const {visitCachedSnapshot: visitCachedSnapshot} = frame.delegate;
|
3521
3555
|
frame.delegate.fetchResponseLoaded = fetchResponse => {
|
@@ -3532,7 +3566,8 @@ class FrameController {
|
|
3532
3566
|
visitCachedSnapshot: visitCachedSnapshot,
|
3533
3567
|
willRender: false,
|
3534
3568
|
updateHistory: false,
|
3535
|
-
restorationIdentifier: this.restorationIdentifier
|
3569
|
+
restorationIdentifier: this.restorationIdentifier,
|
3570
|
+
snapshot: this.pageSnapshot
|
3536
3571
|
};
|
3537
3572
|
if (this.action) options.action = this.action;
|
3538
3573
|
session.visit(frame.src, options);
|
@@ -3541,9 +3576,9 @@ class FrameController {
|
|
3541
3576
|
}
|
3542
3577
|
}
|
3543
3578
|
changeHistory() {
|
3544
|
-
if (this.action
|
3579
|
+
if (this.action) {
|
3545
3580
|
const method = getHistoryMethodForAction(this.action);
|
3546
|
-
session.history.update(method, expandURL(this.
|
3581
|
+
session.history.update(method, expandURL(this.element.src || ""), this.restorationIdentifier);
|
3547
3582
|
}
|
3548
3583
|
}
|
3549
3584
|
willHandleFrameMissingFromResponse(fetchResponse) {
|
@@ -3671,17 +3706,6 @@ class FrameController {
|
|
3671
3706
|
const root = (_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : "/";
|
3672
3707
|
return expandURL(root);
|
3673
3708
|
}
|
3674
|
-
frameAllowsVisitingLocation(target, {href: url}, originalEvent) {
|
3675
|
-
const event = dispatch("turbo:click", {
|
3676
|
-
target: target,
|
3677
|
-
detail: {
|
3678
|
-
url: url,
|
3679
|
-
originalEvent: originalEvent
|
3680
|
-
},
|
3681
|
-
cancelable: true
|
3682
|
-
});
|
3683
|
-
return !event.defaultPrevented;
|
3684
|
-
}
|
3685
3709
|
isIgnoringChangesTo(attributeName) {
|
3686
3710
|
return this.ignoredAttributes.has(attributeName);
|
3687
3711
|
}
|